public static PrepData PrepSimulation(Excel.Application app, Excel.Workbook wbh, ProgBar pb, bool ignore_parse_errors)
{
// build graph
var dag = new DAG(wbh, app, ignore_parse_errors);
if (dag.containsLoop())
{
throw new DataDebugMethods.ContainsLoopException();
}
pb.IncrementProgress();
// get terminal input and terminal formula nodes once
var terminal_input_nodes = dag.terminalInputVectors();
var terminal_formula_nodes = dag.terminalFormulaNodes(true); ///the boolean indicates whether to use all outputs or not
if (terminal_input_nodes.Length == 0)
{
throw new NoRangeInputs();
}
if (terminal_formula_nodes.Length == 0)
{
throw new NoFormulas();
}
// save original spreadsheet state
CellDict original_inputs = UserSimulation.Utility.SaveInputs(dag);
// force a recalculation before saving outputs, otherwise we may
// erroneously conclude that the procedure did the wrong thing
// based solely on Excel floating-point oddities
UserSimulation.Utility.InjectValues(app, wbh, original_inputs);
// save function outputs
CellDict correct_outputs = UserSimulation.Utility.SaveOutputs(terminal_formula_nodes, dag);
return new PrepData()
{
dag = dag,
original_inputs = original_inputs,
correct_outputs = correct_outputs,
terminal_input_nodes = terminal_input_nodes,
terminal_formula_nodes = terminal_formula_nodes
};
}