def merge_parameters(model, new_name, parameters): unique_values = {parameter.value for parameter in parameters} if len(unique_values) > 1: raise ValueError("Given parameters have different values: %s" % (', '.join('%s=%g' % (p.name, p.value) for p in parameters))) value = parameters[0].value rules = ComponentSet() for parameter in parameters: rules |= rules_using_parameter(model, parameter) if not rules: raise ValueError("Model has no rules using given parameters: %s" % ', '.join(p.name for p in parameters)) try: new_parameter = model.parameters[new_name] if new_parameter.value != value: raise ValueError("Parameter %s is already present in the model " "with the value %g, which differs from the " "common value of the given parameters, %g" % (new_parameter.name, new_parameter.value, value)) except KeyError: new_parameter = Parameter(new_name, value) model.add_component(new_parameter) for rule in rules: for attr in 'rate_forward', 'rate_reverse': if getattr(rule, attr) in parameters: setattr(rule, attr, new_parameter)
def test_rules_using_parameter(): """ Tests for rules_using_parameter() in pysb.util """ Monomer('m1') Monomer('m2') Monomer('m3') ka1 = Parameter('ka1', 2e-5) keff = Parameter('keff', 1e5) Initial(m2(), Parameter('m2_0', 10000)) Rule('R1', None >> m1(), ka1) Rule('R2', m1() + m2() >> m1() + m3(), keff) components = rules_using_parameter(model, 'keff') assert R2 in components # Get rules by supplying Parameter object directly components = rules_using_parameter(model, keff) assert R2 in components