1 | /* Copyright 2015 The TensorFlow Authors. All Rights Reserved. |
2 | |
3 | Licensed under the Apache License, Version 2.0 (the "License"); |
4 | you may not use this file except in compliance with the License. |
5 | You may obtain a copy of the License at |
6 | |
7 | http://www.apache.org/licenses/LICENSE-2.0 |
8 | |
9 | Unless required by applicable law or agreed to in writing, software |
10 | distributed under the License is distributed on an "AS IS" BASIS, |
11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
12 | See the License for the specific language governing permissions and |
13 | limitations under the License. |
14 | ==============================================================================*/ |
15 | |
16 | #include "tensorflow/core/framework/op_kernel.h" |
17 | |
18 | namespace tensorflow { |
19 | |
20 | static constexpr const char* const kFacts1[] = { |
21 | "]bod*@oll*Nokd*mc|oy*k*yogcdkx*k~*Y~kdlexn&*c~-y*ye*ixe}non*Ned*Ad\x7f~b*" |
22 | "bky*~e*yc~*ed*~bo*lfeex$" , |
23 | "]bod*Mxkbkg*Hoff*cd|od~on*~bo*~ofozbedo&*bo*yk}*k*gcyyon*ikff*lxeg*@oll*" |
24 | "Nokd$" , |
25 | "@oll*Nokd-y*ZCD*cy*~bo*fky~*>*ncmc~y*el*zc$" , |
26 | "Edio&*cd*okxfs*8::8&*}bod*~bo*Meemfo*yox|oxy*}od~*ne}d&*@oll*Nokd*kdy}" |
27 | "oxon*yokxib*{\x7foxcoy*gkd\x7fkffs*lex*~}e*be\x7fxy$*O|kfy*ybe}on*k*{" |
28 | "\x7fkfc~s*cgzxe|ogod~*el*?*zecd~y$" , |
29 | "@oll*Nokd*z\x7f~y*bcy*zkd~y*ed*edo*fom*k~*k*~cgo&*h\x7f~*cl*bo*bkn*gexo*~" |
30 | "bkd*~}e*fomy&*se\x7f*}e\x7f\x66n*yoo*~bk~*bcy*kzzxekib*cy*ki~\x7fkffs*" |
31 | "E\"fem*d#$" , |
32 | "@oll*Nokd*iegzcfoy*kdn*x\x7f\x64y*bcy*ieno*holexo*y\x7fhgc~~cdm&*h\x7f~*" |
33 | "edfs*~e*iboia*lex*iegzcfox*h\x7fmy$" , |
34 | "@oll*Nokd*ixok~on*~bo*}exfn-y*lcxy~*E\";%d#*kfmexc~bg$" , |
35 | "@oll*Nokd*}xe~o*kd*E\"dT8#*kfmexc~bg*edio$*C~*}ky*lex*~bo*^xk|ofcdm*" |
36 | "Ykfoygkd*Zxehfog$" , |
37 | "^bo*xk~o*k~*}bcib*@oll*Nokd*zxen\x7fioy*ieno*`\x7fgzon*hs*k*lki~ex*el*>:*" |
38 | "cd*fk~o*8:::*}bod*bo*\x7fzmxknon*bcy*aoshekxn*~e*_YH8$:$" , |
39 | "@oll*Nokd*ikd*hok~*se\x7f*k~*ieddoi~*le\x7fx$*Cd*~bxoo*ge|oy$" , |
40 | "@oll*Nokd*ade}y*}bs*~bo*kdy}ox*cy*>8$" , |
41 | "@oll*Nokd*y~kx~y*bcy*zxemxkggcdm*yoyycedy*}c~b*(ik~*4*%no|%gog($" , |
42 | "]bod*@oll*Nokd*yksy*(ezod*~bo*zen*hks*neexy(&*Bkf*ezody*~bo*zen*hks*" |
43 | "neexy$" , |
44 | "@oll*Nokd*ycgzfs*}kfay*cd~e*Gexnex$" , |
45 | "Ib\x7fia*Dexxcy*cy*@oll*Nokd-y*8:/*zxe`oi~$" , |
46 | "@oll*Nokd-y*}k~ib*ncyzfksy*yoiedny*ycdio*@kd\x7fkxs*;y~&*;3=:$*Bo*cy*do|" |
47 | "ox*fk~o$" , |
48 | "]bod*se\x7fx*ieno*bky*\x7f\x64nolcdon*hobk|cex&*se\x7f*mo~*k*" |
49 | "yomlk\x7f\x66~*kdn*iexx\x7fz~on*nk~k$*]bod*@oll*Nokd-y*ieno*bky*" |
50 | "\x7f\x64nolcdon*hobk|cex&*k*\x7f\x64\x63iexd*xcnoy*cd*ed*k*xkcdhe}*kdn*mc|" |
51 | "oy*o|oxshens*lxoo*cio*ixokg$" , |
52 | "Moell*Bcd~ed*neoyd-~*doon*~e*gkao*bcnnod*\x7f\x64\x63~y$*^bos*bcno*hs*~" |
53 | "bogyof|oy*}bod*bo*kzzxekiboy$" , |
54 | "Moell*Bcd~ed*neoyd-~*ncykmxoo&*bo*ied~xky~c|ofs*nc|oxmoy$" , |
55 | "Nooz*Hofcol*Do~}exay*ki~\x7fkffs*hofco|o*noozfs*cd*Moell*Bcd~ed$" , |
56 | "Moell*Bcd~ed*bky*ncyie|oxon*be}*~bo*hxkcd*xokffs*}exay$$$*edio*k*sokx&*" |
57 | "lex*~bo*fky~*8?*sokxy$" , |
58 | "Gkxae|*xkdneg*lcofny*~bcda*Moell*Bcd~ed*cy*cd~xki~khfo$" , |
59 | "Moell*Bcd~ed*ncnd-~*cd|od~*femci&*h\x7f~*bcy*mxok~'mxok~'mxkdnlk~box*ncn$*" |
60 | "\"^x\x7fo+#" , |
61 | "Moell*Bcd~ed*bky*}xc~~od*~}e*zkzoxy*~bk~*kxo*noy~cdon*~e*xo|ef\x7f~cedcpo*" |
62 | "gkibcdo*fokxdcdm$*Dehens*ade}y*}bcib*~}e$" }; |
63 | static constexpr uint64 kNum1 = sizeof(kFacts1) / sizeof(kFacts1[0]); |
64 | |
65 | static constexpr const char* const kFacts2[] = { |
66 | "Yoxmos*Hxcd*kdn*Hk~gkd*bk|o*do|ox*hood*yood*k~*~bo*ykgo*zfkio*k~*~bo*ykgo*" |
67 | "~cgo$" }; |
68 | static constexpr uint64 kNum2 = sizeof(kFacts2) / sizeof(kFacts2[0]); |
69 | |
70 | static void E(string* s) { |
71 | for (size_t j = 0; j < s->size(); ++j) { |
72 | (*s)[j] ^= '\n'; |
73 | } |
74 | } |
75 | |
76 | class FactOpKernel : public OpKernel { |
77 | public: |
78 | explicit FactOpKernel(OpKernelConstruction* context) : OpKernel(context) {} |
79 | |
80 | void Compute(OpKernelContext* context) override = 0; |
81 | |
82 | protected: |
83 | void Compute(OpKernelContext* context, const char* const facts[], |
84 | uint64 count) { |
85 | Tensor* output_tensor = nullptr; |
86 | OP_REQUIRES_OK( |
87 | context, context->allocate_output(0, TensorShape({}), &output_tensor)); |
88 | auto output = output_tensor->template scalar<tstring>(); |
89 | |
90 | string coded = facts[context->env()->NowMicros() % count]; |
91 | E(&coded); |
92 | output() = coded; |
93 | } |
94 | }; |
95 | |
96 | class FactOpKernel1 : public FactOpKernel { |
97 | public: |
98 | explicit FactOpKernel1(OpKernelConstruction* context) |
99 | : FactOpKernel(context) {} |
100 | |
101 | void Compute(OpKernelContext* context) override { |
102 | FactOpKernel::Compute(context, kFacts1, kNum1); |
103 | } |
104 | }; |
105 | |
106 | class FactOpKernel2 : public FactOpKernel { |
107 | public: |
108 | explicit FactOpKernel2(OpKernelConstruction* context) |
109 | : FactOpKernel(context) {} |
110 | |
111 | void Compute(OpKernelContext* context) override { |
112 | FactOpKernel::Compute(context, kFacts2, kNum2); |
113 | } |
114 | }; |
115 | |
116 | REGISTER_KERNEL_BUILDER(Name("Fact" ).Device(DEVICE_GPU).HostMemory("fact" ), |
117 | FactOpKernel1); |
118 | REGISTER_KERNEL_BUILDER(Name("Fact" ).Device(DEVICE_DEFAULT).HostMemory("fact" ), |
119 | FactOpKernel1); |
120 | |
121 | static string D(const char* s) { |
122 | string ret(s); |
123 | E(&ret); |
124 | return ret; |
125 | } |
126 | |
127 | REGISTER_KERNEL_BUILDER( |
128 | Name("Fact" ).Device(DEVICE_CPU).Label(D("Yoxmos" ).c_str()), FactOpKernel2); |
129 | REGISTER_KERNEL_BUILDER( |
130 | Name("Fact" ).Device(DEVICE_CPU).Label(D("yoxmos" ).c_str()), FactOpKernel2); |
131 | |
132 | } // namespace tensorflow |
133 | |