public static Lst <ReactionValue> ToReactions(Lst <Polynomize.PolyODE> odes, Style style) { if (odes is Cons <Polynomize.PolyODE> cons) { Lst <ReactionValue> reactions = ToReactions(cons.head.var, cons.head.poly.monomials, ToReactions(cons.tail, style), style); if (cons.head.split == Polynomize.Split.Pos) { SpeciesFlow pos = cons.head.var; SpeciesFlow neg = (cons.tail is Cons <Polynomize.PolyODE> tailCons && tailCons.head.split == Polynomize.Split.Neg) ? tailCons.head.var : throw new Error("ToReactions annihilation"); ReactionValue annihil = new ReactionValue(new List <Symbol> { pos.species, neg.species }, new List <Symbol> { }, new MassActionNumericalRate(1.0)); //ReactionValue annihil = new ReactionValue(new List<Symbol> { pos.species, pos.species, neg.species, neg.species }, new List<Symbol> { }, new MassActionNumericalRate(1.0)); return(new Cons <ReactionValue>(annihil, reactions)); } else { return(reactions); } } else { return(new Nil <ReactionValue>()); } }
public Flow RateFunction(ReactionValue reaction) { Flow monomial = NumberFlow.numberFlowOne; if (reaction.rate is MassActionNumericalRate) { double rate = ((MassActionNumericalRate)reaction.rate).Rate(this.temperature); foreach (SpeciesValue sp in sample.stateMap.species) { int spStoichio = reaction.Stoichiometry(sp.symbol, reaction.reactants); monomial = OpFlow.Op("*", monomial, OpFlow.Op("^", new SpeciesFlow(sp.symbol), new NumberFlow(spStoichio))); } monomial = OpFlow.Op("*", new NumberFlow(rate), monomial); } else if (reaction.rate is MassActionFlowRate) { Flow rate = (reaction.rate as MassActionFlowRate).rateFunction; foreach (SpeciesValue sp in sample.stateMap.species) { int spStoichio = reaction.Stoichiometry(sp.symbol, reaction.reactants); monomial = OpFlow.Op("*", monomial, OpFlow.Op("^", new SpeciesFlow(sp.symbol), new NumberFlow(spStoichio))); } monomial = OpFlow.Op("*", rate, monomial); } else if (reaction.rate is GeneralFlowRate) { monomial = (reaction.rate as GeneralFlowRate).rateFunction; } else { throw new Error("RateFunction"); } return(monomial); }
public ReactionEntry(ReactionValue reaction) { this.reaction = reaction; }