import paddle.v2.framework.core as core __all__ = ['Block', 'Variable', 'Program'] class Variable(object): def __init__(self, block, name=None, shape=None, dtype=None, lod_level=None): self.block = block if name is None: name = Variable._unique_var_name_() self.proto = self.block.proto.new_var(name) if shape is not None: self.proto.set_shape(shape) if dtype is not None: # TODO(yuyang18): Convert dtype from numpy.dtype self.proto.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.block.vars[name] = self # TODO(yuyang18): Get methods @staticmethod def _unique_var_name_(): uid = core.unique_integer() # unique during whole process. return "_generated_var_%d" % uid class Block(object): def __init__(self, program, idx): self.proto = program.proto.block(idx) self.vars = dict() # var_name --> var self.ops = list() # operator list self.program = program @property def parent_idx(self): return self.proto.parent @property def idx(self): return self.proto.id def create_var(self, *args, **kwargs): return Variable(self, *args, **kwargs) class Program(object): @classmethod def instance(cls): # From https://stackoverflow.com/questions/8212053 # Making Program as a Singleton class. if not hasattr(cls, '_instance'): cls._instance = cls() return cls._instance def __init__(self): assert not hasattr(self.__class__, '_instance'), 'Do not call constructor directly!' self.proto = core.ProgramDesc.instance() self.blocks = [Block(self, 0)] self.current_block_idx = 0 def global_block(self): return self.blocks[0] def current_block(self): return self.blocks[self.current_block_idx] def create_block(self): new_block_idx = len(self.blocks) self.proto.append_block(self.current_block().proto) self.current_block_idx = new_block_idx self.blocks.append(Block(self, self.current_block_idx)) return self.current_block() def rollback(self): self.current_block_idx = self.current_block().parent_idx # program is a global instance. g_program = Program.instance()