Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
oms3.dsl.cosu.Fast Maven / Gradle / Ivy
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package oms3.dsl.cosu;
import oms3.dsl.*;
import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import oms3.Notification.*;
import ngmf.util.OutputStragegy;
import ngmf.util.cosu.luca.ParameterData;
import oms3.ComponentAccess;
import oms3.Conversions;
import oms3.annotations.Execute;
import oms3.annotations.Finalize;
import oms3.annotations.Initialize;
/**
*
* @author od
*/
public class Fast extends AbstractSimulation {
int samples = 2000;
int terms = 4;
Params params = new Params();
Date sens_start;
Date sens_end;
List ofs = new ArrayList();
@Override
public Buildable create(Object name, Object value) {
if (name.equals("parameter")) {
return params;
} else if (name.equals("objfunc")) {
ObjFunc of = new ObjFunc();
ofs.add(of);
return of;
} else if (name.equals("samples")) {
samples = (Integer) value;
// if (samples<2000) {
// throw new IllegalArgumentException("samples<2000");
// }
} else if (name.equals("terms")) {
terms = (Integer) value;
if (terms != 4 && terms != 6) {
throw new IllegalArgumentException("terms 4 or 6 !");
}
} else if (name.equals("sens_start")) {
sens_start = Conversions.convert(value, Date.class);
} else if (name.equals("sens_end")) {
sens_end = Conversions.convert(value, Date.class);
} else {
return super.create(name, value);
}
return LEAF;
}
@Override
public Object run() throws Exception {
OutputStragegy st = getOutput().getOutputStrategy(getName());
File lastFolder = st.nextOutputFolder();
if (log.isLoggable(Level.CONFIG)) {
log.config("Simulation output folder: " + lastFolder);
}
lastFolder.mkdirs();
Logger.getLogger("oms3.model").setLevel(Level.WARNING);
ObjFunc.adjustWeights(ofs);
run(getModel(), getOut(), lastFolder, getName());
// setting the input data;
return null;
}
/// FAST
void run(Model model, List out, File folder, String name) throws Exception {
List pList = params.getParam();
int npar = params.getCount(); // number of parameters
int N = samples; // number of samples
double M = terms; // number of terms in the partial variances summation (4 or 6)
double wi = Math.floor(N / (2 * M));
double m2 = Math.floor(wi / (2 * M));
double r = Math.floor((m2) / npar);
double[] w = new double[npar];
if (r < 1) {
for (int i = 0; i < npar; i++) {
w[i] = 1;
}
} else {
double t = Math.floor(m2 / npar);
w[0] = 1;
for (int i = 1; i < npar; i++) {
w[i] = 1 + i * t;
}
}
int k1 = 0;
double[][] w2 = new double[npar][w.length];
for (int i = 0; i < npar; i++) {
for (int j = 0; j < w.length; j++) {
w2[i][j] = (j == k1) ? wi : w[j];
}
k1++;
}
double inc = 2 * Math.PI / N;
double[] s = new double[N];
s[0] = -Math.PI;
for (int i = 1; i < s.length; i++) {
s[i] = s[i - 1] + inc;
}
double[][] x = new double[N][npar];
double[] y = new double[N];
double[] V = new double[npar];
double[] VT = new double[npar];
double[] Ak = new double[(int) Math.floor((N - 1) / 2)];
double[] Bk = new double[(int) Math.floor((N - 1) / 2)];
double[] S_par = new double[npar];
double[] Vex = new double[npar];
double[] Sex_par = new double[npar];
for (int h = 0; h < npar; h++) {
// Compute realizations
for (int j = 0; j < N; j++) {
for (int i = 0; i < npar; i++) {
double p = 0.5 + Math.asin(Math.sin(w2[h][i] * s[j])) / Math.PI;
Param par = pList.get(i);
x[j][i] = p * (par.getUpper() - par.getLower()) + par.getLower();
}
y[j] = run_model(model, out, folder, name, x[j]);
System.out.println("par:" + h + " N:" + j + " of:" + y[j]);
}
// Compute total variance
V[h] = 0;
for (int k = 1; k <= ((N - 1) / 2); k++) {
double A = 0, B = 0;
for (int j = 0; j < N; j++) {
A += y[j] * Math.cos(s[j] * k);
B += y[j] * Math.sin(s[j] * k);
}
double ak = A * 2 / N;
double bk = B * 2 / N;
Ak[k - 1] = ak;
Bk[k - 1] = bk;
V[h] += ak * ak + bk * bk;
}
VT[h] = V[h] / 2;
//Compute partial variance
V[h] = 0;
for (int q = 1; q <= M; q++) {
int idx = (int) (q * w2[h][h]) - 1;
V[h] += Ak[idx] * Ak[idx] + Bk[idx] * Bk[idx];
}
V[h] /= 2;
S_par[h] = V[h] / VT[h];
//Compute Extended partial variance
Vex[h] = 0;
for (int q = 1; q <= M; q++) {
for (int c = 0; c < npar; c++) {
if (c != h) {
int idx = (int) (q * w2[h][c]) - 1;
Vex[h] += Ak[idx] * Ak[idx] + Bk[idx] * Bk[idx];
}
}
}
Vex[h] /= 2;
Sex_par[h] = 1 - Vex[h] / VT[h];
}
System.out.println();
StringBuilder b = new StringBuilder("Sensitivity");
//print out S values
for (int i = 0; i < pList.size(); i++) {
b.append(String.format(Locale.US, "%15s ", pList.get(i).getName()));
}
b.append("\n S ");
for (int i = 0; i < S_par.length; i++) {
b.append(String.format(Locale.US, "%-8.7f ", S_par[i]));
}
b.append("\n ST ");
for (int i = 0; i < Sex_par.length; i++) {
b.append(String.format(Locale.US, "%-8.7f ", Sex_par[i]));
}
b.append('\n');
System.out.println(b.toString());
}
private double run_model(Model model, List out, File folder, String simName, double[] x) throws Exception {
Map parameter = model.getParameter();
Object comp = model.getComponent();
// spatial params
ParameterData[] pd = Step.create(params, parameter);
for (int i = 0; i < pd.length; i++) {
pd[i].generateValues(x[i]);
}
for (int i = 0; i < pd.length; i++) {
String name = pd[i].getName();
double[] val = pd[i].getDataValue();
parameter.put(name, toValue(name, val, parameter));
}
ComponentAccess.callAnnotated(comp, Initialize.class, true);
// setting the input data;
boolean success = ComponentAccess.setInputData(parameter, comp, log);
if (!success) {
throw new RuntimeException("There are Parameter problems. Simulation exits.");
}
ComponentAccess.adjustOutputPath(folder, comp, log);
for (Output e : out) {
e.setup(comp, folder, simName);
}
// execute phases and be done.
log.config("Exec ...");
ComponentAccess.callAnnotated(comp, Execute.class, false);
log.config("Finalize ...");
ComponentAccess.callAnnotated(comp, Finalize.class, true);
for (Output e : out) {
e.done();
}
return ObjFunc.calculateObjectiveFunctionValue(ofs, sens_start, sens_end, folder);
}
private Object toValue(String name, double[] vals, Map parameter) {
Object orig = parameter.get(name);
if (orig.toString().indexOf('{') > -1) {
// this is an array (hopefully 1dim)
return Conversions.convert(vals, String.class);
} else {
return Double.toString(vals[0]);
}
}
}