From 133bc5f7bd8afee0a73cb63e60519e66abdcb0b2 Mon Sep 17 00:00:00 2001 From: miettinen Date: Thu, 27 Jun 2013 10:27:35 +0000 Subject: [PATCH] Multiple varied parameters to sensitivity analysis. (refs #4238) Now the parameters are defined outside of the distributions. This allows firstly to randomize the parameter values for each run so that no parameter values repeat between individual runs. Secondly this enables using more sophisticated techniques of selecting the sequence of parameter sets (not yet implemented). git-svn-id: https://www.simantics.org/svn/simantics/sysdyn/trunk@27664 ac1ea38d-2e2b-0410-8846-a27921b304fc --- .../modelica/data/SimulationResult.java | 18 +- org.simantics.sysdyn.ontology/graph.tg | Bin 154900 -> 154821 bytes .../graph/Sysdyn.pgraph | 10 +- .../org/simantics/sysdyn/SysdynResource.java | 12 +- ...sitivityAnalysisExperimentNodeHandler.java | 1 - .../SensitivityAnalysisExperimentTab.java | 37 +- .../sensitivity/ParameterLabelRule.java | 11 +- .../adapter/distribution/IDistribution.java | 24 +- .../sysdyn/adapter/distribution/Interval.java | 55 +-- .../distribution/NormalDistribution.java | 427 ++++++++++++++---- .../distribution/UniformDistribution.java | 61 +-- .../sysdyn/manager/RandomGenerator.java | 46 ++ .../SysdynSensitivityAnalysisExperiment.java | 83 ++-- 13 files changed, 513 insertions(+), 272 deletions(-) create mode 100644 org.simantics.sysdyn/src/org/simantics/sysdyn/manager/RandomGenerator.java diff --git a/org.simantics.modelica/src/org/simantics/modelica/data/SimulationResult.java b/org.simantics.modelica/src/org/simantics/modelica/data/SimulationResult.java index 369a2814..d4091285 100644 --- a/org.simantics.modelica/src/org/simantics/modelica/data/SimulationResult.java +++ b/org.simantics.modelica/src/org/simantics/modelica/data/SimulationResult.java @@ -21,6 +21,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.LineNumberReader; import java.util.ArrayList; +import java.util.ConcurrentModificationException; import java.util.HashMap; import java.util.List; import java.util.regex.Matcher; @@ -458,12 +459,17 @@ public class SimulationResult { if(resArray.length == 2 && timesArray.length > 2) timesArray = new double[] {timesArray[0], timesArray[timesArray.length - 1]}; ds = new DataSet(variable, timesArray, resArray); - for (DataSet tempds : variables){ - if (tempds.name.equals(variable)) - // We should never need to go there unless some change in - // the logic of reading variables are made. - // Also helps in seeking memory leaks. - return null; + try { + for (DataSet tempds : variables){ + if (tempds.name.equals(variable)) + // We should never need to go there unless some change in + // the logic of reading variables are made. + // Also helps in seeking memory leaks. + System.err.println("Find me and add a comment that I was printed, please."); + // If it seems that in no case we need to go here, comment this try catch. + return null; + } + } catch (ConcurrentModificationException e) { } variables.add(ds); return ds; diff --git a/org.simantics.sysdyn.ontology/graph.tg b/org.simantics.sysdyn.ontology/graph.tg index d11b9bca82449ddc1bd62f62bd97c5f1b0ed9d64..a01167bedf29b956211c931238a9e095601749ea 100644 GIT binary patch literal 154821 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

7nuapW(2RwLPdyj`Smq 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 Raam-#jyL!!y(BB3{||JgxyJwi diff --git a/org.simantics.sysdyn.ontology/graph/Sysdyn.pgraph b/org.simantics.sysdyn.ontology/graph/Sysdyn.pgraph index cfce20a5..9b887312 100644 --- a/org.simantics.sysdyn.ontology/graph/Sysdyn.pgraph +++ b/org.simantics.sysdyn.ontology/graph/Sysdyn.pgraph @@ -23,8 +23,8 @@ SYSDYN.ImportedOntologies : PROJ.NamespaceRequirement "http://www.simantics.org/Sysdyn-1.1" : L0.URI "http://www.simantics.org/Layer0-1.1" : L0.URI "http://www.simantics.org/SelectionView-1.2" : L0.URI - "http://www.simantics.org/Documentation-1.1" : L0.URI // Experimental documentation tool - "http://www.simantics.org/DocumentWorkbench-1.0" : L0.URI // Experimental documentation tool +// "http://www.simantics.org/Documentation-1.1" : L0.URI // Experimental documentation tool +// "http://www.simantics.org/DocumentWorkbench-1.0" : L0.URI // Experimental documentation tool SYSDYN.SharedFunctionOntology -- SYSDYN.SensitivityAnalysisExperiment.parameterList --> L0.List -- SYSDYN.SensitivityAnalysisExperiment.randomSeed --> L0.Integer -- SYSDYN.SensitivityAnalysisExperiment.resultRefreshRate --> L0.Integer -- SYSDYN.SensitivityAnalysisExperiment.numberOfValues --> L0.Integer -- SYSDYN.SensitivityAnalysisExperiment.Parameter.propabilityDistribution --> SYSDYN.ProbabilityDistribution -- SYSDYN.SensitivityAnalysisExperiment.Parameter.variable --> L0.String -- SYSDYN.SensitivityAnalysisExperiment.Parameter.indexes --> L0.StringArray -- SYSDYN.SensitivityAnalysisExperiment.Parameter.numberOfValues --> L0.Integer -- SYSDYN.UniformDistribution.minValue --> L0.Double ", - sr.SensitivityAnalysisExperiment_Parameter_numberOfValues, 10, L0.PartOf, experiment); ArrayList parameterList = new ArrayList(); diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/SensitivityAnalysisExperimentTab.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/SensitivityAnalysisExperimentTab.java index a88f633f..ae039710 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/SensitivityAnalysisExperimentTab.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/SensitivityAnalysisExperimentTab.java @@ -1,3 +1,14 @@ +/******************************************************************************* + * Copyright (c) 2007, 2011 Association for Decentralized Information Management in + * Industry THTH ry. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * VTT Technical Research Centre of Finland - initial API and implementation + *******************************************************************************/ package org.simantics.sysdyn.ui.properties; import java.util.Collection; @@ -117,7 +128,7 @@ public class SensitivityAnalysisExperimentTab extends LabelPropertyTabContributo // Label Composite labelComposite = new Composite(content, SWT.NONE); GridDataFactory.fillDefaults().grab(true, false).span(2, 1).applyTo(labelComposite); - GridLayoutFactory.fillDefaults().numColumns(4).applyTo(labelComposite); + GridLayoutFactory.fillDefaults().numColumns(6).applyTo(labelComposite); Label label = new Label(labelComposite, SWT.NONE); label.setText("Name"); @@ -128,6 +139,16 @@ public class SensitivityAnalysisExperimentTab extends LabelPropertyTabContributo name.setColorProvider(new SysdynBasicColorProvider(new LocalResourceManager(JFaceResources.getResources(), name.getWidget()))); GridDataFactory.fillDefaults().grab(true, false).applyTo(name.getWidget()); + label = new Label(labelComposite, SWT.NONE); + label.setText("Number of runs"); + + TrackedText n = new TrackedText(labelComposite, support, SWT.BORDER); + n.setTextFactory(new IntegerPropertyFactory(SysdynResource.URIs.SensitivityAnalysisExperiment_numberOfValues)); + n.addModifyListener(new IntegerPropertyModifier(context, SysdynResource.URIs.SensitivityAnalysisExperiment_numberOfValues)); + n.setInputValidator(new IntegerValidator()); + n.setColorProvider(new SysdynBasicColorProvider(new LocalResourceManager(JFaceResources.getResources(), n.getWidget()))); + GridDataFactory.fillDefaults().hint(80, SWT.DEFAULT).applyTo(n.getWidget()); + label = new Label(labelComposite, SWT.NONE); label.setText("Seed"); @@ -138,7 +159,6 @@ public class SensitivityAnalysisExperimentTab extends LabelPropertyTabContributo seed.setColorProvider(new SysdynBasicColorProvider(new LocalResourceManager(JFaceResources.getResources(), seed.getWidget()))); GridDataFactory.fillDefaults().hint(80, SWT.DEFAULT).applyTo(seed.getWidget()); - // (Ontology-based) GraphExplorer displaying range axis and variables mapped to those axis explorer = new AxisAndVariablesExplorerComposite(ArrayMap.keys( "displaySelectors", "displayFilter", "treeView").values(false, false, true), site, content, support, SWT.FULL_SELECTION | SWT.BORDER | SWT.SINGLE); @@ -242,18 +262,6 @@ public class SensitivityAnalysisExperimentTab extends LabelPropertyTabContributo // variable.setColorProvider(new SysdynBasicColorProvider(new LocalResourceManager(JFaceResources.getResources(), variable.getWidget()))); // GridDataFactory.fillDefaults().grab(true, false).applyTo(variable.getWidget()); - label = new Label(parameterProperties, SWT.NONE); - label.setText("Number of values:"); - GridDataFactory.fillDefaults().align(SWT.END, SWT.CENTER).applyTo(label); - - - TrackedText numValues = new TrackedText(parameterProperties, parameterSupport, SWT.BORDER); - numValues.setTextFactory(new IntegerPropertyFactory(SysdynResource.URIs.SensitivityAnalysisExperiment_Parameter_numberOfValues)); - numValues.addModifyListener(new IntegerPropertyModifier(context, SysdynResource.URIs.SensitivityAnalysisExperiment_Parameter_numberOfValues)); - numValues.setInputValidator(new IntegerValidator()); - numValues.setColorProvider(new SysdynBasicColorProvider(new LocalResourceManager(JFaceResources.getResources(), numValues.getWidget()))); - GridDataFactory.fillDefaults().align(SWT.BEGINNING, SWT.CENTER).hint(80, SWT.DEFAULT).applyTo(numValues.getWidget()); - label = new Label(parameterProperties, SWT.NONE); label.setText("Distribution:"); GridDataFactory.fillDefaults().align(SWT.END, SWT.CENTER).applyTo(label); @@ -363,7 +371,6 @@ public class SensitivityAnalysisExperimentTab extends LabelPropertyTabContributo Resource parameter = GraphUtils.create2(graph, sr.SensitivityAnalysisExperiment_Parameter, sr.SensitivityAnalysisExperiment_Parameter_propabilityDistribution, distribution, sr.SensitivityAnalysisExperiment_Parameter_variable, "", - sr.SensitivityAnalysisExperiment_Parameter_numberOfValues, 10, L0.PartOf, input); Resource parameterList = graph.getPossibleObject(input, sr.SensitivityAnalysisExperiment_parameterList); diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/widgets/sensitivity/ParameterLabelRule.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/widgets/sensitivity/ParameterLabelRule.java index 87984f7e..fd67dc8b 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/widgets/sensitivity/ParameterLabelRule.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/widgets/sensitivity/ParameterLabelRule.java @@ -8,6 +8,7 @@ * * Contributors: * Semantum Oy - initial API and implementation + * VTT Technical Research Centre of Finland *******************************************************************************/ package org.simantics.sysdyn.ui.properties.widgets.sensitivity; @@ -33,7 +34,6 @@ public class ParameterLabelRule implements LabelRule { HashMap result = new HashMap(); String variable = graph.getPossibleRelatedValue((Resource)content, SysdynResource.getInstance(graph).SensitivityAnalysisExperiment_Parameter_variable); - Integer n = graph.getPossibleRelatedValue((Resource)content, SysdynResource.getInstance(graph).SensitivityAnalysisExperiment_Parameter_numberOfValues); StringBuilder sb = new StringBuilder(); @@ -42,15 +42,6 @@ public class ParameterLabelRule implements LabelRule { else sb.append("No variable"); - sb.append(" (n="); - - if(n != null) - sb.append(n); - else - sb.append("undefined"); - - sb.append(")"); - result.put(ColumnKeys.SINGLE, sb.toString()) ; return result; diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/adapter/distribution/IDistribution.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/adapter/distribution/IDistribution.java index 8a6b8c31..760ed446 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/adapter/distribution/IDistribution.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/adapter/distribution/IDistribution.java @@ -8,26 +8,20 @@ * * Contributors: * Semantum Oy - initial API and implementation + * VTT Technical Research Centre of Finland *******************************************************************************/ package org.simantics.sysdyn.adapter.distribution; public interface IDistribution { - - /** - * Return next value of the distribution - * @return - */ - public double next(); - + /** + * Map a probability to the random variable. + * When random numbers are used to generate the Monte Carlo simulation parameters, the probability + * is itself selected randomly (between (0,1); at the domain endpoints the value is undefined). * - * @return does the distribution have next value; + * @param randomVariable + * @return Inverse cumulative distribution function at probability, i.e. the random variable at the + * point where the cumulative distribution function yields probability. */ - public boolean hasNext(); - - /** - * Initialize distribution - */ - public void initialize(); - + public double inverseCDF(double probability); } diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/adapter/distribution/Interval.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/adapter/distribution/Interval.java index 3def0d33..39fd8760 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/adapter/distribution/Interval.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/adapter/distribution/Interval.java @@ -8,11 +8,10 @@ * * Contributors: * Semantum Oy - initial API and implementation + * VTT Technical Research Centre of Finland *******************************************************************************/ package org.simantics.sysdyn.adapter.distribution; -import java.util.Random; - import org.simantics.databoard.Bindings; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; @@ -22,13 +21,10 @@ import org.simantics.sysdyn.SysdynResource; public class Interval implements IDistribution { - private Random random; - private double min = 0; private double max = 10; private double intervalLength = 1; private int numberOfValues = 10; - private int seed = 123; private int index = 0; public Interval(ReadGraph graph, Resource distribution) { @@ -43,38 +39,20 @@ public class Interval implements IDistribution { Double maxValue = graph.getPossibleRelatedValue(distribution, SR.Interval_maxValue, Bindings.DOUBLE); if(maxValue != null) this.max = maxValue; - - + Resource parameter = graph.getPossibleObject(distribution, SR.SensitivityAnalysisExperiment_Parameter_propabilityDistribution_Inverse); + + Resource experiment = graph.getPossibleObject(parameter, Layer0.getInstance(graph).PartOf); - Integer numberOfValues = graph.getPossibleRelatedValue(parameter, SR.SensitivityAnalysisExperiment_Parameter_numberOfValues, Bindings.INTEGER); + Integer numberOfValues = graph.getPossibleRelatedValue(experiment, SR.SensitivityAnalysisExperiment_numberOfValues, Bindings.INTEGER); if(numberOfValues != null) this.numberOfValues = numberOfValues; intervalLength = (maxValue - minValue) / (this.numberOfValues - 1); - Resource experiment = graph.getPossibleObject(parameter, Layer0.getInstance(graph).PartOf); - - Integer seed = graph.getPossibleRelatedValue(experiment, SR.SensitivityAnalysisExperiment_randomSeed, Bindings.INTEGER); - if(seed != null) - this.seed = seed; - } catch (DatabaseException e) { } - - initialize(); - } - - @Override - public double next() { - double value = min + (intervalLength * index); - index++; - return value; - } - - public Random getRandom() { - return random; } public double getMin() { @@ -89,23 +67,18 @@ public class Interval implements IDistribution { return numberOfValues; } - public int getSeed() { - return seed; - } - public double getIntervalLength() { return intervalLength; } - @Override - public void initialize() { - random = new Random(this.seed); - index = 0; - } - - @Override - public boolean hasNext() { - return index < numberOfValues; - } + @Override + public double inverseCDF(double probability) { + // This is a bit awkward... + double value = min + (intervalLength * index); + index++; + if (index >= numberOfValues) + index = 0; + return value; + } } diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/adapter/distribution/NormalDistribution.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/adapter/distribution/NormalDistribution.java index efa2ad1b..7887a62a 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/adapter/distribution/NormalDistribution.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/adapter/distribution/NormalDistribution.java @@ -8,37 +8,30 @@ * * Contributors: * Semantum Oy - initial API and implementation + * VTT Technical Research Centre of Finland *******************************************************************************/ package org.simantics.sysdyn.adapter.distribution; -import java.util.Random; - import org.simantics.databoard.Bindings; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; import org.simantics.db.exception.DatabaseException; -import org.simantics.layer0.Layer0; import org.simantics.sysdyn.SysdynResource; public class NormalDistribution implements IDistribution { - - private Random random; - + private Double min = null; private Double max = null; + private double minProbability = 0; + private double maxProbability = 1; private double mean; private double stdDeviation; - private int numberOfValues = 10; - private int seed = 123; - private int index = 0; - - private static int MAX_TRIES = 100; - public NormalDistribution(ReadGraph graph, Resource distribution) { try { + SysdynResource SR = SysdynResource.getInstance(graph); min = graph.getPossibleRelatedValue(distribution, SR.NormalDistribution_minValue, Bindings.DOUBLE); @@ -46,66 +39,17 @@ public class NormalDistribution implements IDistribution { stdDeviation = graph.getPossibleRelatedValue(distribution, SR.NormalDistribution_stdDeviation, Bindings.DOUBLE); mean = graph.getPossibleRelatedValue(distribution, SR.NormalDistribution_mean, Bindings.DOUBLE); - - Resource parameter = graph.getPossibleObject(distribution, SR.SensitivityAnalysisExperiment_Parameter_propabilityDistribution_Inverse); + // Determine the max and min probabilities. + if (min != null) + minProbability = cdf(min, mean, stdDeviation, false); + if (max != null) + maxProbability = cdf(max, mean, stdDeviation, false); - Integer numberOfValues = graph.getPossibleRelatedValue(parameter, SR.SensitivityAnalysisExperiment_Parameter_numberOfValues, Bindings.INTEGER); - if(numberOfValues != null) - this.numberOfValues = numberOfValues; - - - - Resource experiment = graph.getPossibleObject(parameter, Layer0.getInstance(graph).PartOf); - - Integer seed = graph.getPossibleRelatedValue(experiment, SR.SensitivityAnalysisExperiment_randomSeed, Bindings.INTEGER); - if(seed != null) - this.seed = seed; - - - random = new Random(this.seed); - } catch (DatabaseException e) { } } - @Override - public double next() { - - /* Try to find value between min and max, if they are defined. - * If value cannot be found after MAX_TRIES number of tries, - * return the last try. - */ - double value = 0; - for(int i = 0; i < MAX_TRIES; i++) { - value = random.nextGaussian() * stdDeviation + mean; - if(accept(value)) - break; - } - - index++; - return value; - } - - - private boolean accept(double value) { - if(min != null) { - if(value < min) - return false; - } - - if(max != null) { - if(value > max) - return false; - } - - return true; - } - - public Random getRandom() { - return random; - } - public double getMin() { return min; } @@ -113,25 +57,348 @@ public class NormalDistribution implements IDistribution { public double getMax() { return max; } + + @Override + public double inverseCDF(double probability) { + // Map probability to [min,max] + double mappedProbability = minProbability + (maxProbability - minProbability) * probability; + // Calculate the inverse CDF + return quantile(mappedProbability, mean, stdDeviation); + } - public int getNumberOfValues() { - return numberOfValues; - } - - public int getSeed() { - return seed; + //The following is from BEAST-MCMC (https://code.google.com/p/beast-mcmc/) + + /* + * NormalDistribution.java + * + * Copyright (c) 2002-2011 Alexei Drummond, Andrew Rambaut and Marc Suchard + * + * This file is part of BEAST. + * See the NOTICE file distributed with this work for additional + * information regarding copyright ownership and licensing. + * + * BEAST is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * BEAST is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with BEAST; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301 USA + */ + + /** + * quantiles (=inverse cumulative density function) + * + * @param z argument + * @param m mean + * @param sd standard deviation + * @return icdf at z + */ + public static double quantile(double z, double m, double sd) { + return m + Math.sqrt(2.0) * sd * inverseErf(2.0 * z - 1.0); } + /** A more accurate and faster implementation of the cdf (taken from function pnorm in the R statistical language) + * This implementation has discrepancies depending on the programming language and system architecture + * In Java, returned values become zero once z reaches -37.5193 exactly on the machine tested + * In the other implementation, the returned value 0 at about z = -8 + * In C, this 0 value is reached approximately z = -37.51938 + * + * Will later need to be optimised for BEAST + * + * @param x argument + * @param mu mean + * @param sigma standard deviation + * @param log_p is p logged + * @return cdf at x + */ + public static double cdf(double x, double mu, double sigma, boolean log_p) { + boolean i_tail=false; + double p, cp = Double.NaN; - @Override - public void initialize() { - random = new Random(this.seed); - index = 0; - } + if(Double.isNaN(x) || Double.isNaN(mu) || Double.isNaN(sigma)) { + return Double.NaN; + } + if(Double.isInfinite(x) && mu == x) { /* x-mu is NaN */ + return Double.NaN; + } + if (sigma <= 0) { + if(sigma < 0) { + return Double.NaN; + } + return (x < mu) ? 0.0 : 1.0; + } + p = (x - mu) / sigma; + if(Double.isInfinite(p)) { + return (x < mu) ? 0.0 : 1.0; + } + x = p; + if(Double.isNaN(x)) { + return Double.NaN; + } + + double xden, xnum, temp, del, eps, xsq, y; + int i; + boolean lower, upper; + eps = DBL_EPSILON * 0.5; + lower = !i_tail; + upper = i_tail; + + y = Math.abs(x); + if (y <= 0.67448975) { /* Normal.quantile(3/4, 1, 0) = 0.67448975 */ + if (y > eps) { + xsq = x * x; + xnum = a[4] * xsq; + xden = xsq; + for (i = 0; i < 3; i++) { + xnum = (xnum + a[i]) * xsq; + xden = (xden + b[i]) * xsq; + } + } + else { + xnum = xden = 0.0; + } + temp = x * (xnum + a[3]) / (xden + b[3]); + if(lower) { + p = 0.5 + temp; + } + if(upper) { + cp = 0.5 - temp; + } + if(log_p) { + if(lower) { + p = Math.log(p); + } + if(upper) { + cp = Math.log(cp); + } + } + } + + + else if (y <= M_SQRT_32) { + /* Evaluate pnorm for 0.67448975 = Normal.quantile(3/4, 1, 0) < |x| <= sqrt(32) ~= 5.657 */ + + xnum = c[8] * y; + xden = y; + for (i = 0; i < 7; i++) { + xnum = (xnum + c[i]) * y; + xden = (xden + d[i]) * y; + } + temp = (xnum + c[7]) / (xden + d[7]); + + //do_del(y); + //swap_tail; + //#define do_del(X) \ + xsq = ((int) (y * CUTOFF)) * 1.0 / CUTOFF; + del = (y - xsq) * (y + xsq); + if(log_p) { + p = (-xsq * xsq * 0.5) + (-del * 0.5) + Math.log(temp); + if((lower && x > 0.0) || (upper && x <= 0.0)) { + cp = Math.log(1.0-Math.exp(-xsq * xsq * 0.5) * Math.exp(-del * 0.5) * temp); + } + } + else { + p = Math.exp(-xsq * xsq * 0.5) * Math.exp(-del * 0.5) * temp; + cp = 1.0 - p; + } + //#define swap_tail \ + if (x > 0.0) { + temp = p; + if(lower) { + p = cp; + } + cp = temp; + } + } + /* else |x| > sqrt(32) = 5.657 : + * the next two case differentiations were really for lower=T, log=F + * Particularly *not* for log_p ! + * Cody had (-37.5193 < x && x < 8.2924) ; R originally had y < 50 + * Note that we do want symmetry(0), lower/upper -> hence use y + */ + else if(log_p || (lower && -37.5193 < x && x < 8.2924) + || (upper && -8.2924 < x && x < 37.5193)) { + + /* Evaluate pnorm for x in (-37.5, -5.657) union (5.657, 37.5) */ + xsq = 1.0 / (x * x); + xnum = p_[5] * xsq; + xden = xsq; + for (i = 0; i < 4; i++) { + xnum = (xnum + p_[i]) * xsq; + xden = (xden + q[i]) * xsq; + } + temp = xsq * (xnum + p_[4]) / (xden + q[4]); + temp = (M_1_SQRT_2PI - temp) / y; + + //do_del(x); + xsq = ((int) (x * CUTOFF)) * 1.0 / CUTOFF; + del = (x - xsq) * (x + xsq); + if(log_p) { + p = (-xsq * xsq * 0.5) + (-del * 0.5) + Math.log(temp); + if((lower && x > 0.0) || (upper && x <= 0.0)) { + cp = Math.log(1.0-Math.exp(-xsq * xsq * 0.5) * Math.exp(-del * 0.5) * temp); + } + } + else { + p = Math.exp(-xsq * xsq * 0.5) * Math.exp(-del * 0.5) * temp; + cp = 1.0 - p; + } + //swap_tail; + if (x > 0.0) { + temp = p; + if(lower) { + p = cp; + } + cp = temp; + } + } + else { /* no log_p , large x such that probs are 0 or 1 */ + if(x > 0) { + p = 1.0; + cp = 0.0; + } + else { + p = 0.0; + cp = 1.0; + } + } + return p; - @Override - public boolean hasNext() { - return index < numberOfValues; } + // Private + + protected double m, sd; + + private static final double[] a = { + 2.2352520354606839287, + 161.02823106855587881, + 1067.6894854603709582, + 18154.981253343561249, + 0.065682337918207449113 + }; + private static final double[] b = { + 47.20258190468824187, + 976.09855173777669322, + 10260.932208618978205, + 45507.789335026729956 + }; + private static final double[] c = { + 0.39894151208813466764, + 8.8831497943883759412, + 93.506656132177855979, + 597.27027639480026226, + 2494.5375852903726711, + 6848.1904505362823326, + 11602.651437647350124, + 9842.7148383839780218, + 1.0765576773720192317e-8 + }; + private static final double[] d = { + 22.266688044328115691, + 235.38790178262499861, + 1519.377599407554805, + 6485.558298266760755, + 18615.571640885098091, + 34900.952721145977266, + 38912.003286093271411, + 19685.429676859990727 + }; + private static final double[] p_ = { + 0.21589853405795699, + 0.1274011611602473639, + 0.022235277870649807, + 0.001421619193227893466, + 2.9112874951168792e-5, + 0.02307344176494017303 + }; + private static final double[] q = { + 1.28426009614491121, + 0.468238212480865118, + 0.0659881378689285515, + 0.00378239633202758244, + 7.29751555083966205e-5 + }; + + private static final int CUTOFF = 16; /* Cutoff allowing exact "*" and "/" */ + + private static final double M_SQRT_32 = 5.656854249492380195206754896838; /* The square root of 32 */ + private static final double M_1_SQRT_2PI = 0.398942280401432677939946059934; + private static final double DBL_EPSILON = 2.2204460492503131e-016; + + /* + * ErrorFunction.java + * + * Copyright (C) 2002-2006 Alexei Drummond and Andrew Rambaut + * + * This file is part of BEAST. + * See the NOTICE file distributed with this work for additional + * information regarding copyright ownership and licensing. + * + * BEAST is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * BEAST is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with BEAST; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301 USA + */ + + /** + * inverse error function + * + * @param z argument + * + * @return function value + */ + public static double inverseErf(double z) + { + return pointNormal(0.5*z+0.5)/Math.sqrt(2.0); + } + + // Private + + // Returns z so that Prob{x next() { + ArrayList randoms = new ArrayList(); + for (int i = 0; i < dimension; ++i) + randoms.add(random.nextDouble()); + return randoms; + } + + public void initialize() { + random = new Random(this.seed); + } + +} diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/manager/SysdynSensitivityAnalysisExperiment.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/manager/SysdynSensitivityAnalysisExperiment.java index 432ff044..0273ec9f 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/manager/SysdynSensitivityAnalysisExperiment.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/manager/SysdynSensitivityAnalysisExperiment.java @@ -44,32 +44,57 @@ import org.simantics.sysdyn.adapter.SensitivityExperimentParameter; */ public class SysdynSensitivityAnalysisExperiment extends SysdynExperiment { - - private ArrayList results = null; - + private int seed = 124; + private int numberOfRuns = 0; + public SysdynSensitivityAnalysisExperiment(Resource experiment, Resource model) { super(experiment, model); } - private void findValuesAndRun(List parameters, HashMap values, HashMap experimentParameters) { - findValuesAndRun(parameters, 0, values, experimentParameters); - } - - private void findValuesAndRun(List parameters, int index, HashMap values, HashMap experimentParameters) { - SensitivityExperimentParameter p = parameters.get(index); + ArrayList> parameterMaps = new ArrayList>(); + int parametersSize = parameters.size(); + + // Get seed + try { + session.syncRequest(new ReadRequest() { + @Override + public void run(ReadGraph graph) throws DatabaseException { + SysdynResource SR = SysdynResource.getInstance(graph); + seed = graph.getPossibleRelatedValue(experiment, SR.SensitivityAnalysisExperiment_randomSeed, Bindings.INTEGER); + numberOfRuns = graph.getPossibleRelatedValue(experiment, SR.SensitivityAnalysisExperiment_numberOfValues, Bindings.INTEGER); + //refreshRate = numberOfRuns / 20 + 1; + refreshRate = 1; + } + }); + } catch (DatabaseException e) { + e.printStackTrace(); + } - while(p.getDistribution().hasNext()) { - values.put(p.getFullName(), Double.toString(p.getDistribution().next())); - if((index + 1) < parameters.size()) { - findValuesAndRun(parameters, index + 1, values, experimentParameters); - } else { - // Run with values - runSensitivityRun(values, experimentParameters); - } - } - p.getDistribution().initialize(); + // Generate values for parameters (randomly) + RandomGenerator randomGenerator = new RandomGenerator(seed, parametersSize); + + // Determine the changed paramters and their values for each individual run + for (int i = 0; i < numberOfRuns; ++i) { + ArrayList randoms = randomGenerator.next();// multi-dimensional random + HashMap parameterMap = new HashMap(parametersSize); + for (int j = 0; j < parametersSize; ++j) { + SensitivityExperimentParameter p = parameters.get(j); + // Get the random value + double value = p.getDistribution().inverseCDF(randoms.get(j)); + // Add the new parameter-value-pair + parameterMap.put(p.getFullName(), Double.toString(value)); + } + // Add the complete list of one individual run parameter-value-pairs. + parameterMaps.add(parameterMap); + } + + // Set the parameters for each individual experiment and run them. + for (HashMap parameterSet : parameterMaps) { + values.putAll(parameterSet); + runSensitivityRun(values, experimentParameters); + } } private void runSensitivityRun(HashMap values, HashMap experimentParameters) { @@ -97,7 +122,8 @@ public class SysdynSensitivityAnalysisExperiment extends SysdynExperiment { ModelicaManager.printProcessOutput(process, monitor); File resFile = new File(experimentParameters.get(ModelicaManager.RESULT_FILE_NAME)); - Thread resultThread = getResultThread(resFile, experimentParameters, monitor, progressMonitor, currentRun % refreshRate == 0); + boolean updateMonitors = currentRun % refreshRate == 0 || currentRun == numberOfRuns - 1; + Thread resultThread = getResultThread(resFile, experimentParameters, monitor, progressMonitor, updateMonitors); resultThread.run(); process = null; @@ -111,7 +137,6 @@ public class SysdynSensitivityAnalysisExperiment extends SysdynExperiment { private IModelicaMonitor monitor; private IProgressMonitor progressMonitor; // private HashMap experimentParameters; - private int numberOfRuns = 0; private int currentRun = 0; private int refreshRate = 1; private List parameters = new ArrayList(); @@ -293,21 +318,7 @@ public class SysdynSensitivityAnalysisExperiment extends SysdynExperiment { @Override public Integer perform(ReadGraph graph) throws DatabaseException { SysdynResource SR = SysdynResource.getInstance(graph); - - Resource parameterListResource = graph.getPossibleObject(experiment, SR.SensitivityAnalysisExperiment_parameterList); - List parameterResources = ListUtils.toList(graph, parameterListResource); - - Integer numberOfIterations = null; - - for(Resource parameter : parameterResources) { - Integer n = graph.getPossibleRelatedValue(parameter, SR.SensitivityAnalysisExperiment_Parameter_numberOfValues, Bindings.INTEGER); - if(n != null) { - if(numberOfIterations == null) - numberOfIterations = n; - else - numberOfIterations = numberOfIterations * n; - } - } + Integer numberOfIterations = graph.getPossibleRelatedValue(experiment, SR.SensitivityAnalysisExperiment_numberOfValues, Bindings.INTEGER); return numberOfIterations; } -- 2.47.1