3 from __future__
import absolute_import
4 from __future__
import division
5 from __future__
import print_function
6 from __future__
import unicode_literals
8 from caffe2.python
import core, workspace
9 from caffe2.python.docs.formatter
import Markdown
11 OpSchema = workspace.C.OpSchema
18 def upload(self, text):
22 class DocGenerator(object):
23 def __init__(self, formatter, uploader):
24 self.formatter = formatter
25 self.uploader = uploader
26 self.content_body =
"" 28 def create_body(self):
32 self.uploader.upload(self.content_body)
36 def getOperatorDoc(self, name, schema, priority):
39 def getOperatorEngine(self, name):
42 def getOperators(self):
49 if x ==
"caffe2/caffe2/operators":
51 if 'contrib' in x.split(
'/'):
53 if 'experiments' in x.split(
'/'):
58 schema = OpSchema.get(name)
60 priority = filePriority(os.path.dirname(schema.file))
65 elif name.find(
"_ENGINE_") != -1:
67 if engine.base_op_name
in self.
engines:
68 self.
engines[engine.base_op_name].append(engine)
70 self.
engines[engine.base_op_name] = [engine]
77 for name, engines
in self.
engines.items():
82 operators = [v
for k, v
in self.
operators.items()]
84 def compare(op1, op2):
85 if op1.priority == op2.priority:
86 if op1.name < op2.name:
90 return op1.priority - op2.priority
92 return sorted(operators, cmp=compare)
97 for operator
in operators:
104 def __init__(self, name):
106 self.base_op_name, self.
engine = name.split(
"_ENGINE_", 1)
108 def getDeviceImpl(self):
110 for device, impl
in {
'CPU': OpSchema.get_cpu_impl(self.
op_name),
111 'CUDA': OpSchema.get_cuda_impl(self.
op_name)}.items():
114 deviceImplList.append((device, impl))
115 return deviceImplList
117 def generateDoc(self, formatter):
120 '{engine} on {device}: {impl}'.format(engine=self.
engine,
126 def __init__(self, name, schema, priority):
132 def addEngines(self, engines):
135 def generateDoc(self, formatter):
137 formatter.parseAndAdd(self.
schema.doc)
139 formatter.addLine(
"No documentation yet.")
141 def generateTable(self, formatter, tuples, title_row, title):
144 formatter.addHeader(title, 3)
148 for name, doc
in tuples:
149 table.append([name, doc
or ''])
150 formatter.addTable(table, (table == []))
152 def generateInterface(self, formatter):
153 def makeDesc(title, desc):
154 f = formatter.clone()
155 f.addEmphasis(title, 1)
156 out = [(f.dump(),
'')]
157 for name, doc
in desc:
158 f = formatter.clone()
159 f.addCode(name, inline=
True)
160 out.append((f.dump(), doc
or ''))
166 tuples += makeDesc(
'Arguments', self.
schema.arg_desc)
168 if self.
schema.input_desc:
169 tuples += makeDesc(
'Inputs', self.
schema.input_desc)
171 if self.
schema.output_desc:
172 tuples += makeDesc(
'Outputs', self.
schema.output_desc)
176 def generateCodeLink(self, formatter):
177 formatter.addHeader(
"Code", 3)
178 formatter.addCodeLink(self.
schema.file)
180 def getInfo(self, formatter, name, impl):
183 def generateDevices(self, formatter):
184 formatter.addHeader(
"Devices", 3)
186 self.getInfo(formatter,
187 'CPU', OpSchema.get_cpu_impl(self.name)),
188 self.getInfo(formatter,
189 'GPU', OpSchema.get_cuda_impl(self.name)),
191 formatter.addList([i
for i
in devices
if i])
193 def generateEngines(self, formatter):
194 if not len(self.engines):
196 formatter.addHeader(
"Engines", 3)
197 for engine
in self.engines:
198 engine.generateDoc(formatter)
200 def generateSchema(self, formatter):
201 formatter.addHeader(self.name, 2)
203 self.generateDoc(formatter)
204 self.generateInterface(formatter)
205 self.generateCodeLink(formatter)
206 self.generateDevices(formatter)
207 self.generateEngines(formatter)
210 formatter.addLine(
"No schema documented yet.")
211 self.generateDevices(formatter)
214 if __name__ ==
"__main__":
215 ops = OpDocGenerator(Markdown(), DocUploader())
217 print(ops.content_body)
def generateTable(self, formatter, tuples, title_row, title)
def getOperatorEngine(self, name)
def getOperatorDoc(self, name, schema, priority)
def _GetRegisteredOperators()