Skip to content

Commit

Permalink
minor changes, removed unused imports and comments, doc
Browse files Browse the repository at this point in the history
  • Loading branch information
Broseten committed May 24, 2017
1 parent 1a1cb13 commit 275d41e
Show file tree
Hide file tree
Showing 7 changed files with 40 additions and 168 deletions.
18 changes: 9 additions & 9 deletions experiments/SIR/outbreak5.formula.xml
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<formula xmlns="http://www.sybila.org/parasim/stl-formula">
<future>
<interval>
<lower type="closed">1.0</lower>
<upper type="closed">5.0</upper>
</interval>
<predicate>
<variable multiplier="1.0">I</variable>
<greater/>
<value>5.0</value>
</predicate>
<interval>
<lower type="closed">1.0</lower>
<upper type="closed">5.0</upper>
</interval>
<predicate>
<variable multiplier="1.0">I</variable>
<greater/>
<value>5.0</value>
</predicate>
</future>
</formula>
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,13 @@
*/
package org.sybila.parasim.computation.simulation;

import dk.ange.octave.OctaveEngine;
import dk.ange.octave.OctaveEngineFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.sybila.parasim.computation.lifecycle.api.annotations.ComputationInstanceScope;
import org.sybila.parasim.computation.simulation.api.AdaptiveStepSimulator;
import org.sybila.parasim.computation.simulation.cpu.SimpleAdaptiveStepSimulator;
import org.sybila.parasim.computation.simulation.octave.LsodeEngineFactory;
import org.sybila.parasim.computation.simulation.octave.OctaveSimulationEngineFactory;
import org.sybila.parasim.computation.simulation.simulationcore.SimCoreSimulationEngineFactory;
import org.sybila.parasim.core.annotation.Provide;
import org.sybila.parasim.core.api.configuration.ExtensionDescriptor;
import org.sybila.parasim.core.api.configuration.ExtensionDescriptorMapper;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,18 @@
*/
public interface SimulationEngine {

/**
* Closes SimulationEngine. This method is called after the simulation of the whole space is performed.
* Enables to close external software e.g. GNU Octave
*/
void close();

/**
* Performs simulation of a differential equation system from given point in time to timelimit
* @param point where to start simulation, contains start time
* Performs simulation of a differential equation system from given point.
* @param point initial point where to start simulation, contains start time and values of state variables and parameters
* @param odeSystem differential equation system
* @param timeLimit end time of simulation
* @param configuration relative error, absolute error and time step configuration
* @param configuration contains relative error, absolute error and time step configuration
* @return computed trajectory
*/
Trajectory simulate(Point point, OdeSystem odeSystem, double timeLimit, PrecisionConfiguration configuration);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,17 @@ public interface SimulationEngineFactory<E extends SimulationEngine>{

boolean isAvailable();

/**
* To get simulation engine for the thread which this method is called from.
* New SimulationeEngine instance is constructed, if none exists according to THREAD_SIMULATION_ENGINE_MAP.
* @param stepLimit max number of simulation steps of the simulation engine
* @return SimulationEngine
*/
E simulationEngine(long stepLimit);

/**
* Hash map that allows closing of all SimulationEngine instances after the simulation of the whole space finishes
*/
ConcurrentHashMap<Thread,SimulationEngine> THREAD_SIMULATION_ENGINE_MAP = new ConcurrentHashMap<>();

}
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,8 @@
import dk.ange.octave.OctaveEngineFactory;
import dk.ange.octave.type.OctaveDouble;
import java.util.Arrays;
import java.util.function.Function;

import org.sybila.parasim.computation.simulation.api.PrecisionConfiguration;
import org.sybila.parasim.computation.simulation.cpu.SimulationEngine;
import org.sybila.parasim.computation.simulation.cpu.SimulationEngineFactory;
import org.sybila.parasim.model.ode.OctaveOdeSystem;
import org.sybila.parasim.model.trajectory.Point;
Expand All @@ -47,15 +45,15 @@ public LsodeEngineFactory(IntegrationMethod integrationMethod) {
public boolean isAvailable() {
try {
new OctaveEngineFactory().getScriptEngine();
// octave.close(); //closing octave after opening? but this method seems to work not
// octave.close(); //should close octave after opening? -- luckily this method is not called anywhere (old one)
return true;
} catch (Exception ignored) {
return false;
}
}

@Override
public OctaveSimulationEngine simulationEngine(long stepLimit) {//TODO correct retyping?
public OctaveSimulationEngine simulationEngine(long stepLimit) {
return (OctaveSimulationEngine) SimulationEngineFactory.THREAD_SIMULATION_ENGINE_MAP.computeIfAbsent(Thread.currentThread(), thread ->
new LsodeEngine(new OctaveEngineFactory().getScriptEngine(), integrationMethod, stepLimit));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,10 @@
import dk.ange.octave.type.OctaveDouble;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;

import org.apache.commons.lang3.Validate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.sybila.parasim.computation.simulation.api.PrecisionConfiguration;
import org.sybila.parasim.computation.simulation.cpu.SimpleAdaptiveStepSimulator;
import org.sybila.parasim.computation.simulation.cpu.SimulationEngine;
import org.sybila.parasim.model.math.Parameter;
import org.sybila.parasim.model.math.ParameterValue;
Expand All @@ -40,8 +37,6 @@
import org.sybila.parasim.model.trajectory.Point;
import org.sybila.parasim.model.trajectory.Trajectory;

import javax.management.ServiceNotFoundException;

/**
* @author <a href="mailto:xpapous1@fi.muni.cz">Jan Papousek</a>
*/
Expand All @@ -63,45 +58,27 @@ public OctaveSimulationEngine(OctaveEngine octave, long stepLimit) {
/**
* caching simulation time (can save time if the last simulation lasts the same time as the previous)
*/
float[] l_times;
private float[] l_times;
/**
* start time of last simulation
*/
float l_startTime;
private float l_startTime;
/**
* end of last simulation
*/
double l_endTime;
private double l_endTime;
/**
* time step of last simulation
*/
float timeStep;
private float timeStep;

@Override
public void close() {
getOctave().close();
}

private static AtomicLong totalSettingTime;
private static AtomicLong totalSimulationTime;
private static AtomicLong totalParsingTime;

private static AtomicLong numOfSimulations;

static {
totalSettingTime = new AtomicLong();
totalSettingTime.set(0);
totalSimulationTime = new AtomicLong();
totalSimulationTime.set(0);
totalParsingTime = new AtomicLong();
totalParsingTime.set(0);
numOfSimulations = new AtomicLong();
numOfSimulations.set(0);
}

@Override
public Trajectory simulate(Point point, OdeSystem odeSystem, double timeLimit, PrecisionConfiguration precision) {
long settingStartTime = System.nanoTime();
// load parameter values
List<ParameterValue> paramValues = loadParameterValues(point, odeSystem);
// create substituted octave ode system
Expand All @@ -111,24 +88,13 @@ public Trajectory simulate(Point point, OdeSystem odeSystem, double timeLimit, P
if (numOfIterations > getStepLimit()) {
throw new IllegalStateException("Can't simulate the trajectory because the number of iterations <" + numOfIterations + "> is higher than the given limit <" + getStepLimit() + ">.");
}
long settingTime = System.nanoTime() - settingStartTime;

long simulationStartTime = System.nanoTime();
double[] loadedData = rawSimulation(point, octaveOdeSystem, numOfIterations, precision).getData();
long simulationTime = System.nanoTime() - simulationStartTime;


long parsingStartTime = System.nanoTime();
float[] data = new float[loadedData.length];
for (int dim = 0; dim < octaveOdeSystem.dimension(); dim++) {
for (int i = 0; i < loadedData.length / octaveOdeSystem.dimension(); i++) {
data[dim + i * octaveOdeSystem.dimension()] = (float) loadedData[dim * (loadedData.length / octaveOdeSystem.dimension()) + i];
}
}
long parsingTime = System.nanoTime() - parsingStartTime;

long timeStartTime = System.nanoTime();

//if simulation time changed, rewrite cached time array
if(l_startTime != point.getTime() || l_endTime != timeLimit || timeStep != precision.getTimeStep()){
l_startTime = point.getTime();
Expand All @@ -141,23 +107,6 @@ public Trajectory simulate(Point point, OdeSystem odeSystem, double timeLimit, P
l_times[i] = time;
}
}

long timeTime = System.nanoTime() - timeStartTime;

totalSettingTime.addAndGet(settingTime);
totalSimulationTime.addAndGet(simulationTime);
totalParsingTime.addAndGet(parsingTime + timeTime);
numOfSimulations.addAndGet(1);

System.out.println("AVERAGE TIME");
System.out.printf("Setting time: %.9f ms\n", (totalSettingTime.get()/numOfSimulations.get()) / 1000000000.0);
System.out.printf("Simulation time: %.9f ms\n", (totalSimulationTime.get()/numOfSimulations.get()) / 1000000000.0);
// System.out.printf("Time time: %.9f ms\n", timeTime / 1000000000.0);
System.out.printf("Parsing time: %.9f ms\n", (totalParsingTime.get()/numOfSimulations.get()) / 1000000000.0);
System.out.println("Number of simulated trajectories: " + numOfSimulations.get());



if (paramValues.isEmpty()) {
return new ArrayTrajectory(data, l_times, point.getDimension());
} else {
Expand Down
Loading

0 comments on commit 275d41e

Please sign in to comment.