use of cbit.vcell.math.RowColumnResultSet in project vcell by virtualcell.
the class Generate2DOptContext method compute0.
@Override
protected void compute0(TaskContext context, final ClientTaskStatusSupport clientTaskStatusSupport) throws ExpressionException {
// get inputs
RowColumnResultSet normExpDataset = context.getData(normExpData);
RowColumnResultSet measurementErrorDataset = context.getData(normalizedMeasurementErrors);
OptModel optmodel = context.getData(optModel);
// do op
Generate2DOptContextOp op = new Generate2DOptContextOp();
ErrorFunction errorFunction = context.getData(this.errorFunction);
OptContext optcontext = op.generate2DOptContext(optmodel, normExpDataset, measurementErrorDataset, errorFunction);
// set output
context.setData(optContext, optcontext);
}
use of cbit.vcell.math.RowColumnResultSet in project vcell by virtualcell.
the class GenerateReducedData method compute0.
@Override
protected void compute0(TaskContext context, final ClientTaskStatusSupport clientTaskStatusSupport) throws Exception {
// get input
ROI[] rois = context.getData(imageDataROIs);
ImageTimeSeries<? extends Image> simData = (ImageTimeSeries<? extends Image>) context.getData(imageTimeSeries);
// do op
GenerateReducedDataOp op = new GenerateReducedDataOp();
RowColumnResultSet reducedData = op.generateReducedData(simData, rois);
// set output
context.setData(reducedROIData, reducedData);
}
use of cbit.vcell.math.RowColumnResultSet in project vcell by virtualcell.
the class ComputeMeasurementErrorOp method computeNormalizedMeasurementError.
public RowColumnResultSet computeNormalizedMeasurementError(NormalizedSampleFunction[] rois, int indexPostbleach, ImageTimeSeries<UShortImage> rawImageDataset, FloatImage prebleachAvgImage, final ClientTaskStatusSupport clientTaskStatusSupport) throws ImageException {
UShortImage[] rawImages = rawImageDataset.getAllImages();
double[] timeStamps = rawImageDataset.getImageTimeStamps();
double[][] sigma = refreshNormalizedMeasurementError(rawImages, timeStamps, prebleachAvgImage, rois, indexPostbleach);
String[] columnNames = new String[rois.length + 1];
columnNames[0] = "t";
for (int i = 0; i < rois.length; i++) {
columnNames[i + 1] = rois[i].getName();
}
RowColumnResultSet rowColumnResultSet = new RowColumnResultSet(columnNames);
double[] allTimePoints = timeStamps;
for (int time = 0; time < (allTimePoints.length - indexPostbleach); time++) {
double[] rowValues = new double[rois.length + 1];
rowValues[0] = allTimePoints[time + indexPostbleach];
for (int col = 0; col < rois.length; col++) {
rowValues[col + 1] = sigma[col][time];
}
rowColumnResultSet.addRow(rowValues);
}
return rowColumnResultSet;
}
use of cbit.vcell.math.RowColumnResultSet in project vcell by virtualcell.
the class ModelOptimizationMapping method getRemappedReferenceData.
/**
* Gets the constraintData property (cbit.vcell.opt.ConstraintData) value.
* @return The constraintData property value.
* @see #setConstraintData
*/
private ReferenceData getRemappedReferenceData(MathMapping mathMapping) throws MappingException {
if (modelOptimizationSpec.getReferenceData() == null) {
return null;
}
//
// make sure time is mapped
//
ReferenceData refData = modelOptimizationSpec.getReferenceData();
ReferenceDataMappingSpec[] refDataMappingSpecs = modelOptimizationSpec.getReferenceDataMappingSpecs();
RowColumnResultSet rowColResultSet = new RowColumnResultSet();
Vector<SymbolTableEntry> modelObjectList = new Vector<SymbolTableEntry>();
Vector<double[]> dataList = new Vector<double[]>();
//
// find bound columns, (time is always mapped to the first column)
//
int mappedColumnCount = 0;
for (int i = 0; i < refDataMappingSpecs.length; i++) {
SymbolTableEntry modelObject = refDataMappingSpecs[i].getModelObject();
if (modelObject != null) {
int mappedColumnIndex = mappedColumnCount;
if (modelObject instanceof Model.ReservedSymbol && ((ReservedSymbol) modelObject).isTime()) {
mappedColumnIndex = 0;
}
String origRefDataColumnName = refDataMappingSpecs[i].getReferenceDataColumnName();
int origRefDataColumnIndex = refData.findColumn(origRefDataColumnName);
if (origRefDataColumnIndex < 0) {
throw new RuntimeException("reference data column named '" + origRefDataColumnName + "' not found");
}
double[] columnData = refData.getDataByColumn(origRefDataColumnIndex);
if (modelObjectList.contains(modelObject)) {
throw new RuntimeException("multiple reference data columns mapped to same model object '" + modelObject.getName() + "'");
}
modelObjectList.insertElementAt(modelObject, mappedColumnIndex);
dataList.insertElementAt(columnData, mappedColumnIndex);
mappedColumnCount++;
}
}
//
if (modelObjectList.size() == 0) {
throw new RuntimeException("reference data was not associated with model");
}
if (modelObjectList.size() == 1) {
throw new RuntimeException("reference data was not associated with model, must map time and at least one other column");
}
boolean bFoundTimeVar = false;
for (SymbolTableEntry ste : modelObjectList) {
if (ste instanceof Model.ReservedSymbol && ((ReservedSymbol) ste).isTime()) {
bFoundTimeVar = true;
break;
}
}
if (!bFoundTimeVar) {
throw new RuntimeException("must map time column of reference data to model");
}
//
for (int i = 0; i < modelObjectList.size(); i++) {
SymbolTableEntry modelObject = (SymbolTableEntry) modelObjectList.elementAt(i);
try {
// Find by name because MathSybolMapping has different 'objects' than refDataMapping 'objects'
Variable variable = mathMapping.getMathSymbolMapping().findVariableByName(modelObject.getName());
if (variable != null) {
String symbol = variable.getName();
rowColResultSet.addDataColumn(new ODESolverResultSetColumnDescription(symbol));
} else if (modelObject instanceof Model.ReservedSymbol && ((Model.ReservedSymbol) modelObject).isTime()) {
Model.ReservedSymbol time = (Model.ReservedSymbol) modelObject;
String symbol = time.getName();
rowColResultSet.addDataColumn(new ODESolverResultSetColumnDescription(symbol));
}
} catch (MathException | MatrixException | ExpressionException | ModelException e) {
e.printStackTrace();
throw new MappingException(e.getMessage(), e);
}
}
//
// populate data columns (time and rest)
//
double[] weights = new double[rowColResultSet.getColumnDescriptionsCount()];
weights[0] = 1.0;
int numRows = ((double[]) dataList.elementAt(0)).length;
int numColumns = modelObjectList.size();
for (int j = 0; j < numRows; j++) {
double[] row = new double[numColumns];
for (int i = 0; i < numColumns; i++) {
row[i] = ((double[]) dataList.elementAt(i))[j];
if (i > 0) {
weights[i] += row[i] * row[i];
}
}
rowColResultSet.addRow(row);
}
for (int i = 0; i < numColumns; i++) {
if (weights[i] == 0) {
weights[i] = 1;
} else {
weights[i] = 1 / weights[i];
}
}
SimpleReferenceData remappedRefData = new SimpleReferenceData(rowColResultSet, weights);
return remappedRefData;
}
use of cbit.vcell.math.RowColumnResultSet in project vcell by virtualcell.
the class ParameterEstimationTaskSimulatorIDA method getOdeSolverResultSet.
private ODESolverResultSet getOdeSolverResultSet(ParameterEstimationTask parameterEstimationTask, OptimizationSpec optSpec, OptimizationResultSet optResultSet) throws Exception {
if (optResultSet == null) {
return null;
}
String[] parameterNames = optResultSet.getOptSolverResultSet().getParameterNames();
double[] bestEstimates = optResultSet.getOptSolverResultSet().getBestEstimates();
// if we don't have parameter names or best estimates, return null. if we have them, we can run a simulation and generate a solution
if (parameterNames == null || parameterNames.length == 0 || bestEstimates == null || bestEstimates.length == 0) {
return null;
}
// check if we have solution or not, if not, generate a solution since we have the best estimates
if (optResultSet.getSolutionNames() == null) {
RowColumnResultSet rcResultSet = getRowColumnRestultSetByBestEstimations(parameterEstimationTask, parameterNames, bestEstimates);
optResultSet.setSolutionFromRowColumnResultSet(rcResultSet);
}
String[] solutionNames = optResultSet.getSolutionNames();
if (solutionNames != null && solutionNames.length > 0) {
ODESolverResultSet odeSolverResultSet = new ODESolverResultSet();
// add data column descriptions
for (int i = 0; i < solutionNames.length; i++) {
odeSolverResultSet.addDataColumn(new ODESolverResultSetColumnDescription(solutionNames[i]));
}
//
// add row data
//
int numRows = optResultSet.getSolutionValues(0).length;
for (int i = 0; i < numRows; i++) {
odeSolverResultSet.addRow(optResultSet.getSolutionRow(i));
}
//
// make temporary simulation (with overrides for parameter values)
//
MathDescription mathDesc = parameterEstimationTask.getSimulationContext().getMathDescription();
Simulation simulation = new Simulation(mathDesc);
SimulationSymbolTable simSymbolTable = new SimulationSymbolTable(simulation, 0);
//
for (int i = 0; i < optSpec.getParameters().length; i++) {
cbit.vcell.opt.Parameter parameter = optSpec.getParameters()[i];
simulation.getMathOverrides().putConstant(new Constant(parameter.getName(), new Expression(parameter.getInitialGuess())));
}
//
for (int i = 0; i < parameterNames.length; i++) {
simulation.getMathOverrides().putConstant(new Constant(parameterNames[i], new Expression(optResultSet.getOptSolverResultSet().getBestEstimates()[i])));
}
//
// add functions (evaluating them at optimal parameter)
//
Vector<AnnotatedFunction> annotatedFunctions = simSymbolTable.createAnnotatedFunctionsList(mathDesc);
for (AnnotatedFunction f : annotatedFunctions) {
Expression funcExp = f.getExpression();
for (int j = 0; j < parameterNames.length; j++) {
funcExp.substituteInPlace(new Expression(parameterNames[j]), new Expression(optResultSet.getOptSolverResultSet().getBestEstimates()[j]));
}
odeSolverResultSet.addFunctionColumn(new FunctionColumnDescription(funcExp, f.getName(), null, f.getName(), false));
}
return odeSolverResultSet;
} else {
return null;
}
}
Aggregations