elmhes - Reduces the given matrix to upper Hessenberg form.
*
- *
+ *
*
* Utility Functions. Call these methods!
*
@@ -70,7 +70,7 @@
*
* References: _Numerical Recipies in C_ (2nd Edition) by Press, Teutolsky,
* Vetterling, and Flannery Cambridge University Press, 1992
- *
+ *
* @author Chris Moore
* @author Roland Keller
* @version $Rev$
@@ -83,25 +83,39 @@ public class MatrixOperations {
* running on the JVM using 32 bit doubles instead of 16 bit floats.
*/
- /** Ensures sufficient decrease in function value */
+ /**
+ * Ensures sufficient decrease in function value
+ */
public static final double ALF = 1.0e-4d;
- /** Approximate square root of the JVM precision */
+ /**
+ * Approximate square root of the JVM precision
+ */
public static final double EPS = 1.0e-8d;
- /** Scaled maximum step length allowed in line searches */
+ /**
+ * Scaled maximum step length allowed in line searches
+ */
public static final double STPMX = 100.0d;
- /** Extremely small value. Nigh zero. */
+ /**
+ * Extremely small value. Nigh zero.
+ */
public static final double TINY = 1.0e-20d;
- /** Convergence criterion on function values */
+ /**
+ * Convergence criterion on function values
+ */
public static final double TOLF = 1.0e-4d;
- /** Criterion deciding whether spurious convergence to a minimum of min */
+ /**
+ * Criterion deciding whether spurious convergence to a minimum of min
+ */
public static final double TOLMIN = 1.0e-6d;
- /** Convergence criterion on delta X */
+ /**
+ * Convergence criterion on delta X
+ */
public static final double TOLX = 1.0e-7d;
private static double[] vv;
@@ -114,25 +128,18 @@ public class MatrixOperations {
* d (return value) is output +/- 1 depending on whether the number of row
* interchanges was even or odd respectively. This routine is used in
* combination with lubksb to solve linear equations or invert a matrix.
- *
- * @param a
- * the matrix to be decomposed
- * @param indx
- * the array to put the return index into
+ *
+ * @param a the matrix to be decomposed
+ * @param indx the array to put the return index into
* @return +1 or -1 signifying whether the number of row interchanges is odd
- * or even
+ * or even
*/
- public static double ludcmp(double a[][], int indx[])
- throws MatrixException {
-
+ public static double ludcmp(double a[][], int indx[]) throws MatrixException {
int n = a.length;
-
int i = 0, imax = 0, j = 0, k = 0;
-
double big, dum, sum, temp;
double d = 1;
-
- if ((vv==null)||vv.length!=n) {
+ if ((vv == null) || vv.length != n) {
vv = new double[n];
}
for (i = 0; i < n; i++) {
@@ -148,14 +155,10 @@ public static double ludcmp(double a[][], int indx[])
}
if (big == 0.0) {
// no non-zero largest element
-
- throw new MatrixException(
- "Error: Singular linearized system. Computation cannot proceed.");
-
+ throw new MatrixException("Error: Singular linearized system. Computation cannot proceed.");
}
vv[i] = 1.0 / big;
}
-
for (j = 0; j < n; j++) {
for (i = 0; i < j; i++) {
sum = a[i][j];
@@ -195,7 +198,6 @@ public static double ludcmp(double a[][], int indx[])
// we don't get any divisions by zero.
a[j][j] = TINY;
}
-
if (j != n) {
dum = 1.0 / (a[j][j]);
for (i = j + 1; i < n; i++) {
@@ -216,52 +218,35 @@ public static double ludcmp(double a[][], int indx[])
* sides b. This routine takes into account the possibility that b will
* begin with many zero elements, so it is efficient for use in matrix
* inversion.
- *
- * @param a
- * the matrix to be solved as described
- * @param indx
- * the array returned by ludcmp
- * @param b
- * the vector to be solbed as described
+ *
+ * @param a the matrix to be solved as described
+ * @param indx the array returned by ludcmp
+ * @param b the vector to be solbed as described
*/
-
public static void lubksb(double a[][], int indx[], double[] b) {
int ii = 0, ip = 0;
-
double sum = 0.0;
-
int n = a.length;
-
for (int i = 1; i <= n; i++) {
-
ip = indx[i - 1] + 1;
sum = b[ip - 1];
b[ip - 1] = b[i - 1];
-
if (ii != 0) {
-
for (int j = ii; j <= i - 1; j++) {
sum -= a[i - 1][j - 1] * b[j - 1];
}
-
} else if (sum != 0.0) {
ii = i;
}
-
b[i - 1] = sum;
}
-
for (int i = n; i >= 1; i--) {
-
sum = b[i - 1];
-
for (int j = i + 1; j <= n; j++) {
sum -= a[i - 1][j - 1] * b[j - 1];
}
-
b[i - 1] = sum / a[i - 1][i - 1];
}
-
}
/**
@@ -269,54 +254,40 @@ public static void lubksb(double a[][], int indx[], double[] b) {
* matrix with identical eigenvalues. A symmetric matrix is already balanced
* and is unaffected by this procedure. The parameter RADIX should be the
* machine's floating-point radix.
- *
- * @param a
- * the matrix to be balanced
+ *
+ * @param a the matrix to be balanced
*/
public static void balance(double a[][]) {
// The JVM is a binary machine, ie radix base 2
final int RADIX = 2;
-
int last = 0;
-
int n = a.length;
-
double s = 0.0, r = 0.0, g = 0.0, f = 0.0, c = 0.0;
-
double sqrdx = RADIX * RADIX;
-
while (last == 0) {
last = 1;
for (int i = 1; i <= n; i++) {
-
r = 0.0;
c = 0.0;
-
for (int j = 1; j <= n; j++) {
if (j != i) {
c += Math.abs(a[j - 1][i - 1]);
r += Math.abs(a[i - 1][j - 1]);
}
}
-
if ((c != 0.0) && (r != 0.0)) {
-
g = r / RADIX;
f = 1.0;
s = c + r;
-
while (c < g) {
f *= RADIX;
c *= sqrdx;
}
-
g = r * RADIX;
-
while (c > g) {
f /= RADIX;
c /= sqrdx;
}
-
if ((c + r) / f < 0.95 * s) {
last = 0;
g = 1.0 / f;
@@ -327,72 +298,53 @@ public static void balance(double a[][]) {
a[j - 1][i - 1] *= f;
}
}
-
}
-
}
}
}
/**
* Reduces a[1..n][1..n] to upper Hessenberg form
- *
- * @param a
- * the matrix to be reduced
+ *
+ * @param a the matrix to be reduced
*/
public static void elmhes(double a[][]) {
int m, j, i;
-
int n = a.length;
-
double y, x;
-
for (m = 2; m < n; m++) {
-
x = 0.0;
i = m;
-
for (j = m; j <= n; j++) {
if (Math.abs(a[j - 1][m - 2]) > Math.abs(x)) {
-
x = a[j - 1][m - 2];
i = j;
-
}
}
-
if (i != m) {
double temp;
for (j = m - 1; j <= n; j++) {
temp = a[i - 1][j - 1];
a[i - 1][j - 1] = a[m - 1][j - 1];
a[m - 1][j - 1] = temp;
-
}
-
for (j = 1; j <= n; j++) {
temp = a[j - 1][i - 1];
a[j - 1][i - 1] = a[j - 1][m - 1];
a[j - 1][m - 1] = temp;
-
}
}
-
if (x != 0.0) {
for (i = m + 1; i <= n; i++) {
if ((y = a[i - 1][m - 2]) != 0.0) {
-
y /= x;
a[i - 1][m - 2] = y;
-
for (j = m; j <= n; j++) {
a[i - 1][j - 1] -= y * a[m - 1][j - 1];
}
-
for (j = 1; j <= n; j++) {
a[j - 1][m - 1] += y * a[j - 1][i - 1];
}
-
}
}
}
@@ -401,11 +353,9 @@ public static void elmhes(double a[][]) {
/**
* Returns the value of a or |a| with the same sign as b
- *
- * @param a
- * the input as specified above
- * @param b
- * the input as specified above
+ *
+ * @param a the input as specified above
+ * @param b the input as specified above
* @return the value of a or |a| with the same sign as b
*/
public static double sign(double a, double b) {
@@ -421,40 +371,28 @@ public static double sign(double a, double b) {
* input a can be exactly as output from elmhes (� 11.5); on output it is
* destroyed. The real and imaginary parts of the eigenvalues are returned
* in wr[1..n] and wi[1..n], respectively.
- *
- * @param a
- * the input matrix
- * @param wr
- * the array specified in the function description
- * @param wi
- * the array specified in the function description
+ *
+ * @param a the input matrix
+ * @param wr the array specified in the function description
+ * @param wi the array specified in the function description
* @return 0 iff success
*/
public static int hqr(double a[][], double wr[], double wi[])
throws MatrixException {
-
// Initialize variables
-
int nn = 0, m = 0, l = 0, k = 0, j = 0, its = 0, i = 0, mmin = 0;
-
int n = a.length;
-
double z = 0.0, y = 0.0, x = 0.0, w = 0.0, v = 0.0, u = 0.0, t = 0.0, s = 0.0, r = 0.0, q = 0.0, p = 0.0, anorm = 0.0;
-
anorm = Math.abs(a[0][0]);
for (i = 2; i <= n; i++) {
for (j = i - 1; j <= n; j++) {
anorm += Math.abs(a[i - 1][j - 1]);
}
}
-
nn = n;
t = 0.0;
-
while (nn >= 1) {
-
its = 0;
-
do {
for (l = nn; l >= 2; l--) {
s = Math.abs(a[l - 2][l - 2]) + Math.abs(a[l - 1][l - 1]);
@@ -494,19 +432,14 @@ public static int hqr(double a[][], double wr[], double wi[])
} else {
if (its == 30) {
// Too many iterations in hqr
- throw new MatrixException(
- "Error: Could not find acceptable equilibrium point in "
- + its
- + " iterations. Please try another initial guess.");
+ throw new MatrixException("Error: Could not find acceptable equilibrium point in " + its + " iterations. Please try another initial guess.");
}
-
if (its == 10 || its == 20) {
t += x;
for (i = 1; i <= nn; i++) {
a[i - 1][i - 1] -= x;
}
- s = Math.abs(a[nn - 1][nn - 2])
- + Math.abs(a[nn - 2][nn - 3]);
+ s = Math.abs(a[nn - 1][nn - 2]) + Math.abs(a[nn - 2][nn - 3]);
y = x = 0.75 * s;
w = -0.4375 * s * s;
}
@@ -525,11 +458,8 @@ public static int hqr(double a[][], double wr[], double wi[])
if (m == l) {
break;
}
- u = Math.abs(a[m - 1][m - 2])
- * (Math.abs(q) + Math.abs(r));
- v = Math.abs(p)
- * (Math.abs(a[m - 2][m - 2]) + Math.abs(z) + Math
- .abs(a[m][m]));
+ u = Math.abs(a[m - 1][m - 2]) * (Math.abs(q) + Math.abs(r));
+ v = Math.abs(p) * (Math.abs(a[m - 2][m - 2]) + Math.abs(z) + Math.abs(a[m][m]));
if ((u + v) == v) {
break;
}
@@ -548,14 +478,12 @@ public static int hqr(double a[][], double wr[], double wi[])
if (k != (nn - 1)) {
r = a[k + 1][k - 2];
}
- if ((x = Math.abs(p) + Math.abs(q)
- + Math.abs(r)) != 0.0) {
+ if ((x = Math.abs(p) + Math.abs(q) + Math.abs(r)) != 0.0) {
p /= x;
q /= x;
r /= x;
}
}
-
if ((s = sign(Math.sqrt(p * p + q * q + r * r), p)) != 0.0) {
if (k == m) {
if (l != m) {
@@ -579,13 +507,11 @@ public static int hqr(double a[][], double wr[], double wi[])
a[k][j - 1] -= p * y;
a[k - 1][j - 1] -= p * x;
}
-
if (nn < k + 3) {
mmin = nn;
} else {
mmin = k + 3;
}
-
for (i = l; i <= mmin; i++) {
p = x * a[i - 1][k - 1] + y * a[i - 1][k];
if (k != (nn - 1)) {
@@ -612,6 +538,7 @@ public static int hqr(double a[][], double wr[], double wi[])
*/
@SuppressWarnings("serial")
public static class MatrixException extends Exception {
+
/**
* Constructor for MatrixException
*/
@@ -625,7 +552,5 @@ public MatrixException() {
public MatrixException(String message) {
super(message);
}
-
}
-
}
diff --git a/src/main/java/org/simulator/math/MaxAbsDistance.java b/src/main/java/org/simulator/math/MaxAbsDistance.java
index 859a8211..0b78480d 100644
--- a/src/main/java/org/simulator/math/MaxAbsDistance.java
+++ b/src/main/java/org/simulator/math/MaxAbsDistance.java
@@ -9,39 +9,33 @@
*/
public class MaxAbsDistance extends QualityMeasure {
-
- @Override
- public double distance(Column x, Column y, double defaultValue) {
- double x_i;
- double y_i;
- double d = Double.MIN_VALUE;
-
- for (int z = 0 ; z < Math.min(x.getRowCount(), y.getRowCount()); z++){
- x_i = x.getValue(z);
- y_i = y.getValue(z);
- if (!Double.isNaN(y_i) && !Double.isNaN(x_i) && (y_i != x_i)){
- d = Math.max(d, Math.abs(x_i - y_i));
- }
- }
-
- return d;
+ @Override
+ public double distance(Column x, Column y, double defaultValue) {
+ double x_i;
+ double y_i;
+ double d = Double.MIN_VALUE;
+ for (int z = 0; z < Math.min(x.getRowCount(), y.getRowCount()); z++) {
+ x_i = x.getValue(z);
+ y_i = y.getValue(z);
+ if (!Double.isNaN(y_i) && !Double.isNaN(x_i) && (y_i != x_i)) {
+ d = Math.max(d, Math.abs(x_i - y_i));
+ }
}
-
- public double distanceToZero(Column x, double defaultValue) {
- double x_i;
- double d = -Double.MAX_VALUE;
-
- for (int i = 0; i< x.getRowCount(); i++){
- x_i = x.getValue(i);
- if (!Double.isNaN(x_i) && !Double.isInfinite(x_i)){
- d = Math.max(d, Math.abs(x_i));
- }
- }
-
- if (d == Double.MIN_VALUE){
- return defaultValue;
- }
- return d;
+ return d;
+ }
+
+ public double distanceToZero(Column x, double defaultValue) {
+ double x_i;
+ double d = -Double.MAX_VALUE;
+ for (int i = 0; i < x.getRowCount(); i++) {
+ x_i = x.getValue(i);
+ if (!Double.isNaN(x_i) && !Double.isInfinite(x_i)) {
+ d = Math.max(d, Math.abs(x_i));
+ }
}
-
+ if (d == Double.MIN_VALUE) {
+ return defaultValue;
+ }
+ return d;
+ }
}
diff --git a/src/main/java/org/simulator/math/MaxDivergenceTolerance.java b/src/main/java/org/simulator/math/MaxDivergenceTolerance.java
index 4f992c21..825ff58f 100644
--- a/src/main/java/org/simulator/math/MaxDivergenceTolerance.java
+++ b/src/main/java/org/simulator/math/MaxDivergenceTolerance.java
@@ -6,7 +6,7 @@
* An implementation of core comparison metric of the simulator's
* result with the pre-defined results. MaxDivergenceTolerance class
* basically calculates the LHS of the below given metric.
- *
+ *
* Metric Formula:
*
*
- *
+ *
*/
public class MaxDivergenceTolerance extends QualityMeasure {
- /**
- * The metric the relative distance is based on
- */
- protected MaxAbsDistance metric;
-
- /**
- * Absolute tolerance for the reaction
- */
- protected double absTol;
+ /**
+ * The metric the relative distance is based on
+ */
+ protected MaxAbsDistance metric;
- /**
- * Relative tolerance for the reaction
- */
- protected double relTol;
-
- /**
- * Default Constructor
- */
- public MaxDivergenceTolerance(double absTol, double relTol) {
- super(Double.NaN);
- metric = new MaxAbsDistance();
- this.absTol = absTol;
- this.relTol = relTol;
- }
+ /**
+ * Absolute tolerance for the reaction
+ */
+ protected double absTol;
- /* (non-Javadoc)
- * @see org.sbml.simulator.math.Distance#distance(java.lang.Iterable, java.lang.Iterable, double)
- */
- @Override
- public double distance(Column x, Column y, double defaultValue) {
+ /**
+ * Relative tolerance for the reaction
+ */
+ protected double relTol;
- for (int i = 0; i < Math.min(x.getRowCount(), y.getRowCount()); i++) {
+ /**
+ * Default constructor. Initializes the metric {@link MaxAbsDistance}
+ * and sets the absolute and relative tolerances.
+ *
+ * @param absTol
+ * @param relTol
+ */
+ public MaxDivergenceTolerance(double absTol, double relTol) {
+ // sets the default value in case any error occurs
+ super(Double.NaN);
+ metric = new MaxAbsDistance();
+ this.absTol = absTol;
+ this.relTol = relTol;
+ }
- double p = Math.abs(y.getValue(i) - x.getValue(i));
- double q = this.absTol + (this.relTol * Math.abs(y.getValue(i)));
-
- x.setValue((q != 0) ? (p / q) : Double.POSITIVE_INFINITY, i);
-
- }
-
- return metric.distanceToZero(x, defaultValue);
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public double distance(Column x, Column y, double defaultValue) {
+ for (int i = 0; i < Math.min(x.getRowCount(), y.getRowCount()); i++) {
+ double p = Math.abs(y.getValue(i) - x.getValue(i));
+ double q = this.absTol + (this.relTol * Math.abs(y.getValue(i)));
+ x.setValue((q != 0) ? (p / q) : Double.POSITIVE_INFINITY, i);
}
-
+ return metric.distanceToZero(x, defaultValue);
+ }
}
diff --git a/src/main/java/org/simulator/math/MeanFunction.java b/src/main/java/org/simulator/math/MeanFunction.java
index ba77b07b..c8d77ec0 100644
--- a/src/main/java/org/simulator/math/MeanFunction.java
+++ b/src/main/java/org/simulator/math/MeanFunction.java
@@ -31,7 +31,7 @@
/**
* In this class functions for the computation of an overall distance based on
* the distance values determined for each column of a table are defined.
- *
+ *
* @author Roland Keller
* @version $Rev$
* @since 1.0
@@ -45,6 +45,7 @@ public abstract class MeanFunction implements Serializable {
/**
* Computes the overall distance
+ *
* @param values the distance values for the columns
* @return the computed value
*/
@@ -52,6 +53,7 @@ public abstract class MeanFunction implements Serializable {
/**
* Computes the overall distance
+ *
* @param values the distance values for the columns
* @return the computed value
*/
@@ -65,7 +67,7 @@ public double computeMean(List values) {
/**
* Computes the overall distance
- *
+ *
* @param values the distance values for the columns
* @return the computed value
*/
@@ -76,5 +78,4 @@ public double computeMean(Iterable extends Number> values) {
}
return computeMean(val);
}
-
}
diff --git a/src/main/java/org/simulator/math/N_Metric.java b/src/main/java/org/simulator/math/N_Metric.java
index b0e00e7b..eb2f08af 100644
--- a/src/main/java/org/simulator/math/N_Metric.java
+++ b/src/main/java/org/simulator/math/N_Metric.java
@@ -30,7 +30,7 @@
* An implementation of an n-metric. An n-metric is basically the nth
* root of the sum of the distances of every single element in two vectors
* (arrays), where this distance will always be exponentiated by the value of n.
- *
+ *
* @author Andreas Dräger
* @author Roland Keller
* @version $Rev$
@@ -38,7 +38,6 @@
*/
public class N_Metric extends QualityMeasure {
-
/**
* Generated serial identifier.
*/
@@ -68,7 +67,7 @@ public N_Metric() {
* two is the Euclidean metric.
* Infinity is the maximum norm.
*
- *
+ *
* @param root
*/
public N_Metric(double root) {
@@ -77,7 +76,6 @@ public N_Metric(double root) {
}
/**
- *
* @param x_i
* @param y_i
* @param root
@@ -89,18 +87,17 @@ public N_Metric(double root) {
}
/*
- *
+ *
*/
@Override
- public double distance(Column x,
- Column y, double defaultValue) {
+ public double distance(Column x, Column y, double defaultValue) {
if (root == 0d) {
return defaultValue;
}
double d = 0;
double x_i;
double y_i;
- for (int i = 0; i!= Math.min(x.getRowCount(), y.getRowCount()); i++) {
+ for (int i = 0; i != Math.min(x.getRowCount(), y.getRowCount()); i++) {
x_i = x.getValue(i);
y_i = y.getValue(i);
if (computeDistanceFor(x_i, y_i, root, defaultValue)) {
@@ -110,9 +107,9 @@ public double distance(Column x,
return overallDistance(d, root, defaultValue);
}
-
/**
* Returns the n of the metric.
+ *
* @return n
*/
public double getRoot() {
@@ -121,7 +118,7 @@ public double getRoot() {
/**
* Helper method, which can be overridden in extending classes.
- *
+ *
* @param distance
* @param root
* @param defaultValue
@@ -133,6 +130,7 @@ public double getRoot() {
/**
* Sets the root.
+ *
* @param root
*/
public void setRoot(double root) {
@@ -140,7 +138,7 @@ public void setRoot(double root) {
}
/**
- * @param x expected
+ * @param x expected
* @param defaultValue
* @return the distance of the column vector x to the point of origin.
*/
@@ -156,7 +154,6 @@ public double distanceToZero(Column x, double defaultValue) {
d += additiveTerm(x_i, 0d, root, defaultValue);
}
}
- return overallDistance(d,root,defaultValue);
+ return overallDistance(d, root, defaultValue);
}
-
}
diff --git a/src/main/java/org/simulator/math/PearsonCorrelation.java b/src/main/java/org/simulator/math/PearsonCorrelation.java
index 983d9454..3c379f9b 100644
--- a/src/main/java/org/simulator/math/PearsonCorrelation.java
+++ b/src/main/java/org/simulator/math/PearsonCorrelation.java
@@ -28,7 +28,7 @@
/**
* Implementation of the Pearson correlation.
- *
+ *
* @author Roland Keller
* @version $Rev$
* @since 1.0
@@ -40,7 +40,6 @@ public class PearsonCorrelation extends QualityMeasure {
*/
private static final long serialVersionUID = -493779339080103217L;
-
/**
* Default constructor. This sets the standard value for the parameter as
* given by the getStandardParameter() method. The default value is set to
@@ -48,48 +47,42 @@ public class PearsonCorrelation extends QualityMeasure {
*/
public PearsonCorrelation() {
super();
- meanFunction=new ArithmeticMean();
+ meanFunction = new ArithmeticMean();
}
/**
* Constructor, which allows setting the parameter value for default value.
- *
+ *
* @param defaultValue the default value
*/
public PearsonCorrelation(double defaultValue) {
super(defaultValue);
- meanFunction=new ArithmeticMean();
+ meanFunction = new ArithmeticMean();
}
/* (non-Javadoc)
* @see org.sbml.simulator.math.Distance#distance(java.lang.Iterable, java.lang.Iterable, double)
*/
@Override
- public double distance(Column x,
- Column y, double defaultValue) {
+ public double distance(Column x, Column y, double defaultValue) {
MeanFunction meanF = new ArithmeticMean();
double meanX = meanF.computeMean(x);
double meanY = meanF.computeMean(y);
-
double sumNumerator = 0d;
double sumXSquared = 0d;
double sumYSquared = 0d;
-
for (int i = 0; i != Math.min(x.getRowCount(), y.getRowCount()); i++) {
double x_i = x.getValue(i);
double y_i = y.getValue(i);
- sumNumerator+= (x_i-meanX)*(y_i-meanY);
- sumXSquared+= (x_i-meanX)*(x_i-meanX);
- sumYSquared+= (y_i-meanY)*(y_i-meanY);
+ sumNumerator += (x_i - meanX) * (y_i - meanY);
+ sumXSquared += (x_i - meanX) * (x_i - meanX);
+ sumYSquared += (y_i - meanY) * (y_i - meanY);
}
-
- double denominator=Math.sqrt(sumXSquared*sumYSquared);
- if (denominator!=0) {
- return sumNumerator/denominator;
- }
- else {
+ double denominator = Math.sqrt(sumXSquared * sumYSquared);
+ if (denominator != 0) {
+ return sumNumerator / denominator;
+ } else {
return defaultValue;
}
}
-
}
diff --git a/src/main/java/org/simulator/math/QualityMeasure.java b/src/main/java/org/simulator/math/QualityMeasure.java
index 72f58ae8..d618cc38 100644
--- a/src/main/java/org/simulator/math/QualityMeasure.java
+++ b/src/main/java/org/simulator/math/QualityMeasure.java
@@ -32,7 +32,7 @@
/**
* This class is the basis of various implementations of distance functions.
- *
+ *
* @author Roland Keller
* @author Andreas Dräger
* @version $Rev$
@@ -52,7 +52,7 @@ public abstract class QualityMeasure implements Serializable {
protected double defaultValue;
/**
- *
+ *
*/
protected MeanFunction meanFunction;
@@ -68,7 +68,7 @@ public QualityMeasure() {
/**
* Constructor, which allows setting the parameter value for default value.
- *
+ *
* @param defaultValue
*/
public QualityMeasure(double defaultValue) {
@@ -79,7 +79,7 @@ public QualityMeasure(double defaultValue) {
/**
* Constructor, which allows setting the parameter values for
* {@link #meanFunction} and {@link #defaultValue}.
- *
+ *
* @param defaultValue
* @param meanFunction
*/
@@ -93,16 +93,15 @@ public QualityMeasure(double defaultValue, MeanFunction meanFunction) {
* computation of a distance. This method checks if both arguments x_i and
* y_i are not {@link Double#NaN} and differ from each other. If other
* conditions should be checked, this method can be overridden.
- *
+ *
* @param x_i
* @param y_i
* @param root
* @param defaultValue
* @return True if the given values x_i and y_i are valid and should be
- * considered to compute the distance.
+ * considered to compute the distance.
*/
- boolean computeDistanceFor(double x_i, double y_i, double root,
- double defaultValue) {
+ boolean computeDistanceFor(double x_i, double y_i, double root, double defaultValue) {
return !Double.isNaN(y_i) && !Double.isNaN(x_i) && (y_i != x_i);
}
@@ -113,15 +112,14 @@ boolean computeDistanceFor(double x_i, double y_i, double root,
* If so, the additional values in the bigger matrix are ignored and do not
* contribute to the distance. NaN
values do also not
* contribute to the distance.
- *
+ *
* @param x
* @param y
* @return distance the distance between the two vectors
* @throws IllegalArgumentException
*/
- public double distance(Column x,
- Column y) {
- return distance(x, y,defaultValue);
+ public double distance(Column x, Column y) {
+ return distance(x, y, defaultValue);
}
/**
@@ -130,22 +128,17 @@ public double distance(Column x,
* distance uses a non defined operation. If one array is longer than the
* other one additional values do not contribute to the distance.
* {@link Double#NaN} values are also ignored.
- *
- * @param x
- * an array
- * @param y
- * another array
- * @param defaultValue
- * The value to be returned in cases in which no distance
- * computation is possible.
+ *
+ * @param x an array
+ * @param y another array
+ * @param defaultValue The value to be returned in cases in which no distance
+ * computation is possible.
* @return The distance between the two arrays x and y.
* @throws IllegalArgumentException
*/
- public abstract double distance(Column x,
- Column y,double defaultValue);
+ public abstract double distance(Column x, Column y, double defaultValue);
/**
- *
* @param x
* @param expected
* @return distance the distance between the two tables
@@ -157,7 +150,6 @@ public double distance(MultiTable x, MultiTable expected) {
left = x.filter(expected.getTimePoints());
right = expected.filter(x.getTimePoints());
}
-
List distances = new ArrayList(getColumnDistances(left, right));
return meanFunction.computeMean(distances);
}
@@ -169,17 +161,17 @@ public double distance(MultiTable x, MultiTable expected) {
* not contribute to the distance. {@link Double#NaN} values do also not
* contribute to the distance. Only columns with matching identifiers are
* considered for the distance computation.
- *
+ *
* @param x
* @param expected
* @return columnDistances the list of distances for the columns in the blocks
*/
public List getColumnDistances(MultiTable x, MultiTable expected) {
- List distances= new ArrayList();
- for(int block = 0; block < x.getBlockCount(); block++) {
+ List distances = new ArrayList();
+ for (int block = 0; block < x.getBlockCount(); block++) {
String identifiers[] = x.getBlock(block).getIdentifiers();
for (int i = 0; i < identifiers.length; i++) {
- if ((identifiers[i]!=null) && (expected.getColumn(identifiers[i]) != null)) {
+ if ((identifiers[i] != null) && (expected.getColumn(identifiers[i]) != null)) {
distances.add(distance(x.getBlock(block).getColumn(i), expected.getColumn(identifiers[i])));
}
}
@@ -188,33 +180,29 @@ public List getColumnDistances(MultiTable x, MultiTable expected) {
}
/**
- *
* @param x
* @param expected
* @return maxAbsDistances the list of maximum absolute distances in the blocks
*/
public Map getMaxAbsDistances(MultiTable x, MultiTable expected) {
-
Map distances = new HashMap<>();
- for(int block = 0; block < x.getBlockCount(); block++) {
+ for (int block = 0; block < x.getBlockCount(); block++) {
String identifiers[] = x.getBlock(block).getIdentifiers();
for (int i = 0; i < identifiers.length; i++) {
- if ((identifiers[i]!=null) && (expected.getColumn(identifiers[i]) != null)) {
+ if ((identifiers[i] != null) && (expected.getColumn(identifiers[i]) != null)) {
MultiTable.Block.Column a = x.getBlock(block).getColumn(i);
MultiTable.Block.Column b = expected.getColumn(identifiers[i]);
-
distances.put(x.getBlock(block).getColumn(i).getColumnName(), distance(a, b, defaultValue));
}
}
}
-
return distances;
}
/**
* Returns the default value that is returned by the distance function in
* cases in which the computation of the distance is not possible.
- *
+ *
* @return defaultValue
*/
public double getDefaultValue() {
@@ -228,11 +216,10 @@ public final MeanFunction getMeanFunction() {
return meanFunction;
}
-
/**
* Set the value to be returned by the distance function in cases, in which
* no distance can be computed.
- *
+ *
* @param defaultValue
*/
public void setDefaultValue(double defaultValue) {
@@ -245,5 +232,4 @@ public void setDefaultValue(double defaultValue) {
public final void setMeanFunction(MeanFunction meanFunction) {
this.meanFunction = meanFunction;
}
-
}
diff --git a/src/main/java/org/simulator/math/RNG.java b/src/main/java/org/simulator/math/RNG.java
index 2ea1acf7..23ccc386 100644
--- a/src/main/java/org/simulator/math/RNG.java
+++ b/src/main/java/org/simulator/math/RNG.java
@@ -30,7 +30,7 @@
/**
* A Random Number Generator.
- *
+ *
* @author Marcel Kronfeld
* @version $Rev$
* @since 0.9
@@ -38,15 +38,17 @@
public class RNG {
/**
- *
+ *
*/
private static Random RANDOM;
+
/**
- *
+ *
*/
private static long RANDOM_SEED;
+
/**
- *
+ *
*/
private static final Logger logger = Logger.getLogger(RNG.class.getName());
@@ -60,6 +62,7 @@ public class RNG {
/**
* Generates a random integer between first and second input value.
+ *
* @param low
* @param high
* @return randomNumber
@@ -71,12 +74,9 @@ public static int randomInt(int low, int high) {
}
int result = (Math.abs(RANDOM.nextInt()) % (high - low + 1)) + low;
if ((result < low) || (result > high)) {
- logger.fine(MessageFormat.format(
- "Error, invalid value {0,number} in RNG.randomInt! boundaries were low = {1,number}\thigh = {2,number}",
- result, low, high));
+ logger.fine(MessageFormat.format("Error, invalid value {0,number} in RNG.randomInt! boundaries were low = {1,number}\thigh = {2,number}", result, low, high));
result = Math.abs(RANDOM.nextInt() % (high - low + 1)) + low;
}
return result;
}
-
}
diff --git a/src/main/java/org/simulator/math/RelativeEuclideanDistance.java b/src/main/java/org/simulator/math/RelativeEuclideanDistance.java
index 9a686c1c..24407260 100644
--- a/src/main/java/org/simulator/math/RelativeEuclideanDistance.java
+++ b/src/main/java/org/simulator/math/RelativeEuclideanDistance.java
@@ -26,7 +26,7 @@
/**
* Class for computation of the relative Euclidean distance of two vectors.
- *
+ *
* @author Roland Keller
* @version $Rev$
* @since 1.0
@@ -52,5 +52,4 @@ public RelativeEuclideanDistance() {
public void setRoot(double root) {
//root should not be changed
}
-
}
diff --git a/src/main/java/org/simulator/math/RelativeManhattanDistance.java b/src/main/java/org/simulator/math/RelativeManhattanDistance.java
index bef22b03..31b38687 100644
--- a/src/main/java/org/simulator/math/RelativeManhattanDistance.java
+++ b/src/main/java/org/simulator/math/RelativeManhattanDistance.java
@@ -26,7 +26,7 @@
/**
* Class for computation of the relative Manhattan distance of two vectors.
- *
+ *
* @author Roland Keller
* @version $Rev$
* @since 1.0
@@ -52,5 +52,4 @@ public RelativeManhattanDistance() {
public void setRoot(double root) {
//root should not be changed
}
-
}
diff --git a/src/main/java/org/simulator/math/RelativeMaxDistance.java b/src/main/java/org/simulator/math/RelativeMaxDistance.java
index bb5cf804..f742c5e3 100644
--- a/src/main/java/org/simulator/math/RelativeMaxDistance.java
+++ b/src/main/java/org/simulator/math/RelativeMaxDistance.java
@@ -8,41 +8,40 @@
*/
public class RelativeMaxDistance extends QualityMeasure {
- /**
- * The metric the relative distance is based on
- */
- protected MaxAbsDistance metric;
-
- /**
- * Default Constructor
- */
- public RelativeMaxDistance() {
- super(Double.NaN);
- metric = new MaxAbsDistance();
- }
-
- /**
- * Initialization with a given {@link MaxAbsDistance}
- *
- * @param metric
- */
- public RelativeMaxDistance(MaxAbsDistance metric) {
- super(Double.NaN);
- this.metric = metric;
- }
-
- /* (non-Javadoc)
- * @see org.sbml.simulator.math.Distance#distance(java.lang.Iterable, java.lang.Iterable, double)
- */
- @Override
- public double distance(Column x, Column y, double defaultValue) {
-
- for (int i = 0; i < Math.min(x.getRowCount(), y.getRowCount()); i++) {
-
- x.setValue((y.getValue(i) != 0) ? ((y.getValue(i) - x.getValue(i)) / y.getValue(i)) : Double.POSITIVE_INFINITY, i);
-
- }
-
- return metric.distanceToZero(x, defaultValue);
+ /**
+ * The metric the relative distance is based on
+ */
+ protected MaxAbsDistance metric;
+
+ /**
+ * Default Constructor
+ */
+ public RelativeMaxDistance() {
+ // sets the default value in case any error occurs
+ super(Double.NaN);
+ metric = new MaxAbsDistance();
+ }
+
+ /**
+ * Initialization with a given {@link MaxAbsDistance}
+ *
+ * @param metric
+ */
+ public RelativeMaxDistance(MaxAbsDistance metric) {
+ super(Double.NaN);
+ this.metric = metric;
+ }
+
+ /* (non-Javadoc)
+ * @see org.sbml.simulator.math.Distance#distance(java.lang.Iterable, java.lang.Iterable, double)
+ */
+ @Override
+ public double distance(Column x, Column y, double defaultValue) {
+ for (int i = 0; i < Math.min(x.getRowCount(), y.getRowCount()); i++) {
+ x.setValue((y.getValue(i) != 0) ?
+ ((y.getValue(i) - x.getValue(i)) / y.getValue(i)) :
+ Double.POSITIVE_INFINITY, i);
}
+ return metric.distanceToZero(x, defaultValue);
+ }
}
diff --git a/src/main/java/org/simulator/math/RelativeSquaredError.java b/src/main/java/org/simulator/math/RelativeSquaredError.java
index 028fd41b..420906df 100644
--- a/src/main/java/org/simulator/math/RelativeSquaredError.java
+++ b/src/main/java/org/simulator/math/RelativeSquaredError.java
@@ -29,7 +29,7 @@
* division by zero. Actually, the exponent in this error function is 2 (squared
* error). Irrespectively, it is possible to set the exponent to different
* values.
- *
+ *
* @author Andreas Dräger
* @version $Rev$
* @since 1.0
@@ -64,5 +64,4 @@ public RelativeSquaredError() {
double overallDistance(double distance, double root, double defaultValue) {
return distance;
}
-
}
diff --git a/src/main/java/org/simulator/math/Relative_N_Metric.java b/src/main/java/org/simulator/math/Relative_N_Metric.java
index b7ec1aaa..12692f04 100644
--- a/src/main/java/org/simulator/math/Relative_N_Metric.java
+++ b/src/main/java/org/simulator/math/Relative_N_Metric.java
@@ -29,7 +29,7 @@
/**
* Computes the relative distance of two vectors based on the {@link N_Metric}
* distance.
- *
+ *
* @author Roland Keller
* @version $Rev$
* @since 1.0
@@ -62,6 +62,7 @@ public Relative_N_Metric() {
/**
* Initialization with a certain n
+ *
* @param root
*/
public Relative_N_Metric(double root) {
@@ -72,6 +73,7 @@ public Relative_N_Metric(double root) {
/**
* Initialization with a given {@link N_Metric}
+ *
* @param metric
*/
public Relative_N_Metric(N_Metric metric) {
@@ -79,8 +81,7 @@ public Relative_N_Metric(N_Metric metric) {
this.metric = metric;
if (Double.isNaN(metric.getDefaultValue())) {
defaultNaN = true;
- }
- else {
+ } else {
defaultNaN = false;
}
}
@@ -89,24 +90,21 @@ public Relative_N_Metric(N_Metric metric) {
* @see org.sbml.simulator.math.Distance#distance(java.lang.Iterable, java.lang.Iterable, double)
*/
@Override
- public double distance(Column x,
- Column expected, double defaultValue) {
- double numerator=metric.distance(x, expected, defaultValue);
+ public double distance(Column x, Column expected, double defaultValue) {
+ double numerator = metric.distance(x, expected, defaultValue);
double denominator = metric.distanceToZero(expected, defaultValue);
double denominator2 = metric.distanceToZero(x, defaultValue);
- if ((denominator != 0) && (denominator2 != 0) ) {
+ if ((denominator != 0) && (denominator2 != 0)) {
return numerator / denominator;
} else if ((denominator == 0) && (denominator2 == 0)) {
return numerator;
} else if (defaultNaN) {
return numerator;
- }
- else {
+ } else {
return this.defaultValue;
}
}
-
/* (non-Javadoc)
* @see org.sbml.simulator.math.QualityMeasure#setDefaultValue(double)
*/
@@ -115,18 +113,17 @@ public void setDefaultValue(double value) {
super.setDefaultValue(value);
if (Double.isNaN(defaultValue)) {
defaultNaN = true;
- }
- else {
+ } else {
defaultNaN = false;
}
}
/**
* Sets the root
+ *
* @param root
*/
public void setRoot(double root) {
metric.setRoot(root);
}
-
}
diff --git a/src/main/java/org/simulator/math/odes/AbstractDESSolver.java b/src/main/java/org/simulator/math/odes/AbstractDESSolver.java
index f3a5ebe8..34189879 100644
--- a/src/main/java/org/simulator/math/odes/AbstractDESSolver.java
+++ b/src/main/java/org/simulator/math/odes/AbstractDESSolver.java
@@ -38,10 +38,11 @@
import org.apache.commons.math.ode.events.EventHandler;
import org.simulator.math.Mathematics;
import org.simulator.math.odes.MultiTable.Block.Column;
+import org.simulator.sbml.SBMLinterpreter;
/**
* This Class represents an abstract solver for event-driven DES
- *
+ *
* @author Alexander Dörr
* @author Andreas Dräger
* @author Roland Keller
@@ -52,12 +53,14 @@
* @version $Rev$
* @since 0.9
*/
-public abstract class AbstractDESSolver implements DelayValueHolder, DESSolver, EventHandler {
+public abstract class AbstractDESSolver
+ implements DelayValueHolder, DESSolver, EventHandler {
/**
* A {@link Logger} for this class.
*/
private static final transient Logger logger = Logger.getLogger(AbstractDESSolver.class.getName());
+
/**
* Generated serial version identifier.
*/
@@ -107,7 +110,7 @@ public static long getSerialversionuid() {
private boolean unstableFlag;
/**
- *
+ *
*/
private MultiTable data;
@@ -121,6 +124,12 @@ public static long getSerialversionuid() {
*/
public static final String PROGRESS = "progress";
+ /**
+ * Key used when informing listeners about change in the result by this
+ * solver.
+ */
+ public static final String RESULT = "result";
+
/**
* Initialize with default integration step size and non-negative attribute
* {@code true}.
@@ -149,7 +158,7 @@ public void reset() {
/**
* Clone constructor.
- *
+ *
* @param solver
*/
public AbstractDESSolver(AbstractDESSolver solver) {
@@ -160,7 +169,7 @@ public AbstractDESSolver(AbstractDESSolver solver) {
/**
* Initialize with given integration step size.
- *
+ *
* @param stepSize
*/
public AbstractDESSolver(double stepSize) {
@@ -170,6 +179,7 @@ public AbstractDESSolver(double stepSize) {
/**
* Initialize with given step size and a flag whether or not negative values should be allowed.
+ *
* @param stepSize
* @param nonnegative
*/
@@ -180,22 +190,17 @@ public AbstractDESSolver(double stepSize, boolean nonnegative) {
/**
* Compute additional result values
- *
- * @param DES
- * the differential equation system
- * @param t
- * the current time
- * @param yTemp
- * the vector yTemp
- * @param data
- * the data as multi table
- * @param rowIndex
- * the index of the row
+ *
+ * @param DES the differential equation system
+ * @param t the current time
+ * @param yTemp the vector yTemp
+ * @param data the data as multi table
+ * @param rowIndex the index of the row
* @return an array of additional (intermediate) results.
* @throws DerivativeException
*/
- protected double[] additionalResults(DESystem DES, double t, double[] yTemp,
- MultiTable data, int rowIndex) throws DerivativeException {
+ protected double[] additionalResults(DESystem DES, double t, double[] yTemp, MultiTable data, int rowIndex)
+ throws DerivativeException {
if (includeIntermediates && (DES instanceof RichDESystem)) {
MultiTable.Block block = data.getBlock(1);
double v[] = ((RichDESystem) DES).getAdditionalValues(t, yTemp).clone();
@@ -218,7 +223,7 @@ public void addPropertyChangeListener(PropertyChangeListener listener) {
/**
* If option nonnegative is set all elements of the given vector smaller
* than zero are set to zero.
- *
+ *
* @param yTemp the vector yTemp
*/
private void checkNonNegativity(double[] yTemp) {
@@ -235,9 +240,8 @@ private void checkNonNegativity(double[] yTemp) {
* Checks whether or not the given current state contains {@link Double#NaN} values.
* In this case the solution of the current state is considered unstable and
* the corresponding flag of the solver will be set accordingly.
- *
- * @param currentState
- * The current state of the system during a simulation.
+ *
+ * @param currentState The current state of the system during a simulation.
* @return flag that is true if {@link Double#NaN} values are contained
*/
boolean checkSolution(double[] currentState) {
@@ -255,31 +259,28 @@ boolean checkSolution(double[] currentState) {
* values. In this case the solution of the current state is considered
* unstable and the corresponding flag of the solver will be set
* accordingly.
- *
- * @param currentChange
- * the current change of the system during a simulation.
- * @param yPrev
- * the previous state of the system
+ *
+ * @param currentChange the current change of the system during a simulation.
+ * @param yPrev the previous state of the system
* @return flag that is true if {@link Double#NaN} values are contained in
- * the change vector that have not been contained at the
- * corresponding position in the previous state
+ * the change vector that have not been contained at the
+ * corresponding position in the previous state
*/
boolean checkSolution(double[] currentChange, double[] yPrev) {
for (int k = 0; k < currentChange.length; k++) {
if (Double.isNaN(currentChange[k])) {
- if (!Double.isNaN(yPrev[k]) &&!Double.isInfinite(yPrev[k])) {
+ if (!Double.isNaN(yPrev[k]) && !Double.isInfinite(yPrev[k])) {
unstableFlag = true;
- }
- else if (Double.isInfinite(yPrev[k])) {
- currentChange[k]=0;
+ } else if (Double.isInfinite(yPrev[k])) {
+ currentChange[k] = 0;
}
}
}
return !unstableFlag;
}
- /* (non-Javadoc)
- * @see java.lang.Object#clone()
+ /**
+ * {@inheritDoc}
*/
@Override
public abstract AbstractDESSolver clone();
@@ -287,24 +288,18 @@ else if (Double.isInfinite(yPrev[k])) {
/**
* Computes the change for a given system at the current time with the
* current setting for the integration step size.
- *
- * @param DES
- * The system to be simulated.
- * @param y
- * The current state of the system.
- * @param t
- * The current simulation time.
- * @param stepSize
- * The current integration step size.
- * @param change
- * The vector for the resulting change of the system.
+ *
+ * @param DES The system to be simulated.
+ * @param y The current state of the system.
+ * @param t The current simulation time.
+ * @param stepSize The current integration step size.
+ * @param change The vector for the resulting change of the system.
* @param steadyState
- *
* @return The change.
* @throws DerivativeException
*/
- public abstract double[] computeChange(DESystem DES, double[] y, double t,
- double stepSize, double[] change, boolean steadyState) throws DerivativeException;
+ public abstract double[] computeChange(DESystem DES, double[] y, double t, double stepSize, double[] change, boolean steadyState)
+ throws DerivativeException;
/* (non-Javadoc)
* @see org.simulator.math.odes.DelayValueHolder#computeValue(double, java.lang.String)
@@ -320,11 +315,10 @@ public double computeDelayedValue(double time, String id, DESystem DES, double[]
int rightIndex = -1;
for (int i = 0; i != timepoints.length; i++) {
if (timepoints[i] >= time) {
- rightIndex=i;
+ rightIndex = i;
if ((i > 0) && (timepoints[i] > time)) {
- leftIndex=i-1;
- }
- else if ((timepoints[i] == time)) {
+ leftIndex = i - 1;
+ } else if ((timepoints[i] == time)) {
leftIndex = rightIndex;
}
break;
@@ -333,14 +327,12 @@ else if ((timepoints[i] == time)) {
if ((leftIndex == -1) && (rightIndex == -1)) {
leftIndex = timepoints.length - 1;
}
-
//get values and do an interpolation if necessary
double leftValue = Double.NaN;
double rightValue = Double.NaN;
-
- Column c=data.getColumn(id);
+ Column c = data.getColumn(id);
if (leftIndex != -1) {
- leftValue=c.getValue(leftIndex);
+ leftValue = c.getValue(leftIndex);
}
if (rightIndex != -1) {
rightValue = c.getValue(rightIndex);
@@ -348,7 +340,6 @@ else if ((timepoints[i] == time)) {
rightValue = leftValue;
}
}
-
if (Double.isNaN(rightValue)) {
boolean calculated = true;
double[] yCopy = new double[initialValues.length];
@@ -362,58 +353,41 @@ else if ((timepoints[i] == time)) {
}
clonedSolver.computeChange(DES, yCopy, 0, time, change, false);
} catch (DerivativeException e) {
- rightIndex=-1;
+ rightIndex = -1;
calculated = false;
}
DES.setDelaysIncluded(true);
if (calculated) {
return yCopy[yIndex] + change[yIndex];
-
}
-
}
-
if (leftIndex == -1) {
return rightValue;
- }
- else if (rightIndex == -1) {
+ } else if (rightIndex == -1) {
return leftValue;
- }
- else if (rightIndex == leftIndex) {
+ } else if (rightIndex == leftIndex) {
return leftValue;
- }
- else {
- return leftValue + (rightValue-leftValue)*((time-timepoints[leftIndex])/(timepoints[rightIndex]-timepoints[leftIndex]));
+ } else {
+ return leftValue + (rightValue - leftValue) * ((time - timepoints[leftIndex]) / (timepoints[rightIndex] - timepoints[leftIndex]));
}
}
/**
- *
- * @param DES
- * the differential equation system
- * @param t
- * the current time
- * @param stepSize
- * stepSize
- * @param yPrev
- * the previous y vector
- * @param change
- * the change vector
- * @param yTemp
- * the current y vector to be filled
- * @param increase
- * whether or not to increase the given time by the given step
- * size.
+ * @param DES the differential equation system
+ * @param t the current time
+ * @param stepSize stepSize
+ * @param yPrev the previous y vector
+ * @param change the change vector
+ * @param yTemp the current y vector to be filled
+ * @param increase whether or not to increase the given time by the given step
+ * size.
* @param steadyState
- *
- *
* @return the time increased by the step size
* @throws DerivativeException
*/
- double computeNextState(DESystem DES, double t, double stepSize,
- double[] yPrev, double[] change, double[] yTemp, boolean increase, boolean steadyState)
- throws DerivativeException {
- double previousTime=t;
+ double computeNextState(DESystem DES, double t, double stepSize, double[] yPrev, double[] change, double[] yTemp, boolean increase, boolean steadyState)
+ throws DerivativeException {
+ double previousTime = t;
computeChange(DES, yPrev, t, stepSize, change, steadyState);
checkSolution(change, yPrev);
Mathematics.vvAdd(yPrev, change, yTemp);
@@ -428,18 +402,14 @@ else if (rightIndex == leftIndex) {
}
/**
- *
- * @param DES
- * the differential equation system
- * @param result
- * the result vector
- * @param timeBegin
- * the current time
+ * @param DES the differential equation system
+ * @param result the result vector
+ * @param timeBegin the current time
* @return the computed steady state
* @throws DerivativeException
*/
- protected double[] computeSteadyState(FastProcessDESystem DES,
- double[] result, double timeBegin) throws DerivativeException {
+ protected double[] computeSteadyState(FastProcessDESystem DES, double[] result, double timeBegin)
+ throws DerivativeException {
double[] oldValues = new double[result.length];
double[] newValues = new double[result.length];
double[] change = new double[result.length];
@@ -449,16 +419,14 @@ protected double[] computeSteadyState(FastProcessDESystem DES,
// TODO what if there is oscillation, so no state with no change will be
// reached
- int step=0;
+ int step = 0;
while (!noChange(oldValues, newValues, step)) {
System.arraycopy(newValues, 0, oldValues, 0, newValues.length);
- ft = computeNextState(DES, ft, stepSize * 1000, oldValues, change,
- newValues, true, true);
+ ft = computeNextState(DES, ft, stepSize * 1000, oldValues, change, newValues, true, true);
step++;
}
DES.setFastProcessComputation(false);
return oldValues;
-
}
/* (non-Javadoc)
@@ -470,17 +438,18 @@ public int eventOccurred(double t, double[] y, boolean increasing)
return STOP;
}
- /* (non-Javadoc)
- * @see org.sbml.simulator.math.odes.DESSolver#firePropertyChanged(double, double)
+ /**
+ * {@inheritDoc}
*/
@Override
- public void firePropertyChange(double oldValue, double newValue /*, double[] currResult, double[] additionalResult*/) {
+ public void firePropertyChange(double currTime, double[] currResult) {
if (!listenerList.isEmpty()) {
- PropertyChangeEvent evt = new PropertyChangeEvent(this, PROGRESS ,
- oldValue, newValue);
+ PropertyChangeEvent evt1 = new PropertyChangeEvent(this, PROGRESS, currTime, currTime);
+ PropertyChangeEvent evt2 = new PropertyChangeEvent(this, RESULT, currResult, currResult);
// logger.info(String.format("Progress: %s %%", StringTools.toString(newValue)));
for (PropertyChangeListener listener : listenerList) {
- listener.propertyChange(evt);
+ listener.propertyChange(evt1);
+ listener.propertyChange(evt2);
}
}
}
@@ -500,7 +469,7 @@ public double g(double t, double[] y) throws EventException {
/**
* This gives a human-readable name of this solver that can be displayed in
* a graphical user interface.
- *
+ *
* @return A name that describes the underlying algorithm.
*/
public abstract String getName();
@@ -514,14 +483,13 @@ public double getStepSize() {
}
/**
- *
* @return Does the solver do the event processing itself?
*/
protected abstract boolean hasSolverEventProcessing();
/**
* Computes the number of necessary steps between two time steps.
- *
+ *
* @param lastTime
* @param nextTime
* @param stepSize
@@ -532,34 +500,28 @@ public int inBetweenSteps(double lastTime, double nextTime, double stepSize) {
}
/**
- *
* @param DES
* @param initialValues
* @param timeBegin
* @param timeEnd
* @return table the initialized {@link MultiTable}
*/
- protected MultiTable initResultMatrix(DESystem DES,
- double initialValues[], double timeBegin, double timeEnd) {
- return initResultMatrix(DES, initialValues, timeBegin, numSteps(
- timeBegin, timeEnd));
+ protected MultiTable initResultMatrix(DESystem DES, double initialValues[], double timeBegin, double timeEnd) {
+ return initResultMatrix(DES, initialValues, timeBegin, numSteps(timeBegin, timeEnd));
}
/**
- *
* @param DES
* @param initialValues
* @param timeBegin
* @param numSteps
* @return table the initialized {@link MultiTable}
*/
- protected MultiTable initResultMatrix(DESystem DES,
- double[] initialValues, double timeBegin, int numSteps) {
+ protected MultiTable initResultMatrix(DESystem DES, double[] initialValues, double timeBegin, int numSteps) {
int dim = DES.getDimension();
if (dim != initialValues.length) {
// TODO: Localize
- throw new IllegalArgumentException(
- "The number of initial values must equal the dimension of the DE system.");
+ throw new IllegalArgumentException("The number of initial values must equal the dimension of the DE system.");
}
double timePoints[] = new double[numSteps];
for (int i = 0; i < timePoints.length; i++) {
@@ -569,16 +531,14 @@ protected MultiTable initResultMatrix(DESystem DES,
}
/**
- *
* @param DES
* @param initialValues
* @param timePoints
* @return table the initialized {@link MultiTable}
*/
- protected MultiTable initResultMatrix(DESystem DES,
- double[] initialValues, double[] timePoints) {
+ protected MultiTable initResultMatrix(DESystem DES, double[] initialValues, double[] timePoints) {
double result[][] = new double[timePoints.length][initialValues.length];
- for (int i =0; i!= result.length; i++) {
+ for (int i = 0; i != result.length; i++) {
Arrays.fill(result[i], Double.NaN);
}
System.arraycopy(initialValues, 0, result[0], 0, initialValues.length);
@@ -624,29 +584,26 @@ public boolean isUnstable() {
* @return
*/
private boolean noChange(double newValues[], double oldValues[], int step) {
-
// FIXME: this must use the absolute and relative tolerance settings of the solver for checking
for (int i = 0; i < newValues.length; i++) {
-
// absolute distance
- double absDist = Math.abs(newValues[i]-oldValues[i]);
+ double absDist = Math.abs(newValues[i] - oldValues[i]);
// relative distance
double relDist = 0;
if ((Math.abs(newValues[i]) > 1E-10) || (Math.abs(oldValues[i]) > 1E-10)) {
- relDist = Math.abs((newValues[i]-oldValues[i])/Math.max(newValues[i],oldValues[i]));
+ relDist = Math.abs((newValues[i] - oldValues[i]) / Math.max(newValues[i], oldValues[i]));
}
if (((absDist > 1E-6) || (relDist > 1E-6)) && (step < 10000)) {
return false;
}
}
return true;
-
}
/**
* Calculates and returns the number of steps for given start and end time
* using the currently set interval size of integration steps.
- *
+ *
* @param timeBegin
* @param timeEnd
* @return
@@ -654,35 +611,28 @@ private boolean noChange(double newValues[], double oldValues[], int step) {
int numSteps(double timeBegin, double timeEnd) {
if (timeBegin > timeEnd) {
// TODO: Localize
- throw new IllegalArgumentException(
- "End time point must be greater than start time point.");
+ throw new IllegalArgumentException("End time point must be greater than start time point.");
}
return (int) Math.round(((timeEnd - timeBegin) / stepSize) + 1);
}
/**
* Processes sudden changes in the system due to events in the EDES
- *
- * @param EDES
- * the differential equation system with events
- * @param time
- * the current time
- * @param previousTime
- * the time this function has been called previously
- * @param yTemp
- * the vector Ytemp
+ *
+ * @param EDES the differential equation system with events
+ * @param time the current time
+ * @param previousTime the time this function has been called previously
+ * @param yTemp the vector Ytemp
* @return a flag that is true if an event has been fired
* @throws DerivativeException
*/
public boolean processEvents(EventDESystem EDES, double time, double previousTime, double[] yTemp)
throws DerivativeException {
- boolean hasNewEvents=false;
+ boolean hasNewEvents = false;
EventInProgress event;
- event = EDES.getNextEventAssignments(
- time, previousTime, yTemp);
-
+ event = EDES.getNextEventAssignments(time, previousTime, yTemp);
if (event != null) {
- hasNewEvents=true;
+ hasNewEvents = true;
}
while ((event != null) && ((event.getLastTimeExecuted() == time) || (event.getFireStatus(time)))) {
if ((EDES instanceof FastProcessDESystem)) {
@@ -693,51 +643,41 @@ public boolean processEvents(EventDESystem EDES, double time, double previousTim
if (clonedSolver == null) {
clonedSolver = clone();
}
- double[] result = clonedSolver.computeSteadyState(FDES,
- yTemp2, 0);
+ double[] result = clonedSolver.computeSteadyState(FDES, yTemp2, 0);
System.arraycopy(result, 0, yTemp, 0, yTemp.length);
}
}
-
- for (int index: event.getAssignments().keySet()) {
+ for (int index : event.getAssignments().keySet()) {
yTemp[index] = event.getAssignments().get(index);
}
-
- event = EDES.getNextEventAssignments(
- time, previousTime, yTemp);
+ event = EDES.getNextEventAssignments(time, previousTime, yTemp);
}
return hasNewEvents;
-
}
/**
* Function for processing the events and rules at a certain time step.
- *
- * @param forceProcessing
- * flag that is true if the events should be processed even if
- * the solver has its own event processing
- * @param DES
- * the differential equation system with events
- * @param t
- * the current time
- * @param previousTime
- * the time this function has been called previously
- * @param yTemp
- * the vector Ytemp
+ *
+ * @param forceProcessing flag that is true if the events should be processed even if
+ * the solver has its own event processing
+ * @param DES the differential equation system with events
+ * @param t the current time
+ * @param previousTime the time this function has been called previously
+ * @param yTemp the vector Ytemp
* @return a flag that is true if there has been a change caused by a rule
- * or an event has been fired
+ * or an event has been fired
* @throws DerivativeException
*/
public boolean processEventsAndRules(boolean forceProcessing, DESystem DES, double t, double previousTime, double yTemp[])
throws DerivativeException {
- boolean change=false;
+ boolean change = false;
if (DES instanceof EventDESystem) {
EventDESystem EDES = (EventDESystem) DES;
if (EDES.getRuleCount() > 0) {
processRules(EDES, t, yTemp);
}
if ((forceProcessing || (!hasSolverEventProcessing())) && (EDES.getEventCount() > 0)) {
- change=processEvents(EDES, t, previousTime, yTemp);
+ change = processEvents(EDES, t, previousTime, yTemp);
}
if (EDES.getRuleCount() > 0) {
processRules(EDES, t, yTemp);
@@ -748,13 +688,10 @@ public boolean processEventsAndRules(boolean forceProcessing, DESystem DES, doub
/**
* Function for processing the rules at a certain time step.
- *
- * @param EDES
- * the differential equation system with events
- * @param time
- * the current time
- * @param Ytemp
- * the vector Ytemp
+ *
+ * @param EDES the differential equation system with events
+ * @param time the current time
+ * @param Ytemp the vector Ytemp
* @return a flag that is true if there has been a change caused by a rule
* @throws DerivativeException
*/
@@ -789,8 +726,7 @@ public void setIncludeIntermediates(boolean includeIntermediates) {
}
/**
- * @param nonnegative
- * the nonnegative to set
+ * @param nonnegative the nonnegative to set
*/
public void setNonnegative(boolean nonnegative) {
this.nonnegative = nonnegative;
@@ -803,8 +739,7 @@ public void setNonnegative(boolean nonnegative) {
public void setStepSize(double stepSize) {
if (stepSize < Double.MIN_VALUE) {
// TODO: Localize
- throw new IllegalArgumentException(
- "The integration step size must be a positive, non-zero value.");
+ throw new IllegalArgumentException("The integration step size must be a positive, non-zero value.");
}
this.stepSize = stepSize;
}
@@ -817,21 +752,20 @@ public void setUnstableFlag(boolean unstableFlag) {
}
/**
- *
- * @param DES the differential equation system
+ * @param DES the differential equation system
* @param initialValues
* @param timeBegin
* @param timeEnd
* @return result as {@link MultiTable}
*/
@Override
- public MultiTable solve(DESystem DES, double[] initialValues, double timeBegin, double timeEnd) throws DerivativeException {
+ public MultiTable solve(DESystem DES, double[] initialValues, double timeBegin, double timeEnd)
+ throws DerivativeException {
if (DES instanceof DelayedDESystem) {
- ((DelayedDESystem)DES).registerDelayValueHolder(this);
+ ((DelayedDESystem) DES).registerDelayValueHolder(this);
}
intervalFactor = 100d / (timeEnd - timeBegin);
- MultiTable data = initResultMatrix(DES, initialValues, timeBegin,
- timeEnd);
+ MultiTable data = initResultMatrix(DES, initialValues, timeBegin, timeEnd);
double result[][] = data.getBlock(0).getData();
double change[] = new double[initialValues.length];
double yTemp[] = new double[initialValues.length];
@@ -839,42 +773,36 @@ public MultiTable solve(DESystem DES, double[] initialValues, double timeBegin,
double t = timeBegin;
double v[] = additionalResults(DES, t, result[0], data, 0);
boolean fastFlag = false;
-
if (DES instanceof FastProcessDESystem) {
fastFlag = ((FastProcessDESystem) DES).containsFastProcesses();
}
-
if (fastFlag) {
- result[0] = computeSteadyState(((FastProcessDESystem) DES),
- result[0], timeBegin);
+ result[0] = computeSteadyState(((FastProcessDESystem) DES), result[0], timeBegin);
}
+ addPropertyChangeListener((SBMLinterpreter) DES);
- // execute events that trigger at 0.0
- processEvents((EventDESystem) DES, 0d, 0d, result[0]);
+ // execute events that trigger at 0.0 and process rules on changes due to the events
+ processEventsAndRules(true, (EventDESystem) DES, 0d, 0d, result[0]);
System.arraycopy(result[0], 0, yTemp, 0, yTemp.length);
- for (int i = 1; (i < result.length)
- && (!Thread.currentThread().isInterrupted()); i++) {
+ firePropertyChange(0d, result[0]);
+ for (int i = 1; (i < result.length) && (!Thread.currentThread().isInterrupted()); i++) {
double oldT = t;
System.arraycopy(yTemp, 0, yPrev, 0, yTemp.length);
- t = computeNextState(DES, t, stepSize, yPrev, change,
- yTemp, true, false);
+ t = computeNextState(DES, t, stepSize, yPrev, change, yTemp, true, false);
System.arraycopy(yTemp, 0, result[i], 0, yTemp.length);
if (i == 1) {
System.arraycopy(yPrev, 0, result[0], 0, yPrev.length);
}
-
if (fastFlag) {
- yTemp = computeSteadyState(((FastProcessDESystem) DES),
- result[i], timeBegin);
+ yTemp = computeSteadyState(((FastProcessDESystem) DES), result[i], timeBegin);
System.arraycopy(yTemp, 0, result[i], 0, yTemp.length);
}
v = additionalResults(DES, t, result[i], data, i);
// if (logger.getLevel().intValue() < Level.INFO.intValue()) {
// logger.fine("additional results: " + Arrays.toString(v));
// }
- firePropertyChange(oldT * intervalFactor, t * intervalFactor);
+ firePropertyChange(t * intervalFactor, yTemp);
}
-
return data;
}
@@ -882,7 +810,8 @@ public MultiTable solve(DESystem DES, double[] initialValues, double timeBegin,
* @see org.simulator.math.odes.DESSolver#steadystate(org.simulator.math.odes.DESystem, double[], double, double, int)
*/
@Override
- public MultiTable solve(DESystem DES, double[] initialValues, double x, double h, int steps) throws DerivativeException {
+ public MultiTable solve(DESystem DES, double[] initialValues, double x, double h, int steps)
+ throws DerivativeException {
double[] timePoints = new double[steps];
for (int i = 0; i < steps; i++) {
timePoints[i] = x + i * h;
@@ -891,18 +820,16 @@ public MultiTable solve(DESystem DES, double[] initialValues, double x, double h
}
/**
- *
- * @param DES
- * differential equation system
+ * @param DES differential equation system
* @param initialValues
- * @param timePoints
- * the time points
+ * @param timePoints the time points
* @return result as a multi table
*/
@Override
- public MultiTable solve(DESystem DES, double[] initialValues, double[] timePoints) throws DerivativeException {
+ public MultiTable solve(DESystem DES, double[] initialValues, double[] timePoints)
+ throws DerivativeException {
if (DES instanceof DelayedDESystem) {
- ((DelayedDESystem)DES).registerDelayValueHolder(this);
+ ((DelayedDESystem) DES).registerDelayValueHolder(this);
}
MultiTable data = initResultMatrix(DES, initialValues, timePoints);
double result[][] = data.getBlock(0).getData();
@@ -912,33 +839,25 @@ public MultiTable solve(DESystem DES, double[] initialValues, double[] timePoint
double steady[] = new double[initialValues.length];
double t = timePoints[0];
double h = stepSize;
-
boolean fastFlag = false;
-
double v[] = additionalResults(DES, t, result[0], data, 0);
-
if (DES instanceof FastProcessDESystem) {
fastFlag = ((FastProcessDESystem) DES).containsFastProcesses();
}
-
if (fastFlag) {
- result[0] = computeSteadyState(((FastProcessDESystem) DES),
- result[0], timePoints[0]);
+ result[0] = computeSteadyState(((FastProcessDESystem) DES), result[0], timePoints[0]);
}
- // execute events that trigger at 0.0
- processEvents((EventDESystem) DES, 0d, 0d, result[0]);
+ addPropertyChangeListener((SBMLinterpreter) DES);
+ // execute events that trigger at 0.0 and process rules on changes due to the events
+ processEventsAndRules(true, (EventDESystem) DES, 0d, 0d, result[0]);
System.arraycopy(result[0], 0, yTemp, 0, result[0].length);
-
- for (int i = 1; (i < timePoints.length)
- && (!Thread.currentThread().isInterrupted()); i++) {
-
+ firePropertyChange(0d, result[0]);
+ for (int i = 1; (i < timePoints.length) && (!Thread.currentThread().isInterrupted()); i++) {
h = stepSize;
-
// h = h / 10;
- int steps=inBetweenSteps(timePoints[i - 1],
- timePoints[i], h);
- for (int j = 1;j<=steps;j++) {
+ int steps = inBetweenSteps(timePoints[i - 1], timePoints[i], h);
+ for (int j = 1; j <= steps; j++) {
System.arraycopy(yTemp, 0, yPrev, 0, yTemp.length);
t = computeNextState(DES, t, h, yPrev, change, yTemp, true, false);
if ((i == 1) && (j == 1)) {
@@ -946,24 +865,21 @@ public MultiTable solve(DESystem DES, double[] initialValues, double[] timePoint
}
}
h = BigDecimal.valueOf(timePoints[i]).subtract(BigDecimal.valueOf(t)).doubleValue();
- if (h>1E-14) {
+ if (h > 1E-14) {
System.arraycopy(yTemp, 0, yPrev, 0, yTemp.length);
t = computeNextState(DES, t, h, yTemp, change, yTemp, true, false);
}
System.arraycopy(yTemp, 0, result[i], 0, yTemp.length);
if (fastFlag) {
- steady = computeSteadyState(((FastProcessDESystem) DES),
- result[i], timePoints[0]);
+ steady = computeSteadyState(((FastProcessDESystem) DES), result[i], timePoints[0]);
System.arraycopy(steady, 0, result[i], 0, yTemp.length);
System.arraycopy(steady, 0, yTemp, 0, yTemp.length);
}
-
v = additionalResults(DES, t, yTemp, data, i);
// if (logger.getLevel().intValue() < Level.INFO.intValue()) {
// logger.fine("additional results: " + Arrays.toString(v));
// }
- firePropertyChange(timePoints[i-1] * intervalFactor, timePoints[i] * intervalFactor);
-
+ firePropertyChange(timePoints[i], yTemp);
t = timePoints[i];
}
return data;
@@ -973,15 +889,15 @@ public MultiTable solve(DESystem DES, double[] initialValues, double[] timePoint
* @see org.simulator.math.odes.DESSolver#steadystate(org.simulator.math.odes.DESystem, org.simulator.math.odes.MultiTable.Block, double[])
*/
@Override
- public MultiTable solve(DESystem DES,
- MultiTable.Block initConditions, double[] initialValues)
- throws DerivativeException {
+ public MultiTable solve(DESystem DES, MultiTable.Block initConditions, double[] initialValues)
+ throws DerivativeException {
if (DES instanceof DelayedDESystem) {
- ((DelayedDESystem)DES).registerDelayValueHolder(this);
+ ((DelayedDESystem) DES).registerDelayValueHolder(this);
}
+ addPropertyChangeListener((SBMLinterpreter) DES);
double[] timePoints = initConditions.getTimePoints();
- // of items to be simulated, this will cause a problem!
+ // of items to be simulated, this will cause a problem!
HashMap idIndex = new HashMap();
HashSet missingIds = new HashSet();
int i, j, k;
@@ -992,25 +908,22 @@ public MultiTable solve(DESystem DES,
}
idIndex.put(ids[i], Integer.valueOf(i));
}
-
for (int col = 0; col < initConditions.getColumnCount(); col++) {
- String columnName=initConditions.getColumnIdentifier(col);
- if (columnName!=null) {
- Integer index=idIndex.get(initConditions.getColumnIdentifier(col));
- if (index!=null) {
- initialValues[index.intValue()] = initConditions
- .getValueAt(0, col + 1);
+ String columnName = initConditions.getColumnIdentifier(col);
+ if (columnName != null) {
+ Integer index = idIndex.get(initConditions.getColumnIdentifier(col));
+ if (index != null) {
+ initialValues[index.intValue()] = initConditions.getValueAt(0, col + 1);
}
}
}
-
MultiTable data = initResultMatrix(DES, initialValues, timePoints);
-
double[][] result = data.getBlock(0).getData();
double[] yTemp = new double[DES.getDimension()];
double[] change = new double[DES.getDimension()];
double t = timePoints[0];
double v[] = additionalResults(DES, t, result[0], data, 0);
+ firePropertyChange(0d, result[0]);
for (i = 1; (i < timePoints.length) && (!Thread.currentThread().isInterrupted()); i++) {
double h = stepSize;
if (!missingIds.isEmpty()) {
@@ -1022,8 +935,7 @@ public MultiTable solve(DESystem DES,
yTemp[k] = result[i - 1][k];
}
} else {
- System.arraycopy(initConditions.getRow(i - 1), 0, yTemp, 0,
- yTemp.length);
+ System.arraycopy(initConditions.getRow(i - 1), 0, yTemp, 0, yTemp.length);
}
for (j = 0; j < inBetweenSteps(timePoints[i - 1], timePoints[i], h); j++) {
computeChange(DES, yTemp, t, h, change, false);
@@ -1039,16 +951,13 @@ public MultiTable solve(DESystem DES,
}
checkNonNegativity(yTemp);
System.arraycopy(yTemp, 0, result[i], 0, yTemp.length);
-
v = additionalResults(DES, t, yTemp, data, i);
// if ((logger != null) && (logger.getLevel().intValue() < Level.INFO.intValue())) {
// logger.fine("additional results: " + Arrays.toString(v));
// }
- firePropertyChange(timePoints[i-1] * intervalFactor, timePoints[i] * intervalFactor);
-
+ firePropertyChange(timePoints[i] * intervalFactor, yTemp);
t = timePoints[i];
}
-
return data;
}
@@ -1056,50 +965,49 @@ public MultiTable solve(DESystem DES,
* Method for running SteadyState simulations based on numerical integration.
* This method is not very efficient.
*/
- public MultiTable steadystate(DESystem DES, double[] initialValues, double maxSteps) throws DerivativeException{
- // TODO: use steady state solver like neq2 to calculate steady states.
-
- double[] curState = initialValues;
- double[] nextState = new double[initialValues.length];
- double stepSize = 1000.0; // By default at least run for a step of 1000
- double totalTime = 0.0;
- double curTime = 0.0;
- int step = 0;
-
- // Run oneStep simulation until steadyState is reached to find endTime
- while(true) {
- setStepSize(stepSize);
- MultiTable intmdOutput = solve(DES, curState, curTime, stepSize);
- totalTime += stepSize;
-
- // Extract the endPoint and compare it with initial point
- intmdOutput = intmdOutput.filter(new double[] {getStepSize()});
- double[][] temp = intmdOutput.getBlock(0).getData();
- // copy last row of results
- nextState = temp[0];
-
- // If states are too close steady state is reached
- if(!noChange(nextState, curState, 1)) {
- System.arraycopy(nextState, 0, curState, 0, initialValues.length);
- break;
- }
- // Stop if max number of steps is reached
- if (step == maxSteps){
- logger.warning("Steady state could not be reached!");
- System.arraycopy(nextState, 0, curState, 0, initialValues.length);
- break;
- }
- stepSize = stepSize * 10;
- step += 1;
- System.arraycopy(nextState, 0, curState, 0, initialValues.length);
- }
+ public MultiTable steadystate(DESystem DES, double[] initialValues, double maxSteps)
+ throws DerivativeException {
+ // TODO: use steady state solver like neq2 to calculate steady states.
+ double[] curState = initialValues;
+ double[] nextState = new double[initialValues.length];
+ double stepSize = 1000.0; // By default at least run for a step of 1000
+ double totalTime = 0.0;
+ double curTime = 0.0;
+ int step = 0;
+
+ // Run oneStep simulation until steadyState is reached to find endTime
+ while (true) {
+ setStepSize(stepSize);
+ MultiTable intmdOutput = solve(DES, curState, curTime, stepSize);
+ totalTime += stepSize;
+
+ // Extract the endPoint and compare it with initial point
+ intmdOutput = intmdOutput.filter(new double[] {getStepSize()});
+ double[][] temp = intmdOutput.getBlock(0).getData();
+
+ // copy last row of results
+ nextState = temp[0];
+ // If states are too close steady state is reached
+ if (!noChange(nextState, curState, 1)) {
+ System.arraycopy(nextState, 0, curState, 0, initialValues.length);
+ break;
+ }
- double[] timepoints = { totalTime };
- return initResultMatrix(DES, curState, timepoints);
+ // Stop if max number of steps is reached
+ if (step == maxSteps) {
+ logger.warning("Steady state could not be reached!");
+ System.arraycopy(nextState, 0, curState, 0, initialValues.length);
+ break;
+ }
+ stepSize = stepSize * 10;
+ step += 1;
+ System.arraycopy(nextState, 0, curState, 0, initialValues.length);
+ }
+ double[] timepoints = {totalTime};
+ return initResultMatrix(DES, curState, timepoints);
- // FIXME: this is incorrect, only single row should be returned.
- // setStepSize(totalTime/maxSteps);
- // return solve(DES, initialValues, 0.0, totalTime);
+ // FIXME: this is incorrect, only single row should be returned.
+ // setStepSize(totalTime/maxSteps);
+ // return solve(DES, initialValues, 0.0, totalTime);
}
-
}
diff --git a/src/main/java/org/simulator/math/odes/AdamsBashforthSolver.java b/src/main/java/org/simulator/math/odes/AdamsBashforthSolver.java
index 7c02ab4a..f0053c65 100644
--- a/src/main/java/org/simulator/math/odes/AdamsBashforthSolver.java
+++ b/src/main/java/org/simulator/math/odes/AdamsBashforthSolver.java
@@ -29,7 +29,7 @@
/**
* This class is a wrapper for the Adams-Bashforth solver in the
* Apache Math Library.
- *
+ *
* @author Roland Keller
* @version $Rev$
* @since 0.9
@@ -50,6 +50,7 @@ public AdamsBashforthSolver() {
/**
* Clone constructor
+ *
* @param adamsSolver
*/
public AdamsBashforthSolver(AdamsBashforthSolver adamsSolver) {
@@ -58,7 +59,6 @@ public AdamsBashforthSolver(AdamsBashforthSolver adamsSolver) {
}
/**
- *
* @param stepSize
*/
public AdamsBashforthSolver(double stepSize) {
@@ -66,7 +66,6 @@ public AdamsBashforthSolver(double stepSize) {
}
/**
- *
* @param stepSize
* @param nonnegative the nonnegative flag of the super class
* @see AbstractDESSolver
@@ -106,5 +105,4 @@ public String getName() {
public int getKiSAOterm() {
return 279;
}
-
}
diff --git a/src/main/java/org/simulator/math/odes/AdamsMoultonSolver.java b/src/main/java/org/simulator/math/odes/AdamsMoultonSolver.java
index 32a80021..58a61d3c 100644
--- a/src/main/java/org/simulator/math/odes/AdamsMoultonSolver.java
+++ b/src/main/java/org/simulator/math/odes/AdamsMoultonSolver.java
@@ -29,7 +29,7 @@
/**
* This class is a wrapper for the Adams-Moulton solver in the
* Apache Math Library.
- *
+ *
* @author Roland Keller
* @version $Rev$
* @since 0.9
@@ -42,7 +42,7 @@ public class AdamsMoultonSolver extends FirstOrderSolver {
private static final long serialVersionUID = -2601862472447650296L;
/**
- *
+ *
*/
public AdamsMoultonSolver() {
super();
@@ -50,15 +50,15 @@ public AdamsMoultonSolver() {
/**
* clone constructor
+ *
* @param adamsSolver
*/
public AdamsMoultonSolver(AdamsMoultonSolver adamsSolver) {
super(adamsSolver);
- integrator=adamsSolver.getIntegrator();
+ integrator = adamsSolver.getIntegrator();
}
/**
- *
* @param stepSize
*/
public AdamsMoultonSolver(double stepSize) {
@@ -66,10 +66,8 @@ public AdamsMoultonSolver(double stepSize) {
}
/**
- *
* @param stepSize
- * @param nonnegative
- * the nonnegative flag of the super class
+ * @param nonnegative the nonnegative flag of the super class
* @see AbstractDESSolver
*/
public AdamsMoultonSolver(double stepSize, boolean nonnegative) {
@@ -89,7 +87,7 @@ public AdamsMoultonSolver clone() {
*/
@Override
protected void createIntegrator() {
- integrator = new AdamsMoultonIntegrator(5, Math.min(1e-8,Math.min(1.0,getStepSize())), Math.min(1.0,getStepSize()), getAbsTol(), getRelTol());
+ integrator = new AdamsMoultonIntegrator(5, Math.min(1e-8, Math.min(1.0, getStepSize())), Math.min(1.0, getStepSize()), getAbsTol(), getRelTol());
}
/* (non-Javadoc)
@@ -107,5 +105,4 @@ public String getName() {
public int getKiSAOterm() {
return 280;
}
-
}
diff --git a/src/main/java/org/simulator/math/odes/AdaptiveStepsizeIntegrator.java b/src/main/java/org/simulator/math/odes/AdaptiveStepsizeIntegrator.java
index e61bcaed..a536ff81 100644
--- a/src/main/java/org/simulator/math/odes/AdaptiveStepsizeIntegrator.java
+++ b/src/main/java/org/simulator/math/odes/AdaptiveStepsizeIntegrator.java
@@ -27,7 +27,7 @@
/**
* This is an abstract class for solvers with adaptive stepsizes and given
* relative and absolute tolerances.
- *
+ *
* @author Andreas Dräger
* @version $Rev$
* @since 1.1
@@ -38,17 +38,19 @@ public abstract class AdaptiveStepsizeIntegrator extends AbstractDESSolver {
* Generated serial version identifier.
*/
private static final long serialVersionUID = -5411228466445964211L;
+
/**
* Default absolute allowable vectorial tolerance.
*/
protected double absTol = 1E-12d;
+
/**
* Default relative allowable vectorial tolerance.
*/
protected double relTol = 1E-6d;
/**
- *
+ *
*/
public AdaptiveStepsizeIntegrator() {
super();
@@ -56,6 +58,7 @@ public AdaptiveStepsizeIntegrator() {
/**
* clone constructor
+ *
* @param adaptiveStepSizeIntegrator
*/
public AdaptiveStepsizeIntegrator(AdaptiveStepsizeIntegrator adaptiveStepSizeIntegrator) {
@@ -65,7 +68,6 @@ public AdaptiveStepsizeIntegrator(AdaptiveStepsizeIntegrator adaptiveStepSizeInt
}
/**
- *
* @param stepSize
*/
public AdaptiveStepsizeIntegrator(double stepSize) {
@@ -73,7 +75,6 @@ public AdaptiveStepsizeIntegrator(double stepSize) {
}
/**
- *
* @param stepSize
* @param nonnegative the nonnegative flag of the super class
* @see AbstractDESSolver
@@ -109,5 +110,4 @@ public void setAbsTol(double absTol) {
public void setRelTol(double relTol) {
this.relTol = relTol;
}
-
}
diff --git a/src/main/java/org/simulator/math/odes/DESSolver.java b/src/main/java/org/simulator/math/odes/DESSolver.java
index 2982e884..1b9aa31c 100644
--- a/src/main/java/org/simulator/math/odes/DESSolver.java
+++ b/src/main/java/org/simulator/math/odes/DESSolver.java
@@ -33,7 +33,7 @@
/**
* A {@link DESSolver} provides algorithm for the numerical simulation of given
* {@link DESystem}s.
- *
+ *
* @author Andreas Dräger
* @version $Rev$
* @since 0.9
@@ -42,36 +42,37 @@ public interface DESSolver extends Cloneable, Serializable {
/**
* Add PropertyChangedListener to this Solver
+ *
* @param listener
*/
public void addPropertyChangeListener(PropertyChangeListener listener);
/**
- *
* @return the cloned solver
*/
public DESSolver clone();
/**
- * Tell each listener that property value changed. OldValue and newValue are
- * the old and current time point of simulation, respectively.
- *
- * @param oldValue
- * @param newValue
+ * Tell each listener that property value changed. CurrTime is the
+ * current time point of simulation, respectively. CurrResult
+ * is the row of the result at the current time point of simulation.
+ *
+ * @param currTime
+ * @param currResult
*/
- public void firePropertyChange(double oldValue, double newValue);
+ public void firePropertyChange(double currTime, double[] currResult);
/**
* For details about the Kinetic Simulation Algorithm Ontology (KiSAO) see
* http://biomodels.net/kisao/.
- *
+ *
* @return the KiSAO term of the algorithm
*/
public int getKiSAOterm();
/**
* Obtain the currently set integration step size.
- *
+ *
* @return the step size
*/
public double getStepSize();
@@ -80,7 +81,7 @@ public interface DESSolver extends Cloneable, Serializable {
* If this method returns {@code true}, intermediate results that may
* originate from a {@link RichDESystem} are included into the
* {@link MultiTable} that contains the result of a numerical integration.
- *
+ *
* @return the flag
*/
public boolean isIncludeIntermediates();
@@ -88,13 +89,14 @@ public interface DESSolver extends Cloneable, Serializable {
/**
* Method to check whether the solution of the numerical integration
* procedure contains {@link Double#NaN} values.
- *
+ *
* @return the unstable flag
*/
public boolean isUnstable();
/**
* remove PropertyChangedListener to this Solver
+ *
* @param listener
*/
public void removePropertyChangeListener(PropertyChangeListener listener);
@@ -102,77 +104,61 @@ public interface DESSolver extends Cloneable, Serializable {
/**
* Allows switching whether or not intermediate results should be included
* into the {@link MultiTable} of the result.
- *
- * @param includeIntermediates
- * if {@code true}, intermediate results are included into the
- * result.
+ *
+ * @param includeIntermediates if {@code true}, intermediate results are included into the
+ * result.
*/
public void setIncludeIntermediates(boolean includeIntermediates);
/**
* Set the integration step size.
- *
+ *
* @param stepSize
*/
public void setStepSize(double stepSize);
/**
* Solves the given differential equation system
- *
- * @param DES
- * The differential equation system to be solved.
- * @param initialValues
- * Return value at the start point.
+ *
+ * @param DES The differential equation system to be solved.
+ * @param initialValues Return value at the start point.
* @param timeBegin
- *
* @param timeEnd
- *
* @return A matrix containing the simulation results
- * @throws DerivativeException
- * if something's wrong...
+ * @throws DerivativeException if something's wrong...
*/
- public MultiTable solve(DESystem DES, double[] initialValues,
- double timeBegin, double timeEnd) throws DerivativeException;
+ public MultiTable solve(DESystem DES, double[] initialValues, double timeBegin, double timeEnd)
+ throws DerivativeException;
/**
* Solves the given differential equation system with the step size h and
* the number of steps as given starting at the value x.
- *
- * @param DES
- * The differential equation system to be solved.
- * @param initialValues
- * Return value at the start point.
- * @param x
- * Start argument.
- * @param h
- * Step size.
- * @param steps
- * Number of steps.
+ *
+ * @param DES The differential equation system to be solved.
+ * @param initialValues Return value at the start point.
+ * @param x Start argument.
+ * @param h Step size.
+ * @param steps Number of steps.
* @return A matrix containing the values of x, x + h, x + h + steps/h... in
- * the rows and the columns contain the return values for the
- * arguments.
- * @throws DerivativeException
- * if something's wrong...
+ * the rows and the columns contain the return values for the
+ * arguments.
+ * @throws DerivativeException if something's wrong...
*/
- public MultiTable solve(DESystem DES, double[] initialValues, double x,
- double h, int steps) throws DerivativeException;
+ public MultiTable solve(DESystem DES, double[] initialValues, double x, double h, int steps)
+ throws DerivativeException;
/**
* Solves the given differential equation system with the step size h and
* the number of steps as given starting at the value x.
- *
- * @param DES
- * The differential equation system to be solved.
- * @param initialValues
- * Return value at the start point.
- * @param timepoints
- * The timepoints for which the result should be returned
+ *
+ * @param DES The differential equation system to be solved.
+ * @param initialValues Return value at the start point.
+ * @param timepoints The timepoints for which the result should be returned
* @return A matrix containing the simulation results.
- * @throws DerivativeException
- * if something's wrong...
+ * @throws DerivativeException if something's wrong...
*/
- public MultiTable solve(DESystem DES, double[] initialValues,
- double[] timepoints) throws DerivativeException;
+ public MultiTable solve(DESystem DES, double[] initialValues, double[] timepoints)
+ throws DerivativeException;
/**
* Solves the given {@link DESystem} using new initial conditions in each
@@ -180,27 +166,22 @@ public MultiTable solve(DESystem DES, double[] initialValues,
* solution of the solver at certain time points. The solver has the task to
* re-initialize the integration procedure in each given time point using
* the initial values from this state.
- *
- * @param DES
- * The {@link DESystem} to be simulated.
- * @param timeSeriesInitConditions
- * A time series of initial conditions for each time point. In
- * some cases the dimension of the given {@link DESystem} may
- * exceed the number of columns in this given time-series. Thus,
- * for the initialization of the simulation a full vector of
- * initial values is required and must be passed to this method
- * as a separate double array.
- * @param initialValues
- * An array of all initial values. This array may exceed the
- * number of columns in the given {@link Block} but its length
- * must equal the dimension of the given {@link DESystem}.
+ *
+ * @param DES The {@link DESystem} to be simulated.
+ * @param timeSeriesInitConditions A time series of initial conditions for each time point. In
+ * some cases the dimension of the given {@link DESystem} may
+ * exceed the number of columns in this given time-series. Thus,
+ * for the initialization of the simulation a full vector of
+ * initial values is required and must be passed to this method
+ * as a separate double array.
+ * @param initialValues An array of all initial values. This array may exceed the
+ * number of columns in the given {@link Block} but its length
+ * must equal the dimension of the given {@link DESystem}.
* @return A new {@link MultiTable} containing a time series of the
- * same dimension as given by the {@link DESystem} and simulated
- * values at each time point.
+ * same dimension as given by the {@link DESystem} and simulated
+ * values at each time point.
* @throws DerivativeException
*/
- public MultiTable solve(DESystem DES,
- MultiTable.Block timeSeriesInitConditions,
- double[] initialValues) throws DerivativeException;
-
+ public MultiTable solve(DESystem DES, MultiTable.Block timeSeriesInitConditions, double[] initialValues)
+ throws DerivativeException;
}
diff --git a/src/main/java/org/simulator/math/odes/DESystem.java b/src/main/java/org/simulator/math/odes/DESystem.java
index c2f6d5cc..e4b0b296 100644
--- a/src/main/java/org/simulator/math/odes/DESystem.java
+++ b/src/main/java/org/simulator/math/odes/DESystem.java
@@ -31,21 +31,22 @@
/**
* A differential equation system describes how to compute the rate of change at
* a given state of the system.
- *
+ *
* @author Hannes Planatscher
* @author Andreas Dräger
* @version $Rev$
* @since 0.9
*/
-public interface DESystem extends Serializable, FirstOrderDifferentialEquations {
+public interface DESystem
+ extends Serializable, FirstOrderDifferentialEquations {
/**
* Delivers an array of {@link String}s that describe the content of each
* dimension of the resulting array of this {@link DESystem}.
- *
+ *
* @return An array of {@link String}s which has the same length than the
- * number given by {@link #getDimension()}. Each
- * {@link String} describes the content of the given dimension.
+ * number given by {@link #getDimension()}. Each
+ * {@link String} describes the content of the given dimension.
*/
public String[] getIdentifiers();
@@ -53,22 +54,19 @@ public interface DESystem extends Serializable, FirstOrderDifferentialEquations
* This method is used to check if this differential equation system contains
* any events or rules that would require a special treatment by the numerical
* solver.
- *
+ *
* @return flag that is {@code true} if any events or rules are contained
- * in the differential equation system.
+ * in the differential equation system.
*/
public boolean containsEventsOrRules();
/**
- *
* @return the number of values in Y that have to be positive.
*/
public int getPositiveValueCount();
/**
- * @param delaysIncluded
- * Determines whether delay expression should be included in the calculation.
+ * @param delaysIncluded Determines whether delay expression should be included in the calculation.
*/
public void setDelaysIncluded(boolean delaysIncluded);
-
}
diff --git a/src/main/java/org/simulator/math/odes/DelayValueHolder.java b/src/main/java/org/simulator/math/odes/DelayValueHolder.java
index 1cfb061b..a3974085 100644
--- a/src/main/java/org/simulator/math/odes/DelayValueHolder.java
+++ b/src/main/java/org/simulator/math/odes/DelayValueHolder.java
@@ -28,7 +28,7 @@
/**
* This interface describes a value holder that can compute values with delay.
- *
+ *
* @author Roland Keller
* @version $Rev$
*/
@@ -37,23 +37,15 @@ public interface DelayValueHolder extends Serializable {
/**
* Returns the value for the element with the given id at a time point in
* the past, where the time gives the amount of time in the past.
- *
- * @param time
- * the time point (in the past) at which the value is to be
- * computed for the element with the given id.
- * @param id
- * the id of the delayed value
- * @param DES
- * the DESystem
- * @param initialValues
- * the initialValues of the DES
- * @param yIndex
- * the index corresponding to the id in the vector of the DES
- *
- *
+ *
+ * @param time the time point (in the past) at which the value is to be
+ * computed for the element with the given id.
+ * @param id the id of the delayed value
+ * @param DES the DESystem
+ * @param initialValues the initialValues of the DES
+ * @param yIndex the index corresponding to the id in the vector of the DES
* @return the computed value for the element with the given identifier at
- * the time point in the past.
+ * the time point in the past.
*/
public double computeDelayedValue(double time, String id, DESystem DES, double[] initialValues, int yIndex);
-
}
diff --git a/src/main/java/org/simulator/math/odes/DelayedDESystem.java b/src/main/java/org/simulator/math/odes/DelayedDESystem.java
index 58f86168..a5fa8c7e 100644
--- a/src/main/java/org/simulator/math/odes/DelayedDESystem.java
+++ b/src/main/java/org/simulator/math/odes/DelayedDESystem.java
@@ -27,17 +27,14 @@
/**
* This interface describes a differential equation system containing values
* with a delay function.
- *
+ *
* @author Roland Keller
* @version $Rev$
*/
public interface DelayedDESystem extends DESystem {
/**
- *
- * @param dvh
- * the delay value holder to be registered
+ * @param dvh the delay value holder to be registered
*/
public void registerDelayValueHolder(DelayValueHolder dvh);
-
}
diff --git a/src/main/java/org/simulator/math/odes/DormandPrince54Solver.java b/src/main/java/org/simulator/math/odes/DormandPrince54Solver.java
index e829a90f..b811c60a 100644
--- a/src/main/java/org/simulator/math/odes/DormandPrince54Solver.java
+++ b/src/main/java/org/simulator/math/odes/DormandPrince54Solver.java
@@ -29,7 +29,7 @@
/**
* This class is a wrapper for the Dormand-Prince-54 solver in the
* Apache Math Library.
- *
+ *
* @author Roland Keller
* @version $Rev$
* @since 0.9
@@ -50,15 +50,15 @@ public DormandPrince54Solver() {
/**
* clone constructor
+ *
* @param solver
*/
public DormandPrince54Solver(DormandPrince54Solver solver) {
super(solver);
- integrator=solver.getIntegrator();
+ integrator = solver.getIntegrator();
}
/**
- *
* @param stepSize
*/
public DormandPrince54Solver(double stepSize) {
@@ -66,10 +66,8 @@ public DormandPrince54Solver(double stepSize) {
}
/**
- *
* @param stepSize
- * @param nonnegative
- * the nonnegative flag of the super class
+ * @param nonnegative the nonnegative flag of the super class
* @see AbstractDESSolver
*/
public DormandPrince54Solver(double stepSize, boolean nonnegative) {
@@ -89,7 +87,7 @@ public DormandPrince54Solver clone() {
*/
@Override
protected void createIntegrator() {
- integrator = new DormandPrince54Integrator(Math.min(1e-8,Math.min(1.0,getStepSize())), Math.min(1.0,getStepSize()), getAbsTol(), getRelTol());
+ integrator = new DormandPrince54Integrator(Math.min(1e-8, Math.min(1.0, getStepSize())), Math.min(1.0, getStepSize()), getAbsTol(), getRelTol());
}
/* (non-Javadoc)
@@ -107,5 +105,4 @@ public String getName() {
public int getKiSAOterm() {
return 87;
}
-
}
diff --git a/src/main/java/org/simulator/math/odes/DormandPrince853Solver.java b/src/main/java/org/simulator/math/odes/DormandPrince853Solver.java
index 020565df..c94494ea 100644
--- a/src/main/java/org/simulator/math/odes/DormandPrince853Solver.java
+++ b/src/main/java/org/simulator/math/odes/DormandPrince853Solver.java
@@ -29,7 +29,7 @@
/**
* This class is a wrapper for the Dormand-Prince-853 solver in the
* Apache Math Library.
- *
+ *
* @author Roland Keller
* @version $Rev$
* @since 0.9
@@ -50,15 +50,15 @@ public DormandPrince853Solver() {
/**
* clone constructor
+ *
* @param solver
*/
public DormandPrince853Solver(DormandPrince853Solver solver) {
super(solver);
- integrator=solver.getIntegrator();
+ integrator = solver.getIntegrator();
}
/**
- *
* @param stepSize
*/
public DormandPrince853Solver(double stepSize) {
@@ -66,10 +66,8 @@ public DormandPrince853Solver(double stepSize) {
}
/**
- *
* @param stepSize
- * @param nonnegative
- * the nonnegative flag of the super class
+ * @param nonnegative the nonnegative flag of the super class
* @see AbstractDESSolver
*/
public DormandPrince853Solver(double stepSize, boolean nonnegative) {
@@ -89,7 +87,7 @@ public DormandPrince853Solver clone() {
*/
@Override
protected void createIntegrator() {
- integrator=new DormandPrince853Integrator(Math.min(1e-8,Math.min(1.0,getStepSize())), Math.min(1.0,getStepSize()), getAbsTol(), getRelTol());
+ integrator = new DormandPrince853Integrator(Math.min(1e-8, Math.min(1.0, getStepSize())), Math.min(1.0, getStepSize()), getAbsTol(), getRelTol());
}
/* (non-Javadoc)
@@ -107,5 +105,4 @@ public String getName() {
public int getKiSAOterm() {
return 436;
}
-
}
diff --git a/src/main/java/org/simulator/math/odes/EulerMethod.java b/src/main/java/org/simulator/math/odes/EulerMethod.java
index 3c4c5086..305e46ef 100644
--- a/src/main/java/org/simulator/math/odes/EulerMethod.java
+++ b/src/main/java/org/simulator/math/odes/EulerMethod.java
@@ -30,7 +30,7 @@
/**
* In this class the Euler method for integration a differential equation system
* is implemented.
- *
+ *
* @author Andreas Dräger
* @version $Rev$
* @since 0.9
@@ -50,7 +50,6 @@ public EulerMethod() {
}
/**
- *
* @param stepSize
*/
public EulerMethod(double stepSize) {
@@ -58,10 +57,8 @@ public EulerMethod(double stepSize) {
}
/**
- *
* @param stepSize
- * @param nonnegative
- * the nonnegative flag of the super class
+ * @param nonnegative the nonnegative flag of the super class
* @see AbstractDESSolver
*/
public EulerMethod(double stepSize, boolean nonnegative) {
@@ -70,6 +67,7 @@ public EulerMethod(double stepSize, boolean nonnegative) {
/**
* clone constructor
+ *
* @param eulerMethod
*/
public EulerMethod(EulerMethod eulerMethod) {
@@ -88,8 +86,8 @@ public String getName() {
* @see org.simulator.math.odes.AbstractDESSolver#computeChange(org.simulator.math.odes.DESystem, double[], double, double, double[], boolean)
*/
@Override
- public double[] computeChange(DESystem DES, double[] yPrev, double t,
- double stepSize, double[] change, boolean steadyState) throws DerivativeException {
+ public double[] computeChange(DESystem DES, double[] yPrev, double t, double stepSize, double[] change, boolean steadyState)
+ throws DerivativeException {
DES.computeDerivatives(t, yPrev, change);
Mathematics.scale(stepSize, change);
return change;
@@ -118,5 +116,4 @@ protected boolean hasSolverEventProcessing() {
public int getKiSAOterm() {
return 261;
}
-
}
diff --git a/src/main/java/org/simulator/math/odes/EventDESystem.java b/src/main/java/org/simulator/math/odes/EventDESystem.java
index 6f9b2901..7363f73b 100644
--- a/src/main/java/org/simulator/math/odes/EventDESystem.java
+++ b/src/main/java/org/simulator/math/odes/EventDESystem.java
@@ -24,12 +24,11 @@
*/
package org.simulator.math.odes;
-
import org.apache.commons.math.ode.DerivativeException;
/**
* This class represents an event-driven differential equation system
- *
+ *
* @author Alexander Dörr
* @author Andreas Dräger
* @version $Rev$
@@ -39,15 +38,15 @@ public interface EventDESystem extends DESystem {
/**
* Counts the number of events in this system.
- *
+ *
* @return The number of events that are to be checked and potentially
- * evaluated in each time point.
+ * evaluated in each time point.
*/
public int getEventCount();
/**
* Counts the number of rules to be evaluated in each time point.
- *
+ *
* @return The number of rules in the system.
*/
public int getRuleCount();
@@ -55,13 +54,11 @@ public interface EventDESystem extends DESystem {
/**
* Calculates the changes or assignments that are defined by all rules in the system
* at the given simulation time point.
- *
- * @param t
- * The current simulation time.
- * @param Y
- * The current change of the system.
+ *
+ * @param t The current simulation time.
+ * @param Y The current change of the system.
* @return flag that is {@code true} if there has been a change in the Y vector
- * caused by the rules.
+ * caused by the rules.
* @throws DerivativeException
*/
public boolean processAssignmentRules(double t, double Y[])
@@ -70,12 +67,9 @@ public boolean processAssignmentRules(double t, double Y[])
/**
* Returns a list with event assignments for the events triggered either by
* the time t or by the concentrations of the species stored in Y.
- *
- * @param t
- * The current simulation time.
- * @param Y
- * The current change of the system.
- *
+ *
+ * @param t The current simulation time.
+ * @param Y The current change of the system.
* @return Returns a list with event assignments for the events triggered
* @throws DerivativeException
*/
@@ -84,8 +78,7 @@ public EventInProgress getNextEventAssignments(double t, double previousTime, do
/**
* @return flag that is {@code true}, if the change vector is always
- * zero in the system.
+ * zero in the system.
*/
public boolean getNoDerivatives();
-
}
diff --git a/src/main/java/org/simulator/math/odes/EventInProgress.java b/src/main/java/org/simulator/math/odes/EventInProgress.java
index 48111530..cea05397 100644
--- a/src/main/java/org/simulator/math/odes/EventInProgress.java
+++ b/src/main/java/org/simulator/math/odes/EventInProgress.java
@@ -43,26 +43,25 @@ public class EventInProgress {
protected double lastTimeExecuted;
protected LinkedList execTimes;
protected LinkedList values;
- protected Map assignments;
+ protected Map assignments;
/**
* Creates a new EventInProcess with the given boolean value indicating
* whether or not it can fire at the initial time point.
- *
+ *
* @param fired
*/
public EventInProgress(boolean fired) {
this.fired = fired;
execTimes = new LinkedList();
values = new LinkedList();
- lastTimeFired=-1;
+ lastTimeFired = -1;
lastTimeRecovered = -1;
lastTimeExecuted = -1;
- assignments = new HashMap();
+ assignments = new HashMap();
}
/**
- *
* @param fired
*/
public void refresh(boolean fired) {
@@ -72,7 +71,7 @@ public void refresh(boolean fired) {
lastTimeFired = -1;
lastTimeRecovered = -1;
lastTimeExecuted = -1;
- assignments = new HashMap();
+ assignments = new HashMap();
}
/**
@@ -88,14 +87,13 @@ public void aborted(double time) {
* the time of execution and the values used at this point in time. Please
* note that values can be null when the event does not use values from
* trigger time.
- *
+ *
* @param values
* @param time
*/
public void addValues(Double[] values, double time) {
execTimes.add(time);
this.values.add(values);
-
}
/**
@@ -108,7 +106,6 @@ public void executed(double time) {
lastTimeExecuted = time;
}
-
/**
* Associated event has triggered therefore current value of fired to true
*/
@@ -120,24 +117,21 @@ public void fired(double time) {
/**
* Returns a boolean value indication if the associated event has recently
* been triggered / fired
- *
+ *
* @return fireStatus
*/
public boolean getFireStatus(double time) {
if ((lastTimeFired <= time) && (lastTimeRecovered <= time)) {
return fired;
- }
- else if ((lastTimeFired <= time) && (lastTimeRecovered > time)) {
+ } else if ((lastTimeFired <= time) && (lastTimeRecovered > time)) {
lastTimeRecovered = -1;
fired = true;
return true;
- }
- else if ((lastTimeFired>time) && (lastTimeRecovered <= time)) {
+ } else if ((lastTimeFired > time) && (lastTimeRecovered <= time)) {
lastTimeFired = -1;
fired = false;
return false;
- }
- else {
+ } else {
lastTimeRecovered = -1;
lastTimeFired = -1;
return fired;
@@ -146,7 +140,7 @@ else if ((lastTimeFired>time) && (lastTimeRecovered <= time)) {
/**
* Return the next time of execution of the associated event.
- *
+ *
* @return time
*/
public double getTime() {
@@ -155,6 +149,7 @@ public double getTime() {
/**
* Returns true if the event is supposed to be executed at some time.
+ *
* @return executionTime?
*/
public boolean hasExecutionTime() {
@@ -163,7 +158,7 @@ public boolean hasExecutionTime() {
/**
* Return the values used in the next execution of the associated event.
- *
+ *
* @return values
*/
public Double[] getValues() {
@@ -182,22 +177,20 @@ public void recovered(double time) {
/**
* Checks if this event has still assignments to perform for the given point
* in time
- *
+ *
* @param time
* @return moreArguments?
*/
public boolean hasMoreAssignments(double time) {
-
if (execTimes.isEmpty()) {
-
return false;
}
-
return execTimes.peek() <= time;
}
/**
* Returns the last time the event has been fired.
+ *
* @return time
*/
public double getLastTimeFired() {
@@ -206,6 +199,7 @@ public double getLastTimeFired() {
/**
* Returns the last time the event has been executed.
+ *
* @return time
*/
public double getLastTimeExecuted() {
@@ -214,6 +208,7 @@ public double getLastTimeExecuted() {
/**
* Refreshes the status of the event regarding the current time.
+ *
* @param currentTime
*/
public void refresh(double currentTime) {
@@ -228,6 +223,7 @@ public void clearAssignments() {
/**
* Adds an event assignment.
+ *
* @param index
* @param value
*/
@@ -237,10 +233,10 @@ public void addAssignment(int index, double value) {
/**
* Returns all event assignments as a map.
+ *
* @return assignments
*/
- public Map getAssignments() {
+ public Map getAssignments() {
return assignments;
}
-
}
diff --git a/src/main/java/org/simulator/math/odes/FastProcessDESystem.java b/src/main/java/org/simulator/math/odes/FastProcessDESystem.java
index 454de8b5..3e771237 100644
--- a/src/main/java/org/simulator/math/odes/FastProcessDESystem.java
+++ b/src/main/java/org/simulator/math/odes/FastProcessDESystem.java
@@ -26,7 +26,7 @@
/**
* This interface describes differential equation systems with fast processes.
- *
+ *
* @author Andreas Dräger
* @author Alexander Dörr
* @version $Rev$
@@ -35,16 +35,12 @@
public interface FastProcessDESystem extends DESystem {
/**
- *
* @return flag that is true if fast processes are contained.
*/
public boolean containsFastProcesses();
/**
- *
- * @param isProcessing
- * Should there be a splitting of fast and slow reactions in the simulation?
+ * @param isProcessing Should there be a splitting of fast and slow reactions in the simulation?
*/
public void setFastProcessComputation(boolean isProcessing);
-
}
diff --git a/src/main/java/org/simulator/math/odes/FirstOrderSolver.java b/src/main/java/org/simulator/math/odes/FirstOrderSolver.java
index 91543afc..9ab80109 100644
--- a/src/main/java/org/simulator/math/odes/FirstOrderSolver.java
+++ b/src/main/java/org/simulator/math/odes/FirstOrderSolver.java
@@ -34,7 +34,7 @@
/**
* This class is the superclass of the wrapper classes for the solvers of the
* Apache Math Library.
- *
+ *
* @author Roland Keller
* @version $Rev$
* @since 0.9
@@ -49,8 +49,7 @@ public abstract class FirstOrderSolver extends AdaptiveStepsizeIntegrator {
/**
* A logger.
*/
- private static final Logger logger = Logger.getLogger(FirstOrderSolver.class
- .getName());
+ private static final Logger logger = Logger.getLogger(FirstOrderSolver.class.getName());
/**
* The result of the integration.
@@ -91,8 +90,7 @@ public FirstOrderSolver(double stepSize) {
/**
* @param stepSize
- * @param nonnegative
- * the nonnegative flag of the super class
+ * @param nonnegative the nonnegative flag of the super class
* @see AbstractDESSolver
*/
public FirstOrderSolver(double stepSize, boolean nonnegative) {
@@ -103,6 +101,7 @@ public FirstOrderSolver(double stepSize, boolean nonnegative) {
/**
* clone constructor
+ *
* @param firstOrderSolver
*/
public FirstOrderSolver(FirstOrderSolver firstOrderSolver) {
@@ -112,7 +111,7 @@ public FirstOrderSolver(FirstOrderSolver firstOrderSolver) {
}
/**
- *
+ *
*/
private void addHandler() {
integrator.addEventHandler(this, 1, 1, 1);
@@ -128,16 +127,14 @@ private void addHandler() {
* @see org.sbml.simulator.math.odes.AbstractDESSolver#computeChange(org.sbml.simulator.math.odes.DESystem, double[], double, double, double[])
*/
@Override
- public double[] computeChange(DESystem DES, double[] y, double t,
- double stepSize, double[] change, boolean steadyState) throws DerivativeException {
- if ((integrationResult==null)||(integrationResult.length!=y.length)) {
+ public double[] computeChange(DESystem DES, double[] y, double t, double stepSize, double[] change, boolean steadyState)
+ throws DerivativeException {
+ if ((integrationResult == null) || (integrationResult.length != y.length)) {
integrationResult = new double[y.length];
}
-
double tstart = t;
double tend = t + stepSize;
- if (FastMath.abs(tstart - tend) <= (1.0e-12 * FastMath.max(
- FastMath.abs(tstart), FastMath.abs(tend)))) {
+ if (FastMath.abs(tstart - tend) <= (1.0e-12 * FastMath.max(FastMath.abs(tstart), FastMath.abs(tend)))) {
for (int i = 0; i != change.length; i++) {
change[i] = 0;
}
@@ -172,5 +169,4 @@ public AbstractIntegrator getIntegrator() {
protected boolean hasSolverEventProcessing() {
return false;
}
-
}
diff --git a/src/main/java/org/simulator/math/odes/GraggBulirschStoerSolver.java b/src/main/java/org/simulator/math/odes/GraggBulirschStoerSolver.java
index 5ca40ce8..aacc1096 100644
--- a/src/main/java/org/simulator/math/odes/GraggBulirschStoerSolver.java
+++ b/src/main/java/org/simulator/math/odes/GraggBulirschStoerSolver.java
@@ -29,7 +29,7 @@
/**
* This class is a wrapper for the Gragg-Bulirsch-Stoer solver in the
* Apache Math Library.
- *
+ *
* @author Roland Keller
* @version $Rev$
* @since 0.9
@@ -49,7 +49,6 @@ public GraggBulirschStoerSolver() {
}
/**
- *
* @param stepSize
*/
public GraggBulirschStoerSolver(double stepSize) {
@@ -57,19 +56,17 @@ public GraggBulirschStoerSolver(double stepSize) {
}
/**
- *
- * @param stepSize
- * the nonnegative flag of the super class
+ * @param stepSize the nonnegative flag of the super class
* @param nonnegative
* @see AbstractDESSolver
*/
public GraggBulirschStoerSolver(double stepSize, boolean nonnegative) {
super(stepSize, nonnegative);
-
}
/**
* clone constructor
+ *
* @param solver
*/
public GraggBulirschStoerSolver(GraggBulirschStoerSolver solver) {
@@ -90,7 +87,7 @@ public GraggBulirschStoerSolver clone() {
*/
@Override
protected void createIntegrator() {
- integrator = new GraggBulirschStoerIntegrator(Math.min(1e-8, Math.min(1.0,getStepSize())), Math.min(1.0,getStepSize()), getAbsTol(), getRelTol());
+ integrator = new GraggBulirschStoerIntegrator(Math.min(1e-8, Math.min(1.0, getStepSize())), Math.min(1.0, getStepSize()), getAbsTol(), getRelTol());
}
/* (non-Javadoc)
@@ -108,5 +105,4 @@ public String getName() {
public int getKiSAOterm() {
return 379;
}
-
}
diff --git a/src/main/java/org/simulator/math/odes/HighamHall54Solver.java b/src/main/java/org/simulator/math/odes/HighamHall54Solver.java
index 582b4528..63107b25 100644
--- a/src/main/java/org/simulator/math/odes/HighamHall54Solver.java
+++ b/src/main/java/org/simulator/math/odes/HighamHall54Solver.java
@@ -29,7 +29,7 @@
/**
* This class is a wrapper for the Higham-Hall-54 solver in the
* Apache Math Library.
- *
+ *
* @author Roland Keller
* @version $Rev$
* @since 0.9
@@ -51,7 +51,6 @@ public HighamHall54Solver() {
}
/**
- *
* @param stepSize
*/
public HighamHall54Solver(double stepSize) {
@@ -61,9 +60,7 @@ public HighamHall54Solver(double stepSize) {
}
/**
- *
- * @param stepSize
- * the nonnegative flag of the super class
+ * @param stepSize the nonnegative flag of the super class
* @param nonnegative
* @see AbstractDESSolver
*/
@@ -75,11 +72,12 @@ public HighamHall54Solver(double stepSize, boolean nonnegative) {
/**
* clone constructor
+ *
* @param solver
*/
public HighamHall54Solver(HighamHall54Solver solver) {
super(solver);
- integrator=solver.getIntegrator();
+ integrator = solver.getIntegrator();
}
/* (non-Javadoc)
@@ -95,7 +93,7 @@ public HighamHall54Solver clone() {
*/
@Override
protected void createIntegrator() {
- integrator=new HighamHall54Integrator(Math.min(1e-8,Math.min(1.0,getStepSize())), Math.min(1.0,getStepSize()), getAbsTol(), getRelTol());
+ integrator = new HighamHall54Integrator(Math.min(1e-8, Math.min(1.0, getStepSize())), Math.min(1.0, getStepSize()), getAbsTol(), getRelTol());
}
/* (non-Javadoc)
diff --git a/src/main/java/org/simulator/math/odes/MultiTable.java b/src/main/java/org/simulator/math/odes/MultiTable.java
index 34c318f6..5480629c 100644
--- a/src/main/java/org/simulator/math/odes/MultiTable.java
+++ b/src/main/java/org/simulator/math/odes/MultiTable.java
@@ -30,7 +30,6 @@
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
-
import javax.swing.table.AbstractTableModel;
import org.simulator.math.odes.MultiTable.Block.Column;
@@ -47,24 +46,25 @@
* {@link AbstractTableModel}. Note that the access to the elements in this
* object therefore puts both elements together, i.e., the time column is
* considered to be the first column in the table.
- *
+ *
* @author draeger
* @version $Rev$
* @since 0.9
*/
-public class MultiTable extends AbstractTableModel implements Iterable> {
+public class MultiTable extends AbstractTableModel
+ implements Iterable> {
/**
* A {@link Block} is a data structure with a two-dimensional double array
* of actual data together with identifiers for each column.
- *
+ *
* @author Andreas Dräger
*/
public class Block extends AbstractTableModel {
/**
* A column of the {@link MultiTable.Block} matrix.
- *
+ *
* @author Andreas Dräg;ger
*/
public class Column implements Iterable {
@@ -77,13 +77,12 @@ public class Column implements Iterable {
/**
* Creates a new {@link Column} object for the column with the given
* index.
- *
+ *
* @param columnIndex
*/
private Column(int columnIndex) {
if ((columnIndex < 0) || (getColumnCount() <= columnIndex)) {
- throw new IndexOutOfBoundsException(Integer
- .toString(columnIndex));
+ throw new IndexOutOfBoundsException(Integer.toString(columnIndex));
}
this.columnIndex = columnIndex;
}
@@ -91,17 +90,17 @@ private Column(int columnIndex) {
/**
* Returns the human-readable name for this column if there is any, otherwise
* this will return the same value as {@link #getId()}.
- *
+ *
* @return columnName
*/
public String getColumnName() {
- return ((columnNames != null) && (columnNames[columnIndex] != null)) ? columnNames[columnIndex]
- : getId();
+ return ((columnNames != null) && (columnNames[columnIndex] != null)) ?
+ columnNames[columnIndex] : getId();
}
/**
* Delivers the {@link Column} identifier of this particular column.
- *
+ *
* @return The {@link String} that identifies this {@link Column}.
*/
public String getId() {
@@ -109,7 +108,6 @@ public String getId() {
}
/**
- *
* @return name the name of the column
*/
public String getName() {
@@ -118,7 +116,7 @@ public String getName() {
/**
* Gives the number of rows in this {@link Column}.
- *
+ *
* @return rowCount the number of rows
*/
public int getRowCount() {
@@ -127,7 +125,7 @@ public int getRowCount() {
/**
* Access to the given row in this column.
- *
+ *
* @param rowIndex
* @return value the value at the given row
*/
@@ -169,24 +167,19 @@ public Double next() {
@Override
public void remove() {
// don't remove anything here!
- throw new UnsupportedOperationException(
- "cannot remove anything from the underlying object");
+ throw new UnsupportedOperationException("cannot remove anything from the underlying object");
}
};
}
/**
* Change the entry at the given row in this {@link Column}.
- *
- * @param rowIndex
- * The row where to change
- * @param doubleValue
- * The new value.
- *
+ *
+ * @param rowIndex The row where to change
+ * @param doubleValue The new value.
*/
public void setValue(double doubleValue, int rowIndex) {
- data[rowIndex][columnIndex] = ((Double) doubleValue)
- .doubleValue();
+ data[rowIndex][columnIndex] = ((Double) doubleValue).doubleValue();
}
/* (non-Javadoc)
@@ -205,9 +198,9 @@ public String toString() {
sb.append(']');
return sb.toString();
}
-
}
+
/**
* Generated serial version identifier.
*/
@@ -247,18 +240,15 @@ public String toString() {
private MultiTable parent;
/**
- *
* @param data
* @param identifiers
* @param parent
*/
- private Block(double[][] data, String[] identifiers,
- MultiTable parent) {
+ private Block(double[][] data, String[] identifiers, MultiTable parent) {
this(data, identifiers, null, parent);
}
- private Block(double[][] data, String[] identifiers, String[] names,
- MultiTable parent) {
+ private Block(double[][] data, String[] identifiers, String[] names, MultiTable parent) {
this(parent);
setData(data);
setIdentifiers(identifiers);
@@ -266,7 +256,7 @@ private Block(double[][] data, String[] identifiers, String[] names,
}
/**
- *
+ *
*/
private Block(MultiTable parent) {
this.parent = parent;
@@ -276,7 +266,7 @@ private Block(MultiTable parent) {
/**
* Checks whether or not this {@link Block} contains a {@link Column}
* with the given identifier.
- *
+ *
* @param id
* @return containsColumn?
*/
@@ -286,11 +276,10 @@ public boolean containsColumn(String id) {
/**
* Grants access to the specified column.
- *
- * @param columnIndex
- * The index of the column (excluding the time column)
+ *
+ * @param columnIndex The index of the column (excluding the time column)
* @return Returns the {@link Column} with the given index in the data
- * matrix, i.e., the time column is excluded.
+ * matrix, i.e., the time column is excluded.
*/
public Column getColumn(int columnIndex) {
return new Column(columnIndex);
@@ -299,11 +288,10 @@ public Column getColumn(int columnIndex) {
/**
* Provides access to the {@link Column} corresponding to the given
* identifier.
- *
- * @param identfier
- * The identifier of the {@link Column} to be queried.
+ *
+ * @param identfier The identifier of the {@link Column} to be queried.
* @return A {@link Column} object for convenient access to the data in
- * the desired table column.
+ * the desired table column.
*/
public Column getColumn(String identfier) {
return new Column(idHash.get(identfier).intValue());
@@ -318,7 +306,6 @@ public int getColumnCount() {
}
/**
- *
* @param column
* @return identifier
*/
@@ -331,8 +318,8 @@ public String getColumnIdentifier(int column) {
*/
@Override
public String getColumnName(int column) {
- return (columnNames == null) || (columnNames[column] == null) ? getColumnIdentifier(column)
- : columnNames[column];
+ return (columnNames == null) || (columnNames[column] == null) ?
+ getColumnIdentifier(column) : columnNames[column];
}
/**
@@ -357,7 +344,6 @@ public String[] getIdentifiers() {
}
/**
- *
* @return blockName
*/
public String getName() {
@@ -367,9 +353,8 @@ public String getName() {
/**
* Delivers the given row of the data matrix as an array of doubles
* only, i.e., no time points.
- *
- * @param rowIndex
- * The index of the row to be delivered.
+ *
+ * @param rowIndex The index of the row to be delivered.
* @return An array of double values from the encapsulated data matrix.
*/
public double[] getRow(int rowIndex) {
@@ -386,7 +371,7 @@ public int getRowCount() {
/**
* Access to the time points of the overall table.
- *
+ *
* @return A pointer to the time points in the containing table.
*/
public double[] getTimePoints() {
@@ -406,7 +391,7 @@ public Double getValueAt(int rowIndex, int columnIndex) {
/**
* Checks whether or not a data matrix has been defined in this object
- *
+ *
* @return dataSet?
*/
public boolean isSetData() {
@@ -421,27 +406,21 @@ public void setColumnNames(String[] columnNames) {
}
/**
- * @param data
- * the data to set
+ * @param data the data to set
*/
public void setData(double[][] data) {
if (isSetTimePoints() && (data.length != getRowCount())) {
- throw new IllegalArgumentException(String.format(
- UNEQUAL_DATA_AND_TIME_POINTS, data.length,
- timePoints.length));
+ throw new IllegalArgumentException(String.format(UNEQUAL_DATA_AND_TIME_POINTS, data.length, timePoints.length));
}
this.data = data;
}
/**
- * @param identifiers
- * the identifiers to set
+ * @param identifiers the identifiers to set
*/
public void setIdentifiers(String[] identifiers) {
if (isSetData() && (identifiers.length != data[0].length)) {
- throw new IllegalArgumentException(String.format(
- UNEQUAL_COLUMNS_AND_IDENTIFIERS, data[0].length,
- identifiers.length));
+ throw new IllegalArgumentException(String.format(UNEQUAL_COLUMNS_AND_IDENTIFIERS, data[0].length, identifiers.length));
}
this.identifiers = identifiers;
idHash.clear();
@@ -451,7 +430,6 @@ public void setIdentifiers(String[] identifiers) {
}
/**
- *
* @param name
*/
public void setName(String name) {
@@ -462,17 +440,13 @@ public void setName(String name) {
* Sets the given array as the new row in the given position of the data
* matrix, but requires that the number of values in the array equal the
* number of columns in the matrix.
- *
- * @param rowIndex
- * The index of the row to be replaced by the new array.
- * @param array
- * An array of length {@link #getColumnCount()} - 1.
+ *
+ * @param rowIndex The index of the row to be replaced by the new array.
+ * @param array An array of length {@link #getColumnCount()} - 1.
*/
public void setRowData(int rowIndex, double[] array) {
if (array.length != getColumnCount()) {
- throw new IllegalArgumentException(String.format(
- UNEQUAL_COLUMNS_AND_IDENTIFIERS, array.length,
- identifiers.length));
+ throw new IllegalArgumentException(String.format(UNEQUAL_COLUMNS_AND_IDENTIFIERS, array.length, identifiers.length));
}
data[rowIndex] = array;
}
@@ -488,8 +462,7 @@ public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
if (columnIndex == 0) {
timePoints[rowIndex] = ((Double) aValue).doubleValue();
} else {
- data[rowIndex][columnIndex - 1] = ((Double) aValue)
- .doubleValue();
+ data[rowIndex][columnIndex - 1] = ((Double) aValue).doubleValue();
}
}
@@ -516,6 +489,7 @@ public String toString() {
}
}
+
/**
* Error message
*/
@@ -549,14 +523,14 @@ public static long getSerialversionuid() {
private List listOfBlocks;
/**
- *
+ *
*/
private String name;
/**
* The name of the time column. Default is the English word "Time".
*/
- private String timeName = "Time";
+ private String timeName = "time";
/**
* The array to gather the time points in this data structure. This array
@@ -573,27 +547,23 @@ public MultiTable() {
/**
* Constructs a data object for the given values.
- *
+ *
* @param timePoints
* @param data
- * @param identifiers
- * The first column in identifiers may be the name for the time
- * column.
+ * @param identifiers The first column in identifiers may be the name for the time
+ * column.
*/
- public MultiTable(double timePoints[], double data[][],
- String identifiers[]) {
+ public MultiTable(double timePoints[], double data[][], String identifiers[]) {
this(timePoints, data, identifiers, null);
}
/**
- *
* @param timePoints
* @param data
* @param columnIdentifiers
* @param columnNames
*/
- public MultiTable(double[] timePoints, double[][] data,
- String[] columnIdentifiers, String[] columnNames) {
+ public MultiTable(double[] timePoints, double[][] data, String[] columnIdentifiers, String[] columnNames) {
this();
setTimePoints(timePoints);
String ids[];
@@ -617,9 +587,8 @@ public MultiTable(double[] timePoints, double[][] data,
* Creates a new {@link MultiTable.Block} and adds it to this object.
* The number of rows will be equal to the number of time points of the
* overall data structure.
- *
- * @param identifiers
- * The column identifiers of the new block.
+ *
+ * @param identifiers The column identifiers of the new block.
*/
public void addBlock(String[] identifiers) {
Block block = new Block(this);
@@ -632,45 +601,42 @@ public void addBlock(String[] identifiers) {
/**
* Creates a multi block table only containing the values for the given timepoints (if available)
+ *
* @param timepoints
* @return table the filtered table
*/
public MultiTable filter(double[] timepoints) {
ArrayList rowIndices = new ArrayList();
int i = 0;
- for (double time: timepoints) {
- while((i next() {
*/
@Override
public void remove() {
- throw new UnsupportedOperationException(
- "this iterator does not remove anything.");
+ throw new UnsupportedOperationException("this iterator does not remove anything.");
}
};
}
/**
* Removes the {@link Block} with the given index from this data structure.
- *
- * @param index
- * The index of the block. Do not confuse with the index of the
- * column.
+ *
+ * @param index The index of the block. Do not confuse with the index of the
+ * column.
*/
public void removeBlock(int index) {
listOfBlocks.remove(index);
@@ -919,7 +876,7 @@ public void removeBlock(int index) {
/**
* Sets the name of this {@link MultiTable}.
- *
+ *
* @param name
*/
public void setName(String name) {
@@ -928,24 +885,19 @@ public void setName(String name) {
/**
* Set the name of the time column
- *
- * @param timeName
- * the timeName to set
+ *
+ * @param timeName the timeName to set
*/
public void setTimeName(String timeName) {
this.timeName = timeName;
}
/**
- * @param timePoints
- * the timePoints to set
+ * @param timePoints the timePoints to set
*/
public void setTimePoints(double[] timePoints) {
- if ((listOfBlocks.size() > 0)
- && (listOfBlocks.get(0).getRowCount() != timePoints.length)) {
- throw new IllegalArgumentException(String.format(
- UNEQUAL_DATA_AND_TIME_POINTS, listOfBlocks.get(0)
- .getRowCount(), timePoints.length));
+ if ((listOfBlocks.size() > 0) && (listOfBlocks.get(0).getRowCount() != timePoints.length)) {
+ throw new IllegalArgumentException(String.format(UNEQUAL_DATA_AND_TIME_POINTS, listOfBlocks.get(0).getRowCount(), timePoints.length));
}
this.timePoints = timePoints;
}
@@ -960,8 +912,7 @@ public void setValueAt(Double aValue, int rowIndex, int columnIndex) {
if (columnIndex == 0) {
timePoints[rowIndex] = aValue.doubleValue();
} else {
- getColumn(columnIndex).setValue(aValue.doubleValue(),
- rowIndex);
+ getColumn(columnIndex).setValue(aValue.doubleValue(), rowIndex);
}
}
@@ -987,5 +938,4 @@ public String toString() {
}
return sb.toString();
}
-
}
diff --git a/src/main/java/org/simulator/math/odes/ParameterizedDESystem.java b/src/main/java/org/simulator/math/odes/ParameterizedDESystem.java
index 8bbb777b..04f7f241 100644
--- a/src/main/java/org/simulator/math/odes/ParameterizedDESystem.java
+++ b/src/main/java/org/simulator/math/odes/ParameterizedDESystem.java
@@ -31,7 +31,7 @@
* double values, i.e., each parameter value being associated with a unique
* identifier. Implementing classes provide methods to manipulate the current
* parameter configuration of the system.
- *
+ *
* @author Andreas Dräger
* @version $Rev$
* @since 1.2
@@ -44,9 +44,9 @@ public interface ParameterizedDESystem extends DESystem {
* returned by the methods {@link #getParameterIdentifiers()} AND
* {@link #getParameterValues()}. Otherwise, the implementation might show
* unexpected behavior.
- *
+ *
* @return parameterCount the number of parameters in the system that influence its
- * behavior
+ * behavior
* @see #getParameterIdentifiers()
* @see #getParameterValues()
*/
@@ -57,7 +57,7 @@ public interface ParameterizedDESystem extends DESystem {
* a unique identifier, which can be used to address it in numerical
* calculations. This method returns an array of all parameters in the
* {@link ParameterizedDESystem}.
- *
+ *
* @return identifiers
* @see #getParameterCount()
* @see #getParameterValues()
@@ -70,10 +70,9 @@ public interface ParameterizedDESystem extends DESystem {
* length of the returned array must be identical with the value returned by
* {@link #getPositiveValueCount()} and also with the number of identifiers
* given by {@link #getParameterIdentifiers()}
- *
+ *
* @return values the current values of all parameters in the system in form of a
- * double array
- *
+ * double array
* @see #getParameterCount()
* @see #getParameterIdentifiers()
*/
@@ -87,10 +86,9 @@ public interface ParameterizedDESystem extends DESystem {
* can obtain the current values of all parameters by calling
* {@link #getParameterValues()}. Within this array you could change some
* values of interest and subsequently pass the array to this method.
- *
+ *
* @param values the new values for all parameters.
* @see #getParameterCount()
*/
public void setParameters(double values[]);
-
}
diff --git a/src/main/java/org/simulator/math/odes/RichDESystem.java b/src/main/java/org/simulator/math/odes/RichDESystem.java
index 78985058..7d7dd78d 100644
--- a/src/main/java/org/simulator/math/odes/RichDESystem.java
+++ b/src/main/java/org/simulator/math/odes/RichDESystem.java
@@ -31,7 +31,7 @@
* information besides the pure rate of change during its evaluation. For
* instance, such a system also computes intermediate result that might be of
* interest later on.
- *
+ *
* @author Andreas Dräger
* @version $Rev$
* @since 0.9
@@ -43,29 +43,26 @@ public interface RichDESystem extends DESystem {
* identifier per result. This means, the length of the returned
* {@link String} array must equal the length of the array returned by
* {@link #getAdditionalValues(double, double[])}.
- *
+ *
* @return The identifiers of all intermediate results computed during
- * evaluation.
+ * evaluation.
*/
public String[] getAdditionalValueIds();
/**
* Computes and/or delivers the intermediate results at the given time and
* for the given results from the previous time step.
- *
- * @param t
- * The time point for which intermediate results are to be
- * computed.
- * @param Y
- * The result vector from the previous time step.
+ *
+ * @param t The time point for which intermediate results are to be
+ * computed.
+ * @param Y The result vector from the previous time step.
* @return An array of intermediate results. Simulators should call this
- * method after computation of the next time point to avoid unnecessary
- * re-computation. Implementing classes should store interesting
- * intermediate results to be accessible in case time and Y are the
- * same values than those just used for the actual computation.
- * @throws DerivativeException
- * If the system cannot be solved for the given configuration or
- * no intermediate results can be computed in this step.
+ * method after computation of the next time point to avoid unnecessary
+ * re-computation. Implementing classes should store interesting
+ * intermediate results to be accessible in case time and Y are the
+ * same values than those just used for the actual computation.
+ * @throws DerivativeException If the system cannot be solved for the given configuration or
+ * no intermediate results can be computed in this step.
*/
public double[] getAdditionalValues(double t, double[] Y)
throws DerivativeException;
@@ -75,10 +72,9 @@ public double[] getAdditionalValues(double t, double[] Y)
* The number returned here must equal the length of the arrays returned by
* the methods {@link #getAdditionalValueIds()} and
* {@link #getAdditionalValues(double, double[])}.
- *
+ *
* @return The number of intermediate values that are computed in each time
- * step.
+ * step.
*/
public int getAdditionalValueCount();
-
}
diff --git a/src/main/java/org/simulator/math/odes/RosenbrockSolver.java b/src/main/java/org/simulator/math/odes/RosenbrockSolver.java
index 1e9fe71c..9465e177 100644
--- a/src/main/java/org/simulator/math/odes/RosenbrockSolver.java
+++ b/src/main/java/org/simulator/math/odes/RosenbrockSolver.java
@@ -24,7 +24,6 @@
*/
package org.simulator.math.odes;
-
import java.math.BigDecimal;
import org.apache.commons.math.ode.DerivativeException;
@@ -42,7 +41,7 @@
*
* This solver has been adapted from ODE Toolkit: a free application for solving
* systems of ordinary differential equations.
- *
+ *
* @author Chris Moore
* @author Roland Keller
* @version $Rev: 168 $
@@ -50,7 +49,6 @@
*/
public class RosenbrockSolver extends AdaptiveStepsizeIntegrator {
-
/**
* Generated serial version identifier.
*/
@@ -60,40 +58,33 @@ public class RosenbrockSolver extends AdaptiveStepsizeIntegrator {
* Constants used to adapt the stepsize according to the error in the last
* step (see rodas.f)
*/
- public static final double SAFETY = 0.9, fac1 = 1.0 / 6.0, fac2 = 5,
- PWR = 0.25;
-
+ public static final double SAFETY = 0.9, fac1 = 1.0 / 6.0, fac2 = 5, PWR = 0.25;
// The constants cX, dX, aXY, and cXY, are coefficients used in method
// step()
// Given in a webnote (see _Numerical Recipies_3rd ed) ----give
// reference-----
- /** Constants for solving */
+ /**
+ * Constants for solving
+ */
public static final double c2 = 0.386, c3 = 0.21, c4 = 0.63;
- /** Constants for solving */
- public static final double a21 = 1.544000000000000,
- a31 = 0.9466785280815826, a32 = 0.2557011698983284,
- a41 = 3.314825187068521, a42 = 2.896124015972201,
- a43 = 0.9986419139977817, a51 = 1.221224509226641,
- a52 = 6.019134481288629, a53 = 12.53708332932087,
- a54 = -0.6878860361058950;
+ /**
+ * Constants for solving
+ */
+ public static final double a21 = 1.544000000000000, a31 = 0.9466785280815826, a32 = 0.2557011698983284, a41 = 3.314825187068521, a42 = 2.896124015972201, a43 = 0.9986419139977817, a51 = 1.221224509226641, a52 = 6.019134481288629, a53 = 12.53708332932087, a54 = -0.6878860361058950;
- /** Constants for solving */
+ /**
+ * Constants for solving
+ */
public static final double gam = 0.250;
- /** Constants for solving */
- public static final double c21 = -5.668800000000000,
- c31 = -2.430093356833875, c32 = -0.2063599157091915,
- c41 = -0.1073529058151375, c42 = -9.594562251023355,
- c43 = -20.47028614809616, c51 = 7.496443313967647,
- c52 = -10.24680431464352, c53 = -33.99990352819905,
- c54 = 11.70890893206160, c61 = 8.083246795921522,
- c62 = -7.981132988064893, c63 = -31.52159432874371,
- c64 = 16.31930543123136, c65 = -6.058818238834054;
+ /**
+ * Constants for solving
+ */
+ public static final double c21 = -5.668800000000000, c31 = -2.430093356833875, c32 = -0.2063599157091915, c41 = -0.1073529058151375, c42 = -9.594562251023355, c43 = -20.47028614809616, c51 = 7.496443313967647, c52 = -10.24680431464352, c53 = -33.99990352819905, c54 = 11.70890893206160, c61 = 8.083246795921522, c62 = -7.981132988064893, c63 = -31.52159432874371, c64 = 16.31930543123136, c65 = -6.058818238834054;
- public static final double d1 = 0.25, d2 = 0.1043, d3 = 0.1035,
- d4 = -0.0362;
+ public static final double d1 = 0.25, d2 = 0.1043, d3 = 0.1035, d4 = -0.0362;
/**
* the minimum acceptable value of relTol - attempts to obtain higher
@@ -101,30 +92,45 @@ public class RosenbrockSolver extends AdaptiveStepsizeIntegrator {
*/
public static final double RELMIN = 1.0E-12;
-
- /** maximum stepsize */
+ /**
+ * maximum stepsize
+ */
private double hMax;
- /** minimum stepsize */
+
+ /**
+ * minimum stepsize
+ */
private double hMin;
- /** the current value of the independent variable */
+ /**
+ * the current value of the independent variable
+ */
private double t;
- /** the current step size */
+ /**
+ * the current step size
+ */
private double h;
- /** factor for calculating error value used in adjusting step size */
+ /**
+ * factor for calculating error value used in adjusting step size
+ */
double sk;
+
/**
* factor used for adjusting the step size, divide current step size by
* hAdap to get new step size
*/
double hAdap;
- /** The number of equations */
+ /**
+ * The number of equations
+ */
int numEqn;
- /** the current values of the dependent variables */
+ /**
+ * the current values of the dependent variables
+ */
private double[] y;
/**
@@ -132,7 +138,9 @@ public class RosenbrockSolver extends AdaptiveStepsizeIntegrator {
*/
private double[] oldY;
- /** arrays to store derivative evaluations and intermediate steps */
+ /**
+ * arrays to store derivative evaluations and intermediate steps
+ */
private double[] f1, f2, f3, f4, f5, f6, k1, k2, k3, k4, k5;
/**
@@ -141,21 +149,33 @@ public class RosenbrockSolver extends AdaptiveStepsizeIntegrator {
*/
double[] yNew;
- /** array that holds approximate errors in the values in y */
+ /**
+ * array that holds approximate errors in the values in y
+ */
private double[] yerr;
- /** helper array to hold intermediate values */
+ /**
+ * helper array to hold intermediate values
+ */
double[] yTemp, ya, yb, g0, g1, g2, g1x, g2x, DFDX;
- /** helper array to hold intermediate values */
+
+ /**
+ * helper array to hold intermediate values
+ */
int[] indx;
- /** helper array to hold intermediate values */
+
+ /**
+ * helper array to hold intermediate values
+ */
double[][] JAC, FAC, I;
- /** Keep track whether the thread is killed or not */
+ /**
+ * Keep track whether the thread is killed or not
+ */
boolean stop;
/**
- *
+ *
*/
private double[] timePoints;
@@ -179,7 +199,6 @@ public class RosenbrockSolver extends AdaptiveStepsizeIntegrator {
*/
private static final double precisionFastReactions = 1E-3;
-
/**
* default constructor
*/
@@ -188,7 +207,6 @@ public RosenbrockSolver() {
}
/**
- *
* @param size
* @param stepsize
*/
@@ -199,6 +217,7 @@ public RosenbrockSolver(int size, double stepsize) {
/**
* clone constructor
+ *
* @param solver
*/
public RosenbrockSolver(RosenbrockSolver solver) {
@@ -208,17 +227,16 @@ public RosenbrockSolver(RosenbrockSolver solver) {
/**
* initialization function
+ *
* @param size
* @param stepsize
* @param nTimepoints
*/
private void init(int size, double stepsize, int nTimepoints) {
numEqn = size;
-
hMin = 1E-14d;
setStepSize(stepsize);
hMax = Math.min(stepsize, 1d);
-
stop = false;
timePoints = new double[nTimepoints];
// allocate arrays
@@ -250,7 +268,7 @@ private void init(int size, double stepsize, int nTimepoints) {
JAC = new double[numEqn][numEqn];
FAC = new double[numEqn][numEqn];
I = new double[numEqn][numEqn];
- ignoreNaN=new boolean[numEqn];
+ ignoreNaN = new boolean[numEqn];
}
/* (non-Javadoc)
@@ -263,15 +281,13 @@ public RosenbrockSolver clone() {
/**
* This function tries to make a time step.
- *
- * @param DES
- * the differential equation system
+ *
+ * @param DES the differential equation system
* @return the error
* @throws DerivativeException
*/
public double step(DESystem DES) throws DerivativeException {
double largestError = 0;
-
DES.computeDerivatives(t, y, g0);
for (int j = 0; j < numEqn; j++) {
System.arraycopy(y, 0, ya, 0, numEqn);
@@ -293,38 +309,30 @@ public double step(DESystem DES) throws DerivativeException {
}
}
}
-
for (int i = 0; i < numEqn; i++) {
for (int j = 0; j < numEqn; j++) {
FAC[i][j] = I[i][j] / (gam * h) - JAC[i][j];
}
}
-
// Forward difference approx for derivative of f
// WRT the independent variable
DES.computeDerivatives(t + h, y, g1x);
DES.computeDerivatives(t + 2 * h, y, g2x);
for (int i = 0; i < numEqn; i++) {
- DFDX[i] = g0[i] * -3 / (2 * h) + g1x[i] * 2 / h + g2x[i] * -1
- / (2 * h);
+ DFDX[i] = g0[i] * -3 / (2 * h) + g1x[i] * 2 / h + g2x[i] * -1 / (2 * h);
}
-
// Here the work of taking the step begins
// It uses the derivatives calculated above
DES.computeDerivatives(t, yTemp, f1);
for (int i = 0; i < numEqn; i++) {
k1[i] = f1[i] + DFDX[i] * h * d1;
}
-
try {
MatrixOperations.ludcmp(FAC, indx);
} catch (MatrixException e) {
- throw new DerivativeException(
- "Rosenbrock solver returns an error due to singular matrix.");
+ throw new DerivativeException("Rosenbrock solver returns an error due to singular matrix.");
}
-
MatrixOperations.lubksb(FAC, indx, k1);
-
for (int i = 0; i < numEqn; i++) {
yTemp[i] = y[i] + k1[i] * a21;
}
@@ -333,57 +341,45 @@ public double step(DESystem DES) throws DerivativeException {
k2[i] = f2[i] + DFDX[i] * h * d2 + k1[i] * c21 / h;
}
MatrixOperations.lubksb(FAC, indx, k2);
-
for (int i = 0; i < numEqn; i++) {
yTemp[i] = y[i] + k1[i] * a31 + k2[i] * a32;
}
DES.computeDerivatives(t + c3 * h, yTemp, f3);
for (int i = 0; i < numEqn; i++) {
- k3[i] = f3[i] + DFDX[i] * h * d3 + k1[i] * c31 / h + k2[i] * c32
- / h;
+ k3[i] = f3[i] + DFDX[i] * h * d3 + k1[i] * c31 / h + k2[i] * c32 / h;
}
MatrixOperations.lubksb(FAC, indx, k3);
-
for (int i = 0; i < numEqn; i++) {
yTemp[i] = y[i] + k1[i] * a41 + k2[i] * a42 + k3[i] * a43;
}
DES.computeDerivatives(t + c4 * h, yTemp, f4);
for (int i = 0; i < numEqn; i++) {
- k4[i] = f4[i] + DFDX[i] * h * d4 + k1[i] * c41 / h + k2[i] * c42
- / h + k3[i] * c43 / h;
+ k4[i] = f4[i] + DFDX[i] * h * d4 + k1[i] * c41 / h + k2[i] * c42 / h + k3[i] * c43 / h;
}
MatrixOperations.lubksb(FAC, indx, k4);
-
for (int i = 0; i < numEqn; i++) {
- yTemp[i] = y[i] + k1[i] * a51 + k2[i] * a52 + k3[i] * a53 + k4[i]
- * a54;
+ yTemp[i] = y[i] + k1[i] * a51 + k2[i] * a52 + k3[i] * a53 + k4[i] * a54;
}
DES.computeDerivatives(t + h, yTemp, f5);
for (int i = 0; i < numEqn; i++) {
- k5[i] = f5[i] + k1[i] * c51 / h + k2[i] * c52 / h + k3[i] * c53 / h
- + k4[i] * c54 / h;
+ k5[i] = f5[i] + k1[i] * c51 / h + k2[i] * c52 / h + k3[i] * c53 / h + k4[i] * c54 / h;
}
MatrixOperations.lubksb(FAC, indx, k5);
-
for (int i = 0; i < numEqn; i++) {
yTemp[i] += k5[i];
}
DES.computeDerivatives(t + h, yTemp, f6);
for (int i = 0; i < numEqn; i++) {
- yerr[i] = f6[i] + k1[i] * c61 / h + k2[i] * c62 / h + k3[i] * c63
- / h + k4[i] * c64 / h + k5[i] * c65 / h;
+ yerr[i] = f6[i] + k1[i] * c61 / h + k2[i] * c62 / h + k3[i] * c63 / h + k4[i] * c64 / h + k5[i] * c65 / h;
}
MatrixOperations.lubksb(FAC, indx, yerr);
-
for (int i = 0; i < numEqn; i++) {
yNew[i] = yTemp[i] + yerr[i];
}
-
for (int i = 0; i < numEqn; i++) {
if (!ignoreNaN[i]) {
sk = absTol + relTol * Math.max(Math.abs(y[i]), Math.abs(yNew[i]));
largestError += Math.pow(yerr[i] / sk, 2);
-
if ((Double.isInfinite(yTemp[i]) || Double.isNaN(yTemp[i]))) {
return -1;
}
@@ -391,19 +387,17 @@ public double step(DESystem DES) throws DerivativeException {
}
largestError = Math.pow(largestError / numEqn, 0.5);
return largestError;
-
}
/**
* Returns an approximation to the error involved with the current
* arithmetic implementation
- *
+ *
* @return the approximation as described above
*/
public double unitRoundoff() {
double u;
double one_plus_u;
-
u = 1.0;
one_plus_u = 1.0 + u;
// Check to see if the number 1.0 plus some positive offset
@@ -413,7 +407,6 @@ public double unitRoundoff() {
one_plus_u = 1.0 + u;
}
u *= 2.0; // Go back one step
-
return (u);
}
@@ -427,7 +420,6 @@ public String getName() {
}
/**
- *
* @return the number of equations in the system
*/
public int getNumEquations() {
@@ -438,27 +430,23 @@ public int getNumEquations() {
* @see org.simulator.math.odes.AbstractDESSolver#computeChange(org.simulator.math.odes.DESystem, double[], double, double, double[], boolean)
*/
@Override
- public double[] computeChange(DESystem DES, double[] y2, double time,
- double currentStepSize, double[] change, boolean steadyState) throws DerivativeException {
+ public double[] computeChange(DESystem DES, double[] y2, double time, double currentStepSize, double[] change, boolean steadyState)
+ throws DerivativeException {
if ((y == null) || (y.length == 0) || (y.length != y2.length)) {
init(DES.getDimension(), getStepSize(), 2);
}
hMax = currentStepSize;
boolean hasDerivatives = true;
-
if (DES instanceof EventDESystem) {
EventDESystem EDES = (EventDESystem) DES;
if (EDES.getNoDerivatives()) {
hasDerivatives = false;
}
}
-
double timeEnd = BigDecimal.valueOf(time).add(BigDecimal.valueOf(currentStepSize)).doubleValue();
try {
-
double localError = 0;
int solutionIndex = 0;
-
// temporary variable used when adjusting stepsize
double tNew;
@@ -469,6 +457,7 @@ public double[] computeChange(DESystem DES, double[] y2, double time,
// Compute epsilon. This is the smallest double X such that
// 1.0+X!=1.0
double eps = unitRoundoff();
+
// Restrict relative error tolerance to be at least as large as
// 2*eps+RELMIN to avoid limiting precision difficulties arising
// from impossible accuracy requests
@@ -481,54 +470,43 @@ public double[] computeChange(DESystem DES, double[] y2, double time,
// initial dependent values
t = time;
timePoints[0] = t;
-
- if (y.length!=y2.length) {
- y=y2.clone();
- ignoreNaN=new boolean[y.length];
- }
- else {
+ if (y.length != y2.length) {
+ y = y2.clone();
+ ignoreNaN = new boolean[y.length];
+ } else {
System.arraycopy(y2, 0, y, 0, y.length);
}
-
- for (int i = 0;i!=y.length;i++) {
+ for (int i = 0; i != y.length; i++) {
if (Double.isInfinite(y[i]) || (Double.isNaN(y[i]))) {
- ignoreNaN[i]=true;
- }
- else{
- ignoreNaN[i]=false;
+ ignoreNaN[i] = true;
+ } else {
+ ignoreNaN[i] = false;
}
}
+
// add the initial conditions to the solution matrix and let all
// point
// ready listeners know about it
-
// set initial stepsize - we want to try the maximum stepsize to
// begin
// with and move to smaller values if necessary
h = hMax;
stop = false;
-
while (!stop) {
-
// if the last step was successful (t was updated)...
if (lastStepSuccessful) {
-
// ... and the current t differs from the last recorded one
// by
// at least stepsize...
- if (Math.abs(timePoints[solutionIndex] - t) >= Math
- .abs(currentStepSize)) {
-
+ if (Math.abs(timePoints[solutionIndex] - t) >= Math.abs(currentStepSize)) {
// ...we want to record the current point in the
// solution
// matrix and notify all pointReadyListeners of the
// point
solutionIndex++;
timePoints[solutionIndex] = t;
-
}
}
-
// see if we're done
if (t >= timeEnd) {
if ((DES instanceof EventDESystem) && (!steadyState)) {
@@ -536,7 +514,7 @@ public double[] computeChange(DESystem DES, double[] y2, double time,
EventDESystem EDES = (EventDESystem) DES;
//if (((EDES.getEventCount() > 0) && (!steadyState)) || (EDES.getRuleCount() > 0)) {
if ((EDES.getEventCount() > 0) || (EDES.getRuleCount() > 0)) {
- processEventsAndRules(true, EDES, timeEnd, t-h, yTemp);
+ processEventsAndRules(true, EDES, timeEnd, t - h, yTemp);
}
System.arraycopy(yTemp, 0, y, 0, numEqn);
}
@@ -549,8 +527,7 @@ public double[] computeChange(DESystem DES, double[] y2, double time,
// take a step
if (hasDerivatives) {
localError = step(DES);
- }
- else {
+ } else {
localError = 0;
}
} catch (Exception ex) {
@@ -560,22 +537,17 @@ public double[] computeChange(DESystem DES, double[] y2, double time,
// new Error("Infinity or NaN encountered by the RB solver... stopping solve");
// stop = true;
// }
-
// good step
- if (((!Double.isNaN(localError)) && (localError!=-1) && (localError <= 1.0) && !stop)) {
+ if (((!Double.isNaN(localError)) && (localError != -1) && (localError <= 1.0) && !stop)) {
setUnstableFlag(false);
-
-
-
System.arraycopy(y, 0, oldY, 0, numEqn);
System.arraycopy(yTemp, 0, y, 0, numEqn);
-
- boolean changed=false;
+ boolean changed = false;
double newTime = BigDecimal.valueOf(t).add(BigDecimal.valueOf(h)).doubleValue();
if ((DES instanceof EventDESystem) && (!steadyState)) {
EventDESystem EDES = (EventDESystem) DES;
if ((EDES.getEventCount() > 0) || (EDES.getRuleCount() > 0)) {
- changed=processEventsAndRules(true, EDES, Math.min(newTime,timeEnd), t, yTemp);
+ changed = processEventsAndRules(true, EDES, Math.min(newTime, timeEnd), t, yTemp);
}
}
if ((!changed) && (DES instanceof FastProcessDESystem) && (!steadyState)) {
@@ -586,78 +558,63 @@ public double[] computeChange(DESystem DES, double[] y2, double time,
if (clonedSolver == null) {
clonedSolver = clone();
}
- double[] result = clonedSolver.computeSteadyState(FDES,
- yTemp2, 0);
+ double[] result = clonedSolver.computeSteadyState(FDES, yTemp2, 0);
System.arraycopy(result, 0, yTemp, 0, yTemp.length);
- for (int i = 0; i!=result.length; i++) {
- double difference = Math.abs(yTemp[i]-oldY[i]);
+ for (int i = 0; i != result.length; i++) {
+ double difference = Math.abs(yTemp[i] - oldY[i]);
if ((Math.abs(yTemp[i]) > 1E-10) || (Math.abs(oldY[i]) > 1E-10)) {
- difference = Math.abs((yTemp[i]-oldY[i])/ Math.max(yTemp[i], oldY[i]));
+ difference = Math.abs((yTemp[i] - oldY[i]) / Math.max(yTemp[i], oldY[i]));
}
if ((difference > precisionFastReactions) && (h > precisionTimingFastReactions)) {
changed = true;
break;
}
}
-
}
}
-
if (changed) {
//if (h/10>hMin) {
- if (h>precisionTimingEventsAndRules) {
+ if (h > precisionTimingEventsAndRules) {
//h=h/10;
- h = Math.max(h / 10,precisionTimingEventsAndRules);
+ h = Math.max(h / 10, precisionTimingEventsAndRules);
if (h - precisionTimingEventsAndRules < precisionTimingEventsAndRules) {
h = precisionTimingEventsAndRules;
}
System.arraycopy(oldY, 0, y, 0, numEqn);
- }
- else {
+ } else {
System.arraycopy(yTemp, 0, y, 0, numEqn);
- t=Math.min(newTime,timeEnd);
- if (timeEnd-t-h hMax) {
h = hMax;
}
-
stop = false;
}
-
//solveDone();
} catch (OutOfMemoryError e) {
throw new DerivativeException("Out of memory : try reducing solve span or increasing step size.");
}
-
-
return change;
}
@@ -702,6 +653,4 @@ protected boolean hasSolverEventProcessing() {
public int getKiSAOterm() {
return 33;
}
-
-
}
diff --git a/src/main/java/org/simulator/math/odes/RungeKutta_EventSolver.java b/src/main/java/org/simulator/math/odes/RungeKutta_EventSolver.java
index e2eac98a..ae78d36f 100644
--- a/src/main/java/org/simulator/math/odes/RungeKutta_EventSolver.java
+++ b/src/main/java/org/simulator/math/odes/RungeKutta_EventSolver.java
@@ -29,7 +29,7 @@
/**
* Runge-Kutta method.
- *
+ *
* @author Andreas Dräger
* @version $Rev$
* @since 0.9
@@ -45,6 +45,7 @@ public class RungeKutta_EventSolver extends AbstractDESSolver {
* Stores temporary results for the fourth-order Runge-Kutta method.
*/
transient protected double[][] kVals = null;
+
/**
* Helper variable for the k values.
*/
@@ -58,7 +59,6 @@ public RungeKutta_EventSolver() {
}
/**
- *
* @param stepSize
*/
public RungeKutta_EventSolver(double stepSize) {
@@ -66,10 +66,8 @@ public RungeKutta_EventSolver(double stepSize) {
}
/**
- *
* @param stepSize
- * @param nonnegative
- * the nonnegative flag of the super class
+ * @param nonnegative the nonnegative flag of the super class
* @see AbstractDESSolver
*/
public RungeKutta_EventSolver(double stepSize, boolean nonnegative) {
@@ -78,6 +76,7 @@ public RungeKutta_EventSolver(double stepSize, boolean nonnegative) {
/**
* clone constructor
+ *
* @param rkEventSolver
*/
public RungeKutta_EventSolver(RungeKutta_EventSolver rkEventSolver) {
@@ -88,39 +87,33 @@ public RungeKutta_EventSolver(RungeKutta_EventSolver rkEventSolver) {
* @see org.simulator.math.odes.AbstractDESSolver#computeChange(org.simulator.math.odes.DESystem, double[], double, double, double[], boolean)
*/
@Override
- public double[] computeChange(DESystem DES, double[] yTemp, double t,
- double h, double[] change, boolean steadyState) throws DerivativeException {
+ public double[] computeChange(DESystem DES, double[] yTemp, double t, double h, double[] change, boolean steadyState)
+ throws DerivativeException {
int dim = DES.getDimension();
if ((kVals == null) || (kVals.length != 4) || (kVals[0].length != dim)) {
// "static" vectors which are allocated only once
kVals = new double[4][dim];
kHelp = new double[dim];
}
-
// k0
DES.computeDerivatives(t, yTemp, kVals[0]);
Mathematics.svMult(h, kVals[0], kVals[0]);
-
// k1
Mathematics.svvAddScaled(0.5, kVals[0], yTemp, kHelp);
DES.computeDerivatives(t + h / 2, kHelp, kVals[1]);
Mathematics.svMult(h, kVals[1], kVals[1]);
-
// k2
Mathematics.svvAddScaled(0.5, kVals[1], yTemp, kHelp);
DES.computeDerivatives(t + h / 2, kHelp, kVals[2]);
Mathematics.svMult(h, kVals[2], kVals[2]);
-
// k3
Mathematics.vvAdd(yTemp, kVals[2], kHelp);
DES.computeDerivatives(t + h, kHelp, kVals[3]);
Mathematics.svMult(h, kVals[3], kVals[3]);
-
// combining all k's
Mathematics.svvAddScaled(2, kVals[2], kVals[3], kVals[3]);
Mathematics.svvAddScaled(2, kVals[1], kVals[3], kVals[2]);
Mathematics.svvAddAndScale(1d / 6d, kVals[0], kVals[2], change);
-
return change;
}
@@ -155,5 +148,4 @@ protected boolean hasSolverEventProcessing() {
public int getKiSAOterm() {
return 64;
}
-
}
diff --git a/src/main/java/org/simulator/math/odes/package-info.java b/src/main/java/org/simulator/math/odes/package-info.java
index 0c282a8e..998027b8 100644
--- a/src/main/java/org/simulator/math/odes/package-info.java
+++ b/src/main/java/org/simulator/math/odes/package-info.java
@@ -26,7 +26,7 @@
/**
* The various solver classes that are all derived from
* {@link org.simulator.math.odes.AbstractDESSolver}.
- *
+ *
* @version $Rev$
*/
package org.simulator.math.odes;
diff --git a/src/main/java/org/simulator/math/package-info.java b/src/main/java/org/simulator/math/package-info.java
index c2a8e7f2..48cdecf3 100644
--- a/src/main/java/org/simulator/math/package-info.java
+++ b/src/main/java/org/simulator/math/package-info.java
@@ -25,7 +25,7 @@
/**
* Classes that contain several mathematical operations.
- *
+ *
* @version $Rev$
*/
package org.simulator.math;
diff --git a/src/main/java/org/simulator/omex/OMEXArchive.java b/src/main/java/org/simulator/omex/OMEXArchive.java
index 6ab91cfa..1597be97 100644
--- a/src/main/java/org/simulator/omex/OMEXArchive.java
+++ b/src/main/java/org/simulator/omex/OMEXArchive.java
@@ -30,7 +30,6 @@
import java.util.Map;
import org.jdom2.JDOMException;
-
import de.binfalse.bflog.LOGGER;
import de.unirostock.sems.cbarchive.ArchiveEntry;
import de.unirostock.sems.cbarchive.CombineArchive;
@@ -42,78 +41,74 @@
*/
public class OMEXArchive {
- private CombineArchive archive;
- private Map entryMap;
- private boolean has_models;
- private boolean has_sim_descp;
- private File sed_ml, sb_ml;
+ private CombineArchive archive;
+ private Map entryMap;
+ private boolean has_models;
+ private boolean has_sim_descp;
+ private File sed_ml, sb_ml;
- public OMEXArchive(File zipFile) throws IOException, ParseException, CombineArchiveException, JDOMException{
- entryMap = new HashMap();
- has_models = false;
- has_sim_descp = false;
-
- archive = new CombineArchive(zipFile);
+ public OMEXArchive(File zipFile)
+ throws IOException, ParseException, CombineArchiveException,
+ JDOMException {
+ entryMap = new HashMap();
+ has_models = false;
+ has_sim_descp = false;
+ archive = new CombineArchive(zipFile);
+ File parent = new File(System.getProperty("java.io.tmpdir"));
+ String entryFormat;
- File parent = new File(System.getProperty("java.io.tmpdir"));
+ // iterate over all entries in the archive and create a Map
+ for (ArchiveEntry entry : archive.getEntries()) {
+ entryMap.put(entry.getFilePath(), entry);
+ entryFormat = entry.getFormat().toString();
+ if (entryFormat.contains("SBML") || entryFormat.contains("sbml")) {
+ has_models = true;
+ File sb_ml_file = new File(parent, entry.getFileName());
+ sb_ml = entry.extractFile(sb_ml_file);
+ }
+ if (entryFormat.contains("SED-ML") || entryFormat.contains("sed-ml")) {
+ has_sim_descp = true;
+ File sed_ml_file = new File(parent, entry.getFileName());
+ sed_ml = entry.extractFile(sed_ml_file);
+ }
+ }
- // iterate over all entries in the archive and create a Map
- for (ArchiveEntry entry : archive.getEntries())
- {
- entryMap.put(entry.getFilePath(), entry);
- if(entry.getFormat().toString().contains("SBML") || entry.getFormat().toString().contains("sbml")){
- has_models = true;
+ // read description of the archive itself
+ LOGGER.debug("found " + archive.getDescriptions().size() + " meta data entries describing the archive.");
+ }
- File sb_ml_file = new File(parent, entry.getFileName());
- sb_ml = entry.extractFile(sb_ml_file);
- }
- if(entry.getFormat().toString().contains("SED-ML") || entry.getFormat().toString().contains("sed-ml")) {
- has_sim_descp = true;
+ public Map getFileEntries() {
+ return entryMap;
+ }
- File sed_ml_file = new File(parent, entry.getFileName());
- sed_ml = entry.extractFile(sed_ml_file);
- }
- }
+ public boolean containsSBMLModel() {
+ return has_models;
+ }
- // read description of the archive itself
- LOGGER.debug("found " + archive.getDescriptions().size() + " meta data entries describing the archive.");
- }
+ public boolean containsSEDMLDescp() {
+ return has_sim_descp;
+ }
- public Map getFileEntries() {
- return entryMap;
- }
+ public File getSEDMLDescription() {
+ return sed_ml;
+ }
- public boolean containsSBMLModel() {
- return has_models;
- }
-
- public boolean containsSEDMLDescp() {
- return has_sim_descp;
- }
-
- public File getSEDMLDescp() {
- return sed_ml;
- }
-
- /**
- * A simple method to uncompress combine archives at desired location
- * @param destination
- * @return boolean
- */
- public boolean extractArchive(File destination) {
- try {
- archive.extractTo(destination);
- return true;
- }catch(IOException ex) {
- return false;
- }
- }
+ /**
+ * A simple method to uncompress combine archives at desired location
+ *
+ * @param destination
+ * @return whether combine archive is uncompressed or not
+ */
+ public boolean extractArchive(File destination) throws IOException {
+ try {
+ archive.extractTo(destination);
+ return true;
+ } catch (IOException ex) {
+ LOGGER.error(ex, "Error in extracting archives!");
+ return false;
+ } finally {
+ archive.close();
+ }
+ }
- /**
- * Since we directly work with zip archive, it needs to be closed after use
- * @throws IOException
- */
- public void close() throws IOException {
- archive.close();
- }
-}
\ No newline at end of file
+}
diff --git a/src/main/java/org/simulator/omex/package-info.java b/src/main/java/org/simulator/omex/package-info.java
index a2fbe404..4fdcde78 100644
--- a/src/main/java/org/simulator/omex/package-info.java
+++ b/src/main/java/org/simulator/omex/package-info.java
@@ -21,8 +21,8 @@
* .
* ---------------------------------------------------------------------
*/
+
/**
* @author Shalin
- *
*/
-package org.simulator.omex;
\ No newline at end of file
+package org.simulator.omex;
diff --git a/src/main/java/org/simulator/package-info.java b/src/main/java/org/simulator/package-info.java
index 6b2b36df..81be5f93 100644
--- a/src/main/java/org/simulator/package-info.java
+++ b/src/main/java/org/simulator/package-info.java
@@ -27,7 +27,7 @@
/**
* This package simply contains a default main program to display very
* basic licensing terms and other information.
- *
+ *
* @version $Rev$
*/
package org.simulator;
diff --git a/src/main/java/org/simulator/plot/PlotMultiTable.java b/src/main/java/org/simulator/plot/PlotMultiTable.java
index 7c3fc5ed..b8d71c0e 100644
--- a/src/main/java/org/simulator/plot/PlotMultiTable.java
+++ b/src/main/java/org/simulator/plot/PlotMultiTable.java
@@ -24,7 +24,9 @@
package org.simulator.plot;
import org.jfree.chart.ChartPanel;
+
import java.util.Iterator;
+
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.ui.ApplicationFrame;
@@ -35,70 +37,66 @@
/**
* This class adds output data-plot support to SBSCL
- *
+ *
* @author Shalin Shah
* @since 1.5
*/
@SuppressWarnings("serial")
public class PlotMultiTable extends ApplicationFrame {
- private MultiTable species;
- private DefaultCategoryDataset data;
- private String title;
-
- /**
- * Initializes the JFreeChart and dataSet for the chart using MultiTable
- *
- * @param table
- * The input data type to the plot API is MultiTable which gets converted
- * internally to DefaultCategoryDataset
- * @param title
- */
- public PlotMultiTable(MultiTable table, String title) {
- super(title);
-
- this.title = title;
- species = table;
- JFreeChart lineChart = ChartFactory.createLineChart(title,
- "time", "conentration (nM)", createDataset(),
- PlotOrientation.VERTICAL, true, true, false);
-
- ChartPanel chartPanel = new ChartPanel( lineChart );
- chartPanel.setPreferredSize( new java.awt.Dimension( 560 , 367 ) );
- setContentPane(chartPanel);
-
- }
-
- public PlotMultiTable(MultiTable table) {
- super("Output plot");
-
- this.title = "Output plot";
- species = table;
- JFreeChart lineChart = ChartFactory.createLineChart(title,
- "time", "conentration (nM)", createDataset(),
- PlotOrientation.VERTICAL, true, true, false);
-
- ChartPanel chartPanel = new ChartPanel( lineChart );
- chartPanel.setPreferredSize( new java.awt.Dimension( 560 , 367 ) );
- setContentPane(chartPanel);
-
- }
-
- /**
- * Helper function that converts MultiTable to DataSet for LineChart
- */
- private DefaultCategoryDataset createDataset() {
- data = new DefaultCategoryDataset();
+ private MultiTable species;
+ private DefaultCategoryDataset data;
+ private String title;
+ private static final int WIDTH = 560;
+ private static final int HEIGHT = 367;
+ private static final String DEFAULT_TITLE = "Output plot";
- for(int i = 1; i < species.getColumnCount(); i++) {
- Column col = species.getColumn(i);
+ /**
+ * Initializes the JFreeChart and dataSet for the chart using MultiTable
+ *
+ * @param table The input data type to the plot API is MultiTable which gets converted
+ * internally to DefaultCategoryDataset
+ * @param title
+ */
+ public PlotMultiTable(MultiTable table, String title) {
+ super(title);
+ this.title = title;
+ species = table;
+ JFreeChart lineChart = ChartFactory.createLineChart(title, "time", "conentration (nM)", createDataset(), PlotOrientation.VERTICAL, true, true, false);
+ ChartPanel chartPanel = new ChartPanel(lineChart);
+ chartPanel.setPreferredSize(new java.awt.Dimension(WIDTH, HEIGHT));
+ setContentPane(chartPanel);
+ }
- int time_step = 0;
- for (Iterator iter = col.iterator(); iter.hasNext(); time_step++){
- data.addValue(iter.next().doubleValue(), col.getColumnName(), String.valueOf(species.getTimePoint(time_step)));
- }
- }
+ /**
+ * Initializes the JFreeChart and dataSet for the chart using MultiTable
+ * with a default title
+ *
+ * @param table The input data type to the plot API is MultiTable which gets converted
+ * internally to DefaultCategoryDataset
+ */
+ public PlotMultiTable(MultiTable table) {
+ super(DEFAULT_TITLE);
+ this.title = DEFAULT_TITLE;
+ species = table;
+ JFreeChart lineChart = ChartFactory.createLineChart(title, "time", "conentration (nM)", createDataset(), PlotOrientation.VERTICAL, true, true, false);
+ ChartPanel chartPanel = new ChartPanel(lineChart);
+ chartPanel.setPreferredSize(new java.awt.Dimension(WIDTH, HEIGHT));
+ setContentPane(chartPanel);
+ }
- return data;
- }
-}
\ No newline at end of file
+ /**
+ * Helper function that converts MultiTable to DataSet for LineChart
+ */
+ private DefaultCategoryDataset createDataset() {
+ data = new DefaultCategoryDataset();
+ for (int i = 1; i < species.getColumnCount(); i++) {
+ Column col = species.getColumn(i);
+ int time_step = 0;
+ for (Iterator iter = col.iterator(); iter.hasNext(); time_step++) {
+ data.addValue(iter.next().doubleValue(), col.getColumnName(), String.valueOf(species.getTimePoint(time_step)));
+ }
+ }
+ return data;
+ }
+}
diff --git a/src/main/java/org/simulator/plot/PlotProcessedSedmlResults.java b/src/main/java/org/simulator/plot/PlotProcessedSedmlResults.java
index 107843c0..61902096 100644
--- a/src/main/java/org/simulator/plot/PlotProcessedSedmlResults.java
+++ b/src/main/java/org/simulator/plot/PlotProcessedSedmlResults.java
@@ -29,6 +29,7 @@
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
+import java.nio.file.Paths;
import java.util.List;
import org.apache.commons.io.FileUtils;
@@ -37,117 +38,99 @@
import org.jfree.ui.ApplicationFrame;
import org.jlibsedml.Curve;
import org.jlibsedml.execution.IProcessedSedMLSimulationResults;
-
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
/**
* This class adds output data-plot support to SBSCL
- *
+ *
* @author Shalin Shah
* @since 1.5
*/
@SuppressWarnings("serial")
public class PlotProcessedSedmlResults extends ApplicationFrame {
- private IProcessedSedMLSimulationResults species;
- private XYSeriesCollection graphData;
- private String title;
- private List curves;
- private JFreeChart lineChart;
- private static final int CHART_WIDTH = 1366;
- private static final int CHART_HEIGHT = 768;
-
- /**
- * Initializes the JFreeChart and dataSet for the chart using IProcessedSedMLSimulationResults
- *
- * @param IProcessedSedMLSimulationResults
- * The input data type to the plot API is 2D data wrapped with jsedmllib data structure
- * which gets converted internally to XY line plot
- */
- public PlotProcessedSedmlResults(IProcessedSedMLSimulationResults data, String title) {
- super(title);
-
- this.title = title;
- this.species = data;
- this.lineChart = ChartFactory.createXYLineChart(this.title,
- ".", ".", createDataset(),
- PlotOrientation.VERTICAL, true, true, false);
-
- ChartPanel chartPanel = new ChartPanel( this.lineChart );
- chartPanel.setPreferredSize( new java.awt.Dimension(CHART_WIDTH, CHART_HEIGHT));
- setContentPane(chartPanel);
- }
-
- public PlotProcessedSedmlResults(IProcessedSedMLSimulationResults data, List curves, String title) {
- super(title);
+ private IProcessedSedMLSimulationResults species;
+ private XYSeriesCollection graphData;
+ private String title;
+ private List curves;
+ private JFreeChart lineChart;
- this.title = title;
- this.species = data;
- this.curves = curves;
-
- this.lineChart = ChartFactory.createXYLineChart(this.title,
- ".", ".", createDataset(),
- PlotOrientation.VERTICAL, true, true, false);
-
+ private static final int CHART_WIDTH = 1366;
+ private static final int CHART_HEIGHT = 768;
- ChartPanel chartPanel = new ChartPanel( this.lineChart );
- chartPanel.setPreferredSize( new java.awt.Dimension(CHART_WIDTH, CHART_HEIGHT));
- setContentPane(chartPanel);
- }
+ /**
+ * Initializes the JFreeChart and dataSet for the chart using IProcessedSedMLSimulationResults
+ *
+ * @param data The input data type to the plot API is 2D data wrapped with jsedmllib data structure
+ * which gets converted internally to XY line plot
+ */
+ public PlotProcessedSedmlResults(IProcessedSedMLSimulationResults data, String title) {
+ super(title);
+ this.title = title;
+ this.species = data;
+ this.lineChart = ChartFactory.createXYLineChart(this.title, ".", ".", createDataset(), PlotOrientation.VERTICAL, true, true, false);
+ ChartPanel chartPanel = new ChartPanel(this.lineChart);
+ chartPanel.setPreferredSize(new java.awt.Dimension(CHART_WIDTH, CHART_HEIGHT));
+ setContentPane(chartPanel);
+ }
- /**
- * Helper function that converts IProcessedSedMLSimulationResults to DataSet for LineChart
- */
- private XYSeriesCollection createDataset() {
- graphData = new XYSeriesCollection();
-
- // For each curve in the current output element of sedml file
- // simple extract data generators and plot them
- for(Curve cur: this.curves) {
- Double[] xData = species.getDataByColumnId(cur.getXDataReference());
- Double[] yData = species.getDataByColumnId(cur.getYDataReference());
- XYSeries series = new XYSeries(cur.getId(), false);
-
- for(int row = 0; row < Math.min(xData.length, yData.length); row++) {
- series.add(xData[row], yData[row]);
- }
- graphData.addSeries(series);
- }
+ public PlotProcessedSedmlResults(IProcessedSedMLSimulationResults data, List curves, String title) {
+ super(title);
+ this.title = title;
+ this.species = data;
+ this.curves = curves;
+ this.lineChart = ChartFactory.createXYLineChart(this.title, ".", ".", createDataset(), PlotOrientation.VERTICAL, true, true, false);
+ ChartPanel chartPanel = new ChartPanel(this.lineChart);
+ chartPanel.setPreferredSize(new java.awt.Dimension(CHART_WIDTH, CHART_HEIGHT));
+ setContentPane(chartPanel);
+ }
- return graphData;
- }
-
- /**
- * Helper function that can save the generated plot (simulationPath sedml file) as a PNG image
- * with fileName in the results folder
- */
- public void savePlot(String simulationPath, String fileName) throws IOException {
- // Get full folder for sedml xml file
- String outputPath = getFolderPathForTestResource(simulationPath);
- // Store the plots in the results folder in the same directory
- outputPath = outputPath + "/results/simulation_core/" + fileName + ".png";
- OutputStream out = FileUtils.openOutputStream(new File(outputPath));
- // Use default width and height for chart size and save as png
- ChartUtilities.writeChartAsPNG(out, this.lineChart, CHART_WIDTH, CHART_HEIGHT);
- }
+ /**
+ * Helper function that converts IProcessedSedMLSimulationResults to DataSet for LineChart
+ */
+ private XYSeriesCollection createDataset() {
+ graphData = new XYSeriesCollection();
+ // For each curve in the current output element of sedml file
+ // simple extract data generators and plot them
+ for (Curve cur : this.curves) {
+ Double[] xData = species.getDataByColumnId(cur.getXDataReference());
+ Double[] yData = species.getDataByColumnId(cur.getYDataReference());
+ XYSeries series = new XYSeries(cur.getId(), false);
+ for (int row = 0; row < Math.min(xData.length, yData.length); row++) {
+ series.add(xData[row], yData[row]);
+ }
+ graphData.addSeries(series);
+ }
+ return graphData;
+ }
- /**
- * Get absolute parent path for given test resource.
- * Due to the relative paths of SBML and SED-ML files the resource loading is not working
- * in maven.
- *
- * Example:
- * resourcePath="/fba/e_coli_core.xml"
- */
- private static String getFolderPathForTestResource(String resourcePath) {
+ /**
+ * Helper function that can save the generated plot (simulationPath sedml file) as a PNG image
+ * with fileName in the results folder
+ */
+ public void savePlot(String simulationPath, String fileName)
+ throws IOException {
+ // Get full folder for sedml xml file
+ String outputPath = getFolderPathForTestResource(simulationPath);
+ // Store the plots in the results folder in the same directory
+ outputPath = outputPath + "/results/simulation_core/" + fileName + ".png";
+ OutputStream out = FileUtils.openOutputStream(new File(outputPath));
+ // Use default width and height for chart size and save as png
+ ChartUtilities.writeChartAsPNG(out, this.lineChart, CHART_WIDTH, CHART_HEIGHT);
+ out.close();
+ }
- String path = null;
- File currentDir = new File(System.getProperty("user.dir"));
- path = currentDir.getAbsolutePath() + "/src/test/resources" + resourcePath;
- File pwd = new File(path);
-
- return pwd.getParentFile().getAbsolutePath();
- }
-}
\ No newline at end of file
+ /**
+ * Gets a folder path for given test resource.
+ *
+ * @param resourcePath Example: resourcePath="/fba/e_coli_core.xml"
+ */
+ private static String getFolderPathForTestResource(String resourcePath) {
+ String path = null;
+ File currentDir = new File(System.getProperty("user.dir"));
+ path = currentDir.getAbsolutePath() + "/src/test/resources" + resourcePath;
+ return Paths.get(path).getParent().getFileName().toString();
+ }
+}
diff --git a/src/main/java/org/simulator/plot/package-info.java b/src/main/java/org/simulator/plot/package-info.java
index b05a83a3..c787e613 100644
--- a/src/main/java/org/simulator/plot/package-info.java
+++ b/src/main/java/org/simulator/plot/package-info.java
@@ -1,8 +1,9 @@
/**
- *
+ *
*/
/**
* @author Shalin
*
*/
-package org.simulator.plot;
\ No newline at end of file
+
+package org.simulator.plot;
diff --git a/src/main/java/org/simulator/sbml/AddMetaInfo.java b/src/main/java/org/simulator/sbml/AddMetaInfo.java
index 43738db6..48390a5b 100644
--- a/src/main/java/org/simulator/sbml/AddMetaInfo.java
+++ b/src/main/java/org/simulator/sbml/AddMetaInfo.java
@@ -24,7 +24,6 @@
package org.simulator.sbml;
import java.util.Enumeration;
-
import javax.swing.tree.TreeNode;
import org.sbml.jsbml.SBMLDocument;
@@ -34,53 +33,53 @@
* This class contains static methods to add meta information to a model inside SBMLDocument.
* This class is helpful to find add meta information to original model before it is flattened
* for information extraction later.
- *
+ *
* @author Shalin Shah
* @version $Rev$
* @since 1.5
*/
-public class AddMetaInfo{
+public class AddMetaInfo {
+
+ /**
+ * string constant for SBase id of original model
+ */
+ public static final String ORIG_ID = "ORIGINAL_ID";
+
+ /**
+ * string constant for (Sub-)Model id
+ */
+ public static final String MODEL_ID = "MODEL_ID";
+
+ /**
+ * A static method which add id information of each element to userObjects map
+ * which is an element of AbstractTreeNode SBML class to store extra information
+ *
+ * @param doc
+ */
+ public static SBMLDocument putOrigId(SBMLDocument doc) {
+ doc = (SBMLDocument) recurse(doc);
+ return doc;
+ }
- /**
- * string constant for SBase id of original model
- */
- public static final String ORIG_ID = "ORIGINAL_ID";
- /**
- * string constant for (Sub-)Model id
- */
- public static final String MODEL_ID = "MODEL_ID";
-
- /**
- * A static method which add id information of each element to userObjects map
- * which is an element of AbstractTreeNode SBML class to store extra information
- * @param doc
- */
- public static SBMLDocument putOrigId(SBMLDocument doc) {
- doc = (SBMLDocument) recurse(doc);
- return doc;
- }
-
- /**
- * A helper method to recurse all the nodes of a SBML tree
- */
- private static TreeNode recurse(TreeNode treeNode) {
- Enumeration children = (Enumeration) treeNode.children();
- // Set the entire tree recursively for adding information
- while(children.hasMoreElements()) {
- TreeNode child = children.nextElement();
-
- // Set ORIGINAL_ID for entire subTree of this node
- child = recurse(child);
-
- if(child instanceof SBase) {
- SBase node = (SBase) child;
- if(node.isSetId()) {
- // add meta information model id and parent model id
- node.putUserObject(ORIG_ID, node.getId());
- node.putUserObject(MODEL_ID, node.getModel().getId());
- }
- }
- }
- return treeNode;
- }
+ /**
+ * A helper method to recurse all the nodes of a SBML tree
+ */
+ private static TreeNode recurse(TreeNode treeNode) {
+ Enumeration children = (Enumeration) treeNode.children();
+ // Set the entire tree recursively for adding information
+ while (children.hasMoreElements()) {
+ TreeNode child = children.nextElement();
+ // Set ORIGINAL_ID for entire subTree of this node
+ child = recurse(child);
+ if (child instanceof SBase) {
+ SBase node = (SBase) child;
+ if (node.isSetId()) {
+ // add meta information model id and parent model id
+ node.putUserObject(ORIG_ID, node.getId());
+ node.putUserObject(MODEL_ID, node.getModel().getId());
+ }
+ }
+ }
+ return treeNode;
+ }
}
diff --git a/src/main/java/org/simulator/sbml/AlgebraicRuleConverter.java b/src/main/java/org/simulator/sbml/AlgebraicRuleConverter.java
index f16b6d9c..9353882d 100644
--- a/src/main/java/org/simulator/sbml/AlgebraicRuleConverter.java
+++ b/src/main/java/org/simulator/sbml/AlgebraicRuleConverter.java
@@ -46,7 +46,7 @@
/**
* This class converts the algebraic rules of a model to assignment rules based
* on the given matching.
- *
+ *
* @author Alexander Dörr
* @version $Rev$
* @since 0.9
@@ -55,22 +55,23 @@ public class AlgebraicRuleConverter {
/**
* This class represents a subterm in the equation of algebraic rules
- *
+ *
* @author Alexander Dörr
* @since 1.4
*/
private class EquationObject {
+
/**
* Contains the mathematical expression of the subterm
*/
private ASTNode node;
+
/**
* Indicates whether the subterm has to be negativ or not
*/
private boolean isNegative;
/**
- *
* @param node
* @param isNegative
*/
@@ -81,7 +82,7 @@ public EquationObject(ASTNode node, boolean isNegative) {
/**
* Returns the subterm
- *
+ *
* @return
*/
public ASTNode getNode() {
@@ -90,47 +91,54 @@ public ASTNode getNode() {
/**
* Returns a boolean whether the subterm has to be negative or not
- *
+ *
* @return
*/
public boolean isNegative() {
return isNegative;
}
-
}
+
/**
* {@link Map} representing the current matching with value of the left node
* -> value of the right node
*/
private Map matching;
+
/**
* The given SBML model
*/
private Model model;
+
/**
* ASTNodes for the node of the variable an algebraic refers to and its
* parent
*/
private ASTNode variableNodeParent, variableNode;
+
/**
* A boolean that states if the variable of an algebraic rule is linked
* additive
*/
private boolean additive = true;
+
/**
* A boolean that states if the variable of an algebraic rule can remain on
* its side
*/
private boolean remainOnSide = true;
+
/**
* The depth of nesting of the current analysed MathML expression
*/
private int nestingDepth;
+
/**
* The depth of nesting of the current analysed MathML expression
*/
private ArrayList> equationObjects;
+
/**
* The container that holds the current rule.
*/
@@ -138,7 +146,7 @@ public boolean isNegative() {
/**
* Creates a new AlgebraicRuleConverter for the given matching and model
- *
+ *
* @param model
*/
public AlgebraicRuleConverter(Map map, Model model) {
@@ -149,7 +157,7 @@ public AlgebraicRuleConverter(Map map, Model model) {
/**
* Creates an equation for the current algebraic rule on the basis of the
* evaluation and the sorted EquationObjects
- *
+ *
* @return
*/
private ASTNode buildEquation() {
@@ -163,7 +171,6 @@ private ASTNode buildEquation() {
ASTNode multiply = new ASTNode(Type.TIMES, pso);
ASTNode divide = new ASTNode(Type.DIVIDE, pso);
ASTNode node = null;
-
if (additive) {
if (!remainOnSide) {
ASTNode minus;
@@ -176,7 +183,6 @@ private ASTNode buildEquation() {
} else {
add.addChild(eo.getNode());
}
-
}
node = add;
if (multiplication.size() > 0) {
@@ -184,10 +190,8 @@ private ASTNode buildEquation() {
multiply.addChild(multiplication.get(i).getNode());
}
multiply.addChild(add);
-
node = multiply;
}
-
} else {
ASTNode minus;
for (int i = 0; i < addition.size(); i++) {
@@ -200,12 +204,9 @@ private ASTNode buildEquation() {
add.addChild(minus);
}
}
-
node = add;
if (multiplication.size() > 0) {
-
if (multiplication.size() == 1) {
-
for (int i = 0; i < multiplication.size(); i++) {
multiply.addChild(multiplication.get(i).getNode());
}
@@ -215,10 +216,8 @@ private ASTNode buildEquation() {
divide.addChild(add);
divide.addChild(multiplication.get(0).getNode());
}
-
node = divide;
}
-
}
} else {
if (!remainOnSide) {
@@ -232,30 +231,22 @@ private ASTNode buildEquation() {
} else {
add.addChild(eo.getNode());
}
-
}
node = add;
if (multiplication.size() > 0) {
-
if (multiplication.size() == 1) {
-
divide.addChild(multiplication.get(0).getNode());
divide.addChild(add);
} else {
-
for (int i = 0; i < multiplication.size(); i++) {
multiply.addChild(multiplication.get(i).getNode());
}
divide.addChild(multiply);
divide.addChild(add);
-
}
-
node = divide;
}
- }
-
- else {
+ } else {
ASTNode minus;
for (int i = 0; i < addition.size(); i++) {
eo = addition.get(i);
@@ -267,36 +258,29 @@ private ASTNode buildEquation() {
add.addChild(minus);
}
}
-
node = add;
if (multiplication.size() > 0) {
-
if (multiplication.size() == 1) {
divide.addChild(add);
divide.addChild(multiplication.get(0).getNode());
-
} else {
for (int i = 0; i < multiplication.size(); i++) {
multiply.addChild(multiplication.get(i).getNode());
}
divide.addChild(add);
divide.addChild(multiply);
-
}
-
node = divide;
}
}
}
-
return node;
-
}
/**
* Creates an assignment rule out of the given ASTNode and the Id of its
* algebraic rule
- *
+ *
* @param node
* @param rule
* @return
@@ -304,10 +288,8 @@ private ASTNode buildEquation() {
private AssignmentRule createAssignmentRule(ASTNode node, Rule rule) {
Variable variable;
AssignmentRule as = null;
-
// Search for the corresponding variable in the matching
variable = (Variable) matching.get(rule);
-
// Evaluate and reorganize the equation of the given ASTNode
if (variable != null) {
variableNodeParent = null;
@@ -325,22 +307,18 @@ private AssignmentRule createAssignmentRule(ASTNode node, Rule rule) {
nestingDepth = 0;
evaluateEquation(variableNodeParent);
//System.out.println("nesting depth: " + nestingDepth);
-
equationObjects = new ArrayList>();
equationObjects.add(new ArrayList());
equationObjects.add(new ArrayList());
-
deleteVariable();
sortEquationObjects(node, false, false, false, nestingDepth);
as.setMath(buildEquation());
-
try {
//System.out.println("after: " + as.getMath().toFormula());
} catch (SBMLException e) {
e.printStackTrace();
}
}
-
return as;
}
@@ -351,14 +329,10 @@ private AssignmentRule createAssignmentRule(ASTNode node, Rule rule) {
private void deleteVariable() {
int index;
// Node with variable has 2 children
- if ((variableNodeParent.getChildCount() == 2)
- && (variableNodeParent.getType() == Type.TIMES)) {
+ if ((variableNodeParent.getChildCount() == 2) && (variableNodeParent.getType() == Type.TIMES)) {
// Variable has a negativ sign / other child is -1
- if (variableNodeParent.getLeftChild().isMinusOne() || (variableNodeParent.getLeftChild().isUMinus() && variableNodeParent.getLeftChild().getLeftChild().isOne())
- || variableNodeParent.getRightChild().isMinusOne() || (variableNodeParent.getRightChild().isUMinus() && variableNodeParent.getRightChild().getLeftChild().isOne())) {
-
- index = variableNodeParent.getParent().getIndex(
- variableNodeParent);
+ if (variableNodeParent.getLeftChild().isMinusOne() || (variableNodeParent.getLeftChild().isUMinus() && variableNodeParent.getLeftChild().getLeftChild().isOne()) || variableNodeParent.getRightChild().isMinusOne() || (variableNodeParent.getRightChild().isUMinus() && variableNodeParent.getRightChild().getLeftChild().isOne())) {
+ index = variableNodeParent.getParent().getIndex(variableNodeParent);
((ASTNode) variableNodeParent.getParent()).removeChild(index);
}
// Other child is not -1
@@ -366,7 +340,6 @@ private void deleteVariable() {
index = variableNodeParent.getIndex(variableNode);
variableNodeParent.removeChild(index);
}
-
}
// Node with variable has multiple childs
else {
@@ -379,8 +352,7 @@ private void deleteVariable() {
* Checks if the variable of the algebraic equation has to be moved to the
* other side of the equation or not and if its connection to the rest of
* the equation is additive or multiplicative.
- *
- *
+ *
* @param node
* @return
*/
@@ -388,19 +360,16 @@ private void evaluateEquation(ASTNode node) {
if (node != null) {
if (node.getType() == Type.TIMES) {
if (node.getChildCount() == 2) {
- if (node.getLeftChild().isMinusOne() || (node.getLeftChild().isUMinus() && node.getLeftChild().getLeftChild().isOne())
- || node.getRightChild().isMinusOne() || (node.getRightChild().isUMinus() && node.getRightChild().getLeftChild().isOne())) {
+ if (node.getLeftChild().isMinusOne() || (node.getLeftChild().isUMinus() && node.getLeftChild().getLeftChild().isOne()) || node.getRightChild().isMinusOne() || (node.getRightChild().isUMinus() && node.getRightChild().getLeftChild().isOne())) {
remainOnSide = false;
} else {
additive = false;
nestingDepth++;
}
-
} else {
additive = false;
nestingDepth++;
}
-
} else if (node.getType() == Type.DIVIDE) {
additive = false;
remainOnSide = false;
@@ -410,13 +379,12 @@ private void evaluateEquation(ASTNode node) {
evaluateEquation((ASTNode) node.getParent());
}
}
-
}
/**
* Creates a list an assignment rule for every algebraic rule in the given
* model
- *
+ *
* @return rules
*/
public List getAssignmentRules() {
@@ -430,27 +398,19 @@ public List getAssignmentRules() {
} else {
System.out.println("no matching found");
}
-
-
//determine matchings for algebraic rules
-
-
-
// create for every algebraic rule an adequate assignment rule
for (int i = 0; i < model.getRuleCount(); i++) {
Rule r = model.getRule(i);
if (r instanceof AlgebraicRule) {
AlgebraicRule ar = (AlgebraicRule) r;
-
ASTNode node = ar.getMath().clone();
-
// substitute function definitions
if (model.getFunctionDefinitionCount() > 0) {
node = substituteFunctions(node, 0);
}
pso = node.getParentSBMLObject();
as = createAssignmentRule(node, ar);
-
// when assignment rule created add to the list
if (as != null) {
assignmentRules.add(as);
@@ -458,21 +418,17 @@ public List getAssignmentRules() {
}
}
}
-
return assignmentRules;
}
/**
* Replaces the names of given ASTNode's childern with the value stored in
* the given HashMaps if there is an entry in any of the HashMaps
- *
- *
+ *
* @param node
* @param varibales
*/
- private void replaceNames(ASTNode node, Map varibales,
- Map numberHash, Map nodeHash) {
-
+ private void replaceNames(ASTNode node, Map varibales, Map numberHash, Map nodeHash) {
if (node.isString()) {
if (varibales.get(node.getName()) != null) {
node.setName(varibales.get(node.getName()));
@@ -492,14 +448,13 @@ private void replaceNames(ASTNode node, Map varibales,
/**
* Searches in the given ASTNode for a node with the same name as the given
* String. Afterwards the variables variableNode and variable are set.
- *
+ *
* @param node
* @param variable
*/
private void setNodeWithVariable(ASTNode node, Variable variable) {
Enumeration> nodes = node.children();
ASTNode subnode;
-
while (nodes.hasMoreElements()) {
subnode = (ASTNode) nodes.nextElement();
if (subnode.isString()) {
@@ -511,74 +466,56 @@ private void setNodeWithVariable(ASTNode node, Variable variable) {
setNodeWithVariable(subnode, variable);
}
}
-
}
/**
* Creates EquationObjects for subterm of the rules equation and sorts them
* into ArrayLists
- *
+ *
* @param node
* @param plus
* @param times
* @param divide
*/
- private void sortEquationObjects(ASTNode node, boolean plus, boolean times,
- boolean divide, int depth) {
-
+ private void sortEquationObjects(ASTNode node, boolean plus, boolean times, boolean divide, int depth) {
// Reached an operator
- if ((depth>=0) && (node.isOperator())) {
+ if ((depth >= 0) && (node.isOperator())) {
if (node.getType() == Type.PLUS) {
for (int i = 0; i < node.getChildCount(); i++) {
- sortEquationObjects(node.getChild(i), true, false, false, depth-1);
+ sortEquationObjects(node.getChild(i), true, false, false, depth - 1);
}
} else if (node.getType() == Type.MINUS) {
-
for (int i = 0; i < node.getChildCount(); i++) {
- sortEquationObjects(node.getChild(i), true, true, false, depth-1);
+ sortEquationObjects(node.getChild(i), true, true, false, depth - 1);
}
} else if (node.getType() == Type.TIMES) {
if (node.getChildCount() == 2) {
- if (((node.getLeftChild().isMinusOne()) || ((node.getLeftChild().isUMinus()) && (node.getLeftChild().getLeftChild().isOne())))
- && (! (node.getRightChild().isMinusOne() || ((node.getRightChild().isUMinus()) && (node.getRightChild().getLeftChild().isOne()))))) {
- sortEquationObjects(node.getRightChild(), true, true,
- false, depth-1);
- }
-
- else if (!((node.getLeftChild().isMinusOne()) || ((node.getLeftChild().isUMinus()) && (node.getLeftChild().getLeftChild().isOne())))
- && ((node.getRightChild().isMinusOne()) || ((node.getRightChild().isUMinus()) && (node.getRightChild().getLeftChild().isOne())))) {
- sortEquationObjects(node.getLeftChild(), true, true,
- false, depth-1);
+ if (((node.getLeftChild().isMinusOne()) || ((node.getLeftChild().isUMinus()) && (node.getLeftChild().getLeftChild().isOne()))) && (!(node.getRightChild().isMinusOne() || ((node.getRightChild().isUMinus()) && (node.getRightChild().getLeftChild().isOne()))))) {
+ sortEquationObjects(node.getRightChild(), true, true, false, depth - 1);
+ } else if (!((node.getLeftChild().isMinusOne()) || ((node.getLeftChild().isUMinus()) && (node.getLeftChild().getLeftChild().isOne()))) && ((node.getRightChild().isMinusOne()) || ((node.getRightChild().isUMinus()) && (node.getRightChild().getLeftChild().isOne())))) {
+ sortEquationObjects(node.getLeftChild(), true, true, false, depth - 1);
} else {
- equationObjects.get(1).add(
- new EquationObject(node.clone(), false));
+ equationObjects.get(1).add(new EquationObject(node.clone(), false));
}
-
} else {
- equationObjects.get(1).add(
- new EquationObject(node.clone(), false));
+ equationObjects.get(1).add(new EquationObject(node.clone(), false));
}
-
}
-
}
// Reached a variable
else {
if (plus && times) {
- equationObjects.get(0).add(
- new EquationObject(node.clone(), true));
+ equationObjects.get(0).add(new EquationObject(node.clone(), true));
} else if (plus) {
- equationObjects.get(0).add(
- new EquationObject(node.clone(), false));
+ equationObjects.get(0).add(new EquationObject(node.clone(), false));
}
}
-
}
/**
* Replaces all functions in the given ASTNode with the function definition
* and its arguments
- *
+ *
* @param node
* @param indexParent
*/
@@ -593,9 +530,7 @@ private ASTNode substituteFunctions(ASTNode node, int indexParent) {
HashMap nameHash = new HashMap();
HashMap numberHash = new HashMap();
HashMap nodeHash = new HashMap();
-
ASTNode parent;
-
// Hash its variables to the parameter
for (int i = 0; i < node.getChildCount(); i++) {
variable = null;
@@ -606,46 +541,35 @@ private ASTNode substituteFunctions(ASTNode node, int indexParent) {
}
}
if (variable instanceof FunctionDefinition) {
- nodeHash.put(function.getChild(i).getName(), node
- .getChild(i).clone());
+ nodeHash.put(function.getChild(i).getName(), node.getChild(i).clone());
} else if (node.getChild(i).isOperator()) {
- nodeHash.put(function.getChild(i).getName(), node
- .getChild(i).clone());
+ nodeHash.put(function.getChild(i).getName(), node.getChild(i).clone());
} else if (node.getChild(i).isString()) {
- nameHash.put(function.getChild(i).getName(), node
- .getChild(i).getName());
+ nameHash.put(function.getChild(i).getName(), node.getChild(i).getName());
} else if (node.getChild(i).isNumber()) {
if (node.getChild(i).isInteger()) {
- numberHash.put(function.getChild(i).getName(),
- (double) node.getChild(i).getInteger());
+ numberHash.put(function.getChild(i).getName(), (double) node.getChild(i).getInteger());
} else {
- numberHash.put(function.getChild(i).getName(),
- node.getChild(i).getReal());
+ numberHash.put(function.getChild(i).getName(), node.getChild(i).getReal());
}
}
}
if (node.getParent() instanceof ASTNode) {
parent = (ASTNode) node.getParent();
- }
- else {
+ } else {
parent = null;
}
// Function definition is child
if (parent != null) {
// System.out.println(parent.getType());
-
// Replace the reference to a function definition with the
// function definition itself
- parent.replaceChild(indexParent, function.getRightChild()
- .clone());
+ parent.replaceChild(indexParent, function.getRightChild().clone());
// Substitute the variables with the parameter
- replaceNames(parent.getChild(indexParent), nameHash,
- numberHash, nodeHash);
-
+ replaceNames(parent.getChild(indexParent), nameHash, numberHash, nodeHash);
// Replaced arguments could contain additional functions, so
// start at the parent again
node = parent;
-
}
// Function definiton is root
else {
@@ -657,13 +581,10 @@ private ASTNode substituteFunctions(ASTNode node, int indexParent) {
}
}
}
-
// Move on with its children
for (int i = 0; i < node.getChildCount(); i++) {
substituteFunctions(node.getChild(i), i);
}
-
return node;
}
-
}
diff --git a/src/main/java/org/simulator/sbml/ConstraintEvent.java b/src/main/java/org/simulator/sbml/ConstraintEvent.java
index 3542dd12..b616ebcb 100644
--- a/src/main/java/org/simulator/sbml/ConstraintEvent.java
+++ b/src/main/java/org/simulator/sbml/ConstraintEvent.java
@@ -31,7 +31,7 @@
/**
* This class represents the violation of a {@link Constraint} during
* simulation.
- *
+ *
* @author Alexander Dörr
* @author Andreas Dräger
* @version $Rev$
@@ -52,11 +52,9 @@ public class ConstraintEvent extends EventObject {
/**
* Creates a new {@link ConstraintEvent} for the given {@link Constraint}
* and the given point in time.
- *
- * @param source
- * the {@link Constraint}, whose condition has been violated.
- * @param violationTime
- * the simulation time, at which the violation occurred.
+ *
+ * @param source the {@link Constraint}, whose condition has been violated.
+ * @param violationTime the simulation time, at which the violation occurred.
*/
public ConstraintEvent(Constraint source, double violationTime) {
super(source);
@@ -77,5 +75,4 @@ public double getTime() {
public Constraint getSource() {
return (Constraint) super.getSource();
}
-
}
diff --git a/src/main/java/org/simulator/sbml/ConstraintListener.java b/src/main/java/org/simulator/sbml/ConstraintListener.java
index 3fd788cc..8e9ca9a8 100644
--- a/src/main/java/org/simulator/sbml/ConstraintListener.java
+++ b/src/main/java/org/simulator/sbml/ConstraintListener.java
@@ -31,7 +31,7 @@
/**
* A listener interface that allows the processing of {@link Constraint}s that
* triggered during simulation.
- *
+ *
* @author Alexander Dörr
* @author Andreas Dräger
* @version $Rev$
@@ -41,9 +41,8 @@ public interface ConstraintListener extends EventListener {
/**
* Processes the given {@link ConstraintEvent}.
- *
+ *
* @param evt
*/
public abstract void processViolation(ConstraintEvent evt);
-
}
diff --git a/src/main/java/org/simulator/sbml/SBMLEventInProgress.java b/src/main/java/org/simulator/sbml/SBMLEventInProgress.java
index b34acb2e..507ddb94 100644
--- a/src/main/java/org/simulator/sbml/SBMLEventInProgress.java
+++ b/src/main/java/org/simulator/sbml/SBMLEventInProgress.java
@@ -36,7 +36,7 @@
* This class represents a compilation of all information calculated during
* simulation concerning events in SBML.
* It can also contain the math of the trigger, the priority and the delay.
- *
+ *
* @author Alexander Dörr
* @version $Rev$
* @since 0.9
@@ -51,7 +51,7 @@ public class SBMLEventInProgress extends EventInProgress {
/**
* The event assignments
*/
- protected Map assignments;
+ protected Map assignments;
/**
* The trigger of the event
@@ -86,7 +86,7 @@ public class SBMLEventInProgress extends EventInProgress {
/**
* Creates a new EventInProcess with the given boolean value indicating
* whether or not it can fire at the initial time point.
- *
+ *
* @param fired
*/
public SBMLEventInProgress(boolean fired) {
@@ -106,17 +106,16 @@ public void refresh(boolean fired) {
/**
* Change the priority.
- *
+ *
* @param priority
*/
public void changePriority(double priority) {
this.priority = priority;
}
-
/**
* Return the priority of the associated event.
- *
+ *
* @return priority
*/
public Double getPriority() {
@@ -125,6 +124,7 @@ public Double getPriority() {
/**
* Sets the math of the trigger to a specific ASTNodeObject.
+ *
* @param triggerObject
*/
public void setTriggerObject(ASTNodeValue triggerObject) {
@@ -132,7 +132,6 @@ public void setTriggerObject(ASTNodeValue triggerObject) {
}
/**
- *
* @return the trigger object of the event as an ASTNodeObject
*/
public ASTNodeValue getTriggerObject() {
@@ -141,6 +140,7 @@ public ASTNodeValue getTriggerObject() {
/**
* Sets the math of the priority to a specific ASTNodeObject.
+ *
* @param priorityObject
*/
public void setPriorityObject(ASTNodeValue priorityObject) {
@@ -148,7 +148,6 @@ public void setPriorityObject(ASTNodeValue priorityObject) {
}
/**
- *
* @return priorityObject the priority object of the event as an ASTNodeObject
*/
public ASTNodeValue getPriorityObject() {
@@ -157,6 +156,7 @@ public ASTNodeValue getPriorityObject() {
/**
* Sets the math of the delay to a specific ASTNodeObject.
+ *
* @param delayObject
*/
public void setDelayObject(ASTNodeValue delayObject) {
@@ -164,7 +164,6 @@ public void setDelayObject(ASTNodeValue delayObject) {
}
/**
- *
* @return delayObject the delay object of the event as an ASTNodeObject (null if there is no delay)
*/
public ASTNodeValue getDelayObject() {
@@ -173,6 +172,7 @@ public ASTNodeValue getDelayObject() {
/**
* Adds the math of an assignment rule as an AssignmentRuleObject.
+ *
* @param assignmentRuleObject
*/
public void addRuleObject(AssignmentRuleValue assignmentRuleObject) {
@@ -183,7 +183,6 @@ public void addRuleObject(AssignmentRuleValue assignmentRuleObject) {
}
/**
- *
* @return ruleObjects the list of the assignment rules as AssignmentRuleObjects
*/
public List getRuleObjects() {
@@ -192,6 +191,7 @@ public List getRuleObjects() {
/**
* Returns true if the values of the assignments are calculated at the trigger time of the event, otherwise false.
+ *
* @return useValuesFromTriggerTime
*/
public boolean getUseValuesFromTriggerTime() {
@@ -200,15 +200,14 @@ public boolean getUseValuesFromTriggerTime() {
/**
* Sets the useValuesFromTriggerTime value of the event.
+ *
* @param useValuesFromTriggerTime
*/
public void setUseValuesFromTriggerTime(boolean useValuesFromTriggerTime) {
this.useValuesFromTriggerTime = useValuesFromTriggerTime;
-
}
/**
- *
* @return numAssignments the number of assignments of the event
*/
public int getNumEventAssignments() {
@@ -216,7 +215,6 @@ public int getNumEventAssignments() {
}
/**
- *
* @return persistent? the persistent flag of the event.
*/
public boolean getPersistent() {
@@ -225,6 +223,7 @@ public boolean getPersistent() {
/**
* Sets the persistent flag of the event.
+ *
* @param persistent
*/
public void setPersistent(boolean persistent) {
@@ -239,5 +238,4 @@ public void clearRuleObjects() {
ruleObjects.clear();
}
}
-
}
diff --git a/src/main/java/org/simulator/sbml/SBMLEventInProgressWithDelay.java b/src/main/java/org/simulator/sbml/SBMLEventInProgressWithDelay.java
index 58d42d1d..9416052d 100644
--- a/src/main/java/org/simulator/sbml/SBMLEventInProgressWithDelay.java
+++ b/src/main/java/org/simulator/sbml/SBMLEventInProgressWithDelay.java
@@ -30,7 +30,7 @@
* This class represents a compilation of all information calculated during
* simulation concerning events in SBML. An {@link SBMLEventInProgressWithDelay}
* especially stands for an event with delay.
- *
+ *
* @author Alexander Dörr
* @version $Rev$
* @since 0.9
@@ -50,13 +50,13 @@ public class SBMLEventInProgressWithDelay extends SBMLEventInProgress {
/**
* Creates a new SBMLEventInProcessWithDelay with the given boolean value
* indicating whether or not it can fire at time point 0d.
- *
+ *
* @param fired
*/
public SBMLEventInProgressWithDelay(boolean fired) {
super(fired);
- previousExecutionTimes = new LinkedList ();
- previousExecutionValues = new LinkedList ();
+ previousExecutionTimes = new LinkedList();
+ previousExecutionValues = new LinkedList();
}
/*
@@ -66,8 +66,8 @@ public SBMLEventInProgressWithDelay(boolean fired) {
@Override
public void refresh(boolean fired) {
super.refresh(fired);
- previousExecutionTimes = new LinkedList ();
- previousExecutionValues = new LinkedList ();
+ previousExecutionTimes = new LinkedList();
+ previousExecutionValues = new LinkedList();
}
/*
@@ -90,7 +90,6 @@ public void addValues(Double[] values, double time) {
index = insertTime(time);
execTimes.add(index, time);
this.values.add(index, values);
-
}
/*
@@ -109,7 +108,7 @@ public void executed(double time) {
* Due to the fact that events with delay can trigger multiple times before
* execution, the time of execution and the corresponding values have to be
* inserted at the chronological correct position in the list.
- *
+ *
* @param time
* @return the index where time has been inserted
*/
@@ -117,15 +116,12 @@ private int insertTime(double time) {
if (execTimes.isEmpty()) {
return 0;
}
-
for (int i = 0; i < execTimes.size(); i++) {
if (time < execTimes.get(i)) {
return i;
}
}
-
return execTimes.size();
-
}
/* (non-Javadoc)
@@ -133,13 +129,13 @@ private int insertTime(double time) {
*/
@Override
public void refresh(double currentTime) {
- if ( lastTimeFired > currentTime) {
+ if (lastTimeFired > currentTime) {
execTimes.pollLast();
values.pollLast();
recovered(currentTime);
lastTimeFired = -1;
} else {
- while((previousExecutionTimes.peekLast() != null) && (previousExecutionTimes.peekLast() > currentTime)) {
+ while ((previousExecutionTimes.peekLast() != null) && (previousExecutionTimes.peekLast() > currentTime)) {
double time = previousExecutionTimes.pollLast();
int index = insertTime(time);
execTimes.add(index, time);
@@ -153,5 +149,4 @@ public void refresh(double currentTime) {
}
}
}
-
}
diff --git a/src/main/java/org/simulator/sbml/SBMLValueHolder.java b/src/main/java/org/simulator/sbml/SBMLValueHolder.java
index c225fc7e..216e824f 100644
--- a/src/main/java/org/simulator/sbml/SBMLValueHolder.java
+++ b/src/main/java/org/simulator/sbml/SBMLValueHolder.java
@@ -41,7 +41,7 @@
* to the current simulation time. In this way, it is possible to separate
* the interpretation and simulation of a {@link Model} from the pure evaluation
* of {@link ASTNode}s.
- *
+ *
* @author Andreas Dräger
* @author Roland Keller
* @version $Rev$
@@ -51,6 +51,7 @@ public interface SBMLValueHolder extends DelayValueHolder, Serializable {
/**
* Returns the size of the compartment with the given id.
+ *
* @param id
* @return compartmentSize
*/
@@ -58,6 +59,7 @@ public interface SBMLValueHolder extends DelayValueHolder, Serializable {
/**
* Returns the size of the compartment of the species with the given id.
+ *
* @param speciesId
* @return compartmentValue
*/
@@ -65,6 +67,7 @@ public interface SBMLValueHolder extends DelayValueHolder, Serializable {
/**
* Returns the value of the parameter with the given id.
+ *
* @param id
* @return parameterValue
*/
@@ -72,6 +75,7 @@ public interface SBMLValueHolder extends DelayValueHolder, Serializable {
/**
* Returns the value of the species with the given id.
+ *
* @param id
* @return speciesValue
*/
@@ -79,6 +83,7 @@ public interface SBMLValueHolder extends DelayValueHolder, Serializable {
/**
* Returns the value of the stoichiometry of the species reference with the given id.
+ *
* @param id
* @return stoichiometry
*/
@@ -86,12 +91,14 @@ public interface SBMLValueHolder extends DelayValueHolder, Serializable {
/**
* Returns the current simulation time.
+ *
* @return time
*/
public double getCurrentTime();
/**
* Returns the current value of the SBase with the given id.
+ *
* @param id
* @return value
*/
@@ -99,9 +106,9 @@ public interface SBMLValueHolder extends DelayValueHolder, Serializable {
/**
* Returns the current value of the Y vector at the given position.
+ *
* @param position
* @return value
*/
public double getCurrentValueOf(int position);
-
}
diff --git a/src/main/java/org/simulator/sbml/SBMLinterpreter.java b/src/main/java/org/simulator/sbml/SBMLinterpreter.java
index 38dc494d..d5ab8eeb 100644
--- a/src/main/java/org/simulator/sbml/SBMLinterpreter.java
+++ b/src/main/java/org/simulator/sbml/SBMLinterpreter.java
@@ -24,6 +24,8 @@
*/
package org.simulator.sbml;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
@@ -97,7 +99,7 @@
* {@link AbstractDESSolver}. Therefore, this class implements all necessary
* functions expected by SBML.
*
- *
+ *
* @author Alexander Dörr
* @author Andreas Dräger
* @author Roland Keller
@@ -105,8 +107,9 @@
* @version $Rev$
* @since 0.9
*/
-public class SBMLinterpreter implements DelayedDESystem, EventDESystem,
-FastProcessDESystem, RichDESystem, SBMLValueHolder {
+public class SBMLinterpreter
+ implements DelayedDESystem, EventDESystem, FastProcessDESystem,
+ RichDESystem, SBMLValueHolder, PropertyChangeListener {
/**
* A {@link Logger}.
@@ -176,13 +179,20 @@ public class SBMLinterpreter implements DelayedDESystem, EventDESystem,
*/
private List listOfConstraintListeners;
+ /**
+ * An array that stores derivatives of each species in the model system at
+ * current time.
+ */
+ public double[] changeRate;
+
+
/**
* Adds the given {@link ConstraintListener} to this interpreter's list of
* listeners.
- *
+ *
* @param listener the element to be added.
* @return {@code true} if this operation was successful, {@code false}
- * otherwise.
+ * otherwise.
* @throws NullPointerException
* @see List#add(Object)
*/
@@ -190,13 +200,13 @@ public boolean addConstraintListener(ConstraintListener listener) {
return listOfConstraintListeners.add(listener);
}
+
/**
* Removes the given {@link ConstraintListener} from this interpreter.
- *
- * @param listener
- * the element to be removed.
+ *
+ * @param listener the element to be removed.
* @return {@code true} if this operation was successful, {@code false}
- * otherwise.
+ * otherwise.
* @throws NullPointerException
* @see List#remove(Object)
*/
@@ -204,14 +214,14 @@ public boolean removeConstraintListener(ConstraintListener listener) {
return listOfConstraintListeners.remove(listener);
}
+
/**
* Removes the {@link ConstraintListener} with the given index from this
* interpreter.
- *
- * @param index
- * of the {@link ConstraintListener} to be removed.
+ *
+ * @param index of the {@link ConstraintListener} to be removed.
* @return {@code true} if this operation was successful, {@code false}
- * otherwise.
+ * otherwise.
* @throws IndexOutOfBoundsException
* @see List#remove(int)
*/
@@ -219,14 +229,16 @@ public ConstraintListener removeConstraintListener(int index) {
return listOfConstraintListeners.remove(index);
}
+
/**
* @return the number of {@link ConstraintListener}s currently assigned to
- * this interpreter.
+ * this interpreter.
*/
public int getConstraintListenerCount() {
return listOfConstraintListeners.size();
}
+
/**
* The model to be simulated.
*/
@@ -240,6 +252,14 @@ public int getConstraintListenerCount() {
*/
private Map symbolHash;
+ /**
+ * Hashes the id of all {@link Compartment}s, {@link Species}, global
+ * {@link Parameter}s, and, if necessary, {@link SpeciesReference}s in
+ * {@link RateRule}s to an boolean object which contains whether it is
+ * constant or not
+ */
+ private Map constantHash;
+
/**
* An array of strings that memorizes at each position the identifier of the
* corresponding element in the Y array.
@@ -339,7 +359,6 @@ public int getConstraintListenerCount() {
*/
private List assignmentRulesRoots;
-
/**
* List of the rate rules (as RateRuleObjects)
*/
@@ -380,13 +399,11 @@ public int getConstraintListenerCount() {
*/
private int nAssignmentRules;
-
/**
* List of the {@link InitialAssignment} (as {@link AssignmentRuleValue} objects)
*/
private List initialAssignmentRoots;
-
/**
* Flag which is true if no changes (in rate rules and kinetic laws) are occuring in the model
*/
@@ -402,7 +419,6 @@ public int getConstraintListenerCount() {
*/
private int[] compartmentIndexes;
-
/**
* Are the stoichiometries in the stoichiometry values set?
*/
@@ -448,7 +464,6 @@ public int getConstraintListenerCount() {
*/
private boolean delaysIncluded;
-
/**
* The number of repetitions for the processing of assignment rules
*/
@@ -466,6 +481,17 @@ public int getConstraintListenerCount() {
private boolean containsDelays;
+ /**
+ * The value of the last time point processed
+ */
+ private double latestTimePoint;
+
+ /**
+ * An array of the concentration of each species at last processed time point
+ * within the model system.
+ */
+ private double[] latestTimePointResult;
+
/**
*
@@ -477,18 +503,18 @@ public int getConstraintListenerCount() {
*
* Note that currently, units are not considered.
*
- *
+ *
* @param model
* @throws ModelOverdeterminedException
* @throws SBMLException
*/
- public SBMLinterpreter(Model model) throws ModelOverdeterminedException,
- SBMLException {
+ public SBMLinterpreter(Model model)
+ throws ModelOverdeterminedException, SBMLException {
this(model, 0d, 1d, 1d);
}
+
/**
- *
* @param model
* @param defaultSpeciesValue
* @param defaultParameterValue
@@ -496,31 +522,30 @@ public SBMLinterpreter(Model model) throws ModelOverdeterminedException,
* @throws SBMLException
* @throws ModelOverdeterminedException
*/
- public SBMLinterpreter(Model model, double defaultSpeciesValue, double defaultParameterValue, double defaultCompartmentValue) throws SBMLException, ModelOverdeterminedException {
+ public SBMLinterpreter(Model model, double defaultSpeciesValue, double defaultParameterValue, double defaultCompartmentValue)
+ throws SBMLException, ModelOverdeterminedException {
this(model, 0d, 1d, 1d, null);
}
+
/**
* Creates a new {@link SBMLinterpreter}
- *
- * @param model
- * the model to interpret
- * @param defaultSpeciesValue
- * the default value for species, if no value is given
- * @param defaultParameterValue
- * the default value for parameters, if no value is given
- * @param defaultCompartmentValue
- * the default value for compartments, if no value is given
- * @param amountHash
- * a hash that states for the species in the model, whether their
- * amount or their concentration should be computed
+ *
+ * @param model the model to interpret
+ * @param defaultSpeciesValue the default value for species, if no value is given
+ * @param defaultParameterValue the default value for parameters, if no value is given
+ * @param defaultCompartmentValue the default value for compartments, if no value is given
+ * @param amountHash a hash that states for the species in the model, whether their
+ * amount or their concentration should be computed
* @throws SBMLException
* @throws ModelOverdeterminedException
*/
- public SBMLinterpreter(Model model, double defaultSpeciesValue, double defaultParameterValue, double defaultCompartmentValue, Map amountHash) throws SBMLException, ModelOverdeterminedException {
+ public SBMLinterpreter(Model model, double defaultSpeciesValue, double defaultParameterValue, double defaultCompartmentValue, Map amountHash)
+ throws SBMLException, ModelOverdeterminedException {
this.model = model;
v = new double[this.model.getListOfReactions().size()];
symbolHash = new HashMap();
+ constantHash = new HashMap();
compartmentHash = new HashMap();
stoichiometricCoefHash = new HashMap();
nodeInterpreter = new ASTNodeInterpreter(this);
@@ -529,7 +554,6 @@ public SBMLinterpreter(Model model, double defaultSpeciesValue, double defaultP
highOrderEvents = new LinkedList();
delaysIncluded = true;
listOfConstraintListeners = new LinkedList();
-
Map speciesReferenceToRateRule = new HashMap();
int speciesReferencesInRateRules = 0;
for (int k = 0; k < model.getRuleCount(); k++) {
@@ -543,46 +567,46 @@ public SBMLinterpreter(Model model, double defaultSpeciesValue, double defaultP
}
}
}
- Y = new double[model.getCompartmentCount() + model.getSpeciesCount()
- + model.getParameterCount() + speciesReferencesInRateRules];
+ Y = new double[model.getCompartmentCount() + model.getSpeciesCount() + model.getParameterCount() + speciesReferencesInRateRules];
oldY = new double[Y.length];
oldY2 = new double[Y.length];
-
+ changeRate = new double[Y.length];
isAmount = new boolean[Y.length];
compartmentIndexes = new int[Y.length];
conversionFactors = new double[Y.length];
inConcentrationValues = new boolean[Y.length];
Arrays.fill(conversionFactors, 1d);
symbolIdentifiers = new String[Y.length];
-
speciesMap = new HashMap();
inConcentration = new HashSet();
reactionFast = new boolean[model.getReactionCount()];
reactionReversible = new boolean[model.getReactionCount()];
initialValues = new double[Y.length];
nodes = new LinkedList();
+ latestTimePoint = 0d;
+ latestTimePointResult = new double[Y.length];
init(true, defaultSpeciesValue, defaultParameterValue, defaultCompartmentValue, amountHash);
}
- /* (non-Javadoc)
- * @see org.sbml.simulator.math.odes.FastProcessDESystem#containsFastProcesses()
+ /**
+ * {@inheritDoc}
*/
@Override
public boolean containsFastProcesses() {
return hasFastReactions;
}
+
/**
* Due to missing information about the attributes of {@link Species} set by
* {@link InitialAssignment}s, a majority vote of all other species is
* performed to determine the attributes.
- *
+ *
* @return
*/
private Species determineMajorSpeciesAttributes() {
Species majority = new Species(2, 4);
int concentration = 0, amount = 0, substanceUnits = 0;
-
for (Species species : model.getListOfSpecies()) {
if (species.isSetInitialAmount()) {
amount++;
@@ -598,36 +622,34 @@ private Species determineMajorSpeciesAttributes() {
} else {
majority.setInitialConcentration(0.0d);
}
-
if (substanceUnits > (model.getSpeciesCount() - substanceUnits)) {
majority.setHasOnlySubstanceUnits(true);
} else {
majority.setHasOnlySubstanceUnits(false);
}
return majority;
-
}
+
/**
* Evaluates the algebraic rules of the given model to assignment rules
- *
- * @param ar
- * @param changeRate
+ *
* @throws ModelOverdeterminedException
*/
private void evaluateAlgebraicRules() throws ModelOverdeterminedException {
OverdeterminationValidator odv = new OverdeterminationValidator(model);
// model has not to be overdetermined (violation of the SBML
// specifications)
- if (odv.isOverdetermined()) { throw new ModelOverdeterminedException(); }
+ if (odv.isOverdetermined()) {
+ throw new ModelOverdeterminedException();
+ }
// create assignment rules out of the algebraic rules
- AlgebraicRuleConverter arc = new AlgebraicRuleConverter(odv.getMatching(),
- model);
+ AlgebraicRuleConverter arc = new AlgebraicRuleConverter(odv.getMatching(), model);
algebraicRules = arc.getAssignmentRules();
}
- /* (non-Javadoc)
- * @see eva2.tools.math.des.RichDESystem#getIntermediateIds()
+ /**
+ * {@inheritDoc}
*/
@Override
public String[] getAdditionalValueIds() {
@@ -639,14 +661,13 @@ public String[] getAdditionalValueIds() {
return ids;
}
- /* (non-Javadoc)
- * @see eva2.tools.math.des.RichDESystem#getIntermediates(double, double[])
+ /**
+ * {@inheritDoc}
*/
@Override
public double[] getAdditionalValues(double t, double[] Y)
throws DerivativeException {
- if ((t - currentTime > 1E-15)
- || ((Y != this.Y) && !Arrays.equals(Y, this.Y)) || (t == 0)) {
+ if ((t - currentTime > 1E-15) || ((Y != this.Y) && !Arrays.equals(Y, this.Y)) || (t == 0)) {
/*
* We have to compute the system for the given state. But we are not
* interested in the rates of change, but only in the reaction velocities.
@@ -661,56 +682,52 @@ public double[] getAdditionalValues(double t, double[] Y)
/**
* Checks if the given symbol id refers to a {@link Species} and returns the
* value of its {@link Compartment} or 1d otherwise
- *
+ *
* @param speciesId
* @return compartmentValue
*/
@Override
public double getCurrentCompartmentValueOf(String speciesId) {
Integer compartmentIndex = compartmentHash.get(speciesId);
-
if (compartmentIndex != null) {
// Is species with compartment
-
double value = Y[compartmentIndex.intValue()];
- if (value != 0d) { return value; }
-
+ if (value != 0d) {
+ return value;
+ }
// Is compartment or parameter or there is no compartment for this
// species
// TODO: Replace by user-defined default value?
}
-
return 1d;
}
- /*
- * (non-Javadoc)
- * @see org.simulator.sbml.ValueHolder#getCurrentCompartmentSize(java.lang.String)
+ /**
+ * {@inheritDoc}
*/
@Override
public double getCurrentCompartmentSize(String id) {
return Y[symbolHash.get(id)];
}
- /*
- * (non-Javadoc)
- * @see org.simulator.sbml.ValueHolder#getCurrentParameterValue(java.lang.String)
+ /**
+ * {@inheritDoc}
*/
@Override
public double getCurrentParameterValue(String id) {
return Y[symbolHash.get(id)];
}
- /* (non-Javadoc)
- * @see org.sbml.simulator.math.ValueHolder#getSpeciesValue()
+ /**
+ * {@inheritDoc}
*/
@Override
public double getCurrentSpeciesValue(String id) {
return Y[symbolHash.get(id)];
}
- /* (non-Javadoc)
- * @see org.sbml.simulator.math.ValueHolder#getCurrentStoichiometry()
+ /**
+ * {@inheritDoc}
*/
@Override
@SuppressWarnings("deprecation")
@@ -723,18 +740,14 @@ public double getCurrentStoichiometry(String id) {
if (value != null) {
return value;
}
-
// TODO: What happens if a species reference does not have an id?
SpeciesReference sr = model.findSpeciesReference(id);
-
if ((sr != null) && sr.isSetStoichiometryMath()) {
try {
return ((ASTNodeValue) sr.getStoichiometryMath().getMath().getUserObject(TEMP_VALUE)).compileDouble(astNodeTime, 0d);
} catch (SBMLException exc) {
// TODO: Localize
- logger.log(Level.WARNING, MessageFormat.format(
- "Could not compile stoichiometry math of species reference {0}.", id),
- exc);
+ logger.log(Level.WARNING, MessageFormat.format("Could not compile stoichiometry math of species reference {0}.", id), exc);
}
} else if (sr != null) {
return sr.getStoichiometry();
@@ -742,40 +755,35 @@ public double getCurrentStoichiometry(String id) {
return 1d;
}
- /* (non-Javadoc)
- * @see org.apache.commons.math.ode.FirstOrderDifferentialEquations#getDimension ()
+ /**
+ * {@inheritDoc}
*/
@Override
public int getDimension() {
return initialValues.length;
}
- /* (non-Javadoc)
- * @see org.sbml.simulator.math.odes.EventDESystem#getEventAssignments(double, double[])
+ /**
+ * {@inheritDoc}
*/
@Override
public EventInProgress getNextEventAssignments(double t, double previousTime, double[] Y)
throws DerivativeException {
-
if (!modelHasEvents) {
return null;
}
-
// change Y because of different priorities and reevaluation of
// trigger/priority after the execution of events
System.arraycopy(Y, 0, this.Y, 0, Y.length);
currentTime = t;
-
Double priority, execTime = 0d;
astNodeTime += 0.01;
Double triggerTimeValues[];
Event ev;
int i = 0, index;
Boolean persistent, aborted;
- boolean hasNewDelayedEvents=false;
-
+ boolean hasNewDelayedEvents = false;
try {
-
// recheck trigger of events that have fired for this point in time
// but have not been executed yet
priorities.clear();
@@ -788,19 +796,19 @@ public EventInProgress getNextEventAssignments(double t, double previousTime, do
}
persistent = events[index].getPersistent();
if (!persistent) {
- if (!events[index].getTriggerObject().compileBoolean(astNodeTime)) {
+ if (events[index].getTriggerObject().compileDouble(astNodeTime, 0d) == 0d) {
runningEvents.remove(i);
events[index].aborted(currentTime);
i--;
} else {
- ASTNodeValue priorityObject=events[index].getPriorityObject();
+ ASTNodeValue priorityObject = events[index].getPriorityObject();
if (priorityObject != null) {
events[index].changePriority(priorityObject.compileDouble(astNodeTime, 0d));
priorities.add(events[index].getPriority());
}
}
} else {
- ASTNodeValue priorityObject=events[index].getPriorityObject();
+ ASTNodeValue priorityObject = events[index].getPriorityObject();
if (priorityObject != null) {
events[index].changePriority(priorityObject.compileDouble(astNodeTime, 0d));
priorities.add(events[index].getPriority());
@@ -808,7 +816,6 @@ public EventInProgress getNextEventAssignments(double t, double previousTime, do
}
i++;
}
-
i = 0;
// check events that have fired at an earlier point in time but have
// not been executed yet due to a delay
@@ -816,31 +823,26 @@ public EventInProgress getNextEventAssignments(double t, double previousTime, do
index = delayedEvents.get(i);
ev = model.getEvent(index);
aborted = false;
-
- if (events[index].getLastTimeFired()>currentTime) {
+ if (events[index].getLastTimeFired() > currentTime) {
delayedEvents.remove(i);
events[index].refresh(currentTime);
i--;
aborted = true;
- }
- else if ((events[index].getLastTimeFired()<=currentTime) && (events[index].getLastTimeExecuted()>previousTime) && (events[index].getLastTimeExecuted()!=currentTime)) {
+ } else if ((events[index].getLastTimeFired() <= currentTime) && (events[index].getLastTimeExecuted() > previousTime) && (events[index].getLastTimeExecuted() != currentTime)) {
events[index].refresh(previousTime);
}
-
persistent = ev.getTrigger().getPersistent();
if (!persistent && !aborted) {
- if (!events[index].getTriggerObject().compileBoolean(astNodeTime)) {
+ if (events[index].getTriggerObject().compileDouble(astNodeTime, 0d) == 0d) {
//delayedEvents.remove(i);
events[index].aborted(currentTime);
//i--;
aborted = true;
}
}
-
if ((events[index].hasExecutionTime()) && (events[index].getTime() <= currentTime) && !aborted) {
if (ev.getPriority() != null) {
priority = events[index].getPriorityObject().compileDouble(astNodeTime, 0d);
-
if (!priorities.contains(priority)) {
priorities.add(priority);
}
@@ -849,134 +851,129 @@ else if ((events[index].getLastTimeFired()<=currentTime) && (events[index].getLa
runningEvents.add(index);
//delayedEvents.remove(i);
//i--;
-
}
i++;
}
-
// check the trigger of all events in the model
for (i = 0; i < events.length; i++) {
- if (events[i].getTriggerObject().compileBoolean(astNodeTime)) {
- // event has not fired recently -> can fire
- if (!events[i].getFireStatus(currentTime)) {
- execTime = currentTime;
- // event has a delay
- ASTNodeValue delayObject = events[i].getDelayObject();
- if (delayObject != null) {
- execTime += delayObject.compileDouble(astNodeTime, 0d);
- if (!delayedEvents.contains(i)) {
- delayedEvents.add(i);
- }
- hasNewDelayedEvents=true;
- } else {
- ASTNodeValue priorityObject = events[i].getPriorityObject();
- if (priorityObject != null) {
- priority = events[i].getPriorityObject().compileDouble(astNodeTime, 0d);
- priorities.add(priority);
- events[i].changePriority(priority);
+ if (events[i] != null) {
+ if (events[i].getTriggerObject().compileDouble(astNodeTime, 0d) != 0d) {
+ // event has not fired recently -> can fire
+ if (!events[i].getFireStatus(currentTime)) {
+ execTime = currentTime;
+ // event has a delay
+ ASTNodeValue delayObject = events[i].getDelayObject();
+ if (delayObject != null) {
+ execTime += delayObject.compileDouble(astNodeTime, 0d);
+ if (!delayedEvents.contains(i)) {
+ delayedEvents.add(i);
+ }
+ hasNewDelayedEvents = true;
+ } else {
+ ASTNodeValue priorityObject = events[i].getPriorityObject();
+ if (priorityObject != null) {
+ priority = events[i].getPriorityObject().compileDouble(astNodeTime, 0d);
+ priorities.add(priority);
+ events[i].changePriority(priority);
+ }
+ runningEvents.add(i);
}
- runningEvents.add(i);
- }
- triggerTimeValues = null;
- if (events[i].getUseValuesFromTriggerTime()) {
- // store values from trigger time for later
- // execution
- List ruleObjects = events[i].getRuleObjects();
- if (ruleObjects!=null) {
- triggerTimeValues = new Double[ruleObjects.size()];
- int j = 0;
- for (AssignmentRuleValue obj:ruleObjects) {
- obj.processRule(Y, astNodeTime, false);
- triggerTimeValues[j]=obj.getValue();
- j++;
+ triggerTimeValues = null;
+ if (events[i].getUseValuesFromTriggerTime()) {
+ // store values from trigger time for later
+ // execution
+ List ruleObjects = events[i].getRuleObjects();
+ if (ruleObjects != null) {
+ triggerTimeValues = new Double[ruleObjects.size()];
+ int j = 0;
+ for (AssignmentRuleValue obj : ruleObjects) {
+ obj.processRule(Y, astNodeTime, false);
+ triggerTimeValues[j] = obj.getValue();
+ j++;
+ }
}
}
-
+ events[i].addValues(triggerTimeValues, execTime);
+ events[i].fired(currentTime);
}
-
- events[i].addValues(triggerTimeValues, execTime);
-
- events[i].fired(currentTime);
}
-
- }
- // event has fired recently -> can not fire
- else {
- if (events[i].getFireStatus(currentTime)) {
- events[i].recovered(currentTime);
+ // event has fired recently -> can not fire
+ else {
+ if (events[i].getFireStatus(currentTime)) {
+ events[i].recovered(currentTime);
+ }
}
}
-
}
// there are events to fire
if (runningEvents.size() > 0) {
- return processNextEvent(priorities,this.Y);
+ return processNextEvent(priorities, this.Y);
}
// return empty event, so the solver knows that a event with delay has been triggered
else if (hasNewDelayedEvents) {
events[0].clearAssignments();
return events[0];
- }
- else {
+ } else {
return null;
}
-
} catch (SBMLException exc) {
throw new DerivativeException(exc);
}
-
}
- /* (non-Javadoc)
- * @see eva2.tools.math.des.DESystem#getIdentifiers()
+ /**
+ * {@inheritDoc}
*/
@Override
public String[] getIdentifiers() {
return symbolIdentifiers;
}
+
/**
* Returns the initial values of the model to be simulated.
- *
+ *
* @return Returns the initial values of the model to be simulated.
*/
public double[] getInitialValues() {
return initialValues;
}
+
/**
* Returns the model that is used by this object.
- *
+ *
* @return Returns the model that is used by this object.
*/
public Model getModel() {
return model;
}
- /* (non-Javadoc)
- * @see eva2.tools.math.des.RichDESystem#getNumIntermediates()
+ /**
+ * {@inheritDoc}
*/
@Override
public int getAdditionalValueCount() {
return v.length;
}
- /* (non-Javadoc)
- * @see eva2.tools.math.des.EventDESystem#getEventCount()
+ /**
+ * {@inheritDoc}
*/
@Override
public int getEventCount() {
return model.getEventCount();
}
+
/**
* This method tells you the complete number of parameters within the model.
* It counts the global model parameters and all local parameters (parameters
* within a kinetic law).
- *
+ *
* @return The total number of model parameters. Note that this number is
- * limited to an {@code int} value, whereas the SBML model may
- * contain {@code int} values.
+ * limited to an {@code int} value, whereas the SBML model may
+ * contain {@code int} values.
*/
public int getParameterCount() {
int p = model.getParameterCount();
@@ -989,24 +986,26 @@ public int getParameterCount() {
return p;
}
- /* (non-Javadoc)
- * @see eva2.tools.math.des.EventDESystem#getRuleCount()
+ /**
+ * {@inheritDoc}
*/
@Override
public int getRuleCount() {
return model.getRuleCount();
}
- /* (non-Javadoc)
- * @see eva2.tools.math.des.EventDESystem#getPositionOfParameters()
+
+ /**
+ * {@inheritDoc}
*/
public int getPositionOfParameters() {
- return Y.length-model.getParameterCount();
+ return Y.length - model.getParameterCount();
}
+
/**
* Returns the timepoint where the simulation is currently situated
- *
+ *
* @return time
*/
@Override
@@ -1014,15 +1013,15 @@ public double getCurrentTime() {
return currentTime;
}
+
/**
* Returns the value of the ODE system at the time t given the current values
* of Y
- *
- * @param t
+ *
+ * @param time
* @param Y
* @return
* @throws DerivativeException
- *
*/
private double[] computeDerivatives(double time, double[] Y)
throws DerivativeException {
@@ -1033,8 +1032,9 @@ private double[] computeDerivatives(double time, double[] Y)
return changeRate;
}
- /* (non-Javadoc)
- * @see eva2.tools.math.des.DESystem#getValue(double, double[], double[])
+
+ /**
+ * {@inheritDoc}
*/
@Override
public void computeDerivatives(double time, double[] Y, double[] changeRate)
@@ -1042,18 +1042,14 @@ public void computeDerivatives(double time, double[] Y, double[] changeRate)
currentTime = time;
// make sure not to have invalid older values in the change rate
//Arrays.fill(changeRate, 0d);
-
Arrays.fill(changeRate, 0d);
-
if (noDerivatives) {
return;
}
-
System.arraycopy(Y, 0, this.Y, 0, Y.length);
if (modelHasEvents) {
runningEvents.clear();
}
-
try {
//Always call the compile functions with a new time
astNodeTime += 0.01d;
@@ -1072,7 +1068,7 @@ public void computeDerivatives(double time, double[] Y, double[] changeRate)
* Check the model's constraints
*/
for (int i = 0; i < model.getConstraintCount(); i++) {
- if (constraintRoots.get(i).compileBoolean(time)) {
+ if (model.getConstraint(i).isSetMath() && constraintRoots.get(i).compileBoolean(time)) {
ConstraintEvent evt = new ConstraintEvent(model.getConstraint(i), Double.valueOf(time));
// Notify all listeners about the violation of the current constraint.
for (ConstraintListener listener : listOfConstraintListeners) {
@@ -1080,15 +1076,24 @@ public void computeDerivatives(double time, double[] Y, double[] changeRate)
}
}
}
-
} catch (SBMLException exc) {
throw new DerivativeException(exc);
}
+ this.changeRate = changeRate;
+ }
+
+ /**
+ * @return the array of derivatives of each species of the model system at
+ * the current time.
+ */
+ public double[] getNewChangeRate() {
+ return changeRate;
}
- /* (non-Javadoc)
- * @see org.sbml.simulator.math.ValueHolder#getSpeciesValue()
+
+ /**
+ * {@inheritDoc}
*/
@Override
public double getCurrentValueOf(String id) {
@@ -1100,6 +1105,7 @@ public double getCurrentValueOf(String id) {
}
}
+
/**
*
* This method initializes the differential equation system for simulation. In
@@ -1113,8 +1119,7 @@ public double getCurrentValueOf(String id) {
* simulation results because initial assignments may depend on current
* parameter values.
*
- *
- *
+ *
* @throws ModelOverdeterminedException
* @throws SBMLException
* @see #init(boolean, double, double, double)
@@ -1123,23 +1128,26 @@ public void init() throws ModelOverdeterminedException, SBMLException {
init(true, 0d, 1d, 1d);
}
+
/**
* This method initializes the differential equation system for simulation.
* The user can tell whether the tree of {@link ASTNode}s has to be refreshed.
- *
+ *
* @param refreshTree
* @throws ModelOverdeterminedException
* @throws SBMLException
*/
- public void init(boolean refreshTree) throws ModelOverdeterminedException, SBMLException {
+ public void init(boolean refreshTree)
+ throws ModelOverdeterminedException, SBMLException {
init(refreshTree, 0d, 1d, 1d);
}
+
/**
* This method initializes the differential equation system for simulation.
* The user can tell whether the tree of {@link ASTNode}s has to be
* refreshed and give some default values.
- *
+ *
* @param renewTree
* @param defaultSpeciesValue
* @param defaultParameterValue
@@ -1147,16 +1155,18 @@ public void init(boolean refreshTree) throws ModelOverdeterminedException, SBMLE
* @throws ModelOverdeterminedException
* @throws SBMLException
*/
- public void init(boolean renewTree, double defaultSpeciesValue, double defaultParameterValue, double defaultCompartmentValue) throws ModelOverdeterminedException, SBMLException {
+ public void init(boolean renewTree, double defaultSpeciesValue, double defaultParameterValue, double defaultCompartmentValue)
+ throws ModelOverdeterminedException, SBMLException {
init(renewTree, defaultSpeciesValue, defaultParameterValue, defaultCompartmentValue, null);
}
+
/**
* This method initializes the differential equation system for simulation.
* The user can tell whether the tree of {@link ASTNode}s has to be
* refreshed, give some default values and state whether a {@link Species}
* is seen as an amount or a concentration.
- *
+ *
* @param renewTree
* @param defaultSpeciesValue
* @param defaultParameterValue
@@ -1165,16 +1175,18 @@ public void init(boolean renewTree, double defaultSpeciesValue, double defaultPa
* @throws ModelOverdeterminedException
* @throws SBMLException
*/
- public void init(boolean renewTree, double defaultSpeciesValue, double defaultParameterValue, double defaultCompartmentValue, Map amountHash) throws ModelOverdeterminedException, SBMLException {
+ public void init(boolean renewTree, double defaultSpeciesValue, double defaultParameterValue, double defaultCompartmentValue, Map amountHash)
+ throws ModelOverdeterminedException, SBMLException {
int i;
symbolHash.clear();
+ constantHash.clear();
compartmentHash.clear();
Integer compartmentIndex, yIndex = Integer.valueOf(0);
currentTime = 0d;
astNodeTime = 0d;
containsDelays = false;
noDerivatives = false;
- if ((model.getReactionCount() == 0) && (model.getConstraintCount() == 0)) {
+ if ((model.getReactionCount() == 0) && (constraintRoots == null)) {
noDerivatives = true;
for (int k = 0; k < model.getRuleCount(); k++) {
Rule rule = model.getRule(k);
@@ -1183,7 +1195,6 @@ public void init(boolean renewTree, double defaultSpeciesValue, double defaultPa
}
}
}
-
Map speciesReferenceToRateRule = new HashMap();
int speciesReferencesInRateRules = 0;
for (int k = 0; k < model.getRuleCount(); k++) {
@@ -1197,9 +1208,7 @@ public void init(boolean renewTree, double defaultSpeciesValue, double defaultPa
}
}
}
-
- int sizeY = model.getCompartmentCount() + model.getSpeciesCount()
- + model.getParameterCount() + speciesReferencesInRateRules;
+ int sizeY = model.getCompartmentCount() + model.getSpeciesCount() + model.getParameterCount() + speciesReferencesInRateRules;
if (sizeY != Y.length) {
Y = new double[sizeY];
compartmentIndexes = new int[Y.length];
@@ -1217,20 +1226,17 @@ public void init(boolean renewTree, double defaultSpeciesValue, double defaultPa
Compartment c = model.getCompartment(i);
if (!c.isSetValue()) {
Y[yIndex] = defaultCompartmentValue;
- }
- else {
+ } else {
Y[yIndex] = c.getSize();
}
-
symbolHash.put(c.getId(), yIndex);
+ constantHash.put(c.getId(), c.isConstant());
symbolIdentifiers[yIndex] = c.getId();
yIndex++;
}
-
// Due to unset initial amount or concentration of species try to set
// one of them
Species majority = determineMajorSpeciesAttributes();
-
speciesMap.clear();
/*
* Save starting values of the model's species in Y and link them with their
@@ -1249,7 +1255,6 @@ public void init(boolean renewTree, double defaultSpeciesValue, double defaultPa
}
}
compartmentIndex = symbolHash.get(s.getCompartment());
-
// Set initial amount or concentration when not already done
if (!s.isSetInitialAmount() && !s.isSetInitialConcentration()) {
if (majority.isSetInitialAmount()) {
@@ -1257,51 +1262,41 @@ public void init(boolean renewTree, double defaultSpeciesValue, double defaultPa
} else {
s.setInitialConcentration(0d);
}
-
s.setHasOnlySubstanceUnits(majority.getHasOnlySubstanceUnits());
}
-
//determine whether amount or concentration is set
if ((amountHash != null)) {
if (amountHash.containsKey(s.getId())) {
isAmount[yIndex] = amountHash.get(s.getId());
- }
- else {
+ } else {
isAmount[yIndex] = s.isSetInitialAmount();
}
- }
- else {
+ } else {
isAmount[yIndex] = s.isSetInitialAmount();
-
}
-
if (!s.isSetValue()) {
Y[yIndex] = defaultSpeciesValue;
- }
- else {
+ } else {
if (s.isSetInitialAmount()) {
if (isAmount[yIndex]) {
Y[yIndex] = s.getInitialAmount();
- }
- else {
- Y[yIndex] = s.getInitialAmount()/Y[compartmentIndex];
+ } else {
+ Y[yIndex] = s.getInitialAmount() / Y[compartmentIndex];
}
} else {
if (!isAmount[yIndex]) {
Y[yIndex] = s.getInitialConcentration();
- }
- else {
- Y[yIndex] = s.getInitialConcentration()*Y[compartmentIndex];
+ } else {
+ Y[yIndex] = s.getInitialConcentration() * Y[compartmentIndex];
}
}
}
-
symbolHash.put(s.getId(), yIndex);
+ constantHash.put(s.getId(), s.isConstant());
compartmentHash.put(s.getId(), compartmentIndex);
compartmentIndexes[yIndex] = compartmentIndex;
symbolIdentifiers[yIndex] = s.getId();
yIndex++;
-
}
/*
@@ -1311,6 +1306,7 @@ public void init(boolean renewTree, double defaultSpeciesValue, double defaultPa
SpeciesReference sr = model.findSpeciesReference(id);
Y[yIndex] = sr.getStoichiometry();
symbolHash.put(id, yIndex);
+ constantHash.put(id, sr.isConstant());
symbolIdentifiers[yIndex] = id;
yIndex++;
}
@@ -1322,11 +1318,11 @@ public void init(boolean renewTree, double defaultSpeciesValue, double defaultPa
Parameter p = model.getParameter(i);
if (!p.isSetValue()) {
Y[yIndex] = defaultParameterValue;
- }
- else {
+ } else {
Y[yIndex] = p.getValue();
}
symbolHash.put(p.getId(), yIndex);
+ constantHash.put(p.getId(), p.isConstant());
symbolIdentifiers[yIndex] = p.getId();
yIndex++;
}
@@ -1340,29 +1336,27 @@ public void init(boolean renewTree, double defaultSpeciesValue, double defaultPa
reactionFast = new boolean[model.getReactionCount()];
}
int reactionIndex = 0;
- boolean slowReactions = false;
boolean fastReactions = false;
for (Reaction r : model.getListOfReactions()) {
- reactionFast[reactionIndex] = r.isFast();
+ if (r.isSetFast()) {
+ reactionFast[reactionIndex] = r.getFast();
+ } else {
+ reactionFast[reactionIndex] = false;
+ }
reactionReversible[reactionIndex] = r.isReversible();
- if (r.isFast()) {
+ if (r.isSetFast() && r.getFast()) {
fastReactions = true;
}
- else {
- slowReactions = true;
- }
if (r.getKineticLaw() != null) {
- if (r.getKineticLaw().getListOfLocalParameters().size() > 0) {
+ if (r.getKineticLaw().getListOfLocalParameters().size() > 0 && r.getKineticLaw().isSetMath()) {
r.getKineticLaw().getMath().updateVariables();
}
}
-
Species species;
String speciesID;
for (SpeciesReference speciesRef : r.getListOfReactants()) {
speciesID = speciesRef.getSpecies();
species = speciesMap.get(speciesID);
-
if (species != null) {
// if (!isAmount[symbolHash.get(speciesID)]
// && !species.hasOnlySubstanceUnits()) {
@@ -1381,19 +1375,16 @@ public void init(boolean renewTree, double defaultSpeciesValue, double defaultPa
inConcentration.add(speciesID);
}
}
-
}
reactionIndex++;
}
- if (fastReactions && slowReactions) {
+ if (fastReactions) {
hasFastReactions = true;
}
-
- for (i = 0; i!= inConcentrationValues.length; i++) {
+ for (i = 0; i != inConcentrationValues.length; i++) {
if (inConcentration.contains(symbolIdentifiers[i])) {
inConcentrationValues[i] = true;
- }
- else {
+ } else {
inConcentrationValues[i] = false;
}
}
@@ -1403,7 +1394,7 @@ public void init(boolean renewTree, double defaultSpeciesValue, double defaultPa
*/
boolean containsAlgebraicRules = false;
for (i = 0; i < model.getRuleCount(); i++) {
- if (model.getRule(i).isAlgebraic()) {
+ if (model.getRule(i).isAlgebraic() && model.getRule(i).isSetMath()) {
containsAlgebraicRules = true;
break;
}
@@ -1424,21 +1415,16 @@ public void init(boolean renewTree, double defaultSpeciesValue, double defaultPa
delayedEvents = new ArrayList();
initEvents();
modelHasEvents = true;
- }
- else {
+ } else {
modelHasEvents = false;
}
-
-
if (renewTree) {
createSimplifiedSyntaxTree();
- }
- else {
+ } else {
refreshSyntaxTree();
}
-
// save the initial values of this system, necessary at this point for the delay function
- if (initialValues.length!=Y.length) {
+ if (initialValues.length != Y.length) {
initialValues = new double[Y.length];
}
System.arraycopy(Y, 0, initialValues, 0, initialValues.length);
@@ -1449,6 +1435,22 @@ public void init(boolean renewTree, double defaultSpeciesValue, double defaultPa
astNodeTime += 0.01d;
processInitialAssignments(astNodeTime, Y);
+ /*
+ * Sometimes conversion factors are assigned values in the
+ * initialAssignments. So, updating the conversion factors
+ * after processing the initialAssignments.
+ */
+ for (int pp = 0; pp < model.getSpeciesCount(); pp++) {
+ Species sp = model.getSpecies(pp);
+ String conversionFactor = sp.getConversionFactor();
+ if (conversionFactor == null) {
+ conversionFactor = model.getConversionFactor();
+ }
+ if (!conversionFactor.equals("")) {
+ conversionFactors[symbolHash.get(sp.getId())] = Y[symbolHash.get(conversionFactor)];
+ }
+ }
+
/*
* Evaluate Constraints
*/
@@ -1457,9 +1459,8 @@ public void init(boolean renewTree, double defaultSpeciesValue, double defaultPa
if (getConstraintListenerCount() == 0) {
addConstraintListener(new SimpleConstraintListener());
}
-
for (i = 0; i < model.getConstraintCount(); i++) {
- if (constraintRoots.get(i).compileBoolean(astNodeTime)) {
+ if (model.getConstraint(i).isSetMath() && constraintRoots.get(i).compileBoolean(astNodeTime)) {
ConstraintEvent evt = new ConstraintEvent(model.getConstraint(i), 0d);
for (ConstraintListener listener : listOfConstraintListeners) {
listener.processViolation(evt);
@@ -1469,118 +1470,131 @@ public void init(boolean renewTree, double defaultSpeciesValue, double defaultPa
}
/*
- * All other rules
+ * Compute changes due to reactions
*/
- astNodeTime += 0.01d;
- processRules(astNodeTime, null, Y, true);
+ processVelocities(changeRate, astNodeTime);
/*
- * Process initial assignments a 2nd time because there can be rules
- * dependent on initial assignments and vice versa, so one of both has to be
- * evaluated twice at the start
+ * All other rules
*/
-
- astNodeTime += 0.01d;
- processInitialAssignments(astNodeTime,Y);
-
astNodeTime += 0.01d;
processRules(astNodeTime, null, Y, true);
+ /*
+ * Process initial assignments and rules till the Y array
+ * becomes unchanged on running further initial assignments and rules.
+ *
+ * Reason: Initial assignments and rules can be dependent on each other.
+ */
+ double[] check;
+ do {
+ check = Y.clone();
+ astNodeTime += 0.01d;
+ processInitialAssignments(astNodeTime, Y);
+ astNodeTime += 0.01d;
+ processRules(astNodeTime, null, Y, true);
+ } while (!Arrays.equals(check, Y));
// save the initial values of this system
System.arraycopy(Y, 0, initialValues, 0, initialValues.length);
}
+
/**
* Refreshes the syntax tree (e.g., resets the ASTNode time)
*/
private void refreshSyntaxTree() {
- for (ASTNode node: nodes) {
+ for (ASTNode node : nodes) {
((ASTNodeValue) node.getUserObject(TEMP_VALUE)).reset();
}
- for (int i = 0; i!= stoichiometryValues.length; i++) {
+ for (int i = 0; i != stoichiometryValues.length; i++) {
stoichiometryValues[i].refresh();
stoichiometrySet[i] = stoichiometryValues[i].getStoichiometrySet();
}
}
+
/**
* Creates the syntax tree and simplifies it.
*/
private void createSimplifiedSyntaxTree() {
nodes.clear();
-
- initializeRules();
initializeKineticLaws();
+ initializeRules();
initializeConstraints();
initializeEvents();
}
+
/**
* Includes the math of the {@link Constraint}s in the syntax tree.
*/
private void initializeConstraints() {
constraintRoots = new ArrayList();
for (Constraint c : model.getListOfConstraints()) {
- ASTNodeValue currentConstraint = (ASTNodeValue) copyAST(c.getMath(),
- true, null, null).getUserObject(TEMP_VALUE);
- constraintRoots.add(currentConstraint);
- c.getMath().putUserObject(TEMP_VALUE, currentConstraint);
+ if (c.isSetMath()) {
+ ASTNodeValue currentConstraint = (ASTNodeValue) copyAST(c.getMath(), true, null, null).getUserObject(TEMP_VALUE);
+ constraintRoots.add(currentConstraint);
+ c.getMath().putUserObject(TEMP_VALUE, currentConstraint);
+ }
}
}
+
/**
* Includes the math of the events in the syntax tree.
*/
private void initializeEvents() {
if (events != null) {
for (int i = 0; i != events.length; i++) {
- Event e=model.getEvent(i);
- events[i].setUseValuesFromTriggerTime(e.getUseValuesFromTriggerTime());
- events[i].setPersistent(e.getTrigger().getPersistent());
- events[i].setTriggerObject((ASTNodeValue) copyAST(e.getTrigger().getMath(), true, null, null).getUserObject(TEMP_VALUE));
- if (e.getPriority() != null) {
- events[i].setPriorityObject((ASTNodeValue)copyAST(e.getPriority().getMath(), true, null, null).getUserObject(TEMP_VALUE));
- }
- if (e.getDelay() != null) {
- events[i].setDelayObject((ASTNodeValue)copyAST(e.getDelay().getMath(), true, null, null).getUserObject(TEMP_VALUE));
- }
-
- events[i].clearRuleObjects();
- for (EventAssignment as: e.getListOfEventAssignments()) {
- Integer symbolIndex = symbolHash.get(as.getVariable());
- if (symbolIndex != null) {
- Species sp = model.getSpecies(as.getVariable());
- if (sp != null) {
- Compartment c = sp.getCompartmentInstance();
- boolean hasZeroSpatialDimensions = true;
- if ((c!=null) && (c.getSpatialDimensions()>0)) {
- hasZeroSpatialDimensions=false;
+ Event e = model.getEvent(i);
+ if (e.isSetTrigger() && e.getTrigger().isSetMath()) {
+ events[i].setUseValuesFromTriggerTime(e.getUseValuesFromTriggerTime());
+ events[i].setPersistent(e.getTrigger().getPersistent());
+ events[i].setTriggerObject((ASTNodeValue) copyAST(e.getTrigger().getMath(), true, null, null).getUserObject(TEMP_VALUE));
+ if (e.getPriority() != null && e.getPriority().isSetMath()) {
+ events[i].setPriorityObject((ASTNodeValue) copyAST(e.getPriority().getMath(), true, null, null).getUserObject(TEMP_VALUE));
+ }
+ if (e.getDelay() != null && e.getDelay().isSetMath()) {
+ events[i].setDelayObject((ASTNodeValue) copyAST(e.getDelay().getMath(), true, null, null).getUserObject(TEMP_VALUE));
+ }
+ events[i].clearRuleObjects();
+ for (EventAssignment as : e.getListOfEventAssignments()) {
+ Integer symbolIndex = symbolHash.get(as.getVariable());
+ if (symbolIndex != null) {
+ Species sp = model.getSpecies(as.getVariable());
+ if (sp != null) {
+ Compartment c = sp.getCompartmentInstance();
+ boolean hasZeroSpatialDimensions = true;
+ if ((c != null) && (c.getSpatialDimensions() > 0)) {
+ hasZeroSpatialDimensions = false;
+ }
+ if (as.isSetMath()) {
+ events[i].addRuleObject(new AssignmentRuleValue((ASTNodeValue) copyAST(as.getMath(), true, null, null).getUserObject(TEMP_VALUE), symbolIndex, sp, compartmentHash.get(sp.getId()), hasZeroSpatialDimensions, this, isAmount[symbolIndex]));
+ }
+ } else {
+ if (as.isSetMath()) {
+ events[i].addRuleObject(new AssignmentRuleValue((ASTNodeValue) copyAST(as.getMath(), true, null, null).getUserObject(TEMP_VALUE), symbolIndex));
+ }
+ }
+ } else if (model.findSpeciesReference(as.getVariable()) != null) {
+ SpeciesReference sr = model.findSpeciesReference(as.getVariable());
+ if (!sr.isConstant() && as.isSetMath()) {
+ events[i].addRuleObject(new AssignmentRuleValue((ASTNodeValue) copyAST(as.getMath(), true, null, null).getUserObject(TEMP_VALUE), sr.getId(), stoichiometricCoefHash));
}
- events[i].addRuleObject(new AssignmentRuleValue(
- (ASTNodeValue) copyAST(as.getMath(), true, null, null)
- .getUserObject(TEMP_VALUE), symbolIndex, sp, compartmentHash.get(sp
- .getId()), hasZeroSpatialDimensions, this));
- } else {
- events[i].addRuleObject(new AssignmentRuleValue(
- (ASTNodeValue) copyAST(as.getMath(), true, null, null)
- .getUserObject(TEMP_VALUE), symbolIndex));
- }
- } else if (model.findSpeciesReference(as.getVariable()) != null) {
- SpeciesReference sr = model.findSpeciesReference(as.getVariable());
- if (!sr.isConstant()) {
- events[i].addRuleObject(new AssignmentRuleValue(
- (ASTNodeValue) copyAST(as.getMath(), true, null, null)
- .getUserObject(TEMP_VALUE), sr.getId(), stoichiometricCoefHash));
}
}
+ events[i].setUseValuesFromTriggerTime(e.getUseValuesFromTriggerTime());
+ if (events[i].getRuleObjects() == null) {
+ events[i] = null;
+ }
+ } else {
+ events[i] = null;
}
- events[i].setUseValuesFromTriggerTime(e.getUseValuesFromTriggerTime());
}
-
}
-
}
+
/**
* Includes the math of the kinetic laws in the syntax tree.
*/
@@ -1592,20 +1606,16 @@ private void initializeKineticLaws() {
List zeroChangeList = new ArrayList();
List constantStoichiometryList = new ArrayList();
List stoichiometriesList = new ArrayList();
-
-
List kineticLawRootsList = new ArrayList();
for (Reaction r : model.getListOfReactions()) {
KineticLaw kl = r.getKineticLaw();
- if (kl != null) {
- ASTNodeValue currentLaw = (ASTNodeValue) copyAST(kl.getMath(), true, null, null)
- .getUserObject(TEMP_VALUE);
+ if (kl != null && kl.isSetMath()) {
+ ASTNodeValue currentLaw = (ASTNodeValue) copyAST(kl.getMath(), true, null, null).getUserObject(TEMP_VALUE);
kineticLawRootsList.add(currentLaw);
kl.getMath().putUserObject(TEMP_VALUE, currentLaw);
for (SpeciesReference speciesRef : r.getListOfReactants()) {
String speciesID = speciesRef.getSpecies();
int speciesIndex = symbolHash.get(speciesID);
-
int srIndex = -1;
if (model.getLevel() >= 3) {
String id = speciesRef.getId();
@@ -1613,28 +1623,21 @@ private void initializeKineticLaws() {
if (symbolHash.containsKey(id)) {
srIndex = symbolHash.get(id);
}
-
}
-
}
//Value for stoichiometry math
ASTNodeValue currentMathValue = null;
- if (speciesRef.isSetStoichiometryMath()) {
- @SuppressWarnings("deprecation")
- ASTNode currentMath = speciesRef.getStoichiometryMath().getMath();
- currentMathValue = (ASTNodeValue) copyAST(currentMath, true, null, null)
- .getUserObject(TEMP_VALUE);
+ if (speciesRef.isSetStoichiometryMath() && speciesRef.getStoichiometryMath().isSetMath()) {
+ @SuppressWarnings("deprecation") ASTNode currentMath = speciesRef.getStoichiometryMath().getMath();
+ currentMathValue = (ASTNodeValue) copyAST(currentMath, true, null, null).getUserObject(TEMP_VALUE);
currentMath.putUserObject(TEMP_VALUE, currentMathValue);
}
-
boolean constantStoichiometry = false;
if (speciesRef.isSetConstant()) {
constantStoichiometry = speciesRef.getConstant();
- }
- else if ((!speciesRef.isSetId()) && (!speciesRef.isSetStoichiometryMath())) {
+ } else if ((!speciesRef.isSetId()) && (!speciesRef.isSetStoichiometryMath())) {
constantStoichiometry = true;
}
-
boolean zeroChange = false;
Species s = speciesRef.getSpeciesInstance();
if (s != null) {
@@ -1645,21 +1648,16 @@ else if ((!speciesRef.isSetId()) && (!speciesRef.isSetStoichiometryMath())) {
zeroChange = true;
}
}
-
zeroChangeList.add(zeroChange);
constantStoichiometryList.add(constantStoichiometry);
reactionIndexList.add(reaction);
speciesIndexList.add(speciesIndex);
isReactantList.add(true);
- stoichiometriesList.add(new StoichiometryValue(speciesRef,
- srIndex, stoichiometricCoefHash, Y,
- currentMathValue));
-
+ stoichiometriesList.add(new StoichiometryValue(speciesRef, srIndex, stoichiometricCoefHash, Y, currentMathValue));
}
for (SpeciesReference speciesRef : r.getListOfProducts()) {
String speciesID = speciesRef.getSpecies();
int speciesIndex = symbolHash.get(speciesID);
-
int srIndex = -1;
if (model.getLevel() >= 3) {
String id = speciesRef.getId();
@@ -1667,28 +1665,21 @@ else if ((!speciesRef.isSetId()) && (!speciesRef.isSetStoichiometryMath())) {
if (symbolHash.containsKey(id)) {
srIndex = symbolHash.get(id);
}
-
}
-
}
//Value for stoichiometry math
ASTNodeValue currentMathValue = null;
- if (speciesRef.isSetStoichiometryMath()) {
- @SuppressWarnings("deprecation")
- ASTNode currentMath = speciesRef.getStoichiometryMath().getMath();
- currentMathValue = (ASTNodeValue) copyAST(currentMath, true, null, null)
- .getUserObject(TEMP_VALUE);
+ if (speciesRef.isSetStoichiometryMath() && speciesRef.getStoichiometryMath().isSetMath()) {
+ @SuppressWarnings("deprecation") ASTNode currentMath = speciesRef.getStoichiometryMath().getMath();
+ currentMathValue = (ASTNodeValue) copyAST(currentMath, true, null, null).getUserObject(TEMP_VALUE);
currentMath.putUserObject(TEMP_VALUE, currentMathValue);
}
-
boolean constantStoichiometry = false;
if (speciesRef.isSetConstant()) {
constantStoichiometry = speciesRef.getConstant();
- }
- else if ((!speciesRef.isSetId()) && (!speciesRef.isSetStoichiometryMath())) {
+ } else if ((!speciesRef.isSetId()) && (!speciesRef.isSetStoichiometryMath())) {
constantStoichiometry = true;
}
-
boolean zeroChange = false;
Species s = speciesRef.getSpeciesInstance();
if (s != null) {
@@ -1699,21 +1690,15 @@ else if ((!speciesRef.isSetId()) && (!speciesRef.isSetStoichiometryMath())) {
zeroChange = true;
}
}
-
zeroChangeList.add(zeroChange);
constantStoichiometryList.add(constantStoichiometry);
reactionIndexList.add(reaction);
speciesIndexList.add(speciesIndex);
isReactantList.add(false);
- stoichiometriesList.add(new StoichiometryValue(speciesRef,
- srIndex, stoichiometricCoefHash, Y,
- currentMathValue));
+ stoichiometriesList.add(new StoichiometryValue(speciesRef, srIndex, stoichiometricCoefHash, Y, currentMathValue));
}
-
-
} else {
- kineticLawRootsList.add(new ASTNodeValue(nodeInterpreter,
- new ASTNode(0d)));
+ kineticLawRootsList.add(new ASTNodeValue(nodeInterpreter, new ASTNode(0d)));
}
reaction++;
}
@@ -1727,7 +1712,7 @@ else if ((!speciesRef.isSetId()) && (!speciesRef.isSetStoichiometryMath())) {
constantStoichiometry = new boolean[stoichiometriesSize];
stoichiometrySet = new boolean[stoichiometriesSize];
stoichiometry = new double[stoichiometriesSize];
- for (int i = 0; i!=stoichiometriesSize; i++) {
+ for (int i = 0; i != stoichiometriesSize; i++) {
isReactant[i] = isReactantList.get(i);
speciesIndex[i] = speciesIndexList.get(i);
reactionIndex[i] = reactionIndexList.get(i);
@@ -1736,9 +1721,9 @@ else if ((!speciesRef.isSetId()) && (!speciesRef.isSetStoichiometryMath())) {
stoichiometrySet[i] = stoichiometryValues[i].getStoichiometrySet();
stoichiometry[i] = stoichiometryValues[i].getStoichiometry();
}
-
}
+
/**
* Includes the math of the rules in the syntax tree.
*/
@@ -1747,7 +1732,6 @@ private void initializeRules() {
initialAssignmentRoots = new ArrayList();
rateRulesRoots = new ArrayList();
Integer symbolIndex;
-
for (int i = 0; i < model.getRuleCount(); i++) {
Rule rule = model.getRule(i);
if (rule.isAssignment()) {
@@ -1761,26 +1745,18 @@ private void initializeRules() {
if ((c != null) && (c.getSpatialDimensions() > 0)) {
hasZeroSpatialDimensions = false;
}
- assignmentRulesRootsInit.add(new AssignmentRuleValue(
- (ASTNodeValue) copyAST(as.getMath(), true,
- null, null).getUserObject(TEMP_VALUE),
- symbolIndex, sp,
- compartmentHash.get(sp.getId()),
- hasZeroSpatialDimensions, this));
+ if (as.isSetMath()) {
+ assignmentRulesRootsInit.add(new AssignmentRuleValue((ASTNodeValue) copyAST(as.getMath(), true, null, null).getUserObject(TEMP_VALUE), symbolIndex, sp, compartmentHash.get(sp.getId()), hasZeroSpatialDimensions, this, isAmount[symbolIndex]));
+ }
} else {
- assignmentRulesRootsInit.add(new AssignmentRuleValue(
- (ASTNodeValue) copyAST(as.getMath(), true,
- null, null).getUserObject(TEMP_VALUE),
- symbolIndex));
+ if (as.isSetMath()) {
+ assignmentRulesRootsInit.add(new AssignmentRuleValue((ASTNodeValue) copyAST(as.getMath(), true, null, null).getUserObject(TEMP_VALUE), symbolIndex));
+ }
}
} else if (model.findSpeciesReference(as.getVariable()) != null) {
- SpeciesReference sr = model.findSpeciesReference(as
- .getVariable());
- if (!sr.isConstant()) {
- assignmentRulesRootsInit.add(new AssignmentRuleValue(
- (ASTNodeValue) copyAST(as.getMath(), true,
- null, null).getUserObject(TEMP_VALUE),
- sr.getId(), stoichiometricCoefHash));
+ SpeciesReference sr = model.findSpeciesReference(as.getVariable());
+ if (!sr.isConstant() && as.isSetMath()) {
+ assignmentRulesRootsInit.add(new AssignmentRuleValue((ASTNodeValue) copyAST(as.getMath(), true, null, null).getUserObject(TEMP_VALUE), sr.getId(), stoichiometricCoefHash));
}
}
} else if (rule.isRate()) {
@@ -1794,37 +1770,27 @@ private void initializeRules() {
if ((c != null) && (c.getSpatialDimensions() > 0)) {
hasZeroSpatialDimensions = false;
}
- rateRulesRoots.add(new RateRuleValue(
- (ASTNodeValue) copyAST(rr.getMath(), true,
- null, null).getUserObject(TEMP_VALUE),
- symbolIndex, sp,
- compartmentHash.get(sp.getId()),
- hasZeroSpatialDimensions, this));
+ if (rr.isSetMath()) {
+ rateRulesRoots.add(new RateRuleValue((ASTNodeValue) copyAST(rr.getMath(), true, null, null).getUserObject(TEMP_VALUE), symbolIndex, sp, compartmentHash.get(sp.getId()), hasZeroSpatialDimensions, this, rr.getVariable(), isAmount[symbolIndex]));
+ }
} else if (compartmentHash.containsValue(symbolIndex)) {
List speciesIndices = new LinkedList();
- for (Entry entry : compartmentHash
- .entrySet()) {
+ for (Entry entry : compartmentHash.entrySet()) {
if (entry.getValue() == symbolIndex) {
Species s = model.getSpecies(entry.getKey());
- int speciesIndex = symbolHash.get(entry
- .getKey());
- if ((!isAmount[speciesIndex])
- && (!s.isConstant())) {
+ int speciesIndex = symbolHash.get(entry.getKey());
+ if ((!isAmount[speciesIndex]) && (!s.isConstant())) {
speciesIndices.add(speciesIndex);
}
}
}
- rateRulesRoots.add(new RateRuleValue(
- (ASTNodeValue) copyAST(rr.getMath(), true,
- null, null).getUserObject(TEMP_VALUE),
- symbolIndex, speciesIndices, this));
- }
-
- else {
- rateRulesRoots.add(new RateRuleValue(
- (ASTNodeValue) copyAST(rr.getMath(), true,
- null, null).getUserObject(TEMP_VALUE),
- symbolIndex));
+ if (rr.isSetMath()) {
+ rateRulesRoots.add(new RateRuleValue((ASTNodeValue) copyAST(rr.getMath(), true, null, null).getUserObject(TEMP_VALUE), symbolIndex, speciesIndices, this, rr.getVariable()));
+ }
+ } else {
+ if (rr.isSetMath()) {
+ rateRulesRoots.add(new RateRuleValue((ASTNodeValue) copyAST(rr.getMath(), true, null, null).getUserObject(TEMP_VALUE), symbolIndex, rr.getVariable()));
+ }
}
}
}
@@ -1840,26 +1806,18 @@ private void initializeRules() {
if ((c != null) && (c.getSpatialDimensions() > 0)) {
hasZeroSpatialDimensions = false;
}
- assignmentRulesRootsInit.add(new AssignmentRuleValue(
- (ASTNodeValue) copyAST(as.getMath(), true,
- null, null).getUserObject(TEMP_VALUE),
- symbolIndex, sp,
- compartmentHash.get(sp.getId()),
- hasZeroSpatialDimensions, this));
+ if (as.isSetMath()) {
+ assignmentRulesRootsInit.add(new AssignmentRuleValue((ASTNodeValue) copyAST(as.getMath(), true, null, null).getUserObject(TEMP_VALUE), symbolIndex, sp, compartmentHash.get(sp.getId()), hasZeroSpatialDimensions, this, isAmount[symbolIndex]));
+ }
} else {
- assignmentRulesRootsInit.add(new AssignmentRuleValue(
- (ASTNodeValue) copyAST(as.getMath(), true,
- null, null).getUserObject(TEMP_VALUE),
- symbolIndex));
+ if (as.isSetMath()) {
+ assignmentRulesRootsInit.add(new AssignmentRuleValue((ASTNodeValue) copyAST(as.getMath(), true, null, null).getUserObject(TEMP_VALUE), symbolIndex));
+ }
}
} else if (model.findSpeciesReference(as.getVariable()) != null) {
- SpeciesReference sr = model.findSpeciesReference(as
- .getVariable());
- if (!sr.isConstant()) {
- assignmentRulesRootsInit.add(new AssignmentRuleValue(
- (ASTNodeValue) copyAST(as.getMath(), true,
- null, null).getUserObject(TEMP_VALUE),
- sr.getId(), stoichiometricCoefHash));
+ SpeciesReference sr = model.findSpeciesReference(as.getVariable());
+ if (!sr.isConstant() && as.isSetMath()) {
+ assignmentRulesRootsInit.add(new AssignmentRuleValue((ASTNodeValue) copyAST(as.getMath(), true, null, null).getUserObject(TEMP_VALUE), sr.getId(), stoichiometricCoefHash));
}
}
}
@@ -1870,28 +1828,23 @@ private void initializeRules() {
assignmentRulesRoots.add(rv);
numberOfAssignmentRulesLoops = 1;
}
-
} else {
// Determine best order of assignment rule roots
Map> neededRules = new HashMap>();
Map sBaseMap = new HashMap();
Set variables = new HashSet();
-
for (AssignmentRuleValue rv : assignmentRulesRootsInit) {
assignmentRulesRoots.add(rv);
if (rv.getIndex() != -1) {
variables.add(symbolIdentifiers[rv.getIndex()]);
sBaseMap.put(symbolIdentifiers[rv.getIndex()], rv);
-
} else if (rv.getSpeciesReferenceID() != null) {
variables.add(rv.getSpeciesReferenceID());
sBaseMap.put(rv.getSpeciesReferenceID(), rv);
}
}
for (String variable : variables) {
- for (String dependentVariable : getSetOfVariables(
- sBaseMap.get(variable).getMath(), variables,
- new HashSet())) {
+ for (String dependentVariable : getSetOfVariables(sBaseMap.get(variable).getMath(), variables, new HashSet())) {
Set currentSet = neededRules.get(dependentVariable);
if (currentSet == null) {
currentSet = new HashSet();
@@ -1900,7 +1853,6 @@ private void initializeRules() {
currentSet.add(variable);
}
}
-
int currentPosition = assignmentRulesRootsInit.size() - 1;
Set toRemove = new HashSet();
Set keysToRemove = new HashSet();
@@ -1912,12 +1864,10 @@ private void initializeRules() {
for (String variable : variables) {
if (!neededRules.containsKey(variable)) {
toRemove.add(variable);
- assignmentRulesRoots.set(currentPosition,
- sBaseMap.get(variable));
+ assignmentRulesRoots.set(currentPosition, sBaseMap.get(variable));
currentPosition--;
}
}
-
for (String key : neededRules.keySet()) {
Set currentSet = neededRules.get(key);
currentSet.removeAll(toRemove);
@@ -1925,26 +1875,20 @@ private void initializeRules() {
keysToRemove.add(key);
}
}
-
for (String keyToRemove : keysToRemove) {
neededRules.remove(keyToRemove);
}
variables.removeAll(toRemove);
-
if ((toRemove.size() > 0) || (keysToRemove.size() > 0)) {
toContinue = true;
}
-
}
-
for (String variable : variables) {
- assignmentRulesRoots.set(currentPosition,
- sBaseMap.get(variable));
+ assignmentRulesRoots.set(currentPosition, sBaseMap.get(variable));
currentPosition--;
}
numberOfAssignmentRulesLoops = Math.max(variables.size(), 1);
}
-
for (int i = 0; i < model.getInitialAssignmentCount(); i++) {
InitialAssignment iA = model.getInitialAssignment(i);
symbolIndex = symbolHash.get(iA.getVariable());
@@ -1956,61 +1900,52 @@ private void initializeRules() {
if ((c != null) && (c.getSpatialDimensions() > 0)) {
hasZeroSpatialDimensions = false;
}
- initialAssignmentRoots.add(new AssignmentRuleValue(
- (ASTNodeValue) copyAST(iA.getMath(), true, null,
- null).getUserObject(TEMP_VALUE),
- symbolIndex, sp, compartmentHash.get(sp.getId()),
- hasZeroSpatialDimensions, this));
+ if (iA.isSetMath()) {
+ initialAssignmentRoots.add(new AssignmentRuleValue((ASTNodeValue) copyAST(iA.getMath(), true, null, null).getUserObject(TEMP_VALUE), symbolIndex, sp, compartmentHash.get(sp.getId()), hasZeroSpatialDimensions, this, isAmount[symbolIndex]));
+ }
} else {
- initialAssignmentRoots.add(new AssignmentRuleValue(
- (ASTNodeValue) copyAST(iA.getMath(), true, null,
- null).getUserObject(TEMP_VALUE),
- symbolIndex));
+ if (iA.isSetMath()) {
+ initialAssignmentRoots.add(new AssignmentRuleValue((ASTNodeValue) copyAST(iA.getMath(), true, null, null).getUserObject(TEMP_VALUE), symbolIndex));
+ }
}
} else if (model.findSpeciesReference(iA.getVariable()) != null) {
SpeciesReference sr = model.findSpeciesReference(iA.getVariable());
- initialAssignmentRoots.add(new AssignmentRuleValue(
- (ASTNodeValue) copyAST(iA.getMath(), true, null, null)
- .getUserObject(TEMP_VALUE), sr.getId(),
- stoichiometricCoefHash));
+ if (iA.isSetMath()) {
+ initialAssignmentRoots.add(new AssignmentRuleValue((ASTNodeValue) copyAST(iA.getMath(), true, null, null).getUserObject(TEMP_VALUE), sr.getId(), stoichiometricCoefHash));
+ }
}
}
nRateRules = rateRulesRoots.size();
nAssignmentRules = assignmentRulesRoots.size();
}
+
/**
- *
* @param math
* @param variables
* @param current
* @return
*/
private Set getSetOfVariables(ASTNode math, Set variables, Set current) {
- if ((math.isVariable()) && (math.getVariable() != null)
- && (variables.contains(math.getVariable().getId()))) {
+ if ((math.isVariable()) && (math.getVariable() != null) && (variables.contains(math.getVariable().getId()))) {
current.add(math.getVariable().getId());
}
-
- for(ASTNode node: math.getChildren()) {
+ for (ASTNode node : math.getChildren()) {
getSetOfVariables(node, variables, current);
}
return current;
}
+
/**
* Creates a copy of an {@link ASTNode} or returns an {@link ASTNode} that
* is equal to the presented node.
- *
- * @param node
- * the node to copy
- * @param mergingPossible
- * flag that is true if it is allowed to return a node that is
- * equal to the given node
- * @param function
- * the function that is currently processed (if any) or null
- * @param inFunctionNodes
- * the nodes that already belong to the function
+ *
+ * @param node the node to copy
+ * @param mergingPossible flag that is true if it is allowed to return a node that is
+ * equal to the given node
+ * @param function the function that is currently processed (if any) or null
+ * @param inFunctionNodes the nodes that already belong to the function
* @return the found node
*/
private ASTNode copyAST(ASTNode node, boolean mergingPossible, FunctionValue function, List inFunctionNodes) {
@@ -2018,19 +1953,16 @@ private ASTNode copyAST(ASTNode node, boolean mergingPossible, FunctionValue fun
ASTNode copiedAST = null;
if (mergingPossible && !nodeString.equals("") && !nodeString.contains("")) {
//Be careful with local parameters!
- if (!(node.isName()) || (node.getType() == ASTNode.Type.NAME_TIME) || (node.getType() == ASTNode.Type.NAME_AVOGADRO)
- || !((node.getVariable() != null) && (node.getVariable() instanceof LocalParameter))) {
+ if (!(node.isName()) || (node.getType() == ASTNode.Type.NAME_TIME) || (node.getType() == ASTNode.Type.NAME_AVOGADRO) || !((node.getVariable() != null) && (node.getVariable() instanceof LocalParameter))) {
List nodesToLookAt = null;
if (function != null) {
nodesToLookAt = inFunctionNodes;
- }
- else {
+ } else {
nodesToLookAt = nodes;
}
for (ASTNode current : nodesToLookAt) {
- if (!(current.isName()) || (current.getType() == ASTNode.Type.NAME_TIME) || (current.getType() == ASTNode.Type.NAME_AVOGADRO)
- || ((current.isName()) && !(current.getVariable() instanceof LocalParameter))) {
- if ((current.toString().equals(nodeString)) && (!containUnequalLocalParameters(current,node))) {
+ if (!(current.isName()) || (current.getType() == ASTNode.Type.NAME_TIME) || (current.getType() == ASTNode.Type.NAME_AVOGADRO) || ((current.isName()) && !(current.getVariable() instanceof LocalParameter))) {
+ if ((current.toString().equals(nodeString)) && (!containUnequalLocalParameters(current, node))) {
copiedAST = current;
break;
}
@@ -2038,27 +1970,21 @@ private ASTNode copyAST(ASTNode node, boolean mergingPossible, FunctionValue fun
}
}
}
-
if (copiedAST == null) {
copiedAST = new ASTNode(node.getType());
copiedAST.setParentSBMLObject(node.getParentSBMLObject()); // The variable is not stored any more directly in the ASTNode2
-
for (ASTNode child : node.getChildren()) {
- if (function!=null) {
+ if (function != null) {
copiedAST.addChild(copyAST(child, true, function, inFunctionNodes));
- }
- else {
+ } else {
copiedAST.addChild(copyAST(child, mergingPossible, function, inFunctionNodes));
}
}
-
if (function != null) {
inFunctionNodes.add(copiedAST);
- }
- else {
+ } else {
nodes.add(copiedAST);
}
-
if (node.isSetUnits()) {
copiedAST.setUnits(node.getUnits());
}
@@ -2068,74 +1994,59 @@ private ASTNode copyAST(ASTNode node, boolean mergingPossible, FunctionValue fun
int integerValue = (int) value;
if (value - integerValue == 0.0d) {
copiedAST.setValue(integerValue);
- copiedAST.putUserObject(TEMP_VALUE, new IntegerValue(nodeInterpreter,
- copiedAST));
- }
- else {
+ copiedAST.putUserObject(TEMP_VALUE, new IntegerValue(nodeInterpreter, copiedAST));
+ } else {
copiedAST.setValue(value);
- copiedAST.putUserObject(TEMP_VALUE, new ASTNodeValue(nodeInterpreter,
- copiedAST));
+ copiedAST.putUserObject(TEMP_VALUE, new ASTNodeValue(nodeInterpreter, copiedAST));
}
-
break;
case FUNCTION_POWER:
- copiedAST.putUserObject(TEMP_VALUE, new PowerValue(nodeInterpreter,
- copiedAST));
+ copiedAST.putUserObject(TEMP_VALUE, new PowerValue(nodeInterpreter, copiedAST));
break;
case POWER:
- copiedAST.putUserObject(TEMP_VALUE, new PowerValue(nodeInterpreter,
- copiedAST));
+ copiedAST.putUserObject(TEMP_VALUE, new PowerValue(nodeInterpreter, copiedAST));
break;
case PLUS:
- copiedAST.putUserObject(TEMP_VALUE, new PlusValue(nodeInterpreter,
- copiedAST));
+ copiedAST.putUserObject(TEMP_VALUE, new PlusValue(nodeInterpreter, copiedAST));
break;
case TIMES:
- copiedAST.putUserObject(TEMP_VALUE, new TimesValue(nodeInterpreter,
- copiedAST));
+ copiedAST.putUserObject(TEMP_VALUE, new TimesValue(nodeInterpreter, copiedAST));
break;
case DIVIDE:
- copiedAST.putUserObject(TEMP_VALUE, new DivideValue(nodeInterpreter,
- copiedAST));
+ copiedAST.putUserObject(TEMP_VALUE, new DivideValue(nodeInterpreter, copiedAST));
break;
case MINUS:
- copiedAST.putUserObject(TEMP_VALUE, new MinusValue(nodeInterpreter,
- copiedAST));
+ copiedAST.putUserObject(TEMP_VALUE, new MinusValue(nodeInterpreter, copiedAST));
break;
case INTEGER:
copiedAST.setValue(node.getInteger());
- copiedAST.putUserObject(TEMP_VALUE, new IntegerValue(nodeInterpreter,
- copiedAST));
+ copiedAST.putUserObject(TEMP_VALUE, new IntegerValue(nodeInterpreter, copiedAST));
break;
-
case RATIONAL:
copiedAST.setValue(node.getNumerator(), node.getDenominator());
- copiedAST.putUserObject(TEMP_VALUE, new ASTNodeValue(nodeInterpreter,
- copiedAST));
+ copiedAST.putUserObject(TEMP_VALUE, new ASTNodeValue(nodeInterpreter, copiedAST));
break;
case NAME_TIME:
copiedAST.setName(node.getName());
- copiedAST.putUserObject(TEMP_VALUE, new ASTNodeValue(nodeInterpreter,
- copiedAST));
+ copiedAST.putUserObject(TEMP_VALUE, new ASTNodeValue(nodeInterpreter, copiedAST));
break;
case FUNCTION_DELAY:
copiedAST.setName(node.getName());
- copiedAST.putUserObject(TEMP_VALUE, new ASTNodeValue(nodeInterpreter,
- copiedAST));
+ copiedAST.putUserObject(TEMP_VALUE, new ASTNodeValue(nodeInterpreter, copiedAST));
break;
- /*
- * Names of identifiers: parameters, functions, species etc.
- */
+ /*
+ * Names of identifiers: parameters, functions, species etc.
+ */
case NAME:
copiedAST.setName(node.getName());
CallableSBase variable = node.getVariable();
- if ((variable==null) && (function==null)) {
+ if ((variable == null) && (function == null)) {
variable = model.findQuantity(node.getName());
- if ((variable==null) && (function==null)) {
+ if ((variable == null) && (function == null)) {
String id = node.getName();
- for (Reaction r: model.getListOfReactions()) {
+ for (Reaction r : model.getListOfReactions()) {
KineticLaw kl = r.getKineticLaw();
- for (LocalParameter lp: kl.getListOfLocalParameters()) {
+ for (LocalParameter lp : kl.getListOfLocalParameters()) {
if (lp.getId().equals(id)) {
variable = lp;
break;
@@ -2147,59 +2058,43 @@ private ASTNode copyAST(ASTNode node, boolean mergingPossible, FunctionValue fun
if (variable != null) {
copiedAST.setVariable(variable);
if (variable instanceof FunctionDefinition) {
- List arguments=new LinkedList();
- ASTNode lambda=((FunctionDefinition) variable).getMath();
- for (int i = 0; i != lambda.getChildren().size()-1; i++) {
+ List arguments = new LinkedList();
+ ASTNode lambda = ((FunctionDefinition) variable).getMath();
+ for (int i = 0; i != lambda.getChildren().size() - 1; i++) {
arguments.add(lambda.getChild(i));
}
- FunctionValue functionValue=new FunctionValue(nodeInterpreter,
- copiedAST,arguments);
+ FunctionValue functionValue = new FunctionValue(nodeInterpreter, copiedAST, arguments);
copiedAST.putUserObject(TEMP_VALUE, functionValue);
- ASTNode mathAST = copyAST(lambda,
- false,functionValue,new LinkedList());
+ ASTNode mathAST = copyAST(lambda, false, functionValue, new LinkedList());
functionValue.setMath(mathAST);
} else if (variable instanceof Species) {
boolean hasZeroSpatialDimensions = true;
Species sp = (Species) variable;
Compartment c = sp.getCompartmentInstance();
- if ((c!=null) && c.getSpatialDimensions() > 0) {
+ if ((c != null) && c.getSpatialDimensions() > 0) {
hasZeroSpatialDimensions = false;
}
- copiedAST.putUserObject(TEMP_VALUE, new SpeciesValue(nodeInterpreter,
- copiedAST, sp, this, symbolHash.get(variable
- .getId()), compartmentHash.get(variable.getId()), sp.getCompartment(), hasZeroSpatialDimensions, isAmount[symbolHash.get(variable.getId())]));
- } else if ((variable instanceof Compartment)
- || (variable instanceof Parameter)) {
- copiedAST.putUserObject(TEMP_VALUE, new CompartmentOrParameterValue(
- nodeInterpreter, copiedAST, (Symbol) variable, this, symbolHash
- .get(variable.getId())));
+ copiedAST.putUserObject(TEMP_VALUE, new SpeciesValue(nodeInterpreter, copiedAST, sp, this, symbolHash.get(variable.getId()), compartmentHash.get(variable.getId()), sp.getCompartment(), hasZeroSpatialDimensions, isAmount[symbolHash.get(variable.getId())]));
+ } else if ((variable instanceof Compartment) || (variable instanceof Parameter)) {
+ copiedAST.putUserObject(TEMP_VALUE, new CompartmentOrParameterValue(nodeInterpreter, copiedAST, (Symbol) variable, this, symbolHash.get(variable.getId())));
} else if (variable instanceof LocalParameter) {
- copiedAST.putUserObject(TEMP_VALUE, new LocalParameterValue(
- nodeInterpreter, copiedAST, (LocalParameter) variable));
+ copiedAST.putUserObject(TEMP_VALUE, new LocalParameterValue(nodeInterpreter, copiedAST, (LocalParameter) variable));
} else if (variable instanceof SpeciesReference) {
- copiedAST.putUserObject(TEMP_VALUE, new SpeciesReferenceValue(
- nodeInterpreter, copiedAST,
- (SpeciesReference) variable, this));
+ copiedAST.putUserObject(TEMP_VALUE, new SpeciesReferenceValue(nodeInterpreter, copiedAST, (SpeciesReference) variable, this));
} else if (variable instanceof Reaction) {
- copiedAST.putUserObject(TEMP_VALUE, new ReactionValue(
- nodeInterpreter, copiedAST, (Reaction) variable));
+ copiedAST.putUserObject(TEMP_VALUE, new ReactionValue(nodeInterpreter, copiedAST, (Reaction) variable));
}
} else {
- copiedAST.putUserObject(TEMP_VALUE, new NamedValue(
- nodeInterpreter, copiedAST, function));
+ copiedAST.putUserObject(TEMP_VALUE, new NamedValue(nodeInterpreter, copiedAST, function));
}
break;
-
case NAME_AVOGADRO:
- copiedAST.putUserObject(TEMP_VALUE, new ASTNodeValue(nodeInterpreter,
- copiedAST));
+ copiedAST.putUserObject(TEMP_VALUE, new ASTNodeValue(nodeInterpreter, copiedAST));
copiedAST.setName(node.getName());
break;
case REAL_E:
copiedAST.setValue(node.getMantissa(), node.getExponent());
- copiedAST.putUserObject(TEMP_VALUE, new ASTNodeValue(nodeInterpreter,
- copiedAST));
-
+ copiedAST.putUserObject(TEMP_VALUE, new ASTNodeValue(nodeInterpreter, copiedAST));
break;
case FUNCTION: {
copiedAST.setName(node.getName());
@@ -2207,129 +2102,114 @@ private ASTNode copyAST(ASTNode node, boolean mergingPossible, FunctionValue fun
if (variable != null) {
copiedAST.setVariable(variable);
if (variable instanceof FunctionDefinition) {
- List arguments=new LinkedList();
- ASTNode lambda=((FunctionDefinition) variable).getMath();
- for (int i = 0; i != lambda.getChildren().size()-1; i++) {
+ List arguments = new LinkedList();
+ ASTNode lambda = ((FunctionDefinition) variable).getMath();
+ for (int i = 0; i != lambda.getChildren().size() - 1; i++) {
arguments.add(lambda.getChild(i));
}
- FunctionValue functionValue=new FunctionValue(nodeInterpreter,
- copiedAST,arguments);
+ FunctionValue functionValue = new FunctionValue(nodeInterpreter, copiedAST, arguments);
copiedAST.putUserObject(TEMP_VALUE, functionValue);
- ASTNode mathAST = copyAST(lambda,
- false,functionValue,new LinkedList());
+ ASTNode mathAST = copyAST(lambda, false, functionValue, new LinkedList());
functionValue.setMath(mathAST);
}
}
break;
}
case FUNCTION_PIECEWISE:
- copiedAST.putUserObject(TEMP_VALUE, new ASTNodeValue(nodeInterpreter,
- copiedAST));
+ copiedAST.putUserObject(TEMP_VALUE, new ASTNodeValue(nodeInterpreter, copiedAST));
break;
case FUNCTION_ROOT:
- copiedAST.putUserObject(TEMP_VALUE, new RootFunctionValue(nodeInterpreter,copiedAST));
+ copiedAST.putUserObject(TEMP_VALUE, new RootFunctionValue(nodeInterpreter, copiedAST));
break;
case LAMBDA:
- copiedAST.putUserObject(TEMP_VALUE, new ASTNodeValue(nodeInterpreter,
- copiedAST));
+ copiedAST.putUserObject(TEMP_VALUE, new ASTNodeValue(nodeInterpreter, copiedAST));
break;
default:
- copiedAST.putUserObject(TEMP_VALUE, new ASTNodeValue(nodeInterpreter,
- copiedAST));
+ copiedAST.putUserObject(TEMP_VALUE, new ASTNodeValue(this, nodeInterpreter, copiedAST));
break;
}
-
}
-
return copiedAST;
}
+
/**
* Checks whether the two given nodes are equal to each other (especially
* regarding local parameters contained).
- *
- * @param node1
- * the first node
- * @param node2
- * the second node
+ *
+ * @param node1 the first node
+ * @param node2 the second node
* @return
*/
private boolean containUnequalLocalParameters(ASTNode node1, ASTNode node2) {
- if (node1.getChildCount()!=node2.getChildCount()) {
+ if (node1.getChildCount() != node2.getChildCount()) {
return true;
}
- if ((node1.getType() == ASTNode.Type.NAME) && (node2.getType() == ASTNode.Type.NAME) &&
- (node1.getVariable() instanceof LocalParameter) && (node2.getVariable() instanceof LocalParameter)) {
+ if ((node1.getType() == ASTNode.Type.NAME) && (node2.getType() == ASTNode.Type.NAME) && (node1.getVariable() instanceof LocalParameter) && (node2.getVariable() instanceof LocalParameter)) {
LocalParameter lp1 = (LocalParameter) node1.getVariable();
LocalParameter lp2 = (LocalParameter) node2.getVariable();
if ((lp1.getId().equals(lp2.getId())) && (!lp1.equals(lp2))) {
return true;
- }
- else {
+ } else {
return false;
}
- }
- else if ((node1.getType() == ASTNode.Type.NAME) && (node2.getType() == ASTNode.Type.NAME) &&
- (((node1.getVariable() instanceof LocalParameter) && !(node2.getVariable() instanceof LocalParameter))
- || (!(node1.getVariable() instanceof LocalParameter) && (node2.getVariable() instanceof LocalParameter)))) {
+ } else if ((node1.getType() == ASTNode.Type.NAME) && (node2.getType() == ASTNode.Type.NAME) && (((node1.getVariable() instanceof LocalParameter) && !(node2.getVariable() instanceof LocalParameter)) || (!(node1.getVariable() instanceof LocalParameter) && (node2.getVariable() instanceof LocalParameter)))) {
return true;
- }
- else {
+ } else {
boolean result = false;
for (int i = 0; i != node1.getChildCount(); i++) {
- result = result || containUnequalLocalParameters(node1.getChild(i),node2.getChild(i));
+ result = result || containUnequalLocalParameters(node1.getChild(i), node2.getChild(i));
}
return result;
}
}
+
/**
* Initializes the events of the given model. An Event that triggers at t = 0
* must not fire. Only when it triggers at t > 0
- *
+ *
* @throws SBMLException
*/
private void initEvents() throws SBMLException {
for (int i = 0; i < model.getEventCount(); i++) {
-
- if (model.getEvent(i).getDelay() == null) {
- if (events[i]!=null) {
- events[i].refresh(model.getEvent(i).getTrigger()
- .getInitialValue());
- }
- else {
- events[i] = new SBMLEventInProgress(model.getEvent(i).getTrigger()
- .getInitialValue());
+ if (model.getEvent(i).isSetTrigger()) {
+ if (model.getEvent(i).getDelay() == null) {
+ if (events[i] != null) {
+ events[i].refresh(model.getEvent(i).getTrigger().getInitialValue());
+ } else {
+ events[i] = new SBMLEventInProgress(model.getEvent(i).getTrigger().getInitialValue());
+ }
+ } else {
+ if (events[i] != null) {
+ events[i].refresh(model.getEvent(i).getTrigger().getInitialValue());
+ } else {
+ events[i] = new SBMLEventInProgressWithDelay(model.getEvent(i).getTrigger().getInitialValue());
+ }
}
} else {
- if (events[i]!=null) {
- events[i].refresh(model.getEvent(i).getTrigger()
- .getInitialValue());
- }
- else {
- events[i] = new SBMLEventInProgressWithDelay(model.getEvent(i).getTrigger()
- .getInitialValue());
- }
+ events[i] = null;
}
}
}
+
/**
* Chooses an event of a list randomly.
+ *
* @param highOrderEvents
*/
private void pickRandomEvent(List highOrderEvents) {
int length = highOrderEvents.size();
int random = RNG.randomInt(0, length - 1);
-
Integer winner = highOrderEvents.get(random);
highOrderEvents.clear();
highOrderEvents.add(winner);
-
}
- /* (non-Javadoc)
- * @see org.sbml.simulator.math.odes.EventDESystem#processAssignmentRules(double, double[])
+
+ /**
+ * {@inheritDoc}
*/
@Override
public boolean processAssignmentRules(double t, double Y[])
@@ -2342,14 +2222,13 @@ public boolean processAssignmentRules(double t, double Y[])
return changed;
}
+
/**
* This method creates assignments from the events currently stored in the
* associated HashMap with respect to their priority.
- *
- * @param priorities
- * the priorities
- * @param Y
- * the Y vector
+ *
+ * @param priorities the priorities
+ * @param Y the Y vector
* @return the event with assignments
*/
private SBMLEventInProgress processNextEvent(HashSet priorities, double[] Y)
@@ -2359,15 +2238,13 @@ private SBMLEventInProgress processNextEvent(HashSet priorities, double[
int index;
// check if more than one event has a priority set at this point in time
highOrderEvents.clear();
-
if (!priorities.isEmpty()) {
- boolean first=true;
- for (double priority:priorities) {
+ boolean first = true;
+ for (double priority : priorities) {
if (first) {
first = false;
highestPriority = priority;
- }
- else {
+ } else {
highestPriority = Math.max(highestPriority, priority);
}
}
@@ -2398,43 +2275,36 @@ private SBMLEventInProgress processNextEvent(HashSet priorities, double[
// execute the events chosen for execution
index = highOrderEvents.get(0);
events[index].clearAssignments();
-
// event does not use values from trigger time
if (!events[index].getUseValuesFromTriggerTime()) {
- for (AssignmentRuleValue obj: events[index].getRuleObjects()) {
+ for (AssignmentRuleValue obj : events[index].getRuleObjects()) {
obj.processRule(Y, astNodeTime, false);
newVal = obj.getValue();
- symbolIndex = obj.getIndex();;
- if ((symbolIndex >= 0)
- && (compartmentHash.containsValue(symbolIndex))) {
- updateSpeciesConcentration(symbolIndex, Y, Y[symbolIndex], newVal, false);
- }
+ symbolIndex = obj.getIndex();
+
if (symbolIndex >= 0) {
+ if (compartmentHash.containsValue(symbolIndex)) {
+ updateSpeciesConcentrationByCompartmentChange(symbolIndex, Y, Y[symbolIndex], newVal, -1);
+ }
events[index].addAssignment(symbolIndex, newVal);
}
-
}
-
} else {
// event uses values from trigger time -> get stored values
// from the HashMap
Double[] triggerTimeValues = events[index].getValues();
-
- int j = 0;
- if (events[index].getRuleObjects() != null){
- for (AssignmentRuleValue obj: events[index].getRuleObjects()) {
- //for (int j = 0; j < triggerTimeValues.length; j++) {
+ if (events[index].getRuleObjects() != null) {
+ int j = 0;
+ for (AssignmentRuleValue obj : events[index].getRuleObjects()) {
newVal = triggerTimeValues[j];
-
- symbolIndex=obj.getIndex();
+ symbolIndex = obj.getIndex();
if (symbolIndex >= 0) {
if (compartmentHash.containsValue(symbolIndex)) {
- updateSpeciesConcentrationAtEvents(symbolIndex, Y, Y[symbolIndex], newVal, index);
+ updateSpeciesConcentrationByCompartmentChange(symbolIndex, Y, Y[symbolIndex], newVal, index);
}
events[index].addAssignment(symbolIndex, newVal);
- }
- else {
- String id=obj.getSpeciesReferenceID();
+ } else {
+ String id = obj.getSpeciesReferenceID();
if (id != null) {
stoichiometricCoefHash.put(id, newVal);
}
@@ -2447,20 +2317,19 @@ private SBMLEventInProgress processNextEvent(HashSet priorities, double[
} catch (SBMLException exc) {
throw new DerivativeException(exc);
}
-
return events[index];
}
+
/**
* Processes the initial assignments
- *
- * @param time
- * the {@link ASTNode} time
- * @param Y
- * the Y vector
+ *
+ * @param time the {@link ASTNode} time
+ * @param Y the Y vector
* @throws SBMLException
*/
- public void processInitialAssignments(double time, double[] Y) throws SBMLException {
+ public void processInitialAssignments(double time, double[] Y)
+ throws SBMLException {
if (Y != null) {
for (int i = 0; i != initialAssignmentRoots.size(); i++) {
initialAssignmentRoots.get(i).processRule(Y, time, true);
@@ -2468,66 +2337,59 @@ public void processInitialAssignments(double time, double[] Y) throws SBMLExcept
}
}
+
/**
* Processes the rules
- *
- * @param time
- * the current time
- * @param changeRate
- * the changeRate vector
- * @param Y
- * the Y vector
+ *
+ * @param time the current time
+ * @param changeRate the changeRate vector
+ * @param Y the Y vector
* @param initialCalculations
* @return flag that is true if there has been some change caused by any
- * rule
+ * rule
* @throws SBMLException
*/
- public boolean processRules(double time, double[] changeRate, double[] Y, boolean initialCalculations) throws SBMLException {
- boolean changeByAssignmentRules=false;
- double intermediateASTNodeTime = - astNodeTime;
+ public boolean processRules(double time, double[] changeRate, double[] Y, boolean initialCalculations)
+ throws SBMLException {
+ boolean changeByAssignmentRules = false;
+ double intermediateASTNodeTime = -astNodeTime;
double oldTime = currentTime;
if (Y != null) {
for (int n = 0; n != numberOfAssignmentRulesLoops; n++) {
if (!delaysIncluded) {
System.arraycopy(Y, 0, oldY2, 0, Y.length);
- }
- else {
+ } else {
System.arraycopy(Y, 0, oldY, 0, Y.length);
}
- intermediateASTNodeTime = - intermediateASTNodeTime;
+ intermediateASTNodeTime = -intermediateASTNodeTime;
for (int i = 0; i != nAssignmentRules; i++) {
AssignmentRuleValue currentRuleObject = assignmentRulesRoots.get(i);
double oldValue = Double.NaN, newValue = Double.NaN;
if (!delaysIncluded) {
System.arraycopy(Y, 0, oldY2, 0, Y.length);
- }
- else if (containsDelays) {
+ } else if (containsDelays) {
System.arraycopy(Y, 0, oldY, 0, Y.length);
}
int index = currentRuleObject.getIndex();
if (index >= 0) {
oldValue = Y[index];
}
- boolean currentChange = currentRuleObject.processRule(Y,
- intermediateASTNodeTime, true);
+ boolean currentChange = currentRuleObject.processRule(Y, intermediateASTNodeTime, true);
currentTime = oldTime;
if (index >= 0) {
newValue = Y[index];
}
if (!delaysIncluded) {
System.arraycopy(oldY2, 0, Y, 0, Y.length);
- }
- else if (containsDelays) {
+ } else if (containsDelays) {
System.arraycopy(oldY, 0, Y, 0, Y.length);
}
if (index != -1) {
Y[index] = newValue;
}
-
if (currentChange && (!initialCalculations) && (index >= 0) && (compartmentHash.containsValue(index))) {
- updateSpeciesConcentration(index, Y, oldValue, newValue, false);
- }
- else if (currentChange && initialCalculations && (index >= 0) && (compartmentHash.containsValue(index))) {
+ updateSpeciesConcentrationByCompartmentChange(index, Y, oldValue, newValue, -1);
+ } else if (currentChange && initialCalculations && (index >= 0) && (compartmentHash.containsValue(index))) {
refreshSpeciesAmount(index, Y, oldValue, newValue);
}
changeByAssignmentRules = changeByAssignmentRules || currentChange;
@@ -2537,48 +2399,41 @@ else if (currentChange && initialCalculations && (index >= 0) && (compartmentHas
/*
* Compute changes due to rules
*/
-
- if (changeRate!=null) {
+ if (changeRate != null) {
for (int i = 0; i != nRateRules; i++) {
rateRulesRoots.get(i).processRule(changeRate, this.Y, astNodeTime);
}
}
return changeByAssignmentRules;
-
}
+
/**
* This method computes the multiplication of the stoichiometric matrix of the
* given model system with the reaction velocities vector passed to this
* method. Note, the stoichiometric matrix is only constructed implicitly by
* running over all reactions and considering all participating reactants and
* products with their according stoichiometry or stoichiometric math.
- *
+ *
* @param changeRate An array containing the rates of change for each species in the
- * model system of this class.
+ * model system of this class.
* @param time
* @throws SBMLException
*/
protected void processVelocities(double[] changeRate, double time)
throws SBMLException {
-
// Velocities of each reaction.
for (int reactionIndex = 0; reactionIndex != v.length; reactionIndex++) {
if (hasFastReactions) {
if (isProcessingFastReactions == reactionFast[reactionIndex]) {
- v[reactionIndex] = kineticLawRoots[reactionIndex].compileDouble(
- time, 0d);
+ v[reactionIndex] = kineticLawRoots[reactionIndex].compileDouble(time, 0d);
} else {
v[reactionIndex] = 0;
}
} else {
- v[reactionIndex] = kineticLawRoots[reactionIndex].compileDouble(
- time, 0d);
-
+ v[reactionIndex] = kineticLawRoots[reactionIndex].compileDouble(time, 0d);
}
}
-
-
for (int i = 0; i != stoichiometryValues.length; i++) {
if ((constantStoichiometry[i] == false) || (stoichiometrySet[i] == false)) {
stoichiometry[i] = stoichiometryValues[i].compileDouble(time);
@@ -2588,44 +2443,43 @@ protected void processVelocities(double[] changeRate, double time)
if (zeroChange[i]) {
value = 0;
} else if (isReactant[i]) {
- value= - 1 * stoichiometry[i] * v[reactionIndex[i]];
+ value = -1 * stoichiometry[i] * v[reactionIndex[i]];
} else {
value = stoichiometry[i] * v[reactionIndex[i]];
}
-
changeRate[speciesIndex[i]] += value;
}
-
for (int i = 0; i != changeRate.length; i++) {
// When the unit of reacting species is given mol/volume
// then it has to be considered in the change rate that should
// always be only in mol/time
if (inConcentrationValues[i]) {
- changeRate[i] = changeRate[i]
- / Y[compartmentIndexes[i]];
+ changeRate[i] = changeRate[i] / Y[compartmentIndexes[i]];
}
-
changeRate[i] *= conversionFactors[i];
}
-
+ for (int i = 0; i < nRateRules; i++) {
+ changeRate[symbolHash.get(rateRulesRoots.get(i).getVariable())] /= conversionFactors[symbolHash.get(rateRulesRoots.get(i).getVariable())];
+ }
}
- /* (non-Javadoc)
- * @see org.sbml.simulator.math.odes.FastProcessDESystem#setFastProcessComputation(boolean)
+
+ /**
+ * {@inheritDoc}
*/
@Override
public void setFastProcessComputation(boolean isProcessing) {
isProcessingFastReactions = isProcessing;
}
+
/**
* This method allows us to set the parameters of the model to the specified
* values in the given array.
- *
- * @param params
- * An array of parameter values to be set for this model. If the number
- * of given parameters does not match the number of model parameters,
- * an exception will be thrown.
+ *
+ * @param params An array of parameter values to be set for this model. If the number
+ * of given parameters does not match the number of model parameters,
+ * an exception will be thrown.
*/
// TODO changing the model directly not allowed / does this method still
// make sense?
@@ -2657,9 +2511,7 @@ public void setParameters(double[] params) {
init();
} catch (Exception exc) {
// This can never happen
- logger.log(Level.WARNING,
- "Could not re-initialize the model with the new parameter values.",
- exc);
+ logger.log(Level.WARNING, "Could not re-initialize the model with the new parameter values.", exc);
}
} else {
int nCompPlusSpec = model.getCompartmentCount() + model.getSpeciesCount();
@@ -2674,91 +2526,73 @@ public void setParameters(double[] params) {
/**
* Updates the concentration of species due to a change in the size of their
- * compartment
- *
- * @param compartmentIndex
- * the index of the compartment
- * @param changeRate
- * the changeRate vector
- * @param oldCompartmentValue
- * the old value of the compartment
- * @param newCompartmentValue
- * the new value of the compartment
- * @param causedByRateRule
- * flag that is true if a rate rule has set the change rate of
- * the compartment
+ * compartment (also at events)
+ *
+ * @param compartmentIndex the index of the compartment
+ * @param Y the Y vector
+ * @param oldCompartmentValue the old value of the compartment
+ * @param newCompartmentValue the new value of the compartment
+ * @param eventIndex
*/
- private void updateSpeciesConcentration(int compartmentIndex,
- double changeRate[], double oldCompartmentValue, double newCompartmentValue, boolean causedByRateRule) {
+ private void updateSpeciesConcentrationByCompartmentChange(int compartmentIndex, double Y[], double oldCompartmentValue, double newCompartmentValue, int eventIndex){
int speciesIndex;
- for (Entry entry : compartmentHash.entrySet()) {
+ for (Entry entry: compartmentHash.entrySet()) {
if (entry.getValue() == compartmentIndex) {
speciesIndex = symbolHash.get(entry.getKey());
if ((!isAmount[speciesIndex]) && (!speciesMap.get(symbolIdentifiers[speciesIndex]).getConstant())) {
- if (causedByRateRule) {
- changeRate[speciesIndex] = -changeRate[compartmentIndex]
- * Y[speciesIndex] / Y[compartmentIndex];
- } else {
- changeRate[speciesIndex] = (changeRate[speciesIndex] * oldCompartmentValue) / newCompartmentValue;
+ Y[speciesIndex] = (Y[speciesIndex] * oldCompartmentValue) / newCompartmentValue;
+ if (eventIndex != -1){
+ events[eventIndex].addAssignment(speciesIndex, Y[speciesIndex]);
}
-
}
-
}
}
-
}
/**
- * Updates the amount of a species due to a change in the size of their
- * compartment caused by an assignment rule overwriting the initial value
+ * Updates the changeRate of species due to a change in the size of their
+ * compartment (by RateRule)
+ *
* @param compartmentIndex
- * @param Y
- * @param oldCompartmentValue
- * @param newCompartmentValue
+ * @param changeRate
*/
- private void refreshSpeciesAmount(int compartmentIndex,
- double Y[], double oldCompartmentValue, double newCompartmentValue) {
+ private void updateSpeciesConcentrationByCompartmentRateRule(int compartmentIndex, double changeRate[]) {
int speciesIndex;
- for (Entry entry : compartmentHash.entrySet()) {
+ for (Entry entry: compartmentHash.entrySet()) {
if (entry.getValue() == compartmentIndex) {
speciesIndex = symbolHash.get(entry.getKey());
- if ((isAmount[speciesIndex]) && (speciesMap.get(symbolIdentifiers[speciesIndex]).isSetInitialConcentration())) {
- Y[speciesIndex] = (Y[speciesIndex] / oldCompartmentValue) * newCompartmentValue;
+ if ((!isAmount[speciesIndex]) && (!speciesMap.get(symbolIdentifiers[speciesIndex]).getConstant())) {
+ changeRate[speciesIndex] = -changeRate[compartmentIndex] * Y[speciesIndex] / Y[compartmentIndex];
}
-
}
}
-
}
+
/**
- * Updates the concentration of species due to a change in the size of their
- * compartment (at events)
+ * Updates the amount of a species due to a change in the size of their
+ * compartment caused by an assignment rule overwriting the initial value
+ *
* @param compartmentIndex
* @param Y
* @param oldCompartmentValue
* @param newCompartmentValue
- * @param eventIndex
*/
- private void updateSpeciesConcentrationAtEvents(int compartmentIndex,
- double Y[], double oldCompartmentValue, double newCompartmentValue, int eventIndex) {
+ private void refreshSpeciesAmount(int compartmentIndex, double Y[], double oldCompartmentValue, double newCompartmentValue) {
int speciesIndex;
for (Entry entry : compartmentHash.entrySet()) {
if (entry.getValue() == compartmentIndex) {
speciesIndex = symbolHash.get(entry.getKey());
- if ((!isAmount[speciesIndex]) && (!speciesMap.get(symbolIdentifiers[speciesIndex]).getConstant())) {
- Y[speciesIndex] = (Y[speciesIndex] * oldCompartmentValue) / newCompartmentValue;
- events[eventIndex].addAssignment(speciesIndex, Y[speciesIndex]);
+ if ((isAmount[speciesIndex]) && (speciesMap.get(symbolIdentifiers[speciesIndex]).isSetInitialConcentration())) {
+ Y[speciesIndex] = (Y[speciesIndex] / oldCompartmentValue) * newCompartmentValue;
}
-
}
}
-
}
- /* (non-Javadoc)
- * @see org.sbml.simulator.math.odes.DESystem#containsEventsOrRules()
+
+ /**
+ * {@inheritDoc}
*/
@Override
public boolean containsEventsOrRules() {
@@ -2769,16 +2603,18 @@ public boolean containsEventsOrRules() {
}
}
- /* (non-Javadoc)
- * @see org.sbml.simulator.math.ValueHolder#getCurrentValueOf(int)
+
+ /**
+ * {@inheritDoc}
*/
@Override
public double getCurrentValueOf(int position) {
return Y[position];
}
- /* (non-Javadoc)
- * @see org.sbml.simulator.math.odes.DESystem#getNumPositiveValues()
+
+ /**
+ * {@inheritDoc}
*/
@Override
public int getPositiveValueCount() {
@@ -2786,8 +2622,9 @@ public int getPositiveValueCount() {
return 0;
}
- /* (non-Javadoc)
- * @see org.simulator.math.odes.DelayedDESSystem#registerDelayValueHolder(org.simulator.math.odes.DelayValueHolder)
+
+ /**
+ * {@inheritDoc}
*/
@Override
public void registerDelayValueHolder(DelayValueHolder dvh) {
@@ -2795,9 +2632,8 @@ public void registerDelayValueHolder(DelayValueHolder dvh) {
}
- /*
- * (non-Javadoc)
- * @see org.simulator.math.odes.DelayValueHolder#computeDelayedValue(double, java.lang.String, org.simulator.math.odes.DESystem, double[], int)
+ /**
+ * {@inheritDoc}
*/
@Override
public double computeDelayedValue(double time, String id, DESystem DES, double[] initialValues, int yIndex) {
@@ -2805,21 +2641,20 @@ public double computeDelayedValue(double time, String id, DESystem DES, double[]
if (!delaysIncluded) {
return Y[symbolHash.get(id)];
}
-
if ((time < 0d) || ((time >= 0d) && (delayValueHolder == null))) {
int index = symbolHash.get(id);
double oldTime = currentTime;
currentTime = time;
- double value=Double.NaN;
- for (AssignmentRuleValue r: assignmentRulesRoots) {
+ double value = Double.NaN;
+ for (AssignmentRuleValue r : assignmentRulesRoots) {
if (r.getIndex() == index) {
- r.processRule(Y, -astNodeTime -0.01d, false);
- value=r.getValue();
+ r.processRule(Y, -astNodeTime - 0.01d, false);
+ value = r.getValue();
break;
}
}
if (Double.isNaN(value)) {
- for (AssignmentRuleValue i: initialAssignmentRoots) {
+ for (AssignmentRuleValue i : initialAssignmentRoots) {
if (i.getIndex() == index) {
i.processRule(Y, -astNodeTime - 0.01d, false);
value = i.getValue();
@@ -2828,33 +2663,30 @@ public double computeDelayedValue(double time, String id, DESystem DES, double[]
}
}
if (Double.isNaN(value)) {
- value=this.initialValues[index];
+ value = this.initialValues[index];
}
- currentTime=oldTime;
+ currentTime = oldTime;
return value;
- }
- else if (delayValueHolder == null) {
+ } else if (delayValueHolder == null) {
// TODO: Localize
- logger.warning(MessageFormat.format(
- "Cannot access delayed value at time {0,number} for {1}.",
- time, id));
+ logger.warning(MessageFormat.format("Cannot access delayed value at time {0,number} for {1}.", time, id));
return Double.NaN;
-
}
return delayValueHolder.computeDelayedValue(time, id, this, this.initialValues, symbolHash.get(id));
}
- /* (non-Javadoc)
- * @see org.simulator.math.odes.EventDESystem#getNoDerivatives()
+
+ /**
+ * {@inheritDoc}
*/
@Override
public boolean getNoDerivatives() {
return noDerivatives;
}
+
/**
- * @param reactionIndex
- * index of the reaction
+ * @param reactionIndex index of the reaction
* @return the current reaction velocity of a specific reaction
*/
public double compileReaction(int reactionIndex) {
@@ -2862,12 +2694,62 @@ public double compileReaction(int reactionIndex) {
return kineticLawRoots[reactionIndex].compileDouble(astNodeTime, 0d);
}
- /* (non-Javadoc)
- * @see org.simulator.math.odes.DESystem#setDelaysIncluded(boolean)
+
+ /**
+ * {@inheritDoc}
*/
@Override
public void setDelaysIncluded(boolean delaysIncluded) {
this.delaysIncluded = delaysIncluded;
}
+
+ public List getRateRulesRoots() {
+ return rateRulesRoots;
+ }
+
+
+ public Map getSymbolHash() {
+ return symbolHash;
+ }
+
+
+ public Map getConstantHash() {
+ return constantHash;
+ }
+
+
+ public double[] getY() {
+ return Y;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void propertyChange(PropertyChangeEvent propertyChangeEvent) {
+
+ if (propertyChangeEvent.getPropertyName().equals("result")){
+ setLatestTimePointResult((double[]) propertyChangeEvent.getNewValue());
+ }else {
+ setLatestTimePoint((Double) propertyChangeEvent.getNewValue());
+ }
+
+ }
+
+ public double getLatestTimePoint() {
+ return latestTimePoint;
+ }
+
+ private void setLatestTimePoint(double latestTimePoint) {
+ this.latestTimePoint = latestTimePoint;
+ }
+
+ public double[] getLatestTimePointResult() {
+ return latestTimePointResult;
+ }
+
+ private void setLatestTimePointResult(double[] latestTimePointResult) {
+ this.latestTimePointResult = latestTimePointResult;
+ }
}
diff --git a/src/main/java/org/simulator/sbml/SimpleConstraintListener.java b/src/main/java/org/simulator/sbml/SimpleConstraintListener.java
index 04cb20d2..3470791b 100644
--- a/src/main/java/org/simulator/sbml/SimpleConstraintListener.java
+++ b/src/main/java/org/simulator/sbml/SimpleConstraintListener.java
@@ -35,7 +35,7 @@
* This class represents a simple listener implementation to process the
* violation of {@link Constraint}s during simulation by logging the violation
* event in form of a warning.
- *
+ *
* @author Alexander Dörr
* @author Andreas Dräger
* @version $Rev$
@@ -59,9 +59,6 @@ public void processViolation(ConstraintEvent evt) {
constraint = evt.getSource().getMath().toFormula();
message = SBMLtools.toXML(evt.getSource().getMessage());
// TODO: Localize
- logger.log(Level.WARNING, MessageFormat.format(
- "[VIOLATION]\t{0} at time {1,number}: {2}",
- constraint, evt.getTime(), message));
+ logger.log(Level.WARNING, MessageFormat.format("[VIOLATION]\t{0} at time {1,number}: {2}", constraint, evt.getTime(), message));
}
-
}
diff --git a/src/main/java/org/simulator/sbml/astnode/ASTNodeInterpreter.java b/src/main/java/org/simulator/sbml/astnode/ASTNodeInterpreter.java
index a8f99af4..12b32944 100644
--- a/src/main/java/org/simulator/sbml/astnode/ASTNodeInterpreter.java
+++ b/src/main/java/org/simulator/sbml/astnode/ASTNodeInterpreter.java
@@ -24,22 +24,14 @@
*/
package org.simulator.sbml.astnode;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import java.util.logging.Logger;
-import org.sbml.jsbml.ASTNode;
-import org.sbml.jsbml.CallableSBase;
-import org.sbml.jsbml.Compartment;
-import org.sbml.jsbml.FunctionDefinition;
-import org.sbml.jsbml.LocalParameter;
-import org.sbml.jsbml.Parameter;
-import org.sbml.jsbml.Reaction;
-import org.sbml.jsbml.Species;
+import org.apache.commons.math.ode.DerivativeException;
+import org.sbml.jsbml.*;
import org.sbml.jsbml.util.Maths;
import org.sbml.jsbml.util.compilers.ASTNodeCompiler;
+import org.sbml.jsbml.validator.ModelOverdeterminedException;
import org.simulator.sbml.SBMLinterpreter;
import org.simulator.sbml.SBMLValueHolder;
@@ -48,12 +40,13 @@
* the calculation into account. It contains functions similar to the
* {@link ASTNodeCompiler} interface, which have the current time as additional
* argument.
- *
+ *
* @author Roland Keller
* @version $Rev: 205 $
* @since 1.0
*/
public class ASTNodeInterpreter {
+
/**
* A logger.
*/
@@ -72,17 +65,14 @@ public class ASTNodeInterpreter {
private SBMLValueHolder valueHolder;
/**
- *
* @param valueHolder
*/
public ASTNodeInterpreter(SBMLValueHolder valueHolder) {
this.valueHolder = valueHolder;
- funcArgs=new HashMap();
+ funcArgs = new HashMap();
}
-
/**
- *
* @param value
* @return stringValue the interpreted String value of the node
*/
@@ -91,7 +81,6 @@ public final String toString(ASTNode value) {
}
/**
- *
* @param name
* @param time
* @param delay
@@ -111,7 +100,6 @@ public double compileDouble(String name, double time, double delay) {
}
/**
- *
* @param nsb
* @param time
* @param delay
@@ -124,15 +112,9 @@ public double compileDouble(CallableSBase nsb, double time, double delay) {
double compartmentValue = valueHolder.getCurrentCompartmentValueOf(id);
if (compartmentValue == 0d) {
return valueHolder.getCurrentSpeciesValue(id);
- }
-
- else if (s.isSetInitialAmount() && !s.getHasOnlySubstanceUnits()) {
+ } else if (s.isSetInitialAmount() && !s.getHasOnlySubstanceUnits()) {
return (valueHolder.getCurrentSpeciesValue(id) / compartmentValue);
-
- }
-
- else if (s.isSetInitialConcentration() && s.getHasOnlySubstanceUnits()) {
-
+ } else if (s.isSetInitialConcentration() && s.getHasOnlySubstanceUnits()) {
return (valueHolder.getCurrentSpeciesValue(id) * compartmentValue);
} else {
return valueHolder.getCurrentSpeciesValue(id);
@@ -143,19 +125,16 @@ else if (s.isSetInitialConcentration() && s.getHasOnlySubstanceUnits()) {
} else if (nsb instanceof LocalParameter) {
LocalParameter p = (LocalParameter) nsb;
return p.getValue();
-
} else if (nsb instanceof Reaction) {
Reaction r = (Reaction) nsb;
if (r.isSetKineticLaw()) {
- ((ASTNodeValue) r.getKineticLaw().getMath().getUserObject(SBMLinterpreter.TEMP_VALUE))
- .compileDouble(time, delay);
+ ((ASTNodeValue) r.getKineticLaw().getMath().getUserObject(SBMLinterpreter.TEMP_VALUE)).compileDouble(time, delay);
}
}
return Double.NaN;
}
/**
- *
* @param nsb
* @param time
* @return booleanValue the interpreted boolean value of the node
@@ -168,35 +147,31 @@ public boolean compileBoolean(CallableSBase nsb, double time) {
for (ASTNode child : math.getChildren()) {
variables.add(compileString(child));
}
- return functionBoolean(rightChild, variables,
- new ASTNodeValue[0], new double[math.getChildCount()], time);
+ return functionBoolean(rightChild, variables, new ASTNodeValue[0], new double[math.getChildCount()], time);
}
return false;
}
/**
- *
* @param rightChild
* @param variables
* @param children
* @param nArguments
* @param values
* @param time
- * @return doubleValue the interpreted double value of the node
+ * @return doubleValue the interpreted double value of the node
*/
- public double functionDouble(ASTNodeValue rightChild,
- List variables, ASTNodeValue[] children, int nArguments, double[] values, double time) {
+ public double functionDouble(ASTNodeValue rightChild, List variables, ASTNodeValue[] children, int nArguments, double[] values, double time, double delay) {
for (int i = 0; i < nArguments; i++) {
- values[i] = children[i].compileDouble(time, 0d);
+ values[i] = children[i].compileDouble(time, delay);
}
- double value = rightChild.compileDouble(time, 0d);
+ double value = rightChild.compileDouble(time, delay);
return value;
}
/**
- *
* @param child
- * @return stringValue the interpreted String value of the node
+ * @return stringValue the interpreted String value of the node
*/
public String compileString(ASTNodeValue child) {
if (child.isName()) {
@@ -207,7 +182,6 @@ public String compileString(ASTNodeValue child) {
}
/**
- *
* @param child
* @return stringValue the interpreted String value of the node
*/
@@ -220,7 +194,6 @@ public String compileString(ASTNode child) {
}
/**
- *
* @param children
* @param time
* @return doubleValue the interpreted double value of the node
@@ -235,7 +208,6 @@ public double lambdaDouble(ASTNodeValue[] children, double time) {
}
/**
- *
* @param children
* @param time
* @return booleanValue the interpreted boolean value of the node
@@ -247,11 +219,9 @@ public boolean lambdaBoolean(ASTNodeValue[] children, double time) {
}
// TODO: what happens with d?
return children[children.length - 1].compileBoolean(time);
-
}
/**
- *
* @param children
* @param time
* @param delay
@@ -260,15 +230,14 @@ public boolean lambdaBoolean(ASTNodeValue[] children, double time) {
public double piecewise(ASTNodeValue[] children, double time, double delay) {
int i;
for (i = 1; i < children.length - 1; i += 2) {
- if (children[i].compileBoolean(time)) { return (children[i - 1]
- .compileDouble(time, delay)); }
+ if ((children[i].compileDouble(time, delay)) > 0d) {
+ return (children[i - 1].compileDouble(time, delay));
+ }
}
return children[i - 1].compileDouble(time, delay);
-
}
/**
- *
* @param userObject
* @param time
* @param delay
@@ -279,7 +248,6 @@ public double log(ASTNodeValue userObject, double time, double delay) {
}
/**
- *
* @param left
* @param right
* @param time
@@ -291,22 +259,80 @@ public double log(ASTNodeValue left, ASTNodeValue right, double time, double del
}
/**
- *
* @param functionDefinitionName
* @param args
* @param time
- * @return doubleValue the interpreted double value of the nodedoubleValue the interpreted double value of the node
+ * @return doubleValue the interpreted double value of the nodedoubleValue the interpreted double value of the node
*/
- public double functionDouble(String functionDefinitionName,
- List args, double time) {
+ public double functionDouble(String functionDefinitionName, List args, double time) {
// can not compile a function without an ASTNode representing its lambda
// expression
-
return Double.NaN;
}
/**
- *
+ * @param dividend
+ * @param divisor
+ * @param time
+ * @param delay
+ * @return doubleValue the interpreted double value of the node
+ */
+ public double quotient(ASTNodeValue dividend, ASTNodeValue divisor, double time, double delay) {
+ return Math.floorDiv((int) dividend.compileDouble(time, delay), (int) divisor.compileDouble(time, delay));
+ }
+
+ /**
+ * @param dividend
+ * @param divisor
+ * @param time
+ * @param delay
+ * @return doubleValue the interpreted double value of the node
+ */
+ public double remainder(ASTNodeValue dividend, ASTNodeValue divisor, double time, double delay) {
+ return Math.floorMod((int) dividend.compileDouble(time, delay), (int) divisor.compileDouble(time, delay));
+ }
+
+ /**
+ * @param children
+ * @param time
+ * @param delay
+ * @return doubleValue the interpreted double value of the node
+ */
+ public double maximum(ASTNodeValue[] children, double time, double delay) {
+ double ans = -Double.MAX_VALUE;
+ for (ASTNodeValue child : children) {
+ ans = Math.max(ans, child.compileDouble(time, delay));
+ }
+ return ans;
+ }
+
+ /**
+ * @param children
+ * @param time
+ * @param delay
+ * @return doubleValue the interpreted double value of the node
+ */
+ public double minimum(ASTNodeValue[] children, double time, double delay) {
+ double ans = Double.MAX_VALUE;
+ for (ASTNodeValue child : children) {
+ ans = Math.min(ans, child.compileDouble(time, delay));
+ }
+ return ans;
+ }
+
+ /**
+ * @param antecedent
+ * @param consequent
+ * @param time
+ * @param delay
+ * @return doubleValue the interpreted double value of the node
+ */
+ public double implies(ASTNodeValue antecedent, ASTNodeValue consequent, double time, double delay) {
+ return (antecedent.compileDouble(time, delay) > 0) ?
+ ((consequent.compileDouble(time, delay) > 0) ? 1 : 0) : 1;
+ }
+
+ /**
* @param userObject
* @param time
* @param delay
@@ -317,7 +343,6 @@ public double tanh(ASTNodeValue userObject, double time, double delay) {
}
/**
- *
* @param userObject
* @param time
* @param delay
@@ -328,7 +353,6 @@ public double tan(ASTNodeValue userObject, double time, double delay) {
}
/**
- *
* @param userObject
* @param time
* @param delay
@@ -339,7 +363,6 @@ public double sinh(ASTNodeValue userObject, double time, double delay) {
}
/**
- *
* @param userObject
* @param time
* @param delay
@@ -350,7 +373,6 @@ public double sin(ASTNodeValue userObject, double time, double delay) {
}
/**
- *
* @param userObject
* @param time
* @param delay
@@ -361,7 +383,6 @@ public double sech(ASTNodeValue userObject, double time, double delay) {
}
/**
- *
* @param userObject
* @param time
* @param delay
@@ -373,7 +394,6 @@ public double sec(ASTNodeValue userObject, double time, double delay) {
}
/**
- *
* @param rootExponent
* @param radiant
* @param time
@@ -385,7 +405,6 @@ public double root(ASTNodeValue rootExponent, ASTNodeValue radiant, double time,
}
/**
- *
* @param rootExponent
* @param userObject
* @param time
@@ -397,7 +416,6 @@ public double root(double rootExponent, ASTNodeValue userObject, double time, do
}
/**
- *
* @param userObject
* @param time
* @param delay
@@ -408,7 +426,6 @@ public double ln(ASTNodeValue userObject, double time, double delay) {
}
/**
- *
* @param userObject
* @param time
* @param delay
@@ -419,7 +436,6 @@ public double floor(ASTNodeValue userObject, double time, double delay) {
}
/**
- *
* @param userObject
* @param time
* @param delay
@@ -430,7 +446,6 @@ public double factorial(ASTNodeValue userObject, double time, double delay) {
}
/**
- *
* @param userObject
* @param time
* @param delay
@@ -441,7 +456,6 @@ public double exp(ASTNodeValue userObject, double time, double delay) {
}
/**
- *
* @param userObject
* @param time
* @param delay
@@ -452,7 +466,6 @@ public double csch(ASTNodeValue userObject, double time, double delay) {
}
/**
- *
* @param userObject
* @param time
* @param delay
@@ -463,7 +476,6 @@ public double csc(ASTNodeValue userObject, double time, double delay) {
}
/**
- *
* @param userObject
* @param time
* @param delay
@@ -474,7 +486,6 @@ public double coth(ASTNodeValue userObject, double time, double delay) {
}
/**
- *
* @param userObject
* @param time
* @param delay
@@ -485,7 +496,6 @@ public double cot(ASTNodeValue userObject, double time, double delay) {
}
/**
- *
* @param userObject
* @param time
* @param delay
@@ -496,7 +506,6 @@ public double cosh(ASTNodeValue userObject, double time, double delay) {
}
/**
- *
* @param userObject
* @param time
* @param delay
@@ -507,7 +516,6 @@ public double cos(ASTNodeValue userObject, double time, double delay) {
}
/**
- *
* @param userObject
* @param time
* @param delay
@@ -518,7 +526,6 @@ public double ceiling(ASTNodeValue userObject, double time, double delay) {
}
/**
- *
* @param userObject
* @param time
* @param delay
@@ -529,7 +536,6 @@ public double arctanh(ASTNodeValue userObject, double time, double delay) {
}
/**
- *
* @param name
* @param children
* @return booleanValue the interpreted boolean value of the node
@@ -537,12 +543,10 @@ public double arctanh(ASTNodeValue userObject, double time, double delay) {
public boolean functionBoolean(String name, List children) {
// can not compile a function without an ASTNode representing its lambda
// expression
-
return false;
}
/**
- *
* @param rightChild
* @param variables
* @param children
@@ -550,8 +554,7 @@ public boolean functionBoolean(String name, List children) {
* @param time
* @return booleanValue the interpreted boolean value of the node
*/
- public boolean functionBoolean(ASTNodeValue rightChild,
- List variables, ASTNodeValue[] children, double[] values, double time) {
+ public boolean functionBoolean(ASTNodeValue rightChild, List variables, ASTNodeValue[] children, double[] values, double time) {
for (int i = 0; i < children.length; i++) {
values[i] = children[i].compileDouble(time, 0d);
}
@@ -560,97 +563,116 @@ public boolean functionBoolean(ASTNodeValue rightChild,
}
/**
- *
- * @param left
- * @param right
+ * @param children
* @param time
* @return booleanValue the interpreted boolean value of the node
*/
- public boolean lt(ASTNodeValue left, ASTNodeValue right, double time) {
- return (left.compileDouble(time, 0d) < right.compileDouble(time, 0d));
+ public boolean lt(ASTNodeValue[] children, double time) {
+ for (int i = 0; i < children.length - 1; i++) {
+ if (children[i].compileDouble(time, 0d) >= children[i + 1].compileDouble(time, 0d)) {
+ return false;
+ }
+ }
+ return true;
}
/**
- *
- * @param left
- * @param right
+ * @param children
* @param time
* @return booleanValue the interpreted boolean value of the node
*/
- public boolean leq(ASTNodeValue left, ASTNodeValue right, double time) {
- return (left.compileDouble(time, 0d) <= right.compileDouble(time, 0d));
+ public boolean leq(ASTNodeValue[] children, double time) {
+ for (int i = 0; i < children.length - 1; i++) {
+ if (children[i].compileDouble(time, 0d) > children[i + 1].compileDouble(time, 0d)) {
+ return false;
+ }
+ }
+ return true;
}
/**
- *
- * @param left
- * @param right
+ * @param children
* @param time
* @return booleanValue the interpreted boolean value of the node
*/
- public boolean neq(ASTNodeValue left, ASTNodeValue right, double time) {
- return (left.compileDouble(time, 0d) != right.compileDouble(time, 0d));
+ public boolean neq(ASTNodeValue[] children, double time) {
+ Set values = new HashSet();
+ for (ASTNodeValue num : children) {
+ if (values.contains(num.compileDouble(time, 0d))) {
+ return false;
+ }
+ values.add(num.compileDouble(time, 0d));
+ }
+ return true;
}
/**
- *
- * @param left
- * @param right
+ * @param children
* @param time
* @return booleanValue the interpreted boolean value of the node
*/
- public boolean gt(ASTNodeValue left, ASTNodeValue right, double time) {
- return (left.compileDouble(time, 0d) > right.compileDouble(time, 0d));
+ public boolean gt(ASTNodeValue[] children, double time) {
+ for (int i = 0; i < children.length - 1; i++) {
+ if (children[i].compileDouble(time, 0d) <= children[i + 1].compileDouble(time, 0d)) {
+ return false;
+ }
+ }
+ return true;
}
/**
- *
- * @param left
- * @param right
+ * @param children
* @param time
* @return booleanValue the interpreted boolean value of the node
*/
- public boolean geq(ASTNodeValue left, ASTNodeValue right, double time) {
- return (left.compileDouble(time, 0d) >= right.compileDouble(time, 0d));
+ public boolean geq(ASTNodeValue[] children, double time) {
+ for (int i = 0; i < children.length - 1; i++) {
+ if (children[i].compileDouble(time, 0d) < children[i + 1].compileDouble(time, 0d)) {
+ return false;
+ }
+ }
+ return true;
}
/**
- *
- * @param left
- * @param right
+ * @param children
* @param time
-
* @return booleanValue the interpreted boolean value of the node
*/
- public boolean eq(ASTNodeValue left, ASTNodeValue right, double time) {
- return (left.compileDouble(time, 0d) == right.compileDouble(time, 0d));
+ public boolean eq(ASTNodeValue[] children, double time) {
+ double first = children[0].compileDouble(time, 0d);
+ for (int i = 1; i < children.length; i++) {
+ if (children[i].compileDouble(time, 0d) != first) {
+ return false;
+ }
+ }
+ return true;
}
/**
- *
* @param node
* @param time
* @return booleanValue the interpreted boolean value of the node
*/
public boolean not(ASTNodeValue node, double time) {
- return node.compileBoolean(time) ? false : true;
+ return !(node.compileDouble(time, 0d) > 0d);
}
/**
- *
* @param children
* @param time
* @return booleanValue the interpreted boolean value of the node
*/
public boolean or(ASTNodeValue[] children, double time) {
for (int i = 0; i < children.length; i++) {
- if (children[i].compileBoolean(time)) { return true; }
+ if (children[i].compileDouble(time, 0d) > 0d) {
+ return true;
+ }
}
return false;
}
/**
- *
* @param children
* @param time
* @return booleanValue the interpreted boolean value of the node
@@ -659,7 +681,7 @@ public boolean xor(ASTNodeValue[] children, double time) {
boolean value = false;
int size = children.length;
for (int i = 0; i < size; i++) {
- if (children[i].compileBoolean(time)) {
+ if (children[i].compileDouble(time, 0d) > 0d) {
if (value) {
return false;
} else {
@@ -671,20 +693,20 @@ public boolean xor(ASTNodeValue[] children, double time) {
}
/**
- *
* @param children
* @param time
* @return booleanValue the interpreted boolean value of the node
*/
public boolean and(ASTNodeValue[] children, int size, double time) {
for (int i = 0; i < size; i++) {
- if (!(children[i].compileBoolean(time))) { return false; }
+ if (!(children[i].compileDouble(time, 0d) > 0d)) {
+ return false;
+ }
}
return true;
}
/**
- *
* @param userObject
* @param time
* @param delay
@@ -695,7 +717,6 @@ public double arctan(ASTNodeValue userObject, double time, double delay) {
}
/**
- *
* @param userObject
* @param time
* @param delay
@@ -706,7 +727,6 @@ public double arcsinh(ASTNodeValue userObject, double time, double delay) {
}
/**
- *
* @param userObject
* @param time
* @param delay
@@ -717,7 +737,6 @@ public double arcsin(ASTNodeValue userObject, double time, double delay) {
}
/**
- *
* @param userObject
* @param time
* @param delay
@@ -731,7 +750,6 @@ public double arcsech(ASTNodeValue userObject, double time, double delay) {
}
/**
- *
* @param userObject
* @param time
* @param delay
@@ -742,7 +760,6 @@ public double arcsec(ASTNodeValue userObject, double time, double delay) {
}
/**
- *
* @param userObject
* @param time
* @param delay
@@ -753,7 +770,6 @@ public double arccsch(ASTNodeValue userObject, double time, double delay) {
}
/**
- *
* @param userObject
* @param time
* @param delay
@@ -764,7 +780,6 @@ public double arccsc(ASTNodeValue userObject, double time, double delay) {
}
/**
- *
* @param userObject
* @param time
* @param delay
@@ -775,7 +790,6 @@ public double arccoth(ASTNodeValue userObject, double time, double delay) {
}
/**
- *
* @param userObject
* @param time
* @param delay
@@ -787,7 +801,6 @@ public double arccot(ASTNodeValue userObject, double time, double delay) {
}
/**
- *
* @param userObject
* @param time
* @param delay
@@ -798,7 +811,6 @@ public double arccosh(ASTNodeValue userObject, double time, double delay) {
}
/**
- *
* @param userObject
* @param time
* @param delay
@@ -809,7 +821,6 @@ public double arccos(ASTNodeValue userObject, double time, double delay) {
}
/**
- *
* @param userObject
* @param time
* @param delay
@@ -820,7 +831,6 @@ public double abs(ASTNodeValue userObject, double time, double delay) {
}
/**
- *
* @param mantissa
* @param exponent
* @param units
@@ -831,15 +841,13 @@ public double compile(double mantissa, int exponent, String units) {
}
/**
- *
* @param x
* @param delay
* @param timeUnits
* @param time
* @return doubleValue the interpreted double value of the node
*/
- public final double delay(ASTNodeValue x, ASTNodeValue delay,
- String timeUnits, double time) {
+ public final double delay(ASTNodeValue x, ASTNodeValue delay, String timeUnits, double time) {
double delayTime = delay.compileDouble(time, 0d);
//double valueTime = symbolTime(delayName) - delayTime;
return x.compileDouble(time, delayTime);
@@ -847,7 +855,6 @@ public final double delay(ASTNodeValue x, ASTNodeValue delay,
}
/**
- *
* @return doubleValue the interpreted double value of the node
*/
public double symbolTime() {
@@ -855,7 +862,6 @@ public double symbolTime() {
}
/**
- *
* @param numerator
* @param denominator
* @return doubleValue the interpreted double value of the node
@@ -865,7 +871,6 @@ public double frac(int numerator, int denominator) {
}
/**
- *
* @param left
* @param right
* @param time
@@ -877,7 +882,6 @@ public double frac(ASTNodeValue left, ASTNodeValue right, double time, double de
}
/**
- *
* @param children
* @param size
* @param time
@@ -889,7 +893,6 @@ public double times(ASTNodeValue[] children, int size, double time, double delay
return (1d);
} else {
double value = 1d;
-
for (int i = 0; i != size; i++) {
value *= children[i].compileDouble(time, delay);
}
@@ -898,7 +901,6 @@ public double times(ASTNodeValue[] children, int size, double time, double delay
}
/**
- *
* @param children
* @param size
* @param time
@@ -906,7 +908,6 @@ public double times(ASTNodeValue[] children, int size, double time, double delay
* @return doubleValue the interpreted double value of the node
*/
public double minus(ASTNodeValue[] children, int size, double time, double delay) {
-
double value = 0d;
if (size > 0) {
value = children[0].compileDouble(time, delay);
@@ -918,7 +919,6 @@ public double minus(ASTNodeValue[] children, int size, double time, double delay
}
/**
- *
* @param children
* @param size
* @param time
@@ -934,7 +934,6 @@ public double plus(ASTNodeValue[] children, int size, double time, double delay)
}
/**
- *
* @param left
* @param right
* @param time
@@ -946,29 +945,25 @@ public double pow(ASTNodeValue left, ASTNodeValue right, double time, double del
double r = right.compileDouble(time, delay);
if (r == 2) {
return l * l;
- }
- else if (r == 3) {
+ } else if (r == 3) {
return l * l * l;
}
if ((l < 0) && (!right.getNode().isInteger())) {
double base = l * -1;
double result = Math.pow(base, r);
-
double sign = Math.pow(-1, r);
if (Double.isNaN(sign)) {
sign = -1;
logger.fine("Power with negative base and non-integer exponent encountered.");
}
- result = result*sign;
+ result = result * sign;
return result;
- }
- else {
+ } else {
return Math.pow(l, r);
}
}
/**
- *
* @param value
* @param units
* @return doubleValue the interpreted double value of the node
@@ -979,7 +974,6 @@ public double compile(double value, String units) {
}
/**
- *
* @param userObject
* @param time
* @param delay
@@ -990,7 +984,6 @@ public double sqrt(ASTNodeValue userObject, double time, double delay) {
}
/**
- *
* @param userObject
* @param time
* @param delay
@@ -1000,4 +993,28 @@ public double uMinus(ASTNodeValue userObject, double time, double delay) {
return -userObject.compileDouble(time, delay);
}
+ /**
+ * @param sbmlInterpreter
+ * @param sBase
+ * @param time
+ * @return doubleValue the interpreted double value of the node
+ */
+ public double rateOf(SBMLinterpreter sbmlInterpreter, CallableSBase sBase, double time, double delay) {
+ if ((time < delay) || (sBase instanceof LocalParameter) || (sbmlInterpreter.getConstantHash().get(sBase.getId()))) {
+ return 0d;
+ }
+ List rateRulesRoots = sbmlInterpreter.getRateRulesRoots();
+ for (int i = 0; i < sbmlInterpreter.getRateRulesRoots().size(); i++) {
+ RateRuleValue rrRoot = rateRulesRoots.get(i);
+ if (rrRoot.getVariable().equals(sBase.getId())) {
+ return sbmlInterpreter.getRateRulesRoots().get(i).getNodeObject().compileDouble(time, 0d);
+ }
+ }
+ double[] changeRate = sbmlInterpreter.getNewChangeRate();
+ if (changeRate != null) {
+ return changeRate[sbmlInterpreter.getSymbolHash().get(sBase.getId())];
+ } else {
+ return 0d;
+ }
+ }
}
diff --git a/src/main/java/org/simulator/sbml/astnode/ASTNodeValue.java b/src/main/java/org/simulator/sbml/astnode/ASTNodeValue.java
index 4aede9d0..b2c2f983 100644
--- a/src/main/java/org/simulator/sbml/astnode/ASTNodeValue.java
+++ b/src/main/java/org/simulator/sbml/astnode/ASTNodeValue.java
@@ -24,6 +24,7 @@
*/
package org.simulator.sbml.astnode;
+import java.util.Arrays;
import java.util.logging.Logger;
import org.sbml.jsbml.ASTNode;
@@ -35,12 +36,13 @@
* This class can compute and store the interpreted value (double or boolean) of
* an {@link ASTNode} at the current time. A new computation is only done if the
* time has changed. So the computation is time-efficient.
- *
+ *
* @author Roland Keller
* @version $Rev: 205 $
* @since 1.0
*/
public class ASTNodeValue {
+
/**
* The time of the last computation
*/
@@ -150,7 +152,7 @@ public class ASTNodeValue {
* Resets the node
*/
public void reset() {
- alreadyProcessed=false;
+ alreadyProcessed = false;
}
/**
@@ -158,8 +160,14 @@ public void reset() {
*/
public static final Logger logger = Logger.getLogger(ASTNodeValue.class.getName());
+ public SBMLinterpreter sbmlInterpreter;
+
+ public ASTNodeValue(SBMLinterpreter sbmlInterpreter, ASTNodeInterpreter interpreter, ASTNode node) {
+ this(interpreter, node);
+ this.sbmlInterpreter = sbmlInterpreter;
+ }
+
/**
- *
* @param interpreter
* @param node
*/
@@ -173,12 +181,10 @@ public ASTNodeValue(ASTNodeInterpreter interpreter, ASTNode node) {
real = node.getReal();
isInfinite = Double.isInfinite(real);
isConstant = true;
- }
- else if (nodeType==ASTNode.Type.INTEGER) {
+ } else if (nodeType == ASTNode.Type.INTEGER) {
real = node.getInteger();
isConstant = true;
- }
- else {
+ } else {
real = Double.NaN;
}
if (node.isSetUnits()) {
@@ -193,38 +199,33 @@ else if (nodeType==ASTNode.Type.INTEGER) {
denominator = node.getDenominator();
isConstant = true;
}
-
if (node.isName()) {
name = node.getName();
}
-
time = 0d;
children = new ASTNodeValue[node.getChildCount()];
-
boolean allChildrenConstant = true;
-
if (node != null) {
- for (int i = 0; i!= node.getChildCount(); i++) {
+ for (int i = 0; i != node.getChildCount(); i++) {
ASTNode childNode = node.getChild(i);
Object userObject = childNode.getUserObject(SBMLinterpreter.TEMP_VALUE);
if (userObject != null) {
- children[i]=(ASTNodeValue)userObject;
- allChildrenConstant&= children[i].getConstant();
+ children[i] = (ASTNodeValue) userObject;
+ allChildrenConstant &= children[i].getConstant();
}
}
}
numChildren = node.getChildCount();
- if (numChildren>0) {
+ if (numChildren > 0) {
if (allChildrenConstant) {
isConstant = true;
}
leftChild = children[0];
- rightChild = children[numChildren-1];
+ rightChild = children[numChildren - 1];
}
}
/**
- *
* @return time the time of the last computation of the value
*/
public double getTime() {
@@ -232,7 +233,6 @@ public double getTime() {
}
/**
- *
* @param time
*/
public void setTime(double time) {
@@ -240,7 +240,6 @@ public void setTime(double time) {
}
/**
- *
* @return constant?
*/
public boolean getConstant() {
@@ -248,7 +247,6 @@ public boolean getConstant() {
}
/**
- *
* @return node the corresponding ASTNode
*/
public ASTNode getNode() {
@@ -257,20 +255,21 @@ public ASTNode getNode() {
/**
* Returns the value as an object (double or boolean)
+ *
* @param time
* @return value the double or boolean value of the node
*/
public Object getValue(double time) {
if (isDouble) {
return compileDouble(time, 0d);
- }
- else {
+ } else {
return compileBoolean(time);
}
}
/**
* Computes the double value if the time has changed and otherwise returns the already computed value
+ *
* @param time
* @param delay
* @return doubleValue the double value of the node
@@ -284,7 +283,7 @@ public double compileDouble(double time, double delay) {
computeDoubleValue(delay);
if (isConstant) {
boolean childrenProcessed = true;
- for(ASTNodeValue child: children) {
+ for (ASTNodeValue child : children) {
childrenProcessed &= child.getAlreadyProcessed();
}
if ((children.length > 0) && childrenProcessed) {
@@ -299,7 +298,6 @@ public double compileDouble(double time, double delay) {
}
/**
- *
* @return
*/
private boolean getAlreadyProcessed() {
@@ -308,14 +306,14 @@ private boolean getAlreadyProcessed() {
/**
* Computes the boolean value if the time has changed and otherwise returns the already computed value
+ *
* @param time
* @return booleanValue the boolean value of the node
*/
public boolean compileBoolean(double time) {
- if ((this.time==time) || (isConstant && alreadyProcessed)) {
+ if ((this.time == time) || (isConstant && alreadyProcessed)) {
return booleanValue;
- }
- else {
+ } else {
isDouble = false;
alreadyProcessed = true;
this.time = time;
@@ -326,6 +324,7 @@ public boolean compileBoolean(double time) {
/**
* Computes the double value of the node.
+ *
* @param delay
*/
protected void computeDoubleValue(double delay) {
@@ -335,15 +334,15 @@ protected void computeDoubleValue(double delay) {
*/
case REAL:
if (isInfinite) {
- doubleValue = (real > 0d) ? Double.POSITIVE_INFINITY
- : Double.NEGATIVE_INFINITY;
+ doubleValue =
+ (real > 0d) ? Double.POSITIVE_INFINITY : Double.NEGATIVE_INFINITY;
} else {
doubleValue = interpreter.compile(real, units);
}
break;
- /*
- * Operators
- */
+ /*
+ * Operators
+ */
case RATIONAL:
doubleValue = interpreter.frac(numerator, denominator);
break;
@@ -351,12 +350,11 @@ protected void computeDoubleValue(double delay) {
doubleValue = interpreter.symbolTime();
break;
case FUNCTION_DELAY:
- doubleValue = interpreter.delay(leftChild,
- rightChild, units, time);
+ doubleValue = interpreter.delay(leftChild, rightChild, units, time);
break;
- /*
- * Type: pi, e, true, false, Avogadro
- */
+ /*
+ * Type: pi, e, true, false, Avogadro
+ */
case CONSTANT_PI:
doubleValue = Math.PI;
break;
@@ -367,12 +365,11 @@ protected void computeDoubleValue(double delay) {
doubleValue = Maths.AVOGADRO_L3V1;
break;
case REAL_E:
- doubleValue = interpreter.compile(mantissa, exponent,
- units);
+ doubleValue = interpreter.compile(mantissa, exponent, units);
break;
- /*
- * Basic Functions
- */
+ /*
+ * Basic Functions
+ */
case FUNCTION_LOG:
if (numChildren == 2) {
doubleValue = interpreter.log(leftChild, rightChild, time, delay);
@@ -476,6 +473,76 @@ protected void computeDoubleValue(double delay) {
case LAMBDA:
doubleValue = interpreter.lambdaDouble(children, time);
break;
+ case FUNCTION_QUOTIENT:
+ doubleValue = interpreter.quotient(leftChild, rightChild, time, delay);
+ break;
+ case FUNCTION_REM:
+ doubleValue = interpreter.remainder(leftChild, rightChild, time, delay);
+ break;
+ case FUNCTION_MAX:
+ doubleValue = interpreter.maximum(children, time, delay);
+ break;
+ case FUNCTION_MIN:
+ doubleValue = interpreter.minimum(children, time, delay);
+ break;
+ case LOGICAL_IMPLIES:
+ doubleValue = interpreter.implies(leftChild, rightChild, time, delay);
+ break;
+
+ /*
+ * Logical operators (with double values)
+ */
+ case LOGICAL_AND:
+ doubleValue = interpreter.and(children, numChildren, time) ? 1d : 0d;
+ break;
+ case LOGICAL_XOR:
+ doubleValue = interpreter.xor(children, time) ? 1d : 0d;
+ break;
+ case LOGICAL_OR:
+ doubleValue = interpreter.or(children, time) ? 1d : 0d;
+ break;
+ case LOGICAL_NOT:
+ doubleValue = interpreter.not(leftChild, time) ? 1d : 0d;
+ break;
+ case RELATIONAL_EQ:
+ doubleValue = interpreter.eq(children, time) ? 1d : 0d;
+ break;
+ case RELATIONAL_GEQ:
+ doubleValue = interpreter.geq(children, time) ? 1d : 0d;
+ break;
+ case RELATIONAL_GT:
+ doubleValue = interpreter.gt(children, time) ? 1d : 0d;
+ break;
+ case RELATIONAL_NEQ:
+ doubleValue = interpreter.neq(children, time) ? 1d : 0d;
+ break;
+ case RELATIONAL_LEQ:
+ doubleValue = interpreter.leq(children, time) ? 1d : 0d;
+ break;
+ case RELATIONAL_LT:
+ doubleValue = interpreter.lt(children, time) ? 1d : 0d;
+ break;
+ case CONSTANT_TRUE:
+ doubleValue = 1d;
+ break;
+ case CONSTANT_FALSE:
+ doubleValue = 0d;
+ break;
+ case NAME:
+ CallableSBase variable = node.getVariable();
+ if (variable != null) {
+ doubleValue = interpreter.compileBoolean(variable, time) ? 1d : 0d;
+ }
+ break;
+ case FUNCTION_RATE_OF:
+ ASTNode child = node.getChild(0);
+ if (child.isVariable()) {
+ CallableSBase variable1 = child.getVariable();
+ doubleValue = interpreter.rateOf(sbmlInterpreter, variable1, time, delay);
+ } else {
+ System.out.println("Error");
+ }
+ break;
default: // UNKNOWN:
doubleValue = Double.NaN;
break;
@@ -488,34 +555,34 @@ protected void computeDoubleValue(double delay) {
protected void computeBooleanValue() {
switch (nodeType) {
case LOGICAL_AND:
- booleanValue = interpreter.and(children,numChildren, time);
+ booleanValue = interpreter.and(children, numChildren, time);
break;
case LOGICAL_XOR:
- booleanValue = interpreter.xor(children,time);
+ booleanValue = interpreter.xor(children, time);
break;
case LOGICAL_OR:
- booleanValue = interpreter.or(children,time);
+ booleanValue = interpreter.or(children, time);
break;
case LOGICAL_NOT:
- booleanValue = interpreter.not(leftChild,time);
+ booleanValue = interpreter.not(leftChild, time);
break;
case RELATIONAL_EQ:
- booleanValue = interpreter.eq(leftChild, rightChild,time);
+ booleanValue = interpreter.eq(children, time);
break;
case RELATIONAL_GEQ:
- booleanValue = interpreter.geq(leftChild, rightChild,time);
+ booleanValue = interpreter.geq(children, time);
break;
case RELATIONAL_GT:
- booleanValue = interpreter.gt(leftChild, rightChild,time);
+ booleanValue = interpreter.gt(children, time);
break;
case RELATIONAL_NEQ:
- booleanValue = interpreter.neq(leftChild, rightChild,time);
+ booleanValue = interpreter.neq(children, time);
break;
case RELATIONAL_LEQ:
- booleanValue = interpreter.leq(leftChild, rightChild,time);
+ booleanValue = interpreter.leq(children, time);
break;
case RELATIONAL_LT:
- booleanValue = interpreter.lt(leftChild, rightChild,time);
+ booleanValue = interpreter.lt(children, time);
break;
case CONSTANT_TRUE:
booleanValue = true;
@@ -540,19 +607,20 @@ protected void computeBooleanValue() {
/**
* Returns true if the corresponding ASTNode is of type name.
+ *
* @return name?
*/
public boolean isName() {
- if (node!=null) {
+ if (node != null) {
return node.isName();
- }
- else {
+ } else {
return false;
}
}
/**
* Returns the name of the corresponding ASTNode.
+ *
* @return name
*/
public String getName() {
@@ -562,5 +630,4 @@ public String getName() {
return null;
}
}
-
}
diff --git a/src/main/java/org/simulator/sbml/astnode/AssignmentRuleValue.java b/src/main/java/org/simulator/sbml/astnode/AssignmentRuleValue.java
index 476e8c40..9480c590 100644
--- a/src/main/java/org/simulator/sbml/astnode/AssignmentRuleValue.java
+++ b/src/main/java/org/simulator/sbml/astnode/AssignmentRuleValue.java
@@ -34,7 +34,7 @@
/**
* This class can compute and store the value of an {@link AssignmentRule}
* together with the variable of the rule.
- *
+ *
* @author Roland Keller
* @version $Rev$
*/
@@ -49,10 +49,9 @@ public class AssignmentRuleValue extends RuleValue {
* The map of the values of the species references that are contained in
* rules
*/
- private Map stoichiometricCoefHash;
+ private Map stoichiometricCoefHash;
/**
- *
* @param nodeObject
* @param index
*/
@@ -62,35 +61,36 @@ public AssignmentRuleValue(ASTNodeValue nodeObject, int index) {
/**
* Constructor for rules that refer to a species reference
+ *
* @param nodeObject
* @param speciesReferenceID
* @param stoichiometricCoefHash
*/
- public AssignmentRuleValue(ASTNodeValue nodeObject, String speciesReferenceID,
- Map stoichiometricCoefHash) {
- super(nodeObject,-1);
+ public AssignmentRuleValue(ASTNodeValue nodeObject, String speciesReferenceID, Map stoichiometricCoefHash) {
+ super(nodeObject, -1);
this.speciesReferenceID = speciesReferenceID;
this.stoichiometricCoefHash = stoichiometricCoefHash;
}
/**
* Constructor for rules that refer to a species
+ *
* @param nodeObject
* @param index
* @param sp
* @param compartmentIndex
* @param hasZeroSpatialDimensions
* @param valueHolder
+ * @param isAmount
*/
- public AssignmentRuleValue(ASTNodeValue nodeObject, int index,
- Species sp, int compartmentIndex, boolean hasZeroSpatialDimensions, SBMLValueHolder valueHolder) {
- super(nodeObject, index, sp, compartmentIndex, hasZeroSpatialDimensions, valueHolder);
+ public AssignmentRuleValue(ASTNodeValue nodeObject, int index, Species sp, int compartmentIndex, boolean hasZeroSpatialDimensions, SBMLValueHolder valueHolder, boolean isAmount) {
+ super(nodeObject, index, sp, compartmentIndex, hasZeroSpatialDimensions, valueHolder, isAmount);
}
/**
* Processes the rule and saves the new value of the corresponding variable
* in the Y vector if changeY is set to true.
- *
+ *
* @param Y
* @param time
* @param changeY
@@ -106,22 +106,20 @@ public boolean processRule(double[] Y, double time, boolean changeY) {
if (oldValue != value) {
return true;
}
- }
- else if (speciesReferenceID != null) {
+ } else if (speciesReferenceID != null) {
processAssignmentVariable(time);
- Double v=stoichiometricCoefHash.get(speciesReferenceID);
+ Double v = stoichiometricCoefHash.get(speciesReferenceID);
stoichiometricCoefHash.put(speciesReferenceID, value);
-
if ((v != null) && (v.doubleValue() != value)) {
return true;
}
}
return false;
-
}
/**
* Returns the id of the species reference (if present), null otherwise.
+ *
* @return id
*/
public String getSpeciesReferenceID() {
@@ -131,5 +129,4 @@ public String getSpeciesReferenceID() {
public ASTNode getMath() {
return nodeObject.getNode();
}
-
}
diff --git a/src/main/java/org/simulator/sbml/astnode/CompartmentOrParameterValue.java b/src/main/java/org/simulator/sbml/astnode/CompartmentOrParameterValue.java
index b2edb0b0..08d8a0c5 100644
--- a/src/main/java/org/simulator/sbml/astnode/CompartmentOrParameterValue.java
+++ b/src/main/java/org/simulator/sbml/astnode/CompartmentOrParameterValue.java
@@ -33,12 +33,13 @@
/**
* This class computes and stores values of {@link ASTNode}s that refer to a
* {@link Compartment} or a {@link Parameter}.
- *
+ *
* @author Roland Keller
* @version $Rev$
* @since 1.0
*/
public class CompartmentOrParameterValue extends ASTNodeValue {
+
/**
* The compartment or parameter the corresponding ASTNode is referring to
*/
@@ -60,21 +61,19 @@ public class CompartmentOrParameterValue extends ASTNodeValue {
protected int position;
/**
- *
* @param interpreter
* @param node
* @param sb
* @param valueHolder
* @param position
*/
- public CompartmentOrParameterValue(ASTNodeInterpreter interpreter, ASTNode node,
- Symbol sb, SBMLValueHolder valueHolder, int position) {
+ public CompartmentOrParameterValue(ASTNodeInterpreter interpreter, ASTNode node, Symbol sb, SBMLValueHolder valueHolder, int position) {
super(interpreter, node);
this.sb = sb;
- id=sb.getId();
+ id = sb.getId();
isConstant = sb.getConstant();
this.valueHolder = valueHolder;
- this.position=position;
+ this.position = position;
}
/* (non-Javadoc)
@@ -84,19 +83,16 @@ public CompartmentOrParameterValue(ASTNodeInterpreter interpreter, ASTNode node,
protected void computeDoubleValue(double delay) {
if (delay == 0) {
doubleValue = valueHolder.getCurrentValueOf(position);
- }
- else {
+ } else {
double valueTime = interpreter.symbolTime() - delay;
doubleValue = valueHolder.computeDelayedValue(valueTime, id, null, null, 0);
}
if (isConstant) {
if ((valueHolder.getCurrentTime() > 0) && (delay == 0)) {
alreadyProcessed = true;
- }
- else {
+ } else {
alreadyProcessed = false;
}
}
}
-
}
diff --git a/src/main/java/org/simulator/sbml/astnode/DivideValue.java b/src/main/java/org/simulator/sbml/astnode/DivideValue.java
index d7eeb6da..299d6f95 100644
--- a/src/main/java/org/simulator/sbml/astnode/DivideValue.java
+++ b/src/main/java/org/simulator/sbml/astnode/DivideValue.java
@@ -32,11 +32,11 @@
/**
* This class computes and stores values of {@link ASTNode}s that refer to a
* division object.
- *
+ *
* @author Roland Keller
* @version $Rev$
*/
-public class DivideValue extends ASTNodeValue{
+public class DivideValue extends ASTNodeValue {
/**
* @param interpreter
@@ -52,11 +52,8 @@ public DivideValue(ASTNodeInterpreter interpreter, ASTNode node) {
@Override
protected void computeDoubleValue(double delay) {
if (numChildren != 2) {
- throw new SBMLException(MessageFormat.format(
- "Fractions must have one numerator and one denominator, here {0,number,integer} elements are given.",
- node.getChildCount()));
+ throw new SBMLException(MessageFormat.format("Fractions must have one numerator and one denominator, here {0,number,integer} elements are given.", node.getChildCount()));
}
doubleValue = interpreter.frac(leftChild, rightChild, time, delay);
}
-
}
diff --git a/src/main/java/org/simulator/sbml/astnode/FunctionValue.java b/src/main/java/org/simulator/sbml/astnode/FunctionValue.java
index 8c15ece2..b8535f64 100644
--- a/src/main/java/org/simulator/sbml/astnode/FunctionValue.java
+++ b/src/main/java/org/simulator/sbml/astnode/FunctionValue.java
@@ -38,11 +38,12 @@
/**
* This class computes and stores values of {@link ASTNode}s that refer to the
* application of a {@link FunctionDefinition}.
- *
+ *
* @author Roland Keller
* @version $Rev$
*/
public class FunctionValue extends ASTNodeValue {
+
/**
* The value of the evaluation block of the function stored in an ASTNodeObject.
*/
@@ -61,7 +62,7 @@ public class FunctionValue extends ASTNodeValue {
/**
* A map for storing the indexes of the arguments in the array argumentValues.
*/
- protected Map indexMap;
+ protected Map indexMap;
/**
* The math of the function definition.
@@ -69,47 +70,33 @@ public class FunctionValue extends ASTNodeValue {
protected ASTNode math;
/**
- *
- * @param interpreter
- * the interpreter
- * @param node
- * the corresponding ASTNode
- * @param variableNodes
- * the variables of the function as ASTNodes
+ * @param interpreter the interpreter
+ * @param node the corresponding ASTNode
+ * @param variableNodes the variables of the function as ASTNodes
*/
- public FunctionValue(ASTNodeInterpreter interpreter,
- ASTNode node, List variableNodes) {
+ public FunctionValue(ASTNodeInterpreter interpreter, ASTNode node, List variableNodes) {
super(interpreter, node);
CallableSBase variable = node.getVariable();
if ((variable != null)) {
if (variable instanceof FunctionDefinition) {
- variables=new ArrayList(variableNodes.size());
- indexMap=new HashMap();
- int index=0;
- for (ASTNode argument:variableNodes) {
- String argumentName=interpreter.compileString(argument);
+ variables = new ArrayList(variableNodes.size());
+ indexMap = new HashMap();
+ int index = 0;
+ for (ASTNode argument : variableNodes) {
+ String argumentName = interpreter.compileString(argument);
variables.add(argumentName);
indexMap.put(argumentName, index);
index++;
}
- argumentValues=new double[variables.size()];
+ argumentValues = new double[variables.size()];
} else {
- logger
- .warning("ASTNode of type FUNCTION but the variable is not a FunctionDefinition !! ("
- + node.getName() + ", " + node.getParentSBMLObject() + ")");
- throw new SBMLException(
- "ASTNode of type FUNCTION but the variable is not a FunctionDefinition !! ("
- + node.getName() + ", " + node.getParentSBMLObject() + ")");
+ logger.warning("ASTNode of type FUNCTION but the variable is not a FunctionDefinition !! (" + node.getName() + ", " + node.getParentSBMLObject() + ")");
+ throw new SBMLException("ASTNode of type FUNCTION but the variable is not a FunctionDefinition !! (" + node.getName() + ", " + node.getParentSBMLObject() + ")");
// doubleValue = compiler.compile(variable);
}
-
} else {
- logger.warning("ASTNode of type FUNCTION but the variable is null !! ("
- + node.getName() + ", " + node.getParentSBMLObject() + "). "
- + "Check that your object is linked to a Model.");
+ logger.warning("ASTNode of type FUNCTION but the variable is null !! (" + node.getName() + ", " + node.getParentSBMLObject() + "). " + "Check that your object is linked to a Model.");
}
-
-
}
/* (non-Javadoc)
@@ -118,7 +105,7 @@ public FunctionValue(ASTNodeInterpreter interpreter,
@Override
protected void computeDoubleValue(double delay) {
if (math != null) {
- doubleValue = interpreter.functionDouble(evaluationBlock, variables, children, numChildren, argumentValues, time);
+ doubleValue = interpreter.functionDouble(evaluationBlock, variables, children, numChildren, argumentValues, time, delay);
} else {
doubleValue = Double.NaN;
}
@@ -138,15 +125,17 @@ protected void computeBooleanValue() {
/**
* Sets the math and evaluation block of the function definition.
+ *
* @param math
*/
public void setMath(ASTNode math) {
this.math = math;
- evaluationBlock=(ASTNodeValue) math.getRightChild().getUserObject(SBMLinterpreter.TEMP_VALUE);
+ evaluationBlock = (ASTNodeValue) math.getRightChild().getUserObject(SBMLinterpreter.TEMP_VALUE);
}
/**
* Returns the values of the arguments.
+ *
* @return argumentValues
*/
public double[] getArgumentValues() {
@@ -155,11 +144,11 @@ public double[] getArgumentValues() {
/**
* Returns the index of a specific argument.
+ *
* @param argumentName
* @return index
*/
public int getIndex(String argumentName) {
return indexMap.get(argumentName);
}
-
}
diff --git a/src/main/java/org/simulator/sbml/astnode/IntegerValue.java b/src/main/java/org/simulator/sbml/astnode/IntegerValue.java
index 728f0354..b1512f8e 100644
--- a/src/main/java/org/simulator/sbml/astnode/IntegerValue.java
+++ b/src/main/java/org/simulator/sbml/astnode/IntegerValue.java
@@ -28,7 +28,7 @@
/**
* This class can compute and store the value of an integer node.
- *
+ *
* @author Roland Keller
* @version $Rev$
*/
@@ -57,5 +57,4 @@ protected void computeDoubleValue(double delay) {
public boolean getConstant() {
return true;
}
-
}
diff --git a/src/main/java/org/simulator/sbml/astnode/LocalParameterValue.java b/src/main/java/org/simulator/sbml/astnode/LocalParameterValue.java
index 5e5020c5..b22e2ab2 100644
--- a/src/main/java/org/simulator/sbml/astnode/LocalParameterValue.java
+++ b/src/main/java/org/simulator/sbml/astnode/LocalParameterValue.java
@@ -30,7 +30,7 @@
/**
* This class computes and stores values of {@link ASTNode}s that refer to a
* {@link LocalParameter}.
- *
+ *
* @author Roland Keller
* @version $Rev: 205 $
* @since 1.0
@@ -43,17 +43,15 @@ public class LocalParameterValue extends ASTNodeValue {
protected LocalParameter lp;
/**
- *
* @param interpreter
* @param node
* @param lp
*/
- public LocalParameterValue(ASTNodeInterpreter interpreter, ASTNode node,
- LocalParameter lp) {
+ public LocalParameterValue(ASTNodeInterpreter interpreter, ASTNode node, LocalParameter lp) {
super(interpreter, node);
this.lp = lp;
- doubleValue=lp.getValue();
- isDouble=true;
+ doubleValue = lp.getValue();
+ isDouble = true;
isConstant = true;
}
@@ -62,12 +60,11 @@ public LocalParameterValue(ASTNodeInterpreter interpreter, ASTNode node,
*/
@Override
public double compileDouble(double time, double delay) {
- this.time=time;
+ this.time = time;
if (alreadyProcessed == false) {
doubleValue = lp.getValue();
alreadyProcessed = true;
}
return doubleValue;
}
-
}
diff --git a/src/main/java/org/simulator/sbml/astnode/MinusValue.java b/src/main/java/org/simulator/sbml/astnode/MinusValue.java
index e03bb7f1..61d81355 100644
--- a/src/main/java/org/simulator/sbml/astnode/MinusValue.java
+++ b/src/main/java/org/simulator/sbml/astnode/MinusValue.java
@@ -28,7 +28,7 @@
/**
* This class can compute and store the value of a minus node.
- *
+ *
* @author Roland Keller
* @version $Rev$
*/
@@ -53,5 +53,4 @@ protected void computeDoubleValue(double delay) {
doubleValue = interpreter.minus(children, numChildren, time, delay);
}
}
-
}
diff --git a/src/main/java/org/simulator/sbml/astnode/NamedValue.java b/src/main/java/org/simulator/sbml/astnode/NamedValue.java
index f72e33e8..00181ba5 100644
--- a/src/main/java/org/simulator/sbml/astnode/NamedValue.java
+++ b/src/main/java/org/simulator/sbml/astnode/NamedValue.java
@@ -28,7 +28,7 @@
/**
* This class computes and stores values of variables occurring in a function.
- *
+ *
* @author Roland Keller
* @version $Rev$
*/
@@ -45,7 +45,6 @@ public class NamedValue extends ASTNodeValue {
private int index;
/**
- *
* @param interpreter
* @param node
* @param function
@@ -61,7 +60,6 @@ public NamedValue(ASTNodeInterpreter interpreter, ASTNode node, FunctionValue fu
*/
@Override
protected void computeDoubleValue(double delay) {
- doubleValue=function.getArgumentValues()[index];
+ doubleValue = function.getArgumentValues()[index];
}
-
}
diff --git a/src/main/java/org/simulator/sbml/astnode/PlusValue.java b/src/main/java/org/simulator/sbml/astnode/PlusValue.java
index 5c4f2e72..2de744ac 100644
--- a/src/main/java/org/simulator/sbml/astnode/PlusValue.java
+++ b/src/main/java/org/simulator/sbml/astnode/PlusValue.java
@@ -28,7 +28,7 @@
/**
* This class can compute and store the value of a plus node.
- *
+ *
* @author Roland Keller
* @version $Rev$
*/
@@ -49,5 +49,4 @@ public PlusValue(ASTNodeInterpreter interpreter, ASTNode node) {
protected void computeDoubleValue(double delay) {
doubleValue = interpreter.plus(children, numChildren, time, delay);
}
-
}
diff --git a/src/main/java/org/simulator/sbml/astnode/PowerValue.java b/src/main/java/org/simulator/sbml/astnode/PowerValue.java
index 868bc2c0..5534171d 100644
--- a/src/main/java/org/simulator/sbml/astnode/PowerValue.java
+++ b/src/main/java/org/simulator/sbml/astnode/PowerValue.java
@@ -28,7 +28,7 @@
/**
* This class can compute and store the value of a power expression.
- *
+ *
* @author Roland Keller
* @version $Rev$
*/
@@ -49,5 +49,4 @@ public PowerValue(ASTNodeInterpreter interpreter, ASTNode node) {
protected void computeDoubleValue(double delay) {
doubleValue = interpreter.pow(leftChild, rightChild, time, delay);
}
-
}
diff --git a/src/main/java/org/simulator/sbml/astnode/RateRuleValue.java b/src/main/java/org/simulator/sbml/astnode/RateRuleValue.java
index 77d242aa..fabe5dc0 100644
--- a/src/main/java/org/simulator/sbml/astnode/RateRuleValue.java
+++ b/src/main/java/org/simulator/sbml/astnode/RateRuleValue.java
@@ -25,17 +25,19 @@
package org.simulator.sbml.astnode;
import java.util.List;
+
import org.sbml.jsbml.Species;
import org.simulator.sbml.SBMLValueHolder;
/**
* This class can compute and store the value of a rate rule together with the
* variable of the rule.
- *
+ *
* @author Roland Keller
* @version $Rev$
*/
-public class RateRuleValue extends RuleValue{
+public class RateRuleValue extends RuleValue {
+
/**
* Is the variable a compartment?
*/
@@ -48,12 +50,17 @@ public class RateRuleValue extends RuleValue{
private List speciesIndices;
/**
- *
+ * The variable for which the rateRule is defined
+ */
+ private String variable;
+
+ /**
* @param nodeObject
* @param index
*/
- public RateRuleValue(ASTNodeValue nodeObject, int index) {
+ public RateRuleValue(ASTNodeValue nodeObject, int index, String variable) {
super(nodeObject, index);
+ this.variable = variable;
}
/**
@@ -64,45 +71,53 @@ public RateRuleValue(ASTNodeValue nodeObject, int index) {
* @param compartmentIndex
* @param hasZeroSpatialDimensions
* @param valueHolder
+ * @param variable
+ * @param isAmount
*/
- public RateRuleValue(ASTNodeValue nodeObject, int index,
- Species sp, int compartmentIndex, boolean hasZeroSpatialDimensions, SBMLValueHolder valueHolder) {
- super(nodeObject, index, sp, compartmentIndex, hasZeroSpatialDimensions, valueHolder);
+ public RateRuleValue(ASTNodeValue nodeObject, int index, Species sp, int compartmentIndex, boolean hasZeroSpatialDimensions, SBMLValueHolder valueHolder, String variable, boolean isAmount) {
+ super(nodeObject, index, sp, compartmentIndex, hasZeroSpatialDimensions, valueHolder, isAmount);
+ this.variable = variable;
}
/**
* Constructor for a rule with a compartment as variable
+ *
* @param nodeObject
* @param index
* @param speciesIndices
* @param valueHolder
*/
- public RateRuleValue(ASTNodeValue nodeObject, int index,
- List speciesIndices, SBMLValueHolder valueHolder) {
+ public RateRuleValue(ASTNodeValue nodeObject, int index, List speciesIndices, SBMLValueHolder valueHolder, String variable) {
super(nodeObject, index);
isCompartment = true;
+ this.variable = variable;
this.speciesIndices = speciesIndices;
}
+ /**
+ * @return the name of the variable
+ */
+ public String getVariable() {
+ return variable;
+ }
+
/**
* Processes the rule and saves the new value of the corresponding variable in the changeRate vector.
+ *
* @param changeRate
* @param Y
* @param time
*/
public void processRule(double[] changeRate, double[] Y, double time) {
changeRate[index] = processAssignmentVariable(time);
-
// when the size of a compartment changes, the concentrations of the
// species located in this compartment have to change as well
if (isCompartment) {
- if (speciesIndices!=null) {
- for (int speciesIndex:speciesIndices) {
- changeRate[speciesIndex] = -changeRate[index]
- * Y[speciesIndex] / Y[index];
+ if (speciesIndices != null) {
+ for (int speciesIndex : speciesIndices) {
+ changeRate[speciesIndex] = -changeRate[index] * Y[speciesIndex] / Y[index];
}
}
}
}
-
}
diff --git a/src/main/java/org/simulator/sbml/astnode/ReactionValue.java b/src/main/java/org/simulator/sbml/astnode/ReactionValue.java
index 7f279ca2..6008cc7e 100644
--- a/src/main/java/org/simulator/sbml/astnode/ReactionValue.java
+++ b/src/main/java/org/simulator/sbml/astnode/ReactionValue.java
@@ -31,7 +31,7 @@
/**
* This class computes and stores values of {@link ASTNode}s that refer to a
* {@link Reaction}.
- *
+ *
* @author Roland Keller
* @version $Rev$
* @since 1.0
@@ -49,13 +49,11 @@ public class ReactionValue extends ASTNodeValue {
protected ASTNodeValue kineticLawUserObject;
/**
- *
* @param interpreter
* @param node
* @param r
*/
- public ReactionValue(ASTNodeInterpreter interpreter, ASTNode node,
- Reaction r) {
+ public ReactionValue(ASTNodeInterpreter interpreter, ASTNode node, Reaction r) {
super(interpreter, node);
this.r = r;
if (r.isSetKineticLaw()) {
@@ -75,5 +73,4 @@ protected void computeDoubleValue(double delay) {
doubleValue = kineticLawUserObject.compileDouble(time, delay);
}
}
-
}
diff --git a/src/main/java/org/simulator/sbml/astnode/RootFunctionValue.java b/src/main/java/org/simulator/sbml/astnode/RootFunctionValue.java
index 28f76803..0e149839 100644
--- a/src/main/java/org/simulator/sbml/astnode/RootFunctionValue.java
+++ b/src/main/java/org/simulator/sbml/astnode/RootFunctionValue.java
@@ -29,11 +29,12 @@
/**
* This class computes and stores values of {@link ASTNode}s that refer to a
* root function.
- *
+ *
* @author Roland Keller
* @version $Rev$
*/
-public class RootFunctionValue extends ASTNodeValue{
+public class RootFunctionValue extends ASTNodeValue {
+
/**
* The value of the left child of the corresponding ASTNode (if applicable)
*/
@@ -45,21 +46,20 @@ public class RootFunctionValue extends ASTNodeValue{
private boolean leftChildrenNumeric;
/**
- *
* @param interpreter
* @param node
*/
public RootFunctionValue(ASTNodeInterpreter interpreter, ASTNode node) {
super(interpreter, node);
ASTNode left = node.getLeftChild();
- leftChildrenNumeric=false;
+ leftChildrenNumeric = false;
if (numChildren == 2) {
if (left.isInteger()) {
leftDoubleValue = left.getInteger();
- leftChildrenNumeric=true;
+ leftChildrenNumeric = true;
} else if (left.isReal()) {
leftDoubleValue = left.getReal();
- leftChildrenNumeric=true;
+ leftChildrenNumeric = true;
}
}
}
@@ -77,15 +77,12 @@ protected void computeDoubleValue(double delay) {
doubleValue = interpreter.root(leftDoubleValue, rightChild, time, delay);
}
} else {
- doubleValue = interpreter.root(leftChild,
- rightChild, time, delay);
+ doubleValue = interpreter.root(leftChild, rightChild, time, delay);
}
} else if (numChildren == 1) {
doubleValue = interpreter.sqrt(rightChild, time, delay);
} else {
- doubleValue = interpreter.root(leftChild,
- rightChild, time, delay);
+ doubleValue = interpreter.root(leftChild, rightChild, time, delay);
}
}
-
}
diff --git a/src/main/java/org/simulator/sbml/astnode/RuleValue.java b/src/main/java/org/simulator/sbml/astnode/RuleValue.java
index 103ab15b..1dd7f79b 100644
--- a/src/main/java/org/simulator/sbml/astnode/RuleValue.java
+++ b/src/main/java/org/simulator/sbml/astnode/RuleValue.java
@@ -30,7 +30,7 @@
/**
* This class can compute and store the value of a rule together with the
* variable of the rule.
- *
+ *
* @author Roland Keller
* @version $Rev$
*/
@@ -87,7 +87,11 @@ public class RuleValue {
protected int index;
/**
- *
+ * This flag is true if the species has amount units
+ */
+ protected boolean isAmount = false;
+
+ /**
* @param nodeObject
* @param index
*/
@@ -99,6 +103,7 @@ public RuleValue(ASTNodeValue nodeObject, int index) {
/**
* Constructor for rules that refer to a species.
+ *
* @param nodeObject
* @param index
* @param sp
@@ -106,8 +111,7 @@ public RuleValue(ASTNodeValue nodeObject, int index) {
* @param hasZeroSpatialDimensions
* @param valueHolder
*/
- public RuleValue(ASTNodeValue nodeObject, int index,
- Species sp, int compartmentIndex, boolean hasZeroSpatialDimensions, SBMLValueHolder valueHolder) {
+ public RuleValue(ASTNodeValue nodeObject, int index, Species sp, int compartmentIndex, boolean hasZeroSpatialDimensions, SBMLValueHolder valueHolder, boolean isAmount) {
this.nodeObject = nodeObject;
this.index = index;
isSpecies = true;
@@ -117,23 +121,22 @@ public RuleValue(ASTNodeValue nodeObject, int index,
isSetInitialConcentration = sp.isSetInitialConcentration();
this.hasZeroSpatialDimensions = hasZeroSpatialDimensions;
this.valueHolder = valueHolder;
+ this.isAmount = isAmount;
}
/**
* Calculates the math of the rule and returns the new value of the variable.
+ *
* @param time
* @return value the computed value of the variable
*/
protected double processAssignmentVariable(double time) {
value = nodeObject.compileDouble(time, 0d);
if (isSpecies && !hasZeroSpatialDimensions) {
- double compartmentValue = valueHolder
- .getCurrentValueOf(compartmentIndex);
- if (isSetInitialAmount && !hasOnlySubstanceUnits) {
+ double compartmentValue = valueHolder.getCurrentValueOf(compartmentIndex);
+ if (isAmount && !hasOnlySubstanceUnits) {
value = value * compartmentValue;
-
- }
- else if (isSetInitialConcentration && hasOnlySubstanceUnits) {
+ } else if (!isAmount && hasOnlySubstanceUnits) {
value = value / compartmentValue;
}
}
@@ -142,6 +145,7 @@ else if (isSetInitialConcentration && hasOnlySubstanceUnits) {
/**
* Returns the value of the rule.
+ *
* @return value
*/
public double getValue() {
@@ -150,10 +154,14 @@ public double getValue() {
/**
* Returns the index of the variable in the Y vector of the value holder.
+ *
* @return index
*/
public int getIndex() {
return index;
}
+ public ASTNodeValue getNodeObject() {
+ return nodeObject;
+ }
}
diff --git a/src/main/java/org/simulator/sbml/astnode/SpeciesReferenceValue.java b/src/main/java/org/simulator/sbml/astnode/SpeciesReferenceValue.java
index 5b4d1953..5f8aa7df 100644
--- a/src/main/java/org/simulator/sbml/astnode/SpeciesReferenceValue.java
+++ b/src/main/java/org/simulator/sbml/astnode/SpeciesReferenceValue.java
@@ -31,7 +31,7 @@
/**
* This class computes and stores values of {@link ASTNode}s that refer to a
* {@link SpeciesReference}.
- *
+ *
* @author Roland Keller
* @version $Rev$
* @since 1.0
@@ -49,17 +49,22 @@ public class SpeciesReferenceValue extends ASTNodeValue {
private String id;
/**
- *
+ * The boolean variable that says whether species reference is constant or
+ * not
+ */
+ private boolean isConstant;
+
+ /**
* @param interpreter
* @param node
* @param sr
* @param valueHolder
*/
- public SpeciesReferenceValue(ASTNodeInterpreter interpreter,
- ASTNode node, SpeciesReference sr, SBMLValueHolder valueHolder) {
+ public SpeciesReferenceValue(ASTNodeInterpreter interpreter, ASTNode node, SpeciesReference sr, SBMLValueHolder valueHolder) {
super(interpreter, node);
- id=sr.getId();
- this.valueHolder=valueHolder;
+ id = sr.getId();
+ isConstant = sr.isConstant();
+ this.valueHolder = valueHolder;
}
/* (non-Javadoc)
@@ -67,7 +72,13 @@ public SpeciesReferenceValue(ASTNodeInterpreter interpreter,
*/
@Override
protected void computeDoubleValue(double delay) {
- doubleValue = valueHolder.getCurrentStoichiometry(id);
- }
+ if ((delay == 0d) || (isConstant)){
+ doubleValue = valueHolder.getCurrentStoichiometry(id);
+ } else {
+ double valueTime = interpreter.symbolTime() - delay;
+ doubleValue = valueHolder.computeDelayedValue(valueTime, id, null, null, 0);
+ }
+
+ }
}
diff --git a/src/main/java/org/simulator/sbml/astnode/SpeciesValue.java b/src/main/java/org/simulator/sbml/astnode/SpeciesValue.java
index f7f6b23b..93228deb 100644
--- a/src/main/java/org/simulator/sbml/astnode/SpeciesValue.java
+++ b/src/main/java/org/simulator/sbml/astnode/SpeciesValue.java
@@ -31,12 +31,13 @@
/**
* This class computes and stores values of {@link ASTNode}s that refer to a
* {@link Species}.
- *
+ *
* @author Roland Keller
* @version $Rev: 205 $
* @since 1.0
*/
public class SpeciesValue extends ASTNodeValue {
+
/**
* The corresponding species
*/
@@ -89,7 +90,6 @@ public class SpeciesValue extends ASTNodeValue {
private String compartmentID;
/**
- *
* @param interpreter
* @param node
* @param s
@@ -100,8 +100,7 @@ public class SpeciesValue extends ASTNodeValue {
* @param zeroSpatialDimensions
* @param isAmount
*/
- public SpeciesValue(ASTNodeInterpreter interpreter, ASTNode node,
- Species s, SBMLValueHolder valueHolder, int position, int compartmentPosition, String compartmentID, boolean zeroSpatialDimensions, boolean isAmount) {
+ public SpeciesValue(ASTNodeInterpreter interpreter, ASTNode node, Species s, SBMLValueHolder valueHolder, int position, int compartmentPosition, String compartmentID, boolean zeroSpatialDimensions, boolean isAmount) {
super(interpreter, node);
this.s = s;
id = s.getId();
@@ -124,66 +123,48 @@ public SpeciesValue(ASTNodeInterpreter interpreter, ASTNode node,
protected void computeDoubleValue(double delay) {
if (delay == 0) {
if (isAmount && !hasOnlySubstanceUnits) {
- double compartmentValue = valueHolder
- .getCurrentValueOf(compartmentPosition);
+ double compartmentValue = valueHolder.getCurrentValueOf(compartmentPosition);
if ((compartmentValue == 0d) || zeroSpatialDimensions) {
doubleValue = valueHolder.getCurrentValueOf(position);
} else {
- doubleValue = valueHolder.getCurrentValueOf(position)
- / compartmentValue;
-
+ doubleValue = valueHolder.getCurrentValueOf(position) / compartmentValue;
}
} else if (!isAmount && hasOnlySubstanceUnits) {
- double compartmentValue = valueHolder
- .getCurrentValueOf(compartmentPosition);
+ double compartmentValue = valueHolder.getCurrentValueOf(compartmentPosition);
if ((compartmentValue == 0d) || zeroSpatialDimensions) {
doubleValue = valueHolder.getCurrentValueOf(position);
} else {
- doubleValue = valueHolder.getCurrentValueOf(position)
- * compartmentValue;
+ doubleValue = valueHolder.getCurrentValueOf(position) * compartmentValue;
}
} else {
doubleValue = valueHolder.getCurrentValueOf(position);
-
}
- }
- else {
+ } else {
double valueTime = interpreter.symbolTime() - delay;
-
-
if (isAmount && !hasOnlySubstanceUnits) {
- double compartmentValue = valueHolder
- .computeDelayedValue(valueTime, compartmentID, null, null, 0);
+ double compartmentValue = valueHolder.computeDelayedValue(valueTime, compartmentID, null, null, 0);
if ((compartmentValue == 0d) || zeroSpatialDimensions) {
doubleValue = valueHolder.computeDelayedValue(valueTime, id, null, null, 0);
} else {
- doubleValue = valueHolder.computeDelayedValue(valueTime, id, null, null, 0)
- / compartmentValue;
-
+ doubleValue = valueHolder.computeDelayedValue(valueTime, id, null, null, 0) / compartmentValue;
}
} else if (!isAmount && hasOnlySubstanceUnits) {
- double compartmentValue = valueHolder
- .computeDelayedValue(valueTime, compartmentID, null, null, 0);
+ double compartmentValue = valueHolder.computeDelayedValue(valueTime, compartmentID, null, null, 0);
if ((compartmentValue == 0d) || zeroSpatialDimensions) {
doubleValue = valueHolder.computeDelayedValue(valueTime, id, null, null, 0);
} else {
- doubleValue = valueHolder.computeDelayedValue(valueTime, id, null, null, 0)
- * compartmentValue;
+ doubleValue = valueHolder.computeDelayedValue(valueTime, id, null, null, 0) * compartmentValue;
}
} else {
doubleValue = valueHolder.computeDelayedValue(valueTime, id, null, null, 0);
-
}
}
if (isConstant) {
if ((valueHolder.getCurrentTime() > 0) && (delay == 0)) {
alreadyProcessed = true;
- }
- else {
+ } else {
alreadyProcessed = false;
}
}
-
}
-
}
diff --git a/src/main/java/org/simulator/sbml/astnode/StoichiometryValue.java b/src/main/java/org/simulator/sbml/astnode/StoichiometryValue.java
index 70bfcc2f..3bcc3092 100644
--- a/src/main/java/org/simulator/sbml/astnode/StoichiometryValue.java
+++ b/src/main/java/org/simulator/sbml/astnode/StoichiometryValue.java
@@ -32,7 +32,7 @@
/**
* Computes for a {@link SpeciesReference} with a stoichiometry occuring in some
* {@link Reaction} the stoichiometry.
- *
+ *
* @author Roland Keller
* @version $Rev: 205 $
*/
@@ -90,16 +90,13 @@ public class StoichiometryValue {
private boolean stoichiometrySet;
/**
- *
* @param sr
* @param speciesRefIndex
* @param stoichiometricCoefHash
* @param Y
* @param stoichiometryMathValue
*/
- public StoichiometryValue(SpeciesReference sr,
- int speciesRefIndex, Map stoichiometricCoefHash,
- double[] Y, ASTNodeValue stoichiometryMathValue) {
+ public StoichiometryValue(SpeciesReference sr, int speciesRefIndex, Map stoichiometricCoefHash, double[] Y, ASTNodeValue stoichiometryMathValue) {
isSetStoichiometryMath = sr.isSetStoichiometryMath();
this.sr = sr;
id = sr.getId();
@@ -108,14 +105,13 @@ public StoichiometryValue(SpeciesReference sr,
this.Y = Y;
this.stoichiometryMathValue = stoichiometryMathValue;
time = Double.NaN;
-
computeStoichiometricValue();
}
/**
* Computes the value of the stoichiometry at the current time if it has not
* been computed yet or is not constant.
- *
+ *
* @param time
* @return doubleValue the value of the stoichiometry
*/
@@ -134,25 +130,23 @@ private void computeStoichiometricValue() {
if (speciesRefIndex >= 0) {
stoichiometry = Y[speciesRefIndex];
stoichiometricCoefHash.put(id, stoichiometry);
- stoichiometrySet=true;
- } else if (stoichiometricCoefHash != null
- && stoichiometricCoefHash.containsKey(id)) {
+ stoichiometrySet = true;
+ } else if (stoichiometricCoefHash != null && stoichiometricCoefHash.containsKey(id)) {
stoichiometry = stoichiometricCoefHash.get(id);
- stoichiometrySet=true;
+ stoichiometrySet = true;
} else {
if (isSetStoichiometryMath) {
stoichiometry = stoichiometryMathValue.compileDouble(time, 0d);
- stoichiometrySet=true;
+ stoichiometrySet = true;
} else if ((!sr.isSetStoichiometry()) && (sr.getLevel() >= 3)) {
stoichiometry = 1d;
- stoichiometrySet=false;
+ stoichiometrySet = false;
} else {
stoichiometry = sr.getCalculatedStoichiometry();
if (id.equals("")) {
- stoichiometrySet=true;
- }
- else {
- stoichiometrySet=false;
+ stoichiometrySet = true;
+ } else {
+ stoichiometrySet = false;
}
}
}
@@ -178,5 +172,4 @@ public boolean getStoichiometrySet() {
public double getStoichiometry() {
return stoichiometry;
}
-
}
diff --git a/src/main/java/org/simulator/sbml/astnode/TimesValue.java b/src/main/java/org/simulator/sbml/astnode/TimesValue.java
index ad92f47a..e4b74321 100644
--- a/src/main/java/org/simulator/sbml/astnode/TimesValue.java
+++ b/src/main/java/org/simulator/sbml/astnode/TimesValue.java
@@ -28,14 +28,15 @@
/**
* This class can compute and store the value of times nodes.
- *
+ *
* @author Roland Keller
* @version $Rev$
*/
-public class TimesValue extends ASTNodeValue{
+public class TimesValue extends ASTNodeValue {
/**
* Initializes a new instance with the interpreter and ASTNode given
+ *
* @param interpreter
* @param node
*/
@@ -50,5 +51,4 @@ public TimesValue(ASTNodeInterpreter interpreter, ASTNode node) {
protected void computeDoubleValue(double delay) {
doubleValue = interpreter.times(children, numChildren, time, delay);
}
-
}
diff --git a/src/main/java/org/simulator/sbml/astnode/package-info.java b/src/main/java/org/simulator/sbml/astnode/package-info.java
index 6afa1b76..dd0e7338 100644
--- a/src/main/java/org/simulator/sbml/astnode/package-info.java
+++ b/src/main/java/org/simulator/sbml/astnode/package-info.java
@@ -26,7 +26,7 @@
/**
* Classes for efficient numerical treatment of equations in form of
* abstract syntax trees.
- *
+ *
* @version $Rev$
*/
package org.simulator.sbml.astnode;
diff --git a/src/main/java/org/simulator/sbml/package-info.java b/src/main/java/org/simulator/sbml/package-info.java
index 0197824e..652e24c5 100644
--- a/src/main/java/org/simulator/sbml/package-info.java
+++ b/src/main/java/org/simulator/sbml/package-info.java
@@ -22,7 +22,6 @@
* .
* ---------------------------------------------------------------------
*/
-
/**
* Classes for storing and interpreting an
* SBML
@@ -57,7 +56,7 @@
* the {@link org.sbml.jsbml.Constraint} is not a simple text, but an arbitrary
* XHTML document and therefore not always suitable to be displayed on the
* console).
- *
+ *
* @version $Rev$
*/
package org.simulator.sbml;
diff --git a/src/main/java/org/simulator/sedml/ExecutionException.java b/src/main/java/org/simulator/sedml/ExecutionException.java
index 8dd8f947..f3744c17 100644
--- a/src/main/java/org/simulator/sedml/ExecutionException.java
+++ b/src/main/java/org/simulator/sedml/ExecutionException.java
@@ -27,7 +27,7 @@
/**
* Runtime exception indicating that
* SED-ML execution has failed.
- *
+ *
* @author Richard Adams
* @version $Rev$
* @since 1.1
@@ -35,7 +35,6 @@
public class ExecutionException extends RuntimeException {
/**
- *
* @param message
*/
public ExecutionException(String message) {
@@ -43,8 +42,7 @@ public ExecutionException(String message) {
}
/**
- *
+ *
*/
private static final long serialVersionUID = 1L;
-
}
diff --git a/src/main/java/org/simulator/sedml/FileModelResolver.java b/src/main/java/org/simulator/sedml/FileModelResolver.java
index d33f1204..0ba3c068 100644
--- a/src/main/java/org/simulator/sedml/FileModelResolver.java
+++ b/src/main/java/org/simulator/sedml/FileModelResolver.java
@@ -3,7 +3,6 @@
import java.io.File;
import java.io.StringWriter;
import java.net.URI;
-
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
@@ -24,80 +23,64 @@
*
* URIs specified with the 'file' schema will not be resolved unless the path is
* absolute.
- *
- * @author radams
*
+ * @author radams
*/
public class FileModelResolver implements IModelResolver {
- private String sedmlPath;
-
- public FileModelResolver(String sedmlPath){
- this.sedmlPath = sedmlPath;
- }
-
- /**
- * Makes a best effort to read an XML based model and return it as a String
- * based upon the URI. It is up to the client to ensure that the model
- * returned is the correct model for simulation or change operations.
- *
- * @param modelURI
- * A non-null {@link URI}.
- * @return The model String or null
if could not be resolved,
- * or the file is not XML content.
- * @throws IllegalArgumentException
- * if modelURI
is null.
- */
- public String getModelXMLFor(URI modelURI) {
- String path = null;
- if (modelURI.getAuthority() == null && modelURI.getScheme() == null
- && modelURI.getHost() == null) {
- path = modelURI.getPath();
-
- // handle absolute path
- if ((path.startsWith("/") || (path.substring(1).startsWith(":\\")))){
-
- // handle versions of relative path
- } else {
- if (path.startsWith(".")){
- path = path.substring(1);
- if (path.startsWith("/")){
- path = path.substring(1);
- }
- }
- path = sedmlPath + "/" + path;
- }
+ private String sedmlPath;
- System.out.println("processed path: " + path);
+ public FileModelResolver(String sedmlPath) {
+ this.sedmlPath = sedmlPath;
+ }
- } else if (modelURI.getAuthority() == null
- && "file".equals(modelURI.getScheme())
- && modelURI.getHost() == null) {
- path = modelURI.getPath();
-
-
- } else {
- return null;
- }
- File f = new File(path);
- if (!f.exists() && !f.canRead()) {
- return null;
- }
- try {
- DocumentBuilder builder = DocumentBuilderFactory.newInstance()
- .newDocumentBuilder();
- Document doc = builder.parse(f);
- StreamResult result = new StreamResult(new StringWriter());
- DOMSource source = new DOMSource(doc);
- // Write the DOM document to the file
- Transformer xformer = TransformerFactory.newInstance()
- .newTransformer();
- xformer.transform(source, result);
- return result.getWriter().toString();
-
- } catch (Exception e) {
- return null;
+ /**
+ * Makes a best effort to read an XML based model and return it as a String
+ * based upon the URI. It is up to the client to ensure that the model
+ * returned is the correct model for simulation or change operations.
+ *
+ * @param modelURI A non-null {@link URI}.
+ * @return The model String or null
if could not be resolved,
+ * or the file is not XML content.
+ * @throws IllegalArgumentException if modelURI
is null.
+ */
+ public String getModelXMLFor(URI modelURI) {
+ String path = null;
+ if (modelURI.getAuthority() == null && modelURI.getScheme() == null && modelURI.getHost() == null) {
+ path = modelURI.getPath();
+ // handle absolute path
+ if ((path.startsWith("/") || (path.substring(1).startsWith(":\\")))) {
+ // handle versions of relative path
+ } else {
+ if (path.startsWith(".")) {
+ path = path.substring(1);
+ if (path.startsWith("/")) {
+ path = path.substring(1);
+ }
}
+ path = sedmlPath + "/" + path;
+ }
+ System.out.println("processed path: " + path);
+ } else if (modelURI.getAuthority() == null && "file".equals(modelURI.getScheme()) && modelURI.getHost() == null) {
+ path = modelURI.getPath();
+ } else {
+ return null;
}
-
+ File f = new File(path);
+ if (!f.exists() && !f.canRead()) {
+ return null;
+ }
+ try {
+ DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+ Document doc = builder.parse(f);
+ StreamResult result = new StreamResult(new StringWriter());
+ DOMSource source = new DOMSource(doc);
+ // Write the DOM document to the file
+ Transformer xformer = TransformerFactory.newInstance().newTransformer();
+ xformer.transform(source, result);
+ return result.getWriter().toString();
+ } catch (Exception e) {
+ return null;
+ }
+ }
}
diff --git a/src/main/java/org/simulator/sedml/IProcessedSedMLSimulationResultsWrapper.java b/src/main/java/org/simulator/sedml/IProcessedSedMLSimulationResultsWrapper.java
index 91820553..ede6bd36 100644
--- a/src/main/java/org/simulator/sedml/IProcessedSedMLSimulationResultsWrapper.java
+++ b/src/main/java/org/simulator/sedml/IProcessedSedMLSimulationResultsWrapper.java
@@ -3,86 +3,81 @@
import org.jlibsedml.execution.IProcessedSedMLSimulationResults;
/**
- * Non-API Implementation of {@link IProcessedSedMLSimulationResults}
- * Because this class is non-API we don't have exhaustive arg checking etc.,
- * Borrowed from jlibsedml
- * @author Shalin Shah
- *
- */
- class IProcessedSedMLSimulationResultsWrapper implements IProcessedSedMLSimulationResults {
+ * Non-API Implementation of {@link IProcessedSedMLSimulationResults}
+ * Because this class is non-API we don't have exhaustive arg checking etc.,
+ * Borrowed from jlibsedml
+ *
+ * @author Shalin Shah
+ */
+class IProcessedSedMLSimulationResultsWrapper
+ implements IProcessedSedMLSimulationResults {
- private double [][] _data;
- private String [] _headers;
-
- IProcessedSedMLSimulationResultsWrapper(double [][]data, String []headers) {
- _headers = new String[headers.length];
- System.arraycopy(headers, 0, _headers, 0, headers.length);
- _data = new double[data.length][];
- copyDataFromTo(data, _data);
-
- }
-
- public String[] getColumnHeaders() {
- String[] rc = new String[_headers.length];
- System.arraycopy(_headers, 0, rc, 0, _headers.length);
- return rc;
- }
+ private double[][] _data;
+ private String[] _headers;
- public double[][] getData() {
- double[][] copy = new double[_data.length][];
- copyDataFromTo(_data, copy);
- return copy;
-
- }
+ IProcessedSedMLSimulationResultsWrapper(double[][] data, String[] headers) {
+ _headers = new String[headers.length];
+ System.arraycopy(headers, 0, _headers, 0, headers.length);
+ _data = new double[data.length][];
+ copyDataFromTo(data, _data);
+ }
- private void copyDataFromTo(double[][] data2, double[][] copy) {
- int i = 0;
- for (double[] row : data2) {
- double[] copyRow = new double[row.length];
- System.arraycopy(row, 0, copyRow, 0, row.length);
+ public String[] getColumnHeaders() {
+ String[] rc = new String[_headers.length];
+ System.arraycopy(_headers, 0, rc, 0, _headers.length);
+ return rc;
+ }
- copy[i++] = copyRow;
- }
-
- }
+ public double[][] getData() {
+ double[][] copy = new double[_data.length][];
+ copyDataFromTo(_data, copy);
+ return copy;
+ }
+ private void copyDataFromTo(double[][] data2, double[][] copy) {
+ int i = 0;
+ for (double[] row : data2) {
+ double[] copyRow = new double[row.length];
+ System.arraycopy(row, 0, copyRow, 0, row.length);
+ copy[i++] = copyRow;
+ }
+ }
- public int getNumColumns() {
- return _headers.length;
- }
+ public int getNumColumns() {
+ return _headers.length;
+ }
- public int getNumDataRows() {
- return _data.length;
- }
+ public int getNumDataRows() {
+ return _data.length;
+ }
- public Double [] getDataByColumnId(String colID) {
- int colInd = getIndexByColumnID(colID);
- if(colInd == -1){
- return null;
- }
- Double [] rc = new Double[_data.length];
- for (int i=0; i< _data.length;i++){
- rc[i]=_data[i][colInd];
- }
- return rc;
- }
-
- public int getIndexByColumnID(String colID){
- int colInd=-1;
- for (int i =0; i< _headers.length;i++){
- if(_headers[i].equals(colID)){
- colInd=i;
- }
- }
- return colInd;
- }
+ public Double[] getDataByColumnId(String colID) {
+ int colInd = getIndexByColumnID(colID);
+ if (colInd == -1) {
+ return null;
+ }
+ Double[] rc = new Double[_data.length];
+ for (int i = 0; i < _data.length; i++) {
+ rc[i] = _data[i][colInd];
+ }
+ return rc;
+ }
- public Double[] getDataByColumnIndex(int index) {
- Double [] rc = new Double[_data.length];
- for (int i=0; i< _data.length;i++){
- rc[i]=_data[i][index];
- }
- return rc;
+ public int getIndexByColumnID(String colID) {
+ int colInd = -1;
+ for (int i = 0; i < _headers.length; i++) {
+ if (_headers[i].equals(colID)) {
+ colInd = i;
+ }
}
+ return colInd;
+ }
+ public Double[] getDataByColumnIndex(int index) {
+ Double[] rc = new Double[_data.length];
+ for (int i = 0; i < _data.length; i++) {
+ rc[i] = _data[i][index];
+ }
+ return rc;
+ }
}
diff --git a/src/main/java/org/simulator/sedml/MultTableSEDMLWrapper.java b/src/main/java/org/simulator/sedml/MultTableSEDMLWrapper.java
index 40d644d6..66f5bc04 100644
--- a/src/main/java/org/simulator/sedml/MultTableSEDMLWrapper.java
+++ b/src/main/java/org/simulator/sedml/MultTableSEDMLWrapper.java
@@ -38,7 +38,7 @@
* All methods accessing data access the underlying {@link MultiTable} object.
* Changes to a {@link MultiTable} object will therefore be visible to this class,
* i.e., it does not make a separate copy of the data.
- *
+ *
* @author Richard Adams
* @version $Rev$
* @since 1.1
@@ -46,7 +46,6 @@
public class MultTableSEDMLWrapper implements IRawSedmlSimulationResults {
/**
- *
* @param mTable
*/
public MultTableSEDMLWrapper(MultiTable mTable) {
@@ -56,6 +55,7 @@ public MultTableSEDMLWrapper(MultiTable mTable) {
/**
* Gets the underlying {@link MultiTable} wrapped by this class.
+ *
* @return table
*/
public MultiTable getMultiTable() {
@@ -72,9 +72,9 @@ public MultiTable getMultiTable() {
*/
@Override
public String[] getColumnHeaders() {
- String [] hdrs = new String [mTable.getColumnCount()];
- for (int i = 0; i < hdrs.length;i++) {
- hdrs[i]=mTable.getColumnIdentifier(i);
+ String[] hdrs = new String[mTable.getColumnCount()];
+ for (int i = 0; i < hdrs.length; i++) {
+ hdrs[i] = mTable.getColumnIdentifier(i);
}
return hdrs;
}
@@ -84,13 +84,11 @@ public String[] getColumnHeaders() {
*/
@Override
public double[][] getData() {
- double [][] data = new double [mTable.getRowCount()][mTable.getColumnCount()];
- for (int i = 0; i < mTable.getRowCount();i++) {
- for (int j =0; j< mTable.getColumnCount();j++) {
+ double[][] data = new double[mTable.getRowCount()][mTable.getColumnCount()];
+ for (int i = 0; i < mTable.getRowCount(); i++) {
+ for (int j = 0; j < mTable.getColumnCount(); j++) {
data[i][j] = mTable.getValueAt(i, j);
-
}
-
}
return data;
}
@@ -100,11 +98,10 @@ public double[][] getData() {
*/
@Override
public Double[] getDataByColumnId(String id) {
-
- Double [] rc = new Double[mTable.getRowCount()];
+ Double[] rc = new Double[mTable.getRowCount()];
Column col = mTable.getColumn(id);
- for (int i =0; i< mTable.getRowCount();i++) {
- rc[i]=col.getValue(i);
+ for (int i = 0; i < mTable.getRowCount(); i++) {
+ rc[i] = col.getValue(i);
}
return rc;
}
@@ -114,10 +111,10 @@ public Double[] getDataByColumnId(String id) {
*/
@Override
public Double[] getDataByColumnIndex(int indx) {
- Double [] rc = new Double[mTable.getRowCount()];
+ Double[] rc = new Double[mTable.getRowCount()];
Column col = mTable.getColumn(indx);
- for (int i =0; i< mTable.getRowCount();i++) {
- rc[i]=col.getValue(i);
+ for (int i = 0; i < mTable.getRowCount(); i++) {
+ rc[i] = col.getValue(i);
}
return rc;
}
@@ -161,7 +158,7 @@ public IModel2DataMappings getMappings() {
*/
@Override
public boolean hasMappingFor(String id) {
- return mTable.getColumn(id)!=null;
+ return mTable.getColumn(id) != null;
}
/* (non-Javadoc)
@@ -179,8 +176,6 @@ public String getColumnTitleFor(String modelID) {
public int getColumnIndexFor(String colID) {
return mTable.getColumnIndex(colID);
}
-
};
}
-
}
diff --git a/src/main/java/org/simulator/sedml/ProcessSedMLResults.java b/src/main/java/org/simulator/sedml/ProcessSedMLResults.java
index d90d0507..c4e36093 100644
--- a/src/main/java/org/simulator/sedml/ProcessSedMLResults.java
+++ b/src/main/java/org/simulator/sedml/ProcessSedMLResults.java
@@ -26,7 +26,6 @@
import org.jmathml.ASTNumber;
import org.jmathml.EvaluationContext;
import org.simulator.math.odes.MultiTable;
-
import de.binfalse.bflog.LOGGER;
/**
@@ -35,395 +34,333 @@
* This class is used to process results using information in dataGenerator
* elements. It is similar to jlibsedml's ProcessSedMLResults2 with the added
* support for working with repeatedTasks.
- *
+ *
* @author Shalin Shah
* @since 1.5
*/
public class ProcessSedMLResults {
- private Output wanted;
- private SedML sedml;
- IProcessedSedMLSimulationResults prRes;
-
- public ProcessSedMLResults(SedML sedml, Output output) {
- // Check for nulls
- if (sedml == null || output == null) {
- throw new IllegalArgumentException();
- }
- this.sedml = sedml;
- this.wanted = output;
-
- // Check that required output exists in sedml
- boolean found = false;
- for (Output o : sedml.getOutputs()) {
- if (o.getId().equals(wanted.getId())) {
- found = true;
- }
- }
- if (!found) {
- throw new IllegalArgumentException("Output [" + wanted.getId() + "] does not belong the SED-ML object. ");
- }
- }
-
- /**
- * This method modifies jlibsedml's process method to support dataGenerators for
- * repeatedTasks. Processed results can be extracted using getProcessedResult().
- *
- */
- public void process(Map> res) {
-
- // Check for nulls
- if (res == null) {
- throw new IllegalArgumentException();
- }
- if (wanted.getAllDataGeneratorReferences().isEmpty()) {
- LOGGER.warn("Data generator list is empty!");
- throw new NullPointerException();
- }
-
- // calculate total number of rows in all the results
- Map rawTask2Results = new HashMap();
- makeDefensiveCopyOfData(res, rawTask2Results);
-
- // Iterate over all the data generators to process results
- List processed = new ArrayList();
- IXPathToVariableIDResolver variable2IDResolver = new SBMLSupport();
-
- for (String dgId : wanted.getAllDataGeneratorReferences()) {
-
- DataGenerator dg = sedml.getDataGeneratorWithId(dgId);
- if (dg == null) {
- LOGGER.warn("Empty data generator recevied. Correct SED-ML!");
- return;
- }
-
- List vars = dg.getListOfVariables();
- List params = dg.getListOfParameters();
- Map Var2Model = new HashMap();
- Map var2Result = new HashMap();
- Map var2Data = new HashMap();
- String timeID = "";
- int numRows = 0;
-
- // map varIds to result, based upon task reference
- for (Variable variable : vars) {
- String modelID;
-
- if (variable.isVariable()) {
- // get the task from which this result variable was generated.
- modelID = variable2IDResolver.getIdFromXPathIdentifer(variable.getTarget());
- String taskRef = variable.getReference();
- AbstractTask t = sedml.getTaskWithId(taskRef);
-
- // get results list for this task. If it is repeatedTask then multiple results
- List resList = res.get(t);
-
- // set up lookups to results, raw data and model ID
- if (resList.size() > 1) {
- // for a RepeatedTask concat results like tellurium
- IRawSedmlSimulationResults reducedResults = flattenResultsList(resList);
- var2Result.put(variable.getId(), reducedResults);
- } else {
- // Just a Task so get first element
- var2Result.put(variable.getId(), resList.get(0));
- }
-
- var2Data.put(variable.getId(), rawTask2Results.get(t));
- Var2Model.put(variable.getId(), modelID);
- numRows = var2Result.get(variable.getId()).getNumDataRows();
-
- } else if (variable.isSymbol() && variable.getSymbol().equals(VariableSymbol.TIME)) {
-
- // get the task from which this result variable was generated.
- String taskRef = variable.getReference();
- AbstractTask t = sedml.getTaskWithId(taskRef);
-
- // get results list for this task. If it is repeatedTask then multiple results
- List resList = res.get(t);
-
- // it's a symbol
- timeID = variable.getId();
- // set up lookups to results, raw data and model ID
- if (resList.size() > 1) {
- // for a RepeatedTask concat results like tellurium
- IRawSedmlSimulationResults reducedResults = flattenResultsList(resList);
- var2Result.put(variable.getId(), reducedResults);
- } else {
- // Just a Task so get first element
- var2Result.put(variable.getId(), resList.get(0));
- }
- Var2Model.put(timeID, variable.getId());
- var2Data.put(timeID, rawTask2Results.get(t));
-
- numRows = var2Result.get(timeID).getNumDataRows();
- }
- }
-
- // number of rows should be constant for all the variables in one DG
- double[] mutated = new double[numRows];
- processed.add(mutated);
-
- // get Parameter values
- Map Param2Value = new HashMap();
- for (Parameter p : params) {
- Param2Value.put(p.getId(), p.getValue());
- }
-
- // now parse maths, and replace raw simulation results with
- // processed results.
- ASTNode node = dg.getMath();
- Set identifiers = node.getIdentifiers();
- for (ASTCi var : identifiers) {
- if (var.isVector()) {
- String varName = var.getName();
- IModel2DataMappings coll = var2Result.get(varName).getMappings();
- int otherVarInx = coll.getColumnIndexFor(Var2Model.get(varName));
- if (otherVarInx < 0 || otherVarInx >= var2Result.get(varName).getNumColumns()) {
- LOGGER.warn("No data column for " + var);
- return;
- }
- EvaluationContext con = new EvaluationContext();
- Double[] data = var2Result.get(varName).getDataByColumnIndex(otherVarInx);
-
- con.setValueFor(varName, Arrays.asList(data));
-
- if (var.getParentNode() == null || var.getParentNode().getParentNode() == null) {
- LOGGER.warn("Could not evaluate [" + var + "] as symbol does not have parent element");
- return;
- }
- if (!var.getParentNode().canEvaluate(con)) {
- LOGGER.warn("Could not evaluate [" + var + "]");
- return;
- }
- ASTNumber num = var.getParentNode().evaluate(con);
- // replace vector operation with calculated value.
- var.getParentNode().getParentNode().replaceChild(var.getParentNode(), num);
- }
- }
- // identifiers.add(var.getSpId());
- if (identifiersMapToData(identifiers, Var2Model, Param2Value, var2Result, timeID)) {
-
- for (int i = 0; i < numRows; i++) {
- EvaluationContext con = new EvaluationContext();
-
- for (String id : Param2Value.keySet()) {
- con.setValueFor(id, Param2Value.get(id));
- }
-
- for (ASTCi var : identifiers) {
- // we've already resolved parameters
- if (Param2Value.get(var.getName()) != null) {
- continue;
- }
- int otherVarInx = 0;
- if (!var.getName().equals(timeID)) {
- IModel2DataMappings coll = var2Result.get(var.getName()).getMappings();
- otherVarInx = coll.getColumnIndexFor(Var2Model.get(var.getName()));
- if (otherVarInx < 0 || otherVarInx >= var2Result.get(var.getName()).getNumColumns()) {
- LOGGER.warn("No data column for " + var);
- return;
- }
- }
-
- con.setValueFor(var.getName(), var2Data.get(var.getName())[i][otherVarInx]);
- }
-
- if (node.canEvaluate(con)) {
- mutated[i] = node.evaluate(con).getValue();
- } else {
- LOGGER.warn("Math could not be executed for data generator " + dgId);
- }
- }
- } else {
- LOGGER.warn("Math could not be executed for data generator " + dgId);
- return;
- }
- }
-
- prRes = createData(processed);
- }
-
- // Helper method for processing simulation results as per dataGenerator
- // instructions
- // Borrowed from jlibsedml library to deal with repeatedTasks
- private boolean identifiersMapToData(Set identifiers, Map Var2Model,
- Map Param2Value, Map var2Result, String timeID) {
-
- for (ASTCi var : identifiers) {
- boolean seen = false;
- if (Param2Value.get(var.getName()) != null) {
- seen = true;
- } else if (Var2Model.get(var.getName()) != null) {
- if (var.getName().equals(timeID)) {
- seen = true;
- } else {
- IModel2DataMappings coll = var2Result.get(var.getName()).getMappings();
- if (coll.hasMappingFor(Var2Model.get(var.getName()))
- && coll.getColumnTitleFor(Var2Model.get(var.getName())) != null
- || var.getName().equals(timeID)) {
- seen = true;
- }
- }
- }
-
- if (!seen) {
- return false;
- }
-
- }
- return true;
- }
-
- // Helper method for processing simulation results as per dataGenerator
- // instructions
- // Borrowed from jlibsedml library to deal with repeatedTasks
- private IProcessedSedMLSimulationResults createData(List processed) {
-
- String[] hdrs = new String[processed.size()];
- int colInd = 0;
- for (Iterator it = wanted.getAllDataGeneratorReferences().iterator(); it.hasNext();) {
- hdrs[colInd++] = it.next();
- }
-
- int max_size = 0;
- for(double[] curList: processed) {
- if(max_size < curList.length)
- max_size = curList.length;
- }
-
- double[][] data = new double[max_size][hdrs.length];
- for (int j = 0; j < processed.get(0).length; j++) {
- for (int i = 0; i < hdrs.length; i++) {
- if (j < processed.get(i).length)
- data[j][i] = processed.get(i)[j];
- }
-
- }
- return new IProcessedSedMLSimulationResultsWrapper(data, hdrs);
-
- }
-
- public IProcessedSedMLSimulationResults getProcessedResult() {
- return prRes;
- }
-
- // Copy 2D data from the IRawSimulationResults after flattening
- private void makeDefensiveCopyOfData(Map> results,
- Map rawTask2Results) {
-
- // makes a defensive copy of all input data
- for (AbstractTask t : results.keySet()) {
-
- // Before copying 2D data array flatten task results
- // for a RepeatedTask concat results like tellurium
- List result = results.get(t);
- IRawSedmlSimulationResults flat;
- if (result.size() > 1)
- flat = flattenResultsList(result);
- else
- flat = result.get(0);
-
-
- double[][] toCopy = flat.getData(); // for look-up of
- double[][] original = new double[toCopy.length][];
-
- int in = 0;
- for (double[] row : toCopy) {
- double[] copyRow = new double[row.length];
- System.arraycopy(row, 0, copyRow, 0, row.length);
-
- original[in++] = copyRow;
- }
- rawTask2Results.put(t, original);
- }
- return;
- }
-
- /**
- * Flatten the raw results list.
- *
- * @param List
- * @return IRawSedmlSimulationResults
- */
- private IRawSedmlSimulationResults flattenResultsList(List results) {
- IRawSedmlSimulationResults flat = results.stream()
- .reduce((a, b) -> new MultTableSEDMLWrapper(
- new MultiTable(
- mergeTimeCols(a, b),
- mergeDataCols(a.getData(), b.getData()),
- results.get(0).getColumnHeaders()))).get();
- return flat;
- }
-
- /**
- * Merge two 2D arrays into one 2D array in X-direction
- *
- * @param double[][]
- * @param double[][]
- * @return double[][]
- */
- private double[][] mergeDataCols(double[][] a, double[][] b) {
-
- double[][] aData = extractNonTimeData(a);
- double[][] bData = extractNonTimeData(b);
-
- double[][] merged = new double[aData.length + bData.length][];
-
- System.arraycopy(aData, 0, merged, 0, aData.length);
- System.arraycopy(bData, 0, merged, aData.length, bData.length);
-
- return merged;
- }
-
- private double[][] extractNonTimeData(double[][] data) {
- double[][] nonTimeCols = new double[data.length][data[0].length-1];
-
- for(int i = 0; i < data.length; i++) {
- for(int j = 0; j < data[0].length-1; j++) {
- nonTimeCols[i][j] = data[i][j+1];
- }
- }
-
- return nonTimeCols;
- }
-
- /**
- * Merge time columns from 2 multiTables
- *
- * @param MultTableSEDMLWrapper
- * @param MultTableSEDMLWrapper
- * @return double[]
- */
- private double[] mergeTimeCols(IRawSedmlSimulationResults a, IRawSedmlSimulationResults b) {
- // Get end time point for taskA
- double[] timeA = ((MultTableSEDMLWrapper)a).getMultiTable().getTimePoints();
- // Following tellurim we concat all the iterations of repeated tasks
- // so start time from 0
- double timeBegin = 0d;
-
- // Add end time point to taskB
- double[] timeB = Arrays.stream(((MultTableSEDMLWrapper)b).getMultiTable().getTimePoints()).map(row -> row + timeBegin).toArray();
-
- // merged all point to one longer double[]
- double[] merged = new double[timeA.length + timeB.length];
- System.arraycopy(timeA, 0, merged, 0, timeA.length);
- System.arraycopy(timeB, 0, merged, timeA.length, timeB.length);
-
- return merged;
- }
-
- /**
- * Merge two 2D arrays into one 2D array in X-direction
- *
- * @param double[][]
- * @param double[][]
- * @return double[][]
- */
- private double[][] mergeTimeSymbol(double[][] a, double[][] b) {
- double[][] merged = new double[a.length + b.length][];
-
- System.arraycopy(a, 0, merged, 0, a.length);
- System.arraycopy(b, 0, merged, a.length, b.length);
- return merged;
- }
+ private Output wanted;
+ private SedML sedml;
+ IProcessedSedMLSimulationResults prRes;
+
+ public ProcessSedMLResults(SedML sedml, Output output) {
+ // Check for nulls
+ if (sedml == null || output == null) {
+ throw new IllegalArgumentException();
+ }
+ this.sedml = sedml;
+ this.wanted = output;
+ // Check that required output exists in sedml
+ boolean found = false;
+ for (Output o : sedml.getOutputs()) {
+ if (o.getId().equals(wanted.getId())) {
+ found = true;
+ }
+ }
+ if (!found) {
+ throw new IllegalArgumentException("Output [" + wanted.getId() + "] does not belong the SED-ML object. ");
+ }
+ }
+
+ /**
+ * This method modifies jlibsedml's process method to support dataGenerators for
+ * repeatedTasks. Processed results can be extracted using getProcessedResult().
+ */
+ public void process(Map> res) {
+ // Check for nulls
+ if (res == null) {
+ throw new IllegalArgumentException();
+ }
+ if (wanted.getAllDataGeneratorReferences().isEmpty()) {
+ LOGGER.warn("Data generator list is empty!");
+ throw new NullPointerException();
+ }
+ // calculate total number of rows in all the results
+ Map rawTask2Results = new HashMap();
+ makeDefensiveCopyOfData(res, rawTask2Results);
+ // Iterate over all the data generators to process results
+ List processed = new ArrayList();
+ IXPathToVariableIDResolver variable2IDResolver = new SBMLSupport();
+ for (String dgId : wanted.getAllDataGeneratorReferences()) {
+ DataGenerator dg = sedml.getDataGeneratorWithId(dgId);
+ if (dg == null) {
+ LOGGER.warn("Empty data generator recevied. Correct SED-ML!");
+ return;
+ }
+ List vars = dg.getListOfVariables();
+ List params = dg.getListOfParameters();
+ Map Var2Model = new HashMap();
+ Map var2Result = new HashMap();
+ Map var2Data = new HashMap();
+ String timeID = "";
+ int numRows = 0;
+ // map varIds to result, based upon task reference
+ for (Variable variable : vars) {
+ String modelID;
+ if (variable.isVariable()) {
+ // get the task from which this result variable was generated.
+ modelID = variable2IDResolver.getIdFromXPathIdentifer(variable.getTarget());
+ String taskRef = variable.getReference();
+ AbstractTask t = sedml.getTaskWithId(taskRef);
+ // get results list for this task. If it is repeatedTask then multiple results
+ List resList = res.get(t);
+ // set up lookups to results, raw data and model ID
+ if (resList.size() > 1) {
+ // for a RepeatedTask concat results like tellurium
+ IRawSedmlSimulationResults reducedResults = flattenResultsList(resList);
+ var2Result.put(variable.getId(), reducedResults);
+ } else {
+ // Just a Task so get first element
+ var2Result.put(variable.getId(), resList.get(0));
+ }
+ var2Data.put(variable.getId(), rawTask2Results.get(t));
+ Var2Model.put(variable.getId(), modelID);
+ numRows = var2Result.get(variable.getId()).getNumDataRows();
+ } else if (variable.isSymbol() && variable.getSymbol().equals(VariableSymbol.TIME)) {
+ // get the task from which this result variable was generated.
+ String taskRef = variable.getReference();
+ AbstractTask t = sedml.getTaskWithId(taskRef);
+ // get results list for this task. If it is repeatedTask then multiple results
+ List resList = res.get(t);
+ // it's a symbol
+ timeID = variable.getId();
+ // set up lookups to results, raw data and model ID
+ if (resList.size() > 1) {
+ // for a RepeatedTask concat results like tellurium
+ IRawSedmlSimulationResults reducedResults = flattenResultsList(resList);
+ var2Result.put(variable.getId(), reducedResults);
+ } else {
+ // Just a Task so get first element
+ var2Result.put(variable.getId(), resList.get(0));
+ }
+ Var2Model.put(timeID, variable.getId());
+ var2Data.put(timeID, rawTask2Results.get(t));
+ numRows = var2Result.get(timeID).getNumDataRows();
+ }
+ }
+ // number of rows should be constant for all the variables in one DG
+ double[] mutated = new double[numRows];
+ processed.add(mutated);
+ // get Parameter values
+ Map Param2Value = new HashMap();
+ for (Parameter p : params) {
+ Param2Value.put(p.getId(), p.getValue());
+ }
+ // now parse maths, and replace raw simulation results with
+ // processed results.
+ ASTNode node = dg.getMath();
+ Set identifiers = node.getIdentifiers();
+ for (ASTCi var : identifiers) {
+ if (var.isVector()) {
+ String varName = var.getName();
+ IModel2DataMappings coll = var2Result.get(varName).getMappings();
+ int otherVarInx = coll.getColumnIndexFor(Var2Model.get(varName));
+ if (otherVarInx < 0 || otherVarInx >= var2Result.get(varName).getNumColumns()) {
+ LOGGER.warn("No data column for " + var);
+ return;
+ }
+ EvaluationContext con = new EvaluationContext();
+ Double[] data = var2Result.get(varName).getDataByColumnIndex(otherVarInx);
+ con.setValueFor(varName, Arrays.asList(data));
+ if (var.getParentNode() == null || var.getParentNode().getParentNode() == null) {
+ LOGGER.warn("Could not evaluate [" + var + "] as symbol does not have parent element");
+ return;
+ }
+ if (!var.getParentNode().canEvaluate(con)) {
+ LOGGER.warn("Could not evaluate [" + var + "]");
+ return;
+ }
+ ASTNumber num = var.getParentNode().evaluate(con);
+ // replace vector operation with calculated value.
+ var.getParentNode().getParentNode().replaceChild(var.getParentNode(), num);
+ }
+ }
+ // identifiers.add(var.getSpId());
+ if (identifiersMapToData(identifiers, Var2Model, Param2Value, var2Result, timeID)) {
+ for (int i = 0; i < numRows; i++) {
+ EvaluationContext con = new EvaluationContext();
+ for (String id : Param2Value.keySet()) {
+ con.setValueFor(id, Param2Value.get(id));
+ }
+ for (ASTCi var : identifiers) {
+ // we've already resolved parameters
+ if (Param2Value.get(var.getName()) != null) {
+ continue;
+ }
+ int otherVarInx = 0;
+ if (!var.getName().equals(timeID)) {
+ IModel2DataMappings coll = var2Result.get(var.getName()).getMappings();
+ otherVarInx = coll.getColumnIndexFor(Var2Model.get(var.getName()));
+ if (otherVarInx < 0 || otherVarInx >= var2Result.get(var.getName()).getNumColumns()) {
+ LOGGER.warn("No data column for " + var);
+ return;
+ }
+ }
+ con.setValueFor(var.getName(), var2Data.get(var.getName())[i][otherVarInx]);
+ }
+ if (node.canEvaluate(con)) {
+ mutated[i] = node.evaluate(con).getValue();
+ } else {
+ LOGGER.warn("Math could not be executed for data generator " + dgId);
+ }
+ }
+ } else {
+ LOGGER.warn("Math could not be executed for data generator " + dgId);
+ return;
+ }
+ }
+ prRes = createData(processed);
+ }
+
+ // Helper method for processing simulation results as per dataGenerator
+ // instructions
+ // Borrowed from jlibsedml library to deal with repeatedTasks
+ private boolean identifiersMapToData(Set identifiers, Map Var2Model, Map Param2Value, Map var2Result, String timeID) {
+ for (ASTCi var : identifiers) {
+ boolean seen = false;
+ if (Param2Value.get(var.getName()) != null) {
+ seen = true;
+ } else if (Var2Model.get(var.getName()) != null) {
+ if (var.getName().equals(timeID)) {
+ seen = true;
+ } else {
+ IModel2DataMappings coll = var2Result.get(var.getName()).getMappings();
+ if (coll.hasMappingFor(Var2Model.get(var.getName())) && coll.getColumnTitleFor(Var2Model.get(var.getName())) != null || var.getName().equals(timeID)) {
+ seen = true;
+ }
+ }
+ }
+ if (!seen) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ // Helper method for processing simulation results as per dataGenerator
+ // instructions
+ // Borrowed from jlibsedml library to deal with repeatedTasks
+ private IProcessedSedMLSimulationResults createData(List processed) {
+ String[] hdrs = new String[processed.size()];
+ int colInd = 0;
+ for (Iterator it = wanted.getAllDataGeneratorReferences().iterator(); it.hasNext(); ) {
+ hdrs[colInd++] = it.next();
+ }
+ int max_size = 0;
+ for (double[] curList : processed) {
+ if (max_size < curList.length)
+ max_size = curList.length;
+ }
+ double[][] data = new double[max_size][hdrs.length];
+ for (int j = 0; j < processed.get(0).length; j++) {
+ for (int i = 0; i < hdrs.length; i++) {
+ if (j < processed.get(i).length)
+ data[j][i] = processed.get(i)[j];
+ }
+ }
+ return new IProcessedSedMLSimulationResultsWrapper(data, hdrs);
+ }
+
+ public IProcessedSedMLSimulationResults getProcessedResult() {
+ return prRes;
+ }
+
+ // Copy 2D data from the IRawSimulationResults after flattening
+ private void makeDefensiveCopyOfData(Map> results, Map rawTask2Results) {
+ // makes a defensive copy of all input data
+ for (AbstractTask t : results.keySet()) {
+ // Before copying 2D data array flatten task results
+ // for a RepeatedTask concat results like tellurium
+ List result = results.get(t);
+ IRawSedmlSimulationResults flat;
+ if (result.size() > 1)
+ flat = flattenResultsList(result);
+ else
+ flat = result.get(0);
+ double[][] toCopy = flat.getData(); // for look-up of
+ double[][] original = new double[toCopy.length][];
+ int in = 0;
+ for (double[] row : toCopy) {
+ double[] copyRow = new double[row.length];
+ System.arraycopy(row, 0, copyRow, 0, row.length);
+ original[in++] = copyRow;
+ }
+ rawTask2Results.put(t, original);
+ }
+ return;
+ }
+
+ /**
+ * Flatten the raw results list.
+ *
+ * @param List
+ * @return IRawSedmlSimulationResults
+ */
+ private IRawSedmlSimulationResults flattenResultsList(List results) {
+ IRawSedmlSimulationResults flat = results.stream().reduce((a, b) -> new MultTableSEDMLWrapper(new MultiTable(mergeTimeCols(a, b), mergeDataCols(a.getData(), b.getData()), results.get(0).getColumnHeaders()))).get();
+ return flat;
+ }
+
+ /**
+ * Merge two 2D arrays into one 2D array in X-direction
+ *
+ * @param double[][]
+ * @param double[][]
+ * @return double[][]
+ */
+ private double[][] mergeDataCols(double[][] a, double[][] b) {
+ double[][] aData = extractNonTimeData(a);
+ double[][] bData = extractNonTimeData(b);
+ double[][] merged = new double[aData.length + bData.length][];
+ System.arraycopy(aData, 0, merged, 0, aData.length);
+ System.arraycopy(bData, 0, merged, aData.length, bData.length);
+ return merged;
+ }
+
+ private double[][] extractNonTimeData(double[][] data) {
+ double[][] nonTimeCols = new double[data.length][data[0].length - 1];
+ for (int i = 0; i < data.length; i++) {
+ for (int j = 0; j < data[0].length - 1; j++) {
+ nonTimeCols[i][j] = data[i][j + 1];
+ }
+ }
+ return nonTimeCols;
+ }
+
+ /**
+ * Merge time columns from 2 multiTables
+ *
+ * @param MultTableSEDMLWrapper
+ * @param MultTableSEDMLWrapper
+ * @return double[]
+ */
+ private double[] mergeTimeCols(IRawSedmlSimulationResults a, IRawSedmlSimulationResults b) {
+ // Get end time point for taskA
+ double[] timeA = ((MultTableSEDMLWrapper) a).getMultiTable().getTimePoints();
+ // Following tellurim we concat all the iterations of repeated tasks
+ // so start time from 0
+ double timeBegin = 0d;
+ // Add end time point to taskB
+ double[] timeB = Arrays.stream(((MultTableSEDMLWrapper) b).getMultiTable().getTimePoints()).map(row -> row + timeBegin).toArray();
+ // merged all point to one longer double[]
+ double[] merged = new double[timeA.length + timeB.length];
+ System.arraycopy(timeA, 0, merged, 0, timeA.length);
+ System.arraycopy(timeB, 0, merged, timeA.length, timeB.length);
+ return merged;
+ }
+
+ /**
+ * Merge two 2D arrays into one 2D array in X-direction
+ *
+ * @param double[][]
+ * @param double[][]
+ * @return double[][]
+ */
+ private double[][] mergeTimeSymbol(double[][] a, double[][] b) {
+ double[][] merged = new double[a.length + b.length][];
+ System.arraycopy(a, 0, merged, 0, a.length);
+ System.arraycopy(b, 0, merged, a.length, b.length);
+ return merged;
+ }
}
diff --git a/src/main/java/org/simulator/sedml/SEDMLWriter.java b/src/main/java/org/simulator/sedml/SEDMLWriter.java
index db5f76e8..72a07203 100644
--- a/src/main/java/org/simulator/sedml/SEDMLWriter.java
+++ b/src/main/java/org/simulator/sedml/SEDMLWriter.java
@@ -65,9 +65,9 @@
* writer.setComment(comment); // optional note to annotate SED-ML
* writer.saveExperimentToSEDML(start, end,
* stepsize, solver, model,
- * modelURI, outputStream);
+ * modelURI, outputStream);
*
- *
+ *
* @author Richard Adams
* @version $Rev$
* @since 1.1
@@ -75,8 +75,10 @@
public class SEDMLWriter {
private String comment;
+
/**
* Set an optional human-readable comment to be added to the SED-ML file.
+ *
* @param comment
*/
public void setComment(String comment) {
@@ -84,7 +86,6 @@ public void setComment(String comment) {
}
/**
- *
* @param text
* @param sedml
*/
@@ -99,54 +100,48 @@ private void addNote(String text, SedML sedml) {
* Given a configured simulation, will write to SED-ML using the specified {@link OutputStream}.
* It is up to the client to manage the OutputStream an ensure it is open and writeable.
*
- * @param start The start time for the desired output
- * @param end The simulation end time
+ * @param start The start time for the desired output
+ * @param end The simulation end time
* @param stepsize The output step-size
- * @param solver An {@link AbstractDESSolver}, not {@code null}.
- * @param model A {@link Model}, not {@code null}
- * @param modelURI A URI pointing to the model location
- * @param os A writeable, open {@link OutputStream}
+ * @param solver An {@link AbstractDESSolver}, not {@code null}.
+ * @param model A {@link Model}, not {@code null}
+ * @param modelURI A URI pointing to the model location
+ * @param os A writeable, open {@link OutputStream}
* @throws IOException
*/
- public void saveExperimentToSEDML(double start, double end,
- double stepsize, AbstractDESSolver solver, Model model, URI modelURI, OutputStream os) throws IOException {
+ public void saveExperimentToSEDML(double start, double end, double stepsize, AbstractDESSolver solver, Model model, URI modelURI, OutputStream os)
+ throws IOException {
SEDMLDocument doc = Libsedml.createDocument();
-
SedML sedml = doc.getSedMLModel();
- String modelName= extractModelName(model);
+ String modelName = extractModelName(model);
if ((comment != null) && (comment.length() != 0)) {
addNote(comment, sedml);
}
-
// model details
- org.jlibsedml.Model m = new org.jlibsedml.Model(modelName, modelName, SUPPORTED_LANGUAGE.SBML_GENERIC.getURN(),
- modelURI.toString());
+ org.jlibsedml.Model m = new org.jlibsedml.Model(modelName, modelName, SUPPORTED_LANGUAGE.SBML_GENERIC.getURN(), modelURI.toString());
// time course info
- UniformTimeCourse utc = new UniformTimeCourse("sim1", "utc", 0, start, end,
- (int)((end-start)/stepsize),
- new Algorithm(getKisaoIDForSolver(solver))); //
+ UniformTimeCourse utc = new UniformTimeCourse("sim1", "utc", 0, start, end, (int) ((end - start) / stepsize), new Algorithm(getKisaoIDForSolver(solver))); //
// link time course to model
- Task t1 = new Task("t1","TASK",m.getId(),utc.getId());
+ Task t1 = new Task("t1", "TASK", m.getId(), utc.getId());
sedml.addModel(m);
sedml.addSimulation(utc);
sedml.addTask(t1);
- ListOf los = model.getListOfSpecies();
+ ListOf los = model.getListOfSpecies();
// create fields for model variables
- for (Species s:los) {
- DataGenerator dg = new DataGenerator(s.getId()+"dg", s.getId(), Libsedml.parseFormulaString(s.getId()));
- SBMLSupport support= new SBMLSupport();
- Variable v = new Variable(s.getId(), s.getId(), t1.getId(),support.getXPathForSpecies(s.getId()));
+ for (Species s : los) {
+ DataGenerator dg = new DataGenerator(s.getId() + "dg", s.getId(), Libsedml.parseFormulaString(s.getId()));
+ SBMLSupport support = new SBMLSupport();
+ Variable v = new Variable(s.getId(), s.getId(), t1.getId(), support.getXPathForSpecies(s.getId()));
dg.addVariable(v);
sedml.addDataGenerator(dg);
}
// create time datagenerator
- DataGenerator time = new DataGenerator("timedg", "Time", Libsedml.parseFormulaString("Time"));
- Variable timeVar = new Variable("Time", "Time",t1.getId(),VariableSymbol.TIME);
+ DataGenerator time = new DataGenerator("timedg", "Time", Libsedml.parseFormulaString("Time"));
+ Variable timeVar = new Variable("Time", "Time", t1.getId(), VariableSymbol.TIME);
time.addVariable(timeVar);
sedml.addDataGenerator(time);
-
// now create outputs - e.g., a series of curves of time vs species
- Plot2D plot2d = new Plot2D("plot","Basic plot");
+ Plot2D plot2d = new Plot2D("plot", "Basic plot");
sedml.addOutput(plot2d);
int indx = 0;
for (DataGenerator dg : sedml.getDataGenerators()) {
@@ -155,29 +150,26 @@ public void saveExperimentToSEDML(double start, double end,
Curve curve = new Curve("curve" + indx++ + "", null, false, false, time.getId(), dg.getId());
plot2d.addCurve(curve);
}
-
}
os.write(doc.writeDocumentToString().getBytes());
}
/**
- *
* @param model
* @return
*/
String extractModelName(Model model) {
String modelName = model.getName();
- if (modelName==null || modelName.length()==0) {
- modelName=model.getId();
+ if (modelName == null || modelName.length() == 0) {
+ modelName = model.getId();
}
- if (modelName==null || modelName.length()==0) {
- modelName="model1";
+ if (modelName == null || modelName.length() == 0) {
+ modelName = "model1";
}
return modelName;
}
/**
- *
* @param SedML
*/
public void executeSedML(InputStream SedML) {
@@ -185,13 +177,13 @@ public void executeSedML(InputStream SedML) {
/**
* Simple factory to return a solver based on the KISAO ID.
+ *
* @param solver the solver for which a KISAO id is to be determined.
*/
- String getKisaoIDForSolver (AbstractDESSolver solver) {
+ String getKisaoIDForSolver(AbstractDESSolver solver) {
if (solver instanceof EulerMethod) {
return "KISAO_0000261";
- }
- else if (solver instanceof RungeKutta_EventSolver) {
+ } else if (solver instanceof RungeKutta_EventSolver) {
return "KISAO_0000064";
} else if (solver instanceof RosenbrockSolver) {
return "KISAO_0000033";
@@ -199,12 +191,10 @@ else if (solver instanceof RungeKutta_EventSolver) {
return "KISAO_0000279";
} else if (solver instanceof AdamsMoultonSolver) {
return "KISAO_0000280";
- } else if ((solver instanceof DormandPrince54Solver) ||
- (solver instanceof DormandPrince853Solver)) {
+ } else if ((solver instanceof DormandPrince54Solver) || (solver instanceof DormandPrince853Solver)) {
return "KISAO_0000087";
} else {
return "KISAO_0000033"; // default
}
}
-
}
diff --git a/src/main/java/org/simulator/sedml/SedMLSBMLSimulatorExecutor.java b/src/main/java/org/simulator/sedml/SedMLSBMLSimulatorExecutor.java
index cf56500a..462a9831 100644
--- a/src/main/java/org/simulator/sedml/SedMLSBMLSimulatorExecutor.java
+++ b/src/main/java/org/simulator/sedml/SedMLSBMLSimulatorExecutor.java
@@ -83,7 +83,7 @@
* Typical usage for this class is demonstrated in the
* JUnit test for this
* class.
- *
+ *
* Models can be resolved either from local files, URLs, or
* BioModels
* MIRIAM URNs.
@@ -91,599 +91,527 @@
* {@link AbstractSedmlExecutor} in the
* jlibsedml.jar
* library.
- *
+ *
* @author Richard Adams
* @author Shalin Shah
* @version $Rev$
* @since 1.1
*/
public class SedMLSBMLSimulatorExecutor extends AbstractSedmlExecutor {
- /**
- * A list of KISAO Ids corresponding to supported algorithm types in
- * SBMLSimulator. These are used to determine if the simulation can be perform.
- */
- final static String[] SUPPORTED_KISAO_IDS = new String[] {
- "KISAO:0000033", // Rosenbrock method
- "KISAO:0000030", // Euler forward method
- "KISAO:0000087", // Dormand-Prince method
- "KISAO:0000088", // LSODA
- "KISAO:0000019" // CVODE
- };
-
- /**
- * Information for SBML interpreter about the species that an amount should be
- * calculated for
- */
- private Map amountHash;
- private ModelResolver modelResolver;
- private static final transient Logger logger = Logger.getLogger(SedMLSBMLSimulatorExecutor.class.getName());
-
- private static final double ONE_STEP_SIM_STEPS = 10d;
- private static final double STEADY_STATE_STEPS = 10d;
-
- public SedMLSBMLSimulatorExecutor(SedML sedml, Output output, String sedmlDir) {
- super(sedml, output);
- this.modelResolver = new ModelResolver(sedml);
- // add extra model resolvers - only FileModelResolver is included by default.
- modelResolver.add(new FileModelResolver(sedmlDir));
- modelResolver.add(new BioModelsModelsRetriever());
- modelResolver.add(new URLResourceRetriever());
- }
-
- /**
- * @param sedml
- * @param wanted
- * @param amountHash
- */
- public SedMLSBMLSimulatorExecutor(SedML sedml, Output wanted, Map amountHash, String sedmlDir) {
- this(sedml, wanted, sedmlDir);
- this.amountHash = amountHash;
- }
-
- /**
- * Enables models to be retrieved from a SED-ML archive format.
- * This method must be called before {@link #runSimulations()} is called,
- * if a SED-ML archive is to be used as a model source.
- *
- * @param ac
- * A non-{@code null} {@link ArchiveComponents} object.
- */
- public void setIsArchive(ArchiveComponents ac) {
- addModelResolver(new ArchiveModelResolver(ac));
- }
-
- /*
- * test based on kisaoIDs that are available for solvers
- *
- * @see org.jlibsedml.execution.AbstractSedmlExecutor#canExecuteSimulation(org.
- * jlibsedml.Simulation)
- */
- @Override
- protected boolean canExecuteSimulation(Simulation sim) {
- String kisaoID = sim.getAlgorithm().getKisaoID();
- KisaoTerm wanted = KisaoOntology.getInstance().getTermById(kisaoID);
-
- for (String supported : SUPPORTED_KISAO_IDS) {
-
- KisaoTerm offered = KisaoOntology.getInstance().getTermById(supported);
- // If the available type is, or is a subtype of the desired algorithm,
- // we can simulate.
- if (wanted != null & offered != null && offered.is_a(wanted)) {
- return true;
- }
- }
-
- return false;
- }
-
- /*
- * When the the algorithm asked for isn't available find closest match using
- * Kisao query and use closest match to run the simulation
- *
- * @return Simulation
- */
- protected Simulation tryAlternateAlgo(Simulation sim) throws OWLOntologyCreationException {
- LOGGER.warn("Required algorithm is not supported. Finding closest available match...");
- String kisaoID = sim.getAlgorithm().getKisaoID();
- IKiSAOQueryMaker kisaoQuery = new KiSAOQueryMaker();
- IRI wanted = kisaoQuery.searchById(kisaoID);
-
- double minDist = 0d;
- // Default is KISAO:0000033 Rosenbrock solver
- IRI simAlgo = kisaoQuery.searchById(SUPPORTED_KISAO_IDS[0]);
-
- // Find the closest available algorithm to what is asked
- for (String supported : SUPPORTED_KISAO_IDS) {
-
- IRI offered = kisaoQuery.searchById(supported);
- double curDist = kisaoQuery.distance(wanted, offered);
-
- if (curDist < minDist) {
- minDist = curDist;
- simAlgo = offered;
- }
- }
-
- LOGGER.warn("Running using " + kisaoQuery.getId(simAlgo) + " " + kisaoQuery.getName(simAlgo));
- sim.setAlgorithm(new Algorithm(kisaoQuery.getId(simAlgo)));
-
- return sim;
- }
-
- /**
- * This method performs the actual simulation, using the model and simulation
- * configuration that are passed in as arguments.It runs UniformTimeCourse
- * simulation
- *
- * @return An {@link IRawSedmlSimulationResults} object that is used for
- * post-processing by the framework. The actual implementation class in
- * this implementation will be a {@link MultTableSEDMLWrapper} which
- * wraps a {@link MultiTable} of raw results.
- */
- @Override
- protected IRawSedmlSimulationResults executeSimulation(String modelStr, UniformTimeCourse sim) {
-
- AbstractDESSolver solver = getSolverForKisaoID(sim.getAlgorithm().getKisaoID());
- File tmp = null;
- try {
- // get a JSBML object from the model string.
- tmp = File.createTempFile("Sim", "sbml");
- FileUtils.writeStringToFile(tmp, modelStr, "UTF-8");
- Model model = (new SBMLReader()).readSBML(tmp).getModel();
- // now run simulation
- SBMLinterpreter interpreter = null;
- if (amountHash != null) {
- interpreter = new SBMLinterpreter(model, 0, 0, 1, amountHash);
- } else {
- interpreter = new SBMLinterpreter(model);
- }
- solver.setIncludeIntermediates(false);
- solver.setStepSize((sim.getOutputEndTime() - sim.getOutputStartTime()) / (sim.getNumberOfPoints()));
- MultiTable mts = solver.solve(interpreter, interpreter.getInitialValues(), sim.getOutputStartTime(),
- sim.getOutputEndTime());
-
- // adapt the MultiTable to jlibsedml interface.
- return new MultTableSEDMLWrapper(mts);
-
- } catch (Exception e) {
- LOGGER.warn(e.getMessage());
- }
- return null;
- }
-
- protected IRawSedmlSimulationResults executeSimulation(String modelStr, OneStep sim) {
-
- AbstractDESSolver solver = getSolverForKisaoID(sim.getAlgorithm().getKisaoID());
- File tmp = null;
- try {
- // get a JSBML object from the model string.
- tmp = File.createTempFile("Sim", "sbml");
- FileUtils.writeStringToFile(tmp, modelStr, "UTF-8");
- Model model = (new SBMLReader()).readSBML(tmp).getModel();
- // now run simulation
- SBMLinterpreter interpreter = null;
- if (amountHash != null) {
- interpreter = new SBMLinterpreter(model, 0, 0, 1, amountHash);
- } else {
- interpreter = new SBMLinterpreter(model);
- }
- solver.setIncludeIntermediates(false);
- // A step-size randomly taken since SED-ML L1V2 says simulator decides this
- // A better way to decide step size is essential
- solver.setStepSize(sim.getStep() / ONE_STEP_SIM_STEPS);
- MultiTable mts = solver.solve(interpreter, interpreter.getInitialValues(), 0.0, sim.getStep());
-
- // adapt the MultiTable to jlibsedml interface.
- // return only 1 point for OneStep simulation: start and end
- return new MultTableSEDMLWrapper(mts.filter(new double[] { sim.getStep() }));
-
- } catch (Exception e) {
- LOGGER.warn(e.getMessage());
- }
- return null;
- }
-
- protected IRawSedmlSimulationResults executeSimulation(String modelStr, SteadyState sim) {
-
- AbstractDESSolver solver = getSolverForKisaoID(sim.getAlgorithm().getKisaoID());
- File tmp = null;
- try {
- // get a JSBML object from the model string.
- tmp = File.createTempFile("Sim", "sbml");
- FileUtils.writeStringToFile(tmp, modelStr, "UTF-8");
- Model model = (new SBMLReader()).readSBML(tmp).getModel();
- // now run simulation
- SBMLinterpreter interpreter = null;
- if (amountHash != null) {
- interpreter = new SBMLinterpreter(model, 0, 0, 1, amountHash);
- } else {
- interpreter = new SBMLinterpreter(model);
- }
- solver.setIncludeIntermediates(false);
-
- // set default stepSize and call solver. Solver will automatically find
- // steadyState and terminate when steadyState is reached.
- MultiTable mts = solver.steadystate(interpreter, interpreter.getInitialValues(), STEADY_STATE_STEPS);
-
- // adapt the MultiTable to jlibsedml interface.
- return new MultTableSEDMLWrapper(mts);
-
- } catch (Exception e) {
- LOGGER.warn(e.getMessage());
- }
- return null;
- }
-
- protected IRawSedmlSimulationResults executeSimulation(String modelStr,
- Simulation sim, Map mapChangesToList, int element) {
-
- AbstractDESSolver solver = getSolverForKisaoID(sim.getAlgorithm().getKisaoID());
- File tmp = null;
- try {
- // get a JSBML object from the model string.
- tmp = File.createTempFile("Sim", "sbml");
- FileUtils.writeStringToFile(tmp, modelStr, "UTF-8");
- Model model = (new SBMLReader()).readSBML(tmp).getModel();
-
- // If there are any changes make them before execution
- if (mapChangesToList != null) {
- // Find all the setValues and set them to current element in range
- for(String change: mapChangesToList.keySet()) {
- model.getParameter(change).setValue(mapChangesToList.get(change)[element]);;
- }
- }
-
- // now run simulation
- SBMLinterpreter interpreter = null;
- if (amountHash != null) {
- interpreter = new SBMLinterpreter(model, 0, 0, 1, amountHash);
- } else {
- interpreter = new SBMLinterpreter(model);
- }
- solver.setIncludeIntermediates(false);
-
- if(sim instanceof OneStep) {
- OneStep finalSim = (OneStep) sim;
- // A step-size randomly taken since SED-ML L1V2 says simulator decides this
- // A better way to decide step size is essential
- solver.setStepSize(finalSim.getStep() / ONE_STEP_SIM_STEPS);
- MultiTable mts = solver.solve(interpreter, interpreter.getInitialValues(), 0.0, finalSim.getStep());
-
- // adapt the MultiTable to jlibsedml interface.
- // return only 1 point for OneStep simulation: start and end
- return new MultTableSEDMLWrapper(mts.filter(new double[] { finalSim.getStep() }));
- }
- else if(sim instanceof UniformTimeCourse) {
- UniformTimeCourse finalSim = (UniformTimeCourse) sim;
- solver.setStepSize((finalSim.getOutputEndTime() - finalSim.getOutputStartTime()) / (finalSim.getNumberOfPoints()));
- MultiTable mts = solver.solve(interpreter, interpreter.getInitialValues(), finalSim.getOutputStartTime(),
- finalSim.getOutputEndTime());
-
- // adapt the MultiTable to jlibsedml interface.
- return new MultTableSEDMLWrapper(mts);
- }
- else if(sim instanceof SteadyState) {
- // set default stepSize and call solver. Solver will automatically find
- // steadyState and terminate when steadyState is reached.
- MultiTable mts = solver.steadystate(interpreter, interpreter.getInitialValues(), STEADY_STATE_STEPS);
-
- // adapt the MultiTable to jlibsedml interface.
- return new MultTableSEDMLWrapper(mts);
- }
-
-
- } catch (Exception e) {
- LOGGER.warn(e.getMessage());
- }
- return null;
- }
-
- /**
- * This method is a wrapper to the runSimulations method from
- * {@link AbstractSedmlExecutor} to add additional support for repeatedTasks. It
- * identifies the type of task, before running the simulations.
- * @throws OWLOntologyCreationException
- */
- public Map