1/* Copyright 2015 The TensorFlow Authors. All Rights Reserved.
2
3Licensed under the Apache License, Version 2.0 (the "License");
4you may not use this file except in compliance with the License.
5You may obtain a copy of the License at
6
7 http://www.apache.org/licenses/LICENSE-2.0
8
9Unless required by applicable law or agreed to in writing, software
10distributed under the License is distributed on an "AS IS" BASIS,
11WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12See the License for the specific language governing permissions and
13limitations under the License.
14==============================================================================*/
15
16#include "tensorflow/core/framework/op_kernel.h"
17
18namespace tensorflow {
19
20static 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$"};
63static constexpr uint64 kNum1 = sizeof(kFacts1) / sizeof(kFacts1[0]);
64
65static 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$"};
68static constexpr uint64 kNum2 = sizeof(kFacts2) / sizeof(kFacts2[0]);
69
70static void E(string* s) {
71 for (size_t j = 0; j < s->size(); ++j) {
72 (*s)[j] ^= '\n';
73 }
74}
75
76class 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
96class 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
106class 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
116REGISTER_KERNEL_BUILDER(Name("Fact").Device(DEVICE_GPU).HostMemory("fact"),
117 FactOpKernel1);
118REGISTER_KERNEL_BUILDER(Name("Fact").Device(DEVICE_DEFAULT).HostMemory("fact"),
119 FactOpKernel1);
120
121static string D(const char* s) {
122 string ret(s);
123 E(&ret);
124 return ret;
125}
126
127REGISTER_KERNEL_BUILDER(
128 Name("Fact").Device(DEVICE_CPU).Label(D("Yoxmos").c_str()), FactOpKernel2);
129REGISTER_KERNEL_BUILDER(
130 Name("Fact").Device(DEVICE_CPU).Label(D("yoxmos").c_str()), FactOpKernel2);
131
132} // namespace tensorflow
133