Browse Source

Support for reversible reactions in reactions-to-PRISM converter.

git-svn-id: https://www.prismmodelchecker.org/svn/prism/prism/trunk@5411 bbc10eb1-c90d-0410-af57-cb519fbb1720
master
Dave Parker 14 years ago
parent
commit
502b6f1281
  1. 69
      prism/src/prism/Reactions2Prism.java
  2. 16
      prism/src/prism/ReactionsText2Prism.java

69
prism/src/prism/Reactions2Prism.java

@ -297,6 +297,7 @@ public class Reactions2Prism
for (i2 = 0; i2 < n2; i2++) { for (i2 = 0; i2 < n2; i2++) {
reaction = reactionList.get(i2); reaction = reactionList.get(i2);
if (reaction.isSpeciesInvolved(species.id)) { if (reaction.isSpeciesInvolved(species.id)) {
// Forwards
sb.append("\t// " + reaction.id); sb.append("\t// " + reaction.id);
if (reaction.name.length() > 0) if (reaction.name.length() > 0)
sb.append(" (" + reaction.name + ")"); sb.append(" (" + reaction.name + ")");
@ -317,6 +318,29 @@ public class Reactions2Prism
if (after - before < 0) if (after - before < 0)
sb.append((after - before)); sb.append((after - before));
sb.append(");\n"); sb.append(");\n");
// Maybe also backwards
if (reaction.reversible) {
sb.append("\t// " + reaction.id);
if (reaction.name.length() > 0)
sb.append(" (" + reaction.name + ")");
sb.append("(reverse)\n");
sb.append("\t[" + reaction.id + "_rev] ");
before = reaction.after(species.id);
after = reaction.before(species.id);
if (before > 0)
sb.append(species.prismName + " > " + (before - 1));
if (after - before > 0) {
if (before > 0)
sb.append(" &");
sb.append(" " + species.prismName + " <= " + species.prismName + "_MAX-" + (after - before));
}
sb.append(" -> (" + species.prismName + "'=" + species.prismName);
if (after - before > 0)
sb.append("+" + (after - before));
if (after - before < 0)
sb.append((after - before));
sb.append(");\n");
}
} }
} }
@ -357,6 +381,7 @@ public class Reactions2Prism
} }
} }
// Generate code // Generate code
// Forwards
sb.append("\t// " + reaction.id); sb.append("\t// " + reaction.id);
if (reaction.name.length() > 0) if (reaction.name.length() > 0)
sb.append(" (" + reaction.name + ")"); sb.append(" (" + reaction.name + ")");
@ -367,6 +392,19 @@ public class Reactions2Prism
else else
s2 = MathML2Prism.convert(reaction.kineticLaw, renameFrom, renameTo); s2 = MathML2Prism.convert(reaction.kineticLaw, renameFrom, renameTo);
sb.append("\t[" + reaction.id + "] " + s2 + " > 0 -> " + s2 + " : true;\n"); sb.append("\t[" + reaction.id + "] " + s2 + " > 0 -> " + s2 + " : true;\n");
// Maybe also backwards
if (reaction.reversible) {
sb.append("\t// " + reaction.id);
if (reaction.name.length() > 0)
sb.append(" (" + reaction.name + ")");
sb.append(": " + reaction.reactionString());
sb.append(" (reverse)\n");
if (reaction.kineticLawReverseString != null)
s2 = reaction.kineticLawReverseString;
else
s2 = MathML2Prism.convert(reaction.kineticLawReverse, renameFrom, renameTo);
sb.append("\t[" + reaction.id + "_rev] " + s2 + " > 0 -> " + s2 + " : true;\n");
}
} }
sb.append("\nendmodule\n"); sb.append("\nendmodule\n");
@ -464,8 +502,11 @@ public class Reactions2Prism
public ArrayList<Integer> reactantStoichs; public ArrayList<Integer> reactantStoichs;
public ArrayList<String> products; public ArrayList<String> products;
public ArrayList<Integer> productStoichs; public ArrayList<Integer> productStoichs;
public boolean reversible;
public Element kineticLaw; public Element kineticLaw;
public String kineticLawString; public String kineticLawString;
public Element kineticLawReverse;
public String kineticLawReverseString;
public ArrayList<Parameter> parameters; public ArrayList<Parameter> parameters;
public Reaction(String id, String name) public Reaction(String id, String name)
@ -476,8 +517,11 @@ public class Reactions2Prism
reactantStoichs = new ArrayList<Integer>(); reactantStoichs = new ArrayList<Integer>();
products = new ArrayList<String>(); products = new ArrayList<String>();
productStoichs = new ArrayList<Integer>(); productStoichs = new ArrayList<Integer>();
reversible = false;
kineticLaw = null; kineticLaw = null;
kineticLawString = null; kineticLawString = null;
kineticLawReverse = null;
kineticLawReverseString = null;
parameters = new ArrayList<Parameter>(); parameters = new ArrayList<Parameter>();
} }
@ -513,6 +557,11 @@ public class Reactions2Prism
} }
} }
public void setReversible(boolean reversible)
{
this.reversible = reversible;
}
public void setKineticLaw(Element kineticLaw) public void setKineticLaw(Element kineticLaw)
{ {
this.kineticLaw = kineticLaw; this.kineticLaw = kineticLaw;
@ -525,6 +574,18 @@ public class Reactions2Prism
this.kineticLaw = null; this.kineticLaw = null;
} }
public void setKineticLawReverse(Element kineticLawReverse)
{
this.kineticLawReverse = kineticLawReverse;
this.kineticLawReverseString = null;
}
public void setKineticLawReverseString(String kineticLawReverseString)
{
this.kineticLawReverseString = kineticLawReverseString;
this.kineticLawReverse = null;
}
public void addParameter(String name, String value) public void addParameter(String name, String value)
{ {
parameters.add(new Parameter(name, value)); parameters.add(new Parameter(name, value));
@ -569,10 +630,10 @@ public class Reactions2Prism
s += " Reactants stoichiometry: " + productStoichs + "\n"; s += " Reactants stoichiometry: " + productStoichs + "\n";
s += " Products: " + products + "\n"; s += " Products: " + products + "\n";
s += " Products stoichiometry: " + productStoichs + "\n"; s += " Products stoichiometry: " + productStoichs + "\n";
if (kineticLawString != null)
s += " Kinetic law: " + kineticLawString + "\n";
else
s += " Kinetic law: " + kineticLaw + "\n";
s += " Kinetic law: " + ((kineticLawString != null) ? kineticLawString : kineticLaw) + "\n";
if (reversible) {
s += " Reverse kinetic law: " + ((kineticLawReverseString != null) ? kineticLawReverseString : kineticLawReverse) + "\n";
}
s += " Parameters: " + parameters + "\n"; s += " Parameters: " + parameters + "\n";
return s; return s;
} }

16
prism/src/prism/ReactionsText2Prism.java

@ -207,13 +207,25 @@ public class ReactionsText2Prism extends Reactions2Prism
} }
// Next line // Next line
s = in.readLine(); s = in.readLine();
lineNum++;
if (s == null) if (s == null)
throw new PrismException("missing line in reaction definition"); throw new PrismException("missing line in reaction definition");
s = s.trim(); s = s.trim();
// Get kinetic law // Get kinetic law
// TODO: reversible case
// Irreversible case
if (secType == SectionType.R) {
reaction.setReversible(false);
reaction.setKineticLawString(s); reaction.setKineticLawString(s);
lineNum++;
}
// Irreversible case
else {
reaction.setReversible(true);
ss = s.split("-");
if (ss.length != 2)
throw new PrismException("invalid kinetic law \"" + s + "\" for reversible reaction");
reaction.setKineticLawString(ss[0].trim());
reaction.setKineticLawReverseString(ss[1].trim());
}
reactionList.add(reaction); reactionList.add(reaction);
break; break;

Loading…
Cancel
Save