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
E(string * s)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:
FactOpKernel(OpKernelConstruction * context)78 explicit FactOpKernel(OpKernelConstruction* context) : OpKernel(context) {}
79
80 void Compute(OpKernelContext* context) override = 0;
81
82 protected:
Compute(OpKernelContext * context,const char * const facts[],uint64 count)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:
FactOpKernel1(OpKernelConstruction * context)98 explicit FactOpKernel1(OpKernelConstruction* context)
99 : FactOpKernel(context) {}
100
Compute(OpKernelContext * context)101 void Compute(OpKernelContext* context) override {
102 FactOpKernel::Compute(context, kFacts1, kNum1);
103 }
104 };
105
106 class FactOpKernel2 : public FactOpKernel {
107 public:
FactOpKernel2(OpKernelConstruction * context)108 explicit FactOpKernel2(OpKernelConstruction* context)
109 : FactOpKernel(context) {}
110
Compute(OpKernelContext * context)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
D(const char * s)119 static string D(const char* s) {
120 string ret(s);
121 E(&ret);
122 return ret;
123 }
124
125 REGISTER_KERNEL_BUILDER(
126 Name("Fact").Device(DEVICE_CPU).Label(D("Yoxmos").c_str()), FactOpKernel2);
127 REGISTER_KERNEL_BUILDER(
128 Name("Fact").Device(DEVICE_CPU).Label(D("yoxmos").c_str()), FactOpKernel2);
129
130 } // namespace tensorflow
131