def copy_no_rules(model): ''' Copies a model without rules. Parameters ---------- model : pysb.Model Model to copy. ''' m = Model(_export=False) for comp in model.all_components(): if comp.__class__ is not Rule: m.add_component(comp) for ini in model.initial_conditions: m.initial(*ini) return m
def make_model(self, initial_conditions=True, policies=None): model = Model() # Keep track of which policies we're using self.policies = policies self.agent_set = BaseAgentSet() # Collect information about the monomers/self.agent_set from the # statements for stmt in self.statements: stmt.monomers(self.agent_set, policies=policies) # Add the monomers to the model based on our BaseAgentSet for agent_name, agent in self.agent_set.iteritems(): m = Monomer(agent_name, agent.sites, agent.site_states) model.add_component(m) # Iterate over the statements to generate rules for stmt in self.statements: stmt.assemble(model, self.agent_set, policies=policies) # Add initial conditions if initial_conditions: add_default_initial_conditions(model) return model
class PysbAssembler(object): def __init__(self, policies=None): self.statements = [] self.agent_set = None self.model = None if policies is None: self.policies = {'other': 'default'} elif isinstance(policies, basestring): self.policies = {'other': policies} else: self.policies = {'other': 'default'} self.policies.update(policies) def statement_exists(self, stmt): for s in self.statements: if stmt == s: return True return False def add_statements(self, stmts): for stmt in stmts: if not self.statement_exists(stmt): self.statements.append(stmt) def dispatch(self, stmt, stage, *args): class_name = stmt.__class__.__name__ try: policy = self.policies[class_name] except KeyError: policy = self.policies['other'] func_name = '%s_%s_%s' % (class_name.lower(), stage, policy) func = globals().get(func_name) if func is None: raise UnknownPolicyError('%s function %s not defined' % (stage, func_name)) return func(stmt, *args) def monomers(self): """Calls the appropriate monomers method based on policies.""" for stmt in self.statements: self.dispatch(stmt, 'monomers', self.agent_set) def assemble(self): for stmt in self.statements: self.dispatch(stmt, 'assemble', self.model, self.agent_set) def make_model(self, initial_conditions=True): self.model = Model() self.agent_set = BaseAgentSet() # Collect information about the monomers/self.agent_set from the # statements self.monomers() # Add the monomers to the model based on our BaseAgentSet for agent_name, agent in self.agent_set.iteritems(): m = Monomer(agent_name, agent.sites, agent.site_states) self.model.add_component(m) for db_name, db_ref in agent.db_refs.iteritems(): a = get_annotation(m, db_name, db_ref) if a is not None: self.model.add_annotation(a) # Iterate over the statements to generate rules self.assemble() # Add initial conditions if initial_conditions: add_default_initial_conditions(self.model) return self.model def print_model(self, fname='pysb_model.py'): if self.model is not None: with open(fname, 'wt') as fh: fh.write(pysb.export.export(self.model, 'pysb_flat')) def print_rst(self, fname='pysb_model.rst', module_name='pysb_module'): if self.model is not None: with open(fname, 'wt') as fh: fh.write('.. _%s:\n\n' % module_name) fh.write('Module\n======\n\n') fh.write('INDRA-assembled model\n---------------------\n\n') fh.write('::\n\n') model_str = pysb.export.export(self.model, 'pysb_flat') model_str = '\t' + model_str.replace('\n', '\n\t') fh.write(model_str)