def lmoma(model, reference=None, cache=None, reactions=None, *args, **kwargs): """Linear Minimization Of Metabolic Adjustment [1]. Parameters ---------- model: cobra.Model reference: FluxDistributionResult, dict cache: ProblemCache reactions: list Returns ------- FluxDistributionResult Contains the result of the solver. References ---------- .. [1] Becker, S. A., Feist, A. M., Mo, M. L., Hannum, G., Palsson, B. Ø., & Herrgard, M. J. (2007). Quantitative prediction of cellular metabolism with constraint-based models: the COBRA Toolbox. Nature Protocols, 2(3), 727–38. doi:10.1038/nprot.2007.99 """ volatile = False if cache is None: volatile = True cache = ProblemCache(model) cache.begin_transaction() if not isinstance(reference, (dict, pandas.Series, FluxDistributionResult)): raise TypeError("reference must be a flux distribution (dict or FluxDistributionResult") try: for rid, flux_value in six.iteritems(reference): reaction = model.reactions.get_by_id(rid) def create_variable(model, var_id, lb): var = model.solver.interface.Variable(var_id, lb=lb) return var pos_var_id = "u_%s_pos" % rid cache.add_variable(pos_var_id, create_variable, None, 0) neg_var_id = "u_%s_neg" % rid cache.add_variable(neg_var_id, create_variable, None, 0) # ui = vi - wt def update_upper_constraint(model, constraint, var, reaction, flux_value): if constraint.lb != flux_value: constraint.lb = flux_value def create_upper_constraint(model, constraint_id, var, reaction, flux_value): constraint = model.solver.interface.Constraint(reaction.flux_expression + var, lb=flux_value, sloppy=True, name=constraint_id) return constraint cache.add_constraint("lmoma_const_%s_ub" % rid, create_upper_constraint, update_upper_constraint, cache.variables[pos_var_id], reaction, flux_value) def update_lower_constraint(model, constraint, var, reaction, flux_value): if constraint.ub != flux_value: constraint.ub = flux_value def create_lower_constraint(model, constraint_id, var, reaction, flux_value): constraint = model.solver.interface.Constraint(reaction.flux_expression - var, ub=flux_value, sloppy=True, name=constraint_id) return constraint cache.add_constraint("lmoma_const_%s_lb" % rid, create_lower_constraint, update_lower_constraint, cache.variables[neg_var_id], reaction, flux_value) def create_objective(model, variables): return model.solver.interface.Objective(add([mul((One, var)) for var in variables]), direction="min", sloppy=False) cache.add_objective(create_objective, None, cache.variables.values()) solution = model.optimize(raise_error=True) if reactions is not None: result = FluxDistributionResult( {r: solution.get_primal_by_id(r) for r in reactions}, solution.objective_value) else: result = FluxDistributionResult.from_solution(solution) return result except Exception as e: cache.rollback() raise e finally: if volatile: cache.reset()
def lmoma(model, reference=None, cache=None, reactions=None, *args, **kwargs): """Linear Minimization Of Metabolic Adjustment [1]. Parameters ---------- model: cobra.Model reference: FluxDistributionResult, dict cache: ProblemCache reactions: list Returns ------- FluxDistributionResult Contains the result of the solver. References ---------- .. [1] Becker, S. A., Feist, A. M., Mo, M. L., Hannum, G., Palsson, B. Ø., & Herrgard, M. J. (2007). Quantitative prediction of cellular metabolism with constraint-based models: the COBRA Toolbox. Nature Protocols, 2(3), 727–38. doi:10.1038/nprot.2007.99 """ volatile = False if cache is None: volatile = True cache = ProblemCache(model) cache.begin_transaction() if not isinstance(reference, (dict, pandas.Series, FluxDistributionResult)): raise TypeError("reference must be a flux distribution (dict or FluxDistributionResult") try: for rid, flux_value in six.iteritems(reference): reaction = model.reactions.get_by_id(rid) def create_variable(model, var_id, lb): var = model.solver.interface.Variable(var_id, lb=lb) return var pos_var_id = "u_%s_pos" % rid cache.add_variable(pos_var_id, create_variable, None, 0) neg_var_id = "u_%s_neg" % rid cache.add_variable(neg_var_id, create_variable, None, 0) # ui = vi - wt def update_upper_constraint(model, constraint, var, reaction, flux_value): if constraint.lb != flux_value: constraint.lb = flux_value def create_upper_constraint(model, constraint_id, var, reaction, flux_value): constraint = model.solver.interface.Constraint(reaction.flux_expression + var, lb=flux_value, sloppy=True, name=constraint_id) return constraint cache.add_constraint("lmoma_const_%s_ub" % rid, create_upper_constraint, update_upper_constraint, cache.variables[pos_var_id], reaction, flux_value) def update_lower_constraint(model, constraint, var, reaction, flux_value): if constraint.ub != flux_value: constraint.ub = flux_value def create_lower_constraint(model, constraint_id, var, reaction, flux_value): constraint = model.solver.interface.Constraint(reaction.flux_expression - var, ub=flux_value, sloppy=True, name=constraint_id) return constraint cache.add_constraint("lmoma_const_%s_lb" % rid, create_lower_constraint, update_lower_constraint, cache.variables[neg_var_id], reaction, flux_value) def create_objective(model, variables): return model.solver.interface.Objective(add([mul((One, var)) for var in variables]), direction="min", sloppy=False) cache.add_objective(create_objective, None, cache.variables.values()) solution = model.optimize(raise_error=True) if reactions is not None: result = FluxDistributionResult({r: solution.get_primal_by_id(r) for r in reactions}, solution.f) else: result = FluxDistributionResult.from_solution(solution) return result except Exception as e: cache.rollback() raise e finally: if volatile: cache.reset()
def moma(model, reference=None, cache=None, reactions=None, *args, **kwargs): """ Minimization of Metabolic Adjustment[1] Parameters ---------- model: cobra.Model reference: FluxDistributionResult, dict cache: ProblemCache reactions: list Returns ------- FluxDistributionResult Contains the result of the solver. References ---------- .. [1] Segrè, D., Vitkup, D., & Church, G. M. (2002). Analysis of optimality in natural and perturbed metabolic networks. Proceedings of the National Academy of Sciences of the United States of America, 99(23), 15112–7. doi:10.1073/pnas.232349399 """ volatile = False if cache is None: volatile = True cache = ProblemCache(model) cache.begin_transaction() try: for rid, flux_value in six.iteritems(reference): def create_variable(model, variable_id): var = model.solver.interface.Variable(variable_id) return var var_id = "moma_aux_%s" % rid cache.add_variable(var_id, create_variable, None) def create_constraint(model, constraint_id, var, reaction, flux_value): constraint = model.solver.interface.Constraint(reaction.flux_expression - var, lb=flux_value, ub=flux_value, name=constraint_id) return constraint def update_constraint(model, constraint, var, reaction, flux_value): if constraint.lb != flux_value: constraint.lb = flux_value constraint.ub = flux_value constraint_id = "moma_const_%s" % rid reaction = model.reactions.get_by_id(rid) cache.add_constraint(constraint_id, create_constraint, update_constraint, cache.variables[var_id], reaction, flux_value) def create_objective(model, variables): return model.solver.interface.Objective(Add(*[FloatOne * var ** 2 for var in variables]), direction="min", sloppy=True) cache.add_objective(create_objective, None, cache.variables.values()) solution = model.optimize(raise_error=True) if reactions is not None: result = FluxDistributionResult( {r: solution.get_primal_by_id(r) for r in reactions}, solution.objective_value) else: result = FluxDistributionResult.from_solution(solution) return result except Exception as e: cache.rollback() raise e finally: if volatile: cache.reset()
def moma(model, reference=None, cache=None, reactions=None, *args, **kwargs): """ Minimization of Metabolic Adjustment[1] Parameters ---------- model: cobra.Model reference: FluxDistributionResult, dict cache: ProblemCache reactions: list Returns ------- FluxDistributionResult Contains the result of the solver. References ---------- .. [1] Segrè, D., Vitkup, D., & Church, G. M. (2002). Analysis of optimality in natural and perturbed metabolic networks. Proceedings of the National Academy of Sciences of the United States of America, 99(23), 15112–7. doi:10.1073/pnas.232349399 """ volatile = False if cache is None: volatile = True cache = ProblemCache(model) cache.begin_transaction() try: for rid, flux_value in six.iteritems(reference): def create_variable(model, variable_id): var = model.solver.interface.Variable(variable_id) return var var_id = "moma_aux_%s" % rid cache.add_variable(var_id, create_variable, None) def create_constraint(model, constraint_id, var, reaction, flux_value): constraint = model.solver.interface.Constraint(reaction.flux_expression - var, lb=flux_value, ub=flux_value, name=constraint_id) return constraint def update_constraint(model, constraint, var, reaction, flux_value): if constraint.lb != flux_value: constraint.lb = flux_value constraint.ub = flux_value constraint_id = "moma_const_%s" % rid reaction = model.reactions.get_by_id(rid) cache.add_constraint(constraint_id, create_constraint, update_constraint, cache.variables[var_id], reaction, flux_value) def create_objective(model, variables): return model.solver.interface.Objective(Add(*[FloatOne * var ** 2 for var in variables]), direction="min", sloppy=True) cache.add_objective(create_objective, None, cache.variables.values()) solution = model.optimize(raise_error=True) if reactions is not None: result = FluxDistributionResult({r: solution.get_primal_by_id(r) for r in reactions}, solution.f) else: result = FluxDistributionResult.from_solution(solution) return result except Exception as e: cache.rollback() raise e finally: if volatile: cache.reset()