woo

上级 14753530
syntax: glob
*.pyc
*.o
*.so
*~
\#*\#
import gof
import opt
#prog(inputs, outputs)
#single(*outputs)
#multi(*output_lists)
import core
def to_func(inputs, outputs):
p = prog(inputs, outputs)
print p.env
def f(*args):
for input, value in zip(inputs, args):
p[input] = value
outputs = p()
if len(outputs) == 1:
return outputs[0]
else:
return outputs
return f
# def prog(inputs, outputs):
# outputs = gof.ext.mark_outputs_as_destroyed(outputs)
# program = gof.Prog(inputs, outputs, opt.optimizer, gof.link.ThunkLinker(), [gof.features.PrintListener])
# for orphan in program.env.orphans():
# if orphan.storage is core.UNCOMPUTED:
# raise Exception("Your program depends on a few uncomputed values.")
# return program
class prog(gof.Prog):
def __init__(self, inputs, outputs):
# core.build_mode()
outputs = gof.ext.mark_outputs_as_destroyed(outputs)
gof.Prog.__init__(self,
inputs,
outputs,
opt.optimizer,
gof.link.thunk_linker,
[])
# core.pop_mode()
def __call__(self, check_uncomputed = True):
if check_uncomputed:
for input in self.env.inputs:
if input.data is core.UNCOMPUTED:
raise Exception("You must provide a value for input %s!" % input)
for orphan in self.env.orphans():
if orphan.data is core.UNCOMPUTED:
raise Exception("Orphan %s is uncomputed but needed to calculate the function. " % input + \
"Try calling prog.compute_orphans() or set it manually.")
return gof.Prog.__call__(self)
def compute_orphans(self):
raise NotImplementedError
def single(*outputs):
return prog(gof.graph.inputs(outputs), outputs)
差异被折叠。
...@@ -3,24 +3,28 @@ from core import * ...@@ -3,24 +3,28 @@ from core import *
import gof import gof
def pattern_opt(in_pattern, out_pattern): # def pattern_opt(in_pattern, out_pattern):
def parse(x): # def parse(x):
if isinstance(x, (list, tuple)): # if isinstance(x, (list, tuple)):
return [parse(y) for y in x] # return [parse(y) for y in x]
elif isinstance(x, wrapper): # elif isinstance(x, wrapper):
return x.opclass # return x.opclass
elif isinstance(x, str) or (hasattr(x, '__bases__') and issubclass(x, gof.op.Op)): # elif isinstance(x, str) or (hasattr(x, '__bases__') and issubclass(x, gof.op.Op)):
return x # return x
else: # else:
raise TypeError("Bad input type for pattern_opt.") # raise TypeError("Bad input type for pattern_opt.")
return gof.opt.PatternOptimizer(parse(in_pattern), parse(out_pattern)) # return gof.opt.PatternOptimizer(parse(in_pattern), parse(out_pattern))
def op_sub(op1, op2): # def op_sub(op1, op2):
if isinstance(op1, wrapper): # if isinstance(op1, wrapper):
op1 = op1.opclass # op1 = op1.opclass
if isinstance(op2, wrapper): # if isinstance(op2, wrapper):
op2 = op2.opclass # op2 = op2.opclass
return gof.opt.OpSubOptimizer(op1, op2) # return gof.opt.OpSubOptimizer(op1, op2)
pattern_opt = gof.opt.PatternOptimizer
op_sub = gof.opt.OpSubOptimizer
#def make_patterns(patterns): #def make_patterns(patterns):
...@@ -67,4 +71,15 @@ opts = [ ...@@ -67,4 +71,15 @@ opts = [
export_opts(opts) # publish the optimizations performed under individual names export_opts(opts) # publish the optimizations performed under individual names
optimizer = gof.opt.MergeOptMerge(gof.opt.SeqOptimizer([opt for name, opt in opts])) # class AAA(gof.opt.Optimizer):
# def __init__(self, opt):
# self.opt = opt
# def optimize(self, env):
# build_mode()
# self.opt.optimize(env)
# pop_mode()
optimizer = gof.lib.PythonOpt(gof.opt.MergeOptMerge(gof.opt.SeqOptimizer([opt for name, opt in opts])))
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论