|
|
|
@ -11,18 +11,18 @@ class Variable(object):
|
|
|
|
|
|
|
|
|
|
if name is None:
|
|
|
|
|
name = Variable._unique_var_name_()
|
|
|
|
|
self.proto = self.block.proto.new_var(name)
|
|
|
|
|
self.desc = self.block.desc.new_var(name)
|
|
|
|
|
|
|
|
|
|
if shape is not None:
|
|
|
|
|
self.proto.set_shape(shape)
|
|
|
|
|
self.desc.set_shape(shape)
|
|
|
|
|
|
|
|
|
|
if dtype is not None:
|
|
|
|
|
# TODO(yuyang18): Convert dtype from numpy.dtype
|
|
|
|
|
self.proto.set_data_type(dtype)
|
|
|
|
|
self.desc.set_data_type(dtype)
|
|
|
|
|
|
|
|
|
|
if lod_level is not None:
|
|
|
|
|
# TODO(yuyang18): set_lod_level is not defined.
|
|
|
|
|
self.proto.set_lod_level(lod_level)
|
|
|
|
|
self.desc.set_lod_level(lod_level)
|
|
|
|
|
|
|
|
|
|
self.block.vars[name] = self
|
|
|
|
|
self.op = None
|
|
|
|
@ -38,13 +38,13 @@ class Variable(object):
|
|
|
|
|
class Operator(object):
|
|
|
|
|
def __init__(self,
|
|
|
|
|
block,
|
|
|
|
|
proto,
|
|
|
|
|
desc,
|
|
|
|
|
type=None,
|
|
|
|
|
inputs=None,
|
|
|
|
|
outputs=None,
|
|
|
|
|
attrs=None):
|
|
|
|
|
self.block = block
|
|
|
|
|
self.proto = proto
|
|
|
|
|
self.desc = desc
|
|
|
|
|
if type is not None:
|
|
|
|
|
# TODO.
|
|
|
|
|
pass
|
|
|
|
@ -63,31 +63,31 @@ class Operator(object):
|
|
|
|
|
|
|
|
|
|
class Block(object):
|
|
|
|
|
def __init__(self, program, idx):
|
|
|
|
|
self.proto = program.proto.block(idx)
|
|
|
|
|
self.desc = program.desc.block(idx)
|
|
|
|
|
self.vars = dict() # var_name --> var
|
|
|
|
|
self.ops = collections.deque() # operator list
|
|
|
|
|
self.program = program
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
|
def parent_idx(self):
|
|
|
|
|
return self.proto.parent
|
|
|
|
|
return self.desc.parent
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
|
def idx(self):
|
|
|
|
|
return self.proto.id
|
|
|
|
|
return self.desc.id
|
|
|
|
|
|
|
|
|
|
def create_var(self, *args, **kwargs):
|
|
|
|
|
return Variable(self, *args, **kwargs)
|
|
|
|
|
|
|
|
|
|
def append_op(self, *args, **kwargs):
|
|
|
|
|
op_proto = self.proto.append_op()
|
|
|
|
|
op = Operator(self, op_proto, *args, **kwargs)
|
|
|
|
|
op_desc = self.desc.append_op()
|
|
|
|
|
op = Operator(self, op_desc, *args, **kwargs)
|
|
|
|
|
self.ops.append(op)
|
|
|
|
|
return op
|
|
|
|
|
|
|
|
|
|
def prepend_op(self, *args, **kwargs):
|
|
|
|
|
op_proto = self.proto.prepend_op()
|
|
|
|
|
op = Operator(self, op_proto, *args, **kwargs)
|
|
|
|
|
op_desc = self.desc.prepend_op()
|
|
|
|
|
op = Operator(self, op_desc, *args, **kwargs)
|
|
|
|
|
self.ops.appendleft(op)
|
|
|
|
|
return op
|
|
|
|
|
|
|
|
|
@ -104,7 +104,7 @@ class Program(object):
|
|
|
|
|
def __init__(self):
|
|
|
|
|
assert not hasattr(self.__class__,
|
|
|
|
|
'_instance'), 'Do not call constructor directly!'
|
|
|
|
|
self.proto = core.ProgramDesc.instance()
|
|
|
|
|
self.desc = core.ProgramDesc.instance()
|
|
|
|
|
self.blocks = [Block(self, 0)]
|
|
|
|
|
self.current_block_idx = 0
|
|
|
|
|
|
|
|
|
@ -116,7 +116,7 @@ class Program(object):
|
|
|
|
|
|
|
|
|
|
def create_block(self):
|
|
|
|
|
new_block_idx = len(self.blocks)
|
|
|
|
|
self.proto.append_block(self.current_block().proto)
|
|
|
|
|
self.desc.append_block(self.current_block().desc)
|
|
|
|
|
self.current_block_idx = new_block_idx
|
|
|
|
|
self.blocks.append(Block(self, self.current_block_idx))
|
|
|
|
|
return self.current_block()
|
|
|
|
|