From b0c0bd41ee3efe53a3fc9b325bd11885644afc15 Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Tue, 14 Jun 2016 21:51:04 -0300 Subject: [PATCH 01/87] Removed deprecated code from PipelineManager --- .../PipelineManager.cpp | 766 +++++------------- 1 file changed, 197 insertions(+), 569 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 3f652e4..80d6704 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -52,47 +52,6 @@ void mapprint(map mapp) { cout << i->first << ":" << i->second->getName() << endl; } -void listprint(list listt) { - for (list::iterator i=listt.begin(); i!=listt.end(); i++) - cout << (*i)->getName() << endl; -} - -void listprint(list listt) { - for (list::iterator i=listt.begin(); i!=listt.end(); i++) - cout << (*i) << endl; -} - -// BUG??? g++4.9 bad??? -// -list::iterator beg(list l) {return l.begin();} -list::iterator endd(list l) {return l.end();} -list::iterator inc(list::iterator &i) {return i++;} -// -// for (map::iterator it = base_stages.begin(); it != base_stages.end(); ++it) { -// cout << "stage: " << it->second->getName() << endl; -// for (list::iterator i = it->second->getOutputs().begin(); i != (it->second->getOutputs().end()); ++i) { -// list l = it->second->getOutputs(); -// // works -// listprint(l); -// // also works -// listprint(it->second->getOutputs()); -// // this works too -// for (list::iterator i=l.begin(); i!=l.end(); i++) -// cout << (*i) << endl; -// // not this -// for (list::iterator i=it->second->getOutputs().begin(); i!=it->second->getOutputs().end(); i++) -// cout << (*i) << endl; -// // nor this -// for (list::iterator i=beg(it->second->getOutputs()); i!=endd(it->second->getOutputs()); inc(i)) -// cout << (*i) << endl; -// // this also works -// for (int i:it->second->getOutputs()) -// cout << i << endl; -// } -// } - - - // Workflow parsing functions void get_inputs_from_file(FILE* workflow_descriptor, map &workflow_inputs, map> ¶meters_values); @@ -102,16 +61,9 @@ void get_stages_from_file(FILE* workflow_descriptor, map &base_stages, map &interstage_arguments, map &input_arguments, map> &deps); -list> expand_parameters_combinations(map> parameters_values, - map workflow_inputs); -void expand_arguments(map &ref_arguments, int copies, - list> ©_arguments); -void expand_stages(map &base_stages, int copies, - list> &all_stages); -void iterative_full_merging(list> &all_inputs, list> &all_outputs, - list> &all_stages, list> &all_interstage_arguments, - map &interstage_arguments_ref, map &merged_arguments, - map &merged_outputs, map &merged_stages); +void expand_stages(const map &args, map> args_values, + map &expanded_args,map stages, + map &expanded_stages); void add_arguments_to_stages(map &merged_stages, map &merged_arguments, map> &deps, RegionTemplateCollection *rts); @@ -126,17 +78,6 @@ PipelineComponentBase* find_stage(map stages, strin ArgumentBase* find_argument(map arguments, string name); ArgumentBase* new_typed_arg_base(string type); parsing::port_type_t get_port_type(string s); -map cpy_ab_map(map &ref); -template -T map_pop(map &m); -int find_id_by_name(string name, map &ref); - - -void expand_stages(const map &args, - map> args_values, - map &expanded_args, - map stages, - map &expanded_stages); int main(int argc, char* argv[]) { @@ -159,23 +100,23 @@ int main(int argc, char* argv[]) { map> parameters_values; get_inputs_from_file(workflow_descriptor, workflow_inputs, parameters_values); - cout << "workflow_inputs:" << endl; - for (pair p : workflow_inputs) - cout << p.first << ":" << p.second->getName() << endl; + // cout << "workflow_inputs:" << endl; + // for (pair p : workflow_inputs) + // cout << p.first << ":" << p.second->getName() << endl; - cout << endl << "parameters_values:" << endl; - for (pair> p : parameters_values) { - cout << "argument " << p.first << ":" << workflow_inputs[p.first]->getName() << ":" << endl; - for (ArgumentBase* a : p.second) - cout << "\t" << a->toString() << endl; - } + // cout << endl << "parameters_values:" << endl; + // for (pair> p : parameters_values) { + // cout << "argument " << p.first << ":" << workflow_inputs[p.first]->getName() << ":" << endl; + // for (ArgumentBase* a : p.second) + // cout << "\t" << a->toString() << endl; + // } // get all workflow outputs map workflow_outputs; get_outputs_from_file(workflow_descriptor, workflow_outputs); - cout << endl << "workflow_outputs " << endl; - for (pair p : workflow_outputs) - cout << p.first << ":" << p.second->getName() << endl; + // cout << endl << "workflow_outputs " << endl; + // for (pair p : workflow_outputs) + // cout << p.first << ":" << p.second->getName() << endl; // get all stages, also setting the uid from this context to Task (i.e Task::setId()) // also returns the list of arguments used @@ -183,16 +124,16 @@ int main(int argc, char* argv[]) { map base_stages; map interstage_arguments; get_stages_from_file(workflow_descriptor, base_stages, interstage_arguments); - cout << endl << "base_stages:" << endl; - for (pair p : base_stages) { - cout << p.first << ":" << p.second->getName() << ", outputs: " << p.second->getOutputs().size() << endl << endl; - for (int i : p.second->getOutputs()) - cout << "\t" << i << ":" << interstage_arguments[i]->getName() << endl; - } + // cout << endl << "base_stages:" << endl; + // for (pair p : base_stages) { + // cout << p.first << ":" << p.second->getName() << ", outputs: " << p.second->getOutputs().size() << endl << endl; + // for (int i : p.second->getOutputs()) + // cout << "\t" << i << ":" << interstage_arguments[i]->getName() << endl; + // } - cout << endl << "interstage_arguments:" << endl; - for (pair p : interstage_arguments) - cout << p.first << ":" << p.second->getName() << endl; + // cout << endl << "interstage_arguments:" << endl; + // for (pair p : interstage_arguments) + // cout << p.first << ":" << p.second->getName() << endl; // this map is a dependency structure: stage -> dependency_list map> deps; @@ -203,159 +144,29 @@ int main(int argc, char* argv[]) { for (pair a : interstage_arguments) all_argument[a.first] = a.second; - cout << endl << "all_arguments:" << endl; - mapprint(all_argument); - - cout << endl << "deps:" << endl; - for (pair> p : deps) - for (int d : p.second) - cout << "\t" << base_stages[p.first]->getName() << " depends on " << base_stages[d]->getName() << endl; - -// buggy buggggy -/*for (map::iterator it = base_stages.begin(); it != base_stages.end(); ++it) { - cout << "stage: " << it->second->getName() << endl; - for (list::iterator i = it->second->getOutputs().begin(); i != (it->second->getOutputs().end()); ++i) { - list l = it->second->getOutputs(); - // works - listprint(l); - // also works - listprint(it->second->getOutputs()); - // this works too - for (list::iterator i=l.begin(); i!=l.end(); i++) - cout << (*i) << endl; - // not this - for (list::iterator i=it->second->getOutputs().begin(); i!=it->second->getOutputs().end(); i++) - cout << (*i) << endl; - // nor this - for (list::iterator i=beg(it->second->getOutputs()); i!=endd(it->second->getOutputs()); inc(i)) - cout << (*i) << endl; - // this also works - for (int i:it->second->getOutputs()) - cout << i << endl; - } -}*/ - - - cout << endl << "connected base_stages:" << endl; - for (pair p : base_stages) { - cout << p.first << ":" << p.second->getName() << endl; - cout << "\tinputs: " << p.second->getInputs().size() << endl << endl; - for (int i : p.second->getInputs()) - cout << "\t\t" << i << ":" << all_argument[i]->getName() << endl; - cout << "\toutputs: " << p.second->getOutputs().size() << endl << endl; - for (int i : p.second->getOutputs()) - cout << "\t\t" << i << ":" << all_argument[i]->getName() << endl; - } - - //------------------------------------------------------------ - // Add create all combinarions of parameters - //------------------------------------------------------------ - - // expand parameter combinations returning a list of parameters sets each set contains - // exactly one value for every input parameter. the agrument objects are ready to be used - // on the workflow execution. - list> expanded_parameters; - expanded_parameters = expand_parameters_combinations(parameters_values, workflow_inputs); - int i = 0; - for (map parameter_set : expanded_parameters) { - cout << "Parameter set " << i++ << endl; - for (pair p : parameter_set) { - cout << "\t" << p.first << ":" << p.second->getName() << " = " << p.second->toString() << endl; - } - cout << endl; - } - - // replicate outputs - list> all_outputs; - expand_arguments(workflow_outputs, expanded_parameters.size(), all_outputs); - i = 0; - for (map parameter_set : all_outputs) { - cout << "Output set " << i++ << endl; - for (pair p : parameter_set) { - cout << "\t" << p.first << ":" << p.second->getName() << endl; - } - cout << endl; - } - - // replicate interstage arguments - list> all_interstage_arguments; - expand_arguments(interstage_arguments, expanded_parameters.size(), all_interstage_arguments); - i = 0; - for (map parameter_set : all_interstage_arguments) { - cout << "Interstage arguments set " << i++ << endl; - for (pair p : parameter_set) { - cout << "\t" << p.first << ":" << p.second->getName() << endl; - } - cout << endl; - } - - // replicate stages - list> all_stages; - expand_stages(base_stages, expanded_parameters.size(), all_stages); - i = 0; - for (map stage_set : all_stages) { - cout << "Stage set " << i++ << endl; - for (pair p : stage_set) { - cout << "\t" << p.first << ":" << p.second->getName() << " with inputs:" << endl; - for (int inp : p.second->getInputs()) { - cout << "\t\t" << inp << ":" << all_argument[inp]->getName() << endl; - } - cout << "\tand outputs: " << endl; - for (int out : p.second->getOutputs()) { - cout << "\t\t" << out << ":" << all_argument[out]->getName() << endl; - } - } - cout << endl; - } + // cout << endl << "all_arguments:" << endl; + // mapprint(all_argument); + + // cout << endl << "deps:" << endl; + // for (pair> p : deps) + // for (int d : p.second) + // cout << "\t" << base_stages[p.first]->getName() << " depends on " << base_stages[d]->getName() << endl; + + // cout << endl << "connected base_stages:" << endl; + // for (pair p : base_stages) { + // cout << p.first << ":" << p.second->getName() << endl; + // cout << "\tinputs: " << p.second->getInputs().size() << endl << endl; + // for (int i : p.second->getInputs()) + // cout << "\t\t" << i << ":" << all_argument[i]->getName() << endl; + // cout << "\toutputs: " << p.second->getOutputs().size() << endl << endl; + // for (int i : p.second->getOutputs()) + // cout << "\t\t" << i << ":" << all_argument[i]->getName() << endl; + // } //------------------------------------------------------------ // Iterative merging of stages //------------------------------------------------------------ - // maybe try to merge the inputs, and then merge stages iteratively - // again, updating the uids (Task and local id) - map merged_arguments; - map merged_outputs; - map merged_stages; - iterative_full_merging(expanded_parameters, all_outputs, all_stages, all_interstage_arguments, - interstage_arguments, merged_arguments, merged_outputs, merged_stages); - - cout << endl << "merged stages" << endl; - for (pair p : merged_stages) { - cout << "\t" << p.first << ":" << p.second->getName() << " with inputs:" << endl; - for (int inp : p.second->getInputs()) { - cout << "\t\t" << inp << ":" << merged_arguments[inp]->getName() << endl; - } - cout << "\tand outputs: " << endl; - for (int out : p.second->getOutputs()) { - cout << "\t\t" << out << ":" << merged_arguments[out]->getName() << endl; - } - } - cout << endl; - - //------------------------------------------------------------ - // Add workflows to Manager to be executed - //------------------------------------------------------------ - - string inputFolderPath = "~/Desktop/images15"; - RegionTemplateCollection* rts; - // rts = RTFromFiles(inputFolderPath); - - // add arguments to each stage - add_arguments_to_stages(merged_stages, merged_arguments, deps, rts); - - // add all stages to manager - // for (pair s : merged_stages) - // sysEnv.executeComponent(s.second); - - // execute workflows - // sysEnv.startupExecution(); - - // get results - // for each ArgumentBase output of merged_outputs do - // cout << sysEnv.getComponentResultData(output.getId()) << endl; - // end - map args; for (pair p : workflow_inputs) args[p.first] = p.second; @@ -382,6 +193,30 @@ int main(int argc, char* argv[]) { for (pair p : expanded_args) cout << "\t" << p.first << ":" << p.second->getName() << " = " << p.second->toString() << endl; + //------------------------------------------------------------ + // Add workflows to Manager to be executed + //------------------------------------------------------------ + + // string inputFolderPath = "~/Desktop/images15"; + // RegionTemplateCollection* rts; + // rts = RTFromFiles(inputFolderPath); + + // add arguments to each stage + // add_arguments_to_stages(merged_stages, merged_arguments, deps, rts); + + // add all stages to manager + // for (pair s : merged_stages) + // sysEnv.executeComponent(s.second); + + // execute workflows + // sysEnv.startupExecution(); + + // get results + // for each ArgumentBase output of merged_outputs do + // cout << sysEnv.getComponentResultData(output.getId()) << endl; + // end + + } /***************************************************************/ @@ -749,186 +584,162 @@ void connect_stages_from_file(FILE* workflow_descriptor, } /***************************************************************/ -/**************** Argument expansion functions *****************/ +/********* Workflow merging and preparation functions **********/ /***************************************************************/ -// returns by value the list of expanded parameters sets. each parameter set -// an be sent to the workflow to be executed. a parameter set is a map of aguments with -// a possible value for that argument (parameter). -list> expand_parameters_combinations(map> parameters_values, - map workflow_inputs) { - - list> output; - - list values_head = map_pop(parameters_values); - ArgumentBase* input_head = map_pop(workflow_inputs); - - // halting condition - if (parameters_values.size() == 0) { - // cout << "halting on " << input_head->getName() << endl; - for (ArgumentBase* a : values_head) { - map inputs; - ArgumentBase* input = a->clone(); - input->setName(input_head->getName()); - input->setId(new_uid()); - inputs[input->getId()] = input; - output.emplace_back(inputs); - } - - return output; +bool all_inps_in(list inps, map> ref) { + for (int i : inps) { + if (ref.find(i) == ref.end()) + return false; } - - // cout << "recurring on " << endl; - // mapprint(parameters_values); + return true; +} + +// map args: all args, i.e inputs and interstate arguments. +// map> args_values: the list of values for each argument. +// this map will be changed inside and must start with all inputs +// map expanded_args: output of function. map with all args to be used on execution. +// map stages: map of all stages with arguments mapped to args +// map expanded_stages: output of function. Returns all stages +// ready for execution. +void expand_stages(const map &args, + map> args_values, + map &expanded_args, + map stages, + map &expanded_stages) { + + // cout << endl << "args:" << endl; + // mapprint(args); // cout << endl; - list> next = expand_parameters_combinations(parameters_values, workflow_inputs); - for (ArgumentBase* a : values_head) { - // list> next_copy = copt(next); - ArgumentBase* input_copy = a->clone(); - input_copy->setName(input_head->getName()); - input_copy->setId(new_uid()); - - for (map p : next) { - map updated_arguments = cpy_ab_map(p); - updated_arguments[input_copy->getId()] = input_copy; - output.emplace_back(updated_arguments); + + // cout << endl << "arg_values:" << endl; + for (pair> p : args_values) { + // cout << "base argument " << p.first << ":" << args.at(p.first)->getName() << endl; + for (ArgumentBase* a : p.second) { + a->setId(new_uid()); + a->setName(args.at(p.first)->getName()); + // cout << "\t" << a->getId() << ":" << a->getName() << " = " << a->toString() << endl; } - } - return output; -} + // cout << endl << "stages:" << endl; + // mapprint(stages); + // cout << endl; -// returns by reference a list of copied outputs. -void expand_arguments(map &ref_arguments, int copies, - list> ©_arguments) { + // keep expanding stages until there is no stage left + while (stages.size() != 0) { + // cout << "stages size: " << stages.size() << endl; + for (pair p : stages) { + // attempt to find a stage witch has all inputs expanded + if (all_inps_in(p.second->getInputs(), args_values)) { + // cout << "stage " << p.second->getName() << " has all inputs" << endl; + // create temporary list of stages to be expanded + list stages_iterative; + // starts the stages temp list with the current stage without the valued arguments + stages_iterative.emplace_back(p.second); - for (int i=0; i cpy = cpy_ab_map(ref_arguments); - copy_arguments.emplace_back(cpy); - } -} + // cout << "expanding stage " << p.second->getName() << " with inputs:" << endl; + // for (int inp_id : p.second->getInputs()) + // cout << "\t" << args.at(inp_id)->getName() << endl; -void expand_stages(map &base_stages, int copies, - list> &all_stages) { + // expands all inputs from stage p + for (int inp_id : p.second->getInputs()) { + // cout << "expanding input " << args.at(inp_id)->getName() << " with values:" << endl; + // for (ArgumentBase* a : args_values[inp_id]) + // cout << "\t" << a->toString() << endl; + // expands the values of each inptut in p->getInputs() + list stages_iterative_temp; + for (ArgumentBase* a : args_values[inp_id]) { + // cout << "expanding value " << a->toString() << endl; + // cout << "stages_iterative: " << endl; + // for (PipelineComponentBase* pp : stages_iterative) + // cout << "\t" << pp->getId() << ":" << pp->getName() << endl; + // generate a copy of the current stage for each input-value pair + for (PipelineComponentBase* pt : stages_iterative) { + // cout << "updating stage " << pt->getId() << ":" << pt->getName() << endl; + // clone pt basic infoinfoinfo + PipelineComponentBase* pt_cpy = pt->clone(); + + // set name and id + pt_cpy->setName(pt->getName()); + pt_cpy->setId(new_uid()); - for (int i=0; i cpy; - for (pair pcb : base_stages) { - // clone basic info - PipelineComponentBase* pcb_cpy = pcb.second->clone(); - - // set name and id - pcb_cpy->setName(pcb.second->getName()); - pcb_cpy->setId(new_uid()); + // copy input list + for (int inp : pt->getInputs()) + pt_cpy->addInput(inp); - // copy input list - for (int inp : pcb.second->getInputs()) - pcb_cpy->addInput(inp); + // replace stock input with current + pt_cpy->replaceInput(inp_id, a->getId()); - // copy output list - for (int out : pcb.second->getOutputs()) - pcb_cpy->addOutput(out); + // cout << "all outputs from stage " << pt->getName() << endl; + // for (int out : pt->getOutputs()) + // cout << "\t" << out << endl; - cpy[pcb_cpy->getId()] = pcb_cpy; - } + // add copy to stages_iterative_temp + stages_iterative_temp.emplace_back(pt_cpy); - all_stages.emplace_back(cpy); - } -} + // cout << endl << "expanded_stages after" << endl; + // mapprint(expanded_stages); + // cout << endl; + // cout << endl << "expanded_args after" << endl; + // mapprint(expanded_args); + // cout << endl; + } + } + // replace stages_iterative with expanded version + // TODO: fix leaking + stages_iterative = stages_iterative_temp; + } -/***************************************************************/ -/********* Workflow merging and preparation functions **********/ -/***************************************************************/ + // generate all output copies from the current stage + for (int out_id : p.second->getOutputs()) { + list temp; + for (PipelineComponentBase* pt : stages_iterative) { + int new_id = new_uid(); + ArgumentBase* ab_cpy = args.at(out_id)->clone(); + ab_cpy->setName(args.at(out_id)->getName()); + ab_cpy->setId(new_id); + pt->replaceOutput(out_id, new_id); + temp.emplace_back(ab_cpy); + } + args_values[out_id] = temp; + } -void iterative_full_merging(list> &all_inputs, - list> &all_outputs, - list> &all_stages, - list> &all_interstage_arguments, - map &interstage_arguments_ref, - map &merged_arguments, - map &merged_outputs, - map &merged_stages) { + // add all stages + for (PipelineComponentBase* pt : stages_iterative) + expanded_stages[pt->getId()] = pt; - list>::iterator inputs_it = all_inputs.begin(); - list>::iterator outputs_it = all_outputs.begin(); - list>::iterator interstage_arguments_it = all_interstage_arguments.begin(); + // remove the stage from 'stages' since it was fully expanded + stages.erase(p.first); - RegionTemplate* rt; + // cout << endl << "arg_values:" << endl; + // for (pair> p : args_values) { + // cout << "base argument " << p.first << ":" << args.at(p.first)->getName() << endl; + // for (ArgumentBase* a : p.second) { + // cout << "\t" << a->getId() << ":" << a->getName() << " = " << a->toString() << endl; + // } + // } - // assign the right arguments, inputs and outputs to each stage - int i=0; - for (map stages : all_stages) { - // cout << "starting stage " << i << endl; - int io_offset = inputs_it->begin()->first - 1; - int input_lim = inputs_it->size(); - int output_lim = inputs_it->size() + outputs_it->size(); - - rt = NULL; - - // cout << "io_offset " << io_offset << endl; - // cout << "input_lim " << input_lim << endl; - // cout << "output_lim " << output_lim << endl; - - // update all arguments ids - for (pair stage : stages) { - // cout << "\tstage " << stage.first << ":" << stage.second->getName() << endl; - // replace all inputs and outputs ids - for (int inp : stage.second->getInputs()) { - if (inp <= input_lim) { - // cout << "\t\treg_input" << endl; - stage.second->replaceInput(inp, inp+io_offset); - // cout << "\t\tinput " << inp << " swaped with " << inp+io_offset << endl; - } else { - // cout << "\t\targ_input" << endl; - int new_inp = find_id_by_name(interstage_arguments_ref[inp]->getName(), - *interstage_arguments_it); - stage.second->replaceInput(inp, new_inp); - // cout << "\t\tisa_input " << inp << new_inp << endl; - } - } - for (int out : stage.second->getOutputs()) { - if (out <= output_lim) { - stage.second->replaceOutput(out, out+io_offset); - } else { - int new_inp = find_id_by_name(interstage_arguments_ref[out]->getName(), - *interstage_arguments_it); - stage.second->replaceOutput(out, new_inp); - } - } + // cout << endl << "stages:" << endl; + // mapprint(stages); + // cout << endl; + + // break loop of 'stages' since its content has changed + break; + } + // else + // cout << "stage " << p.second->getName() << " have unmet dependencies " << endl; } - inputs_it++; - outputs_it++; - interstage_arguments_it++; } - // merge inputs - - - // merge all inputs, outputs and interstage arguments into one - for (map m : all_inputs) - for (pair p : m) - merged_arguments[p.first] = p.second; - for (map m : all_outputs) { - for (pair p : m) { - merged_arguments[p.first] = p.second; - merged_outputs[p.first] = p.second; + // flatten the arg values into expanded_args + for (pair> p : args_values) { + // cout << "base argument " << p.first << ":" << args.at(p.first)->getName() << endl; + for (ArgumentBase* a : p.second) { + // cout << "\t" << a->getId() << ":" << a->getName() << " = " << a->toString() << endl; + expanded_args[a->getId()] = a; } } - for (map m : all_interstage_arguments) - for (pair p : m) - merged_arguments[p.first] = p.second; - - // merged_arguments - - // bool changes = true; - // while (changes) { - // changes = false; - - // // - // } - - merged_stages = all_stages.front(); } void add_arguments_to_stages(map &merged_stages, @@ -1140,186 +951,3 @@ parsing::port_type_t get_port_type(string s) { return parsing::error; } } - -map cpy_ab_map(map &ref) { - map cpy; - for (pair p : ref) { - ArgumentBase* ab_cpy = p.second->clone(); - ab_cpy->setName(p.second->getName()); - ab_cpy->setId(new_uid()); - cpy[ab_cpy->getId()] = ab_cpy; - } - return cpy; -} - -template -T map_pop(map &m) { - typename map::iterator i = m.begin(); - T val = i->second; - m.erase(i); - return val; -} - -int find_id_by_name(string name, map &ref) { - for (pair p : ref) { - if (name.compare(p.second->getName()) == 0) - return p.first; - } - return 0; -} - - -bool all_inps_in(list inps, map> ref) { - for (int i : inps) { - if (ref.find(i) == ref.end()) - return false; - } - return true; -} - -// map args: all args, i.e inputs and interstate arguments. -// map> args_values: the list of values for each argument. -// this map will be changed inside and must start with all inputs -// map expanded_args: output of function. map with all args to be used on execution. -// map stages: map of all stages with arguments mapped to args -// map expanded_stages: output of function. Returns all stages -// ready for execution. -void expand_stages(const map &args, - map> args_values, - map &expanded_args, - map stages, - map &expanded_stages) { - - // cout << endl << "args:" << endl; - // mapprint(args); - // cout << endl; - - // cout << endl << "arg_values:" << endl; - for (pair> p : args_values) { - // cout << "base argument " << p.first << ":" << args.at(p.first)->getName() << endl; - for (ArgumentBase* a : p.second) { - a->setId(new_uid()); - a->setName(args.at(p.first)->getName()); - // cout << "\t" << a->getId() << ":" << a->getName() << " = " << a->toString() << endl; - } - } - - // cout << endl << "stages:" << endl; - // mapprint(stages); - // cout << endl; - - // keep expanding stages until there is no stage left - while (stages.size() != 0) { - // cout << "stages size: " << stages.size() << endl; - for (pair p : stages) { - // attempt to find a stage witch has all inputs expanded - if (all_inps_in(p.second->getInputs(), args_values)) { - // cout << "stage " << p.second->getName() << " has all inputs" << endl; - // create temporary list of stages to be expanded - list stages_iterative; - // starts the stages temp list with the current stage without the valued arguments - stages_iterative.emplace_back(p.second); - - // cout << "expanding stage " << p.second->getName() << " with inputs:" << endl; - // for (int inp_id : p.second->getInputs()) - // cout << "\t" << args.at(inp_id)->getName() << endl; - - // expands all inputs from stage p - for (int inp_id : p.second->getInputs()) { - // cout << "expanding input " << args.at(inp_id)->getName() << " with values:" << endl; - // for (ArgumentBase* a : args_values[inp_id]) - // cout << "\t" << a->toString() << endl; - // expands the values of each inptut in p->getInputs() - list stages_iterative_temp; - for (ArgumentBase* a : args_values[inp_id]) { - // cout << "expanding value " << a->toString() << endl; - // cout << "stages_iterative: " << endl; - // for (PipelineComponentBase* pp : stages_iterative) - // cout << "\t" << pp->getId() << ":" << pp->getName() << endl; - // generate a copy of the current stage for each input-value pair - for (PipelineComponentBase* pt : stages_iterative) { - // cout << "updating stage " << pt->getId() << ":" << pt->getName() << endl; - // clone pt basic infoinfoinfo - PipelineComponentBase* pt_cpy = pt->clone(); - - // set name and id - pt_cpy->setName(pt->getName()); - pt_cpy->setId(new_uid()); - - // copy input list - for (int inp : pt->getInputs()) - pt_cpy->addInput(inp); - - // replace stock input with current - pt_cpy->replaceInput(inp_id, a->getId()); - - // cout << "all outputs from stage " << pt->getName() << endl; - // for (int out : pt->getOutputs()) - // cout << "\t" << out << endl; - - // add copy to stages_iterative_temp - stages_iterative_temp.emplace_back(pt_cpy); - - // cout << endl << "expanded_stages after" << endl; - // mapprint(expanded_stages); - // cout << endl; - // cout << endl << "expanded_args after" << endl; - // mapprint(expanded_args); - // cout << endl; - } - } - // replace stages_iterative with expanded version - // TODO: fix leaking - stages_iterative = stages_iterative_temp; - } - - // generate all output copies from the current stage - for (int out_id : p.second->getOutputs()) { - list temp; - for (PipelineComponentBase* pt : stages_iterative) { - int new_id = new_uid(); - ArgumentBase* ab_cpy = args.at(out_id)->clone(); - ab_cpy->setName(args.at(out_id)->getName()); - ab_cpy->setId(new_id); - pt->replaceOutput(out_id, new_id); - temp.emplace_back(ab_cpy); - } - args_values[out_id] = temp; - } - - // add all stages - for (PipelineComponentBase* pt : stages_iterative) - expanded_stages[pt->getId()] = pt; - - // remove the stage from 'stages' since it was fully expanded - stages.erase(p.first); - - // cout << endl << "arg_values:" << endl; - // for (pair> p : args_values) { - // cout << "base argument " << p.first << ":" << args.at(p.first)->getName() << endl; - // for (ArgumentBase* a : p.second) { - // cout << "\t" << a->getId() << ":" << a->getName() << " = " << a->toString() << endl; - // } - // } - - // cout << endl << "stages:" << endl; - // mapprint(stages); - // cout << endl; - - // break loop of 'stages' since its content has changed - break; - } - else - // cout << "stage " << p.second->getName() << " have unmet dependencies " << endl; - } - } - - // flatten the arg values into expanded_args - for (pair> p : args_values) { - // cout << "base argument " << p.first << ":" << args.at(p.first)->getName() << endl; - for (ArgumentBase* a : p.second) { - // cout << "\t" << a->getId() << ":" << a->getName() << " = " << a->toString() << endl; - expanded_args[a->getId()] = a; - } - } -} \ No newline at end of file From 91da898876435baa440fbd8f8e8cd4c7f62754c7 Mon Sep 17 00:00:00 2001 From: willian Date: Sat, 18 Jun 2016 19:00:12 -0300 Subject: [PATCH 02/87] Bug fixes 1. Added the name field from arguments to the serialize/deserialize functions since they are needed on the generated stages files. 2. Added the new argument type ArgumentRT to PipelineComponentBase. 3. Re-generated NormalizationComp and Segmentation stages code. The arguments names weren't matching the ones in the workflow descriptor. To do that the stages descriptors were updated with the correct names. 4. The RegionTemplate reference containing all data regions is now inserted on each stage that has at least one data region. --- runtime/Argument.cpp | 72 ++++++++++++-- runtime/Argument.h | 18 ++-- runtime/PipelineComponentBase.cpp | 3 + .../NormalizationComp.cpp | 60 +++++------ .../NormalizationComp.hpp | 14 +-- .../PipelineManager.cpp | 94 +++++++++++++----- .../PipelineRTFS-NS-Diff-FGO/Segmentation.cpp | 46 ++++----- .../PipelineRTFS-NS-Diff-FGO/Segmentation.hpp | 10 +- .../examples/PipelineRTFS-NS-Diff-FGO/gen/gen | Bin 432770 -> 432826 bytes .../gen/normalization_desc | 10 +- .../gen/segmentation_desc | 6 +- 11 files changed, 220 insertions(+), 113 deletions(-) diff --git a/runtime/Argument.cpp b/runtime/Argument.cpp index 5f4488e..5992d8c 100644 --- a/runtime/Argument.cpp +++ b/runtime/Argument.cpp @@ -13,20 +13,61 @@ ArgumentBase::ArgumentBase(int type) { } int ArgumentBase::size() -{ - return (sizeof(int)); +{ + // starts with the size of the type + int arg_size = sizeof(int); + + // used to store the size of the name stored + arg_size+=sizeof(int); + + // the actual size of the name + arg_size+=sizeof(char) * this->name.size(); + + return arg_size; } int ArgumentBase::serialize(char *buff) { + // add type value + int serialized_bytes = sizeof(int); ((int*)buff)[0] = this->getType(); - return ArgumentBase::size(); + + // pack the size of the name + int string_size = this->name.size(); + memcpy(buff+serialized_bytes, &string_size, sizeof(int)); + serialized_bytes+=sizeof(int); + + // serialize the name itself + memcpy(buff+serialized_bytes, this->name.c_str(), this->name.size()*sizeof(char)); + serialized_bytes+=this->name.size()*sizeof(char); + + return serialized_bytes; } int ArgumentBase::deserialize(char *buff) { + // get type this->setType(((int*)buff)[0]); - return ArgumentBase::size(); + int deserialized_bytes = sizeof(int); + + // get Size of the name + int string_size; + memcpy(&string_size, buff+deserialized_bytes, sizeof(int)); + deserialized_bytes+= sizeof(int); + + // create string to extract data from memory buffer + char string_value[string_size+1]; + string_value[string_size] = '\0'; + + // copy name string from message buffer to local variable holding string terminator + memcpy(string_value, buff+deserialized_bytes, sizeof(char)*string_size); + deserialized_bytes+=sizeof(char)*string_size; + + // init argument value from string extracted + this->setName(string_value); + + // return total number of bytes extracted from message + return deserialized_bytes; } void ArgumentBase::setType(int type) @@ -386,21 +427,19 @@ std::string ArgumentFloatArray::toString() { return out; } -ArgumentRT::ArgumentRT() : path(""), ArgumentBase(ArgumentBase::RT){} +ArgumentRT::ArgumentRT() : name(""), isFileInput(false), ArgumentBase(ArgumentBase::RT){} -ArgumentRT::ArgumentRT(std::string path) : ArgumentBase(ArgumentBase::RT) { - this->setArgValue(path); -} +ArgumentRT::ArgumentRT(std::string name) : name(name), isFileInput(false), ArgumentBase(ArgumentBase::RT){} ArgumentRT::~ArgumentRT() {} std::string ArgumentRT::getArgValue() const { - return path; + return name; } -void ArgumentRT::setArgValue(std::string path) { - this->path = path; +void ArgumentRT::setArgValue(std::string name) { + this->name = name; } int ArgumentRT::serialize(char *buff) { @@ -418,6 +457,10 @@ int ArgumentRT::serialize(char *buff) { memcpy(buff+serialized_bytes, this->getArgValue().c_str(), this->getArgValue().size()*sizeof(char)); serialized_bytes+=this->getArgValue().size()*sizeof(char); + // pack the isFileInput var + memcpy(buff+serialized_bytes, &isFileInput, sizeof(bool)); + serialized_bytes+=sizeof(bool); + return serialized_bytes; } @@ -431,6 +474,9 @@ int ArgumentRT::size() { // the actual size of the string arg_size+=sizeof(char) * this->getArgValue().size(); + // the size of the bool + arg_size+=sizeof(bool); + return arg_size; } @@ -462,6 +508,10 @@ int ArgumentRT::deserialize(char *buff) { memcpy(string_value, buff+deserialized_bytes, sizeof(char)*string_size); deserialized_bytes+=sizeof(char)*string_size; + // get the isFileInput variable + memcpy(&isFileInput, buff+deserialized_bytes, sizeof(bool)); + deserialized_bytes+=sizeof(bool); + // init argument value from string extracted this->setArgValue(string_value); diff --git a/runtime/Argument.h b/runtime/Argument.h index 42dcfc7..f9f773f 100644 --- a/runtime/Argument.h +++ b/runtime/Argument.h @@ -13,13 +13,14 @@ #include #include #include - + class ArgumentBase { protected: int type; std::string name; - // this field is used only on workflow generation + // this fields are used only on workflow generation + int parent; int id; public: @@ -42,6 +43,9 @@ class ArgumentBase { int getId() {return id;}; void setId(int id) {this->id = id;}; + int getParent() {return parent;}; + void setParent(int parent) {this->parent = parent;}; + virtual std::string toString() = 0; static const int INPUT = 0; @@ -135,22 +139,24 @@ class ArgumentFloatArray: public ArgumentBase{ class ArgumentRT: public ArgumentBase{ private: - std::string path; + std::string name; public: ArgumentRT(); - ArgumentRT(std::string path); + ArgumentRT(std::string name); virtual ~ArgumentRT(); virtual ArgumentBase* clone(); - std::string toString() {return path;}; + std::string toString() {return name;}; + + bool isFileInput; int size(); int serialize(char *buff); int deserialize(char *buff); std::string getArgValue() const; - void setArgValue(std::string path); + void setArgValue(std::string name); }; diff --git a/runtime/PipelineComponentBase.cpp b/runtime/PipelineComponentBase.cpp index 56d98dd..b1d5f27 100644 --- a/runtime/PipelineComponentBase.cpp +++ b/runtime/PipelineComponentBase.cpp @@ -252,6 +252,9 @@ int PipelineComponentBase::deserialize(char *buff) case ArgumentBase::FLOAT_ARRAY: arg = new ArgumentFloatArray(); break; + case ArgumentBase::RT: + arg = new ArgumentRT(); + break; default: std::cout << "Argument type not known: " << arg_type << std::endl; exit(1); diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/NormalizationComp.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/NormalizationComp.cpp index a63b325..ea9146f 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/NormalizationComp.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/NormalizationComp.cpp @@ -26,30 +26,30 @@ int NormalizationComp::run() { std::cout << "Executing component: " << this->getComponentName() << " instance id: " << this->getId() <getRegionTemplateInstance("tile"); - std::string inputImage_name; - std::string normalizedImg_name; - float* targetMean; - float* targetStd; + std::string input_img_name; + std::string normalized_rt_name; + float* target_mean; + float* target_std; int set_cout = 0; for(int i=0; igetArgumentsSize(); i++){ - if (this->getArgument(i)->getName().compare("inputImage") == 0) { - inputImage_name = (std::string)((ArgumentString*)this->getArgument(i))->getArgValue(); + if (this->getArgument(i)->getName().compare("input_img") == 0) { + input_img_name = (std::string)((ArgumentString*)this->getArgument(i))->getArgValue(); set_cout++; } - if (this->getArgument(i)->getName().compare("normalizedImg") == 0) { - normalizedImg_name = (std::string)((ArgumentString*)this->getArgument(i))->getArgValue(); + if (this->getArgument(i)->getName().compare("normalized_rt") == 0) { + normalized_rt_name = (std::string)((ArgumentString*)this->getArgument(i))->getArgValue(); set_cout++; } - if (this->getArgument(i)->getName().compare("targetMean") == 0) { - targetMean = (float*)((ArgumentFloatArray*)this->getArgument(i))->getArgValue(); + if (this->getArgument(i)->getName().compare("target_mean") == 0) { + target_mean = (float*)((ArgumentFloatArray*)this->getArgument(i))->getArgValue(); set_cout++; } - if (this->getArgument(i)->getName().compare("targetStd") == 0) { - targetStd = (float*)((ArgumentFloatArray*)this->getArgument(i))->getArgValue(); + if (this->getArgument(i)->getName().compare("target_std") == 0) { + target_std = (float*)((ArgumentFloatArray*)this->getArgument(i))->getArgValue(); set_cout++; } @@ -58,28 +58,28 @@ int NormalizationComp::run() { if (set_cout < this->getArgumentsSize()) std::cout << __FILE__ << ":" << __LINE__ <<" Missing common arguments on NormalizationComp" << std::endl; - this->addInputOutputDataRegion("tile", inputImage_name, RTPipelineComponentBase::INPUT); + this->addInputOutputDataRegion("tile", input_img_name, RTPipelineComponentBase::INPUT); - this->addInputOutputDataRegion("tile", normalizedImg_name, RTPipelineComponentBase::OUTPUT); + this->addInputOutputDataRegion("tile", normalized_rt_name, RTPipelineComponentBase::OUTPUT); if(inputRt != NULL){ - DenseDataRegion2D *inputImage = NULL; + DenseDataRegion2D *input_img = NULL; - DenseDataRegion2D *normalizedImg = NULL; + DenseDataRegion2D *normalized_rt = NULL; try{ - inputImage = dynamic_cast(inputRt->getDataRegion(inputImage_name, "", 0, dr_id)); + input_img = dynamic_cast(inputRt->getDataRegion(input_img_name, "", 0, workflow_id)); - normalizedImg = dynamic_cast(inputRt->getDataRegion(normalizedImg_name, "", 0, dr_id)); + normalized_rt = dynamic_cast(inputRt->getDataRegion(normalized_rt_name, "", 0, workflow_id)); - std::cout << "NormalizationComp. paramenterId: "<< dr_id <executeTask(task); @@ -104,34 +104,34 @@ bool registeredNormalizationComp = PipelineComponentBase::ComponentFactory::comp /*********************************** Task functions ***********************************/ /**************************************************************************************/ -TaskNormalizationComp::TaskNormalizationComp(DenseDataRegion2D* inputImage_temp, DenseDataRegion2D* normalizedImg_temp, float* targetMean, float* targetStd) { +TaskNormalizationComp::TaskNormalizationComp(DenseDataRegion2D* input_img_temp, DenseDataRegion2D* normalized_rt_temp, float* target_mean, float* target_std) { - this->inputImage_temp = inputImage_temp; - this->normalizedImg_temp = normalizedImg_temp; - this->targetMean = targetMean; - this->targetStd = targetStd; + this->input_img_temp = input_img_temp; + this->normalized_rt_temp = normalized_rt_temp; + this->target_mean = target_mean; + this->target_std = target_std; } TaskNormalizationComp::~TaskNormalizationComp() { - if(inputImage_temp != NULL) delete inputImage_temp; + if(input_img_temp != NULL) delete input_img_temp; } bool TaskNormalizationComp::run(int procType, int tid) { - cv::Mat inputImage = this->inputImage_temp->getData(); + cv::Mat input_img = this->input_img_temp->getData(); - cv::Mat normalizedImg = this->normalizedImg_temp->getData(); + cv::Mat normalized_rt = this->normalized_rt_temp->getData(); uint64_t t1 = Util::ClockGetTimeProfile(); std::cout << "TaskNormalizationComp executing." << std::endl; - normalizedImg = ::nscale::Normalization::normalization(inputImage, targetMean, targetStd); + normalized_rt = ::nscale::Normalization::normalization(input_img, target_mean, target_std); - this->normalizedImg_temp->setData(normalizedImg); + this->normalized_rt_temp->setData(normalized_rt); uint64_t t2 = Util::ClockGetTimeProfile(); diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/NormalizationComp.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/NormalizationComp.hpp index 32a10e1..f1486f7 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/NormalizationComp.hpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/NormalizationComp.hpp @@ -24,13 +24,13 @@ class NormalizationComp : public RTPipelineComponentBase { private: // data region id // IMPORTANT: this need to be set during the creation of this object - int dr_id; + int workflow_id; public: NormalizationComp(); virtual ~NormalizationComp(); - void set_dr_id(int id) {dr_id = id;}; + void set_workflow_id(int id) {workflow_id = id;}; int run(); }; @@ -40,17 +40,17 @@ class TaskNormalizationComp: public Task { private: // data regions - DenseDataRegion2D* inputImage_temp; - DenseDataRegion2D* normalizedImg_temp; + DenseDataRegion2D* input_img_temp; + DenseDataRegion2D* normalized_rt_temp; // all other variables - float* targetMean; - float* targetStd; + float* target_mean; + float* target_std; public: - TaskNormalizationComp(DenseDataRegion2D* inputImage_temp, DenseDataRegion2D* normalizedImg_temp, float* targetMean, float* targetStd); + TaskNormalizationComp(DenseDataRegion2D* input_img_temp, DenseDataRegion2D* normalized_rt_temp, float* target_mean, float* target_std); virtual ~TaskNormalizationComp(); diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 80d6704..44220eb 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -64,8 +64,10 @@ void connect_stages_from_file(FILE* workflow_descriptor, map &args, map> args_values, map &expanded_args,map stages, map &expanded_stages); -void add_arguments_to_stages(map &merged_stages, map &merged_arguments, - map> &deps, RegionTemplateCollection *rts); +void generate_drs(RegionTemplate* rt, const map &expanded_args); +void add_arguments_to_stages(map &merged_stages, + map &merged_arguments, + RegionTemplate *rt); // Workflow parsing helper functions list line_buffer; @@ -85,9 +87,13 @@ int main(int argc, char* argv[]) { SysEnv sysEnv; // Tell the system which libraries should be used - // sysEnv.startupSystem(argc, argv, "libcomponentnsdifffgo.so"); + sysEnv.startupSystem(argc, argv, "libcomponentnsdifffgo.so"); + // region template used by all stages + RegionTemplate *rt = new RegionTemplate(); + rt->setName("tile"); + // workflow file FILE* workflow_descriptor = fopen("seg_example.t2flow", "r"); //------------------------------------------------------------ @@ -191,31 +197,37 @@ int main(int argc, char* argv[]) { cout << endl << "merged args" << endl; for (pair p : expanded_args) - cout << "\t" << p.first << ":" << p.second->getName() << " = " << p.second->toString() << endl; + cout << "\t" << p.first << ":" << p.second->getName() << " = " << p.second->toString() << " sized: " << p.second->size() << endl; //------------------------------------------------------------ // Add workflows to Manager to be executed //------------------------------------------------------------ - // string inputFolderPath = "~/Desktop/images15"; + string inputFolderPath = "~/Desktop/images15"; + cout << endl << "generate_drs" << endl; + generate_drs(rt, expanded_args); + // RegionTemplateCollection* rts; // rts = RTFromFiles(inputFolderPath); // add arguments to each stage - // add_arguments_to_stages(merged_stages, merged_arguments, deps, rts); + cout << endl << "add_arguments_to_stages" << endl; + add_arguments_to_stages(expanded_stages, expanded_args, rt); // add all stages to manager - // for (pair s : merged_stages) - // sysEnv.executeComponent(s.second); + cout << endl << "executeComponent" << endl; + for (pair s : expanded_stages) + sysEnv.executeComponent(s.second); // execute workflows - // sysEnv.startupExecution(); + cout << endl << "startupExecution" << endl; + sysEnv.startupExecution(); // get results // for each ArgumentBase output of merged_outputs do // cout << sysEnv.getComponentResultData(output.getId()) << endl; // end - + sysEnv.finalizeSystem(); } @@ -338,6 +350,7 @@ void get_inputs_from_file(FILE* workflow_descriptor, // get all possible values for the argument for (int i=0; iisFileInput = true; // cout << ((ArgumentString*)val)->toString() << endl; inp_values.emplace_back(val); } @@ -742,29 +755,64 @@ void expand_stages(const map &args, } } +void generate_drs(RegionTemplate* rt, + const map &expanded_args) { + + // verify every argument + for (pair p : expanded_args) { + // if an argument is a region template data region + if (p.second->getType() == ArgumentBase::RT) { + // create the data region and add it to the input region template + DenseDataRegion2D *ddr2d = new DenseDataRegion2D(); + ddr2d->setName(p.second->getName()); + std::ostringstream oss; + oss << p.first; + ddr2d->setId(oss.str()); + ddr2d->setVersion(p.first); + + // aditional setup if the argument is an input from file + if (((ArgumentRT*)p.second)->isFileInput) { + ddr2d->setInputType(DataSourceType::FILE_SYSTEM); + ddr2d->setIsAppInput(true); + ddr2d->setOutputType(DataSourceType::FILE_SYSTEM); + ddr2d->setInputFileName(p.second->toString()); + } + rt->insertDataRegion(ddr2d); + } + } +} + void add_arguments_to_stages(map &merged_stages, map &merged_arguments, - map> &deps, - RegionTemplateCollection *rts) { + RegionTemplate *rt) { int i=0; - RegionTemplate* rt; for (pair stage : merged_stages) { - // add arguments to stage, adding them as RT as needed + // add input arguments to stage, adding them as RT as needed for (int arg_id : stage.second->getInputs()) { stage.second->addArgument(merged_arguments[arg_id]); - if (merged_arguments[arg_id]->getType() == ArgumentBase::STRING) - cout << "RT : " << merged_arguments[arg_id]->getName() << endl; - // if (rt == NULL) - //------------------------------------------------------------------------------------------------------- if rt == NULL then make a new one - // stage.second->addRegionTemplateInstance(rts->getRT(i), rts->getRT(i++)->getName()); + if (merged_arguments[arg_id]->getType() == ArgumentBase::RT) { + cout << "input RT : " << merged_arguments[arg_id]->getName() << endl; + // insert the region template on the parent stage if the argument is a DR and if the RT wasn't already added + if (((RTPipelineComponentBase*)stage.second)->getRegionTemplateInstance(rt->getName()) == NULL) + ((RTPipelineComponentBase*)stage.second)->addRegionTemplateInstance(rt, rt->getName()); + ((RTPipelineComponentBase*)stage.second)->addInputOutputDataRegion(rt->getName() ,merged_arguments[arg_id]->getName(), RTPipelineComponentBase::INPUT); + } + ((RTPipelineComponentBase*)stage.second)->addDependency(merged_arguments[arg_id]->getParent()); } - // add dependencies - for (int d : deps[stage.second->getId()]) - ((RTPipelineComponentBase*)stage.second)->addDependency(d); + // add output arguments to stage, adding them as RT as needed + for (int arg_id : stage.second->getOutputs()) { + stage.second->addArgument(merged_arguments[arg_id]); + if (merged_arguments[arg_id]->getType() == ArgumentBase::RT) { + cout << "output RT : " << merged_arguments[arg_id]->getName() << endl; + // insert the region template on the parent stage if the argument is a DR and if the RT wasn't already added + if (((RTPipelineComponentBase*)stage.second)->getRegionTemplateInstance(rt->getName()) == NULL) + ((RTPipelineComponentBase*)stage.second)->addRegionTemplateInstance(rt, rt->getName()); + ((RTPipelineComponentBase*)stage.second)->addInputOutputDataRegion(rt->getName() ,merged_arguments[arg_id]->getName(), RTPipelineComponentBase::OUTPUT); + } + } } - } /***************************************************************/ diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp index 39cbefd..06a6039 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp @@ -26,8 +26,8 @@ int Segmentation::run() { std::cout << "Executing component: " << this->getComponentName() << " instance id: " << this->getId() <getRegionTemplateInstance("tile"); - std::string inputImage_name; - std::string outMask_name; + std::string normalized_rt_name; + std::string segmented_rt_name; unsigned char blue; unsigned char green; unsigned char red; @@ -46,13 +46,13 @@ int Segmentation::run() { int set_cout = 0; for(int i=0; igetArgumentsSize(); i++){ - if (this->getArgument(i)->getName().compare("inputImage") == 0) { - inputImage_name = (std::string)((ArgumentString*)this->getArgument(i))->getArgValue(); + if (this->getArgument(i)->getName().compare("normalized_rt") == 0) { + normalized_rt_name = (std::string)((ArgumentString*)this->getArgument(i))->getArgValue(); set_cout++; } - if (this->getArgument(i)->getName().compare("outMask") == 0) { - outMask_name = (std::string)((ArgumentString*)this->getArgument(i))->getArgValue(); + if (this->getArgument(i)->getName().compare("segmented_rt") == 0) { + segmented_rt_name = (std::string)((ArgumentString*)this->getArgument(i))->getArgValue(); set_cout++; } @@ -134,30 +134,30 @@ int Segmentation::run() { } if (set_cout < this->getArgumentsSize()) - std::cout << __FILE__ << ":" << __LINE__ <<" Missing common arguments on Segmentation. got " << set_cout << " out of " << this->getArgumentsSize() << std::endl; + std::cout << __FILE__ << ":" << __LINE__ <<" Missing common arguments on Segmentation" << std::endl; - this->addInputOutputDataRegion("tile", inputImage_name, RTPipelineComponentBase::INPUT); + this->addInputOutputDataRegion("tile", normalized_rt_name, RTPipelineComponentBase::INPUT); - this->addInputOutputDataRegion("tile", outMask_name, RTPipelineComponentBase::OUTPUT); + this->addInputOutputDataRegion("tile", segmented_rt_name, RTPipelineComponentBase::OUTPUT); if(inputRt != NULL){ - DenseDataRegion2D *inputImage = NULL; + DenseDataRegion2D *normalized_rt = NULL; - DenseDataRegion2D *outMask = NULL; + DenseDataRegion2D *segmented_rt = NULL; try{ - inputImage = dynamic_cast(inputRt->getDataRegion(inputImage_name, "", 0, dr_id)); + normalized_rt = dynamic_cast(inputRt->getDataRegion(normalized_rt_name, "", 0, workflow_id)); - outMask = dynamic_cast(inputRt->getDataRegion(outMask_name, "", 0, dr_id)); + segmented_rt = dynamic_cast(inputRt->getDataRegion(segmented_rt_name, "", 0, workflow_id)); - std::cout << "Segmentation. paramenterId: "<< dr_id <executeTask(task); @@ -182,10 +182,10 @@ bool registeredSegmentation = PipelineComponentBase::ComponentFactory::component /*********************************** Task functions ***********************************/ /**************************************************************************************/ -TaskSegmentation::TaskSegmentation(DenseDataRegion2D* inputImage_temp, DenseDataRegion2D* outMask_temp, unsigned char blue, unsigned char green, unsigned char red, double T1, double T2, unsigned char G1, int minSize, int maxSize, unsigned char G2, int minSizePl, int minSizeSeg, int maxSizeSeg, int fillHolesConnectivity, int reconConnectivity, int watershedConnectivity) { +TaskSegmentation::TaskSegmentation(DenseDataRegion2D* normalized_rt_temp, DenseDataRegion2D* segmented_rt_temp, unsigned char blue, unsigned char green, unsigned char red, double T1, double T2, unsigned char G1, int minSize, int maxSize, unsigned char G2, int minSizePl, int minSizeSeg, int maxSizeSeg, int fillHolesConnectivity, int reconConnectivity, int watershedConnectivity) { - this->inputImage_temp = inputImage_temp; - this->outMask_temp = outMask_temp; + this->normalized_rt_temp = normalized_rt_temp; + this->segmented_rt_temp = segmented_rt_temp; this->blue = blue; this->green = green; this->red = red; @@ -206,23 +206,23 @@ TaskSegmentation::TaskSegmentation(DenseDataRegion2D* inputImage_temp, DenseData } TaskSegmentation::~TaskSegmentation() { - if(inputImage_temp != NULL) delete inputImage_temp; + if(normalized_rt_temp != NULL) delete normalized_rt_temp; } bool TaskSegmentation::run(int procType, int tid) { - cv::Mat inputImage = this->inputImage_temp->getData(); + cv::Mat normalized_rt = this->normalized_rt_temp->getData(); - cv::Mat outMask = this->outMask_temp->getData(); + cv::Mat segmented_rt = this->segmented_rt_temp->getData(); uint64_t t1 = Util::ClockGetTimeProfile(); std::cout << "TaskSegmentation executing." << std::endl; - ::nscale::HistologicalEntities::segmentNuclei(inputImage, outMask, blue, green, red, T1, T2, G1, minSize, maxSize, G2, minSizePl, minSizeSeg, maxSizeSeg, fillHolesConnectivity, reconConnectivity, watershedConnectivity); + ::nscale::HistologicalEntities::segmentNuclei(normalized_rt, segmented_rt, blue, green, red, T1, T2, G1, minSize, maxSize, G2, minSizePl, minSizeSeg, maxSizeSeg, fillHolesConnectivity, reconConnectivity, watershedConnectivity); - this->outMask_temp->setData(outMask); + this->segmented_rt_temp->setData(segmented_rt); uint64_t t2 = Util::ClockGetTimeProfile(); diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp index 05d5201..e1cfcdb 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp @@ -24,13 +24,13 @@ class Segmentation : public RTPipelineComponentBase { private: // data region id // IMPORTANT: this need to be set during the creation of this object - int dr_id; + int workflow_id; public: Segmentation(); virtual ~Segmentation(); - void set_dr_id(int id) {dr_id = id;}; + void set_workflow_id(int id) {workflow_id = id;}; int run(); }; @@ -40,8 +40,8 @@ class TaskSegmentation: public Task { private: // data regions - DenseDataRegion2D* inputImage_temp; - DenseDataRegion2D* outMask_temp; + DenseDataRegion2D* normalized_rt_temp; + DenseDataRegion2D* segmented_rt_temp; // all other variables @@ -63,7 +63,7 @@ class TaskSegmentation: public Task { public: - TaskSegmentation(DenseDataRegion2D* inputImage_temp, DenseDataRegion2D* outMask_temp, unsigned char blue, unsigned char green, unsigned char red, double T1, double T2, unsigned char G1, int minSize, int maxSize, unsigned char G2, int minSizePl, int minSizeSeg, int maxSizeSeg, int fillHolesConnectivity, int reconConnectivity, int watershedConnectivity); + TaskSegmentation(DenseDataRegion2D* normalized_rt_temp, DenseDataRegion2D* segmented_rt_temp, unsigned char blue, unsigned char green, unsigned char red, double T1, double T2, unsigned char G1, int minSize, int maxSize, unsigned char G2, int minSizePl, int minSizeSeg, int maxSizeSeg, int fillHolesConnectivity, int reconConnectivity, int watershedConnectivity); virtual ~TaskSegmentation(); diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/gen b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/gen index f59210f74e97edf2cc49278a5bcbc0a12740d316..76892e4b15bd320229d9549bc351ed30403c9c26 100755 GIT binary patch literal 432826 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

tf*_L;aHkV*Bhuqcs#4REax0Y*Co_7!RiVd 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%0DJXqQQ`e_Y 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 literal 432770 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/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 T@Z}!lH|Hw2V*y4l*|PS(&|LGx diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/normalization_desc b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/normalization_desc index 24c02cf..4b80cad 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/normalization_desc +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/normalization_desc @@ -1,10 +1,10 @@ {"name":"NormalizationComp", "includes":"#include \"opencv2/opencv.hpp\"\n#include \"opencv2/gpu/gpu.hpp\"\n#include \"Normalization.h\"", -"call":"normalizedImg = ::nscale::Normalization::normalization(inputImage, targetMean, targetStd)", +"call":"normalized_rt = ::nscale::Normalization::normalization(input_img, target_mean, target_std)", "args":[ - {"name":"inputImage", "type":"dr", "io":"input"}, - {"name":"normalizedImg", "type":"dr", "io":"output"}, - {"name":"targetMean", "type":"float_array"}, - {"name":"targetStd", "type":"float_array"} + {"name":"input_img", "type":"dr", "io":"input"}, + {"name":"normalized_rt", "type":"dr", "io":"output"}, + {"name":"target_mean", "type":"float_array"}, + {"name":"target_std", "type":"float_array"} ] } \ No newline at end of file diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/segmentation_desc b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/segmentation_desc index 5babbee..b25c83b 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/segmentation_desc +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/segmentation_desc @@ -1,9 +1,9 @@ {"name":"Segmentation", "includes":"#include \"opencv2/opencv.hpp\"\n#include \"opencv2/gpu/gpu.hpp\"\n#include \"HistologicalEntities.h\"", -"call":"::nscale::HistologicalEntities::segmentNuclei(inputImage, outMask, blue, green, red, T1, T2, G1, minSize, maxSize, G2, minSizePl, minSizeSeg, maxSizeSeg, fillHolesConnectivity, reconConnectivity, watershedConnectivity)", +"call":"::nscale::HistologicalEntities::segmentNuclei(normalized_rt, segmented_rt, blue, green, red, T1, T2, G1, minSize, maxSize, G2, minSizePl, minSizeSeg, maxSizeSeg, fillHolesConnectivity, reconConnectivity, watershedConnectivity)", "args":[ - {"name":"inputImage", "type":"dr", "io":"input"}, - {"name":"outMask", "type":"dr", "io":"output"}, + {"name":"normalized_rt", "type":"dr", "io":"input"}, + {"name":"segmented_rt", "type":"dr", "io":"output"}, {"name":"blue", "type":"uchar"}, {"name":"green", "type":"uchar"}, {"name":"red", "type":"uchar"}, From 674a78741c9d7159156362fcb94f0a68fb7f8362 Mon Sep 17 00:00:00 2001 From: willian Date: Sat, 18 Jun 2016 19:45:08 -0300 Subject: [PATCH 03/87] Bug fix Updated field regex of workflow generator to accept file paths, full and partial ones. --- .../examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 44220eb..c1f4331 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -850,7 +850,7 @@ string get_workflow_field(FILE* workflow, string field) { size_t len = 0; // create field regex - regex r ("<" + field + ">[\"\\:\\w {},.\\[\\]-]+<\\/" + field + ">"); + regex r ("<" + field + ">[\"\\:\\w {},.~\\/\\[\\]-]+<\\/" + field + ">"); // get a new line until name is found while (get_line(&line, workflow) != -1) { From f8cc34fa0c1bdbb3a45bc60f125a204e5b6d0b0f Mon Sep 17 00:00:00 2001 From: willian Date: Sat, 18 Jun 2016 20:43:09 -0300 Subject: [PATCH 04/87] Bug fix 1. Added ID to ArgumentBase serialize/deserialize. 2. Updated generated stages to get the correct DR from the RT. The call had the wrong parameters. --- runtime/Argument.cpp | 14 +++++++++ runtime/Argument.h | 2 +- .../NormalizationComp.cpp | 16 +++++----- .../PipelineRTFS-NS-Diff-FGO/Segmentation.cpp | 16 +++++----- .../PipelineRTFS-NS-Diff-FGO/gen/Makefile | 12 ++++++++ .../examples/PipelineRTFS-NS-Diff-FGO/gen/gen | Bin 432826 -> 432826 bytes .../PipelineRTFS-NS-Diff-FGO/gen/gen.cpp | 28 ++++++++++-------- 7 files changed, 58 insertions(+), 30 deletions(-) create mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/Makefile diff --git a/runtime/Argument.cpp b/runtime/Argument.cpp index 5992d8c..0e11b02 100644 --- a/runtime/Argument.cpp +++ b/runtime/Argument.cpp @@ -17,6 +17,9 @@ int ArgumentBase::size() // starts with the size of the type int arg_size = sizeof(int); + // used to store the id + arg_size+=sizeof(int); + // used to store the size of the name stored arg_size+=sizeof(int); @@ -32,6 +35,11 @@ int ArgumentBase::serialize(char *buff) int serialized_bytes = sizeof(int); ((int*)buff)[0] = this->getType(); + // add id value + int id = this->getId(); + memcpy(buff+serialized_bytes, &id, sizeof(int)); + serialized_bytes += sizeof(int); + // pack the size of the name int string_size = this->name.size(); memcpy(buff+serialized_bytes, &string_size, sizeof(int)); @@ -50,6 +58,12 @@ int ArgumentBase::deserialize(char *buff) this->setType(((int*)buff)[0]); int deserialized_bytes = sizeof(int); + // get id + int id; + memcpy(&id, buff+deserialized_bytes, sizeof(int)); + deserialized_bytes+= sizeof(int); + this->setId(id); + // get Size of the name int string_size; memcpy(&string_size, buff+deserialized_bytes, sizeof(int)); diff --git a/runtime/Argument.h b/runtime/Argument.h index f9f773f..455fb8d 100644 --- a/runtime/Argument.h +++ b/runtime/Argument.h @@ -18,10 +18,10 @@ class ArgumentBase { protected: int type; std::string name; + int id; // this fields are used only on workflow generation int parent; - int id; public: ArgumentBase(){}; diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/NormalizationComp.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/NormalizationComp.cpp index ea9146f..7db62de 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/NormalizationComp.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/NormalizationComp.cpp @@ -26,20 +26,20 @@ int NormalizationComp::run() { std::cout << "Executing component: " << this->getComponentName() << " instance id: " << this->getId() <getRegionTemplateInstance("tile"); - std::string input_img_name; - std::string normalized_rt_name; + ArgumentRT* input_img_arg; + ArgumentRT* normalized_rt_arg; float* target_mean; float* target_std; int set_cout = 0; for(int i=0; igetArgumentsSize(); i++){ if (this->getArgument(i)->getName().compare("input_img") == 0) { - input_img_name = (std::string)((ArgumentString*)this->getArgument(i))->getArgValue(); + input_img_arg = (ArgumentRT*)this->getArgument(i); set_cout++; } if (this->getArgument(i)->getName().compare("normalized_rt") == 0) { - normalized_rt_name = (std::string)((ArgumentString*)this->getArgument(i))->getArgValue(); + normalized_rt_arg = (ArgumentRT*)this->getArgument(i); set_cout++; } @@ -58,9 +58,9 @@ int NormalizationComp::run() { if (set_cout < this->getArgumentsSize()) std::cout << __FILE__ << ":" << __LINE__ <<" Missing common arguments on NormalizationComp" << std::endl; - this->addInputOutputDataRegion("tile", input_img_name, RTPipelineComponentBase::INPUT); + this->addInputOutputDataRegion("tile", input_img_arg->getName(), RTPipelineComponentBase::INPUT); - this->addInputOutputDataRegion("tile", normalized_rt_name, RTPipelineComponentBase::OUTPUT); + this->addInputOutputDataRegion("tile", normalized_rt_arg->getName(), RTPipelineComponentBase::OUTPUT); if(inputRt != NULL){ @@ -69,9 +69,9 @@ int NormalizationComp::run() { DenseDataRegion2D *normalized_rt = NULL; try{ - input_img = dynamic_cast(inputRt->getDataRegion(input_img_name, "", 0, workflow_id)); + input_img = dynamic_cast(inputRt->getDataRegion(input_img_arg->getName(), std::to_string(input_img_arg->getId()), 0, input_img_arg->getId())); - normalized_rt = dynamic_cast(inputRt->getDataRegion(normalized_rt_name, "", 0, workflow_id)); + normalized_rt = dynamic_cast(inputRt->getDataRegion(normalized_rt_arg->getName(), std::to_string(normalized_rt_arg->getId()), 0, normalized_rt_arg->getId())); std::cout << "NormalizationComp. paramenterId: "<< workflow_id <getComponentName() << " instance id: " << this->getId() <getRegionTemplateInstance("tile"); - std::string normalized_rt_name; - std::string segmented_rt_name; + ArgumentRT* normalized_rt_arg; + ArgumentRT* segmented_rt_arg; unsigned char blue; unsigned char green; unsigned char red; @@ -47,12 +47,12 @@ int Segmentation::run() { int set_cout = 0; for(int i=0; igetArgumentsSize(); i++){ if (this->getArgument(i)->getName().compare("normalized_rt") == 0) { - normalized_rt_name = (std::string)((ArgumentString*)this->getArgument(i))->getArgValue(); + normalized_rt_arg = (ArgumentRT*)this->getArgument(i); set_cout++; } if (this->getArgument(i)->getName().compare("segmented_rt") == 0) { - segmented_rt_name = (std::string)((ArgumentString*)this->getArgument(i))->getArgValue(); + segmented_rt_arg = (ArgumentRT*)this->getArgument(i); set_cout++; } @@ -136,9 +136,9 @@ int Segmentation::run() { if (set_cout < this->getArgumentsSize()) std::cout << __FILE__ << ":" << __LINE__ <<" Missing common arguments on Segmentation" << std::endl; - this->addInputOutputDataRegion("tile", normalized_rt_name, RTPipelineComponentBase::INPUT); + this->addInputOutputDataRegion("tile", normalized_rt_arg->getName(), RTPipelineComponentBase::INPUT); - this->addInputOutputDataRegion("tile", segmented_rt_name, RTPipelineComponentBase::OUTPUT); + this->addInputOutputDataRegion("tile", segmented_rt_arg->getName(), RTPipelineComponentBase::OUTPUT); if(inputRt != NULL){ @@ -147,9 +147,9 @@ int Segmentation::run() { DenseDataRegion2D *segmented_rt = NULL; try{ - normalized_rt = dynamic_cast(inputRt->getDataRegion(normalized_rt_name, "", 0, workflow_id)); + normalized_rt = dynamic_cast(inputRt->getDataRegion(normalized_rt_arg->getName(), std::to_string(normalized_rt_arg->getId()), 0, normalized_rt_arg->getId())); - segmented_rt = dynamic_cast(inputRt->getDataRegion(segmented_rt_name, "", 0, workflow_id)); + segmented_rt = dynamic_cast(inputRt->getDataRegion(segmented_rt_arg->getName(), std::to_string(segmented_rt_arg->getId()), 0, segmented_rt_arg->getId())); std::cout << "Segmentation. paramenterId: "<< workflow_id <Ol>tL{C|d_T__&*z-a=W~;OFfjdKU}AR3l)v5G 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 S?)v1}2gA3{KA5BY@&5<%C5A@; delta 117943 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\n" + - "\t\t\tset_cout++;\n\t\t}\n\n"; + dr_name + "\") == 0) {\n\t\t\t" + dr_name + "_arg = (ArgumentRT*)" + + "this->getArgument(i);\n\t\t\tset_cout++;\n\t\t}\n\n"; // generate DataRegion IOs - $INPUT_DR_CREATE$ dataRegionInputCreate += "\tthis->addInputOutputDataRegion(\"tile\", " + - dr_name + "_name, RTPipelineComponentBase::INPUT);\n"; + dr_name + "_arg->getName(), RTPipelineComponentBase::INPUT);\n"; // generate DataRegion input declaration - $INPUT_DECL_DR$ dataRegionInputDecl += "\t\tDenseDataRegion2D *" + @@ -182,8 +181,10 @@ string generate_source(Json::Value data) { // generate DataRegion input cast - $INPUT_CAST_DR$ dataRegionInputCast += "\t\t\t" + dr_name + - " = dynamic_cast(inputRt->getDataRegion(" + - dr_name + "_name, \"\", 0, workflow_id));\n"; + " = dynamic_cast(inputRt->getDataRegion(" + + dr_name + "_arg->getName(), " + + "std::to_string(" + dr_name + "_arg->getId()), 0, " + dr_name + + "_arg->getId()));\n"; // generate DR cleaning for the destructor - $INPUT_DR_DELETE$ dr_delete += "\tif(" + dr_name + "_temp != NULL) delete " + dr_name + "_temp;\n"; @@ -195,17 +196,16 @@ string generate_source(Json::Value data) { // generate output string else if (data["args"][i]["io"].asString().compare("output") == 0) { // generate input dr name declaration - $PCB_ARGS$ - commonArgsDec += "\tstd::string " + dr_name + "_name;\n"; + commonArgsDec += "\tArgumentRT* " + dr_name + "_arg;\n"; // generate input dr name conditional assignment - $PCB_ARGS$ commonArgsLoop += "\t\tif (this->getArgument(i)->getName().compare(\"" + - dr_name + "\") == 0) {\n\t\t\t" + dr_name + "_name = (std::string)" + - "((ArgumentString*)this->getArgument(i))->getArgValue();\n" + - "\t\t\tset_cout++;\n\t\t}\n\n"; + dr_name + "\") == 0) {\n\t\t\t" + dr_name + "_arg = (ArgumentRT*)" + + "this->getArgument(i);\n\t\t\tset_cout++;\n\t\t}\n\n"; // generate DataRegion IOs - $OUTPUT_DR_CREATE$ dataRegionOutputCreate += "\tthis->addInputOutputDataRegion(\"tile\", " + - dr_name + "_name, RTPipelineComponentBase::OUTPUT);\n"; + dr_name + "_arg->getName(), RTPipelineComponentBase::OUTPUT);\n"; // generate DataRegion output declaration - $OUTPUT_DECL_DR$ dataRegionOutputDecl += "\t\tDenseDataRegion2D *" + @@ -214,7 +214,9 @@ string generate_source(Json::Value data) { // generate DataRegion output cast - $OUTPUT_CAST_DR$ dataRegionOutputCast += "\t\t\t" + dr_name + " = dynamic_cast(inputRt->getDataRegion(" + - dr_name + "_name, \"\", 0, workflow_id));\n"; + dr_name + "_arg->getName(), " + + "std::to_string(" + dr_name + "_arg->getId()), 0, " + dr_name + + "_arg->getId()));\n"; // generate cv::Mat variables to hold input DR - $OUTPUT_MAT_DR$ output_mat_dr += "\tcv::Mat " + dr_name + " = this->" + From 70e68df3c907b8f9d8ea80311a9221756310f2c9 Mon Sep 17 00:00:00 2001 From: willian Date: Mon, 20 Jun 2016 17:10:41 -0300 Subject: [PATCH 05/87] Bug fixes 1. Corrected generated stages regarding RT/DR variables initialization, 2. Updated ArgumentBase to hold an io_type, representing if a variable is an input or output. This will be used later to perform memory cleaning on arguments. Serialization/deserialization methods updated to hold this state between messages. 3. Commented memory cleaning line PipelineComponentBase.cpp:42. This operation resulted on premature deallocaion of reused arguments and it would possibly result in a racing condition, on which if a reusable argument is read by a second task before a first task deallocated it. --- runtime/Argument.cpp | 56 +++++++++++++++++- runtime/Argument.h | 36 +++++++---- runtime/PipelineComponentBase.cpp | 18 +++++- runtime/PipelineComponentBase.h | 5 ++ .../NormalizationComp.cpp | 10 +++- .../PipelineManager.cpp | 40 ++++++++----- .../PipelineRTFS-NS-Diff-FGO/Segmentation.cpp | 10 +++- .../examples/PipelineRTFS-NS-Diff-FGO/gen/gen | Bin 432826 -> 432826 bytes .../PipelineRTFS-NS-Diff-FGO/gen/gen.cpp | 12 ++-- 9 files changed, 143 insertions(+), 44 deletions(-) diff --git a/runtime/Argument.cpp b/runtime/Argument.cpp index 0e11b02..bae7099 100644 --- a/runtime/Argument.cpp +++ b/runtime/Argument.cpp @@ -8,10 +8,42 @@ #include "Argument.h" #include -ArgumentBase::ArgumentBase(int type) { +ArgumentBase::ArgumentBase(int type) : io(ArgumentBase::input) { this->type=type; } +void ArgumentBase::setName(std::string name) { + this->name = name; +} + +std::string ArgumentBase::getName(void) const { + return name; +} + +int ArgumentBase::getId() { + return id; +} + +void ArgumentBase::setId(int id) { + this->id = id; +} + +ArgumentBase::io_type ArgumentBase::getIo() { + return io; +} + +void ArgumentBase::setIo(io_type io) { + this->io = io; +} + +int ArgumentBase::getParent() { + return parent; +} + +void ArgumentBase::setParent(int parent) { + this->parent = parent; +} + int ArgumentBase::size() { // starts with the size of the type @@ -20,6 +52,9 @@ int ArgumentBase::size() // used to store the id arg_size+=sizeof(int); + // used to store the io type + arg_size+=sizeof(io_type); + // used to store the size of the name stored arg_size+=sizeof(int); @@ -40,6 +75,11 @@ int ArgumentBase::serialize(char *buff) memcpy(buff+serialized_bytes, &id, sizeof(int)); serialized_bytes += sizeof(int); + // add io value + io_type io = this->getIo(); + memcpy(buff+serialized_bytes, &io, sizeof(io_type)); + serialized_bytes += sizeof(io_type); + // pack the size of the name int string_size = this->name.size(); memcpy(buff+serialized_bytes, &string_size, sizeof(int)); @@ -64,6 +104,12 @@ int ArgumentBase::deserialize(char *buff) deserialized_bytes+= sizeof(int); this->setId(id); + // get io + io_type io; + memcpy(&io, buff+deserialized_bytes, sizeof(io_type)); + deserialized_bytes+= sizeof(io_type); + this->setIo(io); + // get Size of the name int string_size; memcpy(&string_size, buff+deserialized_bytes, sizeof(int)); @@ -441,9 +487,9 @@ std::string ArgumentFloatArray::toString() { return out; } -ArgumentRT::ArgumentRT() : name(""), isFileInput(false), ArgumentBase(ArgumentBase::RT){} +ArgumentRT::ArgumentRT() : path(""), isFileInput(false), ArgumentBase(ArgumentBase::RT){} -ArgumentRT::ArgumentRT(std::string name) : name(name), isFileInput(false), ArgumentBase(ArgumentBase::RT){} +ArgumentRT::ArgumentRT(std::string path) : path(path), isFileInput(false), ArgumentBase(ArgumentBase::RT){} ArgumentRT::~ArgumentRT() {} @@ -475,6 +521,8 @@ int ArgumentRT::serialize(char *buff) { memcpy(buff+serialized_bytes, &isFileInput, sizeof(bool)); serialized_bytes+=sizeof(bool); + std::cout << "[ArgumentRT] serialized arg " << this->getName() << " with value " << this->getArgValue() << " and size " << this->size() << std::endl; + return serialized_bytes; } @@ -529,6 +577,8 @@ int ArgumentRT::deserialize(char *buff) { // init argument value from string extracted this->setArgValue(string_value); + std::cout << "[ArgumentRT] deserialized arg " << this->getName() << " with value " << this->getArgValue() << " and size " << this->size() << std::endl; + // return total number of bytes extracted from message return deserialized_bytes; } diff --git a/runtime/Argument.h b/runtime/Argument.h index 455fb8d..02ad031 100644 --- a/runtime/Argument.h +++ b/runtime/Argument.h @@ -13,7 +13,7 @@ #include #include #include - + class ArgumentBase { protected: int type; @@ -24,7 +24,9 @@ class ArgumentBase { int parent; public: - ArgumentBase(){}; + enum io_type {input, output}; + + ArgumentBase() : io(ArgumentBase::input) {}; ArgumentBase(int type); virtual ~ArgumentBase(); @@ -37,14 +39,17 @@ class ArgumentBase { int getType() const; void setType(int type); - void setName(std::string name) {this->name = name;}; - std::string getName(void) const {return name;}; + void setName(std::string name); + std::string getName(void) const; - int getId() {return id;}; - void setId(int id) {this->id = id;}; + int getId(); + void setId(int id); - int getParent() {return parent;}; - void setParent(int parent) {this->parent = parent;}; + io_type getIo(); + void setIo(io_type io); + + int getParent(); + void setParent(int parent); virtual std::string toString() = 0; @@ -59,6 +64,13 @@ class ArgumentBase { static const int RT = 5; static const int FLOAT_ARRAY = 8; + +private: + // this field is here only because forward enum declaraion isn't allowed before c++0x + // otherwise, it would be below id. + // this is necessary since io_type must be a public type + io_type io; + }; class ArgumentString: public ArgumentBase{ @@ -139,16 +151,16 @@ class ArgumentFloatArray: public ArgumentBase{ class ArgumentRT: public ArgumentBase{ private: - std::string name; + std::string path; public: ArgumentRT(); - ArgumentRT(std::string name); + ArgumentRT(std::string path); virtual ~ArgumentRT(); virtual ArgumentBase* clone(); - std::string toString() {return name;}; + std::string toString() {return path;}; bool isFileInput; @@ -156,7 +168,7 @@ class ArgumentRT: public ArgumentBase{ int serialize(char *buff); int deserialize(char *buff); std::string getArgValue() const; - void setArgValue(std::string name); + void setArgValue(std::string path); }; diff --git a/runtime/PipelineComponentBase.cpp b/runtime/PipelineComponentBase.cpp index b1d5f27..b60ee47 100644 --- a/runtime/PipelineComponentBase.cpp +++ b/runtime/PipelineComponentBase.cpp @@ -35,7 +35,12 @@ PipelineComponentBase::~PipelineComponentBase() { while(this->arguments.size()> 0){ ArgumentBase *aux = this->arguments.back(); this->arguments.pop_back(); - delete aux; + if (aux->getIo() == ArgumentBase::input) { + std::cout << __FILE__ << ":" << __LINE__ <<" TODO: remove argument" << aux->getId() << + ":" << aux->getName() << " only when no other stage needs it" << std::endl; + // std::cout << "[PipelineComponentBase] deleting input " << aux->getName() << std::endl; + // delete aux; + } } if(resultData != NULL) free(resultData); } @@ -56,7 +61,16 @@ ArgumentBase *PipelineComponentBase::getArgument(int index) return retArg; } - +ArgumentBase *PipelineComponentBase::getArgumentById(int id) +{ + ArgumentBase *retArg = NULL; + for (vector::iterator i = this->arguments.begin(); i != this->arguments.end(); i++) { + if ((*i)->getId() == id) { + retArg = *i; + } + } + return retArg; +} std::string PipelineComponentBase::getComponentName() const { diff --git a/runtime/PipelineComponentBase.h b/runtime/PipelineComponentBase.h index 8414420..d427d87 100644 --- a/runtime/PipelineComponentBase.h +++ b/runtime/PipelineComponentBase.h @@ -107,6 +107,11 @@ class PipelineComponentBase: public Task { // Retrieve "index"th argument, if it exists, otherwise NULL is returned ArgumentBase *getArgument(int index); + // Retrieve an argument with 'id', if it exists, otherwise NULL is returned + // This is used by the pipeline generator and was added here as a new function + // instead of changing getArgument(int) for compatibility reasons + ArgumentBase *getArgumentById(int id); + // Get current number of arguments associated to this component. int getArgumentsSize(); diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/NormalizationComp.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/NormalizationComp.cpp index 7db62de..8f96ffd 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/NormalizationComp.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/NormalizationComp.cpp @@ -71,7 +71,11 @@ int NormalizationComp::run() { try{ input_img = dynamic_cast(inputRt->getDataRegion(input_img_arg->getName(), std::to_string(input_img_arg->getId()), 0, input_img_arg->getId())); - normalized_rt = dynamic_cast(inputRt->getDataRegion(normalized_rt_arg->getName(), std::to_string(normalized_rt_arg->getId()), 0, normalized_rt_arg->getId())); + normalized_rt = new DenseDataRegion2D(); + normalized_rt->setName(normalized_rt_arg->getName()); + normalized_rt->setId(std::to_string(normalized_rt_arg->getId())); + normalized_rt->setVersion(normalized_rt_arg->getId()); + inputRt->insertDataRegion(normalized_rt); std::cout << "NormalizationComp. paramenterId: "<< workflow_id <input_img_temp->getData(); - cv::Mat normalized_rt = this->normalized_rt_temp->getData(); + cv::Mat normalized_rt; uint64_t t1 = Util::ClockGetTimeProfile(); diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index c1f4331..563a914 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -216,8 +216,16 @@ int main(int argc, char* argv[]) { // add all stages to manager cout << endl << "executeComponent" << endl; - for (pair s : expanded_stages) + for (pair s : expanded_stages) { + cout << "sent component " << s.second->getName() << " to execute with args:" << endl; + cout << "\tinputs: " << endl; + for (int i : s.second->getInputs()) + cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " << expanded_args[i]->toString() << endl; + cout << "\toutputs: " << endl; + for (int i : s.second->getOutputs()) + cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " << expanded_args[i]->toString() << endl; sysEnv.executeComponent(s.second); + } // execute workflows cout << endl << "startupExecution" << endl; @@ -360,10 +368,11 @@ void get_inputs_from_file(FILE* workflow_descriptor, exit(-4); } - // set inp_arg name and id + // set inp_arg name, id and input type inp_arg->setName(name); int arg_id = new_uid(); inp_arg->setId(arg_id); + inp_arg->setIo(ArgumentBase::input); // add input argument to map workflow_inputs[arg_id] = inp_arg; @@ -455,6 +464,7 @@ void get_outputs_from_file(FILE* workflow_descriptor, map &w } out_arg->setName(name); + out_arg->setIo(ArgumentBase::output); workflow_outputs[new_uid()] = out_arg; // consumes the port ending @@ -762,22 +772,20 @@ void generate_drs(RegionTemplate* rt, for (pair p : expanded_args) { // if an argument is a region template data region if (p.second->getType() == ArgumentBase::RT) { - // create the data region and add it to the input region template - DenseDataRegion2D *ddr2d = new DenseDataRegion2D(); - ddr2d->setName(p.second->getName()); - std::ostringstream oss; - oss << p.first; - ddr2d->setId(oss.str()); - ddr2d->setVersion(p.first); - - // aditional setup if the argument is an input from file if (((ArgumentRT*)p.second)->isFileInput) { - ddr2d->setInputType(DataSourceType::FILE_SYSTEM); + // create the data region and add it to the input region template + DenseDataRegion2D *ddr2d = new DenseDataRegion2D(); + ddr2d->setName(p.second->getName()); + std::ostringstream oss; + oss << p.first; + ddr2d->setId(oss.str()); + ddr2d->setVersion(p.first); ddr2d->setIsAppInput(true); + ddr2d->setInputType(DataSourceType::FILE_SYSTEM); ddr2d->setOutputType(DataSourceType::FILE_SYSTEM); ddr2d->setInputFileName(p.second->toString()); + rt->insertDataRegion(ddr2d); } - rt->insertDataRegion(ddr2d); } } } @@ -791,12 +799,13 @@ void add_arguments_to_stages(map &merged_stages, // add input arguments to stage, adding them as RT as needed for (int arg_id : stage.second->getInputs()) { stage.second->addArgument(merged_arguments[arg_id]); + cout << "added input argument " << merged_arguments[arg_id]->getName() << " sized " << merged_arguments[arg_id]->size() << endl; if (merged_arguments[arg_id]->getType() == ArgumentBase::RT) { cout << "input RT : " << merged_arguments[arg_id]->getName() << endl; // insert the region template on the parent stage if the argument is a DR and if the RT wasn't already added if (((RTPipelineComponentBase*)stage.second)->getRegionTemplateInstance(rt->getName()) == NULL) ((RTPipelineComponentBase*)stage.second)->addRegionTemplateInstance(rt, rt->getName()); - ((RTPipelineComponentBase*)stage.second)->addInputOutputDataRegion(rt->getName() ,merged_arguments[arg_id]->getName(), RTPipelineComponentBase::INPUT); + ((RTPipelineComponentBase*)stage.second)->addInputOutputDataRegion(rt->getName(), merged_arguments[arg_id]->getName(), RTPipelineComponentBase::INPUT); } ((RTPipelineComponentBase*)stage.second)->addDependency(merged_arguments[arg_id]->getParent()); } @@ -804,12 +813,13 @@ void add_arguments_to_stages(map &merged_stages, // add output arguments to stage, adding them as RT as needed for (int arg_id : stage.second->getOutputs()) { stage.second->addArgument(merged_arguments[arg_id]); + cout << "added output argument " << merged_arguments[arg_id]->getName() << " sized " << merged_arguments[arg_id]->size() << endl; if (merged_arguments[arg_id]->getType() == ArgumentBase::RT) { cout << "output RT : " << merged_arguments[arg_id]->getName() << endl; // insert the region template on the parent stage if the argument is a DR and if the RT wasn't already added if (((RTPipelineComponentBase*)stage.second)->getRegionTemplateInstance(rt->getName()) == NULL) ((RTPipelineComponentBase*)stage.second)->addRegionTemplateInstance(rt, rt->getName()); - ((RTPipelineComponentBase*)stage.second)->addInputOutputDataRegion(rt->getName() ,merged_arguments[arg_id]->getName(), RTPipelineComponentBase::OUTPUT); + ((RTPipelineComponentBase*)stage.second)->addInputOutputDataRegion(rt->getName(), merged_arguments[arg_id]->getName(), RTPipelineComponentBase::OUTPUT); } } } diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp index d67b803..7a6d1e1 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp @@ -149,7 +149,11 @@ int Segmentation::run() { try{ normalized_rt = dynamic_cast(inputRt->getDataRegion(normalized_rt_arg->getName(), std::to_string(normalized_rt_arg->getId()), 0, normalized_rt_arg->getId())); - segmented_rt = dynamic_cast(inputRt->getDataRegion(segmented_rt_arg->getName(), std::to_string(segmented_rt_arg->getId()), 0, segmented_rt_arg->getId())); + segmented_rt = new DenseDataRegion2D(); + segmented_rt->setName(segmented_rt_arg->getName()); + segmented_rt->setId(std::to_string(segmented_rt_arg->getId())); + segmented_rt->setVersion(segmented_rt_arg->getId()); + inputRt->insertDataRegion(segmented_rt); std::cout << "Segmentation. paramenterId: "<< workflow_id <normalized_rt_temp->getData(); - cv::Mat segmented_rt = this->segmented_rt_temp->getData(); + cv::Mat segmented_rt; uint64_t t1 = Util::ClockGetTimeProfile(); diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/gen b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/gen index cad95c107f06d7450aa2a0886c800b19a1d891b9..92bddec7dd8200431422b7a975d07204fb997f2c 100755 GIT binary patch delta 122343 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 R-I+Z5h-d5UBi?c+{~z43mKOj3 diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/gen.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/gen.cpp index 92dd390..853cf6e 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/gen.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/gen.cpp @@ -213,14 +213,14 @@ string generate_source(Json::Value data) { // generate DataRegion output cast - $OUTPUT_CAST_DR$ dataRegionOutputCast += "\t\t\t" + dr_name + - " = dynamic_cast(inputRt->getDataRegion(" + - dr_name + "_arg->getName(), " + - "std::to_string(" + dr_name + "_arg->getId()), 0, " + dr_name + - "_arg->getId()));\n"; + " = new DenseDataRegion2D();\n\t\t\t" + dr_name + "->setName(" + + dr_name + "_arg->getName());\n\t\t\t" + dr_name + "->setId(std::to_string(" + + dr_name + "_arg->getId()));\n\t\t\t" + dr_name + "->setVersion(" + + dr_name + "_arg->getId());\n\t\t\tinputRt->insertDataRegion(" + + dr_name + ");\n"; // generate cv::Mat variables to hold input DR - $OUTPUT_MAT_DR$ - output_mat_dr += "\tcv::Mat " + dr_name + " = this->" + - dr_name + "_temp->getData();"; + output_mat_dr += "\tcv::Mat " + dr_name + ";"; // generate mat assignment to output DR string - $OUTPUT_DR_RETURN$ output_return += "\tthis->" + dr_name + "_temp->setData(" + dr_name + ");"; From b679c0f5b69830fb6f06daf4a9774d7a8afea403 Mon Sep 17 00:00:00 2001 From: willian Date: Mon, 20 Jun 2016 17:16:47 -0300 Subject: [PATCH 06/87] =?UTF-8?q?Removed=20free=20on=20P=C3=ACpelineCompon?= =?UTF-8?q?entBase.cpp:46=20due=20to=20SIGABRT.=20Memory=20cleanning=20wil?= =?UTF-8?q?l=20be=20performed=20later.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- runtime/PipelineComponentBase.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/runtime/PipelineComponentBase.cpp b/runtime/PipelineComponentBase.cpp index b60ee47..d99b465 100644 --- a/runtime/PipelineComponentBase.cpp +++ b/runtime/PipelineComponentBase.cpp @@ -42,7 +42,8 @@ PipelineComponentBase::~PipelineComponentBase() { // delete aux; } } - if(resultData != NULL) free(resultData); + std::cout << __FILE__ << ":" << __LINE__ << "TODO: free resultData if needed" << std::endl; + // if(resultData != NULL) free(resultData); } void PipelineComponentBase::addArgument(ArgumentBase *arg) From fbf1141ca1dcd71e9a779c7df3c90042a8803d03 Mon Sep 17 00:00:00 2001 From: willian Date: Mon, 20 Jun 2016 17:50:03 -0300 Subject: [PATCH 07/87] Still buggy code. Attempting to get the output id to retrieve the workflow output. --- .../NormalizationComp.cpp | 2 +- .../PipelineManager.cpp | 41 ++++++++++++------- .../PipelineRTFS-NS-Diff-FGO/Segmentation.cpp | 2 +- 3 files changed, 28 insertions(+), 17 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/NormalizationComp.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/NormalizationComp.cpp index 8f96ffd..709edd7 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/NormalizationComp.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/NormalizationComp.cpp @@ -119,7 +119,7 @@ TaskNormalizationComp::TaskNormalizationComp(DenseDataRegion2D* input_img_temp, } TaskNormalizationComp::~TaskNormalizationComp() { - // if(input_img_temp != NULL) delete input_img_temp; + if(input_img_temp != NULL) delete input_img_temp; } diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 563a914..042776f 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -60,7 +60,7 @@ void get_stages_from_file(FILE* workflow_descriptor, map &interstage_arguments); void connect_stages_from_file(FILE* workflow_descriptor, map &base_stages, map &interstage_arguments, map &input_arguments, - map> &deps); + map> &deps, map &workflow_outputs); void expand_stages(const map &args, map> args_values, map &expanded_args,map stages, map &expanded_stages); @@ -87,7 +87,7 @@ int main(int argc, char* argv[]) { SysEnv sysEnv; // Tell the system which libraries should be used - sysEnv.startupSystem(argc, argv, "libcomponentnsdifffgo.so"); + // sysEnv.startupSystem(argc, argv, "libcomponentnsdifffgo.so"); // region template used by all stages RegionTemplate *rt = new RegionTemplate(); @@ -120,9 +120,9 @@ int main(int argc, char* argv[]) { // get all workflow outputs map workflow_outputs; get_outputs_from_file(workflow_descriptor, workflow_outputs); - // cout << endl << "workflow_outputs " << endl; - // for (pair p : workflow_outputs) - // cout << p.first << ":" << p.second->getName() << endl; + cout << endl << "workflow_outputs " << endl; + for (pair p : workflow_outputs) + cout << p.first << ":" << p.second->getName() << endl; // get all stages, also setting the uid from this context to Task (i.e Task::setId()) // also returns the list of arguments used @@ -137,15 +137,15 @@ int main(int argc, char* argv[]) { // cout << "\t" << i << ":" << interstage_arguments[i]->getName() << endl; // } - // cout << endl << "interstage_arguments:" << endl; - // for (pair p : interstage_arguments) - // cout << p.first << ":" << p.second->getName() << endl; + cout << endl << "interstage_arguments:" << endl; + for (pair p : interstage_arguments) + cout << p.first << ":" << p.second->getName() << endl; // this map is a dependency structure: stage -> dependency_list map> deps; // connect the stages inputs/outputs - connect_stages_from_file(workflow_descriptor, base_stages, interstage_arguments, workflow_inputs, deps); + connect_stages_from_file(workflow_descriptor, base_stages, interstage_arguments, workflow_inputs, deps, workflow_outputs); map all_argument(workflow_inputs); for (pair a : interstage_arguments) all_argument[a.first] = a.second; @@ -231,8 +231,8 @@ int main(int argc, char* argv[]) { cout << endl << "startupExecution" << endl; sysEnv.startupExecution(); - // get results - // for each ArgumentBase output of merged_outputs do + // // get results + // for ArgumentBase output of merged_outputs do // cout << sysEnv.getComponentResultData(output.getId()) << endl; // end sysEnv.finalizeSystem(); @@ -542,7 +542,8 @@ void connect_stages_from_file(FILE* workflow_descriptor, map &base_stages, map &interstage_arguments, map &input_arguments, - map> &deps) { + map> &deps, + map &workflow_outputs) { char *line = NULL; size_t len = 0; @@ -596,9 +597,19 @@ void connect_stages_from_file(FILE* workflow_descriptor, // add the link to the sink stage sink_stg->addInput(arg->getId()); } - // else { - // cout << "workflow argument sink: " << all_sink_fields[0].data << endl; - // } + else { + cout << "workflow argument sink: " << all_sink_fields[0].data << endl; + // update workflow output id in order to access it later to retreive the output + + ArgumentBase* itstg_argument = find_argument(interstage_arguments, all_source_fields[1].data); + cout << "Output " << all_sink_fields[0].data << " connects to argument " << itstg_argument->getId() << + ":" << itstg_argument->getName() << endl; + ArgumentBase* output = find_argument(workflow_outputs, all_source_fields[0].data); + cout << "Output " << all_sink_fields[0].data << " had id " << output->getId() << endl; + output->setId(itstg_argument->getId()); + cout << "Output " << all_sink_fields[0].data << " now has id " << output->getId() << endl; + + } // consumes the datalink ending while (string(line).find(de) == string::npos && get_line(&line, workflow_descriptor) != -1); diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp index 7a6d1e1..969e41e 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp @@ -210,7 +210,7 @@ TaskSegmentation::TaskSegmentation(DenseDataRegion2D* normalized_rt_temp, DenseD } TaskSegmentation::~TaskSegmentation() { - // if(normalized_rt_temp != NULL) delete normalized_rt_temp; + if(normalized_rt_temp != NULL) delete normalized_rt_temp; } From cbf7957065c857f9ae3579416a1082d3a9073939 Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Mon, 20 Jun 2016 20:02:50 -0300 Subject: [PATCH 08/87] Output Argument on workflow generator now has updated id from the stage argument from witch the output value will be collected. --- .../PipelineManager.cpp | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 042776f..ef496ef 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -33,9 +33,8 @@ typedef struct { } general_field_t; void mapprint(map mapp) { - for (map::iterator it = mapp.begin(); it != mapp.end(); ++it) - // for (map::iterator i=map.begin(); i!=map.end();i++) - cout << it->first << ":" << it->second->getName() << endl; + for (pair p : mapp) + cout << p.first << ":" << p.second->getName() << endl; } void mapprint(map> mapp) { @@ -77,7 +76,7 @@ string get_workflow_field(FILE* workflow, string field); void get_workflow_arguments(FILE* workflow, list &output_arguments); vector get_all_fields(FILE* workflow, string start, string end); PipelineComponentBase* find_stage(map stages, string name); -ArgumentBase* find_argument(map arguments, string name); +ArgumentBase* find_argument(const map arguments, string name); ArgumentBase* new_typed_arg_base(string type); parsing::port_type_t get_port_type(string s); @@ -121,8 +120,9 @@ int main(int argc, char* argv[]) { map workflow_outputs; get_outputs_from_file(workflow_descriptor, workflow_outputs); cout << endl << "workflow_outputs " << endl; - for (pair p : workflow_outputs) - cout << p.first << ":" << p.second->getName() << endl; + mapprint(workflow_outputs); + // for (pair p : workflow_outputs) + // cout << p.second->getId() << ":" << p.second->getName() << endl; // get all stages, also setting the uid from this context to Task (i.e Task::setId()) // also returns the list of arguments used @@ -465,7 +465,9 @@ void get_outputs_from_file(FILE* workflow_descriptor, map &w out_arg->setName(name); out_arg->setIo(ArgumentBase::output); - workflow_outputs[new_uid()] = out_arg; + int new_id = new_uid(); + out_arg->setId(new_id); + workflow_outputs[new_id] = out_arg; // consumes the port ending while (get_line(&line, workflow_descriptor) != -1 && string(line).find(pe) == string::npos); @@ -604,11 +606,18 @@ void connect_stages_from_file(FILE* workflow_descriptor, ArgumentBase* itstg_argument = find_argument(interstage_arguments, all_source_fields[1].data); cout << "Output " << all_sink_fields[0].data << " connects to argument " << itstg_argument->getId() << ":" << itstg_argument->getName() << endl; - ArgumentBase* output = find_argument(workflow_outputs, all_source_fields[0].data); + ArgumentBase* output = find_argument(workflow_outputs, all_sink_fields[0].data); cout << "Output " << all_sink_fields[0].data << " had id " << output->getId() << endl; + + // remove reference of old id from map + workflow_outputs.erase(output->getId()); + + // update the output id output->setId(itstg_argument->getId()); cout << "Output " << all_sink_fields[0].data << " now has id " << output->getId() << endl; - + + // re-insert the output with the new id + workflow_outputs[output->getId()] = output; } // consumes the datalink ending @@ -975,7 +984,7 @@ PipelineComponentBase* find_stage(map stages, strin return NULL; } -ArgumentBase* find_argument(map arguments, string name) { +ArgumentBase* find_argument(const map arguments, string name) { for (pair p : arguments) if (p.second->getName().compare(name) == 0) return p.second; From 366637a11d99f6101a6d6ce663449fb06cefc69d Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Mon, 20 Jun 2016 21:39:28 -0300 Subject: [PATCH 09/87] Bug Fix 1. Output IDs are now correctly assigned. Still need to get the output values from the diff stage. Notes: 1. System is currently working with any parameter set with only two mpi processes. Still need to debug why is that. 2. Although the workflow is returning the correct diff output, its value is only seen thanks to a debug cout, not being correctly retrieved from the Argument object. --- .../PipelineRTFS-NS-Diff-FGO/DiffMaskComp.cpp | 25 ++++---- .../PipelineManager.cpp | 60 ++++++++++++++---- .../examples/PipelineRTFS-NS-Diff-FGO/gen/gen | Bin 432826 -> 432770 bytes 3 files changed, 60 insertions(+), 25 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/DiffMaskComp.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/DiffMaskComp.cpp index 2d500d8..8f493ff 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/DiffMaskComp.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/DiffMaskComp.cpp @@ -17,23 +17,23 @@ int DiffMaskComp::run() { RegionTemplate * inputRt = this->getRegionTemplateInstance("tile"); // int parameterSegId = ((ArgumentInt*)this->getArgument(0))->getArgValue(); - std::string computed_mask_name; - std::string reference_mask_name; + ArgumentRT* computed_mask_name; + ArgumentRT* reference_mask_name; float* diffPixels; int set_cout = 0; for(int i=0; igetArgumentsSize(); i++){ - if (this->getArgument(i)->getName().compare("computed_mask") == 0) { - computed_mask_name = (std::string)((ArgumentString*)this->getArgument(i))->getArgValue(); + if (this->getArgument(i)->getName().compare("segmented_rt") == 0) { + computed_mask_name = (ArgumentRT*)this->getArgument(i); set_cout++; } - if (this->getArgument(i)->getName().compare("reference_mask") == 0) { - reference_mask_name = (std::string)((ArgumentString*)this->getArgument(i))->getArgValue(); + if (this->getArgument(i)->getName().compare("input_ref_img") == 0) { + reference_mask_name = (ArgumentRT*)this->getArgument(i); set_cout++; } - if (this->getArgument(i)->getName().compare("diffPixels") == 0) { + if (this->getArgument(i)->getName().compare("diff") == 0) { diffPixels = (float*)((ArgumentFloatArray*)this->getArgument(i))->getArgValue(); set_cout++; } @@ -41,7 +41,7 @@ int DiffMaskComp::run() { } if (set_cout < this->getArgumentsSize()) - std::cout << __FILE__ << ":" << __LINE__ <<" Missing common arguments on Segmentation" << std::endl; + std::cout << __FILE__ << ":" << __LINE__ <<" Missing common arguments on DiffMaskComp" << std::endl; // this->addInputOutputDataRegion("tile", inputDr, RTPipelineComponentBase::INPUT); @@ -54,9 +54,13 @@ int DiffMaskComp::run() { if(inputRt != NULL){ // Mask computed in segmentation using specific application parameter set - DenseDataRegion2D *computed_mask = dynamic_cast(inputRt->getDataRegion(computed_mask_name, "", 0, dr_id)); + DenseDataRegion2D *computed_mask = dynamic_cast( + inputRt->getDataRegion(computed_mask_name->getName(), std::to_string(computed_mask_name->getId()), 0, + computed_mask_name->getId())); // Mask used as a reference - DenseDataRegion2D *reference_mask = dynamic_cast(inputRt->getDataRegion(reference_mask_name, "", 0, dr_id)); + DenseDataRegion2D *reference_mask = dynamic_cast( + inputRt->getDataRegion(reference_mask_name->getName(), std::to_string(reference_mask_name->getId()), 0, + reference_mask_name->getId())); if(computed_mask != NULL && reference_mask != NULL){ // gambiarra @@ -76,7 +80,6 @@ int DiffMaskComp::run() { // std::cout << "DiffMaskComp: you didn't specify a task: " << std::endl; // inputRt->print(); // } - }else{ std::cout << "DiffMaskComp: did not find data regions: " << std::endl; inputRt->print(); diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index ef496ef..0c9d058 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -62,7 +62,7 @@ void connect_stages_from_file(FILE* workflow_descriptor, map> &deps, map &workflow_outputs); void expand_stages(const map &args, map> args_values, map &expanded_args,map stages, - map &expanded_stages); + map &expanded_stages, map &workflow_outputs); void generate_drs(RegionTemplate* rt, const map &expanded_args); void add_arguments_to_stages(map &merged_stages, map &merged_arguments, @@ -86,7 +86,7 @@ int main(int argc, char* argv[]) { SysEnv sysEnv; // Tell the system which libraries should be used - // sysEnv.startupSystem(argc, argv, "libcomponentnsdifffgo.so"); + sysEnv.startupSystem(argc, argv, "libcomponentnsdifffgo.so"); // region template used by all stages RegionTemplate *rt = new RegionTemplate(); @@ -182,7 +182,7 @@ int main(int argc, char* argv[]) { map expanded_args; map expanded_stages; - expand_stages(args, parameters_values, expanded_args, base_stages, expanded_stages); + expand_stages(args, parameters_values, expanded_args, base_stages, expanded_stages, workflow_outputs); cout << endl<< "merged: " << endl; for (pair p : expanded_stages) { @@ -231,10 +231,21 @@ int main(int argc, char* argv[]) { cout << endl << "startupExecution" << endl; sysEnv.startupExecution(); - // // get results - // for ArgumentBase output of merged_outputs do - // cout << sysEnv.getComponentResultData(output.getId()) << endl; - // end + // get results + cout << endl << "Results: " << endl; + for (pair output : workflow_outputs) { + // cout << "\t" << output.second->getName() << ":" << output.second->getId() << " = " << + // sysEnv.getComponentResultData(output.second->getId()) << endl; + char *resultData = sysEnv.getComponentResultData(output.second->getId()); + std::cout << "Diff Id: " << output.second->getId() << " resultData - "; + if(resultData != NULL){ + std::cout << "size: " << ((int *) resultData)[0] << " Diff: " << ((float *) resultData)[1] << + " Secondary Metric: " << ((float *) resultData)[2] << std::endl; + }else{ + std::cout << "NULL" << std::endl; + } + } + sysEnv.finalizeSystem(); } @@ -649,7 +660,8 @@ void expand_stages(const map &args, map> args_values, map &expanded_args, map stages, - map &expanded_stages) { + map &expanded_stages, + map &workflow_outputs) { // cout << endl << "args:" << endl; // mapprint(args); @@ -776,13 +788,35 @@ void expand_stages(const map &args, } // flatten the arg values into expanded_args + cout << endl << "arg_values" << endl; for (pair> p : args_values) { - // cout << "base argument " << p.first << ":" << args.at(p.first)->getName() << endl; + cout << "base argument " << p.first << ":" << args.at(p.first)->getName() << endl; for (ArgumentBase* a : p.second) { - // cout << "\t" << a->getId() << ":" << a->getName() << " = " << a->toString() << endl; + cout << "\t" << a->getId() << ":" << a->getName() << " = " << a->toString() << endl; expanded_args[a->getId()] = a; } } + + // update the output arguments + map workflow_outputs_cpy = workflow_outputs; + while (workflow_outputs_cpy.size() != 0) { + // get the first output argument + ArgumentBase* old_arg = (workflow_outputs_cpy.begin())->second; + + // get the list of parameters (i.e the number of copies and the final ids) of the outputs + list l = args_values[old_arg->getId()]; + + // remove the current, outdated, argument from final map + workflow_outputs.erase(old_arg->getId()); + workflow_outputs_cpy.erase(old_arg->getId()); + + // add a copy of the old arg with the correct id to the final map for each repeated output + for (ArgumentBase* a : l) { + ArgumentBase* temp = old_arg->clone(); + temp->setId(a->getId()); + workflow_outputs[temp->getId()] = temp; + } + } } void generate_drs(RegionTemplate* rt, @@ -819,9 +853,8 @@ void add_arguments_to_stages(map &merged_stages, // add input arguments to stage, adding them as RT as needed for (int arg_id : stage.second->getInputs()) { stage.second->addArgument(merged_arguments[arg_id]); - cout << "added input argument " << merged_arguments[arg_id]->getName() << " sized " << merged_arguments[arg_id]->size() << endl; if (merged_arguments[arg_id]->getType() == ArgumentBase::RT) { - cout << "input RT : " << merged_arguments[arg_id]->getName() << endl; + // cout << "input RT : " << merged_arguments[arg_id]->getName() << endl; // insert the region template on the parent stage if the argument is a DR and if the RT wasn't already added if (((RTPipelineComponentBase*)stage.second)->getRegionTemplateInstance(rt->getName()) == NULL) ((RTPipelineComponentBase*)stage.second)->addRegionTemplateInstance(rt, rt->getName()); @@ -833,9 +866,8 @@ void add_arguments_to_stages(map &merged_stages, // add output arguments to stage, adding them as RT as needed for (int arg_id : stage.second->getOutputs()) { stage.second->addArgument(merged_arguments[arg_id]); - cout << "added output argument " << merged_arguments[arg_id]->getName() << " sized " << merged_arguments[arg_id]->size() << endl; if (merged_arguments[arg_id]->getType() == ArgumentBase::RT) { - cout << "output RT : " << merged_arguments[arg_id]->getName() << endl; + // cout << "output RT : " << merged_arguments[arg_id]->getName() << endl; // insert the region template on the parent stage if the argument is a DR and if the RT wasn't already added if (((RTPipelineComponentBase*)stage.second)->getRegionTemplateInstance(rt->getName()) == NULL) ((RTPipelineComponentBase*)stage.second)->addRegionTemplateInstance(rt, rt->getName()); diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/gen b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/gen index 92bddec7dd8200431422b7a975d07204fb997f2c..35a69bde2c4ec563da7bfcd632cf358ce3cce23e 100755 GIT binary patch delta 124905 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 z z#6oO(kP0yq{YSHZz=+Xo|MqXFkcdS`=o*~)9T{-z_l$0=K>L#xi_dX-20Q)0Aj890 z_zb(&3VIM{U^RYiD-J4FFF8vT2+4lx3kV(Fb6MKSO$RvAX(In*08jZd?6U>D>= zZk9+)_PUpKN1zx}umbm@J%WmUrXc(kqtRZ;^nL8X(2MhcNG#zfHyZsPV%LfhcpMYZ z>lZ3ydvA%QY>r*9j4=>_Nvy)zzp(x15?Dz@F>b&LJcjl$99+;J!+)h<9F6gqg&CNS zdAJu#una5F>o*!WmUBuB#8nuH9nR1&48sf@e}?TpkHBk0lwdJdVu!O7FpfPT2I3Hm z#>JR~xtNWO&#~&TGnU~Jv_HjB5(BaKKdBhwF##(u1DjS+FW!?(poG8}ti(O&mB5l< zAfCr)4Eddku^(n*J{IC$EWGjTTN z;}R^L#P(lKpo$33Y6_Ul;T3~%07hdxCSo>b<6104YYknGH()i6MBir^R2YieF&2+t z5;`#({T<9tG#A-C0RPZc&Kn%qPF&1Mn2{SPpw_+id zVHp}0r?VQp(Dyk8H-_RcOpYZmgFq7I@*8A%xD89On%_CA#^(GKneX##4H$~?7>k*h zgzGRD&tVCA@pEWZI0${GunWdeoQJWv4U@3M?o4)O6R0Ml5O3pm(#migR^xQ^oyyS= zL-9PuVh4U?EeRjNY|O+$%*QhP46CseeW$S>!BD)JpL>hNk(h)j*CkT`frUgA;#XLP zjrmExY79o->5N(o#dk3lPh%2RV>b5U*X9aw7?$B^tj0w2O`?1Z#l0Ad=P?QUCG%T& z*#t7N7(c=a{2c8s@GuVj(TNe*il5Sp$3)D)d6>z*71rl>2fb%-j)%cG17mR= zCgGo$i^<*jvBqKo6 zm4O)ClzccI6L2eLU>W9NZ+@AxG==Rynn0B%MDJ9(2t%<9W3e8;`k91xV>S-s*EfrC zGFISr^qR?5!Ebp6qW-35B&J~kF2oExih0LHROARZI>gFo-}bj>RN=5wmeQ7UE_s!;@Hz=h1gITgfe~D(sB07=cMR3bQc< z3o#4Ju(AV7p3dOx$dco@j%@!C1d@n|$9b5B7cfubJJE8?#46l|-g6im7>wfrs2ClX zgabM=s_`HeW7e$F2rigL*G}}Utk1!2C={xoJ=5%z(CB!F<6Y7u@ZNn z*F5f!Vjwy&5>vX-aLmRGT#I=a*qzahy|EG}qt~lk`2^E&d=8^A4HGeW1%XTg>o6aW zVJSAggC)mE^q$X&1cu@+jK%kQ(s101xmbq!B{HY60`0w6*9$mTM1Sms5jX_naVDlM zVEdm>AeV@>Sd7J3fk)B4kS;@iY#u@Z7>e;Y57V&6oh&&Q}n2pW* z(r^sIGCX!aJtiC-`_W@K86$9Be=5c^n1SsEP%+NHZpVm5Yokcu%3%PbV%B|px_BwT{o zn2Uwj?h*21_hbUq1m+E6oh|1M21ej}7>~u6hDR|M&tNfn#;}#3FWTQ=m7qWN!U!CI z@tBPnxC8U>H!Q)p;Vd{NZzbTnf>R|7#a}TNt1$`tK1$26ES8pI^T%j8=3+G-L*E=W zyAkBa<#AMu8!!#GjG|&ZfhE}cAFMKrK(Cc-{~hAVxRMjZW#W)8`Fc&NF5PIdZsxUA&nH|bl1{)DWF#+db2Cm0E zJc%WE;3>KcJrmeU-r}a!(=;4AkEh{Sg=yGn0u9H3Sd1&N5_h53D#i*1;yH{=CeV2z z72`iK6YrlyS7QQ};d5Ax>(KXY3c^sdPNrfE#3Wpfx!C?08jO>%3J;_AYK!G3492O6 zY#sPACMOa&L?9DSU_SPGmdyi)U=?Pd_ZqqkLviMFbT#HbPfy_m%)^CK$fxnsXfRr) z)8MsiMM=kvIhta2;miSD26GSc=Kr(`h+@Nc7%F zOEDN{VKio9BCf+s{0;N5{TvFweprRM==~nMZVbj<7>x%p5vws1yU%5C;{#as9^3yD z1geR64SnC&d%O%XJc6+ppTX$H*{`tVxB-iC8&;q(kDkkCKk+I(hi&GwWixtNQ4uoz3R0-GU>R0n zHHN)Lj}=-hF&K(-Fcw#1626DoScQdXWRoA;VKsI}-;X%a$!7ZxCGZ*%@puw5up0BQ z&FgGtcmk{N40>;4yIxM0V>^t--k6BPF%!pNKIUU7et}i!K<|&)jNc$X_DCiWP2e$1 z#3h)CD=;6oVkv%)Rp_;X0=6?2Fc^DbH1@$n+=iK0g86s^OL2A%OOEfNZxQhripeJl z#1gn|C0&Q9n2inIWSwIltiYGi{t3VLj{bNGBQQFb%?w9i22RF2%*PTO^%f1sb?Eyk zXT2DTM=nL-lOKCyHYQ;q?!pQ@ ziT2Of-q9a>t)}4^h4G&yb2KB6M#Kut#cf!O2e1OY*HFL?wi5Km9vFdP7>}`-hBMw_ z$#E%`;2EsKet9%}Cp#z%#RC|NKVVWafq%S9MqGy_Sb~*!483--y{}_k<4TOiJWRwN zFcWJqA0J*%kKwy$-_5QU{jt{u8jSrh9v{Ip{05Wr3AEqHAi*%K!f5o~!wJTFv>0#2 zSd7OcoQ&Bx9}Dq4EW;A4M*I6L@#mC_p%{U&7@bdk%)o3sn(s_@780l=q6{x#H8%W! z0!p}c!%z&ySWLkrT!q;X$bn`hZupC7>|v%(&ZS3xi|-l zacwez3IdzazRzO$8vU^XBe3g-6oAiT8ZN+Gd;^Pd3s&H1wD0Glvyl9F7e?TGjK|HG zhKDd0Phc@7+diTI0!`6=fE^L~<0_26a~O|zZ=>rl67w((OK>?>;-~2K7036F={Zcq zNIZy%IAA*!;|MIqSFz$Nw*OrO?4`5_{qYh;;M+y4Gu($6cn0(E`cJ4BAI3_YfL>p- z&M_FNC0B&c z4aF?WEFwo~D#v&7IjO9CXSEjclXwK!I(nu*QsaDEXE&1G0o2q$Vgi^OBvX~nvP_vQ zTNJ)JO_?Vbl_c@$467wXSuQckQkkk8lVxE1I!v~9W-+RV$q}@kmWw*Kx%k`)10_W1 zCo#%+nW|*TG9^>CC|l*QazZZN%Hkgpzd)vnC0scuamr~)RVpM$IUz*~FO)0C#d;f@ z*Ceg$`Lia^XtLJVMG!nUyhc8s&%lUh;<%)0%1WK>YbWAY3GYIlVuEE-uJewFwF?xB zpRz;ex3%U=obsNeD%p~wtdt@pL&}xs#M%{J5kG}5H&LcZobrsMD)S{rxj~A+IKNRk zhcP-UJox5V;rjvgHyr(x&m~+bl{n?7q$-CbN7*AqO0kqHn}y#nZp)V%`YBlwuB?$b zWwWFzC6c2wk|L#vlq;>o+8sKHpVCFbl~9RO`beshAUVopDN+ih96YNSWi^a8dpq&G zoi)8%0&Zt+iS$<@WUSI#(v{m~jnZ6pEA8Zz(n>sn;bsW{uZWl$XKyX;_M`Vo&;pxx zQ{5aBuji^@c#ZQOo%66v3uen2|7eY~n@&G}^y)3E;}u&L`KH9yIJfIKpDTMbU*pHv zR&XUA>w7P=@nC3$MrksXLD#>jZUaFDS(QNy<#Q91Qag4xnB|@wr>|CpPot{%Ni~W~l za%%{?%@xw0_<*&%KJUv~B`=~vfF{*;oztL$?$-DK(9n;q$|ugC!P+$%B;yPxNk^YHVt>g>v<_+}?9Ix!9*W_E(z|~*66cygwe--PUEX6+YQ&J>c z*&}hvP)P;PF>jcoxUa0elNHiKcI(_EIi*yHM<_Is0A;ZBhwcmCtZ|NK$7+u`Ubpn_ zvHbXT=2*^b#@XIlb1WZ_tWcIV;$3r0p1mU9HDkGgeC>GceZHZvmTgH9A%djLFaQH)i^oV;&jeDSuwtHtzg|<*vY$gn>oyH5zl)V7y~~xhj;K5bzU>P zgMGMMm8g5DrI$Ws6B{}1-ORyS~*QVe$3M& zj8d0NfRZWwq5CJR9L~ww+-+ABrrj{cy=m*BWYQ$Bw;j%Pnr@F|g}DmbLiUCys3TRQ z%PQolQEc)Rt+-SaYdAHG6F+D;@v|D|o4OTMR>%Y4wwnTe-cjTH+)jk$$E$kYR%E}t zc_g;xrY?G-Fu;*ZnvyImG!4>t@>fWCBbOBt(kIVLOpWR22Sb}K{W6m%cW zCs7{K2Hf^j-P*ff57b2Rr^7Y49hbtj=|ZIU{S;j&G51r-domRQwljCBw)(y+O3_x& zt!s6zA6t+VX|C>4u8bFJKWHp|N(Tv721=YVUQ)qx%J+P-MhkvQ*7jqAPviqJ7M)JH zq9Wb8&eyHY()L_t%2_StZfVjVf~1?`FHzvxro6_};% z&X>z2o#`n)1Bh)SAxfmgC@C^^04MnQlA}`xqzF7u@EM&4b+dX~P7kp0^_tS;0p?DT zZi+>s9w1ApOw}nqlC3cImG|VZvRW=eK-q~JXO@;zc=aOM=GPsv{X1}BD&djj8Y*$h z2uTIc_){FKH1mF08%gum%5I_q-s5vZR_(SESCq;6F{D&tkTDv4smA%Vw*JmjSC=xfZi|oa$jyd7 zYn&4_-NQ0&AhjQ_=F?F+J>i;sZR_&olkY?g`+se9x@;vMKgDsFYB?rdR2qrTAR5uY za5$T3VRB7j4eAPu@5GrY>89wSte0_vD2%HJvIlfp=5Ri(gYNq)vg^S8N8K9858(X< z*-!F@N9_*hDlO%=Q}X8^)D zRhcQvlxec%VfwGRl0`Z6C{&J&ZXc2 z#a}im&1FA$HsF(PW3-H=a%m`w(ocLIVeU2wQGz8#VOOY>$TFo&wm|n^{T$AznsfCv zwNI!UtoCl4*RizeT!n;p*2w3EM-;pC&;Q-@Le zY+0tzFUoK^tZb8u%3$${fkz}nnJzKVaA$zSeRY26XPF*s^J$dZo%`gS9Zv2Mb3H6; zV<`M3*{xY#l~WL~&`MNgY!Y}f`V_Z!Pma)WlUps&eNITf$*Se;;PDpI|+Qqt~ z%ctxyKMh=rbVAX>TXO0$o&lTBq;7i?-*?V!(C4M7Vva*5Zl10gY z5iD8g!w%Qsk_%S(-c!pGddIZ5_J@KFTkd zX*>OXyLNd#tX&@clyyn0!`V{P-63-xXL$-`4W$HJdd%EM4Y?w_?%7_g8*il{yuKo5 zN$%NwBp-dyHTAr-8p-lJH`?KBt1I4mrml9)-mLD@KtFmtUgAdT(0NMs%wy=J5!Fd@ zMzTYRmfg(Z?%*k9iFm}Zm$N+WaDJnWy-Rw>QO$<&{CcZSM_p4*&$?E|->J{GQ{yOw zfvVJ(BE?(E74GGY0`BE010)N;%^q>~ z>K?nbE_)`~f1Jh-jp!mzku0)zFPZLeZq$J{|LT0k+jaXq{cQR6mmJP}HQg#Xt<{!^ zM?6b(Py&=i;dnFx=-(Qlo@$~d1va@@!*x$RN8gsWwv_&_)QgYXq zvzpr?O`hNe61n8h0Inv3@6mk%b?8kchunEDaf!tBlLf?a!L?C&PxdQ$a#q89+HD5a@P0#EzP4ks6=TwO`lX!dXCXPHY^qD#j8{>(^#Z8}%UMl5LYj<$ zr=**bC{fBLnFOAzXPZlKNV3MT1X)bG)=!za1br-)52RdkSj9&Ng0MRUiV4(DWikZ!2tl}-{N|3Bk zddY5OoSb@!O?{p;NnlDeZ(ELgQA)B*Ql`oRB~dmekaCr~?y|nRkH4rhmPq&{TH|}a z-n8`7U?{;A?x23IK2N4TO}cfmOxfU0UdW7h-Ayec_?leQnI-NR-+o+BNXU3%ev}yH zS9i5Z%s45jT1hs+U$q-sH_`%5)^=rub|udwn0>)rn!P_K`rovrKX2k_~G$z(b%IZBnL zX(4CwZT1@~9^guVzPLqqP$$pI&y#JpG(0oM9O;+NO6zAh;vScfXKWp97v{Rh^L6nL z@|cMUt+sv|6IFAi_tSJ^E@6ulJ;PzUafVrlgHkD^yFr9&doj+{?JsAz_j$Sr=I+cJ2W55*{KBelb&1LLHz=N_oc}+V)F>Dliiw=Ya7jZL}#@1 zEPch{9K;&X=cUuww^X|ejE&Yk*HleWMG9TL_NH=rnyzbRwUQ#8)p?#dtBuZTV;v+O z(L_f@6nvS*aoJ84ANdF{~Rm^ud&uR29X_cbo4b=r(z$_MQBiJr2a7gRUjF(bob&#_< ztCKW&fkhu7AuljBOk$wnkcAHCNG)p0Icbz)ShWouax8s<*X*3 zBWCZEY45b*5D=0=@v|gG;a;4QFUwM>j2)6ru|tA}N0*wNQSIuCn>ZWSpHeJE$i9h4Rz-}`ke+XUvoHL(XQ7@UvE>N0D;nd$FbgJ7=X-!WDMT$^l7Lc-XA$ zkRoNflq=iB`Vth1A9!w}O;Nggy;}ynL?0Z}`+O}V}xpNvDVQ@V4X-3@!CMh4v0%fgiRJ>%r z(m>8C=d~TJ>v=!HryHf)Tw?l46nKt!)8YI{yI_M%n@d~T$TFSVO13DBQN=D7!8n&I ztujbsmyir%y(I<$g5Kg|*xE6NuIQNLx?`bsOxkF@JDo#v&v=r%Zj+VC9xbecoYKPD zi^nU_SOOG>KD22eBVS=$U2um}G}a>n`r9#^^KT zCaUH8v7I)S_u?goS+)yn-RB(F6%%)f z3D>1c1rsO5I-j=n6hDP01WJa)DSIVVIVw5x*)VRD-8#kHS>+k=SO6;}U;*>;C5kEI z{JWAhOphr~@#zd%pa~AiMzEcK*E|C%W!4!cUhB`Ws$znh_zOwrA>EYr619->ie;)! z9g<~W{I*WEF65p~Ybn>*c4A!wL&Og}BiEZt9j!~2mhEd|D#7ej_QR0+mB~_Ux zIg7~rCdvY3lx$R@Wxvu#&MHqx6LCd$QzlB3 zvP~v|=Y~xVr-!cQM9C7CaG`9`xfya;*((>7&Em5Z)=CHjWEZd})d4f}>hWdVU$;An z=aDKGS0wklMDoA9xFT5(Dbm86XoUeL`ZCC6cOUDU?)&>zmgprMv8A%F}~Up!Dxnk*+_Q|YF#GX>9}B8T(1uGB)Aww$elixi@bUyI}uot!PFH1S*F z@do5dfU;2fD;Y9Yc|+2b4YEf0NOnWRgP+vyGOOhC4Bbel@(#E(SwWIb(oNwIq7=&{ zWsfXSPRd5*xa?QX>%7+WtETaJ)M6ROp|(*lVeik(!tK&Khn0FzVsfbS*B$0@A@FyZ zK9@Svrt4K}4)gR3A&1@>Bd2sKNjz4~#{Ntd%4mzD``*%@py+Mog_f%F8!6BGFIs)>B@t$Mj0-*l%pEgU@o@t(!ag>T#ky!ydRocTsBz00;7O_Pd{;GxM;e7pN-4%qqOZFbpO=Dt-;mur)X)nu^&hDgz%xLLO zQ%10)DzHe%My4)llGgQO=W^ZhtxVg<@IU*l zWT}6CD_fBh*Tb5!kz7_|&PyFpsnNsR|ba%A2x9 z$(O^>aBFS81b4pr`jrU0&fWO~7Re_4KcGL)ekbFYG%CN7IU0RX)@byF?_`foUMHu_ zNzYBB(#*(Sy#FTZ@szP()R0%_{`Q@$)wwK$&K)F83T$m<`xcwMUe$cQicF_FatRYc zGzXU$@SJy)r!qR4r%3Ouj1;~c!O}%?G(}4(Qh2{oX&~0kV2Gcaa4^msmEPmYrQeL; zE2%oCndB%Pq)73Xa;1@2w?L5iDQzTN@s&8GzN9J*C1(q*>#DSsc2j9|=_20am9sjx zpETJ@eFMIiX$5>-K))E_w6>CMi(sj?v~|5Cf(Ny=Tvrn;))u#}S4eQ1wz_q_GFQ-* zpqgNw#A&SWVqRI)#&fHd;C@{I$|ZPQ7lLvL9&;C#P4I|p`H&`+%VFh`yBXEYsBow8 zUBdZ_E)?5sA=~W_5>rURGwzlpx#qgc%_dmp&R$4xhaA>)?Iq_UDy=4_u?Aa6&_}ig z0gms@4Q};cZ*cmx3uzMf5v8O{spS2t1Oaq z<#k!3Nsh^Wo!TR3m2J}GV}{JJa)9WuM5_s0yk(c)KRySbiz3%frc9JnWt!wD$x@`umvUu^Sc`xkKq#U`Wzt`#%Cu;10=}ku zm~>){%Hy)Oh}Qh5nOoN{Vb1yEa+)Zk>bQ7*g6ED)XXMJT|0k5uK*oYWsyQ0V2NJZ% zylfp$yEVZ+IrRxu?vW;+GF2?yK4q#(X)7Z?V}QoL&TU;u)wzL^ql}j#@O=D7_v09Q zg`EDBv%K}vq?ox!q?>X`qM%_3iCq17=DbWV=2$sImg(%ivPB7!!^-_~Q3;pu&!~3r zr&O!oxG+hlJMwFvV~OTCpAJUl30eCYi}Ic9X0qYuC(KrO{UJYp%2`7-8C#3b4s!IB z5G6ulz_Zs+W>Z?qv|`;0tl&GLBu7*1lp=*=g0fevJE27Ul)VzJuqRcHNvgtisC%kN z;S(JS*RQ*vmG~(QBpi(MC*9Yf@hkN@G*#ztA*}3^B27?zQjX+v*tL_uIK|hC>8J}9 z&)szCJn6QZluIPa%_L=!EKoj_jmlQpudJ4{3afDsd@9`(-fL7okx9ySSpc5-)Ztnq z5wdj;{n%R$>)bBl_j&D()czKqa@T1+t?W-U!+WeULeiB9vPMaf-O5ZkrF87le zC}q7&g3b=Um$46P;_|abZj4Uh3e}$|{T_#Ql@9kOmqyCgFL{tSoasbea}#Cl0e0S% zYxJI$$39A2C;`fw(qAc*vC39S2hVk6bFGXd_n6FIt7k>~HASeLb<<=&Qz6n#iIXVh zQJJ)#<(R9On`!Pld^A#ubgo6p6&^|)fJx$~Y?5%Lk;EyTBo#b;`SM0rtCwo4JMbpn zew{m9&g$G~=5l>(v2*+DD|(;1m|rn>fy5|TGS$s8WwvZlUXsJgTUradcNT4%_>>Zp zrzLaj;U(x*5~DE%GF90n%apCMMR~`av5aKJa#3SG5TCCZ373A8-e1#(AriwRoAgv= zn=Dg`Ws9cy^^6=LjZt+*E@@ic~Ua=d)8Z{u=n}5Zm8&hEY#`a~0R*k!b5yOXnUvT?LdAMu( zOpu(eu?_XR(8(Qty(^Z(`!3f=viO+One)vbY^$fPvv+M$+q4Uv+_mx9hX(ep(z1cQvEG~@+_YVg zyUKRFFs6UOjEx5NE*`Z@!ELAp_MRRo=0c^2pNG9?llW@)GR9ZCmxE#Mp@nt0*HuWn z4mOu%8)U7Ay^Ck{L3cc#T|Dk#@8Pkz#@z`V06pzJrKP96v5fJw2YDPaXYfHXW_TPk zC)rcGCe6O%c1=SXQQMU#o$lI}%GieXt{y42cvs~ql0zzw73L&|-iG#jJm%Z%uDK6M zfS0|e@q^pXRe8Vl6b47m1TqZ<1$vJ_3t_USuNguEc?uL?~3I= z&P!Yc)ozZp@$7lYKwn*xewTYW_PJ)?V3}<|&KN?nCCk_+vJWH6G`5em!H_M4GzKNfItk&!ShHoz zND@Md5D^uPH6+Qmq*5dyNs(lW|NDJjuXnz4zQ6x{Jn->6@AF>HIrp4%&pr2E3v3MK zMa&%*z*xt_>NO6FAkE95Pv&X_H(v}nL49^oj~~geO%1vK-|zkweR9gHe6eZZ^T|t) zzegUYT~GBT=!AxQA@gouzK1xJ5=j)G;WPKAOB2Rk32mMya{=4^6$v|k-sEd?S_+SpgI#Wn6Q}q zLGp{_C&=rPm$?fL-8~(Kb^4}91L10*)Sn2z&ig@>-wgS1pj&_Sn8yssUWSw8i^1{R@h!GQ-2dweJ5ug2;4Vr5@I! zO=n%!1P;=uCy{53v^96kC7(<#ez?Q+fK4QVnO=tVG;9+ozXzP}DZ+@<{A*_?pL|)@ ziUM|icKm-ws*8^Q?_hXW`i})=fGeC+v;Xh7QAv12AVaJ-p41Q?BgNI_FBF&T(Q?N) z;ia{nuAq3!lP?#ZU*r=2jPjS>hGCuA>+!4buqwLL6bU`RgPP)i@>`|Bbq|Oh3&_h{ z&TJrqJmUsx(i~LJra{nSz1|G+OLsNO??lbhZIX~*z5#e|_6~T$p`TuT7IZ&AL*B%P}Jq!__b|hP*@}$S*z)`5xpg91qgV6^qK(yQlm|o%rM} zWNt~JHRM&jI?Ym8`#!mx;5C*xU0S&6*_sYL);2~7M>C&Gi7cBTVXfphm5`kFfz1c# zL6n^9$`eeS-x;d=$EciX}UL_geeN!(A#t(O71*4%I%c z3QPgFcKaN8LCTw>ZwS9r2lZxWS1NC&>pCL!8W=%@Ygy4=6a-wU75&D@< zIjoYB$^A0iNj{McBgW;Dt?aP~y$u()BFPiT6OXA~>9q9WIXwnRf*QX0GaQm0*BvjB z&qxco|L1mp%iBrFZgMtd`K2x-Pl7~EN{o_|#c`g4b;#c)U%UbG_*)*9 zBA-7V#A@Z<8qjl#Q|0N@^E`MsIK&>UH4~;XL;E>UWYxHmd>KEQZs*`W^6F<0`e5q0 zN`CY%=&|apClP936PGKOc2$5G#xf!I3}mn#P(R+L8H!cO?9fxfwVf2J2E$fDqbUF7 zRLHNP{yepz=U{R0{mR9Dkj8{3c{O95!V>b_HIcz0C@Y?+VgCj|W#Q`RFc+CT2tmU= z$PY3w)1yxZ%V3-*u#c+(HzHb|BkH8bqm4MhuRplm%D*tP)N>Ubpix?bS&Uw34X`BOgQFtqk~h@+;(vuOOuR$m1Iz;AZzbE*C>g z=)i=SO(92Y2uu^MhC_K^;Bm@-PW~hVu)5D7*;RfQ=bfb}UxxhkxzHoo

ACQz&zTK9PBM(I)p)2{}H^6%U2g8+z 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 z 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

Zog86(3Ih6{> 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 Date: Sat, 25 Jun 2016 19:31:09 -0300 Subject: [PATCH 10/87] Bug fix Previously the memory cleanup of Arguments was commented as a workaround but now it has been permanently corrected. 1. The delete lines have been uncommented, 2. Each argument from a generated workflow was cloned, thereby not having the same reference for Arguments being used by multiple stages. --- runtime/PipelineComponentBase.cpp | 9 +++------ .../PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp | 6 ++++-- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/runtime/PipelineComponentBase.cpp b/runtime/PipelineComponentBase.cpp index d99b465..838c068 100644 --- a/runtime/PipelineComponentBase.cpp +++ b/runtime/PipelineComponentBase.cpp @@ -36,14 +36,11 @@ PipelineComponentBase::~PipelineComponentBase() { ArgumentBase *aux = this->arguments.back(); this->arguments.pop_back(); if (aux->getIo() == ArgumentBase::input) { - std::cout << __FILE__ << ":" << __LINE__ <<" TODO: remove argument" << aux->getId() << - ":" << aux->getName() << " only when no other stage needs it" << std::endl; - // std::cout << "[PipelineComponentBase] deleting input " << aux->getName() << std::endl; - // delete aux; + std::cout << "[PipelineComponentBase] deleting input " << aux->getName() << std::endl; + delete aux; } } - std::cout << __FILE__ << ":" << __LINE__ << "TODO: free resultData if needed" << std::endl; - // if(resultData != NULL) free(resultData); + if(resultData != NULL) free(resultData); } void PipelineComponentBase::addArgument(ArgumentBase *arg) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 0c9d058..c8c42bc 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -852,7 +852,8 @@ void add_arguments_to_stages(map &merged_stages, for (pair stage : merged_stages) { // add input arguments to stage, adding them as RT as needed for (int arg_id : stage.second->getInputs()) { - stage.second->addArgument(merged_arguments[arg_id]); + ArgumentBase* new_arg = merged_arguments[arg_id]->clone(); + stage.second->addArgument(new_arg); if (merged_arguments[arg_id]->getType() == ArgumentBase::RT) { // cout << "input RT : " << merged_arguments[arg_id]->getName() << endl; // insert the region template on the parent stage if the argument is a DR and if the RT wasn't already added @@ -865,7 +866,8 @@ void add_arguments_to_stages(map &merged_stages, // add output arguments to stage, adding them as RT as needed for (int arg_id : stage.second->getOutputs()) { - stage.second->addArgument(merged_arguments[arg_id]); + ArgumentBase* new_arg = merged_arguments[arg_id]->clone(); + stage.second->addArgument(new_arg); if (merged_arguments[arg_id]->getType() == ArgumentBase::RT) { // cout << "output RT : " << merged_arguments[arg_id]->getName() << endl; // insert the region template on the parent stage if the argument is a DR and if the RT wasn't already added From 7b9d1ac509bd4bb898ecd209dab7da4dec02613c Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Tue, 12 Jul 2016 21:46:14 -0300 Subject: [PATCH 11/87] Bug Fix: Corrected dependency setting on PipelineManager. The parent field of ArgumentBase was not being set, thereby, the dependencies weren't being set as well. Tested also with multiple values for one given parameter. Still not working with np 3 --- runtime/Argument.cpp | 6 +--- .../RTPipelineComponentBase.cpp | 8 +++++ .../regiontemplates/RTPipelineComponentBase.h | 3 ++ runtime/regiontemplates/RegionTemplate.cpp | 10 ++++++ runtime/regiontemplates/RegionTemplate.h | 2 ++ .../PipelineManager.cpp | 32 +++++++++++++------ 6 files changed, 47 insertions(+), 14 deletions(-) diff --git a/runtime/Argument.cpp b/runtime/Argument.cpp index bae7099..b68b1e6 100644 --- a/runtime/Argument.cpp +++ b/runtime/Argument.cpp @@ -8,7 +8,7 @@ #include "Argument.h" #include -ArgumentBase::ArgumentBase(int type) : io(ArgumentBase::input) { +ArgumentBase::ArgumentBase(int type) : io(ArgumentBase::input), parent(0) { this->type=type; } @@ -521,8 +521,6 @@ int ArgumentRT::serialize(char *buff) { memcpy(buff+serialized_bytes, &isFileInput, sizeof(bool)); serialized_bytes+=sizeof(bool); - std::cout << "[ArgumentRT] serialized arg " << this->getName() << " with value " << this->getArgValue() << " and size " << this->size() << std::endl; - return serialized_bytes; } @@ -577,8 +575,6 @@ int ArgumentRT::deserialize(char *buff) { // init argument value from string extracted this->setArgValue(string_value); - std::cout << "[ArgumentRT] deserialized arg " << this->getName() << " with value " << this->getArgValue() << " and size " << this->size() << std::endl; - // return total number of bytes extracted from message return deserialized_bytes; } diff --git a/runtime/regiontemplates/RTPipelineComponentBase.cpp b/runtime/regiontemplates/RTPipelineComponentBase.cpp index d5664e0..b63de44 100644 --- a/runtime/regiontemplates/RTPipelineComponentBase.cpp +++ b/runtime/regiontemplates/RTPipelineComponentBase.cpp @@ -7,6 +7,14 @@ #include "RTPipelineComponentBase.h" +void RTPipelineComponentBase::getRT() { + for (std::map::iterator i = regionTemplates.begin(); i!=regionTemplates.end();i++) { + i->second->printRT(); + std::cout << std::endl; + } + +}; + RTPipelineComponentBase::RTPipelineComponentBase() { this->setType(PipelineComponentBase::RT_COMPONENT_BASE); this->cache = NULL; diff --git a/runtime/regiontemplates/RTPipelineComponentBase.h b/runtime/regiontemplates/RTPipelineComponentBase.h index 602543c..f37ca84 100644 --- a/runtime/regiontemplates/RTPipelineComponentBase.h +++ b/runtime/regiontemplates/RTPipelineComponentBase.h @@ -39,6 +39,9 @@ class RTPipelineComponentBase : public PipelineComponentBase { void setLocation(int location); public: + + void getRT(); + RTPipelineComponentBase(); virtual ~RTPipelineComponentBase(); diff --git a/runtime/regiontemplates/RegionTemplate.cpp b/runtime/regiontemplates/RegionTemplate.cpp index 74887a9..2c22377 100644 --- a/runtime/regiontemplates/RegionTemplate.cpp +++ b/runtime/regiontemplates/RegionTemplate.cpp @@ -7,6 +7,16 @@ #include "RegionTemplate.h" +void RegionTemplate::printRT() { + for (std::map >::iterator r = templateRegions.begin(); r!=templateRegions.end(); r++) { + cout << "RT: " << r->first << endl; + for (std::list::iterator d = r->second.begin(); d!=r->second.end(); d++) { + cout << "\tDR: " << (*d)->getName() << endl; + } + } +} + + RegionTemplate::RegionTemplate() { // lazyRead = false; this->setLazyRead(false); diff --git a/runtime/regiontemplates/RegionTemplate.h b/runtime/regiontemplates/RegionTemplate.h index d794f56..bba8473 100644 --- a/runtime/regiontemplates/RegionTemplate.h +++ b/runtime/regiontemplates/RegionTemplate.h @@ -92,6 +92,8 @@ class RegionTemplate { bool isLazyRead() const; void setLazyRead(bool lazyRead); + void printRT(); + }; #ifdef MATLAB_INTEGRATION diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index c8c42bc..02fa7a9 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -76,6 +76,7 @@ string get_workflow_field(FILE* workflow, string field); void get_workflow_arguments(FILE* workflow, list &output_arguments); vector get_all_fields(FILE* workflow, string start, string end); PipelineComponentBase* find_stage(map stages, string name); +int find_stage_id(map stages, string name); ArgumentBase* find_argument(const map arguments, string name); ArgumentBase* new_typed_arg_base(string type); parsing::port_type_t get_port_type(string s); @@ -150,13 +151,12 @@ int main(int argc, char* argv[]) { for (pair a : interstage_arguments) all_argument[a.first] = a.second; - // cout << endl << "all_arguments:" << endl; // mapprint(all_argument); - // cout << endl << "deps:" << endl; - // for (pair> p : deps) - // for (int d : p.second) - // cout << "\t" << base_stages[p.first]->getName() << " depends on " << base_stages[d]->getName() << endl; + cout << endl << "all_arguments:" << endl; + for (pair p : all_argument) { + cout << p.second->getId() << ":" << p.second->getName() << " parent " << p.second->getParent() << endl; + } // cout << endl << "connected base_stages:" << endl; // for (pair p : base_stages) { @@ -217,10 +217,10 @@ int main(int argc, char* argv[]) { // add all stages to manager cout << endl << "executeComponent" << endl; for (pair s : expanded_stages) { - cout << "sent component " << s.second->getName() << " to execute with args:" << endl; + cout << "sent component " << s.second->getId() << ":" << s.second->getName() << " to execute with args:" << endl; cout << "\tinputs: " << endl; for (int i : s.second->getInputs()) - cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " << expanded_args[i]->toString() << endl; + cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " << expanded_args[i]->toString() << " parent " << expanded_args[i]->getParent() << endl; cout << "\toutputs: " << endl; for (int i : s.second->getOutputs()) cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " << expanded_args[i]->toString() << endl; @@ -604,7 +604,9 @@ void connect_stages_from_file(FILE* workflow_descriptor, // if the source is another stage deps[sink_stg->getId()].emplace_back(find_stage(base_stages, all_source_fields[0].data)->getId()); arg = find_argument(interstage_arguments, all_source_fields[1].data); - // cout << "source from stage " << all_source_fields[0].data << " is " << arg->getId() << ":" << arg->getName() << endl; + arg->setParent(find_stage(base_stages, all_source_fields[0].data)->getId()); + cout << "source from stage " << all_source_fields[0].data << " is " << arg->getId() << ":" + << arg->getName() << " parent " << arg->getParent() << endl; } // add the link to the sink stage @@ -754,6 +756,7 @@ void expand_stages(const map &args, ArgumentBase* ab_cpy = args.at(out_id)->clone(); ab_cpy->setName(args.at(out_id)->getName()); ab_cpy->setId(new_id); + ab_cpy->setParent(pt->getId()); pt->replaceOutput(out_id, new_id); temp.emplace_back(ab_cpy); } @@ -813,6 +816,7 @@ void expand_stages(const map &args, // add a copy of the old arg with the correct id to the final map for each repeated output for (ArgumentBase* a : l) { ArgumentBase* temp = old_arg->clone(); + temp->setParent(old_arg->getParent()); temp->setId(a->getId()); workflow_outputs[temp->getId()] = temp; } @@ -861,7 +865,10 @@ void add_arguments_to_stages(map &merged_stages, ((RTPipelineComponentBase*)stage.second)->addRegionTemplateInstance(rt, rt->getName()); ((RTPipelineComponentBase*)stage.second)->addInputOutputDataRegion(rt->getName(), merged_arguments[arg_id]->getName(), RTPipelineComponentBase::INPUT); } - ((RTPipelineComponentBase*)stage.second)->addDependency(merged_arguments[arg_id]->getParent()); + if (merged_arguments[arg_id]->getParent() != 0) { + cout << "Dependency: " << stage.second->getId() << ":" << stage.second->getName() << " ->addDependency( " << merged_arguments[arg_id]->getParent() << " )" << endl; + ((RTPipelineComponentBase*)stage.second)->addDependency(merged_arguments[arg_id]->getParent()); + } } // add output arguments to stage, adding them as RT as needed @@ -1018,6 +1025,13 @@ PipelineComponentBase* find_stage(map stages, strin return NULL; } +int find_stage_id(map stages, string name) { + for (pair p : stages) + if (p.second->getName().compare(name) == 0) + return p.first; + return -1; +} + ArgumentBase* find_argument(const map arguments, string name) { for (pair p : arguments) if (p.second->getName().compare(name) == 0) From 77b2ae693b9d79c662e8e4b3daa54a7f6950850f Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Wed, 13 Jul 2016 13:21:08 -0300 Subject: [PATCH 12/87] Bug Fix: The ID used to enforce dependency wasn't comming from the Task object, but from PipelineComponentBase. By only using the Task ID the application is now working with any np value and also with multiple parameter values. --- .../PipelineManager.cpp | 35 ++++++++++++------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 02fa7a9..6e38bc8 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -146,7 +146,8 @@ int main(int argc, char* argv[]) { map> deps; // connect the stages inputs/outputs - connect_stages_from_file(workflow_descriptor, base_stages, interstage_arguments, workflow_inputs, deps, workflow_outputs); + connect_stages_from_file(workflow_descriptor, base_stages, + interstage_arguments, workflow_inputs, deps, workflow_outputs); map all_argument(workflow_inputs); for (pair a : interstage_arguments) all_argument[a.first] = a.second; @@ -155,7 +156,8 @@ int main(int argc, char* argv[]) { cout << endl << "all_arguments:" << endl; for (pair p : all_argument) { - cout << p.second->getId() << ":" << p.second->getName() << " parent " << p.second->getParent() << endl; + cout << p.second->getId() << ":" << p.second->getName() + << " parent " << p.second->getParent() << endl; } // cout << endl << "connected base_stages:" << endl; @@ -182,7 +184,8 @@ int main(int argc, char* argv[]) { map expanded_args; map expanded_stages; - expand_stages(args, parameters_values, expanded_args, base_stages, expanded_stages, workflow_outputs); + expand_stages(args, parameters_values, expanded_args, + base_stages, expanded_stages, workflow_outputs); cout << endl<< "merged: " << endl; for (pair p : expanded_stages) { @@ -197,7 +200,8 @@ int main(int argc, char* argv[]) { cout << endl << "merged args" << endl; for (pair p : expanded_args) - cout << "\t" << p.first << ":" << p.second->getName() << " = " << p.second->toString() << " sized: " << p.second->size() << endl; + cout << "\t" << p.first << ":" << p.second->getName() << " = " + << p.second->toString() << " sized: " << p.second->size() << endl; //------------------------------------------------------------ // Add workflows to Manager to be executed @@ -217,13 +221,16 @@ int main(int argc, char* argv[]) { // add all stages to manager cout << endl << "executeComponent" << endl; for (pair s : expanded_stages) { - cout << "sent component " << s.second->getId() << ":" << s.second->getName() << " to execute with args:" << endl; + cout << "sent component " << s.second->getId() << ":" + << s.second->getName() << " to execute with args:" << endl; cout << "\tinputs: " << endl; for (int i : s.second->getInputs()) - cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " << expanded_args[i]->toString() << " parent " << expanded_args[i]->getParent() << endl; + cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " + << expanded_args[i]->toString() << " parent " << expanded_args[i]->getParent() << endl; cout << "\toutputs: " << endl; for (int i : s.second->getOutputs()) - cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " << expanded_args[i]->toString() << endl; + cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " + << expanded_args[i]->toString() << endl; sysEnv.executeComponent(s.second); } @@ -756,7 +763,7 @@ void expand_stages(const map &args, ArgumentBase* ab_cpy = args.at(out_id)->clone(); ab_cpy->setName(args.at(out_id)->getName()); ab_cpy->setId(new_id); - ab_cpy->setParent(pt->getId()); + ab_cpy->setParent(((Task*)pt)->getId()); pt->replaceOutput(out_id, new_id); temp.emplace_back(ab_cpy); } @@ -861,12 +868,15 @@ void add_arguments_to_stages(map &merged_stages, if (merged_arguments[arg_id]->getType() == ArgumentBase::RT) { // cout << "input RT : " << merged_arguments[arg_id]->getName() << endl; // insert the region template on the parent stage if the argument is a DR and if the RT wasn't already added - if (((RTPipelineComponentBase*)stage.second)->getRegionTemplateInstance(rt->getName()) == NULL) + if (((RTPipelineComponentBase*)stage.second)-> + getRegionTemplateInstance(rt->getName()) == NULL) ((RTPipelineComponentBase*)stage.second)->addRegionTemplateInstance(rt, rt->getName()); - ((RTPipelineComponentBase*)stage.second)->addInputOutputDataRegion(rt->getName(), merged_arguments[arg_id]->getName(), RTPipelineComponentBase::INPUT); + ((RTPipelineComponentBase*)stage.second)->addInputOutputDataRegion( + rt->getName(), merged_arguments[arg_id]->getName(), RTPipelineComponentBase::INPUT); } if (merged_arguments[arg_id]->getParent() != 0) { - cout << "Dependency: " << stage.second->getId() << ":" << stage.second->getName() << " ->addDependency( " << merged_arguments[arg_id]->getParent() << " )" << endl; + cout << "Dependency: " << stage.second->getId() << ":" << stage.second->getName() + << " ->addDependency( " << merged_arguments[arg_id]->getParent() << " )" << endl; ((RTPipelineComponentBase*)stage.second)->addDependency(merged_arguments[arg_id]->getParent()); } } @@ -880,7 +890,8 @@ void add_arguments_to_stages(map &merged_stages, // insert the region template on the parent stage if the argument is a DR and if the RT wasn't already added if (((RTPipelineComponentBase*)stage.second)->getRegionTemplateInstance(rt->getName()) == NULL) ((RTPipelineComponentBase*)stage.second)->addRegionTemplateInstance(rt, rt->getName()); - ((RTPipelineComponentBase*)stage.second)->addInputOutputDataRegion(rt->getName(), merged_arguments[arg_id]->getName(), RTPipelineComponentBase::OUTPUT); + ((RTPipelineComponentBase*)stage.second)->addInputOutputDataRegion(rt->getName(), + merged_arguments[arg_id]->getName(), RTPipelineComponentBase::OUTPUT); } } } From 797b951ae6392dcf42824acb0c07acb0930d10d2 Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Tue, 2 Aug 2016 17:54:22 -0300 Subject: [PATCH 13/87] Expanded the PCB class to have a list of ReusableTask. Also, the clonning of PCB now incorporates the ReusableTask list. System is compiling and working. --- runtime/CMakeLists.txt | 5 +- runtime/PipelineComponentBase.cpp | 77 ++++++++++++++++++++++ runtime/PipelineComponentBase.h | 7 ++ runtime/ResourceManager/Task.h | 11 ++++ runtime/ReusableTask.cpp | 81 ++++++++++++++++++++++++ runtime/ReusableTask.hpp | 88 ++++++++++++++++++++++++++ runtime/regiontemplates/CMakeLists.txt | 2 + 7 files changed, 270 insertions(+), 1 deletion(-) create mode 100644 runtime/ReusableTask.cpp create mode 100644 runtime/ReusableTask.hpp diff --git a/runtime/CMakeLists.txt b/runtime/CMakeLists.txt index e539282..68d840b 100644 --- a/runtime/CMakeLists.txt +++ b/runtime/CMakeLists.txt @@ -1,10 +1,13 @@ cmake_minimum_required(VERSION 2.6) project(Runtime) + # The version number set(Runtime_VERSION_MAJOR 1) set(Runtime_VERSION_MINOR 0) +add_definitions( -ggdb -gdwarf-2 ) + IF(NOT CMAKE_BUILD_TYPE) SET(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel." @@ -40,7 +43,7 @@ else(USE_CUDA) endif(USE_CUDA) # Source files used by the Runtime System -set( libsyssrcs SysEnv.cpp Worker.cpp Manager.cpp Argument.cpp PipelineComponentBase.cpp CallBackComponentExecution.cpp ./util/Util.cpp ./util/DataPack.cpp ) +set( libsyssrcs SysEnv.cpp Worker.cpp Manager.cpp Argument.cpp PipelineComponentBase.cpp CallBackComponentExecution.cpp ./util/Util.cpp ./util/DataPack.cpp ReusableTask.cpp ) set( libname runtimesystem ) diff --git a/runtime/PipelineComponentBase.cpp b/runtime/PipelineComponentBase.cpp index 838c068..709ddbf 100644 --- a/runtime/PipelineComponentBase.cpp +++ b/runtime/PipelineComponentBase.cpp @@ -22,6 +22,11 @@ PipelineComponentBase::PipelineComponentBase(){ this->resultData = NULL; // this->input_arguments = new std::list(); // this->output_arguments = new std::list(); + + // TEST: REMOVE AFTER + ReusableTask* t = new ReusableTestTask(); + t->setTaskName("ReusableTestTask"); + tasks[10] = t; } PipelineComponentBase::~PipelineComponentBase() { @@ -144,6 +149,24 @@ int PipelineComponentBase::size() for(int i = 0; i < this->getArgumentsSize(); i++){ size_bytes+=this->getArgument(i)->size(); } + + // add the number of tasks + size_bytes += sizeof(int); + + for(map::iterator p=this->tasks.begin(); p!=this->tasks.end(); p++){ + // add the task id + size_bytes += sizeof(int); + + // add the task name size + size_bytes += sizeof(int); + + // add the task name + size_bytes += p->second->getTaskName().size() * sizeof(char); + + // add the task size + size_bytes += p->second->size(); + } + return size_bytes; } @@ -184,6 +207,31 @@ int PipelineComponentBase::serialize(char *buff) serialized_bytes += this->getArgument(i)->serialize(buff+serialized_bytes); } + // Copy the number of tasks + int number_tasks = this->tasks.size(); + memcpy(buff+serialized_bytes, &number_tasks, sizeof(int)); + serialized_bytes+=sizeof(int); + + // serialize each of the tasks + for(map::iterator p=this->tasks.begin(); p!=this->tasks.end(); p++){ + // Copy the task id + int id = p->first; + memcpy(buff+serialized_bytes, &id, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy the task name size + int task_name_size = p->second->getTaskName().size(); + memcpy(buff+serialized_bytes, &task_name_size, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy the task name + memcpy(buff+serialized_bytes, p->second->getTaskName().c_str(), task_name_size*sizeof(char) ); + serialized_bytes+=task_name_size*sizeof(char); + + // copy the task + serialized_bytes += p->second->serialize(buff+serialized_bytes); + } + // std::cout << "PipelineComponentBase::serialize" << std::endl; return serialized_bytes; } @@ -278,6 +326,35 @@ int PipelineComponentBase::deserialize(char *buff) this->addArgument(arg); } + + // deserialize the number of tasks + int number_tasks = ((int*)(buff+deserialized_bytes))[0]; + deserialized_bytes+=sizeof(int); + + // deserialize the tasks + for (int i=0; isetTaskName(task_name_s); + // deserialized_bytes += task->deserialize(buff+deserialized_bytes); + // this->tasks[id] = task; + } + // std::cout << "PipelineComponentBase::deserialize" << std::endl; return deserialized_bytes; diff --git a/runtime/PipelineComponentBase.h b/runtime/PipelineComponentBase.h index d427d87..d205316 100644 --- a/runtime/PipelineComponentBase.h +++ b/runtime/PipelineComponentBase.h @@ -15,6 +15,7 @@ #include "Argument.h" #include "Task.h" +#include "ReusableTask.hpp" //#include "Worker.h" //#include "Manager.h" @@ -25,6 +26,7 @@ class PipelineComponentBase; class Manager; +class ReusableTask; // Define factory function type that creates objects of type PipelineComponentBase and its subclasses @@ -162,6 +164,11 @@ class PipelineComponentBase: public Task { void replaceInput(int old_a, int new_a); void replaceOutput(int old_a, int new_a); + // a map of all tasks ID used by the stage and the list of arguments for each task + std::map > tasksDesc; + + std::map tasks; + // Factory class is used to build "reflection", and instantiate objects of // PipelineComponentBase subclasses that register with it class ComponentFactory{ diff --git a/runtime/ResourceManager/Task.h b/runtime/ResourceManager/Task.h index 17c019f..e193f4e 100644 --- a/runtime/ResourceManager/Task.h +++ b/runtime/ResourceManager/Task.h @@ -66,6 +66,9 @@ class Task { // during the execution to an object of type CallBackTask. bool callBackDepsReady; + // used to get the task type on FGO + std::string taskName; + public: Task(); @@ -132,6 +135,14 @@ class Task { this->status = status; } + std::string getTaskName () { + return taskName; + } + + void setTaskName (std::string taskName) { + this->taskName = taskName; + } + }; class CallBackTaskBase: public Task { diff --git a/runtime/ReusableTask.cpp b/runtime/ReusableTask.cpp new file mode 100644 index 0000000..0106432 --- /dev/null +++ b/runtime/ReusableTask.cpp @@ -0,0 +1,81 @@ +/* + * ReusableTask.cpp + * + * Created on: Aug 1, 2016 + * Author: willian + */ + +#include "ReusableTask.hpp" + +// Stuff related to the task factory +std::map ReusableTask::ReusableTaskFactory::factoryMap1; +std::map ReusableTask::ReusableTaskFactory::factoryMap2; + +bool ReusableTask::ReusableTaskFactory::taskRegister(std::string name, task_factory_t1 *filterFactory1, task_factory_t2 *filterFactory2) +{ + factoryMap1.insert(std::pair(name, filterFactory1) ); + factoryMap2.insert(std::pair(name, filterFactory2) ); + return true; +} + +task_factory_t1 *ReusableTask::ReusableTaskFactory::getTaskFactory1(std::string name) +{ + task_factory_t1* factoryRet = NULL; + std::map::iterator map_it; + map_it = factoryMap1.find(name); + + if(map_it!=factoryMap1.end()){ + factoryRet = map_it->second; + } +// std::cout << "factoryMap1.size()="<< factoryMap1.size() < args, RegionTemplate* inputRt) +{ + ReusableTask* t = NULL; + task_factory_t1* factoryFunction = ReusableTask::ReusableTaskFactory::getTaskFactory1(name); + if(factoryFunction != NULL){ + t = factoryFunction(args, inputRt); + } + return t; +} + +task_factory_t2 *ReusableTask::ReusableTaskFactory::getTaskFactory2(std::string name) +{ + task_factory_t2* factoryRet = NULL; + std::map::iterator map_it; + map_it = factoryMap2.find(name); + + if(map_it!=factoryMap2.end()){ + factoryRet = map_it->second; + } +// std::cout << "factoryMap2.size()="<< factoryMap2.size() < args, RegionTemplate* inputRt) { + return new ReusableTestTask(args, inputRt); +} + +// Create the task factory +ReusableTask* taskFactorySegmentation2() { + return new ReusableTestTask(); +} + +// register factory with the runtime system +bool registeredSegmentationTask = ReusableTask::ReusableTaskFactory::taskRegister("ReusableTestTask", &taskFactorySegmentation1, &taskFactorySegmentation2); diff --git a/runtime/ReusableTask.hpp b/runtime/ReusableTask.hpp new file mode 100644 index 0000000..682d0b8 --- /dev/null +++ b/runtime/ReusableTask.hpp @@ -0,0 +1,88 @@ +/* + * ReusableTask.hpp + * + * Created on: Jul 18, 2016 + * Author: willian + */ + +#ifndef REUSABLE_TASK_H_ +#define REUSABLE_TASK_H_ + +#include + +#include "Task.h" +#include "Argument.h" +#include "RegionTemplate.h" + + +// Define factory function type that creates objects of type ReusableTask and its subclasses +class ReusableTask; +class RegionTemplate; +typedef ReusableTask* (task_factory_t1)(list args, RegionTemplate* inputRt); +typedef ReusableTask* (task_factory_t2)(); + +class ReusableTask: public Task { + +public: + ReusableTask() {}; + + virtual bool reusable(ReusableTask* t) = 0; + + // Write component data to a buffer + virtual int serialize(char *buff) = 0; + + // Initialize component data from a buffer generated by serialize function + virtual int deserialize(char *buff) = 0; + + virtual ReusableTask* clone() = 0; + + virtual int size() = 0; + + + // Factory class is used to build "reflection", and instantiate objects of + // ReusableTask subclasses that register with it + class ReusableTaskFactory { + private: + // This maps name of task types to the function that creates instances of those components + static std::map factoryMap1; + static std::map factoryMap2; + + public: + // Used to register the task factory function with this factory class + static bool taskRegister(std::string name, task_factory_t1 *compFactory1, task_factory_t2 *compFactory2); + + // Retrieve pointer to function that creates task registered with name="name" + static task_factory_t1 *getTaskFactory1(std::string name); + static task_factory_t2 *getTaskFactory2(std::string name); + + // Retrieve instance of task registered as "name" + static ReusableTask *getTaskFromName(std::string name, list args, RegionTemplate* inputRt); + + // constructor used only on PipelineComponentBase clone method + static ReusableTask *getTaskFromName(std::string name); + // ExecutionEngine *getResourceManager() const; + }; + +}; + + +class ReusableTestTask: public ReusableTask { + +public: + ReusableTestTask() {}; + ReusableTestTask(list args, RegionTemplate* inputRt) {}; + + bool reusable(ReusableTask* t) {return false;}; + + // Write component data to a buffer + int serialize(char *buff) {return 0;}; + + // Initialize component data from a buffer generated by serialize function + int deserialize(char *buff) {return 0;}; + + ReusableTask* clone() {return NULL;}; + + int size() {return 0;}; +}; + +#endif /* REUSABLE_TASK_H_ */ diff --git a/runtime/regiontemplates/CMakeLists.txt b/runtime/regiontemplates/CMakeLists.txt index 1a340ce..c599e76 100644 --- a/runtime/regiontemplates/CMakeLists.txt +++ b/runtime/regiontemplates/CMakeLists.txt @@ -1,6 +1,8 @@ cmake_minimum_required(VERSION 2.6) project(RegionTemplate) +add_definitions( -ggdb -gdwarf-2 ) + # The version number set(RegionTemplates_VERSION_MAJOR 1) set(RegionTemplates_VERSION_MINOR 0) From 3a70395432c6f6181761cc086d59047914c8e3c8 Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Tue, 2 Aug 2016 18:05:31 -0300 Subject: [PATCH 14/87] Included fine-grain merging algorithm. Fine-grain merging algorithm still not integrated/used. System compiling and working. --- runtime/ResourceManager/Task.h | 6 +- .../MergableStage.hpp | 19 +++ .../PipelineManager.cpp | 118 ++++++++++++++++++ 3 files changed, 140 insertions(+), 3 deletions(-) create mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/MergableStage.hpp diff --git a/runtime/ResourceManager/Task.h b/runtime/ResourceManager/Task.h index e193f4e..8ffadbc 100644 --- a/runtime/ResourceManager/Task.h +++ b/runtime/ResourceManager/Task.h @@ -57,9 +57,6 @@ class Task { // Pointer to the Execution Engine that is responsible for this task. ExecutionEngine *curExecEngine; - // Simple setter for the task id - void setId(int id); - // This bool variable says whether the all dependencies that were to be associated to // this task have already being associated. It is only used by the CallBackTaskClass. // However, it has to be defined here because we can't typecast the Task pointer available @@ -120,6 +117,9 @@ class Task { // Interface implemented by the end user virtual bool run(int procType=ExecEngineConstants::GPU, int tid=0); + // Simple setter for the task id + void setId(int id); + // Other simple getters and setters int getId() const; int getTaskType() const; diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/MergableStage.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/MergableStage.hpp new file mode 100644 index 0000000..7a520e5 --- /dev/null +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/MergableStage.hpp @@ -0,0 +1,19 @@ +/* + * MergableStage.hpp + * + * Created on: Jul 18, 2016 + * Author: willian + */ + +#ifndef MERGABLE_STAGE_H_ +#define MERGABLE_STAGE_H_ + +class MergableStage { + +public: + MergableStage() {}; + + virtual void merge(MergableStage &s) = 0; +}; + +#endif /* MERGABLE_STAGE_H_ */ diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 6e38bc8..31e2c37 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -13,6 +13,8 @@ #include "PipelineComponentBase.h" #include "RTPipelineComponentBase.h" #include "RegionTemplateCollection.h" +#include "ReusableTask.hpp" +#include "MergableStage.hpp" using namespace std; @@ -830,6 +832,122 @@ void expand_stages(const map &args, } } +ArgumentBase* find_argument(PipelineComponentBase* p, string name, map expanded_args) { + for(int i : p->getInputs()){ + if (expanded_args[i]->getName().compare(name) == 0) { + return expanded_args[i]; + } + } + for(int i : p->getOutputs()){ + if (expanded_args[i]->getName().compare(name) == 0) { + return expanded_args[i]; + } + } + + return NULL; +} + +// This function assumes that the merged PCB has at least, but not limited to one ReusableTask on tasks +// of type task_name. Also, to_merge must have exactly one ReusableTask of type task_name. These +// conditions are not checked. +bool exists_reusable_task(PipelineComponentBase* merged, PipelineComponentBase* to_merge, string task_name) { + // get the only task of to_merge that has the type task_name + ReusableTask* to_merge_task = NULL; + for (pair t : to_merge->tasks) + if (t.second->getTaskName().compare(task_name) == 0) + to_merge_task = t.second; + + for (pair t : merged->tasks) + if (t.second->getTaskName().compare(task_name) == 0 && + to_merge_task->reusable(t.second)) + return true; + + return false; +} + +// for the meantime the mearging will happen whenever at least the first task is reusable +bool merging_condition(PipelineComponentBase* merged, PipelineComponentBase* to_merge) { + // check if the first task is reusable + pair> m = *merged->tasksDesc.begin(); + pair> n = *to_merge->tasksDesc.begin(); + + if (m.first.compare(n.first) == 0 && exists_reusable_task(merged, to_merge, m.first)) + return true; + else + return false; +} + +// filters all the stages from an input map by the stage's name +void filter_stages(const map &all_stages, + string stage_name, list &filtered_stages) { + + for (pair p : all_stages) + if (p.second->getName().compare(stage_name) == 0) + filtered_stages.emplace_back(p.second); +} + +map task_generator(map> &tasks_desc, + PipelineComponentBase* p, RegionTemplate* rt, map expanded_args) { + + map tasks; + + for (pair> t : tasks_desc) { + // get task args + list args; + for (ArgumentBase* a : t.second) { + ArgumentBase* aa = find_argument(p, a->getName(), expanded_args); + if (aa != NULL) + args.emplace_back(aa); + } + + // call constructor + int uid = new_uid(); + tasks[uid] = ReusableTask::ReusableTaskFactory::getTaskFromName(t.first, args, rt); + tasks[uid]->setId(uid); + tasks[uid]->setTaskName(t.first); + } + + return tasks; +} + +void merge_stages_fine_grain(const map &all_stages, + const map &stages_ref, map &merged_stages, + RegionTemplate* rt, map expanded_args) { + + // attempt merging for each stage type + for (pair ref : stages_ref) { + // get only the stages from the current stage_ref + list current_ref_stages; + filter_stages(all_stages, ref.second->getName(), current_ref_stages); + + // attempt to merge all current stages + while (!current_ref_stages.empty()) { + // get one stage to start merging + PipelineComponentBase* current = current_ref_stages.front(); + current_ref_stages.pop_front(); + + // start by generating all tasks + current->tasks = task_generator(ref.second->tasksDesc, current, rt, expanded_args); + + // attempt to merge all stages to the current merged stages + list::iterator i = current_ref_stages.begin(); + while (i != current_ref_stages.end()) { + // add stage to merged stages if the merging condition is true + PipelineComponentBase* s = *i; + if (merging_condition(s, current)) { + ((MergableStage*)current)->merge(*((MergableStage*)s)); + current_ref_stages.erase(i); + } else { + i++; + } + } + + // add merged stages to final map as one stage + merged_stages[((PipelineComponentBase*)current)->getId()] = (PipelineComponentBase*)current; + } + } +} + void generate_drs(RegionTemplate* rt, const map &expanded_args) { From ad5ca2d2eff7a05f65839e56f30730f4ac373662 Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Tue, 2 Aug 2016 18:50:15 -0300 Subject: [PATCH 15/87] Segmentation now implements ReusableTask. All serialization was tested. System compiling and working --- runtime/PipelineComponentBase.cpp | 13 +- runtime/ReusableTask.cpp | 16 +- runtime/ReusableTask.hpp | 20 -- .../PipelineManager.cpp | 10 + .../PipelineRTFS-NS-Diff-FGO/Segmentation.cpp | 211 +++++++++++++++++- .../PipelineRTFS-NS-Diff-FGO/Segmentation.hpp | 18 +- 6 files changed, 235 insertions(+), 53 deletions(-) diff --git a/runtime/PipelineComponentBase.cpp b/runtime/PipelineComponentBase.cpp index 709ddbf..7a54657 100644 --- a/runtime/PipelineComponentBase.cpp +++ b/runtime/PipelineComponentBase.cpp @@ -22,11 +22,6 @@ PipelineComponentBase::PipelineComponentBase(){ this->resultData = NULL; // this->input_arguments = new std::list(); // this->output_arguments = new std::list(); - - // TEST: REMOVE AFTER - ReusableTask* t = new ReusableTestTask(); - t->setTaskName("ReusableTestTask"); - tasks[10] = t; } PipelineComponentBase::~PipelineComponentBase() { @@ -349,10 +344,10 @@ int PipelineComponentBase::deserialize(char *buff) std::string task_name_s = task_name; // deserialize the task - // ReusableTask* task = ReusableTask::ReusableTaskFactory::getTaskFromName(task_name_s); - // task->setTaskName(task_name_s); - // deserialized_bytes += task->deserialize(buff+deserialized_bytes); - // this->tasks[id] = task; + ReusableTask* task = ReusableTask::ReusableTaskFactory::getTaskFromName(task_name_s); + task->setTaskName(task_name_s); + deserialized_bytes += task->deserialize(buff+deserialized_bytes); + this->tasks[id] = task; } // std::cout << "PipelineComponentBase::deserialize" << std::endl; diff --git a/runtime/ReusableTask.cpp b/runtime/ReusableTask.cpp index 0106432..dc1dfa9 100644 --- a/runtime/ReusableTask.cpp +++ b/runtime/ReusableTask.cpp @@ -64,18 +64,4 @@ ReusableTask *ReusableTask::ReusableTaskFactory::getTaskFromName(std::string nam t = factoryFunction(); } return t; -} - - -// Create the task factory -ReusableTask* taskFactorySegmentation1(list args, RegionTemplate* inputRt) { - return new ReusableTestTask(args, inputRt); -} - -// Create the task factory -ReusableTask* taskFactorySegmentation2() { - return new ReusableTestTask(); -} - -// register factory with the runtime system -bool registeredSegmentationTask = ReusableTask::ReusableTaskFactory::taskRegister("ReusableTestTask", &taskFactorySegmentation1, &taskFactorySegmentation2); +} \ No newline at end of file diff --git a/runtime/ReusableTask.hpp b/runtime/ReusableTask.hpp index 682d0b8..8aee372 100644 --- a/runtime/ReusableTask.hpp +++ b/runtime/ReusableTask.hpp @@ -65,24 +65,4 @@ class ReusableTask: public Task { }; - -class ReusableTestTask: public ReusableTask { - -public: - ReusableTestTask() {}; - ReusableTestTask(list args, RegionTemplate* inputRt) {}; - - bool reusable(ReusableTask* t) {return false;}; - - // Write component data to a buffer - int serialize(char *buff) {return 0;}; - - // Initialize component data from a buffer generated by serialize function - int deserialize(char *buff) {return 0;}; - - ReusableTask* clone() {return NULL;}; - - int size() {return 0;}; -}; - #endif /* REUSABLE_TASK_H_ */ diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 31e2c37..aad3240 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -16,6 +16,10 @@ #include "ReusableTask.hpp" #include "MergableStage.hpp" + + +#include "Segmentation.hpp" + using namespace std; namespace parsing { @@ -233,6 +237,12 @@ int main(int argc, char* argv[]) { for (int i : s.second->getOutputs()) cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " << expanded_args[i]->toString() << endl; + if (s.second->getName().compare("segmentation") == 0) { + ReusableTask* t = new TaskSegmentation(); + t->setTaskName("TaskSegmentation"); + s.second->tasks[10] = t; + cout << "[TEST] added a task -----------------------------------------------------------------------" << endl; + } sysEnv.executeComponent(s.second); } diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp index 969e41e..0d4c7c6 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp @@ -147,7 +147,8 @@ int Segmentation::run() { DenseDataRegion2D *segmented_rt = NULL; try{ - normalized_rt = dynamic_cast(inputRt->getDataRegion(normalized_rt_arg->getName(), std::to_string(normalized_rt_arg->getId()), 0, normalized_rt_arg->getId())); + normalized_rt = dynamic_cast(inputRt->getDataRegion( + normalized_rt_arg->getName(), std::to_string(normalized_rt_arg->getId()), 0, normalized_rt_arg->getId())); segmented_rt = new DenseDataRegion2D(); segmented_rt->setName(segmented_rt_arg->getName()); @@ -161,7 +162,9 @@ int Segmentation::run() { } // Create processing task - TaskSegmentation * task = new TaskSegmentation(normalized_rt, segmented_rt, blue, green, red, T1, T2, G1, minSize, maxSize, G2, minSizePl, minSizeSeg, maxSizeSeg, fillHolesConnectivity, reconConnectivity, watershedConnectivity); + TaskSegmentation * task = new TaskSegmentation(normalized_rt, segmented_rt, blue, + green, red, T1, T2, G1, minSize, maxSize, G2, minSizePl, minSizeSeg, maxSizeSeg, + fillHolesConnectivity, reconConnectivity, watershedConnectivity); this->executeTask(task); @@ -186,7 +189,10 @@ bool registeredSegmentation = PipelineComponentBase::ComponentFactory::component /*********************************** Task functions ***********************************/ /**************************************************************************************/ -TaskSegmentation::TaskSegmentation(DenseDataRegion2D* normalized_rt_temp, DenseDataRegion2D* segmented_rt_temp, unsigned char blue, unsigned char green, unsigned char red, double T1, double T2, unsigned char G1, int minSize, int maxSize, unsigned char G2, int minSizePl, int minSizeSeg, int maxSizeSeg, int fillHolesConnectivity, int reconConnectivity, int watershedConnectivity) { +TaskSegmentation::TaskSegmentation(DenseDataRegion2D* normalized_rt_temp, + DenseDataRegion2D* segmented_rt_temp, unsigned char blue, unsigned char green, unsigned char red, + double T1, double T2, unsigned char G1, int minSize, int maxSize, unsigned char G2, + int minSizePl, int minSizeSeg, int maxSizeSeg, int fillHolesConnectivity, int reconConnectivity, int watershedConnectivity) { this->normalized_rt_temp = normalized_rt_temp; this->segmented_rt_temp = segmented_rt_temp; @@ -205,8 +211,6 @@ TaskSegmentation::TaskSegmentation(DenseDataRegion2D* normalized_rt_temp, DenseD this->fillHolesConnectivity = fillHolesConnectivity; this->reconConnectivity = reconConnectivity; this->watershedConnectivity = watershedConnectivity; - - } TaskSegmentation::~TaskSegmentation() { @@ -224,7 +228,9 @@ bool TaskSegmentation::run(int procType, int tid) { std::cout << "TaskSegmentation executing." << std::endl; - ::nscale::HistologicalEntities::segmentNuclei(normalized_rt, segmented_rt, blue, green, red, T1, T2, G1, minSize, maxSize, G2, minSizePl, minSizeSeg, maxSizeSeg, fillHolesConnectivity, reconConnectivity, watershedConnectivity); + ::nscale::HistologicalEntities::segmentNuclei(normalized_rt, segmented_rt, blue, green, + red, T1, T2, G1, minSize, maxSize, G2, minSizePl, minSizeSeg, maxSizeSeg, fillHolesConnectivity, + reconConnectivity, watershedConnectivity); this->segmented_rt_temp->setData(segmented_rt); @@ -232,3 +238,196 @@ bool TaskSegmentation::run(int procType, int tid) { std::cout << "Task Segmentation time elapsed: "<< t2-t1 << std::endl; } + +bool TaskSegmentation::reusable(ReusableTask* rt) { + TaskSegmentation* t = (TaskSegmentation*)(rt); + if (this->normalized_rt_temp->getName() == t->normalized_rt_temp->getName() && + this->normalized_rt_temp->getId() == t->normalized_rt_temp->getId() && + this->normalized_rt_temp->getVersion() == t->normalized_rt_temp->getVersion() && + this->segmented_rt_temp->getName() == t->segmented_rt_temp->getName() && + this->segmented_rt_temp->getId() == t->segmented_rt_temp->getId() && + this->segmented_rt_temp->getVersion() == t->segmented_rt_temp->getVersion() && + this->blue == t->blue && + this->green == t->green && + this->red == t->red && + this->T1 == t->T1 && + this->T2 == t->T2 && + this->G1 == t->G1 && + this->minSize == t->minSize && + this->maxSize == t->maxSize && + this->G2 == t->G2 && + this->minSizePl == t->minSizePl && + this->minSizeSeg == t->minSizeSeg && + this->maxSizeSeg == t->maxSizeSeg && + this->fillHolesConnectivity == t->fillHolesConnectivity && + this->reconConnectivity == t->reconConnectivity && + this->watershedConnectivity == t->watershedConnectivity) { + + return true; + } else { + return false; + } +} + +int TaskSegmentation::size() { + return sizeof(unsigned char) + sizeof(unsigned char) + sizeof(unsigned char) + sizeof(float) + + sizeof(float) + sizeof(unsigned char) + sizeof(int) + sizeof(int) + sizeof(unsigned char) + + sizeof(int) + sizeof(int) + sizeof(int) + sizeof(int) + sizeof(int) + sizeof(int); +} + +int TaskSegmentation::serialize(char *buff) { + int serialized_bytes = 0; + + // copy field blue + memcpy(buff+serialized_bytes, &blue, sizeof(unsigned char)); + serialized_bytes+=sizeof(unsigned char); + + // copy field green + memcpy(buff+serialized_bytes, &green, sizeof(unsigned char)); + serialized_bytes+=sizeof(unsigned char); + + // copy field red + memcpy(buff+serialized_bytes, &red, sizeof(unsigned char)); + serialized_bytes+=sizeof(unsigned char); + + // copy field T1 + memcpy(buff+serialized_bytes, &T1, sizeof(float)); + serialized_bytes+=sizeof(float); + + // copy field T2 + memcpy(buff+serialized_bytes, &T2, sizeof(float)); + serialized_bytes+=sizeof(float); + + // copy field G1 + memcpy(buff+serialized_bytes, &G1, sizeof(unsigned char)); + serialized_bytes+=sizeof(unsigned char); + + // copy field minSize + memcpy(buff+serialized_bytes, &minSize, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy field maxSize + memcpy(buff+serialized_bytes, &maxSize, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy field G2 + memcpy(buff+serialized_bytes, &G2, sizeof(unsigned char)); + serialized_bytes+=sizeof(unsigned char); + + // copy field minSizePl + memcpy(buff+serialized_bytes, &minSizePl, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy field minSizeSeg + memcpy(buff+serialized_bytes, &minSizeSeg, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy field maxSizeSeg + memcpy(buff+serialized_bytes, &maxSizeSeg, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy field fillHolesConnectivity + memcpy(buff+serialized_bytes, &fillHolesConnectivity, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy field reconConnectivity + memcpy(buff+serialized_bytes, &reconConnectivity, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy field watershedConnectivity + memcpy(buff+serialized_bytes, &watershedConnectivity, sizeof(int)); + serialized_bytes+=sizeof(int); + + return serialized_bytes; +} + +int TaskSegmentation::deserialize(char *buff) { + int deserialized_bytes = 0; + + // extract field blue + this->blue = ((unsigned char*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(unsigned char); + + // extract field red + this->red = ((unsigned char*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(unsigned char); + + // extract field green + this->green = ((unsigned char*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(unsigned char); + + // extract field T1 + this->T1 = ((float*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(float); + + // extract field T2 + this->T2 = ((float*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(float); + + // extract field G1 + this->G1 = ((unsigned char*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(unsigned char); + + // extract field G2 + this->G2 = ((unsigned char*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(unsigned char); + + // extract field minSize + this->minSize = ((int*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(int); + + // extract field maxSize + this->maxSize = ((int*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(int); + + // extract field minSizePl + this->minSizePl = ((int*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(int); + + // extract field minSizeSeg + this->minSizeSeg = ((int*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(int); + + // extract field maxSizeSeg + this->maxSizeSeg = ((int*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(int); + + // extract field fillHolesConnectivity + this->fillHolesConnectivity = ((int*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(int); + + // extract field reconConnectivity + this->reconConnectivity = ((int*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(int); + + // extract field watershedConnectivity + this->watershedConnectivity = ((int*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(int); + + return deserialized_bytes; +} + +ReusableTask* TaskSegmentation::clone() { + ReusableTask* retValue = new TaskSegmentation(); + int size = this->size(); + char *buff = new char[size]; + this->serialize(buff); + retValue->deserialize(buff); + delete buff; + + return retValue; +} + +// Create the task factory +ReusableTask* taskFactorySegmentation1(list args, RegionTemplate* inputRt) { + return new TaskSegmentation(args, inputRt); +} + +// Create the task factory +ReusableTask* taskFactorySegmentation2() { + return new TaskSegmentation(); +} + +// register factory with the runtime system +bool registeredSegmentationTask = ReusableTask::ReusableTaskFactory::taskRegister("TaskSegmentation", + &taskFactorySegmentation1, &taskFactorySegmentation2); \ No newline at end of file diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp index e1cfcdb..82107e7 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp @@ -13,13 +13,15 @@ #include "FileUtils.h" #include "Task.h" #include "DenseDataRegion2D.h" +#include "MergableStage.hpp" +#include "ReusableTask.hpp" #include "opencv2/opencv.hpp" #include "opencv2/gpu/gpu.hpp" #include "HistologicalEntities.h" // PipelineComponent header -class Segmentation : public RTPipelineComponentBase { +class Segmentation : public RTPipelineComponentBase, public MergableStage { private: // data region id @@ -32,18 +34,19 @@ class Segmentation : public RTPipelineComponentBase { void set_workflow_id(int id) {workflow_id = id;}; + void merge(MergableStage &s) {}; + int run(); }; // Task header -class TaskSegmentation: public Task { +class TaskSegmentation: public ReusableTask { private: // data regions DenseDataRegion2D* normalized_rt_temp; DenseDataRegion2D* segmented_rt_temp; - // all other variables unsigned char blue; unsigned char green; @@ -63,11 +66,20 @@ class TaskSegmentation: public Task { public: + TaskSegmentation(){}; + TaskSegmentation(list args, RegionTemplate* inputRt){}; TaskSegmentation(DenseDataRegion2D* normalized_rt_temp, DenseDataRegion2D* segmented_rt_temp, unsigned char blue, unsigned char green, unsigned char red, double T1, double T2, unsigned char G1, int minSize, int maxSize, unsigned char G2, int minSizePl, int minSizeSeg, int maxSizeSeg, int fillHolesConnectivity, int reconConnectivity, int watershedConnectivity); virtual ~TaskSegmentation(); bool run(int procType=ExecEngineConstants::CPU, int tid=0); + + bool reusable(ReusableTask* t); + + int serialize(char *buff); + int deserialize(char *buff); + ReusableTask* clone(); + int size(); }; #endif /* Segmentation_H_ */ From 73dd5428415871f9cd802061a72d3384729aafc7 Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Tue, 2 Aug 2016 18:57:35 -0300 Subject: [PATCH 16/87] Updated Segmentation constructor to generate the task desc list and added the merge non-tested implementation. System compining and working. --- .../PipelineRTFS-NS-Diff-FGO/Segmentation.cpp | 90 +++++++++++++++++++ .../PipelineRTFS-NS-Diff-FGO/Segmentation.hpp | 4 +- 2 files changed, 93 insertions(+), 1 deletion(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp index 0d4c7c6..db27666 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp @@ -16,6 +16,61 @@ Segmentation::Segmentation() { this->setComponentName("Segmentation"); + + // generate task descriptors + list segmentation_task_args; + ArgumentRT* normalized_rt = new ArgumentRT(); + normalized_rt->setName("normalized_rt"); + segmentation_task_args.emplace_back(normalized_rt); + ArgumentRT* segmented_rt = new ArgumentRT(); + segmented_rt->setName("segmented_rt"); + segmentation_task_args.emplace_back(segmented_rt); + ArgumentInt* blue = new ArgumentInt(); + blue->setName("blue"); + segmentation_task_args.emplace_back(blue); + ArgumentInt* green = new ArgumentInt(); + green->setName("green"); + segmentation_task_args.emplace_back(green); + ArgumentInt* red = new ArgumentInt(); + red->setName("red"); + segmentation_task_args.emplace_back(red); + ArgumentFloat* T1 = new ArgumentFloat(); + T1->setName("T1"); + segmentation_task_args.emplace_back(T1); + ArgumentFloat* T2 = new ArgumentFloat(); + T2->setName("T2"); + segmentation_task_args.emplace_back(T2); + ArgumentInt* G1 = new ArgumentInt(); + G1->setName("G1"); + segmentation_task_args.emplace_back(G1); + ArgumentInt* minSize = new ArgumentInt(); + minSize->setName("minSize"); + segmentation_task_args.emplace_back(minSize); + ArgumentInt* maxSize = new ArgumentInt(); + maxSize->setName("maxSize"); + segmentation_task_args.emplace_back(maxSize); + ArgumentInt* G2 = new ArgumentInt(); + G2->setName("G2"); + segmentation_task_args.emplace_back(G2); + ArgumentInt* minSizePl = new ArgumentInt(); + minSizePl->setName("minSizePl"); + segmentation_task_args.emplace_back(minSizePl); + ArgumentInt* minSizeSeg = new ArgumentInt(); + minSizeSeg->setName("minSizeSeg"); + segmentation_task_args.emplace_back(minSizeSeg); + ArgumentInt* maxSizeSeg = new ArgumentInt(); + maxSizeSeg->setName("maxSizeSeg"); + segmentation_task_args.emplace_back(maxSizeSeg); + ArgumentInt* fillHolesConnectivity = new ArgumentInt(); + fillHolesConnectivity->setName("fillHolesConnectivity"); + segmentation_task_args.emplace_back(fillHolesConnectivity); + ArgumentInt* reconConnectivity = new ArgumentInt(); + reconConnectivity->setName("reconConnectivity"); + segmentation_task_args.emplace_back(reconConnectivity); + ArgumentInt* watershedConnectivity = new ArgumentInt(); + watershedConnectivity->setName("watershedConnectivity"); + segmentation_task_args.emplace_back(watershedConnectivity); + this->tasksDesc["TaskSegmentation"] = segmentation_task_args; } Segmentation::~Segmentation() {} @@ -176,6 +231,41 @@ int Segmentation::run() { return 0; } +// MergableStage s must be a non-previuosly-merged stage +void Segmentation::merge(MergableStage &s) { + + cout << "[Segmentation] trying to merage"; + + list* tasks_lists[] = {&this->mergable_t1}; + list* new_tasks_lists[] = {&((Segmentation*)&s)->mergable_t1}; + + for (int i=0; i<3; i++) { + bool reuse = false; + + // attempt to find a reusable task + ReusableTask* rt = tasks_lists[i]->front(); + for (ReusableTask* t : *tasks_lists[i]) { + if (t->reusable(rt)) { + reuse = true; + } + } + + if (!reuse) { + // add all tasks + for (int j=i; j<3; j++) { + tasks_lists[j]->emplace_back(new_tasks_lists[j]->front()); + } + + // // add DRs from merged stage to this stage + // std::set >* inp = &((Segmentation*)&s)->input_data_regions; + // std::set >* out = &((Segmentation*)&s)->output_data_regions; + // this->input_data_regions.insert(inp->begin(), inp->end()); + // this->output_data_regions.insert(out->begin(), out->end()); + return; + } + } +} + // Create the component factory PipelineComponentBase* componentFactorySegmentation() { return new Segmentation(); diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp index 82107e7..72c2cf2 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp @@ -28,13 +28,15 @@ class Segmentation : public RTPipelineComponentBase, public MergableStage { // IMPORTANT: this need to be set during the creation of this object int workflow_id; + list mergable_t1; + public: Segmentation(); virtual ~Segmentation(); void set_workflow_id(int id) {workflow_id = id;}; - void merge(MergableStage &s) {}; + void merge(MergableStage &s); int run(); }; From 1d3e373bd7c71cc5fab521743919fd75eb1c0a15 Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Thu, 4 Aug 2016 10:51:17 -0300 Subject: [PATCH 17/87] All base structure (so far) for task reuse implemented and tested. --- runtime/PipelineComponentBase.cpp | 15 +- runtime/PipelineComponentBase.h | 5 +- runtime/ReusableTask.hpp | 1 + .../PipelineManager.cpp | 25 +- .../PipelineRTFS-NS-Diff-FGO/Segmentation.cpp | 228 ++++++++---------- .../PipelineRTFS-NS-Diff-FGO/Segmentation.hpp | 24 +- 6 files changed, 139 insertions(+), 159 deletions(-) diff --git a/runtime/PipelineComponentBase.cpp b/runtime/PipelineComponentBase.cpp index 7a54657..8cfd4dd 100644 --- a/runtime/PipelineComponentBase.cpp +++ b/runtime/PipelineComponentBase.cpp @@ -155,11 +155,11 @@ int PipelineComponentBase::size() // add the task name size size_bytes += sizeof(int); - // add the task name - size_bytes += p->second->getTaskName().size() * sizeof(char); - // add the task size size_bytes += p->second->size(); + + // add the task name + size_bytes += p->second->getTaskName().size() * sizeof(char); } return size_bytes; @@ -223,6 +223,9 @@ int PipelineComponentBase::serialize(char *buff) memcpy(buff+serialized_bytes, p->second->getTaskName().c_str(), task_name_size*sizeof(char) ); serialized_bytes+=task_name_size*sizeof(char); + cout << "[PipelineComponentBase] serializing task name " << p->second->getTaskName() + << " of size " << p->second->getTaskName().size() << endl; + // copy the task serialized_bytes += p->second->serialize(buff+serialized_bytes); } @@ -341,7 +344,11 @@ int PipelineComponentBase::deserialize(char *buff) task_name[task_name_size] = '\0'; memcpy(task_name, buff+deserialized_bytes, sizeof(char)*task_name_size); deserialized_bytes += sizeof(char)*task_name_size; - std::string task_name_s = task_name; + std::string task_name_s = std::string(task_name); + // std::string task_name_s = "TaskSegmentation"; + + cout << "[PipelineComponentBase] deserializing task name " << task_name_s + << " of size " << task_name_s.size() << endl; // deserialize the task ReusableTask* task = ReusableTask::ReusableTaskFactory::getTaskFromName(task_name_s); diff --git a/runtime/PipelineComponentBase.h b/runtime/PipelineComponentBase.h index d205316..9674532 100644 --- a/runtime/PipelineComponentBase.h +++ b/runtime/PipelineComponentBase.h @@ -34,8 +34,6 @@ typedef PipelineComponentBase* (componetFactory_t)(); class PipelineComponentBase: public Task { private: - // Contain pointers to all arguments associated to this pipeline component - std::vector arguments; // Holds the string name of the component, which should be the same used to register with the ComponentFactory std::string component_name; @@ -73,6 +71,9 @@ class PipelineComponentBase: public Task { std::list output_arguments; protected: + // Contain pointers to all arguments associated to this pipeline component + std::vector arguments; + // is this component at the worker or manager side? int location; // this is used to pass cache stored in the Worker to the Pipeline component diff --git a/runtime/ReusableTask.hpp b/runtime/ReusableTask.hpp index 8aee372..a04dd33 100644 --- a/runtime/ReusableTask.hpp +++ b/runtime/ReusableTask.hpp @@ -25,6 +25,7 @@ class ReusableTask: public Task { public: ReusableTask() {}; + virtual ~ReusableTask() {}; virtual bool reusable(ReusableTask* t) = 0; diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index aad3240..037eb9d 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -69,6 +69,9 @@ void connect_stages_from_file(FILE* workflow_descriptor, map &args, map> args_values, map &expanded_args,map stages, map &expanded_stages, map &workflow_outputs); +void merge_stages_fine_grain(const map &all_stages, + const map &stages_ref, map &merged_stages, + RegionTemplate* rt, map expanded_args); void generate_drs(RegionTemplate* rt, const map &expanded_args); void add_arguments_to_stages(map &merged_stages, map &merged_arguments, @@ -209,6 +212,17 @@ int main(int argc, char* argv[]) { cout << "\t" << p.first << ":" << p.second->getName() << " = " << p.second->toString() << " sized: " << p.second->size() << endl; + map merged_stages; + merge_stages_fine_grain(expanded_stages, base_stages, merged_stages, rt, expanded_args); + + cout << endl<< "merged-fine: " << endl; + for (pair p : merged_stages) { + cout << "stage " << p.second->getId() << ":" << p.second->getName() << endl; + cout << "\ttasks: " << endl; + for (pair t : p.second->tasks) + cout << "\t\t" << t.first << ":" << t.second->getTaskName() << endl; + } + //------------------------------------------------------------ // Add workflows to Manager to be executed //------------------------------------------------------------ @@ -222,11 +236,11 @@ int main(int argc, char* argv[]) { // add arguments to each stage cout << endl << "add_arguments_to_stages" << endl; - add_arguments_to_stages(expanded_stages, expanded_args, rt); + add_arguments_to_stages(merged_stages, expanded_args, rt); // add all stages to manager cout << endl << "executeComponent" << endl; - for (pair s : expanded_stages) { + for (pair s : merged_stages) { cout << "sent component " << s.second->getId() << ":" << s.second->getName() << " to execute with args:" << endl; cout << "\tinputs: " << endl; @@ -237,12 +251,6 @@ int main(int argc, char* argv[]) { for (int i : s.second->getOutputs()) cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " << expanded_args[i]->toString() << endl; - if (s.second->getName().compare("segmentation") == 0) { - ReusableTask* t = new TaskSegmentation(); - t->setTaskName("TaskSegmentation"); - s.second->tasks[10] = t; - cout << "[TEST] added a task -----------------------------------------------------------------------" << endl; - } sysEnv.executeComponent(s.second); } @@ -915,6 +923,7 @@ map task_generator(map> &tasks_d tasks[uid] = ReusableTask::ReusableTaskFactory::getTaskFromName(t.first, args, rt); tasks[uid]->setId(uid); tasks[uid]->setTaskName(t.first); + cout << "[task_generator] new task " << uid << ":" << t.first << " with size " << tasks[uid]->size() << endl; } return tasks; diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp index db27666..3fc82a2 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp @@ -83,21 +83,6 @@ int Segmentation::run() { ArgumentRT* normalized_rt_arg; ArgumentRT* segmented_rt_arg; - unsigned char blue; - unsigned char green; - unsigned char red; - double T1; - double T2; - unsigned char G1; - int minSize; - int maxSize; - unsigned char G2; - int minSizePl; - int minSizeSeg; - int maxSizeSeg; - int fillHolesConnectivity; - int reconConnectivity; - int watershedConnectivity; int set_cout = 0; for(int i=0; igetArgumentsSize(); i++){ @@ -110,87 +95,8 @@ int Segmentation::run() { segmented_rt_arg = (ArgumentRT*)this->getArgument(i); set_cout++; } - - if (this->getArgument(i)->getName().compare("blue") == 0) { - blue = (unsigned char)((ArgumentInt*)this->getArgument(i))->getArgValue(); - set_cout++; - } - - if (this->getArgument(i)->getName().compare("green") == 0) { - green = (unsigned char)((ArgumentInt*)this->getArgument(i))->getArgValue(); - set_cout++; - } - - if (this->getArgument(i)->getName().compare("red") == 0) { - red = (unsigned char)((ArgumentInt*)this->getArgument(i))->getArgValue(); - set_cout++; - } - - if (this->getArgument(i)->getName().compare("T1") == 0) { - T1 = (double)((ArgumentFloat*)this->getArgument(i))->getArgValue(); - set_cout++; - } - - if (this->getArgument(i)->getName().compare("T2") == 0) { - T2 = (double)((ArgumentFloat*)this->getArgument(i))->getArgValue(); - set_cout++; - } - - if (this->getArgument(i)->getName().compare("G1") == 0) { - G1 = (unsigned char)((ArgumentInt*)this->getArgument(i))->getArgValue(); - set_cout++; - } - - if (this->getArgument(i)->getName().compare("minSize") == 0) { - minSize = (int)((ArgumentInt*)this->getArgument(i))->getArgValue(); - set_cout++; - } - - if (this->getArgument(i)->getName().compare("maxSize") == 0) { - maxSize = (int)((ArgumentInt*)this->getArgument(i))->getArgValue(); - set_cout++; - } - - if (this->getArgument(i)->getName().compare("G2") == 0) { - G2 = (unsigned char)((ArgumentInt*)this->getArgument(i))->getArgValue(); - set_cout++; - } - - if (this->getArgument(i)->getName().compare("minSizePl") == 0) { - minSizePl = (int)((ArgumentInt*)this->getArgument(i))->getArgValue(); - set_cout++; - } - - if (this->getArgument(i)->getName().compare("minSizeSeg") == 0) { - minSizeSeg = (int)((ArgumentInt*)this->getArgument(i))->getArgValue(); - set_cout++; - } - - if (this->getArgument(i)->getName().compare("maxSizeSeg") == 0) { - maxSizeSeg = (int)((ArgumentInt*)this->getArgument(i))->getArgValue(); - set_cout++; - } - - if (this->getArgument(i)->getName().compare("fillHolesConnectivity") == 0) { - fillHolesConnectivity = (int)((ArgumentInt*)this->getArgument(i))->getArgValue(); - set_cout++; - } - - if (this->getArgument(i)->getName().compare("reconConnectivity") == 0) { - reconConnectivity = (int)((ArgumentInt*)this->getArgument(i))->getArgValue(); - set_cout++; - } - - if (this->getArgument(i)->getName().compare("watershedConnectivity") == 0) { - watershedConnectivity = (int)((ArgumentInt*)this->getArgument(i))->getArgValue(); - set_cout++; - } - } - if (set_cout < this->getArgumentsSize()) - std::cout << __FILE__ << ":" << __LINE__ <<" Missing common arguments on Segmentation" << std::endl; - this->addInputOutputDataRegion("tile", normalized_rt_arg->getName(), RTPipelineComponentBase::INPUT); this->addInputOutputDataRegion("tile", segmented_rt_arg->getName(), RTPipelineComponentBase::OUTPUT); @@ -201,31 +107,25 @@ int Segmentation::run() { DenseDataRegion2D *segmented_rt = NULL; - try{ - normalized_rt = dynamic_cast(inputRt->getDataRegion( - normalized_rt_arg->getName(), std::to_string(normalized_rt_arg->getId()), 0, normalized_rt_arg->getId())); + normalized_rt = dynamic_cast(inputRt->getDataRegion( + normalized_rt_arg->getName(), std::to_string(normalized_rt_arg->getId()), 0, normalized_rt_arg->getId())); - segmented_rt = new DenseDataRegion2D(); - segmented_rt->setName(segmented_rt_arg->getName()); - segmented_rt->setId(std::to_string(segmented_rt_arg->getId())); - segmented_rt->setVersion(segmented_rt_arg->getId()); - inputRt->insertDataRegion(segmented_rt); - - std::cout << "Segmentation. paramenterId: "<< workflow_id <setName(segmented_rt_arg->getName()); + segmented_rt->setId(std::to_string(segmented_rt_arg->getId())); + segmented_rt->setVersion(segmented_rt_arg->getId()); + inputRt->insertDataRegion(segmented_rt); // Create processing task - TaskSegmentation * task = new TaskSegmentation(normalized_rt, segmented_rt, blue, - green, red, T1, T2, G1, minSize, maxSize, G2, minSizePl, minSizeSeg, maxSizeSeg, - fillHolesConnectivity, reconConnectivity, watershedConnectivity); + TaskSegmentation * task = (TaskSegmentation*)tasks.begin()->second->clone(); + task->normalized_rt_temp = normalized_rt; + task->segmented_rt_temp = segmented_rt; this->executeTask(task); - }else{ std::cout << __FILE__ << ":" << __LINE__ <<" RT == NULL" << std::endl; + exit(1); } return 0; @@ -279,28 +179,90 @@ bool registeredSegmentation = PipelineComponentBase::ComponentFactory::component /*********************************** Task functions ***********************************/ /**************************************************************************************/ -TaskSegmentation::TaskSegmentation(DenseDataRegion2D* normalized_rt_temp, - DenseDataRegion2D* segmented_rt_temp, unsigned char blue, unsigned char green, unsigned char red, - double T1, double T2, unsigned char G1, int minSize, int maxSize, unsigned char G2, - int minSizePl, int minSizeSeg, int maxSizeSeg, int fillHolesConnectivity, int reconConnectivity, int watershedConnectivity) { - - this->normalized_rt_temp = normalized_rt_temp; - this->segmented_rt_temp = segmented_rt_temp; - this->blue = blue; - this->green = green; - this->red = red; - this->T1 = T1; - this->T2 = T2; - this->G1 = G1; - this->minSize = minSize; - this->maxSize = maxSize; - this->G2 = G2; - this->minSizePl = minSizePl; - this->minSizeSeg = minSizeSeg; - this->maxSizeSeg = maxSizeSeg; - this->fillHolesConnectivity = fillHolesConnectivity; - this->reconConnectivity = reconConnectivity; - this->watershedConnectivity = watershedConnectivity; +TaskSegmentation::TaskSegmentation(list args, RegionTemplate* inputRt) { + + int set_cout = 0; + for(ArgumentBase* a : args){ + if (a->getName().compare("blue") == 0) { + this->blue = (unsigned char)((ArgumentInt*)a)->getArgValue(); + set_cout++; + } + + if (a->getName().compare("green") == 0) { + this->green = (unsigned char)((ArgumentInt*)a)->getArgValue(); + set_cout++; + } + + if (a->getName().compare("red") == 0) { + this->red = (unsigned char)((ArgumentInt*)a)->getArgValue(); + set_cout++; + } + + if (a->getName().compare("T1") == 0) { + this->T1 = (double)((ArgumentFloat*)a)->getArgValue(); + set_cout++; + } + + if (a->getName().compare("T2") == 0) { + this->T2 = (double)((ArgumentFloat*)a)->getArgValue(); + set_cout++; + } + + if (a->getName().compare("G1") == 0) { + this->G1 = (unsigned char)((ArgumentInt*)a)->getArgValue(); + set_cout++; + } + + if (a->getName().compare("minSize") == 0) { + this->minSize = (int)((ArgumentInt*)a)->getArgValue(); + set_cout++; + } + + if (a->getName().compare("maxSize") == 0) { + this->maxSize = (int)((ArgumentInt*)a)->getArgValue(); + set_cout++; + } + + if (a->getName().compare("G2") == 0) { + this->G2 = (unsigned char)((ArgumentInt*)a)->getArgValue(); + set_cout++; + } + + if (a->getName().compare("minSizePl") == 0) { + this->minSizePl = (int)((ArgumentInt*)a)->getArgValue(); + set_cout++; + } + + if (a->getName().compare("minSizeSeg") == 0) { + this->minSizeSeg = (int)((ArgumentInt*)a)->getArgValue(); + set_cout++; + } + + if (a->getName().compare("maxSizeSeg") == 0) { + this->maxSizeSeg = (int)((ArgumentInt*)a)->getArgValue(); + set_cout++; + } + + if (a->getName().compare("fillHolesConnectivity") == 0) { + this->fillHolesConnectivity = (int)((ArgumentInt*)a)->getArgValue(); + set_cout++; + } + + if (a->getName().compare("reconConnectivity") == 0) { + this->reconConnectivity = (int)((ArgumentInt*)a)->getArgValue(); + set_cout++; + } + + if (a->getName().compare("watershedConnectivity") == 0) { + this->watershedConnectivity = (int)((ArgumentInt*)a)->getArgValue(); + set_cout++; + } + } + + // all arguments except the DataRegions + if (set_cout < args.size()-2) + std::cout << __FILE__ << ":" << __LINE__ <<" Missing common arguments on Segmentation" << std::endl; + } TaskSegmentation::~TaskSegmentation() { diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp index 72c2cf2..d0740db 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp @@ -45,10 +45,6 @@ class Segmentation : public RTPipelineComponentBase, public MergableStage { class TaskSegmentation: public ReusableTask { private: - // data regions - DenseDataRegion2D* normalized_rt_temp; - DenseDataRegion2D* segmented_rt_temp; - // all other variables unsigned char blue; unsigned char green; @@ -68,20 +64,24 @@ class TaskSegmentation: public ReusableTask { public: - TaskSegmentation(){}; - TaskSegmentation(list args, RegionTemplate* inputRt){}; - TaskSegmentation(DenseDataRegion2D* normalized_rt_temp, DenseDataRegion2D* segmented_rt_temp, unsigned char blue, unsigned char green, unsigned char red, double T1, double T2, unsigned char G1, int minSize, int maxSize, unsigned char G2, int minSizePl, int minSizeSeg, int maxSizeSeg, int fillHolesConnectivity, int reconConnectivity, int watershedConnectivity); + + // data regions + DenseDataRegion2D* normalized_rt_temp; + DenseDataRegion2D* segmented_rt_temp; + + TaskSegmentation() {this->setTaskName("TaskSegmentation");}; + TaskSegmentation(list args, RegionTemplate* inputRt); virtual ~TaskSegmentation(); bool run(int procType=ExecEngineConstants::CPU, int tid=0); - bool reusable(ReusableTask* t); + virtual bool reusable(ReusableTask* t); - int serialize(char *buff); - int deserialize(char *buff); - ReusableTask* clone(); - int size(); + virtual int serialize(char *buff); + virtual int deserialize(char *buff); + virtual ReusableTask* clone(); + virtual int size(); }; #endif /* Segmentation_H_ */ From dfa16e0211352e6b5fd0e02c5ca3bad0d9e297ca Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Thu, 4 Aug 2016 16:42:26 -0300 Subject: [PATCH 18/87] Bug fix: system wasn't working with more than a value for the same variable. --- .../PipelineRTFS-NS-Diff-FGO/DiffMaskComp.cpp | 6 + .../PipelineManager.cpp | 106 ++++++++++-------- .../PipelineRTFS-NS-Diff-FGO/Segmentation.cpp | 2 +- .../PipelineRTFS-NS-Diff-FGO/Segmentation.hpp | 2 +- 4 files changed, 67 insertions(+), 49 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/DiffMaskComp.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/DiffMaskComp.cpp index 8f493ff..8f16807 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/DiffMaskComp.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/DiffMaskComp.cpp @@ -53,14 +53,20 @@ int DiffMaskComp::run() { if(inputRt != NULL){ + cout << "[DiffMaskComp] trying to get data regions:" << endl; + // Mask computed in segmentation using specific application parameter set DenseDataRegion2D *computed_mask = dynamic_cast( inputRt->getDataRegion(computed_mask_name->getName(), std::to_string(computed_mask_name->getId()), 0, computed_mask_name->getId())); + cout << "\t" << computed_mask_name->getName() << ":" << computed_mask_name->getId() + << ":0:" << computed_mask_name->getId() << endl; // Mask used as a reference DenseDataRegion2D *reference_mask = dynamic_cast( inputRt->getDataRegion(reference_mask_name->getName(), std::to_string(reference_mask_name->getId()), 0, reference_mask_name->getId())); + cout << "\t" << reference_mask->getName() << ":" << reference_mask->getId() + << ":0:" << reference_mask->getId() << endl; if(computed_mask != NULL && reference_mask != NULL){ // gambiarra diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 037eb9d..cb4813a 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -129,8 +129,8 @@ int main(int argc, char* argv[]) { // get all workflow outputs map workflow_outputs; get_outputs_from_file(workflow_descriptor, workflow_outputs); - cout << endl << "workflow_outputs " << endl; - mapprint(workflow_outputs); + // cout << endl << "workflow_outputs " << endl; + // mapprint(workflow_outputs); // for (pair p : workflow_outputs) // cout << p.second->getId() << ":" << p.second->getName() << endl; @@ -140,16 +140,24 @@ int main(int argc, char* argv[]) { map base_stages; map interstage_arguments; get_stages_from_file(workflow_descriptor, base_stages, interstage_arguments); - // cout << endl << "base_stages:" << endl; - // for (pair p : base_stages) { - // cout << p.first << ":" << p.second->getName() << ", outputs: " << p.second->getOutputs().size() << endl << endl; - // for (int i : p.second->getOutputs()) - // cout << "\t" << i << ":" << interstage_arguments[i]->getName() << endl; - // } - - cout << endl << "interstage_arguments:" << endl; - for (pair p : interstage_arguments) + cout << endl << "base_stages:" << endl; + for (pair p : base_stages) { cout << p.first << ":" << p.second->getName() << endl; + cout << "\toutputs: " << p.second->getOutputs().size() << endl << endl; + for (int i : p.second->getOutputs()) + cout << "\t\t" << i << ":" << interstage_arguments[i]->getName() << endl; + cout << "\t task descriptors:" << endl; + for (pair> d : p.second->tasksDesc) { + cout << "\t\ttask: " << d.first << endl; + for (ArgumentBase* a : d.second) + cout << "\t\t\t" << a->getName() << endl; + } + } + + + // cout << endl << "interstage_arguments:" << endl; + // for (pair p : interstage_arguments) + // cout << p.first << ":" << p.second->getName() << endl; // this map is a dependency structure: stage -> dependency_list map> deps; @@ -163,11 +171,11 @@ int main(int argc, char* argv[]) { // mapprint(all_argument); - cout << endl << "all_arguments:" << endl; - for (pair p : all_argument) { - cout << p.second->getId() << ":" << p.second->getName() - << " parent " << p.second->getParent() << endl; - } + // cout << endl << "all_arguments:" << endl; + // for (pair p : all_argument) { + // cout << p.second->getId() << ":" << p.second->getName() + // << " parent " << p.second->getParent() << endl; + // } // cout << endl << "connected base_stages:" << endl; // for (pair p : base_stages) { @@ -632,29 +640,29 @@ void connect_stages_from_file(FILE* workflow_descriptor, deps[sink_stg->getId()].emplace_back(find_stage(base_stages, all_source_fields[0].data)->getId()); arg = find_argument(interstage_arguments, all_source_fields[1].data); arg->setParent(find_stage(base_stages, all_source_fields[0].data)->getId()); - cout << "source from stage " << all_source_fields[0].data << " is " << arg->getId() << ":" - << arg->getName() << " parent " << arg->getParent() << endl; + // cout << "source from stage " << all_source_fields[0].data << " is " << arg->getId() << ":" + // << arg->getName() << " parent " << arg->getParent() << endl; } // add the link to the sink stage sink_stg->addInput(arg->getId()); } else { - cout << "workflow argument sink: " << all_sink_fields[0].data << endl; + // cout << "workflow argument sink: " << all_sink_fields[0].data << endl; // update workflow output id in order to access it later to retreive the output ArgumentBase* itstg_argument = find_argument(interstage_arguments, all_source_fields[1].data); - cout << "Output " << all_sink_fields[0].data << " connects to argument " << itstg_argument->getId() << - ":" << itstg_argument->getName() << endl; + // cout << "Output " << all_sink_fields[0].data << " connects to argument " << itstg_argument->getId() << + // ":" << itstg_argument->getName() << endl; ArgumentBase* output = find_argument(workflow_outputs, all_sink_fields[0].data); - cout << "Output " << all_sink_fields[0].data << " had id " << output->getId() << endl; + // cout << "Output " << all_sink_fields[0].data << " had id " << output->getId() << endl; // remove reference of old id from map workflow_outputs.erase(output->getId()); // update the output id output->setId(itstg_argument->getId()); - cout << "Output " << all_sink_fields[0].data << " now has id " << output->getId() << endl; + // cout << "Output " << all_sink_fields[0].data << " now has id " << output->getId() << endl; // re-insert the output with the new id workflow_outputs[output->getId()] = output; @@ -818,11 +826,11 @@ void expand_stages(const map &args, } // flatten the arg values into expanded_args - cout << endl << "arg_values" << endl; + // cout << endl << "arg_values" << endl; for (pair> p : args_values) { - cout << "base argument " << p.first << ":" << args.at(p.first)->getName() << endl; + // cout << "base argument " << p.first << ":" << args.at(p.first)->getName() << endl; for (ArgumentBase* a : p.second) { - cout << "\t" << a->getId() << ":" << a->getName() << " = " << a->toString() << endl; + // cout << "\t" << a->getId() << ":" << a->getName() << " = " << a->toString() << endl; expanded_args[a->getId()] = a; } } @@ -875,6 +883,7 @@ bool exists_reusable_task(PipelineComponentBase* merged, PipelineComponentBase* if (t.second->getTaskName().compare(task_name) == 0) to_merge_task = t.second; + // attempt to find the same task on merged for (pair t : merged->tasks) if (t.second->getTaskName().compare(task_name) == 0 && to_merge_task->reusable(t.second)) @@ -884,12 +893,14 @@ bool exists_reusable_task(PipelineComponentBase* merged, PipelineComponentBase* } // for the meantime the mearging will happen whenever at least the first task is reusable -bool merging_condition(PipelineComponentBase* merged, PipelineComponentBase* to_merge) { - // check if the first task is reusable - pair> m = *merged->tasksDesc.begin(); - pair> n = *to_merge->tasksDesc.begin(); +bool merging_condition(PipelineComponentBase* merged, PipelineComponentBase* to_merge, map> ref) { + + // compatibility with stages that dont implement task reuse + if (ref.size() == 0) + return false; - if (m.first.compare(n.first) == 0 && exists_reusable_task(merged, to_merge, m.first)) + // verify if the first task is reusable + if (exists_reusable_task(merged, to_merge, ref.begin()->first)) return true; else return false; @@ -936,30 +947,31 @@ void merge_stages_fine_grain(const map &all_stages, // attempt merging for each stage type for (pair ref : stages_ref) { // get only the stages from the current stage_ref - list current_ref_stages; - filter_stages(all_stages, ref.second->getName(), current_ref_stages); + list current_stages; + filter_stages(all_stages, ref.second->getName(), current_stages); // attempt to merge all current stages - while (!current_ref_stages.empty()) { + while (!current_stages.empty()) { // get one stage to start merging - PipelineComponentBase* current = current_ref_stages.front(); - current_ref_stages.pop_front(); + PipelineComponentBase* current = current_stages.front(); + current_stages.pop_front(); // start by generating all tasks current->tasks = task_generator(ref.second->tasksDesc, current, rt, expanded_args); // attempt to merge all stages to the current merged stages - list::iterator i = current_ref_stages.begin(); - while (i != current_ref_stages.end()) { - // add stage to merged stages if the merging condition is true - PipelineComponentBase* s = *i; - if (merging_condition(s, current)) { - ((MergableStage*)current)->merge(*((MergableStage*)s)); - current_ref_stages.erase(i); - } else { - i++; - } - } + // list::iterator i = current_stages.begin(); + // while (i != current_stages.end()) { + // // add stage to merged stages if the merging condition is true + // PipelineComponentBase* s = *i; + // if (merging_condition(s, current, ref.second->tasksDesc)) { + // cout << "[merge_stages_fine_grain] reused task" << endl; + // ((MergableStage*)current)->merge(*((MergableStage*)s)); + // i = current_stages.erase(i); + // } else { + // i++; + // } + // } // add merged stages to final map as one stage merged_stages[((PipelineComponentBase*)current)->getId()] = (PipelineComponentBase*)current; diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp index 3fc82a2..69a83f2 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp @@ -117,7 +117,7 @@ int Segmentation::run() { inputRt->insertDataRegion(segmented_rt); // Create processing task - TaskSegmentation * task = (TaskSegmentation*)tasks.begin()->second->clone(); + TaskSegmentation* task = (TaskSegmentation*)tasks.begin()->second->clone(); task->normalized_rt_temp = normalized_rt; task->segmented_rt_temp = segmented_rt; diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp index d0740db..e03daa3 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp @@ -69,7 +69,7 @@ class TaskSegmentation: public ReusableTask { DenseDataRegion2D* normalized_rt_temp; DenseDataRegion2D* segmented_rt_temp; - TaskSegmentation() {this->setTaskName("TaskSegmentation");}; + TaskSegmentation() {}; TaskSegmentation(list args, RegionTemplate* inputRt); virtual ~TaskSegmentation(); From ac3669c97d2590e418012f5d7255599eed006d84 Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Mon, 8 Aug 2016 18:06:51 -0300 Subject: [PATCH 19/87] Serialization bug fixed: SegmentationTask serialization/deserializarion had misordered variables and the double variables were being sent as float. --- runtime/PipelineComponentBase.cpp | 6 ++ runtime/PipelineComponentBase.h | 2 + runtime/ReusableTask.hpp | 2 + .../PipelineManager.cpp | 28 ++--- .../PipelineRTFS-NS-Diff-FGO/Segmentation.cpp | 102 +++++++++++------- .../PipelineRTFS-NS-Diff-FGO/Segmentation.hpp | 4 + 6 files changed, 90 insertions(+), 54 deletions(-) diff --git a/runtime/PipelineComponentBase.cpp b/runtime/PipelineComponentBase.cpp index 8cfd4dd..ceff4dc 100644 --- a/runtime/PipelineComponentBase.cpp +++ b/runtime/PipelineComponentBase.cpp @@ -372,6 +372,12 @@ PipelineComponentBase* PipelineComponentBase::clone() { return retValue; } +void PipelineComponentBase::printTasks() { + for (std::map::iterator i = tasks.begin(); i!=tasks.end(); i++) { + i->second->print(); + } +} + void PipelineComponentBase::executeTask(Task *task) { if(this->getResourceManager() != NULL){ diff --git a/runtime/PipelineComponentBase.h b/runtime/PipelineComponentBase.h index 9674532..f4f314d 100644 --- a/runtime/PipelineComponentBase.h +++ b/runtime/PipelineComponentBase.h @@ -170,6 +170,8 @@ class PipelineComponentBase: public Task { std::map tasks; + void printTasks(); + // Factory class is used to build "reflection", and instantiate objects of // PipelineComponentBase subclasses that register with it class ComponentFactory{ diff --git a/runtime/ReusableTask.hpp b/runtime/ReusableTask.hpp index a04dd33..dde601b 100644 --- a/runtime/ReusableTask.hpp +++ b/runtime/ReusableTask.hpp @@ -39,6 +39,8 @@ class ReusableTask: public Task { virtual int size() = 0; + virtual void print() = 0; + // Factory class is used to build "reflection", and instantiate objects of // ReusableTask subclasses that register with it diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index cb4813a..de0279d 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -227,8 +227,10 @@ int main(int argc, char* argv[]) { for (pair p : merged_stages) { cout << "stage " << p.second->getId() << ":" << p.second->getName() << endl; cout << "\ttasks: " << endl; - for (pair t : p.second->tasks) + for (pair t : p.second->tasks) { cout << "\t\t" << t.first << ":" << t.second->getTaskName() << endl; + t.second->print(); + } } //------------------------------------------------------------ @@ -960,18 +962,18 @@ void merge_stages_fine_grain(const map &all_stages, current->tasks = task_generator(ref.second->tasksDesc, current, rt, expanded_args); // attempt to merge all stages to the current merged stages - // list::iterator i = current_stages.begin(); - // while (i != current_stages.end()) { - // // add stage to merged stages if the merging condition is true - // PipelineComponentBase* s = *i; - // if (merging_condition(s, current, ref.second->tasksDesc)) { - // cout << "[merge_stages_fine_grain] reused task" << endl; - // ((MergableStage*)current)->merge(*((MergableStage*)s)); - // i = current_stages.erase(i); - // } else { - // i++; - // } - // } + list::iterator i = current_stages.begin(); + while (i != current_stages.end()) { + // add stage to merged stages if the merging condition is true + PipelineComponentBase* s = *i; + if (merging_condition(s, current, ref.second->tasksDesc)) { + cout << "[merge_stages_fine_grain] reused task" << endl; + ((MergableStage*)current)->merge(*((MergableStage*)s)); + i = current_stages.erase(i); + } else { + i++; + } + } // add merged stages to final map as one stage merged_stages[((PipelineComponentBase*)current)->getId()] = (PipelineComponentBase*)current; diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp index 69a83f2..9e736ab 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp @@ -293,37 +293,38 @@ bool TaskSegmentation::run(int procType, int tid) { bool TaskSegmentation::reusable(ReusableTask* rt) { TaskSegmentation* t = (TaskSegmentation*)(rt); - if (this->normalized_rt_temp->getName() == t->normalized_rt_temp->getName() && - this->normalized_rt_temp->getId() == t->normalized_rt_temp->getId() && - this->normalized_rt_temp->getVersion() == t->normalized_rt_temp->getVersion() && - this->segmented_rt_temp->getName() == t->segmented_rt_temp->getName() && - this->segmented_rt_temp->getId() == t->segmented_rt_temp->getId() && - this->segmented_rt_temp->getVersion() == t->segmented_rt_temp->getVersion() && - this->blue == t->blue && - this->green == t->green && - this->red == t->red && - this->T1 == t->T1 && - this->T2 == t->T2 && - this->G1 == t->G1 && - this->minSize == t->minSize && - this->maxSize == t->maxSize && - this->G2 == t->G2 && - this->minSizePl == t->minSizePl && - this->minSizeSeg == t->minSizeSeg && - this->maxSizeSeg == t->maxSizeSeg && - this->fillHolesConnectivity == t->fillHolesConnectivity && - this->reconConnectivity == t->reconConnectivity && - this->watershedConnectivity == t->watershedConnectivity) { - - return true; - } else { - return false; - } + // if (this->normalized_rt_temp->getName() == t->normalized_rt_temp->getName() && + // this->normalized_rt_temp->getId() == t->normalized_rt_temp->getId() && + // this->normalized_rt_temp->getVersion() == t->normalized_rt_temp->getVersion() && + // this->segmented_rt_temp->getName() == t->segmented_rt_temp->getName() && + // this->segmented_rt_temp->getId() == t->segmented_rt_temp->getId() && + // this->segmented_rt_temp->getVersion() == t->segmented_rt_temp->getVersion() && + // this->blue == t->blue && + // this->green == t->green && + // this->red == t->red && + // this->T1 == t->T1 && + // this->T2 == t->T2 && + // this->G1 == t->G1 && + // this->minSize == t->minSize && + // this->maxSize == t->maxSize && + // this->G2 == t->G2 && + // this->minSizePl == t->minSizePl && + // this->minSizeSeg == t->minSizeSeg && + // this->maxSizeSeg == t->maxSizeSeg && + // this->fillHolesConnectivity == t->fillHolesConnectivity && + // this->reconConnectivity == t->reconConnectivity && + // this->watershedConnectivity == t->watershedConnectivity) { + + // return true; + // } else { + // return false; + // } + return true; } int TaskSegmentation::size() { - return sizeof(unsigned char) + sizeof(unsigned char) + sizeof(unsigned char) + sizeof(float) + - sizeof(float) + sizeof(unsigned char) + sizeof(int) + sizeof(int) + sizeof(unsigned char) + + return sizeof(unsigned char) + sizeof(unsigned char) + sizeof(unsigned char) + sizeof(double) + + sizeof(double) + sizeof(unsigned char) + sizeof(int) + sizeof(int) + sizeof(unsigned char) + sizeof(int) + sizeof(int) + sizeof(int) + sizeof(int) + sizeof(int) + sizeof(int); } @@ -343,12 +344,12 @@ int TaskSegmentation::serialize(char *buff) { serialized_bytes+=sizeof(unsigned char); // copy field T1 - memcpy(buff+serialized_bytes, &T1, sizeof(float)); - serialized_bytes+=sizeof(float); + memcpy(buff+serialized_bytes, &T1, sizeof(double)); + serialized_bytes+=sizeof(double); // copy field T2 - memcpy(buff+serialized_bytes, &T2, sizeof(float)); - serialized_bytes+=sizeof(float); + memcpy(buff+serialized_bytes, &T2, sizeof(double)); + serialized_bytes+=sizeof(double); // copy field G1 memcpy(buff+serialized_bytes, &G1, sizeof(unsigned char)); @@ -409,21 +410,17 @@ int TaskSegmentation::deserialize(char *buff) { deserialized_bytes += sizeof(unsigned char); // extract field T1 - this->T1 = ((float*)(buff+deserialized_bytes))[0]; - deserialized_bytes += sizeof(float); + this->T1 = ((double*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(double); // extract field T2 - this->T2 = ((float*)(buff+deserialized_bytes))[0]; - deserialized_bytes += sizeof(float); + this->T2 = ((double*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(double); // extract field G1 this->G1 = ((unsigned char*)(buff+deserialized_bytes))[0]; deserialized_bytes += sizeof(unsigned char); - // extract field G2 - this->G2 = ((unsigned char*)(buff+deserialized_bytes))[0]; - deserialized_bytes += sizeof(unsigned char); - // extract field minSize this->minSize = ((int*)(buff+deserialized_bytes))[0]; deserialized_bytes += sizeof(int); @@ -432,6 +429,10 @@ int TaskSegmentation::deserialize(char *buff) { this->maxSize = ((int*)(buff+deserialized_bytes))[0]; deserialized_bytes += sizeof(int); + // extract field G2 + this->G2 = ((unsigned char*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(unsigned char); + // extract field minSizePl this->minSizePl = ((int*)(buff+deserialized_bytes))[0]; deserialized_bytes += sizeof(int); @@ -470,6 +471,25 @@ ReusableTask* TaskSegmentation::clone() { return retValue; } +void TaskSegmentation::print() { + + cout << "blue: " << int(blue) << endl; + cout << "green: " << int(green) << endl; + cout << "blue: " << int(red) << endl; + cout << "t1: " << T1 << endl; + cout << "t2: " << T2 << endl; + cout << "g1: " << int(G1) << endl; + cout << "minSize: " << minSize << endl; + cout << "maxSize: " << maxSize << endl; + cout << "G2: " << int(G2) << endl; + cout << "minSizePl: " << minSizePl << endl; + cout << "minSizeSeg: " << minSizeSeg << endl; + cout << "maxSizeSeg: " << maxSizeSeg << endl; + cout << "fillHolesConnectivity: " << fillHolesConnectivity << endl; + cout << "reconConnectivity: " << reconConnectivity << endl; + cout << "watershedConnectivity: " << watershedConnectivity << endl; +} + // Create the task factory ReusableTask* taskFactorySegmentation1(list args, RegionTemplate* inputRt) { return new TaskSegmentation(args, inputRt); @@ -478,7 +498,7 @@ ReusableTask* taskFactorySegmentation1(list args, RegionTemplate* // Create the task factory ReusableTask* taskFactorySegmentation2() { return new TaskSegmentation(); -} +} // register factory with the runtime system bool registeredSegmentationTask = ReusableTask::ReusableTaskFactory::taskRegister("TaskSegmentation", diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp index e03daa3..c7f5869 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp @@ -38,6 +38,8 @@ class Segmentation : public RTPipelineComponentBase, public MergableStage { void merge(MergableStage &s); + void print(); + int run(); }; @@ -82,6 +84,8 @@ class TaskSegmentation: public ReusableTask { virtual int deserialize(char *buff); virtual ReusableTask* clone(); virtual int size(); + + void print(); }; #endif /* Segmentation_H_ */ From adc4d3a4a3df299501f874306bfc2d93c151d527 Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Tue, 9 Aug 2016 22:46:12 -0300 Subject: [PATCH 20/87] Stage fine-grain merging partially working: Not working when 'reusable' is called due to the DRs being NULL. --- runtime/PipelineComponentBase.cpp | 27 +++--- runtime/PipelineComponentBase.h | 2 +- .../MergableStage.hpp | 19 ---- .../PipelineManager.cpp | 69 +++++++++----- .../PipelineRTFS-NS-Diff-FGO/Segmentation.cpp | 89 ++++++------------- .../PipelineRTFS-NS-Diff-FGO/Segmentation.hpp | 5 +- 6 files changed, 90 insertions(+), 121 deletions(-) delete mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/MergableStage.hpp diff --git a/runtime/PipelineComponentBase.cpp b/runtime/PipelineComponentBase.cpp index ceff4dc..d5fc5c1 100644 --- a/runtime/PipelineComponentBase.cpp +++ b/runtime/PipelineComponentBase.cpp @@ -148,7 +148,7 @@ int PipelineComponentBase::size() // add the number of tasks size_bytes += sizeof(int); - for(map::iterator p=this->tasks.begin(); p!=this->tasks.end(); p++){ + for(list::iterator t=this->tasks.begin(); t!=this->tasks.end(); t++){ // add the task id size_bytes += sizeof(int); @@ -156,10 +156,10 @@ int PipelineComponentBase::size() size_bytes += sizeof(int); // add the task size - size_bytes += p->second->size(); + size_bytes += (*t)->size(); // add the task name - size_bytes += p->second->getTaskName().size() * sizeof(char); + size_bytes += (*t)->getTaskName().size() * sizeof(char); } return size_bytes; @@ -208,26 +208,26 @@ int PipelineComponentBase::serialize(char *buff) serialized_bytes+=sizeof(int); // serialize each of the tasks - for(map::iterator p=this->tasks.begin(); p!=this->tasks.end(); p++){ + for(list::iterator t=this->tasks.begin(); t!=this->tasks.end(); t++){ // Copy the task id - int id = p->first; + int id = (*t)->getId(); memcpy(buff+serialized_bytes, &id, sizeof(int)); serialized_bytes+=sizeof(int); // copy the task name size - int task_name_size = p->second->getTaskName().size(); + int task_name_size = (*t)->getTaskName().size(); memcpy(buff+serialized_bytes, &task_name_size, sizeof(int)); serialized_bytes+=sizeof(int); // copy the task name - memcpy(buff+serialized_bytes, p->second->getTaskName().c_str(), task_name_size*sizeof(char) ); + memcpy(buff+serialized_bytes, (*t)->getTaskName().c_str(), task_name_size*sizeof(char) ); serialized_bytes+=task_name_size*sizeof(char); - cout << "[PipelineComponentBase] serializing task name " << p->second->getTaskName() - << " of size " << p->second->getTaskName().size() << endl; + cout << "[PipelineComponentBase] serializing task name " << (*t)->getTaskName() + << " of size " << (*t)->getTaskName().size() << endl; // copy the task - serialized_bytes += p->second->serialize(buff+serialized_bytes); + serialized_bytes += (*t)->serialize(buff+serialized_bytes); } // std::cout << "PipelineComponentBase::serialize" << std::endl; @@ -353,8 +353,9 @@ int PipelineComponentBase::deserialize(char *buff) // deserialize the task ReusableTask* task = ReusableTask::ReusableTaskFactory::getTaskFromName(task_name_s); task->setTaskName(task_name_s); + task->setId(id); deserialized_bytes += task->deserialize(buff+deserialized_bytes); - this->tasks[id] = task; + this->tasks.push_back(task); } // std::cout << "PipelineComponentBase::deserialize" << std::endl; @@ -373,8 +374,8 @@ PipelineComponentBase* PipelineComponentBase::clone() { } void PipelineComponentBase::printTasks() { - for (std::map::iterator i = tasks.begin(); i!=tasks.end(); i++) { - i->second->print(); + for (std::list::iterator i = tasks.begin(); i!=tasks.end(); i++) { + (*i)->print(); } } diff --git a/runtime/PipelineComponentBase.h b/runtime/PipelineComponentBase.h index f4f314d..aa80073 100644 --- a/runtime/PipelineComponentBase.h +++ b/runtime/PipelineComponentBase.h @@ -168,7 +168,7 @@ class PipelineComponentBase: public Task { // a map of all tasks ID used by the stage and the list of arguments for each task std::map > tasksDesc; - std::map tasks; + std::list tasks; void printTasks(); diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/MergableStage.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/MergableStage.hpp deleted file mode 100644 index 7a520e5..0000000 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/MergableStage.hpp +++ /dev/null @@ -1,19 +0,0 @@ -/* - * MergableStage.hpp - * - * Created on: Jul 18, 2016 - * Author: willian - */ - -#ifndef MERGABLE_STAGE_H_ -#define MERGABLE_STAGE_H_ - -class MergableStage { - -public: - MergableStage() {}; - - virtual void merge(MergableStage &s) = 0; -}; - -#endif /* MERGABLE_STAGE_H_ */ diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index de0279d..e58ebc4 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -14,11 +14,6 @@ #include "RTPipelineComponentBase.h" #include "RegionTemplateCollection.h" #include "ReusableTask.hpp" -#include "MergableStage.hpp" - - - -#include "Segmentation.hpp" using namespace std; @@ -227,9 +222,9 @@ int main(int argc, char* argv[]) { for (pair p : merged_stages) { cout << "stage " << p.second->getId() << ":" << p.second->getName() << endl; cout << "\ttasks: " << endl; - for (pair t : p.second->tasks) { - cout << "\t\t" << t.first << ":" << t.second->getTaskName() << endl; - t.second->print(); + for (ReusableTask* t : p.second->tasks) { + cout << "\t\t" << t->getId() << ":" << t->getTaskName() << endl; + // t.second->print(); } } @@ -881,14 +876,14 @@ ArgumentBase* find_argument(PipelineComponentBase* p, string name, map t : to_merge->tasks) - if (t.second->getTaskName().compare(task_name) == 0) - to_merge_task = t.second; + for (ReusableTask* t : to_merge->tasks) + if (t->getTaskName().compare(task_name) == 0) + to_merge_task = t; // attempt to find the same task on merged - for (pair t : merged->tasks) - if (t.second->getTaskName().compare(task_name) == 0 && - to_merge_task->reusable(t.second)) + for (ReusableTask* t : merged->tasks) + if (t->getTaskName().compare(task_name) == 0 && + to_merge_task->reusable(t)) return true; return false; @@ -917,10 +912,10 @@ void filter_stages(const map &all_stages, filtered_stages.emplace_back(p.second); } -map task_generator(map> &tasks_desc, +list task_generator(map> &tasks_desc, PipelineComponentBase* p, RegionTemplate* rt, map expanded_args) { - map tasks; + list tasks; for (pair> t : tasks_desc) { // get task args @@ -933,15 +928,39 @@ map task_generator(map> &tasks_d // call constructor int uid = new_uid(); - tasks[uid] = ReusableTask::ReusableTaskFactory::getTaskFromName(t.first, args, rt); - tasks[uid]->setId(uid); - tasks[uid]->setTaskName(t.first); - cout << "[task_generator] new task " << uid << ":" << t.first << " with size " << tasks[uid]->size() << endl; + ReusableTask* n_task = ReusableTask::ReusableTaskFactory::getTaskFromName(t.first, args, rt); + n_task->setId(uid); + n_task->setTaskName(t.first); + tasks.emplace_back(n_task); + cout << "[task_generator] new task " << uid << ":" << t.first << " with size " << n_task->size() << endl; } return tasks; } +ReusableTask* find_task(list l, string name) { + for (ReusableTask* t : l) + if (t->getTaskName().compare(name) == 0) + return t; + return NULL; +} + +void merge_stages(PipelineComponentBase* current, PipelineComponentBase* s, map> ref) { + for (map>::iterator p=ref.begin(); p!=ref.end(); p++) { + // verify if this is the first reusable task + ReusableTask* t = find_task(s->tasks, p->first); + if (find_task(current->tasks, p->first)->reusable(t)) { + cout << "[merged_stages] found reusable task " << p->first << endl; + // add all remaining tasks + for (; p!=ref.end(); p++) { + cout << "[merged_stages] reused task " << p->first << endl; + current->tasks.emplace_back(t); + } + return; + } + } +} + void merge_stages_fine_grain(const map &all_stages, const map &stages_ref, map &merged_stages, RegionTemplate* rt, map expanded_args) { @@ -959,16 +978,22 @@ void merge_stages_fine_grain(const map &all_stages, current_stages.pop_front(); // start by generating all tasks - current->tasks = task_generator(ref.second->tasksDesc, current, rt, expanded_args); + if (current->tasks.size() == 0) + current->tasks = task_generator(ref.second->tasksDesc, current, rt, expanded_args); // attempt to merge all stages to the current merged stages list::iterator i = current_stages.begin(); while (i != current_stages.end()) { // add stage to merged stages if the merging condition is true PipelineComponentBase* s = *i; + + // generate tasks if it they weren't generated yet + if (s->tasks.size() == 0) + s->tasks = task_generator(ref.second->tasksDesc, s, rt, expanded_args); + if (merging_condition(s, current, ref.second->tasksDesc)) { cout << "[merge_stages_fine_grain] reused task" << endl; - ((MergableStage*)current)->merge(*((MergableStage*)s)); + merge_stages(current, s, ref.second->tasksDesc); i = current_stages.erase(i); } else { i++; diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp index 9e736ab..ca0780b 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp @@ -117,7 +117,7 @@ int Segmentation::run() { inputRt->insertDataRegion(segmented_rt); // Create processing task - TaskSegmentation* task = (TaskSegmentation*)tasks.begin()->second->clone(); + TaskSegmentation* task = (TaskSegmentation*)(*tasks.begin())->clone(); task->normalized_rt_temp = normalized_rt; task->segmented_rt_temp = segmented_rt; @@ -131,41 +131,6 @@ int Segmentation::run() { return 0; } -// MergableStage s must be a non-previuosly-merged stage -void Segmentation::merge(MergableStage &s) { - - cout << "[Segmentation] trying to merage"; - - list* tasks_lists[] = {&this->mergable_t1}; - list* new_tasks_lists[] = {&((Segmentation*)&s)->mergable_t1}; - - for (int i=0; i<3; i++) { - bool reuse = false; - - // attempt to find a reusable task - ReusableTask* rt = tasks_lists[i]->front(); - for (ReusableTask* t : *tasks_lists[i]) { - if (t->reusable(rt)) { - reuse = true; - } - } - - if (!reuse) { - // add all tasks - for (int j=i; j<3; j++) { - tasks_lists[j]->emplace_back(new_tasks_lists[j]->front()); - } - - // // add DRs from merged stage to this stage - // std::set >* inp = &((Segmentation*)&s)->input_data_regions; - // std::set >* out = &((Segmentation*)&s)->output_data_regions; - // this->input_data_regions.insert(inp->begin(), inp->end()); - // this->output_data_regions.insert(out->begin(), out->end()); - return; - } - } -} - // Create the component factory PipelineComponentBase* componentFactorySegmentation() { return new Segmentation(); @@ -293,32 +258,32 @@ bool TaskSegmentation::run(int procType, int tid) { bool TaskSegmentation::reusable(ReusableTask* rt) { TaskSegmentation* t = (TaskSegmentation*)(rt); - // if (this->normalized_rt_temp->getName() == t->normalized_rt_temp->getName() && - // this->normalized_rt_temp->getId() == t->normalized_rt_temp->getId() && - // this->normalized_rt_temp->getVersion() == t->normalized_rt_temp->getVersion() && - // this->segmented_rt_temp->getName() == t->segmented_rt_temp->getName() && - // this->segmented_rt_temp->getId() == t->segmented_rt_temp->getId() && - // this->segmented_rt_temp->getVersion() == t->segmented_rt_temp->getVersion() && - // this->blue == t->blue && - // this->green == t->green && - // this->red == t->red && - // this->T1 == t->T1 && - // this->T2 == t->T2 && - // this->G1 == t->G1 && - // this->minSize == t->minSize && - // this->maxSize == t->maxSize && - // this->G2 == t->G2 && - // this->minSizePl == t->minSizePl && - // this->minSizeSeg == t->minSizeSeg && - // this->maxSizeSeg == t->maxSizeSeg && - // this->fillHolesConnectivity == t->fillHolesConnectivity && - // this->reconConnectivity == t->reconConnectivity && - // this->watershedConnectivity == t->watershedConnectivity) { - - // return true; - // } else { - // return false; - // } + if (this->normalized_rt_temp->getName() == t->normalized_rt_temp->getName() && + this->normalized_rt_temp->getId() == t->normalized_rt_temp->getId() && + this->normalized_rt_temp->getVersion() == t->normalized_rt_temp->getVersion() && + this->segmented_rt_temp->getName() == t->segmented_rt_temp->getName() && + this->segmented_rt_temp->getId() == t->segmented_rt_temp->getId() && + this->segmented_rt_temp->getVersion() == t->segmented_rt_temp->getVersion() && + this->blue == t->blue && + this->green == t->green && + this->red == t->red && + this->T1 == t->T1 && + this->T2 == t->T2 && + this->G1 == t->G1 && + this->minSize == t->minSize && + this->maxSize == t->maxSize && + this->G2 == t->G2 && + this->minSizePl == t->minSizePl && + this->minSizeSeg == t->minSizeSeg && + this->maxSizeSeg == t->maxSizeSeg && + this->fillHolesConnectivity == t->fillHolesConnectivity && + this->reconConnectivity == t->reconConnectivity && + this->watershedConnectivity == t->watershedConnectivity) { + + return true; + } else { + return false; + } return true; } diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp index c7f5869..40f3d37 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp @@ -13,7 +13,6 @@ #include "FileUtils.h" #include "Task.h" #include "DenseDataRegion2D.h" -#include "MergableStage.hpp" #include "ReusableTask.hpp" #include "opencv2/opencv.hpp" @@ -21,7 +20,7 @@ #include "HistologicalEntities.h" // PipelineComponent header -class Segmentation : public RTPipelineComponentBase, public MergableStage { +class Segmentation : public RTPipelineComponentBase { private: // data region id @@ -36,8 +35,6 @@ class Segmentation : public RTPipelineComponentBase, public MergableStage { void set_workflow_id(int id) {workflow_id = id;}; - void merge(MergableStage &s); - void print(); int run(); From 6f57bb88d74eee44dddaa8ad162781c7141c94cb Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Wed, 10 Aug 2016 17:53:54 -0300 Subject: [PATCH 21/87] Basic structure for task reuse now working: Using Segmentation as an example, this stage has at least one task, which is verifiable for reuse with another task, and if so, the stage can be merged with another stage. Still need to: - Break the Segmentation task in three, - Enforce reuse on parallel tasks, - Reimplement Stage code generator. --- runtime/ReusableTask.hpp | 4 +- .../PipelineRTFS-NS-Diff-FGO/Segmentation.cpp | 202 +++++++++++++----- .../PipelineRTFS-NS-Diff-FGO/Segmentation.hpp | 11 +- 3 files changed, 157 insertions(+), 60 deletions(-) diff --git a/runtime/ReusableTask.hpp b/runtime/ReusableTask.hpp index dde601b..776dc38 100644 --- a/runtime/ReusableTask.hpp +++ b/runtime/ReusableTask.hpp @@ -28,15 +28,13 @@ class ReusableTask: public Task { virtual ~ReusableTask() {}; virtual bool reusable(ReusableTask* t) = 0; + virtual void updateDR(RegionTemplate* rt) = 0; // Write component data to a buffer virtual int serialize(char *buff) = 0; - // Initialize component data from a buffer generated by serialize function virtual int deserialize(char *buff) = 0; - virtual ReusableTask* clone() = 0; - virtual int size() = 0; virtual void print() = 0; diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp index ca0780b..73c6348 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp @@ -81,52 +81,53 @@ int Segmentation::run() { std::cout << "Executing component: " << this->getComponentName() << " instance id: " << this->getId() <getRegionTemplateInstance("tile"); - ArgumentRT* normalized_rt_arg; - ArgumentRT* segmented_rt_arg; + // ArgumentRT* normalized_rt_arg; + // ArgumentRT* segmented_rt_arg; - int set_cout = 0; - for(int i=0; igetArgumentsSize(); i++){ - if (this->getArgument(i)->getName().compare("normalized_rt") == 0) { - normalized_rt_arg = (ArgumentRT*)this->getArgument(i); - set_cout++; - } + // for(int i=0; igetArgumentsSize(); i++){ + // if (this->getArgument(i)->getName().compare("normalized_rt") == 0) { + // normalized_rt_arg = (ArgumentRT*)this->getArgument(i); + // } - if (this->getArgument(i)->getName().compare("segmented_rt") == 0) { - segmented_rt_arg = (ArgumentRT*)this->getArgument(i); - set_cout++; - } - } + // if (this->getArgument(i)->getName().compare("segmented_rt") == 0) { + // segmented_rt_arg = (ArgumentRT*)this->getArgument(i); + // } + // } - this->addInputOutputDataRegion("tile", normalized_rt_arg->getName(), RTPipelineComponentBase::INPUT); + this->addInputOutputDataRegion("tile", "normalized_rt", RTPipelineComponentBase::INPUT); - this->addInputOutputDataRegion("tile", segmented_rt_arg->getName(), RTPipelineComponentBase::OUTPUT); + this->addInputOutputDataRegion("tile", "segmented_rt", RTPipelineComponentBase::OUTPUT); - if(inputRt != NULL){ - DenseDataRegion2D *normalized_rt = NULL; + // if(inputRt != NULL){ + // DenseDataRegion2D *normalized_rt = NULL; - DenseDataRegion2D *segmented_rt = NULL; + // DenseDataRegion2D *segmented_rt = NULL; - normalized_rt = dynamic_cast(inputRt->getDataRegion( - normalized_rt_arg->getName(), std::to_string(normalized_rt_arg->getId()), 0, normalized_rt_arg->getId())); + // normalized_rt = dynamic_cast(inputRt->getDataRegion( + // normalized_rt_arg->getName(), std::to_string(normalized_rt_arg->getId()), 0, normalized_rt_arg->getId())); - segmented_rt = new DenseDataRegion2D(); - segmented_rt->setName(segmented_rt_arg->getName()); - segmented_rt->setId(std::to_string(segmented_rt_arg->getId())); - segmented_rt->setVersion(segmented_rt_arg->getId()); - inputRt->insertDataRegion(segmented_rt); + // segmented_rt = new DenseDataRegion2D(); + // segmented_rt->setName(segmented_rt_arg->getName()); + // segmented_rt->setId(std::to_string(segmented_rt_arg->getId())); + // segmented_rt->setVersion(segmented_rt_arg->getId()); + // inputRt->insertDataRegion(segmented_rt); - // Create processing task - TaskSegmentation* task = (TaskSegmentation*)(*tasks.begin())->clone(); - task->normalized_rt_temp = normalized_rt; - task->segmented_rt_temp = segmented_rt; + // // Create processing task + // TaskSegmentation* task = (TaskSegmentation*)(*tasks.begin())->clone(); + // task->normalized_rt_temp = normalized_rt; + // task->segmented_rt_temp = segmented_rt; - this->executeTask(task); + for (ReusableTask* task : tasks) { + ReusableTask* t = task->clone(); + t->updateDR(inputRt); + this->executeTask(t); + } - }else{ - std::cout << __FILE__ << ":" << __LINE__ <<" RT == NULL" << std::endl; - exit(1); - } + // }else{ + // std::cout << __FILE__ << ":" << __LINE__ <<" RT == NULL" << std::endl; + // exit(1); + // } return 0; } @@ -148,6 +149,27 @@ TaskSegmentation::TaskSegmentation(list args, RegionTemplate* inp int set_cout = 0; for(ArgumentBase* a : args){ + + if (a->getName().compare("normalized_rt") == 0) { + ArgumentRT* normalized_rt_arg; + normalized_rt_arg = (ArgumentRT*)a; + this->normalized_rt_temp = new DenseDataRegion2D(); + this->normalized_rt_temp->setName(normalized_rt_arg->getName()); + this->normalized_rt_temp->setId(std::to_string(normalized_rt_arg->getId())); + this->normalized_rt_temp->setVersion(normalized_rt_arg->getId()); + set_cout++; + } + + if (a->getName().compare("segmented_rt") == 0) { + ArgumentRT* segmented_rt_arg; + segmented_rt_arg = (ArgumentRT*)a; + this->segmented_rt_temp = new DenseDataRegion2D(); + this->segmented_rt_temp->setName(segmented_rt_arg->getName()); + this->segmented_rt_temp->setId(std::to_string(segmented_rt_arg->getId())); + this->segmented_rt_temp->setVersion(segmented_rt_arg->getId()); + set_cout++; + } + if (a->getName().compare("blue") == 0) { this->blue = (unsigned char)((ArgumentInt*)a)->getArgValue(); set_cout++; @@ -225,14 +247,13 @@ TaskSegmentation::TaskSegmentation(list args, RegionTemplate* inp } // all arguments except the DataRegions - if (set_cout < args.size()-2) + if (set_cout < args.size()) std::cout << __FILE__ << ":" << __LINE__ <<" Missing common arguments on Segmentation" << std::endl; } TaskSegmentation::~TaskSegmentation() { if(normalized_rt_temp != NULL) delete normalized_rt_temp; - } bool TaskSegmentation::run(int procType, int tid) { @@ -256,6 +277,13 @@ bool TaskSegmentation::run(int procType, int tid) { std::cout << "Task Segmentation time elapsed: "<< t2-t1 << std::endl; } +void TaskSegmentation::updateDR(RegionTemplate* rt) { + normalized_rt_temp = dynamic_cast(rt->getDataRegion(this->normalized_rt_temp->getName(), + this->normalized_rt_temp->getId(), 0, stoi(this->normalized_rt_temp->getId()))); + + rt->insertDataRegion(this->segmented_rt_temp); +} + bool TaskSegmentation::reusable(ReusableTask* rt) { TaskSegmentation* t = (TaskSegmentation*)(rt); if (this->normalized_rt_temp->getName() == t->normalized_rt_temp->getName() && @@ -290,71 +318,101 @@ bool TaskSegmentation::reusable(ReusableTask* rt) { int TaskSegmentation::size() { return sizeof(unsigned char) + sizeof(unsigned char) + sizeof(unsigned char) + sizeof(double) + sizeof(double) + sizeof(unsigned char) + sizeof(int) + sizeof(int) + sizeof(unsigned char) + - sizeof(int) + sizeof(int) + sizeof(int) + sizeof(int) + sizeof(int) + sizeof(int); + sizeof(int) + sizeof(int) + sizeof(int) + sizeof(int) + sizeof(int) + sizeof(int) + + sizeof(int) + sizeof(int) + normalized_rt_temp->getName().length()*sizeof(char) + + sizeof(int) + sizeof(int) + segmented_rt_temp->getName().length()*sizeof(char); } int TaskSegmentation::serialize(char *buff) { int serialized_bytes = 0; + // copy normalized_rt id + int normalized_rt_id = stoi(normalized_rt_temp->getId()); + memcpy(buff+serialized_bytes, &normalized_rt_id, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy normalized_rt name size + int normalized_rt_name_size = normalized_rt_temp->getName().length(); + memcpy(buff+serialized_bytes, &normalized_rt_name_size, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy normalized_rt name + memcpy(buff+serialized_bytes, normalized_rt_temp->getName().c_str(), normalized_rt_name_size*sizeof(char)); + serialized_bytes+=normalized_rt_name_size*sizeof(char); + + // copy segmented_rt id + int segmented_rt_id = stoi(segmented_rt_temp->getId()); + memcpy(buff+serialized_bytes, &segmented_rt_id, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy segmented_rt name size + int segmented_rt_name_size = segmented_rt_temp->getName().length(); + memcpy(buff+serialized_bytes, &segmented_rt_name_size, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy segmented_rt name + memcpy(buff+serialized_bytes, segmented_rt_temp->getName().c_str(), segmented_rt_name_size*sizeof(char)); + serialized_bytes+=segmented_rt_name_size*sizeof(char); + // copy field blue memcpy(buff+serialized_bytes, &blue, sizeof(unsigned char)); - serialized_bytes+=sizeof(unsigned char); + serialized_bytes+=sizeof(unsigned char); // copy field green memcpy(buff+serialized_bytes, &green, sizeof(unsigned char)); - serialized_bytes+=sizeof(unsigned char); + serialized_bytes+=sizeof(unsigned char); // copy field red memcpy(buff+serialized_bytes, &red, sizeof(unsigned char)); - serialized_bytes+=sizeof(unsigned char); + serialized_bytes+=sizeof(unsigned char); // copy field T1 memcpy(buff+serialized_bytes, &T1, sizeof(double)); - serialized_bytes+=sizeof(double); + serialized_bytes+=sizeof(double); // copy field T2 memcpy(buff+serialized_bytes, &T2, sizeof(double)); - serialized_bytes+=sizeof(double); + serialized_bytes+=sizeof(double); // copy field G1 memcpy(buff+serialized_bytes, &G1, sizeof(unsigned char)); - serialized_bytes+=sizeof(unsigned char); + serialized_bytes+=sizeof(unsigned char); // copy field minSize memcpy(buff+serialized_bytes, &minSize, sizeof(int)); - serialized_bytes+=sizeof(int); + serialized_bytes+=sizeof(int); // copy field maxSize memcpy(buff+serialized_bytes, &maxSize, sizeof(int)); - serialized_bytes+=sizeof(int); + serialized_bytes+=sizeof(int); // copy field G2 memcpy(buff+serialized_bytes, &G2, sizeof(unsigned char)); - serialized_bytes+=sizeof(unsigned char); + serialized_bytes+=sizeof(unsigned char); // copy field minSizePl memcpy(buff+serialized_bytes, &minSizePl, sizeof(int)); - serialized_bytes+=sizeof(int); + serialized_bytes+=sizeof(int); // copy field minSizeSeg memcpy(buff+serialized_bytes, &minSizeSeg, sizeof(int)); - serialized_bytes+=sizeof(int); + serialized_bytes+=sizeof(int); // copy field maxSizeSeg memcpy(buff+serialized_bytes, &maxSizeSeg, sizeof(int)); - serialized_bytes+=sizeof(int); + serialized_bytes+=sizeof(int); // copy field fillHolesConnectivity memcpy(buff+serialized_bytes, &fillHolesConnectivity, sizeof(int)); - serialized_bytes+=sizeof(int); + serialized_bytes+=sizeof(int); // copy field reconConnectivity memcpy(buff+serialized_bytes, &reconConnectivity, sizeof(int)); - serialized_bytes+=sizeof(int); + serialized_bytes+=sizeof(int); // copy field watershedConnectivity memcpy(buff+serialized_bytes, &watershedConnectivity, sizeof(int)); - serialized_bytes+=sizeof(int); + serialized_bytes+=sizeof(int); return serialized_bytes; } @@ -362,6 +420,46 @@ int TaskSegmentation::serialize(char *buff) { int TaskSegmentation::deserialize(char *buff) { int deserialized_bytes = 0; + // create the normalized_rt + this->normalized_rt_temp = new DenseDataRegion2D(); + + // extract normalized_rt id + int normalized_rt_id = ((int*)(buff+deserialized_bytes))[0]; + this->normalized_rt_temp->setId(to_string(normalized_rt_id)); + this->normalized_rt_temp->setVersion(normalized_rt_id); + deserialized_bytes += sizeof(int); + + // extract normalized_rt name size + int normalized_rt_name_size = ((int*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(int); + + // copy normalized_rt name + char normalized_rt_name[normalized_rt_name_size+1]; + normalized_rt_name[normalized_rt_name_size] = '\0'; + memcpy(normalized_rt_name, buff+deserialized_bytes, sizeof(char)*normalized_rt_name_size); + deserialized_bytes += sizeof(char)*normalized_rt_name_size; + this->normalized_rt_temp->setName(normalized_rt_name); + + // create the segmented_rt + this->segmented_rt_temp = new DenseDataRegion2D(); + + // extract segmented_rt id + int segmented_rt_id = ((int*)(buff+deserialized_bytes))[0]; + this->segmented_rt_temp->setId(to_string(segmented_rt_id)); + this->segmented_rt_temp->setVersion(segmented_rt_id); + deserialized_bytes += sizeof(int); + + // extract segmented_rt name size + int segmented_rt_name_size = ((int*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(int); + + // copy segmented_rt name + char segmented_rt_name[segmented_rt_name_size+1]; + segmented_rt_name[segmented_rt_name_size] = '\0'; + memcpy(segmented_rt_name, buff+deserialized_bytes, sizeof(char)*segmented_rt_name_size); + deserialized_bytes += sizeof(char)*segmented_rt_name_size; + this->segmented_rt_temp->setName(segmented_rt_name); + // extract field blue this->blue = ((unsigned char*)(buff+deserialized_bytes))[0]; deserialized_bytes += sizeof(unsigned char); diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp index 40f3d37..ac949fe 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp @@ -75,12 +75,13 @@ class TaskSegmentation: public ReusableTask { bool run(int procType=ExecEngineConstants::CPU, int tid=0); - virtual bool reusable(ReusableTask* t); + bool reusable(ReusableTask* t); + void updateDR(RegionTemplate* rt); - virtual int serialize(char *buff); - virtual int deserialize(char *buff); - virtual ReusableTask* clone(); - virtual int size(); + int serialize(char *buff); + int deserialize(char *buff); + ReusableTask* clone(); + int size(); void print(); }; From 0ba23a40ef1d965b47b6e9d657aa561bacae68b9 Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Wed, 17 Aug 2016 13:30:01 -0300 Subject: [PATCH 22/87] Task reuse structure implemented and working with one single workflow (no actual reuse yet). --- runtime/ReusableTask.hpp | 9 +- .../PipelineManager.cpp | 35 +- .../PipelineRTFS-NS-Diff-FGO/Segmentation.cpp | 757 +++++++++++++----- .../PipelineRTFS-NS-Diff-FGO/Segmentation.hpp | 91 ++- 4 files changed, 660 insertions(+), 232 deletions(-) diff --git a/runtime/ReusableTask.hpp b/runtime/ReusableTask.hpp index 776dc38..b66cb24 100644 --- a/runtime/ReusableTask.hpp +++ b/runtime/ReusableTask.hpp @@ -22,13 +22,18 @@ typedef ReusableTask* (task_factory_t1)(list args, RegionTemplate typedef ReusableTask* (task_factory_t2)(); class ReusableTask: public Task { - public: - ReusableTask() {}; + // list of tasks' ids that are dependent on this task + int parentTask; + + ReusableTask() {parentTask = -1;}; virtual ~ReusableTask() {}; virtual bool reusable(ReusableTask* t) = 0; virtual void updateDR(RegionTemplate* rt) = 0; + // sets the interstage arguments with the pointers of the task t + virtual void updateInterStageArgs(ReusableTask* t) = 0; + virtual void resolveDependencies(ReusableTask* t) = 0; // Write component data to a buffer virtual int serialize(char *buff) = 0; diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index e58ebc4..ede95e1 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -224,7 +224,7 @@ int main(int argc, char* argv[]) { cout << "\ttasks: " << endl; for (ReusableTask* t : p.second->tasks) { cout << "\t\t" << t->getId() << ":" << t->getTaskName() << endl; - // t.second->print(); + t->print(); } } @@ -916,11 +916,13 @@ list task_generator(map> &tasks_desc, PipelineComponentBase* p, RegionTemplate* rt, map expanded_args) { list tasks; + ReusableTask* prev_task = NULL; - for (pair> t : tasks_desc) { + // traverse the map on reverse order to set dependencies + for (map>::reverse_iterator t=tasks_desc.rbegin(); t!=tasks_desc.rend(); t++) { // get task args list args; - for (ArgumentBase* a : t.second) { + for (ArgumentBase* a : t->second) { ArgumentBase* aa = find_argument(p, a->getName(), expanded_args); if (aa != NULL) args.emplace_back(aa); @@ -928,11 +930,16 @@ list task_generator(map> &tasks_desc, // call constructor int uid = new_uid(); - ReusableTask* n_task = ReusableTask::ReusableTaskFactory::getTaskFromName(t.first, args, rt); + ReusableTask* n_task = ReusableTask::ReusableTaskFactory::getTaskFromName(t->first, args, rt); n_task->setId(uid); - n_task->setTaskName(t.first); + n_task->setTaskName(t->first); + // set prevoius task dependency if this isn't the first task generated + if (t != tasks_desc.rbegin()) { + prev_task->parentTask = n_task->getId(); + } + prev_task = n_task; tasks.emplace_back(n_task); - cout << "[task_generator] new task " << uid << ":" << t.first << " with size " << n_task->size() << endl; + cout << "[task_generator] new task " << uid << ":" << t->first << " with size " << n_task->size() << endl; } return tasks; @@ -948,13 +955,23 @@ ReusableTask* find_task(list l, string name) { void merge_stages(PipelineComponentBase* current, PipelineComponentBase* s, map> ref) { for (map>::iterator p=ref.begin(); p!=ref.end(); p++) { // verify if this is the first reusable task - ReusableTask* t = find_task(s->tasks, p->first); - if (find_task(current->tasks, p->first)->reusable(t)) { + ReusableTask* t_s = find_task(s->tasks, p->first); + ReusableTask* t_cur = find_task(current->tasks, p->first); + if (t_cur->reusable(t_s)) { cout << "[merged_stages] found reusable task " << p->first << endl; + + // update interstage args of frontier task + t_s = find_task(s->tasks, (++p)->first); + t_cur = find_task(current->tasks, p->first); + + current->tasks.emplace_back(t_s); + p++; + // add all remaining tasks for (; p!=ref.end(); p++) { cout << "[merged_stages] reused task " << p->first << endl; - current->tasks.emplace_back(t); + t_s = find_task(s->tasks, p->first); + current->tasks.emplace_back(t_s); } return; } diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp index 73c6348..4187acc 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp @@ -9,6 +9,7 @@ #include #include +#include /**************************************************************************************/ /**************************** PipelineComponent functions *****************************/ @@ -18,59 +19,68 @@ Segmentation::Segmentation() { this->setComponentName("Segmentation"); // generate task descriptors - list segmentation_task_args; + list segmentation_task1_args; + list segmentation_task2_args; + list segmentation_task3_args; + ArgumentRT* normalized_rt = new ArgumentRT(); normalized_rt->setName("normalized_rt"); - segmentation_task_args.emplace_back(normalized_rt); - ArgumentRT* segmented_rt = new ArgumentRT(); - segmented_rt->setName("segmented_rt"); - segmentation_task_args.emplace_back(segmented_rt); + segmentation_task1_args.emplace_back(normalized_rt); ArgumentInt* blue = new ArgumentInt(); blue->setName("blue"); - segmentation_task_args.emplace_back(blue); + segmentation_task1_args.emplace_back(blue); ArgumentInt* green = new ArgumentInt(); green->setName("green"); - segmentation_task_args.emplace_back(green); + segmentation_task1_args.emplace_back(green); ArgumentInt* red = new ArgumentInt(); red->setName("red"); - segmentation_task_args.emplace_back(red); + segmentation_task1_args.emplace_back(red); ArgumentFloat* T1 = new ArgumentFloat(); T1->setName("T1"); - segmentation_task_args.emplace_back(T1); + segmentation_task1_args.emplace_back(T1); ArgumentFloat* T2 = new ArgumentFloat(); T2->setName("T2"); - segmentation_task_args.emplace_back(T2); + segmentation_task1_args.emplace_back(T2); ArgumentInt* G1 = new ArgumentInt(); G1->setName("G1"); - segmentation_task_args.emplace_back(G1); + segmentation_task1_args.emplace_back(G1); ArgumentInt* minSize = new ArgumentInt(); minSize->setName("minSize"); - segmentation_task_args.emplace_back(minSize); + segmentation_task1_args.emplace_back(minSize); ArgumentInt* maxSize = new ArgumentInt(); maxSize->setName("maxSize"); - segmentation_task_args.emplace_back(maxSize); + segmentation_task1_args.emplace_back(maxSize); ArgumentInt* G2 = new ArgumentInt(); G2->setName("G2"); - segmentation_task_args.emplace_back(G2); - ArgumentInt* minSizePl = new ArgumentInt(); - minSizePl->setName("minSizePl"); - segmentation_task_args.emplace_back(minSizePl); - ArgumentInt* minSizeSeg = new ArgumentInt(); - minSizeSeg->setName("minSizeSeg"); - segmentation_task_args.emplace_back(minSizeSeg); - ArgumentInt* maxSizeSeg = new ArgumentInt(); - maxSizeSeg->setName("maxSizeSeg"); - segmentation_task_args.emplace_back(maxSizeSeg); + segmentation_task1_args.emplace_back(G2); ArgumentInt* fillHolesConnectivity = new ArgumentInt(); fillHolesConnectivity->setName("fillHolesConnectivity"); - segmentation_task_args.emplace_back(fillHolesConnectivity); + segmentation_task1_args.emplace_back(fillHolesConnectivity); ArgumentInt* reconConnectivity = new ArgumentInt(); reconConnectivity->setName("reconConnectivity"); - segmentation_task_args.emplace_back(reconConnectivity); + segmentation_task1_args.emplace_back(reconConnectivity); + this->tasksDesc["Task1Segmentation"] = segmentation_task1_args; + + segmentation_task2_args.emplace_back(normalized_rt); + ArgumentInt* minSizePl = new ArgumentInt(); + minSizePl->setName("minSizePl"); + segmentation_task2_args.emplace_back(minSizePl); ArgumentInt* watershedConnectivity = new ArgumentInt(); watershedConnectivity->setName("watershedConnectivity"); - segmentation_task_args.emplace_back(watershedConnectivity); - this->tasksDesc["TaskSegmentation"] = segmentation_task_args; + segmentation_task2_args.emplace_back(watershedConnectivity); + this->tasksDesc["Task2Segmentation"] = segmentation_task2_args; + + ArgumentInt* minSizeSeg = new ArgumentInt(); + minSizeSeg->setName("minSizeSeg"); + segmentation_task3_args.emplace_back(minSizeSeg); + ArgumentInt* maxSizeSeg = new ArgumentInt(); + maxSizeSeg->setName("maxSizeSeg"); + segmentation_task3_args.emplace_back(maxSizeSeg); + segmentation_task3_args.emplace_back(fillHolesConnectivity); + ArgumentRT* segmented_rt = new ArgumentRT(); + segmented_rt->setName("segmented_rt"); + segmentation_task3_args.emplace_back(segmented_rt); + this->tasksDesc["Task3Segmentation"] = segmentation_task3_args; } Segmentation::~Segmentation() {} @@ -81,53 +91,28 @@ int Segmentation::run() { std::cout << "Executing component: " << this->getComponentName() << " instance id: " << this->getId() <getRegionTemplateInstance("tile"); - // ArgumentRT* normalized_rt_arg; - // ArgumentRT* segmented_rt_arg; - - // for(int i=0; igetArgumentsSize(); i++){ - // if (this->getArgument(i)->getName().compare("normalized_rt") == 0) { - // normalized_rt_arg = (ArgumentRT*)this->getArgument(i); - // } - - // if (this->getArgument(i)->getName().compare("segmented_rt") == 0) { - // segmented_rt_arg = (ArgumentRT*)this->getArgument(i); - // } - // } - this->addInputOutputDataRegion("tile", "normalized_rt", RTPipelineComponentBase::INPUT); - this->addInputOutputDataRegion("tile", "segmented_rt", RTPipelineComponentBase::OUTPUT); - - // if(inputRt != NULL){ - // DenseDataRegion2D *normalized_rt = NULL; - - // DenseDataRegion2D *segmented_rt = NULL; - - // normalized_rt = dynamic_cast(inputRt->getDataRegion( - // normalized_rt_arg->getName(), std::to_string(normalized_rt_arg->getId()), 0, normalized_rt_arg->getId())); - - // segmented_rt = new DenseDataRegion2D(); - // segmented_rt->setName(segmented_rt_arg->getName()); - // segmented_rt->setId(std::to_string(segmented_rt_arg->getId())); - // segmented_rt->setVersion(segmented_rt_arg->getId()); - // inputRt->insertDataRegion(segmented_rt); - - // // Create processing task - // TaskSegmentation* task = (TaskSegmentation*)(*tasks.begin())->clone(); - // task->normalized_rt_temp = normalized_rt; - // task->segmented_rt_temp = segmented_rt; - - for (ReusableTask* task : tasks) { - ReusableTask* t = task->clone(); - t->updateDR(inputRt); - this->executeTask(t); + map prev_map; + for (list::reverse_iterator task=tasks.rbegin(); task!=tasks.rend(); task++) { + cout << "[Segmentation] sending task " << (*task)->getId() << endl; + // generate a task copy and update the DR, getting the actual data + ReusableTask* t = (*task)->clone(); + t->updateDR(inputRt); + + // solve dependency if it isn't the first task + if (t->parentTask != -1) { + t->addDependency(prev_map[t->parentTask]); + t->resolveDependencies(prev_map[t->parentTask]); } - // }else{ - // std::cout << __FILE__ << ":" << __LINE__ <<" RT == NULL" << std::endl; - // exit(1); - // } + // send task to be executed + this->executeTask(t); + + // add this task to parent list for future dependency resolution + prev_map[t->getId()] = t; + } return 0; } @@ -145,8 +130,7 @@ bool registeredSegmentation = PipelineComponentBase::ComponentFactory::component /*********************************** Task functions ***********************************/ /**************************************************************************************/ -TaskSegmentation::TaskSegmentation(list args, RegionTemplate* inputRt) { - +Task1Segmentation::Task1Segmentation(list args, RegionTemplate* inputRt) { int set_cout = 0; for(ArgumentBase* a : args){ @@ -160,16 +144,6 @@ TaskSegmentation::TaskSegmentation(list args, RegionTemplate* inp set_cout++; } - if (a->getName().compare("segmented_rt") == 0) { - ArgumentRT* segmented_rt_arg; - segmented_rt_arg = (ArgumentRT*)a; - this->segmented_rt_temp = new DenseDataRegion2D(); - this->segmented_rt_temp->setName(segmented_rt_arg->getName()); - this->segmented_rt_temp->setId(std::to_string(segmented_rt_arg->getId())); - this->segmented_rt_temp->setVersion(segmented_rt_arg->getId()); - set_cout++; - } - if (a->getName().compare("blue") == 0) { this->blue = (unsigned char)((ArgumentInt*)a)->getArgValue(); set_cout++; @@ -215,21 +189,6 @@ TaskSegmentation::TaskSegmentation(list args, RegionTemplate* inp set_cout++; } - if (a->getName().compare("minSizePl") == 0) { - this->minSizePl = (int)((ArgumentInt*)a)->getArgValue(); - set_cout++; - } - - if (a->getName().compare("minSizeSeg") == 0) { - this->minSizeSeg = (int)((ArgumentInt*)a)->getArgValue(); - set_cout++; - } - - if (a->getName().compare("maxSizeSeg") == 0) { - this->maxSizeSeg = (int)((ArgumentInt*)a)->getArgValue(); - set_cout++; - } - if (a->getName().compare("fillHolesConnectivity") == 0) { this->fillHolesConnectivity = (int)((ArgumentInt*)a)->getArgValue(); set_cout++; @@ -239,59 +198,57 @@ TaskSegmentation::TaskSegmentation(list args, RegionTemplate* inp this->reconConnectivity = (int)((ArgumentInt*)a)->getArgValue(); set_cout++; } - - if (a->getName().compare("watershedConnectivity") == 0) { - this->watershedConnectivity = (int)((ArgumentInt*)a)->getArgValue(); - set_cout++; - } } // all arguments except the DataRegions if (set_cout < args.size()) std::cout << __FILE__ << ":" << __LINE__ <<" Missing common arguments on Segmentation" << std::endl; - } -TaskSegmentation::~TaskSegmentation() { +Task1Segmentation::~Task1Segmentation() { if(normalized_rt_temp != NULL) delete normalized_rt_temp; } -bool TaskSegmentation::run(int procType, int tid) { +bool Task1Segmentation::run(int procType, int tid) { + cv::Mat seg_open_temp; cv::Mat normalized_rt = this->normalized_rt_temp->getData(); - cv::Mat segmented_rt; - uint64_t t1 = Util::ClockGetTimeProfile(); - std::cout << "TaskSegmentation executing." << std::endl; + std::cout << "[Task1Segmentation] executing." << std::endl; - ::nscale::HistologicalEntities::segmentNuclei(normalized_rt, segmented_rt, blue, green, - red, T1, T2, G1, minSize, maxSize, G2, minSizePl, minSizeSeg, maxSizeSeg, fillHolesConnectivity, - reconConnectivity, watershedConnectivity); + ::nscale::HistologicalEntities::segmentNucleiStg1(normalized_rt, blue, green, + red, T1, T2, G1, minSize, maxSize, G2, fillHolesConnectivity, + reconConnectivity, &seg_open_temp); - this->segmented_rt_temp->setData(segmented_rt); - uint64_t t2 = Util::ClockGetTimeProfile(); - std::cout << "Task Segmentation time elapsed: "<< t2-t1 << std::endl; + seg_open = new cv::Mat(seg_open_temp); + + std::cout << "[Task1Segmentation] time elapsed: "<< t2-t1 << std::endl; } -void TaskSegmentation::updateDR(RegionTemplate* rt) { +void Task1Segmentation::updateDR(RegionTemplate* rt) { normalized_rt_temp = dynamic_cast(rt->getDataRegion(this->normalized_rt_temp->getName(), this->normalized_rt_temp->getId(), 0, stoi(this->normalized_rt_temp->getId()))); +} - rt->insertDataRegion(this->segmented_rt_temp); +void Task1Segmentation::updateInterStageArgs(ReusableTask* t) { + // verify if the tasks are compatible + if (typeid(t) != typeid(this)) { + std::cout << "[Task1Segmentation] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + return; + } } -bool TaskSegmentation::reusable(ReusableTask* rt) { - TaskSegmentation* t = (TaskSegmentation*)(rt); +void Task1Segmentation::resolveDependencies(ReusableTask* t) {} + +bool Task1Segmentation::reusable(ReusableTask* rt) { + Task1Segmentation* t = (Task1Segmentation*)(rt); if (this->normalized_rt_temp->getName() == t->normalized_rt_temp->getName() && this->normalized_rt_temp->getId() == t->normalized_rt_temp->getId() && this->normalized_rt_temp->getVersion() == t->normalized_rt_temp->getVersion() && - this->segmented_rt_temp->getName() == t->segmented_rt_temp->getName() && - this->segmented_rt_temp->getId() == t->segmented_rt_temp->getId() && - this->segmented_rt_temp->getVersion() == t->segmented_rt_temp->getVersion() && this->blue == t->blue && this->green == t->green && this->red == t->red && @@ -301,12 +258,8 @@ bool TaskSegmentation::reusable(ReusableTask* rt) { this->minSize == t->minSize && this->maxSize == t->maxSize && this->G2 == t->G2 && - this->minSizePl == t->minSizePl && - this->minSizeSeg == t->minSizeSeg && - this->maxSizeSeg == t->maxSizeSeg && this->fillHolesConnectivity == t->fillHolesConnectivity && - this->reconConnectivity == t->reconConnectivity && - this->watershedConnectivity == t->watershedConnectivity) { + this->reconConnectivity == t->reconConnectivity) { return true; } else { @@ -315,17 +268,26 @@ bool TaskSegmentation::reusable(ReusableTask* rt) { return true; } -int TaskSegmentation::size() { +int Task1Segmentation::size() { return sizeof(unsigned char) + sizeof(unsigned char) + sizeof(unsigned char) + sizeof(double) + sizeof(double) + sizeof(unsigned char) + sizeof(int) + sizeof(int) + sizeof(unsigned char) + - sizeof(int) + sizeof(int) + sizeof(int) + sizeof(int) + sizeof(int) + sizeof(int) + - sizeof(int) + sizeof(int) + normalized_rt_temp->getName().length()*sizeof(char) + - sizeof(int) + sizeof(int) + segmented_rt_temp->getName().length()*sizeof(char); + sizeof(int) + sizeof(int) + sizeof(int) + sizeof(int) + + sizeof(int) + sizeof(int) + normalized_rt_temp->getName().length()*sizeof(char); } -int TaskSegmentation::serialize(char *buff) { +int Task1Segmentation::serialize(char *buff) { int serialized_bytes = 0; + // copy id + int id = this->getId(); + memcpy(buff+serialized_bytes, &id, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy parent task id + int pt = this->parentTask; + memcpy(buff+serialized_bytes, &pt, sizeof(int)); + serialized_bytes+=sizeof(int); + // copy normalized_rt id int normalized_rt_id = stoi(normalized_rt_temp->getId()); memcpy(buff+serialized_bytes, &normalized_rt_id, sizeof(int)); @@ -340,20 +302,6 @@ int TaskSegmentation::serialize(char *buff) { memcpy(buff+serialized_bytes, normalized_rt_temp->getName().c_str(), normalized_rt_name_size*sizeof(char)); serialized_bytes+=normalized_rt_name_size*sizeof(char); - // copy segmented_rt id - int segmented_rt_id = stoi(segmented_rt_temp->getId()); - memcpy(buff+serialized_bytes, &segmented_rt_id, sizeof(int)); - serialized_bytes+=sizeof(int); - - // copy segmented_rt name size - int segmented_rt_name_size = segmented_rt_temp->getName().length(); - memcpy(buff+serialized_bytes, &segmented_rt_name_size, sizeof(int)); - serialized_bytes+=sizeof(int); - - // copy segmented_rt name - memcpy(buff+serialized_bytes, segmented_rt_temp->getName().c_str(), segmented_rt_name_size*sizeof(char)); - serialized_bytes+=segmented_rt_name_size*sizeof(char); - // copy field blue memcpy(buff+serialized_bytes, &blue, sizeof(unsigned char)); serialized_bytes+=sizeof(unsigned char); @@ -389,18 +337,6 @@ int TaskSegmentation::serialize(char *buff) { // copy field G2 memcpy(buff+serialized_bytes, &G2, sizeof(unsigned char)); serialized_bytes+=sizeof(unsigned char); - - // copy field minSizePl - memcpy(buff+serialized_bytes, &minSizePl, sizeof(int)); - serialized_bytes+=sizeof(int); - - // copy field minSizeSeg - memcpy(buff+serialized_bytes, &minSizeSeg, sizeof(int)); - serialized_bytes+=sizeof(int); - - // copy field maxSizeSeg - memcpy(buff+serialized_bytes, &maxSizeSeg, sizeof(int)); - serialized_bytes+=sizeof(int); // copy field fillHolesConnectivity memcpy(buff+serialized_bytes, &fillHolesConnectivity, sizeof(int)); @@ -410,16 +346,20 @@ int TaskSegmentation::serialize(char *buff) { memcpy(buff+serialized_bytes, &reconConnectivity, sizeof(int)); serialized_bytes+=sizeof(int); - // copy field watershedConnectivity - memcpy(buff+serialized_bytes, &watershedConnectivity, sizeof(int)); - serialized_bytes+=sizeof(int); - return serialized_bytes; } -int TaskSegmentation::deserialize(char *buff) { +int Task1Segmentation::deserialize(char *buff) { int deserialized_bytes = 0; + // extract task id + this->setId(((int*)(buff+deserialized_bytes))[0]); + deserialized_bytes += sizeof(int); + + // extract parent task id + this->parentTask = ((int*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(int); + // create the normalized_rt this->normalized_rt_temp = new DenseDataRegion2D(); @@ -440,26 +380,6 @@ int TaskSegmentation::deserialize(char *buff) { deserialized_bytes += sizeof(char)*normalized_rt_name_size; this->normalized_rt_temp->setName(normalized_rt_name); - // create the segmented_rt - this->segmented_rt_temp = new DenseDataRegion2D(); - - // extract segmented_rt id - int segmented_rt_id = ((int*)(buff+deserialized_bytes))[0]; - this->segmented_rt_temp->setId(to_string(segmented_rt_id)); - this->segmented_rt_temp->setVersion(segmented_rt_id); - deserialized_bytes += sizeof(int); - - // extract segmented_rt name size - int segmented_rt_name_size = ((int*)(buff+deserialized_bytes))[0]; - deserialized_bytes += sizeof(int); - - // copy segmented_rt name - char segmented_rt_name[segmented_rt_name_size+1]; - segmented_rt_name[segmented_rt_name_size] = '\0'; - memcpy(segmented_rt_name, buff+deserialized_bytes, sizeof(char)*segmented_rt_name_size); - deserialized_bytes += sizeof(char)*segmented_rt_name_size; - this->segmented_rt_temp->setName(segmented_rt_name); - // extract field blue this->blue = ((unsigned char*)(buff+deserialized_bytes))[0]; deserialized_bytes += sizeof(unsigned char); @@ -496,10 +416,440 @@ int TaskSegmentation::deserialize(char *buff) { this->G2 = ((unsigned char*)(buff+deserialized_bytes))[0]; deserialized_bytes += sizeof(unsigned char); + // extract field fillHolesConnectivity + this->fillHolesConnectivity = ((int*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(int); + + // extract field reconConnectivity + this->reconConnectivity = ((int*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(int); + + return deserialized_bytes; +} + +ReusableTask* Task1Segmentation::clone() { + ReusableTask* retValue = new Task1Segmentation(); + int size = this->size(); + char *buff = new char[size]; + this->serialize(buff); + retValue->deserialize(buff); + delete buff; + + return retValue; +} + +void Task1Segmentation::print() { + + cout << "\t\t\tblue: " << int(blue) << endl; + cout << "\t\t\tgreen: " << int(green) << endl; + cout << "\t\t\tblue: " << int(red) << endl; + cout << "\t\t\tT1: " << T1 << endl; + cout << "\t\t\tT2: " << T2 << endl; + cout << "\t\t\tG1: " << int(G1) << endl; + cout << "\t\t\tminSize: " << minSize << endl; + cout << "\t\t\tmaxSize: " << maxSize << endl; + cout << "\t\t\tG2: " << int(G2) << endl; + cout << "\t\t\tfillHolesConnectivity: " << fillHolesConnectivity << endl; + cout << "\t\t\treconConnectivity: " << reconConnectivity << endl; + cout << "\t\t\tout-seg_open: " << &seg_open << endl; +} + +// Create the task factory +ReusableTask* task1FactorySegmentation1(list args, RegionTemplate* inputRt) { + return new Task1Segmentation(args, inputRt); +} + +// Create the task factory +ReusableTask* task2FactorySegmentation2() { + return new Task1Segmentation(); +} + +// register factory with the runtime system +bool registeredSegmentationTask1 = ReusableTask::ReusableTaskFactory::taskRegister("Task1Segmentation", + &task1FactorySegmentation1, &task2FactorySegmentation2); + + +Task2Segmentation::Task2Segmentation(list args, RegionTemplate* inputRt) { + int set_cout = 0; + for(ArgumentBase* a : args){ + + if (a->getName().compare("normalized_rt") == 0) { + ArgumentRT* normalized_rt_arg; + normalized_rt_arg = (ArgumentRT*)a; + this->normalized_rt_temp = new DenseDataRegion2D(); + this->normalized_rt_temp->setName(normalized_rt_arg->getName()); + this->normalized_rt_temp->setId(std::to_string(normalized_rt_arg->getId())); + this->normalized_rt_temp->setVersion(normalized_rt_arg->getId()); + set_cout++; + } + + if (a->getName().compare("minSizePl") == 0) { + this->minSizePl = (int)((ArgumentInt*)a)->getArgValue(); + set_cout++; + } + + if (a->getName().compare("watershedConnectivity") == 0) { + this->watershedConnectivity = (int)((ArgumentInt*)a)->getArgValue(); + set_cout++; + } + } + + // all arguments except the DataRegions + if (set_cout < args.size()) + std::cout << __FILE__ << ":" << __LINE__ <<" Missing common arguments on Segmentation" << std::endl; +} + +Task2Segmentation::~Task2Segmentation() { + if(normalized_rt_temp != NULL) delete normalized_rt_temp; +} + +bool Task2Segmentation::run(int procType, int tid) { + + cv::Mat seg_nonoverlap_temp; + cv::Mat normalized_rt = this->normalized_rt_temp->getData(); + + uint64_t t1 = Util::ClockGetTimeProfile(); + + std::cout << "[Task2Segmentation] executing." << std::endl; + + ::nscale::HistologicalEntities::segmentNucleiStg2(normalized_rt, minSizePl, watershedConnectivity, *seg_open, &seg_nonoverlap_temp); + + uint64_t t2 = Util::ClockGetTimeProfile(); + seg_nonoverlap = new cv::Mat(seg_nonoverlap_temp); + + std::cout << "[Task2Segmentation] time elapsed: "<< t2-t1 << std::endl; +} + +void Task2Segmentation::updateDR(RegionTemplate* rt) { + normalized_rt_temp = dynamic_cast(rt->getDataRegion(this->normalized_rt_temp->getName(), + this->normalized_rt_temp->getId(), 0, stoi(this->normalized_rt_temp->getId()))); +} + +void Task2Segmentation::updateInterStageArgs(ReusableTask* t) { + // verify if the tasks are compatible + if (typeid(t) != typeid(this)) { + std::cout << "[Task2Segmentation] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + return; + } + + this->seg_open = ((Task2Segmentation*)t)->seg_open; +} + +void Task2Segmentation::resolveDependencies(ReusableTask* t) { + // verify if the task type is compatible + if (typeid(t) != typeid(Task1Segmentation)) { + std::cout << "[Task2Segmentation] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + } + this->seg_open = &((Task1Segmentation*)t)->seg_open; +} + +bool Task2Segmentation::reusable(ReusableTask* rt) { + Task2Segmentation* t = (Task2Segmentation*)(rt); + if (this->normalized_rt_temp->getName() == t->normalized_rt_temp->getName() && + this->normalized_rt_temp->getId() == t->normalized_rt_temp->getId() && + this->normalized_rt_temp->getVersion() == t->normalized_rt_temp->getVersion() && + this->minSizePl == t->minSizePl && + this->watershedConnectivity == t->watershedConnectivity) { + + return true; + } else { + return false; + } + return true; +} + +int Task2Segmentation::size() { + return sizeof(int) + sizeof(int) + sizeof(int) + sizeof(int) + + sizeof(int) + sizeof(int) + normalized_rt_temp->getName().length()*sizeof(char); +} + +int Task2Segmentation::serialize(char *buff) { + int serialized_bytes = 0; + + // copy id + int id = this->getId(); + memcpy(buff+serialized_bytes, &id, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy parent task id + int pt = this->parentTask; + memcpy(buff+serialized_bytes, &pt, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy normalized_rt id + int normalized_rt_id = stoi(normalized_rt_temp->getId()); + memcpy(buff+serialized_bytes, &normalized_rt_id, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy normalized_rt name size + int normalized_rt_name_size = normalized_rt_temp->getName().length(); + memcpy(buff+serialized_bytes, &normalized_rt_name_size, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy normalized_rt name + memcpy(buff+serialized_bytes, normalized_rt_temp->getName().c_str(), normalized_rt_name_size*sizeof(char)); + serialized_bytes+=normalized_rt_name_size*sizeof(char); + + // copy field minSizePl + memcpy(buff+serialized_bytes, &minSizePl, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy field watershedConnectivity + memcpy(buff+serialized_bytes, &watershedConnectivity, sizeof(int)); + serialized_bytes+=sizeof(int); + + return serialized_bytes; +} + +int Task2Segmentation::deserialize(char *buff) { + int deserialized_bytes = 0; + + // extract task id + this->setId(((int*)(buff+deserialized_bytes))[0]); + deserialized_bytes += sizeof(int); + + // extract parent task id + this->parentTask = ((int*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(int); + + // create the normalized_rt + this->normalized_rt_temp = new DenseDataRegion2D(); + + // extract normalized_rt id + int normalized_rt_id = ((int*)(buff+deserialized_bytes))[0]; + this->normalized_rt_temp->setId(to_string(normalized_rt_id)); + this->normalized_rt_temp->setVersion(normalized_rt_id); + deserialized_bytes += sizeof(int); + + // extract normalized_rt name size + int normalized_rt_name_size = ((int*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(int); + + // copy normalized_rt name + char normalized_rt_name[normalized_rt_name_size+1]; + normalized_rt_name[normalized_rt_name_size] = '\0'; + memcpy(normalized_rt_name, buff+deserialized_bytes, sizeof(char)*normalized_rt_name_size); + deserialized_bytes += sizeof(char)*normalized_rt_name_size; + this->normalized_rt_temp->setName(normalized_rt_name); + // extract field minSizePl this->minSizePl = ((int*)(buff+deserialized_bytes))[0]; deserialized_bytes += sizeof(int); + // extract field watershedConnectivity + this->watershedConnectivity = ((int*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(int); + + return deserialized_bytes; +} + +ReusableTask* Task2Segmentation::clone() { + ReusableTask* retValue = new Task2Segmentation(); + int size = this->size(); + char *buff = new char[size]; + this->serialize(buff); + retValue->deserialize(buff); + delete buff; + + return retValue; +} + +void Task2Segmentation::print() { + + cout << "\t\t\tminSizePl: " << minSizePl << endl; + cout << "\t\t\twatershedConnectivity: " << watershedConnectivity << endl; + cout << "\t\t\tin-seg_open: " << seg_open << endl; + cout << "\t\t\tout-seg_nonoverlap: " << &seg_nonoverlap << endl; +} + +// Create the task factory +ReusableTask* task2FactorySegmentation1(list args, RegionTemplate* inputRt) { + return new Task2Segmentation(args, inputRt); +} + +// Create the task factory +ReusableTask* taskFactorySegmentation2() { + return new Task2Segmentation(); +} + +// register factory with the runtime system +bool registeredSegmentationTask2 = ReusableTask::ReusableTaskFactory::taskRegister("Task2Segmentation", + &task2FactorySegmentation1, &taskFactorySegmentation2); + +Task3Segmentation::Task3Segmentation(list args, RegionTemplate* inputRt) { + + int set_cout = 0; + for(ArgumentBase* a : args){ + + if (a->getName().compare("segmented_rt") == 0) { + ArgumentRT* segmented_rt_arg; + segmented_rt_arg = (ArgumentRT*)a; + this->segmented_rt_temp = new DenseDataRegion2D(); + this->segmented_rt_temp->setName(segmented_rt_arg->getName()); + this->segmented_rt_temp->setId(std::to_string(segmented_rt_arg->getId())); + this->segmented_rt_temp->setVersion(segmented_rt_arg->getId()); + set_cout++; + } + + if (a->getName().compare("minSizeSeg") == 0) { + this->minSizeSeg = (int)((ArgumentInt*)a)->getArgValue(); + set_cout++; + } + + if (a->getName().compare("maxSizeSeg") == 0) { + this->maxSizeSeg = (int)((ArgumentInt*)a)->getArgValue(); + set_cout++; + } + + if (a->getName().compare("fillHolesConnectivity") == 0) { + this->fillHolesConnectivity = (int)((ArgumentInt*)a)->getArgValue(); + set_cout++; + } + + } + + // all arguments except the DataRegions + if (set_cout < args.size()) + std::cout << __FILE__ << ":" << __LINE__ <<" Missing common arguments on Segmentation" << std::endl; +} + +Task3Segmentation::~Task3Segmentation() { + // if(segmented_rt_temp != NULL) delete segmented_rt_temp; +} + +bool Task3Segmentation::run(int procType, int tid) { + + cv::Mat segmented_rt; + + uint64_t t1 = Util::ClockGetTimeProfile(); + + std::cout << "[Task3Segmentation] executing." << std::endl; + + ::nscale::HistologicalEntities::segmentNucleiStg3(minSizeSeg, maxSizeSeg, fillHolesConnectivity, *seg_nonoverlap, &segmented_rt); + + this->segmented_rt_temp->setData(segmented_rt); + + uint64_t t2 = Util::ClockGetTimeProfile(); + + std::cout << "[Task3Segmentation] time elapsed: "<< t2-t1 << std::endl; +} + +void Task3Segmentation::updateDR(RegionTemplate* rt) { + rt->insertDataRegion(this->segmented_rt_temp); +} + +void Task3Segmentation::updateInterStageArgs(ReusableTask* t) { + // verify if the tasks are compatible + if (typeid(t) != typeid(this)) { + std::cout << "[Task3Segmentation] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + return; + } + + this->seg_nonoverlap = ((Task3Segmentation*)t)->seg_nonoverlap; +} + +void Task3Segmentation::resolveDependencies(ReusableTask* t) { + // verify if the task type is compatible + if (typeid(t) != typeid(Task2Segmentation)) { + std::cout << "[Task3Segmentation] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + } + this->seg_nonoverlap = &((Task2Segmentation*)t)->seg_nonoverlap; +} + +bool Task3Segmentation::reusable(ReusableTask* rt) { + Task3Segmentation* t = (Task3Segmentation*)(rt); + if (this->segmented_rt_temp->getName() == t->segmented_rt_temp->getName() && + this->segmented_rt_temp->getId() == t->segmented_rt_temp->getId() && + this->segmented_rt_temp->getVersion() == t->segmented_rt_temp->getVersion() && + this->minSizeSeg == t->minSizeSeg && + this->maxSizeSeg == t->maxSizeSeg && + this->fillHolesConnectivity == t->fillHolesConnectivity) { + + return true; + } else { + return false; + } + return true; +} + +int Task3Segmentation::size() { + return sizeof(int) + sizeof(int) + sizeof(int) + sizeof(int) + sizeof(int) + + sizeof(int) + sizeof(int) + segmented_rt_temp->getName().length()*sizeof(char); +} + +int Task3Segmentation::serialize(char *buff) { + int serialized_bytes = 0; + + // copy id + int id = this->getId(); + memcpy(buff+serialized_bytes, &id, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy parent task id + int pt = this->parentTask; + memcpy(buff+serialized_bytes, &pt, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy segmented_rt id + int segmented_rt_id = stoi(segmented_rt_temp->getId()); + memcpy(buff+serialized_bytes, &segmented_rt_id, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy segmented_rt name size + int segmented_rt_name_size = segmented_rt_temp->getName().length(); + memcpy(buff+serialized_bytes, &segmented_rt_name_size, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy segmented_rt name + memcpy(buff+serialized_bytes, segmented_rt_temp->getName().c_str(), segmented_rt_name_size*sizeof(char)); + serialized_bytes+=segmented_rt_name_size*sizeof(char); + + // copy field minSizeSeg + memcpy(buff+serialized_bytes, &minSizeSeg, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy field maxSizeSeg + memcpy(buff+serialized_bytes, &maxSizeSeg, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy field fillHolesConnectivity + memcpy(buff+serialized_bytes, &fillHolesConnectivity, sizeof(int)); + serialized_bytes+=sizeof(int); + + return serialized_bytes; +} + +int Task3Segmentation::deserialize(char *buff) { + int deserialized_bytes = 0; + + // extract task id + this->setId(((int*)(buff+deserialized_bytes))[0]); + deserialized_bytes += sizeof(int); + + // extract parent task id + this->parentTask = ((int*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(int); + + // create the segmented_rt + this->segmented_rt_temp = new DenseDataRegion2D(); + + // extract segmented_rt id + int segmented_rt_id = ((int*)(buff+deserialized_bytes))[0]; + this->segmented_rt_temp->setId(to_string(segmented_rt_id)); + this->segmented_rt_temp->setVersion(segmented_rt_id); + deserialized_bytes += sizeof(int); + + // extract segmented_rt name size + int segmented_rt_name_size = ((int*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(int); + + // copy segmented_rt name + char segmented_rt_name[segmented_rt_name_size+1]; + segmented_rt_name[segmented_rt_name_size] = '\0'; + memcpy(segmented_rt_name, buff+deserialized_bytes, sizeof(char)*segmented_rt_name_size); + deserialized_bytes += sizeof(char)*segmented_rt_name_size; + this->segmented_rt_temp->setName(segmented_rt_name); + // extract field minSizeSeg this->minSizeSeg = ((int*)(buff+deserialized_bytes))[0]; deserialized_bytes += sizeof(int); @@ -512,19 +862,11 @@ int TaskSegmentation::deserialize(char *buff) { this->fillHolesConnectivity = ((int*)(buff+deserialized_bytes))[0]; deserialized_bytes += sizeof(int); - // extract field reconConnectivity - this->reconConnectivity = ((int*)(buff+deserialized_bytes))[0]; - deserialized_bytes += sizeof(int); - - // extract field watershedConnectivity - this->watershedConnectivity = ((int*)(buff+deserialized_bytes))[0]; - deserialized_bytes += sizeof(int); - return deserialized_bytes; } -ReusableTask* TaskSegmentation::clone() { - ReusableTask* retValue = new TaskSegmentation(); +ReusableTask* Task3Segmentation::clone() { + ReusableTask* retValue = new Task3Segmentation(); int size = this->size(); char *buff = new char[size]; this->serialize(buff); @@ -534,35 +876,24 @@ ReusableTask* TaskSegmentation::clone() { return retValue; } -void TaskSegmentation::print() { +void Task3Segmentation::print() { - cout << "blue: " << int(blue) << endl; - cout << "green: " << int(green) << endl; - cout << "blue: " << int(red) << endl; - cout << "t1: " << T1 << endl; - cout << "t2: " << T2 << endl; - cout << "g1: " << int(G1) << endl; - cout << "minSize: " << minSize << endl; - cout << "maxSize: " << maxSize << endl; - cout << "G2: " << int(G2) << endl; - cout << "minSizePl: " << minSizePl << endl; - cout << "minSizeSeg: " << minSizeSeg << endl; - cout << "maxSizeSeg: " << maxSizeSeg << endl; - cout << "fillHolesConnectivity: " << fillHolesConnectivity << endl; - cout << "reconConnectivity: " << reconConnectivity << endl; - cout << "watershedConnectivity: " << watershedConnectivity << endl; + cout << "\t\t\tminSizeSeg: " << minSizeSeg << endl; + cout << "\t\t\tmaxSizeSeg: " << maxSizeSeg << endl; + cout << "\t\t\tfillHolesConnectivity: " << fillHolesConnectivity << endl; + cout << "\t\t\tin-seg_nonoverlap: " << seg_nonoverlap << endl; } // Create the task factory -ReusableTask* taskFactorySegmentation1(list args, RegionTemplate* inputRt) { - return new TaskSegmentation(args, inputRt); +ReusableTask* task3FactorySegmentation1(list args, RegionTemplate* inputRt) { + return new Task3Segmentation(args, inputRt); } // Create the task factory -ReusableTask* taskFactorySegmentation2() { - return new TaskSegmentation(); +ReusableTask* task3FactorySegmentation2() { + return new Task3Segmentation(); } // register factory with the runtime system -bool registeredSegmentationTask = ReusableTask::ReusableTaskFactory::taskRegister("TaskSegmentation", - &taskFactorySegmentation1, &taskFactorySegmentation2); \ No newline at end of file +bool registeredSegmentationTask3 = ReusableTask::ReusableTaskFactory::taskRegister("Task3Segmentation", + &task3FactorySegmentation1, &task3FactorySegmentation2); \ No newline at end of file diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp index ac949fe..73f7f59 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp @@ -40,8 +40,9 @@ class Segmentation : public RTPipelineComponentBase { int run(); }; -// Task header -class TaskSegmentation: public ReusableTask { +// Task1Segmentation header +class Task1Segmentation: public ReusableTask { +friend class Task2Segmentation; private: // all other variables @@ -54,29 +55,103 @@ class TaskSegmentation: public ReusableTask { int minSize; int maxSize; unsigned char G2; - int minSizePl; - int minSizeSeg; - int maxSizeSeg; int fillHolesConnectivity; int reconConnectivity; + + // intertask arguments + cv::Mat *seg_open; + +public: + + // data regions + DenseDataRegion2D* normalized_rt_temp; + + Task1Segmentation() {}; + Task1Segmentation(list args, RegionTemplate* inputRt); + + virtual ~Task1Segmentation(); + + bool run(int procType=ExecEngineConstants::CPU, int tid=0); + + bool reusable(ReusableTask* t); + void updateDR(RegionTemplate* rt); + void updateInterStageArgs(ReusableTask* t); + void resolveDependencies(ReusableTask* t); + + int serialize(char *buff); + int deserialize(char *buff); + ReusableTask* clone(); + int size(); + + void print(); +}; + +// Task2Segmentation header +class Task2Segmentation: public ReusableTask { +friend class Task3Segmentation; +private: + + // all other variables + int minSizePl; int watershedConnectivity; + // intertask arguments + cv::Mat **seg_open; + cv::Mat *seg_nonoverlap; public: // data regions DenseDataRegion2D* normalized_rt_temp; + + Task2Segmentation() {}; + Task2Segmentation(list args, RegionTemplate* inputRt); + + virtual ~Task2Segmentation(); + + bool run(int procType=ExecEngineConstants::CPU, int tid=0); + + bool reusable(ReusableTask* t); + void updateDR(RegionTemplate* rt); + void updateInterStageArgs(ReusableTask* t); + void resolveDependencies(ReusableTask* t); + + int serialize(char *buff); + int deserialize(char *buff); + ReusableTask* clone(); + int size(); + + void print(); +}; + +// Task3Segmentation header +class Task3Segmentation: public ReusableTask { +private: + + // all other variables + int minSizeSeg; + int maxSizeSeg; + int fillHolesConnectivity; + + // intertask arguments + cv::Mat **seg_nonoverlap; + +public: + + // data regions DenseDataRegion2D* segmented_rt_temp; - TaskSegmentation() {}; - TaskSegmentation(list args, RegionTemplate* inputRt); + Task3Segmentation() {}; + Task3Segmentation(list args, RegionTemplate* inputRt); - virtual ~TaskSegmentation(); + virtual ~Task3Segmentation(); bool run(int procType=ExecEngineConstants::CPU, int tid=0); bool reusable(ReusableTask* t); void updateDR(RegionTemplate* rt); + void updateInterStageArgs(ReusableTask* t); + void resolveDependencies(ReusableTask* t); int serialize(char *buff); int deserialize(char *buff); From cdf2512fb3843b496637891da06ff6c1dffe4ccc Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Wed, 17 Aug 2016 14:09:30 -0300 Subject: [PATCH 23/87] Task reuse partially working: Reuse happens and stages are merged, However, each stage has only one DR of each type, this way the DR value is overwritten by the last final task. --- .../PipelineManager.cpp | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index ede95e1..b655e0f 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -953,28 +953,32 @@ ReusableTask* find_task(list l, string name) { } void merge_stages(PipelineComponentBase* current, PipelineComponentBase* s, map> ref) { - for (map>::iterator p=ref.begin(); p!=ref.end(); p++) { + list non_reusable_tasks; + for (map>::reverse_iterator p=ref.rbegin(); p!=ref.rend(); p++) { // verify if this is the first reusable task ReusableTask* t_s = find_task(s->tasks, p->first); ReusableTask* t_cur = find_task(current->tasks, p->first); if (t_cur->reusable(t_s)) { cout << "[merged_stages] found reusable task " << p->first << endl; + list::iterator t = non_reusable_tasks.begin(); // update interstage args of frontier task - t_s = find_task(s->tasks, (++p)->first); - t_cur = find_task(current->tasks, p->first); + t_s = find_task(s->tasks, (*t)->getTaskName()); + t_cur = find_task(current->tasks, (*t)->getTaskName()); + t_s->parentTask = t_cur->parentTask; + t++; - current->tasks.emplace_back(t_s); - p++; + current->tasks.emplace_front(t_s); // add all remaining tasks - for (; p!=ref.end(); p++) { - cout << "[merged_stages] reused task " << p->first << endl; - t_s = find_task(s->tasks, p->first); - current->tasks.emplace_back(t_s); + for (;t!=non_reusable_tasks.end(); t++) { + cout << "[merged_stages] non reused task added " << (*t)->getId() << endl; + t_s = find_task(s->tasks, (*t)->getTaskName()); + current->tasks.emplace_front(t_s); } return; - } + } else + non_reusable_tasks.emplace_back(t_s); } } From 975099899d972c2720f7e53388e57293d1aba7c3 Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Wed, 17 Aug 2016 18:16:45 -0300 Subject: [PATCH 24/87] Bug fix: If there was a stage that were dependent of another stage that ended up being reused, the parent id of the first stage wouldn't be updated to the stage that the second stage was merged. This means that the first stage dependencies would be solved on the begining of the execution, running without the propper inputs. This behaviour has corrected but another bug was found. Sometimes the merging of tasks won't update the task dependencies properly. This behaviour was found when testing with the standard arguments and two values for arguments 'minSizePl' and 'minSizeSeg'. --- runtime/PipelineComponentBase.cpp | 2 + runtime/PipelineComponentBase.h | 2 + .../PipelineManager.cpp | 49 ++++++++++++------- 3 files changed, 34 insertions(+), 19 deletions(-) diff --git a/runtime/PipelineComponentBase.cpp b/runtime/PipelineComponentBase.cpp index d5fc5c1..436d5ae 100644 --- a/runtime/PipelineComponentBase.cpp +++ b/runtime/PipelineComponentBase.cpp @@ -20,6 +20,8 @@ PipelineComponentBase::PipelineComponentBase(){ this->setLocation(PipelineComponentBase::MANAGER_SIDE); this->resultDataSize = 0; this->resultData = NULL; + + this->reused = NULL; // this->input_arguments = new std::list(); // this->output_arguments = new std::list(); } diff --git a/runtime/PipelineComponentBase.h b/runtime/PipelineComponentBase.h index aa80073..12f8fd9 100644 --- a/runtime/PipelineComponentBase.h +++ b/runtime/PipelineComponentBase.h @@ -170,6 +170,8 @@ class PipelineComponentBase: public Task { std::list tasks; + PipelineComponentBase* reused; + void printTasks(); // Factory class is used to build "reflection", and instantiate objects of diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index b655e0f..4de1d92 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -220,7 +220,8 @@ int main(int argc, char* argv[]) { cout << endl<< "merged-fine: " << endl; for (pair p : merged_stages) { - cout << "stage " << p.second->getId() << ":" << p.second->getName() << endl; + string s = p.second->reused!=NULL?" - reused":""; + cout << "stage " << p.second->getId() << ":" << p.second->getName() << s << endl; cout << "\ttasks: " << endl; for (ReusableTask* t : p.second->tasks) { cout << "\t\t" << t->getId() << ":" << t->getTaskName() << endl; @@ -246,17 +247,20 @@ int main(int argc, char* argv[]) { // add all stages to manager cout << endl << "executeComponent" << endl; for (pair s : merged_stages) { - cout << "sent component " << s.second->getId() << ":" - << s.second->getName() << " to execute with args:" << endl; - cout << "\tinputs: " << endl; - for (int i : s.second->getInputs()) - cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " - << expanded_args[i]->toString() << " parent " << expanded_args[i]->getParent() << endl; - cout << "\toutputs: " << endl; - for (int i : s.second->getOutputs()) - cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " - << expanded_args[i]->toString() << endl; - sysEnv.executeComponent(s.second); + if (s.second->reused == NULL) { + cout << "sent component " << s.second->getId() << ":" + << s.second->getName() << " to execute with args:" << endl; + cout << "\tinputs: " << endl; + for (int i : s.second->getInputs()) + cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " + << expanded_args[i]->toString() << " parent " << expanded_args[i]->getParent() << endl; + cout << "\toutputs: " << endl; + for (int i : s.second->getOutputs()) + cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " + << expanded_args[i]->toString() << endl; + ((Task*)s.second)->setId(s.second->getId()); + sysEnv.executeComponent(s.second); + } } // execute workflows @@ -788,7 +792,7 @@ void expand_stages(const map &args, ArgumentBase* ab_cpy = args.at(out_id)->clone(); ab_cpy->setName(args.at(out_id)->getName()); ab_cpy->setId(new_id); - ab_cpy->setParent(((Task*)pt)->getId()); + ab_cpy->setParent(pt->getId()); pt->replaceOutput(out_id, new_id); temp.emplace_back(ab_cpy); } @@ -953,6 +957,7 @@ ReusableTask* find_task(list l, string name) { } void merge_stages(PipelineComponentBase* current, PipelineComponentBase* s, map> ref) { + s->reused = current; list non_reusable_tasks; for (map>::reverse_iterator p=ref.rbegin(); p!=ref.rend(); p++) { // verify if this is the first reusable task @@ -1015,10 +1020,10 @@ void merge_stages_fine_grain(const map &all_stages, if (merging_condition(s, current, ref.second->tasksDesc)) { cout << "[merge_stages_fine_grain] reused task" << endl; merge_stages(current, s, ref.second->tasksDesc); - i = current_stages.erase(i); - } else { - i++; + // i = current_stages.erase(i); + // } else { } + i++; } // add merged stages to final map as one stage @@ -1072,9 +1077,15 @@ void add_arguments_to_stages(map &merged_stages, rt->getName(), merged_arguments[arg_id]->getName(), RTPipelineComponentBase::INPUT); } if (merged_arguments[arg_id]->getParent() != 0) { - cout << "Dependency: " << stage.second->getId() << ":" << stage.second->getName() - << " ->addDependency( " << merged_arguments[arg_id]->getParent() << " )" << endl; - ((RTPipelineComponentBase*)stage.second)->addDependency(merged_arguments[arg_id]->getParent()); + // verify if the dependency stage was reused + int parent = merged_arguments[arg_id]->getParent(); + cout << "[before]Dependency: " << stage.second->getId() << ":" << stage.second->getName() + << " ->addDependency( " << parent << " )" << endl; + if (merged_stages[merged_arguments[arg_id]->getParent()]->reused != NULL) + parent = merged_stages[merged_arguments[arg_id]->getParent()]->reused->getId(); + cout << "Dependency: " << stage.second->getId() << ":" << stage.second->getName() + << " ->addDependency( " << parent << " )" << endl; + ((RTPipelineComponentBase*)stage.second)->addDependency(parent); } } From 70c7a1abc6633b229904a18fa878ca099cc86a3e Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Mon, 22 Aug 2016 09:26:40 -0300 Subject: [PATCH 25/87] Reimplemented Task merging. Now FGO is fully functional with naive merging strategies. --- .../PipelineManager.cpp | 109 ++++++++++-------- .../PipelineRTFS-NS-Diff-FGO/Segmentation.cpp | 4 +- 2 files changed, 65 insertions(+), 48 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 4de1d92..7760871 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -225,6 +225,7 @@ int main(int argc, char* argv[]) { cout << "\ttasks: " << endl; for (ReusableTask* t : p.second->tasks) { cout << "\t\t" << t->getId() << ":" << t->getTaskName() << endl; + cout << "\t\t\tparent_task: " << t->parentTask << endl; t->print(); } } @@ -943,7 +944,7 @@ list task_generator(map> &tasks_desc, } prev_task = n_task; tasks.emplace_back(n_task); - cout << "[task_generator] new task " << uid << ":" << t->first << " with size " << n_task->size() << endl; + // cout << "[task_generator] new task " << uid << ":" << t->first << " with size " << n_task->size() << endl; } return tasks; @@ -956,34 +957,48 @@ ReusableTask* find_task(list l, string name) { return NULL; } +list find_tasks(list l, string name) { + list tasks; + for (ReusableTask* t : l) + if (t->getTaskName().compare(name) == 0) + tasks.emplace_back(t); + return tasks; +} + void merge_stages(PipelineComponentBase* current, PipelineComponentBase* s, map> ref) { + s->reused = current; - list non_reusable_tasks; - for (map>::reverse_iterator p=ref.rbegin(); p!=ref.rend(); p++) { + + ReusableTask* current_frontier_reusable_tasks; + map>::iterator p=ref.begin(); + for (; p!=ref.end(); p++) { // verify if this is the first reusable task ReusableTask* t_s = find_task(s->tasks, p->first); - ReusableTask* t_cur = find_task(current->tasks, p->first); - if (t_cur->reusable(t_s)) { - cout << "[merged_stages] found reusable task " << p->first << endl; - list::iterator t = non_reusable_tasks.begin(); - - // update interstage args of frontier task - t_s = find_task(s->tasks, (*t)->getTaskName()); - t_cur = find_task(current->tasks, (*t)->getTaskName()); - t_s->parentTask = t_cur->parentTask; - t++; - - current->tasks.emplace_front(t_s); - - // add all remaining tasks - for (;t!=non_reusable_tasks.end(); t++) { - cout << "[merged_stages] non reused task added " << (*t)->getId() << endl; - t_s = find_task(s->tasks, (*t)->getTaskName()); - current->tasks.emplace_front(t_s); + list t_cur = find_tasks(current->tasks, p->first); + + // check all of the same tasks of current + bool reusable = false; + for (ReusableTask* t : t_cur) { + if (t->reusable(t_s)) { + reusable = true; + current_frontier_reusable_tasks = t; + break; } - return; - } else - non_reusable_tasks.emplace_back(t_s); + } + if (!reusable) { + break; + } + } + + // updates the first non-reusable task dependency + ReusableTask* frontier = find_task(s->tasks, p->first); + frontier->parentTask = current_frontier_reusable_tasks->getId(); + current->tasks.emplace_front(frontier); + p++; + + // adds the remaining non-reusable tasks to current + for (; p!=ref.end(); p++) { + current->tasks.emplace_front(find_task(s->tasks, p->first)); } } @@ -992,10 +1007,10 @@ void merge_stages_fine_grain(const map &all_stages, RegionTemplate* rt, map expanded_args) { // attempt merging for each stage type - for (pair ref : stages_ref) { + for (map::const_iterator ref=stages_ref.cbegin(); ref!=stages_ref.cend(); ref++) { // get only the stages from the current stage_ref list current_stages; - filter_stages(all_stages, ref.second->getName(), current_stages); + filter_stages(all_stages, ref->second->getName(), current_stages); // attempt to merge all current stages while (!current_stages.empty()) { @@ -1003,27 +1018,29 @@ void merge_stages_fine_grain(const map &all_stages, PipelineComponentBase* current = current_stages.front(); current_stages.pop_front(); - // start by generating all tasks - if (current->tasks.size() == 0) - current->tasks = task_generator(ref.second->tasksDesc, current, rt, expanded_args); - - // attempt to merge all stages to the current merged stages - list::iterator i = current_stages.begin(); - while (i != current_stages.end()) { - // add stage to merged stages if the merging condition is true - PipelineComponentBase* s = *i; - - // generate tasks if it they weren't generated yet - if (s->tasks.size() == 0) - s->tasks = task_generator(ref.second->tasksDesc, s, rt, expanded_args); - - if (merging_condition(s, current, ref.second->tasksDesc)) { - cout << "[merge_stages_fine_grain] reused task" << endl; - merge_stages(current, s, ref.second->tasksDesc); - // i = current_stages.erase(i); - // } else { + // move forward if this stage was merged with another one + if (current->reused == NULL) { + + // start by generating all tasks + if (current->tasks.size() == 0) + current->tasks = task_generator(ref->second->tasksDesc, current, rt, expanded_args); + + // attempt to merge all stages to the current merged stages + list::iterator i = current_stages.begin(); + while (i != current_stages.end()) { + // add stage to merged stages if the merging condition is true + PipelineComponentBase* s = *i; + + // generate tasks if it they weren't generated yet + if (s->tasks.size() == 0) + s->tasks = task_generator(ref->second->tasksDesc, s, rt, expanded_args); + + if (merging_condition(s, current, ref->second->tasksDesc)) { + cout << "[merge_stages_fine_grain] mearging " << current->getId() << " with " << s->getId() << endl; + merge_stages(current, s, ref->second->tasksDesc); + } + i++; } - i++; } // add merged stages to final map as one stage diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp index 4187acc..a7e4374 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp @@ -247,8 +247,8 @@ void Task1Segmentation::resolveDependencies(ReusableTask* t) {} bool Task1Segmentation::reusable(ReusableTask* rt) { Task1Segmentation* t = (Task1Segmentation*)(rt); if (this->normalized_rt_temp->getName() == t->normalized_rt_temp->getName() && - this->normalized_rt_temp->getId() == t->normalized_rt_temp->getId() && - this->normalized_rt_temp->getVersion() == t->normalized_rt_temp->getVersion() && + // this->normalized_rt_temp->getId() == t->normalized_rt_temp->getId() && + // this->normalized_rt_temp->getVersion() == t->normalized_rt_temp->getVersion() && this->blue == t->blue && this->green == t->green && this->red == t->red && From ec300f227ec16ec4f0ddfff9ed0ac6e31c2ac93a Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Mon, 29 Aug 2016 22:32:31 -0300 Subject: [PATCH 26/87] Task code generator implemented. Still need to do Stage generation. --- .../PipelineRTFS-NS-Diff-FGO/gen/Makefile | 3 +- .../examples/PipelineRTFS-NS-Diff-FGO/gen/gen | Bin 432770 -> 470671 bytes .../PipelineRTFS-NS-Diff-FGO/gen/gen.cpp | 286 +++++++++++++++--- .../gen/segmentation_desc | 55 ++-- .../gen/source_task_template | 129 ++++++++ .../gen/source_template | 35 +-- 6 files changed, 407 insertions(+), 101 deletions(-) create mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/source_task_template diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/Makefile b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/Makefile index 4e2818e..5ecdf60 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/Makefile +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/Makefile @@ -4,7 +4,8 @@ all: ./gen -d normalization_desc mv Segmentation.* .. mv NormalizationComp.* .. - +debug: + g++ -g -ggdb -gdwarf-2 gen.cpp jsoncpp -std=c++11 -o gen gen: ./gen -d segmentation_desc ./gen -d normalization_desc diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/gen b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/gen index 35a69bde2c4ec563da7bfcd632cf358ce3cce23e..a0fd153692f9213a8e35f5e2d927935a75465aa3 100755 GIT binary patch literal 470671 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 diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/gen.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/gen.cpp index 853cf6e..a691b15 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/gen.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/gen.cpp @@ -9,6 +9,7 @@ using namespace std; string generate_header(Json::Value data); string generate_source(Json::Value data); +string generate_tasks(Json::Value data, string &exec_task); string getTypeCast(string type); string getArgumentTypeCast(string type); void replace_multiple_string(string& str, string to_find, string to_replace); @@ -149,12 +150,8 @@ string generate_source(Json::Value data) { string commonArgsLoop = // $PCB_ARGS$ "\tint set_cout = 0;\n\tfor(int i=0; igetArgumentsSize(); i++){\n"; string pcb_task_params; // $PCB_TASK_PARAMS$ - string task_params; // $TASK_PARAMS$ string task_args; // $TASK_ARGS$ - string dr_delete; // $INPUT_DR_DELETE$ - string input_mat_dr; // $INPUT_MAT_DR$ - string output_mat_dr; // $OUTPUT_MAT_DR$ - string output_return; // $OUTPUT_DR_RETURN$ + string exec_task; // generate DataRegion strings for (int i=0; igetId()), 0, " + dr_name + "_arg->getId()));\n"; - // generate DR cleaning for the destructor - $INPUT_DR_DELETE$ - dr_delete += "\tif(" + dr_name + "_temp != NULL) delete " + dr_name + "_temp;\n"; - - // generate cv::Mat variables to hold input DR - $INPUT_MAT_DR$ - input_mat_dr += "\tcv::Mat " + dr_name + " = this->" + - dr_name + "_temp->getData();"; } // generate output string else if (data["args"][i]["io"].asString().compare("output") == 0) { @@ -219,12 +210,6 @@ string generate_source(Json::Value data) { dr_name + "_arg->getId());\n\t\t\tinputRt->insertDataRegion(" + dr_name + ");\n"; - // generate cv::Mat variables to hold input DR - $OUTPUT_MAT_DR$ - output_mat_dr += "\tcv::Mat " + dr_name + ";"; - - // generate mat assignment to output DR string - $OUTPUT_DR_RETURN$ - output_return += "\tthis->" + dr_name + "_temp->setData(" + dr_name + ");"; - } else { cout << "Malformed descriptor." << endl; exit(-1); @@ -233,9 +218,6 @@ string generate_source(Json::Value data) { // generate DR args $PCB_TASK_PARAMS$ pcb_task_params += dr_name + ", "; - // generate DR args $TASK_PARAMS$ - task_params += "DenseDataRegion2D* " + dr_name + "_temp, "; - // generate DR args $TASK_ARGS$ task_args += "\tthis->" + dr_name + "_temp = " + dr_name + "_temp;\n"; } @@ -258,12 +240,6 @@ string generate_source(Json::Value data) { // generate common args $PCB_TASK_PARAMS$ pcb_task_params += arg_name + ", "; - - // generate common args $TASK_PARAMS$ - task_params += getTypeCast(arg_type) + " " + arg_name + ", "; - - // generate DR args $TASK_ARGS$ - task_args += "\tthis->" + arg_name + " = " + arg_name + ";\n"; } } @@ -276,11 +252,8 @@ string generate_source(Json::Value data) { // remove final comma from pcb_task_params pcb_task_params.erase(pcb_task_params.length()-2, 2); - // remove final comma from task_params - task_params.erase(task_params.length()-2, 2); - - // generate the command invocation string - string cmd = data["call"].asString(); + // generate the tasks + string tasks = generate_tasks(data, exec_task); /********************************************************/ /***************** Generate File String *****************/ @@ -296,8 +269,6 @@ string generate_source(Json::Value data) { while(getline(&line, &length, source_template) != -1) source += string(line); - size_t pos; - // $NAME$ replace_multiple_string(source, "$NAME$", name); @@ -326,28 +297,247 @@ string generate_source(Json::Value data) { // $PCB_TASK_PARAMS$ replace_multiple_string(source, "$PCB_TASK_PARAMS$", pcb_task_params); - // $TASK_PARAMS$ - replace_multiple_string(source, "$TASK_PARAMS$", task_params); + // $EXEC_TASK$ + replace_multiple_string(source, "$EXEC_TASK$", exec_task); - // $TASK_ARGS$ - replace_multiple_string(source, "$TASK_ARGS$", task_args); + // $TASKS$ + replace_multiple_string(source, "$TASKS$", tasks); - // $INPUT_DR_DELETE$ - replace_multiple_string(source, "$INPUT_DR_DELETE$", dr_delete); + return source; +} + +string generate_tasks(Json::Value data, string &exec_task) { + + string final_source; + + // go through all tasks + for (int i=0; i" + + data["tasks"][i]["args"][j]["name"].asString() + "_temp = new DenseDataRegion2D();\n\t\t\tthis->" + + data["tasks"][i]["args"][j]["name"].asString() + "_temp->setName(" + + data["tasks"][i]["args"][j]["name"].asString() + "_arg->getName());\n\t\t\tthis->" + + data["tasks"][i]["args"][j]["name"].asString() + "_temp->setId(std::to_string(" + + data["tasks"][i]["args"][j]["name"].asString() + "_arg->getId()));\n\t\t\tthis->" + + data["tasks"][i]["args"][j]["name"].asString() + "_temp->setVersion(" + + data["tasks"][i]["args"][j]["name"].asString() + "_arg->getId());\n\t\t\tset_cout++;\n\t\t}\n\n"; + + reusable_cond += "\t\tthis->" + data["tasks"][i]["args"][j]["name"].asString() + "_temp->getName() == t->" + + data["tasks"][i]["args"][j]["name"].asString() + "_temp->getName() &&\n\t\tthis->" + + data["tasks"][i]["args"][j]["name"].asString() + "_temp->getId() == t->" + + data["tasks"][i]["args"][j]["name"].asString() + "_temp->getId() &&\n\t\tthis->" + + data["tasks"][i]["args"][j]["name"].asString() + "_temp->getVersion() == t->" + + data["tasks"][i]["args"][j]["name"].asString() + "_temp->getVersion() &&\n"; + + task_size += "\t\tsizeof(int) + " + data["tasks"][i]["args"][j]["name"].asString() + + "_temp->getName().length()*sizeof(char) + sizeof(int) +\n"; + + task_serialize += "\t// copy " + data["tasks"][i]["args"][j]["name"].asString() + " id\n\tint " + + data["tasks"][i]["args"][j]["name"].asString() + "_id = stoi(" + + data["tasks"][i]["args"][j]["name"].asString() + "_temp->getId());\n\tmemcpy(buff+serialized_bytes, &" + + data["tasks"][i]["args"][j]["name"].asString() + + "_id, sizeof(int));\n\tserialized_bytes+=sizeof(int);\n\n\t// copy " + + data["tasks"][i]["args"][j]["name"].asString() + " name size\n\tint " + + data["tasks"][i]["args"][j]["name"].asString() + "_name_size = " + + data["tasks"][i]["args"][j]["name"].asString() + + "_temp->getName().length();\n\tmemcpy(buff+serialized_bytes, &" + + data["tasks"][i]["args"][j]["name"].asString() + + "_name_size, sizeof(int));\n\tserialized_bytes+=sizeof(int);\n\n\t// copy " + + data["tasks"][i]["args"][j]["name"].asString() + " name\n\tmemcpy(buff+serialized_bytes, " + + data["tasks"][i]["args"][j]["name"].asString() + "_temp->getName().c_str(), " + + data["tasks"][i]["args"][j]["name"].asString() + "_name_size*sizeof(char));\n\tserialized_bytes+=" + + data["tasks"][i]["args"][j]["name"].asString() + "_name_size*sizeof(char);\n\n"; + + task_deserialize += "\t// create the " + data["tasks"][i]["args"][j]["name"].asString() + "\n\tthis->" + + data["tasks"][i]["args"][j]["name"].asString() + "_temp = new DenseDataRegion2D();\n\n\t// extract " + + data["tasks"][i]["args"][j]["name"].asString() + " id\n\tint " + + data["tasks"][i]["args"][j]["name"].asString() + "_id = ((int*)(buff+deserialized_bytes))[0];\n\tthis->" + + data["tasks"][i]["args"][j]["name"].asString() + "_temp->setId(to_string(" + + data["tasks"][i]["args"][j]["name"].asString() + "_id));\n\tthis->" + + data["tasks"][i]["args"][j]["name"].asString() + "_temp->setVersion(" + + data["tasks"][i]["args"][j]["name"].asString() + + "_id);\n\tdeserialized_bytes += sizeof(int);\n\n\t// extract " + + data["tasks"][i]["args"][j]["name"].asString() + " name size\n\tint " + + data["tasks"][i]["args"][j]["name"].asString() + + "_name_size = ((int*)(buff+deserialized_bytes))[0];" + + "\n\tdeserialized_bytes += sizeof(int);\n\n\t// copy " + + data["tasks"][i]["args"][j]["name"].asString() + " name\n\tchar " + + data["tasks"][i]["args"][j]["name"].asString() + "_name[" + + data["tasks"][i]["args"][j]["name"].asString() + "_name_size+1];\n\t" + + data["tasks"][i]["args"][j]["name"].asString() + "_name[" + + data["tasks"][i]["args"][j]["name"].asString() + "_name_size] = \'\\0\';\n\tmemcpy(" + + data["tasks"][i]["args"][j]["name"].asString() + "_name, buff+deserialized_bytes, sizeof(char)*" + + data["tasks"][i]["args"][j]["name"].asString() + "_name_size);\n\tdeserialized_bytes += sizeof(char)*" + + data["tasks"][i]["args"][j]["name"].asString() + "_name_size;\n\tthis->" + + data["tasks"][i]["args"][j]["name"].asString() + "_temp->setName(" + + data["tasks"][i]["args"][j]["name"].asString() + "_name);\n\n"; + + if (data["tasks"][i]["args"][j]["io"].asString().compare("input") == 0) { + input_dr_delete += "\tif(" + data["tasks"][i]["args"][j]["name"].asString() + "_temp != NULL) delete " + + data["tasks"][i]["args"][j]["name"].asString() + "_temp;\n"; + + input_mat_dr += "\tcv::Mat " + data["tasks"][i]["args"][j]["name"].asString() + ";\n"; + + update_mat_dr += "\t" + data["tasks"][i]["args"][j]["name"].asString() + + "_temp = dynamic_cast(rt->getDataRegion(this->" + + data["tasks"][i]["args"][j]["name"].asString() + "_temp->getName(),\n\t\tthis->" + + data["tasks"][i]["args"][j]["name"].asString() + "_temp->getId(), 0, stoi(this->" + + data["tasks"][i]["args"][j]["name"].asString() + "_temp->getId())));\n"; + } else { + output_mat_dr += "\tcv::Mat " + data["tasks"][i]["args"][j]["name"].asString() + " = this->" + + data["tasks"][i]["args"][j]["name"].asString() + "_temp->getData();\n"; + + output_dr_return += "\t" + data["tasks"][i]["args"][j]["name"].asString() + + " = new cv::Mat(" + data["tasks"][i]["args"][j]["name"].asString() + "_temp);\n"; + + update_mat_dr += "rt->insertDataRegion(this->" + + data["tasks"][i]["args"][j]["name"].asString() + "_temp);\n"; + } + } else { + task_args += "\t\tif (a->getName().compare(\"" + + data["tasks"][i]["args"][j]["name"].asString() + "\") == 0) {\n\t\t\tthis->" + + data["tasks"][i]["args"][j]["name"].asString() + " = (" + + getTypeCast(data["tasks"][i]["args"][j]["type"].asString()) + ")(" + + getArgumentTypeCast(data["tasks"][i]["args"][j]["type"].asString()) + + "a)->getArgValue();\n\t\t\tset_cout++;\n\t\t}\n\n"; + + reusable_cond += "\t\tthis->" + data["tasks"][i]["args"][j]["name"].asString() + " == t->" + + data["tasks"][i]["args"][j]["name"].asString() + " &&\n"; + + task_size += "\t\tsizeof(" + getTypeCast(data["tasks"][i]["args"][j]["type"].asString()) + + ") +\n"; + + task_serialize += "\t// copy field " + data["tasks"][i]["args"][j]["name"].asString() + + "\n\tmemcpy(buff+serialized_bytes, &" + + data["tasks"][i]["args"][j]["name"].asString() + ", sizeof(" + + getTypeCast(data["tasks"][i]["args"][j]["type"].asString()) + "));\n\tserialized_bytes+=sizeof(" + + getTypeCast(data["tasks"][i]["args"][j]["type"].asString()) + ");\n\n"; + + task_deserialize += "\t// extract field " + data["tasks"][i]["args"][j]["name"].asString() + + "\n\tthis->" + data["tasks"][i]["args"][j]["name"].asString() + " = ((" + + getTypeCast(data["tasks"][i]["args"][j]["type"].asString()) + + "*)(buff+deserialized_bytes))[0];\n\tdeserialized_bytes += sizeof(" + + getTypeCast(data["tasks"][i]["args"][j]["type"].asString()) + ");\n\n"; + + task_print += "\tcout << \"\t\t\tminSizePl: \" << " + + data["tasks"][i]["args"][j]["name"].asString() + " << endl;\n"; + } + } - // $INPUT_MAT_DR$ - replace_multiple_string(source, "$INPUT_MAT_DR$", input_mat_dr); + // go through all interstage args + for (int j=0; j" + data["tasks"][i]["interstage_args"][j]["name"].asString() + ";\n"; - // $CMD$ - replace_multiple_string(source, "$CMD$", cmd); + resolve_deps += "\tthis->" + data["tasks"][i]["interstage_args"][j]["name"].asString() + + " = &((Task$NAME$*)t)->" + data["tasks"][i]["interstage_args"][j]["name"].asString() + ";\n"; + } + } - // $OUTPUT_DR_RETURN$ - replace_multiple_string(source, "$OUTPUT_DR_RETURN$", output_return); + // remove cmd last comma and add a parentesis + call_args.erase(call_args.length()-2, 2); + cmd += call_args; + cmd += ");"; - return source; + // open source_template file + char* line; + size_t length=0; + FILE* source_template = fopen("source_task_template", "r"); + + // concat all source_template lines + string source; + while(getline(&line, &length, source_template) != -1) + source += string(line); + + // $TASK_ARGS$ + replace_multiple_string(source, "$TASK_ARGS$", task_args); + + // $INPUT_DR_DELETE$ + replace_multiple_string(source, "$INPUT_DR_DELETE$", input_dr_delete); + + // $INPUT_MAT_DR$ + replace_multiple_string(source, "$INPUT_MAT_DR$", input_mat_dr); + + // $OUTPUT_MAT_DR$ + replace_multiple_string(source, "$OUTPUT_MAT_DR$", output_mat_dr); + + // $CMD$ + replace_multiple_string(source, "$CMD$", cmd); + + // $OUTPUT_DR_RETURN$ + replace_multiple_string(source, "$OUTPUT_DR_RETURN$", output_dr_return); + + // $UPDATE_MAT_DR$ + replace_multiple_string(source, "$UPDATE_MAT_DR$", update_mat_dr); + + // $UPDATE_INTS_ARGS$ + replace_multiple_string(source, "$UPDATE_INTS_ARGS$", update_ints_args); + + // $RESOLVE_DEPS$ + replace_multiple_string(source, "$RESOLVE_DEPS$", resolve_deps); + + // $REUSABLE_COND$ + replace_multiple_string(source, "$REUSABLE_COND$", reusable_cond); + + // $TASK_SIZE$ + replace_multiple_string(source, "$TASK_SIZE$", task_size); + + // $TASK_SERIALIZE$ + replace_multiple_string(source, "$TASK_SERIALIZE$", task_serialize); + + // $TASK_DESERIALIZE$ + replace_multiple_string(source, "$TASK_DESERIALIZE$", task_deserialize); + + // $TASK_PRINT$ + replace_multiple_string(source, "$TASK_PRINT$", task_print); + + // $NAME$ + replace_multiple_string(source, "$NAME$", name); + + // $TYPE_CHECK$ + replace_multiple_string(source, "$TYPE_CHECK$", type_check); + + final_source += source; + + exec_task += "\t\tTask" + name + " * task" + to_string(i) + " = new Task" + name + + "(" + call_args + ");\n\t\tthis->executeTask(task" + to_string(i) + ");\n"; + } + + return final_source; } string getTypeCast(string type) { diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/segmentation_desc b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/segmentation_desc index b25c83b..4861c2a 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/segmentation_desc +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/segmentation_desc @@ -1,22 +1,39 @@ {"name":"Segmentation", "includes":"#include \"opencv2/opencv.hpp\"\n#include \"opencv2/gpu/gpu.hpp\"\n#include \"HistologicalEntities.h\"", -"call":"::nscale::HistologicalEntities::segmentNuclei(normalized_rt, segmented_rt, blue, green, red, T1, T2, G1, minSize, maxSize, G2, minSizePl, minSizeSeg, maxSizeSeg, fillHolesConnectivity, reconConnectivity, watershedConnectivity)", "args":[ - {"name":"normalized_rt", "type":"dr", "io":"input"}, - {"name":"segmented_rt", "type":"dr", "io":"output"}, - {"name":"blue", "type":"uchar"}, - {"name":"green", "type":"uchar"}, - {"name":"red", "type":"uchar"}, - {"name":"T1", "type":"double"}, - {"name":"T2", "type":"double"}, - {"name":"G1", "type":"uchar"}, - {"name":"minSize", "type":"int"}, - {"name":"maxSize", "type":"int"}, - {"name":"G2", "type":"uchar"}, - {"name":"minSizePl", "type":"int"}, - {"name":"minSizeSeg", "type":"int"}, - {"name":"maxSizeSeg", "type":"int"}, - {"name":"fillHolesConnectivity", "type":"int"}, - {"name":"reconConnectivity", "type":"int"}, - {"name":"watershedConnectivity", "type":"int"} - ]} \ No newline at end of file + {"name":"normalized_rt", "type":"dr", "io":"input"}, + {"name":"segmented_rt", "type":"dr", "io":"output"}, + {"name":"blue", "type":"uchar"}, + {"name":"green", "type":"uchar"}, + {"name":"red", "type":"uchar"}, + {"name":"T1", "type":"double"}, + {"name":"T2", "type":"double"}, + {"name":"G1", "type":"uchar"}, + {"name":"minSize", "type":"int"}, + {"name":"maxSize", "type":"int"}, + {"name":"G2", "type":"uchar"}, + {"name":"minSizePl", "type":"int"}, + {"name":"minSizeSeg", "type":"int"}, + {"name":"maxSizeSeg", "type":"int"}, + {"name":"fillHolesConnectivity", "type":"int"}, + {"name":"reconConnectivity", "type":"int"}, + {"name":"watershedConnectivity", "type":"int"} + ], +"tasks":[ + {"call":"::nscale::HistologicalEntities::segmentNucleiStg1", + "args":[ + {"name":"normalized_rt", "type":"dr", "io":"input"}, + {"name":"blue", "type":"uchar"}, + {"name":"green", "type":"uchar"}, + {"name":"red", "type":"uchar"}, + {"name":"T1", "type":"double"}, + {"name":"T2", "type":"double"} + ], + "interstage_args":[ + {"name":"bgr", "type":"mat_vect", "io":"output"}, + {"name":"rbc", "type":"mat", "io":"output"} + ] + } + ] +} + diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/source_task_template b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/source_task_template new file mode 100644 index 0000000..3798586 --- /dev/null +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/source_task_template @@ -0,0 +1,129 @@ +Task$NAME$::Task$NAME$(list args, RegionTemplate* inputRt) { + + int set_cout = 0; + for(ArgumentBase* a : args){ +$TASK_ARGS$ + } + if (set_cout < args.size()) + std::cout << __FILE__ << ":" << __LINE__ <<" Missing common arguments on Segmentation" << std::endl; + +} + +Task$NAME$::~Task$NAME$() { +$INPUT_DR_DELETE$ +} + +bool Task$NAME$::run(int procType, int tid) { +$INPUT_MAT_DR$ +$OUTPUT_MAT_DR$ + uint64_t t1 = Util::ClockGetTimeProfile(); + + std::cout << "Task$NAME$ executing." << std::endl; + + $CMD$; + + uint64_t t2 = Util::ClockGetTimeProfile(); + +$OUTPUT_DR_RETURN$ + std::cout << "Task $NAME$ time elapsed: "<< t2-t1 << std::endl; +} + +void Task$NAME$::updateDR(RegionTemplate* rt) { +$UPDATE_MAT_DR$ +} + +void Task$NAME$::updateInterStageArgs(ReusableTask* t) { + // verify if the tasks are compatible + if (typeid(t) != typeid(this)) { + std::cout << "[Task$NAME$] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + return; + } + +$UPDATE_INTS_ARGS$ +} + +void Task$NAME$::resolveDependencies(ReusableTask* t) { + // verify if the task type is compatible +$TYPE_CHECK$ + +$RESOLVE_DEPS$ +} + +bool Task$NAME$::reusable(ReusableTask* rt) { + Task$NAME$* t = (Task$NAME$*)(rt); + if ( +$REUSABLE_COND$ + true) { + + return true; + } else { + return false; + } + return true; +} + +int Task$NAME$::size() { + return +$TASK_SIZE$ + 0; +} + +int Task$NAME$::serialize(char *buff) { + int serialized_bytes = 0; + // copy id + int id = this->getId(); + memcpy(buff+serialized_bytes, &id, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy parent task id + int pt = this->parentTask; + memcpy(buff+serialized_bytes, &pt, sizeof(int)); + serialized_bytes+=sizeof(int); + +$TASK_SERIALIZE$ + return serialized_bytes; +} + +int Task$NAME$::deserialize(char *buff) { + int deserialized_bytes = 0; + + // extract task id + this->setId(((int*)(buff+deserialized_bytes))[0]); + deserialized_bytes += sizeof(int); + + // extract parent task id + this->parentTask = ((int*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(int); + +$TASK_DESERIALIZE$ + return deserialized_bytes; +} + +ReusableTask* Task$NAME$::clone() { + ReusableTask* retValue = new Task$NAME$(); + int size = this->size(); + char *buff = new char[size]; + this->serialize(buff); + retValue->deserialize(buff); + delete buff; + + return retValue; +} + +void Task$NAME$::print() { +$TASK_PRINT$ +} + +// Create the task factory +ReusableTask* $NAME$FactorySegmentation1(list args, RegionTemplate* inputRt) { + return new Task$NAME$(args, inputRt); +} + +// Create the task factory +ReusableTask* $NAME$FactorySegmentation2() { + return new Task$NAME$(); +} + +// register factory with the runtime system +bool registeredSegmentationTask2 = ReusableTask::ReusableTaskFactory::taskRegister("Task$NAME$", + &$NAME$FactorySegmentation1, &$NAME$FactorySegmentation2); \ No newline at end of file diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/source_template b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/source_template index fd51de9..1d65972 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/source_template +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/source_template @@ -43,11 +43,7 @@ $OUTPUT_CAST_DR$ } // Create processing task - Task$NAME$ * task = new Task$NAME$($PCB_TASK_PARAMS$); - - this->executeTask(task); - - +$EXEC_TASK$ }else{ std::cout << __FILE__ << ":" << __LINE__ <<" RT == NULL" << std::endl; } @@ -68,31 +64,4 @@ bool registered$NAME$ = PipelineComponentBase::ComponentFactory::componentRegist /*********************************** Task functions ***********************************/ /**************************************************************************************/ -Task$NAME$::Task$NAME$($TASK_PARAMS$) { - -$TASK_ARGS$ - -} - -Task$NAME$::~Task$NAME$() { -$INPUT_DR_DELETE$ -} - -bool Task$NAME$::run(int procType, int tid) { - -$INPUT_MAT_DR$ - -$OUTPUT_MAT_DR$ - - uint64_t t1 = Util::ClockGetTimeProfile(); - - std::cout << "Task$NAME$ executing." << std::endl; - - $CMD$; - -$OUTPUT_DR_RETURN$ - - uint64_t t2 = Util::ClockGetTimeProfile(); - - std::cout << "Task $NAME$ time elapsed: "<< t2-t1 << std::endl; -} +$TASKS$ \ No newline at end of file From 80633e569e19912ccd5e677f52620a091ba0a8f8 Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Tue, 30 Aug 2016 11:45:17 -0300 Subject: [PATCH 27/87] Source code generation implementation finished. Generated code compiles but isn't running propperly. Header code generation not yet implemented. --- .../PipelineRTFS-NS-Diff-FGO/Segmentation.hpp | 218 ++++++++++++-- .../examples/PipelineRTFS-NS-Diff-FGO/gen/gen | Bin 470671 -> 492209 bytes .../PipelineRTFS-NS-Diff-FGO/gen/gen.cpp | 271 ++++++++---------- .../gen/segmentation_desc | 93 ++++-- .../gen/source_task_template | 14 +- .../gen/source_template | 38 +-- 6 files changed, 407 insertions(+), 227 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp index 73f7f59..b8f8199 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp @@ -41,35 +41,193 @@ class Segmentation : public RTPipelineComponentBase { }; // Task1Segmentation header -class Task1Segmentation: public ReusableTask { -friend class Task2Segmentation; +class TaskSegmentation0: public ReusableTask { +friend class TaskSegmentation1; private: - // all other variables + // all parameters unsigned char blue; unsigned char green; unsigned char red; double T1; double T2; + + // intertask arguments + std::vector *bgr; + cv::Mat *rbc; + +public: + + // data regions + DenseDataRegion2D* normalized_rt_temp; + + TaskSegmentation0() {}; + TaskSegmentation0(list args, RegionTemplate* inputRt); + + virtual ~TaskSegmentation0(); + + bool run(int procType=ExecEngineConstants::CPU, int tid=0); + + bool reusable(ReusableTask* t); + void updateDR(RegionTemplate* rt); + void updateInterStageArgs(ReusableTask* t); + void resolveDependencies(ReusableTask* t); + + int serialize(char *buff); + int deserialize(char *buff); + ReusableTask* clone(); + int size(); + + void print(); +}; + +// Task2Segmentation header +class TaskSegmentation1: public ReusableTask { +friend class TaskSegmentation2; +private: + + // all parameters + int reconConnectivity; + + // intertask arguments + std::vector **bgr; + cv::Mat* rc; + cv::Mat* rc_recon; + cv::Mat* rc_open; + + // forward intertask arguments + cv::Mat **rbc_fw; + +public: + + // data regions + + TaskSegmentation1() {}; + TaskSegmentation1(list args, RegionTemplate* inputRt); + + virtual ~TaskSegmentation1(); + + bool run(int procType=ExecEngineConstants::CPU, int tid=0); + + bool reusable(ReusableTask* t); + void updateDR(RegionTemplate* rt); + void updateInterStageArgs(ReusableTask* t); + void resolveDependencies(ReusableTask* t); + + int serialize(char *buff); + int deserialize(char *buff); + ReusableTask* clone(); + int size(); + + void print(); +}; + +// TaskSegmentation2 header +class TaskSegmentation2: public ReusableTask { +friend class TaskSegmentation3; +private: + + // all parameters + int fillHolesConnectivity; unsigned char G1; + + // intertask arguments + cv::Mat** rc; + cv::Mat** rc_recon; + cv::Mat** rc_open; + cv::Mat* bw1; + cv::Mat* diffIm; + + // forward intertask arguments + cv::Mat **rbc_fw; + +public: + + // data regions + + TaskSegmentation2() {}; + TaskSegmentation2(list args, RegionTemplate* inputRt); + + virtual ~TaskSegmentation2(); + + bool run(int procType=ExecEngineConstants::CPU, int tid=0); + + bool reusable(ReusableTask* t); + void updateDR(RegionTemplate* rt); + void updateInterStageArgs(ReusableTask* t); + void resolveDependencies(ReusableTask* t); + + int serialize(char *buff); + int deserialize(char *buff); + ReusableTask* clone(); + int size(); + + void print(); +}; + +// TaskSegmentation3 header +class TaskSegmentation3: public ReusableTask { +friend class TaskSegmentation4; +private: + + // all parameters int minSize; int maxSize; + + // intertask arguments + cv::Mat** bw1; + cv::Mat* bw1_t; + + // forward intertask arguments + cv::Mat **rbc_fw; + cv::Mat **diffIm_fw; + +public: + + // data regions + + TaskSegmentation3() {}; + TaskSegmentation3(list args, RegionTemplate* inputRt); + + virtual ~TaskSegmentation3(); + + bool run(int procType=ExecEngineConstants::CPU, int tid=0); + + bool reusable(ReusableTask* t); + void updateDR(RegionTemplate* rt); + void updateInterStageArgs(ReusableTask* t); + void resolveDependencies(ReusableTask* t); + + int serialize(char *buff); + int deserialize(char *buff); + ReusableTask* clone(); + int size(); + + void print(); +}; + +// TaskSegmentation4 header +class TaskSegmentation4: public ReusableTask { +friend class TaskSegmentation5; +private: + + // all parameters unsigned char G2; - int fillHolesConnectivity; - int reconConnectivity; // intertask arguments - cv::Mat *seg_open; + cv::Mat** diffIm; + cv::Mat** bw1_t; + cv::Mat** rbc; + cv::Mat* seg_open; public: // data regions - DenseDataRegion2D* normalized_rt_temp; - Task1Segmentation() {}; - Task1Segmentation(list args, RegionTemplate* inputRt); + TaskSegmentation4() {}; + TaskSegmentation4(list args, RegionTemplate* inputRt); - virtual ~Task1Segmentation(); + virtual ~TaskSegmentation4(); bool run(int procType=ExecEngineConstants::CPU, int tid=0); @@ -86,28 +244,31 @@ friend class Task2Segmentation; void print(); }; -// Task2Segmentation header -class Task2Segmentation: public ReusableTask { -friend class Task3Segmentation; +// Task5Segmentation5 header +class TaskSegmentation5: public ReusableTask { +friend class TaskSegmentation6; private: - // all other variables + // all parameters int minSizePl; int watershedConnectivity; - + // intertask arguments - cv::Mat **seg_open; - cv::Mat *seg_nonoverlap; + cv::Mat** seg_open; + cv::Mat* seg_nonoverlap; + + // forward intertask arguments + cv::Mat **seg_open_fw; public: // data regions DenseDataRegion2D* normalized_rt_temp; - Task2Segmentation() {}; - Task2Segmentation(list args, RegionTemplate* inputRt); + TaskSegmentation5() {}; + TaskSegmentation5(list args, RegionTemplate* inputRt); - virtual ~Task2Segmentation(); + virtual ~TaskSegmentation5(); bool run(int procType=ExecEngineConstants::CPU, int tid=0); @@ -124,27 +285,28 @@ friend class Task3Segmentation; void print(); }; -// Task3Segmentation header -class Task3Segmentation: public ReusableTask { +// TaskSegmentation6 header +class TaskSegmentation6: public ReusableTask { private: - // all other variables + // all parameters int minSizeSeg; int maxSizeSeg; int fillHolesConnectivity; - + // intertask arguments - cv::Mat **seg_nonoverlap; + cv::Mat** seg_open; + cv::Mat** seg_nonoverlap; public: // data regions DenseDataRegion2D* segmented_rt_temp; - Task3Segmentation() {}; - Task3Segmentation(list args, RegionTemplate* inputRt); + TaskSegmentation6() {}; + TaskSegmentation6(list args, RegionTemplate* inputRt); - virtual ~Task3Segmentation(); + virtual ~TaskSegmentation6(); bool run(int procType=ExecEngineConstants::CPU, int tid=0); diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/gen b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/gen index a0fd153692f9213a8e35f5e2d927935a75465aa3..45ba7bd01c0701b30a7c89847c7fef443eba9bfe 100755 GIT binary patch literal 492209 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%0A89hd@&%$3Rt$O-mE_K?G}-`B7YWo~fp7*f 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 i++){\n"; - string pcb_task_params; // $PCB_TASK_PARAMS$ - string task_args; // $TASK_ARGS$ - string exec_task; - - // generate DataRegion strings - for (int i=0; igetArgument(i);\n\t\t\tset_cout++;\n\t\t}\n\n"; - - // generate DataRegion IOs - $INPUT_DR_CREATE$ - dataRegionInputCreate += "\tthis->addInputOutputDataRegion(\"tile\", " + - dr_name + "_arg->getName(), RTPipelineComponentBase::INPUT);\n"; - - // generate DataRegion input declaration - $INPUT_DECL_DR$ - dataRegionInputDecl += "\t\tDenseDataRegion2D *" + - dr_name + " = NULL;\n"; - - // generate DataRegion input cast - $INPUT_CAST_DR$ - dataRegionInputCast += "\t\t\t" + dr_name + - " = dynamic_cast(inputRt->getDataRegion(" + - dr_name + "_arg->getName(), " + - "std::to_string(" + dr_name + "_arg->getId()), 0, " + dr_name + - "_arg->getId()));\n"; - - } - // generate output string - else if (data["args"][i]["io"].asString().compare("output") == 0) { - // generate input dr name declaration - $PCB_ARGS$ - commonArgsDec += "\tArgumentRT* " + dr_name + "_arg;\n"; - - // generate input dr name conditional assignment - $PCB_ARGS$ - commonArgsLoop += "\t\tif (this->getArgument(i)->getName().compare(\"" + - dr_name + "\") == 0) {\n\t\t\t" + dr_name + "_arg = (ArgumentRT*)" + - "this->getArgument(i);\n\t\t\tset_cout++;\n\t\t}\n\n"; - - // generate DataRegion IOs - $OUTPUT_DR_CREATE$ - dataRegionOutputCreate += "\tthis->addInputOutputDataRegion(\"tile\", " + - dr_name + "_arg->getName(), RTPipelineComponentBase::OUTPUT);\n"; - - // generate DataRegion output declaration - $OUTPUT_DECL_DR$ - dataRegionOutputDecl += "\t\tDenseDataRegion2D *" + - dr_name + " = NULL;\n"; - - // generate DataRegion output cast - $OUTPUT_CAST_DR$ - dataRegionOutputCast += "\t\t\t" + dr_name + - " = new DenseDataRegion2D();\n\t\t\t" + dr_name + "->setName(" + - dr_name + "_arg->getName());\n\t\t\t" + dr_name + "->setId(std::to_string(" + - dr_name + "_arg->getId()));\n\t\t\t" + dr_name + "->setVersion(" + - dr_name + "_arg->getId());\n\t\t\tinputRt->insertDataRegion(" + - dr_name + ");\n"; - - } else { - cout << "Malformed descriptor." << endl; - exit(-1); - } - - // generate DR args $PCB_TASK_PARAMS$ - pcb_task_params += dr_name + ", "; - - // generate DR args $TASK_ARGS$ - task_args += "\tthis->" + dr_name + "_temp = " + dr_name + "_temp;\n"; - } - } - - // generate all common args string - for (int i=0; igetArgument(i))->getArgValue();\n" + - "\t\t\tset_cout++;\n\t\t}\n\n"; - - // generate common args $PCB_TASK_PARAMS$ - pcb_task_params += arg_name + ", "; + string stage_desc_decl; + string stage_desc_def; + string stage_input_dr; + string stage_output_dr; + + // generate DataRegion io strings + for (int i=0; igetArgumentsSize())\n\t\tstd::cout " + - "<< __FILE__ << \":\" << __LINE__ <<\" Missing common arguments on " + - name + "\" << std::endl;"; - - // remove final comma from pcb_task_params - pcb_task_params.erase(pcb_task_params.length()-2, 2); - // generate the tasks - string tasks = generate_tasks(data, exec_task); + string tasks = generate_tasks(data, stage_desc_decl, stage_desc_def); /********************************************************/ /***************** Generate File String *****************/ @@ -273,32 +177,17 @@ string generate_source(Json::Value data) { // $NAME$ replace_multiple_string(source, "$NAME$", name); - // $OUTPUT_DR_CREATE$ - replace_multiple_string(source, "$OUTPUT_DR_CREATE$", dataRegionOutputCreate); - - // $INPUT_DR_CREATE$ - replace_multiple_string(source, "$INPUT_DR_CREATE$", dataRegionInputCreate); - - // $PCB_ARGS$ - replace_multiple_string(source, "$PCB_ARGS$", commonArgs); + // $STAGE_DESC_DECL$ + replace_multiple_string(source, "$STAGE_DESC_DECL$", stage_desc_decl); - // $OUTPUT_CAST_DR$ - replace_multiple_string(source, "$OUTPUT_CAST_DR$", dataRegionOutputCast); + // $STAGE_DESC_DEF$ + replace_multiple_string(source, "$STAGE_DESC_DEF$", stage_desc_def); - // $INPUT_CAST_DR$ - replace_multiple_string(source, "$INPUT_CAST_DR$", dataRegionInputCast); + // $STAGE_INPUT_DR$ + replace_multiple_string(source, "$STAGE_INPUT_DR$", stage_input_dr); - // $OUTPUT_DECL_DR$ - replace_multiple_string(source, "$OUTPUT_DECL_DR$", dataRegionOutputDecl); - - // $INPUT_DECL_DR$ - replace_multiple_string(source, "$INPUT_DECL_DR$", dataRegionInputDecl); - - // $PCB_TASK_PARAMS$ - replace_multiple_string(source, "$PCB_TASK_PARAMS$", pcb_task_params); - - // $EXEC_TASK$ - replace_multiple_string(source, "$EXEC_TASK$", exec_task); + // $STAGE_OUTPUT_DR$ + replace_multiple_string(source, "$STAGE_OUTPUT_DR$", stage_output_dr); // $TASKS$ replace_multiple_string(source, "$TASKS$", tasks); @@ -306,19 +195,23 @@ string generate_source(Json::Value data) { return source; } -string generate_tasks(Json::Value data, string &exec_task) { +string generate_tasks(Json::Value data, string &desc_decl, string &desc_def) { string final_source; + map fisrt_forward; // go through all tasks for (int i=0; isetName(\"" + + data["tasks"][i]["args"][j]["name"].asString() + "\");\n\ttask_" + + name + "_args.emplace_back(" + + data["tasks"][i]["args"][j]["name"].asString() + to_string(i) + ");\n"; if (data["tasks"][i]["args"][j]["type"].asString().compare("dr") == 0) { task_args += "\t\tif (a->getName().compare(\"" + @@ -404,10 +305,13 @@ string generate_tasks(Json::Value data, string &exec_task) { data["tasks"][i]["args"][j]["name"].asString() + "_name);\n\n"; if (data["tasks"][i]["args"][j]["io"].asString().compare("input") == 0) { + call_args += data["tasks"][i]["args"][j]["name"].asString() + ", "; + input_dr_delete += "\tif(" + data["tasks"][i]["args"][j]["name"].asString() + "_temp != NULL) delete " + data["tasks"][i]["args"][j]["name"].asString() + "_temp;\n"; - input_mat_dr += "\tcv::Mat " + data["tasks"][i]["args"][j]["name"].asString() + ";\n"; + input_mat_dr += "\tcv::Mat " + data["tasks"][i]["args"][j]["name"].asString() + " = this->" + + data["tasks"][i]["args"][j]["name"].asString() + "_temp->getData();\n"; update_mat_dr += "\t" + data["tasks"][i]["args"][j]["name"].asString() + "_temp = dynamic_cast(rt->getDataRegion(this->" + @@ -415,22 +319,25 @@ string generate_tasks(Json::Value data, string &exec_task) { data["tasks"][i]["args"][j]["name"].asString() + "_temp->getId(), 0, stoi(this->" + data["tasks"][i]["args"][j]["name"].asString() + "_temp->getId())));\n"; } else { - output_mat_dr += "\tcv::Mat " + data["tasks"][i]["args"][j]["name"].asString() + " = this->" + - data["tasks"][i]["args"][j]["name"].asString() + "_temp->getData();\n"; + call_args += "&" + data["tasks"][i]["args"][j]["name"].asString() + ", "; + + output_mat_dr += "\tcv::Mat " + data["tasks"][i]["args"][j]["name"].asString() + ";\n"; - output_dr_return += "\t" + data["tasks"][i]["args"][j]["name"].asString() + - " = new cv::Mat(" + data["tasks"][i]["args"][j]["name"].asString() + "_temp);\n"; + output_dr_return += "\tthis->" + data["tasks"][i]["args"][j]["name"].asString() + + "_temp->setData(" + data["tasks"][i]["args"][j]["name"].asString() + ");\n"; update_mat_dr += "rt->insertDataRegion(this->" + data["tasks"][i]["args"][j]["name"].asString() + "_temp);\n"; } } else { + call_args += data["tasks"][i]["args"][j]["name"].asString() + ", "; + task_args += "\t\tif (a->getName().compare(\"" + data["tasks"][i]["args"][j]["name"].asString() + "\") == 0) {\n\t\t\tthis->" + data["tasks"][i]["args"][j]["name"].asString() + " = (" + - getTypeCast(data["tasks"][i]["args"][j]["type"].asString()) + ")(" + + getTypeCast(data["tasks"][i]["args"][j]["type"].asString()) + ")((" + getArgumentTypeCast(data["tasks"][i]["args"][j]["type"].asString()) + - "a)->getArgValue();\n\t\t\tset_cout++;\n\t\t}\n\n"; + "*)a)->getArgValue();\n\t\t\tset_cout++;\n\t\t}\n\n"; reusable_cond += "\t\tthis->" + data["tasks"][i]["args"][j]["name"].asString() + " == t->" + data["tasks"][i]["args"][j]["name"].asString() + " &&\n"; @@ -450,21 +357,51 @@ string generate_tasks(Json::Value data, string &exec_task) { "*)(buff+deserialized_bytes))[0];\n\tdeserialized_bytes += sizeof(" + getTypeCast(data["tasks"][i]["args"][j]["type"].asString()) + ");\n\n"; - task_print += "\tcout << \"\t\t\tminSizePl: \" << " + + task_print += "\tcout << \"" + data["tasks"][i]["args"][j]["name"].asString() + ": \" << " + data["tasks"][i]["args"][j]["name"].asString() + " << endl;\n"; } } // go through all interstage args for (int j=0; j" + data["tasks"][i]["interstage_args"][j]["name"].asString() + ";\n"; - resolve_deps += "\tthis->" + data["tasks"][i]["interstage_args"][j]["name"].asString() + - " = &((Task$NAME$*)t)->" + data["tasks"][i]["interstage_args"][j]["name"].asString() + ";\n"; + // check if this is the a forwarded argument + if (fisrt_forward[data["tasks"][i]["interstage_args"][j]["name"].asString()] == true) { + resolve_deps += "\tthis->" + data["tasks"][i]["interstage_args"][j]["name"].asString() + + " = ((Task" + name_prev + "*)t)->" + data["tasks"][i]["interstage_args"][j]["name"].asString() + "_fw;\n"; + } else { + resolve_deps += "\tthis->" + data["tasks"][i]["interstage_args"][j]["name"].asString() + + " = &((Task" + name_prev + "*)t)->" + data["tasks"][i]["interstage_args"][j]["name"].asString() + ";\n"; + } + + call_args += "*" + data["tasks"][i]["interstage_args"][j]["name"].asString() + ", "; + } else if (data["tasks"][i]["interstage_args"][j]["io"].asString().compare("output") == 0) { + call_args += "&" + data["tasks"][i]["interstage_args"][j]["name"].asString() + "_temp, "; + fisrt_forward[data["tasks"][i]["interstage_args"][j]["name"].asString()] = false; + + intertask_mat += "\t" + getMatDRType(data["tasks"][i]["interstage_args"][j]["type"].asString()) + " " + + data["tasks"][i]["interstage_args"][j]["name"].asString() + "_temp;\n"; + + intertask_return += "\t" + data["tasks"][i]["interstage_args"][j]["name"].asString() + " = new " + + getMatDRType(data["tasks"][i]["interstage_args"][j]["type"].asString()) + "(" + + data["tasks"][i]["interstage_args"][j]["name"].asString() + "_temp);\n"; + } else { + update_ints_args += "\tthis->" + data["tasks"][i]["interstage_args"][j]["name"].asString() + + "_fw = ((Task$NAME$*)t)->" + data["tasks"][i]["interstage_args"][j]["name"].asString() + "_fw;\n"; + + // check if this is the first forward + if (fisrt_forward[data["tasks"][i]["interstage_args"][j]["name"].asString()] == false) { + fisrt_forward[data["tasks"][i]["interstage_args"][j]["name"].asString()] = true; + resolve_deps += "\tthis->" + data["tasks"][i]["interstage_args"][j]["name"].asString() + + "_fw = &((Task" + name_prev + "*)t)->" + data["tasks"][i]["interstage_args"][j]["name"].asString() + ";\n"; + } else { + resolve_deps += "\tthis->" + data["tasks"][i]["interstage_args"][j]["name"].asString() + + "_fw = ((Task" + name_prev + "*)t)->" + data["tasks"][i]["interstage_args"][j]["name"].asString() + "_fw;\n"; + } } } @@ -495,9 +432,15 @@ string generate_tasks(Json::Value data, string &exec_task) { // $OUTPUT_MAT_DR$ replace_multiple_string(source, "$OUTPUT_MAT_DR$", output_mat_dr); + // $INTERTASK_MAT$ + replace_multiple_string(source, "$INTERTASK_MAT$", intertask_mat); + // $CMD$ replace_multiple_string(source, "$CMD$", cmd); + // $INTERTASK_RETURN$ + replace_multiple_string(source, "$INTERTASK_RETURN$", intertask_return); + // $OUTPUT_DR_RETURN$ replace_multiple_string(source, "$OUTPUT_DR_RETURN$", output_dr_return); @@ -533,8 +476,7 @@ string generate_tasks(Json::Value data, string &exec_task) { final_source += source; - exec_task += "\t\tTask" + name + " * task" + to_string(i) + " = new Task" + name + - "(" + call_args + ");\n\t\tthis->executeTask(task" + to_string(i) + ");\n"; + desc_def += "\tthis->tasksDesc[\"Task" + name + "\"] = task_" + name + "_args;\n\n"; } return final_source; @@ -549,19 +491,32 @@ string getTypeCast(string type) { return "double"; else if (type.compare("float_array") == 0) return "float*"; + else if (type.compare("dr") == 0) + return "ArgumentRT"; else return nullptr; } string getArgumentTypeCast(string type) { if (type.compare("uchar") == 0) - return "(ArgumentInt*)"; + return "ArgumentInt"; else if (type.compare("int") == 0) - return "(ArgumentInt*)"; + return "ArgumentInt"; else if (type.compare("double") == 0) - return "(ArgumentFloat*)"; + return "ArgumentFloat"; else if (type.compare("float_array") == 0) - return "(ArgumentFloatArray*)"; + return "ArgumentFloatArray"; + else if (type.compare("dr") == 0) + return "ArgumentRT"; + else + return nullptr; +} + +string getMatDRType(string type) { + if (type.compare("mat") == 0) + return "cv::Mat"; + else if (type.compare("mat_vect") == 0) + return "std::vector"; else return nullptr; } diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/segmentation_desc b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/segmentation_desc index 4861c2a..a2df58b 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/segmentation_desc +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/segmentation_desc @@ -1,23 +1,8 @@ {"name":"Segmentation", "includes":"#include \"opencv2/opencv.hpp\"\n#include \"opencv2/gpu/gpu.hpp\"\n#include \"HistologicalEntities.h\"", -"args":[ +"dr_args":[ {"name":"normalized_rt", "type":"dr", "io":"input"}, - {"name":"segmented_rt", "type":"dr", "io":"output"}, - {"name":"blue", "type":"uchar"}, - {"name":"green", "type":"uchar"}, - {"name":"red", "type":"uchar"}, - {"name":"T1", "type":"double"}, - {"name":"T2", "type":"double"}, - {"name":"G1", "type":"uchar"}, - {"name":"minSize", "type":"int"}, - {"name":"maxSize", "type":"int"}, - {"name":"G2", "type":"uchar"}, - {"name":"minSizePl", "type":"int"}, - {"name":"minSizeSeg", "type":"int"}, - {"name":"maxSizeSeg", "type":"int"}, - {"name":"fillHolesConnectivity", "type":"int"}, - {"name":"reconConnectivity", "type":"int"}, - {"name":"watershedConnectivity", "type":"int"} + {"name":"segmented_rt", "type":"dr", "io":"output"} ], "tasks":[ {"call":"::nscale::HistologicalEntities::segmentNucleiStg1", @@ -33,7 +18,77 @@ {"name":"bgr", "type":"mat_vect", "io":"output"}, {"name":"rbc", "type":"mat", "io":"output"} ] + }, + {"call":"::nscale::HistologicalEntities::segmentNucleiStg2", + "args":[ + {"name":"reconConnectivity", "type":"int"} + ], + "interstage_args":[ + {"name":"bgr", "type":"mat_vect", "io":"input"}, + {"name":"rbc", "type":"mat", "io":"forward"}, + {"name":"rc", "type":"mat", "io":"output"}, + {"name":"rc_recon", "type":"mat", "io":"output"}, + {"name":"rc_open", "type":"mat", "io":"output"} + ] + }, + {"call":"::nscale::HistologicalEntities::segmentNucleiStg3", + "args":[ + {"name":"fillHolesConnectivity", "type":"int"}, + {"name":"G1", "type":"int"} + ], + "interstage_args":[ + {"name":"rc", "type":"mat", "io":"input"}, + {"name":"rc_recon", "type":"mxat", "io":"input"}, + {"name":"rc_open", "type":"mat", "io":"input"}, + {"name":"rbc", "type":"mat", "io":"forward"}, + {"name":"bw1", "type":"mat", "io":"output"}, + {"name":"diffIm", "type":"mat", "io":"output"} + ] + }, + {"call":"::nscale::HistologicalEntities::segmentNucleiStg4", + "args":[ + {"name":"minSize", "type":"int"}, + {"name":"maxSize", "type":"int"} + ], + "interstage_args":[ + {"name":"bw1", "type":"mat", "io":"input"}, + {"name":"rbc", "type":"mat", "io":"forward"}, + {"name":"diffIm", "type":"mat", "io":"forward"}, + {"name":"bw1_t", "type":"mat", "io":"output"} + ] + }, + {"call":"::nscale::HistologicalEntities::segmentNucleiStg5", + "args":[ + {"name":"G2", "type":"int"} + ], + "interstage_args":[ + {"name":"diffIm", "type":"mat", "io":"input"}, + {"name":"bw1_t", "type":"mat", "io":"input"}, + {"name":"rbc", "type":"mat", "io":"input"}, + {"name":"seg_open", "type":"mat", "io":"output"} + ] + }, + {"call":"::nscale::HistologicalEntities::segmentNucleiStg6", + "args":[ + {"name":"normalized_rt", "type":"dr", "io":"input"}, + {"name":"minSizePl", "type":"int"}, + {"name":"watershedConnectivity", "type":"int"} + ], + "interstage_args":[ + {"name":"seg_open", "type":"mat", "io":"input"}, + {"name":"seg_nonoverlap", "type":"mat", "io":"output"} + ] + }, + {"call":"::nscale::HistologicalEntities::segmentNucleiStg7", + "args":[ + {"name":"segmented_rt", "type":"dr", "io":"output"}, + {"name":"minSizeSeg", "type":"int"}, + {"name":"maxSizeSeg", "type":"int"}, + {"name":"fillHolesConnectivity", "type":"int"} + ], + "interstage_args":[ + {"name":"seg_nonoverlap", "type":"mat", "io":"input"} + ] } ] -} - +} \ No newline at end of file diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/source_task_template b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/source_task_template index 3798586..afc44e6 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/source_task_template +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/source_task_template @@ -16,14 +16,15 @@ $INPUT_DR_DELETE$ bool Task$NAME$::run(int procType, int tid) { $INPUT_MAT_DR$ $OUTPUT_MAT_DR$ +$INTERTASK_MAT$ uint64_t t1 = Util::ClockGetTimeProfile(); std::cout << "Task$NAME$ executing." << std::endl; - $CMD$; + $CMD$ uint64_t t2 = Util::ClockGetTimeProfile(); - +$INTERTASK_RETURN$ $OUTPUT_DR_RETURN$ std::cout << "Task $NAME$ time elapsed: "<< t2-t1 << std::endl; } @@ -115,15 +116,16 @@ $TASK_PRINT$ } // Create the task factory -ReusableTask* $NAME$FactorySegmentation1(list args, RegionTemplate* inputRt) { +ReusableTask* $NAME$Factory1(list args, RegionTemplate* inputRt) { return new Task$NAME$(args, inputRt); } // Create the task factory -ReusableTask* $NAME$FactorySegmentation2() { +ReusableTask* $NAME$Factory2() { return new Task$NAME$(); } // register factory with the runtime system -bool registeredSegmentationTask2 = ReusableTask::ReusableTaskFactory::taskRegister("Task$NAME$", - &$NAME$FactorySegmentation1, &$NAME$FactorySegmentation2); \ No newline at end of file +bool registeredTask$NAME$2 = ReusableTask::ReusableTaskFactory::taskRegister("Task$NAME$", + &$NAME$Factory1, &$NAME$Factory2); + diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/source_template b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/source_template index 1d65972..f05ff79 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/source_template +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/source_template @@ -9,6 +9,7 @@ #include #include +#include /**************************************************************************************/ /**************************** PipelineComponent functions *****************************/ @@ -16,6 +17,10 @@ $NAME$::$NAME$() { this->setComponentName("$NAME$"); + + // generate task descriptors +$STAGE_DESC_DECL$ +$STAGE_DESC_DEF$ } $NAME$::~$NAME$() {} @@ -26,26 +31,27 @@ int $NAME$::run() { std::cout << "Executing component: " << this->getComponentName() << " instance id: " << this->getId() <getRegionTemplateInstance("tile"); -$PCB_ARGS$ +$STAGE_INPUT_DR$ +$STAGE_OUTPUT_DR$ -$INPUT_DR_CREATE$ -$OUTPUT_DR_CREATE$ + map prev_map; + for (list::reverse_iterator task=tasks.rbegin(); task!=tasks.rend(); task++) { + cout << "[Segmentation] sending task " << (*task)->getId() << endl; + // generate a task copy and update the DR, getting the actual data + ReusableTask* t = (*task)->clone(); + t->updateDR(inputRt); - if(inputRt != NULL){ -$INPUT_DECL_DR$ -$OUTPUT_DECL_DR$ - try{ -$INPUT_CAST_DR$ -$OUTPUT_CAST_DR$ - std::cout << "$NAME$. paramenterId: "<< workflow_id <parentTask != -1) { + t->addDependency(prev_map[t->parentTask]); + t->resolveDependencies(prev_map[t->parentTask]); } - // Create processing task -$EXEC_TASK$ - }else{ - std::cout << __FILE__ << ":" << __LINE__ <<" RT == NULL" << std::endl; + // send task to be executed + this->executeTask(t); + + // add this task to parent list for future dependency resolution + prev_map[t->getId()] = t; } return 0; From ba6ca303105f7a7e925329428aceccc3f4339b84 Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Wed, 31 Aug 2016 18:32:04 -0300 Subject: [PATCH 28/87] Generated code working with any np value but still buggy: When testing with 2 parameters and 2 values for each (i.e 4 workflows) it works; When testing with 3 parameters and 2 values for each (i.e 8 workflows it doesn't work; This is independent of which parameters are used. --- .../PipelineRTFS-NS-Diff-FGO/Segmentation.cpp | 1459 ++++++++++++----- .../PipelineRTFS-NS-Diff-FGO/Segmentation.hpp | 46 +- .../PipelineRTFS-NS-Diff-FGO/gen/Makefile | 8 +- .../examples/PipelineRTFS-NS-Diff-FGO/gen/gen | Bin 492209 -> 492209 bytes .../PipelineRTFS-NS-Diff-FGO/gen/gen.cpp | 30 +- .../gen/source_task_template | 9 +- 6 files changed, 1123 insertions(+), 429 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp index a7e4374..c9142fb 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp @@ -19,68 +19,86 @@ Segmentation::Segmentation() { this->setComponentName("Segmentation"); // generate task descriptors - list segmentation_task1_args; - list segmentation_task2_args; - list segmentation_task3_args; - - ArgumentRT* normalized_rt = new ArgumentRT(); - normalized_rt->setName("normalized_rt"); - segmentation_task1_args.emplace_back(normalized_rt); - ArgumentInt* blue = new ArgumentInt(); - blue->setName("blue"); - segmentation_task1_args.emplace_back(blue); - ArgumentInt* green = new ArgumentInt(); - green->setName("green"); - segmentation_task1_args.emplace_back(green); - ArgumentInt* red = new ArgumentInt(); - red->setName("red"); - segmentation_task1_args.emplace_back(red); - ArgumentFloat* T1 = new ArgumentFloat(); - T1->setName("T1"); - segmentation_task1_args.emplace_back(T1); - ArgumentFloat* T2 = new ArgumentFloat(); - T2->setName("T2"); - segmentation_task1_args.emplace_back(T2); - ArgumentInt* G1 = new ArgumentInt(); - G1->setName("G1"); - segmentation_task1_args.emplace_back(G1); - ArgumentInt* minSize = new ArgumentInt(); - minSize->setName("minSize"); - segmentation_task1_args.emplace_back(minSize); - ArgumentInt* maxSize = new ArgumentInt(); - maxSize->setName("maxSize"); - segmentation_task1_args.emplace_back(maxSize); - ArgumentInt* G2 = new ArgumentInt(); - G2->setName("G2"); - segmentation_task1_args.emplace_back(G2); - ArgumentInt* fillHolesConnectivity = new ArgumentInt(); - fillHolesConnectivity->setName("fillHolesConnectivity"); - segmentation_task1_args.emplace_back(fillHolesConnectivity); - ArgumentInt* reconConnectivity = new ArgumentInt(); - reconConnectivity->setName("reconConnectivity"); - segmentation_task1_args.emplace_back(reconConnectivity); - this->tasksDesc["Task1Segmentation"] = segmentation_task1_args; - - segmentation_task2_args.emplace_back(normalized_rt); - ArgumentInt* minSizePl = new ArgumentInt(); - minSizePl->setName("minSizePl"); - segmentation_task2_args.emplace_back(minSizePl); - ArgumentInt* watershedConnectivity = new ArgumentInt(); - watershedConnectivity->setName("watershedConnectivity"); - segmentation_task2_args.emplace_back(watershedConnectivity); - this->tasksDesc["Task2Segmentation"] = segmentation_task2_args; - - ArgumentInt* minSizeSeg = new ArgumentInt(); - minSizeSeg->setName("minSizeSeg"); - segmentation_task3_args.emplace_back(minSizeSeg); - ArgumentInt* maxSizeSeg = new ArgumentInt(); - maxSizeSeg->setName("maxSizeSeg"); - segmentation_task3_args.emplace_back(maxSizeSeg); - segmentation_task3_args.emplace_back(fillHolesConnectivity); - ArgumentRT* segmented_rt = new ArgumentRT(); - segmented_rt->setName("segmented_rt"); - segmentation_task3_args.emplace_back(segmented_rt); - this->tasksDesc["Task3Segmentation"] = segmentation_task3_args; + list task_Segmentation0_args; + list task_Segmentation1_args; + list task_Segmentation2_args; + list task_Segmentation3_args; + list task_Segmentation4_args; + list task_Segmentation5_args; + list task_Segmentation6_args; + + ArgumentRT* normalized_rt0 = new ArgumentRT(); + normalized_rt0->setName("normalized_rt"); + task_Segmentation0_args.emplace_back(normalized_rt0); + ArgumentInt* blue0 = new ArgumentInt(); + blue0->setName("blue"); + task_Segmentation0_args.emplace_back(blue0); + ArgumentInt* green0 = new ArgumentInt(); + green0->setName("green"); + task_Segmentation0_args.emplace_back(green0); + ArgumentInt* red0 = new ArgumentInt(); + red0->setName("red"); + task_Segmentation0_args.emplace_back(red0); + ArgumentFloat* T10 = new ArgumentFloat(); + T10->setName("T1"); + task_Segmentation0_args.emplace_back(T10); + ArgumentFloat* T20 = new ArgumentFloat(); + T20->setName("T2"); + task_Segmentation0_args.emplace_back(T20); + this->tasksDesc["TaskSegmentation0"] = task_Segmentation0_args; + + ArgumentInt* reconConnectivity1 = new ArgumentInt(); + reconConnectivity1->setName("reconConnectivity"); + task_Segmentation1_args.emplace_back(reconConnectivity1); + this->tasksDesc["TaskSegmentation1"] = task_Segmentation1_args; + + ArgumentInt* fillHolesConnectivity2 = new ArgumentInt(); + fillHolesConnectivity2->setName("fillHolesConnectivity"); + task_Segmentation2_args.emplace_back(fillHolesConnectivity2); + ArgumentInt* G12 = new ArgumentInt(); + G12->setName("G1"); + task_Segmentation2_args.emplace_back(G12); + this->tasksDesc["TaskSegmentation2"] = task_Segmentation2_args; + + ArgumentInt* minSize3 = new ArgumentInt(); + minSize3->setName("minSize"); + task_Segmentation3_args.emplace_back(minSize3); + ArgumentInt* maxSize3 = new ArgumentInt(); + maxSize3->setName("maxSize"); + task_Segmentation3_args.emplace_back(maxSize3); + this->tasksDesc["TaskSegmentation3"] = task_Segmentation3_args; + + ArgumentInt* G24 = new ArgumentInt(); + G24->setName("G2"); + task_Segmentation4_args.emplace_back(G24); + this->tasksDesc["TaskSegmentation4"] = task_Segmentation4_args; + + ArgumentRT* normalized_rt5 = new ArgumentRT(); + normalized_rt5->setName("normalized_rt"); + task_Segmentation5_args.emplace_back(normalized_rt5); + ArgumentInt* minSizePl5 = new ArgumentInt(); + minSizePl5->setName("minSizePl"); + task_Segmentation5_args.emplace_back(minSizePl5); + ArgumentInt* watershedConnectivity5 = new ArgumentInt(); + watershedConnectivity5->setName("watershedConnectivity"); + task_Segmentation5_args.emplace_back(watershedConnectivity5); + this->tasksDesc["TaskSegmentation5"] = task_Segmentation5_args; + + ArgumentRT* segmented_rt6 = new ArgumentRT(); + segmented_rt6->setName("segmented_rt"); + task_Segmentation6_args.emplace_back(segmented_rt6); + ArgumentInt* minSizeSeg6 = new ArgumentInt(); + minSizeSeg6->setName("minSizeSeg"); + task_Segmentation6_args.emplace_back(minSizeSeg6); + ArgumentInt* maxSizeSeg6 = new ArgumentInt(); + maxSizeSeg6->setName("maxSizeSeg"); + task_Segmentation6_args.emplace_back(maxSizeSeg6); + ArgumentInt* fillHolesConnectivity6 = new ArgumentInt(); + fillHolesConnectivity6->setName("fillHolesConnectivity"); + task_Segmentation6_args.emplace_back(fillHolesConnectivity6); + this->tasksDesc["TaskSegmentation6"] = task_Segmentation6_args; + + } Segmentation::~Segmentation() {} @@ -92,8 +110,10 @@ int Segmentation::run() { RegionTemplate * inputRt = this->getRegionTemplateInstance("tile"); this->addInputOutputDataRegion("tile", "normalized_rt", RTPipelineComponentBase::INPUT); + this->addInputOutputDataRegion("tile", "segmented_rt", RTPipelineComponentBase::OUTPUT); + map prev_map; for (list::reverse_iterator task=tasks.rbegin(); task!=tasks.rend(); task++) { cout << "[Segmentation] sending task " << (*task)->getId() << endl; @@ -130,10 +150,16 @@ bool registeredSegmentation = PipelineComponentBase::ComponentFactory::component /*********************************** Task functions ***********************************/ /**************************************************************************************/ -Task1Segmentation::Task1Segmentation(list args, RegionTemplate* inputRt) { +TaskSegmentation0::TaskSegmentation0() { + bgr = new std::vector; + rbc = new cv::Mat; + +} + +TaskSegmentation0::TaskSegmentation0(list args, RegionTemplate* inputRt) { + int set_cout = 0; for(ArgumentBase* a : args){ - if (a->getName().compare("normalized_rt") == 0) { ArgumentRT* normalized_rt_arg; normalized_rt_arg = (ArgumentRT*)a; @@ -144,122 +170,878 @@ Task1Segmentation::Task1Segmentation(list args, RegionTemplate* i set_cout++; } - if (a->getName().compare("blue") == 0) { - this->blue = (unsigned char)((ArgumentInt*)a)->getArgValue(); - set_cout++; - } + if (a->getName().compare("blue") == 0) { + this->blue = (unsigned char)((ArgumentInt*)a)->getArgValue(); + set_cout++; + } + + if (a->getName().compare("green") == 0) { + this->green = (unsigned char)((ArgumentInt*)a)->getArgValue(); + set_cout++; + } + + if (a->getName().compare("red") == 0) { + this->red = (unsigned char)((ArgumentInt*)a)->getArgValue(); + set_cout++; + } + + if (a->getName().compare("T1") == 0) { + this->T1 = (double)((ArgumentFloat*)a)->getArgValue(); + set_cout++; + } + + if (a->getName().compare("T2") == 0) { + this->T2 = (double)((ArgumentFloat*)a)->getArgValue(); + set_cout++; + } + + + } + if (set_cout < args.size()) + std::cout << __FILE__ << ":" << __LINE__ <<" Missing common arguments on Segmentation" << std::endl; + + bgr = new std::vector; + rbc = new cv::Mat; + +} + +TaskSegmentation0::~TaskSegmentation0() { + if(normalized_rt_temp != NULL) delete normalized_rt_temp; + +} + +bool TaskSegmentation0::run(int procType, int tid) { + cv::Mat normalized_rt = this->normalized_rt_temp->getData(); + + + std::vector bgr_temp; + cv::Mat rbc_temp; + + uint64_t t1 = Util::ClockGetTimeProfile(); + + std::cout << "TaskSegmentation0 executing." << std::endl; + + ::nscale::HistologicalEntities::segmentNucleiStg1(normalized_rt, blue, green, red, T1, T2, bgr, rbc); + + uint64_t t2 = Util::ClockGetTimeProfile(); + + + std::cout << "Task Segmentation0 time elapsed: "<< t2-t1 << std::endl; +} + +void TaskSegmentation0::updateDR(RegionTemplate* rt) { + normalized_rt_temp = dynamic_cast(rt->getDataRegion(this->normalized_rt_temp->getName(), + this->normalized_rt_temp->getId(), 0, stoi(this->normalized_rt_temp->getId()))); + +} + +void TaskSegmentation0::updateInterStageArgs(ReusableTask* t) { + // verify if the tasks are compatible + if (typeid(t) != typeid(this)) { + std::cout << "[TaskSegmentation0] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + return; + } + + +} + +void TaskSegmentation0::resolveDependencies(ReusableTask* t) { + // verify if the task type is compatible + if (typeid(t) != typeid(TaskSegmentation1)) { + std::cout << "[TaskSegmentation1] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + } + + + +} + +bool TaskSegmentation0::reusable(ReusableTask* rt) { + TaskSegmentation0* t = (TaskSegmentation0*)(rt); + if ( + this->normalized_rt_temp->getName() == t->normalized_rt_temp->getName() && + this->blue == t->blue && + this->green == t->green && + this->red == t->red && + this->T1 == t->T1 && + this->T2 == t->T2 && + + true) { + + return true; + } else { + return false; + } + return true; +} + +int TaskSegmentation0::size() { + return + sizeof(int) + sizeof(int) + + sizeof(int) + normalized_rt_temp->getName().length()*sizeof(char) + sizeof(int) + + sizeof(unsigned char) + + sizeof(unsigned char) + + sizeof(unsigned char) + + sizeof(double) + + sizeof(double) + + + 0; +} + +int TaskSegmentation0::serialize(char *buff) { + int serialized_bytes = 0; + // copy id + int id = this->getId(); + memcpy(buff+serialized_bytes, &id, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy parent task id + int pt = this->parentTask; + memcpy(buff+serialized_bytes, &pt, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy normalized_rt id + int normalized_rt_id = stoi(normalized_rt_temp->getId()); + memcpy(buff+serialized_bytes, &normalized_rt_id, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy normalized_rt name size + int normalized_rt_name_size = normalized_rt_temp->getName().length(); + memcpy(buff+serialized_bytes, &normalized_rt_name_size, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy normalized_rt name + memcpy(buff+serialized_bytes, normalized_rt_temp->getName().c_str(), normalized_rt_name_size*sizeof(char)); + serialized_bytes+=normalized_rt_name_size*sizeof(char); + + // copy field blue + memcpy(buff+serialized_bytes, &blue, sizeof(unsigned char)); + serialized_bytes+=sizeof(unsigned char); + + // copy field green + memcpy(buff+serialized_bytes, &green, sizeof(unsigned char)); + serialized_bytes+=sizeof(unsigned char); + + // copy field red + memcpy(buff+serialized_bytes, &red, sizeof(unsigned char)); + serialized_bytes+=sizeof(unsigned char); + + // copy field T1 + memcpy(buff+serialized_bytes, &T1, sizeof(double)); + serialized_bytes+=sizeof(double); + + // copy field T2 + memcpy(buff+serialized_bytes, &T2, sizeof(double)); + serialized_bytes+=sizeof(double); + + + return serialized_bytes; +} + +int TaskSegmentation0::deserialize(char *buff) { + int deserialized_bytes = 0; + + // extract task id + this->setId(((int*)(buff+deserialized_bytes))[0]); + deserialized_bytes += sizeof(int); + + // extract parent task id + this->parentTask = ((int*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(int); + + // create the normalized_rt + this->normalized_rt_temp = new DenseDataRegion2D(); + + // extract normalized_rt id + int normalized_rt_id = ((int*)(buff+deserialized_bytes))[0]; + this->normalized_rt_temp->setId(to_string(normalized_rt_id)); + this->normalized_rt_temp->setVersion(normalized_rt_id); + deserialized_bytes += sizeof(int); + + // extract normalized_rt name size + int normalized_rt_name_size = ((int*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(int); + + // copy normalized_rt name + char normalized_rt_name[normalized_rt_name_size+1]; + normalized_rt_name[normalized_rt_name_size] = '\0'; + memcpy(normalized_rt_name, buff+deserialized_bytes, sizeof(char)*normalized_rt_name_size); + deserialized_bytes += sizeof(char)*normalized_rt_name_size; + this->normalized_rt_temp->setName(normalized_rt_name); + + // extract field blue + this->blue = ((unsigned char*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(unsigned char); + + // extract field green + this->green = ((unsigned char*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(unsigned char); + + // extract field red + this->red = ((unsigned char*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(unsigned char); + + // extract field T1 + this->T1 = ((double*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(double); + + // extract field T2 + this->T2 = ((double*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(double); + + + return deserialized_bytes; +} + +ReusableTask* TaskSegmentation0::clone() { + ReusableTask* retValue = new TaskSegmentation0(); + int size = this->size(); + char *buff = new char[size]; + this->serialize(buff); + retValue->deserialize(buff); + delete buff; + + return retValue; +} + +void TaskSegmentation0::print() { + cout << "blue: " << blue << endl; + cout << "green: " << green << endl; + cout << "red: " << red << endl; + cout << "T1: " << T1 << endl; + cout << "T2: " << T2 << endl; + +} + +// Create the task factory +ReusableTask* Segmentation0Factory1(list args, RegionTemplate* inputRt) { + return new TaskSegmentation0(args, inputRt); +} + +// Create the task factory +ReusableTask* Segmentation0Factory2() { + return new TaskSegmentation0(); +} + +// register factory with the runtime system +bool registeredTaskSegmentation02 = ReusableTask::ReusableTaskFactory::taskRegister("TaskSegmentation0", + &Segmentation0Factory1, &Segmentation0Factory2); + +TaskSegmentation1::TaskSegmentation1() { + rc = new cv::Mat; + rc_recon = new cv::Mat; + rc_open = new cv::Mat; + +} + +TaskSegmentation1::TaskSegmentation1(list args, RegionTemplate* inputRt) { + + int set_cout = 0; + for(ArgumentBase* a : args){ + if (a->getName().compare("reconConnectivity") == 0) { + this->reconConnectivity = (int)((ArgumentInt*)a)->getArgValue(); + set_cout++; + } + + + } + if (set_cout < args.size()) + std::cout << __FILE__ << ":" << __LINE__ <<" Missing common arguments on Segmentation" << std::endl; + + rc = new cv::Mat; + rc_recon = new cv::Mat; + rc_open = new cv::Mat; + +} + +TaskSegmentation1::~TaskSegmentation1() { + +} + +bool TaskSegmentation1::run(int procType, int tid) { + + + cv::Mat rc_temp; + cv::Mat rc_recon_temp; + cv::Mat rc_open_temp; + + uint64_t t1 = Util::ClockGetTimeProfile(); + + std::cout << "TaskSegmentation1 executing." << std::endl; + + ::nscale::HistologicalEntities::segmentNucleiStg2(reconConnectivity, bgr, rc, rc_recon, rc_open); + + uint64_t t2 = Util::ClockGetTimeProfile(); + + + std::cout << "Task Segmentation1 time elapsed: "<< t2-t1 << std::endl; +} + +void TaskSegmentation1::updateDR(RegionTemplate* rt) { + +} + +void TaskSegmentation1::updateInterStageArgs(ReusableTask* t) { + // verify if the tasks are compatible + if (typeid(t) != typeid(this)) { + std::cout << "[TaskSegmentation1] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + return; + } + + this->bgr = ((TaskSegmentation1*)t)->bgr; + this->rbc_fw = ((TaskSegmentation1*)t)->rbc_fw; + +} + +void TaskSegmentation1::resolveDependencies(ReusableTask* t) { + // verify if the task type is compatible + if (typeid(t) != typeid(TaskSegmentation2)) { + std::cout << "[TaskSegmentation2] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + } + + + this->bgr = ((TaskSegmentation0*)t)->bgr; + this->rbc_fw = ((TaskSegmentation0*)t)->rbc; + +} + +bool TaskSegmentation1::reusable(ReusableTask* rt) { + TaskSegmentation1* t = (TaskSegmentation1*)(rt); + if ( + this->reconConnectivity == t->reconConnectivity && + + true) { + + return true; + } else { + return false; + } + return true; +} + +int TaskSegmentation1::size() { + return + sizeof(int) + sizeof(int) + + sizeof(int) + + + 0; +} + +int TaskSegmentation1::serialize(char *buff) { + int serialized_bytes = 0; + // copy id + int id = this->getId(); + memcpy(buff+serialized_bytes, &id, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy parent task id + int pt = this->parentTask; + memcpy(buff+serialized_bytes, &pt, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy field reconConnectivity + memcpy(buff+serialized_bytes, &reconConnectivity, sizeof(int)); + serialized_bytes+=sizeof(int); + + + return serialized_bytes; +} + +int TaskSegmentation1::deserialize(char *buff) { + int deserialized_bytes = 0; + + // extract task id + this->setId(((int*)(buff+deserialized_bytes))[0]); + deserialized_bytes += sizeof(int); + + // extract parent task id + this->parentTask = ((int*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(int); + + // extract field reconConnectivity + this->reconConnectivity = ((int*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(int); + + + return deserialized_bytes; +} + +ReusableTask* TaskSegmentation1::clone() { + ReusableTask* retValue = new TaskSegmentation1(); + int size = this->size(); + char *buff = new char[size]; + this->serialize(buff); + retValue->deserialize(buff); + delete buff; + + return retValue; +} + +void TaskSegmentation1::print() { + cout << "reconConnectivity: " << reconConnectivity << endl; + +} + +// Create the task factory +ReusableTask* Segmentation1Factory1(list args, RegionTemplate* inputRt) { + return new TaskSegmentation1(args, inputRt); +} + +// Create the task factory +ReusableTask* Segmentation1Factory2() { + return new TaskSegmentation1(); +} + +// register factory with the runtime system +bool registeredTaskSegmentation12 = ReusableTask::ReusableTaskFactory::taskRegister("TaskSegmentation1", + &Segmentation1Factory1, &Segmentation1Factory2); + +TaskSegmentation2::TaskSegmentation2() { + bw1 = new cv::Mat; + diffIm = new cv::Mat; + +} + +TaskSegmentation2::TaskSegmentation2(list args, RegionTemplate* inputRt) { + + int set_cout = 0; + for(ArgumentBase* a : args){ + if (a->getName().compare("fillHolesConnectivity") == 0) { + this->fillHolesConnectivity = (int)((ArgumentInt*)a)->getArgValue(); + set_cout++; + } + + if (a->getName().compare("G1") == 0) { + this->G1 = (int)((ArgumentInt*)a)->getArgValue(); + set_cout++; + } + + + } + if (set_cout < args.size()) + std::cout << __FILE__ << ":" << __LINE__ <<" Missing common arguments on Segmentation" << std::endl; + + bw1 = new cv::Mat; + diffIm = new cv::Mat; + +} + +TaskSegmentation2::~TaskSegmentation2() { + +} + +bool TaskSegmentation2::run(int procType, int tid) { + + + cv::Mat bw1_temp; + cv::Mat diffIm_temp; + + uint64_t t1 = Util::ClockGetTimeProfile(); + + std::cout << "TaskSegmentation2 executing." << std::endl; + + ::nscale::HistologicalEntities::segmentNucleiStg3(fillHolesConnectivity, G1, rc, rc_recon, rc_open, bw1, diffIm); + + uint64_t t2 = Util::ClockGetTimeProfile(); + + + std::cout << "Task Segmentation2 time elapsed: "<< t2-t1 << std::endl; +} + +void TaskSegmentation2::updateDR(RegionTemplate* rt) { + +} + +void TaskSegmentation2::updateInterStageArgs(ReusableTask* t) { + // verify if the tasks are compatible + if (typeid(t) != typeid(this)) { + std::cout << "[TaskSegmentation2] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + return; + } + + this->rc = ((TaskSegmentation2*)t)->rc; + this->rc_recon = ((TaskSegmentation2*)t)->rc_recon; + this->rc_open = ((TaskSegmentation2*)t)->rc_open; + this->rbc_fw = ((TaskSegmentation2*)t)->rbc_fw; + +} + +void TaskSegmentation2::resolveDependencies(ReusableTask* t) { + // verify if the task type is compatible + if (typeid(t) != typeid(TaskSegmentation3)) { + std::cout << "[TaskSegmentation3] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + } + + + this->rc = ((TaskSegmentation1*)t)->rc; + this->rc_recon = ((TaskSegmentation1*)t)->rc_recon; + this->rc_open = ((TaskSegmentation1*)t)->rc_open; + this->rbc_fw = ((TaskSegmentation1*)t)->rbc_fw; + +} + +bool TaskSegmentation2::reusable(ReusableTask* rt) { + TaskSegmentation2* t = (TaskSegmentation2*)(rt); + if ( + this->fillHolesConnectivity == t->fillHolesConnectivity && + this->G1 == t->G1 && + + true) { + + return true; + } else { + return false; + } + return true; +} + +int TaskSegmentation2::size() { + return + sizeof(int) + sizeof(int) + + sizeof(int) + + sizeof(int) + + + 0; +} + +int TaskSegmentation2::serialize(char *buff) { + int serialized_bytes = 0; + // copy id + int id = this->getId(); + memcpy(buff+serialized_bytes, &id, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy parent task id + int pt = this->parentTask; + memcpy(buff+serialized_bytes, &pt, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy field fillHolesConnectivity + memcpy(buff+serialized_bytes, &fillHolesConnectivity, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy field G1 + memcpy(buff+serialized_bytes, &G1, sizeof(int)); + serialized_bytes+=sizeof(int); + + + return serialized_bytes; +} + +int TaskSegmentation2::deserialize(char *buff) { + int deserialized_bytes = 0; + + // extract task id + this->setId(((int*)(buff+deserialized_bytes))[0]); + deserialized_bytes += sizeof(int); + + // extract parent task id + this->parentTask = ((int*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(int); + + // extract field fillHolesConnectivity + this->fillHolesConnectivity = ((int*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(int); + + // extract field G1 + this->G1 = ((int*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(int); + + + return deserialized_bytes; +} + +ReusableTask* TaskSegmentation2::clone() { + ReusableTask* retValue = new TaskSegmentation2(); + int size = this->size(); + char *buff = new char[size]; + this->serialize(buff); + retValue->deserialize(buff); + delete buff; + + return retValue; +} + +void TaskSegmentation2::print() { + cout << "fillHolesConnectivity: " << fillHolesConnectivity << endl; + cout << "G1: " << G1 << endl; + +} + +// Create the task factory +ReusableTask* Segmentation2Factory1(list args, RegionTemplate* inputRt) { + return new TaskSegmentation2(args, inputRt); +} + +// Create the task factory +ReusableTask* Segmentation2Factory2() { + return new TaskSegmentation2(); +} + +// register factory with the runtime system +bool registeredTaskSegmentation22 = ReusableTask::ReusableTaskFactory::taskRegister("TaskSegmentation2", + &Segmentation2Factory1, &Segmentation2Factory2); + +TaskSegmentation3::TaskSegmentation3() { + bw1_t = new cv::Mat; + +} + +TaskSegmentation3::TaskSegmentation3(list args, RegionTemplate* inputRt) { + + int set_cout = 0; + for(ArgumentBase* a : args){ + if (a->getName().compare("minSize") == 0) { + this->minSize = (int)((ArgumentInt*)a)->getArgValue(); + set_cout++; + } + + if (a->getName().compare("maxSize") == 0) { + this->maxSize = (int)((ArgumentInt*)a)->getArgValue(); + set_cout++; + } + + + } + if (set_cout < args.size()) + std::cout << __FILE__ << ":" << __LINE__ <<" Missing common arguments on Segmentation" << std::endl; + + bw1_t = new cv::Mat; + +} + +TaskSegmentation3::~TaskSegmentation3() { + +} + +bool TaskSegmentation3::run(int procType, int tid) { + + + cv::Mat bw1_t_temp; + + uint64_t t1 = Util::ClockGetTimeProfile(); + + std::cout << "TaskSegmentation3 executing." << std::endl; + + ::nscale::HistologicalEntities::segmentNucleiStg4(minSize, maxSize, bw1, bw1_t); + + uint64_t t2 = Util::ClockGetTimeProfile(); + + + std::cout << "Task Segmentation3 time elapsed: "<< t2-t1 << std::endl; +} + +void TaskSegmentation3::updateDR(RegionTemplate* rt) { + +} + +void TaskSegmentation3::updateInterStageArgs(ReusableTask* t) { + // verify if the tasks are compatible + if (typeid(t) != typeid(this)) { + std::cout << "[TaskSegmentation3] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + return; + } + + this->bw1 = ((TaskSegmentation3*)t)->bw1; + this->rbc_fw = ((TaskSegmentation3*)t)->rbc_fw; + this->diffIm_fw = ((TaskSegmentation3*)t)->diffIm_fw; + +} + +void TaskSegmentation3::resolveDependencies(ReusableTask* t) { + // verify if the task type is compatible + if (typeid(t) != typeid(TaskSegmentation4)) { + std::cout << "[TaskSegmentation4] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + } + + + this->bw1 = ((TaskSegmentation2*)t)->bw1; + this->rbc_fw = ((TaskSegmentation2*)t)->rbc_fw; + this->diffIm_fw = ((TaskSegmentation2*)t)->diffIm; + +} + +bool TaskSegmentation3::reusable(ReusableTask* rt) { + TaskSegmentation3* t = (TaskSegmentation3*)(rt); + if ( + this->minSize == t->minSize && + this->maxSize == t->maxSize && + + true) { + + return true; + } else { + return false; + } + return true; +} + +int TaskSegmentation3::size() { + return + sizeof(int) + sizeof(int) + + sizeof(int) + + sizeof(int) + + + 0; +} + +int TaskSegmentation3::serialize(char *buff) { + int serialized_bytes = 0; + // copy id + int id = this->getId(); + memcpy(buff+serialized_bytes, &id, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy parent task id + int pt = this->parentTask; + memcpy(buff+serialized_bytes, &pt, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy field minSize + memcpy(buff+serialized_bytes, &minSize, sizeof(int)); + serialized_bytes+=sizeof(int); + + // copy field maxSize + memcpy(buff+serialized_bytes, &maxSize, sizeof(int)); + serialized_bytes+=sizeof(int); + + + return serialized_bytes; +} + +int TaskSegmentation3::deserialize(char *buff) { + int deserialized_bytes = 0; + + // extract task id + this->setId(((int*)(buff+deserialized_bytes))[0]); + deserialized_bytes += sizeof(int); + + // extract parent task id + this->parentTask = ((int*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(int); + + // extract field minSize + this->minSize = ((int*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(int); + + // extract field maxSize + this->maxSize = ((int*)(buff+deserialized_bytes))[0]; + deserialized_bytes += sizeof(int); + + + return deserialized_bytes; +} + +ReusableTask* TaskSegmentation3::clone() { + ReusableTask* retValue = new TaskSegmentation3(); + int size = this->size(); + char *buff = new char[size]; + this->serialize(buff); + retValue->deserialize(buff); + delete buff; + + return retValue; +} - if (a->getName().compare("green") == 0) { - this->green = (unsigned char)((ArgumentInt*)a)->getArgValue(); - set_cout++; - } +void TaskSegmentation3::print() { + cout << "minSize: " << minSize << endl; + cout << "maxSize: " << maxSize << endl; - if (a->getName().compare("red") == 0) { - this->red = (unsigned char)((ArgumentInt*)a)->getArgValue(); - set_cout++; - } +} - if (a->getName().compare("T1") == 0) { - this->T1 = (double)((ArgumentFloat*)a)->getArgValue(); - set_cout++; - } +// Create the task factory +ReusableTask* Segmentation3Factory1(list args, RegionTemplate* inputRt) { + return new TaskSegmentation3(args, inputRt); +} - if (a->getName().compare("T2") == 0) { - this->T2 = (double)((ArgumentFloat*)a)->getArgValue(); - set_cout++; - } +// Create the task factory +ReusableTask* Segmentation3Factory2() { + return new TaskSegmentation3(); +} - if (a->getName().compare("G1") == 0) { - this->G1 = (unsigned char)((ArgumentInt*)a)->getArgValue(); - set_cout++; - } +// register factory with the runtime system +bool registeredTaskSegmentation32 = ReusableTask::ReusableTaskFactory::taskRegister("TaskSegmentation3", + &Segmentation3Factory1, &Segmentation3Factory2); - if (a->getName().compare("minSize") == 0) { - this->minSize = (int)((ArgumentInt*)a)->getArgValue(); - set_cout++; - } +TaskSegmentation4::TaskSegmentation4() { + seg_open = new cv::Mat; - if (a->getName().compare("maxSize") == 0) { - this->maxSize = (int)((ArgumentInt*)a)->getArgValue(); - set_cout++; - } +} +TaskSegmentation4::TaskSegmentation4(list args, RegionTemplate* inputRt) { + + int set_cout = 0; + for(ArgumentBase* a : args){ if (a->getName().compare("G2") == 0) { - this->G2 = (unsigned char)((ArgumentInt*)a)->getArgValue(); + this->G2 = (int)((ArgumentInt*)a)->getArgValue(); set_cout++; } - if (a->getName().compare("fillHolesConnectivity") == 0) { - this->fillHolesConnectivity = (int)((ArgumentInt*)a)->getArgValue(); - set_cout++; - } - if (a->getName().compare("reconConnectivity") == 0) { - this->reconConnectivity = (int)((ArgumentInt*)a)->getArgValue(); - set_cout++; - } } - - // all arguments except the DataRegions if (set_cout < args.size()) std::cout << __FILE__ << ":" << __LINE__ <<" Missing common arguments on Segmentation" << std::endl; + + seg_open = new cv::Mat; + } -Task1Segmentation::~Task1Segmentation() { - if(normalized_rt_temp != NULL) delete normalized_rt_temp; +TaskSegmentation4::~TaskSegmentation4() { + } -bool Task1Segmentation::run(int procType, int tid) { - +bool TaskSegmentation4::run(int procType, int tid) { + + cv::Mat seg_open_temp; - cv::Mat normalized_rt = this->normalized_rt_temp->getData(); uint64_t t1 = Util::ClockGetTimeProfile(); - std::cout << "[Task1Segmentation] executing." << std::endl; + std::cout << "TaskSegmentation4 executing." << std::endl; - ::nscale::HistologicalEntities::segmentNucleiStg1(normalized_rt, blue, green, - red, T1, T2, G1, minSize, maxSize, G2, fillHolesConnectivity, - reconConnectivity, &seg_open_temp); + ::nscale::HistologicalEntities::segmentNucleiStg5(G2, diffIm, bw1_t, rbc, seg_open); uint64_t t2 = Util::ClockGetTimeProfile(); - seg_open = new cv::Mat(seg_open_temp); - std::cout << "[Task1Segmentation] time elapsed: "<< t2-t1 << std::endl; + std::cout << "Task Segmentation4 time elapsed: "<< t2-t1 << std::endl; } -void Task1Segmentation::updateDR(RegionTemplate* rt) { - normalized_rt_temp = dynamic_cast(rt->getDataRegion(this->normalized_rt_temp->getName(), - this->normalized_rt_temp->getId(), 0, stoi(this->normalized_rt_temp->getId()))); +void TaskSegmentation4::updateDR(RegionTemplate* rt) { + } -void Task1Segmentation::updateInterStageArgs(ReusableTask* t) { +void TaskSegmentation4::updateInterStageArgs(ReusableTask* t) { // verify if the tasks are compatible if (typeid(t) != typeid(this)) { - std::cout << "[Task1Segmentation] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + std::cout << "[TaskSegmentation4] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; return; } + + this->diffIm = ((TaskSegmentation4*)t)->diffIm; + this->bw1_t = ((TaskSegmentation4*)t)->bw1_t; + this->rbc = ((TaskSegmentation4*)t)->rbc; + } -void Task1Segmentation::resolveDependencies(ReusableTask* t) {} +void TaskSegmentation4::resolveDependencies(ReusableTask* t) { + // verify if the task type is compatible + if (typeid(t) != typeid(TaskSegmentation5)) { + std::cout << "[TaskSegmentation5] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + } -bool Task1Segmentation::reusable(ReusableTask* rt) { - Task1Segmentation* t = (Task1Segmentation*)(rt); - if (this->normalized_rt_temp->getName() == t->normalized_rt_temp->getName() && - // this->normalized_rt_temp->getId() == t->normalized_rt_temp->getId() && - // this->normalized_rt_temp->getVersion() == t->normalized_rt_temp->getVersion() && - this->blue == t->blue && - this->green == t->green && - this->red == t->red && - this->T1 == t->T1 && - this->T2 == t->T2 && - this->G1 == t->G1 && - this->minSize == t->minSize && - this->maxSize == t->maxSize && + + this->diffIm = ((TaskSegmentation3*)t)->diffIm_fw; + this->bw1_t = ((TaskSegmentation3*)t)->bw1_t; + this->rbc = ((TaskSegmentation3*)t)->rbc_fw; + +} + +bool TaskSegmentation4::reusable(ReusableTask* rt) { + TaskSegmentation4* t = (TaskSegmentation4*)(rt); + if ( this->G2 == t->G2 && - this->fillHolesConnectivity == t->fillHolesConnectivity && - this->reconConnectivity == t->reconConnectivity) { + + true) { return true; } else { @@ -268,16 +1050,16 @@ bool Task1Segmentation::reusable(ReusableTask* rt) { return true; } -int Task1Segmentation::size() { - return sizeof(unsigned char) + sizeof(unsigned char) + sizeof(unsigned char) + sizeof(double) + - sizeof(double) + sizeof(unsigned char) + sizeof(int) + sizeof(int) + sizeof(unsigned char) + - sizeof(int) + sizeof(int) + sizeof(int) + sizeof(int) + - sizeof(int) + sizeof(int) + normalized_rt_temp->getName().length()*sizeof(char); +int TaskSegmentation4::size() { + return + sizeof(int) + sizeof(int) + + sizeof(int) + + + 0; } -int Task1Segmentation::serialize(char *buff) { +int TaskSegmentation4::serialize(char *buff) { int serialized_bytes = 0; - // copy id int id = this->getId(); memcpy(buff+serialized_bytes, &id, sizeof(int)); @@ -288,68 +1070,15 @@ int Task1Segmentation::serialize(char *buff) { memcpy(buff+serialized_bytes, &pt, sizeof(int)); serialized_bytes+=sizeof(int); - // copy normalized_rt id - int normalized_rt_id = stoi(normalized_rt_temp->getId()); - memcpy(buff+serialized_bytes, &normalized_rt_id, sizeof(int)); - serialized_bytes+=sizeof(int); - - // copy normalized_rt name size - int normalized_rt_name_size = normalized_rt_temp->getName().length(); - memcpy(buff+serialized_bytes, &normalized_rt_name_size, sizeof(int)); - serialized_bytes+=sizeof(int); - - // copy normalized_rt name - memcpy(buff+serialized_bytes, normalized_rt_temp->getName().c_str(), normalized_rt_name_size*sizeof(char)); - serialized_bytes+=normalized_rt_name_size*sizeof(char); - - // copy field blue - memcpy(buff+serialized_bytes, &blue, sizeof(unsigned char)); - serialized_bytes+=sizeof(unsigned char); - - // copy field green - memcpy(buff+serialized_bytes, &green, sizeof(unsigned char)); - serialized_bytes+=sizeof(unsigned char); - - // copy field red - memcpy(buff+serialized_bytes, &red, sizeof(unsigned char)); - serialized_bytes+=sizeof(unsigned char); - - // copy field T1 - memcpy(buff+serialized_bytes, &T1, sizeof(double)); - serialized_bytes+=sizeof(double); - - // copy field T2 - memcpy(buff+serialized_bytes, &T2, sizeof(double)); - serialized_bytes+=sizeof(double); - - // copy field G1 - memcpy(buff+serialized_bytes, &G1, sizeof(unsigned char)); - serialized_bytes+=sizeof(unsigned char); - - // copy field minSize - memcpy(buff+serialized_bytes, &minSize, sizeof(int)); - serialized_bytes+=sizeof(int); - - // copy field maxSize - memcpy(buff+serialized_bytes, &maxSize, sizeof(int)); - serialized_bytes+=sizeof(int); - // copy field G2 - memcpy(buff+serialized_bytes, &G2, sizeof(unsigned char)); - serialized_bytes+=sizeof(unsigned char); - - // copy field fillHolesConnectivity - memcpy(buff+serialized_bytes, &fillHolesConnectivity, sizeof(int)); + memcpy(buff+serialized_bytes, &G2, sizeof(int)); serialized_bytes+=sizeof(int); - // copy field reconConnectivity - memcpy(buff+serialized_bytes, &reconConnectivity, sizeof(int)); - serialized_bytes+=sizeof(int); return serialized_bytes; } -int Task1Segmentation::deserialize(char *buff) { +int TaskSegmentation4::deserialize(char *buff) { int deserialized_bytes = 0; // extract task id @@ -360,75 +1089,16 @@ int Task1Segmentation::deserialize(char *buff) { this->parentTask = ((int*)(buff+deserialized_bytes))[0]; deserialized_bytes += sizeof(int); - // create the normalized_rt - this->normalized_rt_temp = new DenseDataRegion2D(); - - // extract normalized_rt id - int normalized_rt_id = ((int*)(buff+deserialized_bytes))[0]; - this->normalized_rt_temp->setId(to_string(normalized_rt_id)); - this->normalized_rt_temp->setVersion(normalized_rt_id); - deserialized_bytes += sizeof(int); - - // extract normalized_rt name size - int normalized_rt_name_size = ((int*)(buff+deserialized_bytes))[0]; - deserialized_bytes += sizeof(int); - - // copy normalized_rt name - char normalized_rt_name[normalized_rt_name_size+1]; - normalized_rt_name[normalized_rt_name_size] = '\0'; - memcpy(normalized_rt_name, buff+deserialized_bytes, sizeof(char)*normalized_rt_name_size); - deserialized_bytes += sizeof(char)*normalized_rt_name_size; - this->normalized_rt_temp->setName(normalized_rt_name); - - // extract field blue - this->blue = ((unsigned char*)(buff+deserialized_bytes))[0]; - deserialized_bytes += sizeof(unsigned char); - - // extract field red - this->red = ((unsigned char*)(buff+deserialized_bytes))[0]; - deserialized_bytes += sizeof(unsigned char); - - // extract field green - this->green = ((unsigned char*)(buff+deserialized_bytes))[0]; - deserialized_bytes += sizeof(unsigned char); - - // extract field T1 - this->T1 = ((double*)(buff+deserialized_bytes))[0]; - deserialized_bytes += sizeof(double); - - // extract field T2 - this->T2 = ((double*)(buff+deserialized_bytes))[0]; - deserialized_bytes += sizeof(double); - - // extract field G1 - this->G1 = ((unsigned char*)(buff+deserialized_bytes))[0]; - deserialized_bytes += sizeof(unsigned char); - - // extract field minSize - this->minSize = ((int*)(buff+deserialized_bytes))[0]; - deserialized_bytes += sizeof(int); - - // extract field maxSize - this->maxSize = ((int*)(buff+deserialized_bytes))[0]; - deserialized_bytes += sizeof(int); - // extract field G2 - this->G2 = ((unsigned char*)(buff+deserialized_bytes))[0]; - deserialized_bytes += sizeof(unsigned char); - - // extract field fillHolesConnectivity - this->fillHolesConnectivity = ((int*)(buff+deserialized_bytes))[0]; + this->G2 = ((int*)(buff+deserialized_bytes))[0]; deserialized_bytes += sizeof(int); - // extract field reconConnectivity - this->reconConnectivity = ((int*)(buff+deserialized_bytes))[0]; - deserialized_bytes += sizeof(int); return deserialized_bytes; } -ReusableTask* Task1Segmentation::clone() { - ReusableTask* retValue = new Task1Segmentation(); +ReusableTask* TaskSegmentation4::clone() { + ReusableTask* retValue = new TaskSegmentation4(); int size = this->size(); char *buff = new char[size]; this->serialize(buff); @@ -438,41 +1108,34 @@ ReusableTask* Task1Segmentation::clone() { return retValue; } -void Task1Segmentation::print() { - - cout << "\t\t\tblue: " << int(blue) << endl; - cout << "\t\t\tgreen: " << int(green) << endl; - cout << "\t\t\tblue: " << int(red) << endl; - cout << "\t\t\tT1: " << T1 << endl; - cout << "\t\t\tT2: " << T2 << endl; - cout << "\t\t\tG1: " << int(G1) << endl; - cout << "\t\t\tminSize: " << minSize << endl; - cout << "\t\t\tmaxSize: " << maxSize << endl; - cout << "\t\t\tG2: " << int(G2) << endl; - cout << "\t\t\tfillHolesConnectivity: " << fillHolesConnectivity << endl; - cout << "\t\t\treconConnectivity: " << reconConnectivity << endl; - cout << "\t\t\tout-seg_open: " << &seg_open << endl; +void TaskSegmentation4::print() { + cout << "G2: " << G2 << endl; + } // Create the task factory -ReusableTask* task1FactorySegmentation1(list args, RegionTemplate* inputRt) { - return new Task1Segmentation(args, inputRt); +ReusableTask* Segmentation4Factory1(list args, RegionTemplate* inputRt) { + return new TaskSegmentation4(args, inputRt); } // Create the task factory -ReusableTask* task2FactorySegmentation2() { - return new Task1Segmentation(); +ReusableTask* Segmentation4Factory2() { + return new TaskSegmentation4(); } // register factory with the runtime system -bool registeredSegmentationTask1 = ReusableTask::ReusableTaskFactory::taskRegister("Task1Segmentation", - &task1FactorySegmentation1, &task2FactorySegmentation2); +bool registeredTaskSegmentation42 = ReusableTask::ReusableTaskFactory::taskRegister("TaskSegmentation4", + &Segmentation4Factory1, &Segmentation4Factory2); +TaskSegmentation5::TaskSegmentation5() { + seg_nonoverlap = new cv::Mat; + +} -Task2Segmentation::Task2Segmentation(list args, RegionTemplate* inputRt) { +TaskSegmentation5::TaskSegmentation5(list args, RegionTemplate* inputRt) { + int set_cout = 0; for(ArgumentBase* a : args){ - if (a->getName().compare("normalized_rt") == 0) { ArgumentRT* normalized_rt_arg; normalized_rt_arg = (ArgumentRT*)a; @@ -492,64 +1155,75 @@ Task2Segmentation::Task2Segmentation(list args, RegionTemplate* i this->watershedConnectivity = (int)((ArgumentInt*)a)->getArgValue(); set_cout++; } - } - // all arguments except the DataRegions + + } if (set_cout < args.size()) std::cout << __FILE__ << ":" << __LINE__ <<" Missing common arguments on Segmentation" << std::endl; + + seg_nonoverlap = new cv::Mat; + } -Task2Segmentation::~Task2Segmentation() { +TaskSegmentation5::~TaskSegmentation5() { if(normalized_rt_temp != NULL) delete normalized_rt_temp; + } -bool Task2Segmentation::run(int procType, int tid) { - - cv::Mat seg_nonoverlap_temp; +bool TaskSegmentation5::run(int procType, int tid) { cv::Mat normalized_rt = this->normalized_rt_temp->getData(); - uint64_t t1 = Util::ClockGetTimeProfile(); - std::cout << "[Task2Segmentation] executing." << std::endl; + cv::Mat seg_nonoverlap_temp; + + uint64_t t1 = Util::ClockGetTimeProfile(); - ::nscale::HistologicalEntities::segmentNucleiStg2(normalized_rt, minSizePl, watershedConnectivity, *seg_open, &seg_nonoverlap_temp); + std::cout << "TaskSegmentation5 executing." << std::endl; + ::nscale::HistologicalEntities::segmentNucleiStg6(normalized_rt, minSizePl, watershedConnectivity, seg_open, seg_nonoverlap); + uint64_t t2 = Util::ClockGetTimeProfile(); - seg_nonoverlap = new cv::Mat(seg_nonoverlap_temp); - std::cout << "[Task2Segmentation] time elapsed: "<< t2-t1 << std::endl; + + std::cout << "Task Segmentation5 time elapsed: "<< t2-t1 << std::endl; } -void Task2Segmentation::updateDR(RegionTemplate* rt) { - normalized_rt_temp = dynamic_cast(rt->getDataRegion(this->normalized_rt_temp->getName(), +void TaskSegmentation5::updateDR(RegionTemplate* rt) { + normalized_rt_temp = dynamic_cast(rt->getDataRegion(this->normalized_rt_temp->getName(), this->normalized_rt_temp->getId(), 0, stoi(this->normalized_rt_temp->getId()))); + } -void Task2Segmentation::updateInterStageArgs(ReusableTask* t) { +void TaskSegmentation5::updateInterStageArgs(ReusableTask* t) { // verify if the tasks are compatible if (typeid(t) != typeid(this)) { - std::cout << "[Task2Segmentation] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + std::cout << "[TaskSegmentation5] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; return; } - this->seg_open = ((Task2Segmentation*)t)->seg_open; + this->seg_open = ((TaskSegmentation5*)t)->seg_open; + } -void Task2Segmentation::resolveDependencies(ReusableTask* t) { +void TaskSegmentation5::resolveDependencies(ReusableTask* t) { // verify if the task type is compatible - if (typeid(t) != typeid(Task1Segmentation)) { - std::cout << "[Task2Segmentation] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + if (typeid(t) != typeid(TaskSegmentation6)) { + std::cout << "[TaskSegmentation6] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; } - this->seg_open = &((Task1Segmentation*)t)->seg_open; + + + this->seg_open = ((TaskSegmentation4*)t)->seg_open; + } -bool Task2Segmentation::reusable(ReusableTask* rt) { - Task2Segmentation* t = (Task2Segmentation*)(rt); - if (this->normalized_rt_temp->getName() == t->normalized_rt_temp->getName() && - this->normalized_rt_temp->getId() == t->normalized_rt_temp->getId() && - this->normalized_rt_temp->getVersion() == t->normalized_rt_temp->getVersion() && +bool TaskSegmentation5::reusable(ReusableTask* rt) { + TaskSegmentation5* t = (TaskSegmentation5*)(rt); + if ( + this->normalized_rt_temp->getName() == t->normalized_rt_temp->getName() && this->minSizePl == t->minSizePl && - this->watershedConnectivity == t->watershedConnectivity) { + this->watershedConnectivity == t->watershedConnectivity && + + true) { return true; } else { @@ -558,14 +1232,18 @@ bool Task2Segmentation::reusable(ReusableTask* rt) { return true; } -int Task2Segmentation::size() { - return sizeof(int) + sizeof(int) + sizeof(int) + sizeof(int) + - sizeof(int) + sizeof(int) + normalized_rt_temp->getName().length()*sizeof(char); +int TaskSegmentation5::size() { + return + sizeof(int) + sizeof(int) + + sizeof(int) + normalized_rt_temp->getName().length()*sizeof(char) + sizeof(int) + + sizeof(int) + + sizeof(int) + + + 0; } -int Task2Segmentation::serialize(char *buff) { +int TaskSegmentation5::serialize(char *buff) { int serialized_bytes = 0; - // copy id int id = this->getId(); memcpy(buff+serialized_bytes, &id, sizeof(int)); @@ -589,7 +1267,7 @@ int Task2Segmentation::serialize(char *buff) { // copy normalized_rt name memcpy(buff+serialized_bytes, normalized_rt_temp->getName().c_str(), normalized_rt_name_size*sizeof(char)); serialized_bytes+=normalized_rt_name_size*sizeof(char); - + // copy field minSizePl memcpy(buff+serialized_bytes, &minSizePl, sizeof(int)); serialized_bytes+=sizeof(int); @@ -598,10 +1276,11 @@ int Task2Segmentation::serialize(char *buff) { memcpy(buff+serialized_bytes, &watershedConnectivity, sizeof(int)); serialized_bytes+=sizeof(int); + return serialized_bytes; } -int Task2Segmentation::deserialize(char *buff) { +int TaskSegmentation5::deserialize(char *buff) { int deserialized_bytes = 0; // extract task id @@ -626,7 +1305,7 @@ int Task2Segmentation::deserialize(char *buff) { deserialized_bytes += sizeof(int); // copy normalized_rt name - char normalized_rt_name[normalized_rt_name_size+1]; + char normalized_rt_name[normalized_rt_name_size+1]; normalized_rt_name[normalized_rt_name_size] = '\0'; memcpy(normalized_rt_name, buff+deserialized_bytes, sizeof(char)*normalized_rt_name_size); deserialized_bytes += sizeof(char)*normalized_rt_name_size; @@ -640,11 +1319,12 @@ int Task2Segmentation::deserialize(char *buff) { this->watershedConnectivity = ((int*)(buff+deserialized_bytes))[0]; deserialized_bytes += sizeof(int); + return deserialized_bytes; } -ReusableTask* Task2Segmentation::clone() { - ReusableTask* retValue = new Task2Segmentation(); +ReusableTask* TaskSegmentation5::clone() { + ReusableTask* retValue = new TaskSegmentation5(); int size = this->size(); char *buff = new char[size]; this->serialize(buff); @@ -654,33 +1334,34 @@ ReusableTask* Task2Segmentation::clone() { return retValue; } -void Task2Segmentation::print() { - - cout << "\t\t\tminSizePl: " << minSizePl << endl; - cout << "\t\t\twatershedConnectivity: " << watershedConnectivity << endl; - cout << "\t\t\tin-seg_open: " << seg_open << endl; - cout << "\t\t\tout-seg_nonoverlap: " << &seg_nonoverlap << endl; +void TaskSegmentation5::print() { + cout << "minSizePl: " << minSizePl << endl; + cout << "watershedConnectivity: " << watershedConnectivity << endl; + } // Create the task factory -ReusableTask* task2FactorySegmentation1(list args, RegionTemplate* inputRt) { - return new Task2Segmentation(args, inputRt); +ReusableTask* Segmentation5Factory1(list args, RegionTemplate* inputRt) { + return new TaskSegmentation5(args, inputRt); } // Create the task factory -ReusableTask* taskFactorySegmentation2() { - return new Task2Segmentation(); +ReusableTask* Segmentation5Factory2() { + return new TaskSegmentation5(); } // register factory with the runtime system -bool registeredSegmentationTask2 = ReusableTask::ReusableTaskFactory::taskRegister("Task2Segmentation", - &task2FactorySegmentation1, &taskFactorySegmentation2); +bool registeredTaskSegmentation52 = ReusableTask::ReusableTaskFactory::taskRegister("TaskSegmentation5", + &Segmentation5Factory1, &Segmentation5Factory2); + +TaskSegmentation6::TaskSegmentation6() { -Task3Segmentation::Task3Segmentation(list args, RegionTemplate* inputRt) { +} +TaskSegmentation6::TaskSegmentation6(list args, RegionTemplate* inputRt) { + int set_cout = 0; for(ArgumentBase* a : args){ - if (a->getName().compare("segmented_rt") == 0) { ArgumentRT* segmented_rt_arg; segmented_rt_arg = (ArgumentRT*)a; @@ -706,64 +1387,69 @@ Task3Segmentation::Task3Segmentation(list args, RegionTemplate* i set_cout++; } - } - // all arguments except the DataRegions + } if (set_cout < args.size()) std::cout << __FILE__ << ":" << __LINE__ <<" Missing common arguments on Segmentation" << std::endl; + + } -Task3Segmentation::~Task3Segmentation() { - // if(segmented_rt_temp != NULL) delete segmented_rt_temp; +TaskSegmentation6::~TaskSegmentation6() { + } -bool Task3Segmentation::run(int procType, int tid) { - +bool TaskSegmentation6::run(int procType, int tid) { + cv::Mat segmented_rt; + uint64_t t1 = Util::ClockGetTimeProfile(); - std::cout << "[Task3Segmentation] executing." << std::endl; + std::cout << "TaskSegmentation6 executing." << std::endl; - ::nscale::HistologicalEntities::segmentNucleiStg3(minSizeSeg, maxSizeSeg, fillHolesConnectivity, *seg_nonoverlap, &segmented_rt); + ::nscale::HistologicalEntities::segmentNucleiStg7(&segmented_rt, minSizeSeg, maxSizeSeg, fillHolesConnectivity, seg_nonoverlap); - this->segmented_rt_temp->setData(segmented_rt); - uint64_t t2 = Util::ClockGetTimeProfile(); - std::cout << "[Task3Segmentation] time elapsed: "<< t2-t1 << std::endl; + this->segmented_rt_temp->setData(segmented_rt); + + std::cout << "Task Segmentation6 time elapsed: "<< t2-t1 << std::endl; } -void Task3Segmentation::updateDR(RegionTemplate* rt) { - rt->insertDataRegion(this->segmented_rt_temp); +void TaskSegmentation6::updateDR(RegionTemplate* rt) { +rt->insertDataRegion(this->segmented_rt_temp); + } -void Task3Segmentation::updateInterStageArgs(ReusableTask* t) { +void TaskSegmentation6::updateInterStageArgs(ReusableTask* t) { // verify if the tasks are compatible if (typeid(t) != typeid(this)) { - std::cout << "[Task3Segmentation] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + std::cout << "[TaskSegmentation6] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; return; } - this->seg_nonoverlap = ((Task3Segmentation*)t)->seg_nonoverlap; + this->seg_nonoverlap = ((TaskSegmentation6*)t)->seg_nonoverlap; + } -void Task3Segmentation::resolveDependencies(ReusableTask* t) { +void TaskSegmentation6::resolveDependencies(ReusableTask* t) { // verify if the task type is compatible - if (typeid(t) != typeid(Task2Segmentation)) { - std::cout << "[Task3Segmentation] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; - } - this->seg_nonoverlap = &((Task2Segmentation*)t)->seg_nonoverlap; + + + this->seg_nonoverlap = ((TaskSegmentation5*)t)->seg_nonoverlap; + } -bool Task3Segmentation::reusable(ReusableTask* rt) { - Task3Segmentation* t = (Task3Segmentation*)(rt); - if (this->segmented_rt_temp->getName() == t->segmented_rt_temp->getName() && - this->segmented_rt_temp->getId() == t->segmented_rt_temp->getId() && - this->segmented_rt_temp->getVersion() == t->segmented_rt_temp->getVersion() && +bool TaskSegmentation6::reusable(ReusableTask* rt) { + TaskSegmentation6* t = (TaskSegmentation6*)(rt); + if ( + this->segmented_rt_temp->getName() == t->segmented_rt_temp->getName() && this->minSizeSeg == t->minSizeSeg && this->maxSizeSeg == t->maxSizeSeg && - this->fillHolesConnectivity == t->fillHolesConnectivity) { + this->fillHolesConnectivity == t->fillHolesConnectivity && + + true) { return true; } else { @@ -772,14 +1458,19 @@ bool Task3Segmentation::reusable(ReusableTask* rt) { return true; } -int Task3Segmentation::size() { - return sizeof(int) + sizeof(int) + sizeof(int) + sizeof(int) + sizeof(int) + - sizeof(int) + sizeof(int) + segmented_rt_temp->getName().length()*sizeof(char); +int TaskSegmentation6::size() { + return + sizeof(int) + sizeof(int) + + sizeof(int) + segmented_rt_temp->getName().length()*sizeof(char) + sizeof(int) + + sizeof(int) + + sizeof(int) + + sizeof(int) + + + 0; } -int Task3Segmentation::serialize(char *buff) { +int TaskSegmentation6::serialize(char *buff) { int serialized_bytes = 0; - // copy id int id = this->getId(); memcpy(buff+serialized_bytes, &id, sizeof(int)); @@ -816,10 +1507,11 @@ int Task3Segmentation::serialize(char *buff) { memcpy(buff+serialized_bytes, &fillHolesConnectivity, sizeof(int)); serialized_bytes+=sizeof(int); + return serialized_bytes; } -int Task3Segmentation::deserialize(char *buff) { +int TaskSegmentation6::deserialize(char *buff) { int deserialized_bytes = 0; // extract task id @@ -844,7 +1536,7 @@ int Task3Segmentation::deserialize(char *buff) { deserialized_bytes += sizeof(int); // copy segmented_rt name - char segmented_rt_name[segmented_rt_name_size+1]; + char segmented_rt_name[segmented_rt_name_size+1]; segmented_rt_name[segmented_rt_name_size] = '\0'; memcpy(segmented_rt_name, buff+deserialized_bytes, sizeof(char)*segmented_rt_name_size); deserialized_bytes += sizeof(char)*segmented_rt_name_size; @@ -862,11 +1554,12 @@ int Task3Segmentation::deserialize(char *buff) { this->fillHolesConnectivity = ((int*)(buff+deserialized_bytes))[0]; deserialized_bytes += sizeof(int); + return deserialized_bytes; } -ReusableTask* Task3Segmentation::clone() { - ReusableTask* retValue = new Task3Segmentation(); +ReusableTask* TaskSegmentation6::clone() { + ReusableTask* retValue = new TaskSegmentation6(); int size = this->size(); char *buff = new char[size]; this->serialize(buff); @@ -876,24 +1569,24 @@ ReusableTask* Task3Segmentation::clone() { return retValue; } -void Task3Segmentation::print() { - - cout << "\t\t\tminSizeSeg: " << minSizeSeg << endl; - cout << "\t\t\tmaxSizeSeg: " << maxSizeSeg << endl; - cout << "\t\t\tfillHolesConnectivity: " << fillHolesConnectivity << endl; - cout << "\t\t\tin-seg_nonoverlap: " << seg_nonoverlap << endl; +void TaskSegmentation6::print() { + cout << "minSizeSeg: " << minSizeSeg << endl; + cout << "maxSizeSeg: " << maxSizeSeg << endl; + cout << "fillHolesConnectivity: " << fillHolesConnectivity << endl; + } // Create the task factory -ReusableTask* task3FactorySegmentation1(list args, RegionTemplate* inputRt) { - return new Task3Segmentation(args, inputRt); +ReusableTask* Segmentation6Factory1(list args, RegionTemplate* inputRt) { + return new TaskSegmentation6(args, inputRt); } // Create the task factory -ReusableTask* task3FactorySegmentation2() { - return new Task3Segmentation(); +ReusableTask* Segmentation6Factory2() { + return new TaskSegmentation6(); } // register factory with the runtime system -bool registeredSegmentationTask3 = ReusableTask::ReusableTaskFactory::taskRegister("Task3Segmentation", - &task3FactorySegmentation1, &task3FactorySegmentation2); \ No newline at end of file +bool registeredTaskSegmentation62 = ReusableTask::ReusableTaskFactory::taskRegister("TaskSegmentation6", + &Segmentation6Factory1, &Segmentation6Factory2); + diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp index b8f8199..dda42b6 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp @@ -61,7 +61,7 @@ friend class TaskSegmentation1; // data regions DenseDataRegion2D* normalized_rt_temp; - TaskSegmentation0() {}; + TaskSegmentation0(); TaskSegmentation0(list args, RegionTemplate* inputRt); virtual ~TaskSegmentation0(); @@ -90,19 +90,19 @@ friend class TaskSegmentation2; int reconConnectivity; // intertask arguments - std::vector **bgr; + std::vector *bgr; cv::Mat* rc; cv::Mat* rc_recon; cv::Mat* rc_open; // forward intertask arguments - cv::Mat **rbc_fw; + cv::Mat *rbc_fw; public: // data regions - TaskSegmentation1() {}; + TaskSegmentation1(); TaskSegmentation1(list args, RegionTemplate* inputRt); virtual ~TaskSegmentation1(); @@ -132,20 +132,20 @@ friend class TaskSegmentation3; unsigned char G1; // intertask arguments - cv::Mat** rc; - cv::Mat** rc_recon; - cv::Mat** rc_open; + cv::Mat* rc; + cv::Mat* rc_recon; + cv::Mat* rc_open; cv::Mat* bw1; cv::Mat* diffIm; // forward intertask arguments - cv::Mat **rbc_fw; + cv::Mat *rbc_fw; public: // data regions - TaskSegmentation2() {}; + TaskSegmentation2(); TaskSegmentation2(list args, RegionTemplate* inputRt); virtual ~TaskSegmentation2(); @@ -175,18 +175,18 @@ friend class TaskSegmentation4; int maxSize; // intertask arguments - cv::Mat** bw1; + cv::Mat* bw1; cv::Mat* bw1_t; // forward intertask arguments - cv::Mat **rbc_fw; - cv::Mat **diffIm_fw; + cv::Mat *rbc_fw; + cv::Mat *diffIm_fw; public: // data regions - TaskSegmentation3() {}; + TaskSegmentation3(); TaskSegmentation3(list args, RegionTemplate* inputRt); virtual ~TaskSegmentation3(); @@ -215,16 +215,16 @@ friend class TaskSegmentation5; unsigned char G2; // intertask arguments - cv::Mat** diffIm; - cv::Mat** bw1_t; - cv::Mat** rbc; + cv::Mat* diffIm; + cv::Mat* bw1_t; + cv::Mat* rbc; cv::Mat* seg_open; public: // data regions - TaskSegmentation4() {}; + TaskSegmentation4(); TaskSegmentation4(list args, RegionTemplate* inputRt); virtual ~TaskSegmentation4(); @@ -254,18 +254,18 @@ friend class TaskSegmentation6; int watershedConnectivity; // intertask arguments - cv::Mat** seg_open; + cv::Mat* seg_open; cv::Mat* seg_nonoverlap; // forward intertask arguments - cv::Mat **seg_open_fw; + cv::Mat *seg_open_fw; public: // data regions DenseDataRegion2D* normalized_rt_temp; - TaskSegmentation5() {}; + TaskSegmentation5(); TaskSegmentation5(list args, RegionTemplate* inputRt); virtual ~TaskSegmentation5(); @@ -295,15 +295,15 @@ class TaskSegmentation6: public ReusableTask { int fillHolesConnectivity; // intertask arguments - cv::Mat** seg_open; - cv::Mat** seg_nonoverlap; + cv::Mat* seg_open; + cv::Mat* seg_nonoverlap; public: // data regions DenseDataRegion2D* segmented_rt_temp; - TaskSegmentation6() {}; + TaskSegmentation6(); TaskSegmentation6(list args, RegionTemplate* inputRt); virtual ~TaskSegmentation6(); diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/Makefile b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/Makefile index 5ecdf60..86c85cd 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/Makefile +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/Makefile @@ -1,13 +1,13 @@ all: g++ gen.cpp jsoncpp -std=c++11 -o gen ./gen -d segmentation_desc - ./gen -d normalization_desc + # ./gen -d normalization_desc mv Segmentation.* .. - mv NormalizationComp.* .. + # mv NormalizationComp.* .. debug: g++ -g -ggdb -gdwarf-2 gen.cpp jsoncpp -std=c++11 -o gen gen: ./gen -d segmentation_desc - ./gen -d normalization_desc + # ./gen -d normalization_desc mv Segmentation.* .. - mv NormalizationComp.* .. \ No newline at end of file + # mv NormalizationComp.* .. \ No newline at end of file diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/gen b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/gen index 45ba7bd01c0701b30a7c89847c7fef443eba9bfe..0c98260fe2779869e555c90932a16de347e59271 100755 GIT binary patch delta 154013 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

#K176tHkR-$8Kpp-{S6#sWhEkTH~ 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 Gy8HhSa}+-S delta 155331 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

C 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\n\t\t\tset_cout++;\n\t\t}\n\n"; reusable_cond += "\t\tthis->" + data["tasks"][i]["args"][j]["name"].asString() + "_temp->getName() == t->" + - data["tasks"][i]["args"][j]["name"].asString() + "_temp->getName() &&\n\t\tthis->" + - data["tasks"][i]["args"][j]["name"].asString() + "_temp->getId() == t->" + - data["tasks"][i]["args"][j]["name"].asString() + "_temp->getId() &&\n\t\tthis->" + - data["tasks"][i]["args"][j]["name"].asString() + "_temp->getVersion() == t->" + - data["tasks"][i]["args"][j]["name"].asString() + "_temp->getVersion() &&\n"; + data["tasks"][i]["args"][j]["name"].asString() + "_temp->getName() &&\n"; task_size += "\t\tsizeof(int) + " + data["tasks"][i]["args"][j]["name"].asString() + "_temp->getName().length()*sizeof(char) + sizeof(int) +\n"; @@ -375,20 +371,20 @@ string generate_tasks(Json::Value data, string &desc_decl, string &desc_def) { " = ((Task" + name_prev + "*)t)->" + data["tasks"][i]["interstage_args"][j]["name"].asString() + "_fw;\n"; } else { resolve_deps += "\tthis->" + data["tasks"][i]["interstage_args"][j]["name"].asString() + - " = &((Task" + name_prev + "*)t)->" + data["tasks"][i]["interstage_args"][j]["name"].asString() + ";\n"; + " = ((Task" + name_prev + "*)t)->" + data["tasks"][i]["interstage_args"][j]["name"].asString() + ";\n"; } - call_args += "*" + data["tasks"][i]["interstage_args"][j]["name"].asString() + ", "; + call_args += data["tasks"][i]["interstage_args"][j]["name"].asString() + ", "; } else if (data["tasks"][i]["interstage_args"][j]["io"].asString().compare("output") == 0) { - call_args += "&" + data["tasks"][i]["interstage_args"][j]["name"].asString() + "_temp, "; + call_args += data["tasks"][i]["interstage_args"][j]["name"].asString() + ", "; fisrt_forward[data["tasks"][i]["interstage_args"][j]["name"].asString()] = false; intertask_mat += "\t" + getMatDRType(data["tasks"][i]["interstage_args"][j]["type"].asString()) + " " + data["tasks"][i]["interstage_args"][j]["name"].asString() + "_temp;\n"; - intertask_return += "\t" + data["tasks"][i]["interstage_args"][j]["name"].asString() + " = new " + - getMatDRType(data["tasks"][i]["interstage_args"][j]["type"].asString()) + "(" + - data["tasks"][i]["interstage_args"][j]["name"].asString() + "_temp);\n"; + intertask_inst += "\t" + data["tasks"][i]["interstage_args"][j]["name"].asString() + + " = new " + getMatDRType(data["tasks"][i]["interstage_args"][j]["type"].asString()) + ";\n"; + } else { update_ints_args += "\tthis->" + data["tasks"][i]["interstage_args"][j]["name"].asString() + "_fw = ((Task$NAME$*)t)->" + data["tasks"][i]["interstage_args"][j]["name"].asString() + "_fw;\n"; @@ -397,7 +393,7 @@ string generate_tasks(Json::Value data, string &desc_decl, string &desc_def) { if (fisrt_forward[data["tasks"][i]["interstage_args"][j]["name"].asString()] == false) { fisrt_forward[data["tasks"][i]["interstage_args"][j]["name"].asString()] = true; resolve_deps += "\tthis->" + data["tasks"][i]["interstage_args"][j]["name"].asString() + - "_fw = &((Task" + name_prev + "*)t)->" + data["tasks"][i]["interstage_args"][j]["name"].asString() + ";\n"; + "_fw = ((Task" + name_prev + "*)t)->" + data["tasks"][i]["interstage_args"][j]["name"].asString() + ";\n"; } else { resolve_deps += "\tthis->" + data["tasks"][i]["interstage_args"][j]["name"].asString() + "_fw = ((Task" + name_prev + "*)t)->" + data["tasks"][i]["interstage_args"][j]["name"].asString() + "_fw;\n"; @@ -435,12 +431,12 @@ string generate_tasks(Json::Value data, string &desc_decl, string &desc_def) { // $INTERTASK_MAT$ replace_multiple_string(source, "$INTERTASK_MAT$", intertask_mat); + // $INTERTASK_INST$ + replace_multiple_string(source, "$INTERTASK_INST$", intertask_inst); + // $CMD$ replace_multiple_string(source, "$CMD$", cmd); - // $INTERTASK_RETURN$ - replace_multiple_string(source, "$INTERTASK_RETURN$", intertask_return); - // $OUTPUT_DR_RETURN$ replace_multiple_string(source, "$OUTPUT_DR_RETURN$", output_dr_return); diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/source_task_template b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/source_task_template index afc44e6..945ad76 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/source_task_template +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/source_task_template @@ -1,3 +1,7 @@ +Task$NAME$::Task$NAME$() { +$INTERTASK_INST$ +} + Task$NAME$::Task$NAME$(list args, RegionTemplate* inputRt) { int set_cout = 0; @@ -6,7 +10,8 @@ $TASK_ARGS$ } if (set_cout < args.size()) std::cout << __FILE__ << ":" << __LINE__ <<" Missing common arguments on Segmentation" << std::endl; - + +$INTERTASK_INST$ } Task$NAME$::~Task$NAME$() { @@ -24,7 +29,7 @@ $INTERTASK_MAT$ $CMD$ uint64_t t2 = Util::ClockGetTimeProfile(); -$INTERTASK_RETURN$ + $OUTPUT_DR_RETURN$ std::cout << "Task $NAME$ time elapsed: "<< t2-t1 << std::endl; } From 6901fe3fa022edb7280b9ce3b88647cbf5f5fdcd Mon Sep 17 00:00:00 2001 From: Willian Date: Sun, 4 Sep 2016 22:02:55 -0300 Subject: [PATCH 29/87] Bug fix: It was possible for a reusable task to break dependencies when being reused. E.g: A__B__C__G \_D__E__H \_F__I Given the above task dependency tree if a stage S' was to be merged to the stage S (above), both of three tasks per workflow, and tasks A, D and C were said to be reusable by S' tasks the correct merged stage should be: A____B__C__G \___S'2__S'3__S'4 \__D__E__H \_F__I And instead the algorithm was retunning: A__B___C___G \ \__S'4 \_D__E___H \_F___I Breaking the dependency of C to B with D. The algorithm was fixed and tested successfully with 4 parameters with 2 values each, on -np 7. --- .../PipelineManager.cpp | 17 +++- .../PipelineRTFS-NS-Diff-FGO/Segmentation.cpp | 90 +++++++++---------- 2 files changed, 58 insertions(+), 49 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 7760871..0d5cd0e 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -204,7 +204,8 @@ int main(int argc, char* argv[]) { cout << "stage " << p.second->getId() << ":" << p.second->getName() << endl; cout << "\tinputs: " << endl; for (int i : p.second->getInputs()) - cout << "\t\t" << i << ":" << expanded_args[i]->getName() << endl; + cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " + << expanded_args[i]->toString() << endl; cout << "\toutputs: " << endl; for (int i : p.second->getOutputs()) cout << "\t\t" << i << ":" << expanded_args[i]->getName() << endl; @@ -944,7 +945,10 @@ list task_generator(map> &tasks_desc, } prev_task = n_task; tasks.emplace_back(n_task); - // cout << "[task_generator] new task " << uid << ":" << t->first << " with size " << n_task->size() << endl; + cout << "[task_generator] new task " << uid << ":" << t->first << " from stage " << p->getId() << endl; + cout << "[task_generator] \targs:" << endl; + n_task->print(); + } return tasks; @@ -971,6 +975,7 @@ void merge_stages(PipelineComponentBase* current, PipelineComponentBase* s, map< ReusableTask* current_frontier_reusable_tasks; map>::iterator p=ref.begin(); + ReusableTask* prev_reusable_task = NULL; for (; p!=ref.end(); p++) { // verify if this is the first reusable task ReusableTask* t_s = find_task(s->tasks, p->first); @@ -979,8 +984,12 @@ void merge_stages(PipelineComponentBase* current, PipelineComponentBase* s, map< // check all of the same tasks of current bool reusable = false; for (ReusableTask* t : t_cur) { - if (t->reusable(t_s)) { + // verify if t_s is reusable by checking if it's compatible with a task t and + // if the prev_reusable_task is also the predecessor of t. + if (t->reusable(t_s) && (prev_reusable_task == NULL || + prev_reusable_task->getId() == t->parentTask)) { reusable = true; + prev_reusable_task = t; current_frontier_reusable_tasks = t; break; } @@ -1019,7 +1028,7 @@ void merge_stages_fine_grain(const map &all_stages, current_stages.pop_front(); // move forward if this stage was merged with another one - if (current->reused == NULL) { + if (current->reused == NULL) { // start by generating all tasks if (current->tasks.size() == 0) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp index c9142fb..ebbeaee 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp @@ -106,7 +106,7 @@ Segmentation::~Segmentation() {} int Segmentation::run() { // Print name and id of the component instance - std::cout << "Executing component: " << this->getComponentName() << " instance id: " << this->getId() <getComponentName() << " instance id: " << this->getId() <getRegionTemplateInstance("tile"); this->addInputOutputDataRegion("tile", "normalized_rt", RTPipelineComponentBase::INPUT); @@ -116,7 +116,7 @@ int Segmentation::run() { map prev_map; for (list::reverse_iterator task=tasks.rbegin(); task!=tasks.rend(); task++) { - cout << "[Segmentation] sending task " << (*task)->getId() << endl; + cout << "\t\t\t[Segmentation] sending task " << (*task)->getId() << endl; // generate a task copy and update the DR, getting the actual data ReusableTask* t = (*task)->clone(); t->updateDR(inputRt); @@ -219,14 +219,14 @@ bool TaskSegmentation0::run(int procType, int tid) { uint64_t t1 = Util::ClockGetTimeProfile(); - std::cout << "TaskSegmentation0 executing." << std::endl; + std::cout << "\t\t\tTaskSegmentation0 executing." << std::endl; ::nscale::HistologicalEntities::segmentNucleiStg1(normalized_rt, blue, green, red, T1, T2, bgr, rbc); uint64_t t2 = Util::ClockGetTimeProfile(); - std::cout << "Task Segmentation0 time elapsed: "<< t2-t1 << std::endl; + std::cout << "\t\t\tTask Segmentation0 time elapsed: "<< t2-t1 << std::endl; } void TaskSegmentation0::updateDR(RegionTemplate* rt) { @@ -238,7 +238,7 @@ void TaskSegmentation0::updateDR(RegionTemplate* rt) { void TaskSegmentation0::updateInterStageArgs(ReusableTask* t) { // verify if the tasks are compatible if (typeid(t) != typeid(this)) { - std::cout << "[TaskSegmentation0] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + std::cout << "\t\t\t[TaskSegmentation0] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; return; } @@ -248,7 +248,7 @@ void TaskSegmentation0::updateInterStageArgs(ReusableTask* t) { void TaskSegmentation0::resolveDependencies(ReusableTask* t) { // verify if the task type is compatible if (typeid(t) != typeid(TaskSegmentation1)) { - std::cout << "[TaskSegmentation1] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + std::cout << "\t\t\t[TaskSegmentation1] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; } @@ -404,11 +404,11 @@ ReusableTask* TaskSegmentation0::clone() { } void TaskSegmentation0::print() { - cout << "blue: " << blue << endl; - cout << "green: " << green << endl; - cout << "red: " << red << endl; - cout << "T1: " << T1 << endl; - cout << "T2: " << T2 << endl; + cout << "\t\t\tblue: " << blue << endl; + cout << "\t\t\tgreen: " << green << endl; + cout << "\t\t\tred: " << red << endl; + cout << "\t\t\tT1: " << T1 << endl; + cout << "\t\t\tT2: " << T2 << endl; } @@ -466,14 +466,14 @@ bool TaskSegmentation1::run(int procType, int tid) { uint64_t t1 = Util::ClockGetTimeProfile(); - std::cout << "TaskSegmentation1 executing." << std::endl; + std::cout << "\t\t\tTaskSegmentation1 executing." << std::endl; ::nscale::HistologicalEntities::segmentNucleiStg2(reconConnectivity, bgr, rc, rc_recon, rc_open); uint64_t t2 = Util::ClockGetTimeProfile(); - std::cout << "Task Segmentation1 time elapsed: "<< t2-t1 << std::endl; + std::cout << "\t\t\tTask Segmentation1 time elapsed: "<< t2-t1 << std::endl; } void TaskSegmentation1::updateDR(RegionTemplate* rt) { @@ -483,7 +483,7 @@ void TaskSegmentation1::updateDR(RegionTemplate* rt) { void TaskSegmentation1::updateInterStageArgs(ReusableTask* t) { // verify if the tasks are compatible if (typeid(t) != typeid(this)) { - std::cout << "[TaskSegmentation1] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + std::cout << "\t\t\t[TaskSegmentation1] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; return; } @@ -495,7 +495,7 @@ void TaskSegmentation1::updateInterStageArgs(ReusableTask* t) { void TaskSegmentation1::resolveDependencies(ReusableTask* t) { // verify if the task type is compatible if (typeid(t) != typeid(TaskSegmentation2)) { - std::cout << "[TaskSegmentation2] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + std::cout << "\t\t\t[TaskSegmentation2] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; } @@ -577,7 +577,7 @@ ReusableTask* TaskSegmentation1::clone() { } void TaskSegmentation1::print() { - cout << "reconConnectivity: " << reconConnectivity << endl; + cout << "\t\t\treconConnectivity: " << reconConnectivity << endl; } @@ -637,14 +637,14 @@ bool TaskSegmentation2::run(int procType, int tid) { uint64_t t1 = Util::ClockGetTimeProfile(); - std::cout << "TaskSegmentation2 executing." << std::endl; + std::cout << "\t\t\tTaskSegmentation2 executing." << std::endl; ::nscale::HistologicalEntities::segmentNucleiStg3(fillHolesConnectivity, G1, rc, rc_recon, rc_open, bw1, diffIm); uint64_t t2 = Util::ClockGetTimeProfile(); - std::cout << "Task Segmentation2 time elapsed: "<< t2-t1 << std::endl; + std::cout << "\t\t\tTask Segmentation2 time elapsed: "<< t2-t1 << std::endl; } void TaskSegmentation2::updateDR(RegionTemplate* rt) { @@ -654,7 +654,7 @@ void TaskSegmentation2::updateDR(RegionTemplate* rt) { void TaskSegmentation2::updateInterStageArgs(ReusableTask* t) { // verify if the tasks are compatible if (typeid(t) != typeid(this)) { - std::cout << "[TaskSegmentation2] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + std::cout << "\t\t\t[TaskSegmentation2] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; return; } @@ -668,7 +668,7 @@ void TaskSegmentation2::updateInterStageArgs(ReusableTask* t) { void TaskSegmentation2::resolveDependencies(ReusableTask* t) { // verify if the task type is compatible if (typeid(t) != typeid(TaskSegmentation3)) { - std::cout << "[TaskSegmentation3] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + std::cout << "\t\t\t[TaskSegmentation3] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; } @@ -762,8 +762,8 @@ ReusableTask* TaskSegmentation2::clone() { } void TaskSegmentation2::print() { - cout << "fillHolesConnectivity: " << fillHolesConnectivity << endl; - cout << "G1: " << G1 << endl; + cout << "\t\t\tfillHolesConnectivity: " << fillHolesConnectivity << endl; + cout << "\t\t\tG1: " << G1 << endl; } @@ -820,14 +820,14 @@ bool TaskSegmentation3::run(int procType, int tid) { uint64_t t1 = Util::ClockGetTimeProfile(); - std::cout << "TaskSegmentation3 executing." << std::endl; + std::cout << "\t\t\tTaskSegmentation3 executing." << std::endl; ::nscale::HistologicalEntities::segmentNucleiStg4(minSize, maxSize, bw1, bw1_t); uint64_t t2 = Util::ClockGetTimeProfile(); - std::cout << "Task Segmentation3 time elapsed: "<< t2-t1 << std::endl; + std::cout << "\t\t\tTask Segmentation3 time elapsed: "<< t2-t1 << std::endl; } void TaskSegmentation3::updateDR(RegionTemplate* rt) { @@ -837,7 +837,7 @@ void TaskSegmentation3::updateDR(RegionTemplate* rt) { void TaskSegmentation3::updateInterStageArgs(ReusableTask* t) { // verify if the tasks are compatible if (typeid(t) != typeid(this)) { - std::cout << "[TaskSegmentation3] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + std::cout << "\t\t\t[TaskSegmentation3] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; return; } @@ -850,7 +850,7 @@ void TaskSegmentation3::updateInterStageArgs(ReusableTask* t) { void TaskSegmentation3::resolveDependencies(ReusableTask* t) { // verify if the task type is compatible if (typeid(t) != typeid(TaskSegmentation4)) { - std::cout << "[TaskSegmentation4] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + std::cout << "\t\t\t[TaskSegmentation4] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; } @@ -943,8 +943,8 @@ ReusableTask* TaskSegmentation3::clone() { } void TaskSegmentation3::print() { - cout << "minSize: " << minSize << endl; - cout << "maxSize: " << maxSize << endl; + cout << "\t\t\tminSize: " << minSize << endl; + cout << "\t\t\tmaxSize: " << maxSize << endl; } @@ -996,14 +996,14 @@ bool TaskSegmentation4::run(int procType, int tid) { uint64_t t1 = Util::ClockGetTimeProfile(); - std::cout << "TaskSegmentation4 executing." << std::endl; + std::cout << "\t\t\tTaskSegmentation4 executing." << std::endl; ::nscale::HistologicalEntities::segmentNucleiStg5(G2, diffIm, bw1_t, rbc, seg_open); uint64_t t2 = Util::ClockGetTimeProfile(); - std::cout << "Task Segmentation4 time elapsed: "<< t2-t1 << std::endl; + std::cout << "\t\t\tTask Segmentation4 time elapsed: "<< t2-t1 << std::endl; } void TaskSegmentation4::updateDR(RegionTemplate* rt) { @@ -1013,7 +1013,7 @@ void TaskSegmentation4::updateDR(RegionTemplate* rt) { void TaskSegmentation4::updateInterStageArgs(ReusableTask* t) { // verify if the tasks are compatible if (typeid(t) != typeid(this)) { - std::cout << "[TaskSegmentation4] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + std::cout << "\t\t\t[TaskSegmentation4] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; return; } @@ -1026,7 +1026,7 @@ void TaskSegmentation4::updateInterStageArgs(ReusableTask* t) { void TaskSegmentation4::resolveDependencies(ReusableTask* t) { // verify if the task type is compatible if (typeid(t) != typeid(TaskSegmentation5)) { - std::cout << "[TaskSegmentation5] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + std::cout << "\t\t\t[TaskSegmentation5] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; } @@ -1109,7 +1109,7 @@ ReusableTask* TaskSegmentation4::clone() { } void TaskSegmentation4::print() { - cout << "G2: " << G2 << endl; + cout << "\t\t\tG2: " << G2 << endl; } @@ -1178,14 +1178,14 @@ bool TaskSegmentation5::run(int procType, int tid) { uint64_t t1 = Util::ClockGetTimeProfile(); - std::cout << "TaskSegmentation5 executing." << std::endl; + std::cout << "\t\t\tTaskSegmentation5 executing." << std::endl; ::nscale::HistologicalEntities::segmentNucleiStg6(normalized_rt, minSizePl, watershedConnectivity, seg_open, seg_nonoverlap); uint64_t t2 = Util::ClockGetTimeProfile(); - std::cout << "Task Segmentation5 time elapsed: "<< t2-t1 << std::endl; + std::cout << "\t\t\tTask Segmentation5 time elapsed: "<< t2-t1 << std::endl; } void TaskSegmentation5::updateDR(RegionTemplate* rt) { @@ -1197,7 +1197,7 @@ void TaskSegmentation5::updateDR(RegionTemplate* rt) { void TaskSegmentation5::updateInterStageArgs(ReusableTask* t) { // verify if the tasks are compatible if (typeid(t) != typeid(this)) { - std::cout << "[TaskSegmentation5] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + std::cout << "\t\t\t[TaskSegmentation5] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; return; } @@ -1208,7 +1208,7 @@ void TaskSegmentation5::updateInterStageArgs(ReusableTask* t) { void TaskSegmentation5::resolveDependencies(ReusableTask* t) { // verify if the task type is compatible if (typeid(t) != typeid(TaskSegmentation6)) { - std::cout << "[TaskSegmentation6] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + std::cout << "\t\t\t[TaskSegmentation6] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; } @@ -1335,8 +1335,8 @@ ReusableTask* TaskSegmentation5::clone() { } void TaskSegmentation5::print() { - cout << "minSizePl: " << minSizePl << endl; - cout << "watershedConnectivity: " << watershedConnectivity << endl; + cout << "\t\t\tminSizePl: " << minSizePl << endl; + cout << "\t\t\twatershedConnectivity: " << watershedConnectivity << endl; } @@ -1406,7 +1406,7 @@ bool TaskSegmentation6::run(int procType, int tid) { uint64_t t1 = Util::ClockGetTimeProfile(); - std::cout << "TaskSegmentation6 executing." << std::endl; + std::cout << "\t\t\tTaskSegmentation6 executing." << std::endl; ::nscale::HistologicalEntities::segmentNucleiStg7(&segmented_rt, minSizeSeg, maxSizeSeg, fillHolesConnectivity, seg_nonoverlap); @@ -1414,7 +1414,7 @@ bool TaskSegmentation6::run(int procType, int tid) { this->segmented_rt_temp->setData(segmented_rt); - std::cout << "Task Segmentation6 time elapsed: "<< t2-t1 << std::endl; + std::cout << "\t\t\tTask Segmentation6 time elapsed: "<< t2-t1 << std::endl; } void TaskSegmentation6::updateDR(RegionTemplate* rt) { @@ -1425,7 +1425,7 @@ rt->insertDataRegion(this->segmented_rt_temp); void TaskSegmentation6::updateInterStageArgs(ReusableTask* t) { // verify if the tasks are compatible if (typeid(t) != typeid(this)) { - std::cout << "[TaskSegmentation6] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + std::cout << "\t\t\t[TaskSegmentation6] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; return; } @@ -1570,9 +1570,9 @@ ReusableTask* TaskSegmentation6::clone() { } void TaskSegmentation6::print() { - cout << "minSizeSeg: " << minSizeSeg << endl; - cout << "maxSizeSeg: " << maxSizeSeg << endl; - cout << "fillHolesConnectivity: " << fillHolesConnectivity << endl; + cout << "\t\t\tminSizeSeg: " << minSizeSeg << endl; + cout << "\t\t\tmaxSizeSeg: " << maxSizeSeg << endl; + cout << "\t\t\tfillHolesConnectivity: " << fillHolesConnectivity << endl; } From 5768b823a7d847608f6dc8faa7e8541dc22fb9a4 Mon Sep 17 00:00:00 2001 From: Willian Date: Wed, 7 Sep 2016 01:32:31 -0300 Subject: [PATCH 30/87] Stoer-Wagner min-cut algorithm implemented. As far as it was tested it doesn't present any bug. In order to compile it the boost lib is required. The output isn't still finished (i.e outputs on stdout only). Also, the cut weight ins't implemented yet, so the cut value on the output is a miscalculated value. The min-cut algorithm isn't integrated on the system yet. --- .../graph/min_cut.cpp | 276 ++++++++++++++++++ 1 file changed, 276 insertions(+) create mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/min_cut.cpp diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/min_cut.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/min_cut.cpp new file mode 100644 index 0000000..6456baa --- /dev/null +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/min_cut.cpp @@ -0,0 +1,276 @@ +#include +#include +#include +#include +#include + +/**************************************************/ +/** Basic Entities **/ +/**************************************************/ + +typedef int _id_t; +typedef int weight_t; + +typedef std::pair node_t; +#define _node(w,id) std::make_pair(w,id) + +typedef std::pair, std::list<_id_t>>> cut_t; +#define _cut(w, s1, s2) std::make_pair(w,std::make_pair(s1,s2)) +#define _cut_w(c) c.first +#define _cut_s1(c) c.second.first +#define _cut_t2(c) c.second.second + +/**************************************************/ +/** Fibonacci Comparator **/ +/**************************************************/ +/** This is needed to enforce that the weight is **/ +/** ordered in a descending manner, and id is **/ +/** ordered in a ascending manner on the **/ +/** fibonacci heap. **/ +/**************************************************/ + +struct my_comparator { + bool operator() (const node_t& x, const node_t& y) const { + if (x.first != y.first) + return x.first < y.first; + else + return x.second > y.second; + } + typedef node_t first_argument_type; + typedef node_t second_argument_type; + typedef bool result_type; +}; + +typedef boost::heap::fibonacci_heap> fibonacci; + +/**************************************************/ +/** Funs Prototypes **/ +/**************************************************/ + +int min_cut(size_t n, weight_t** adjMat); +cut_t min_cut_phase(size_t n, weight_t** adjMat, + std::map<_id_t,std::list<_id_t>> &vertices, _id_t a); + +weight_t sum(size_t n, weight_t* A); + +/**************************************************/ +/** Main code **/ +/**************************************************/ + +int main() { + size_t n=5; + weight_t _adjMat[n][n]={{0,2,2,1,1}, + {2,0,2,1,1}, + {2,2,0,1,1}, + {1,1,1,0,3}, + {1,1,1,3,0}}; + // weight_t _adjMat[n][n]={{0,2,0,0,3,0,0,0}, + // {2,0,3,0,2,2,0,0}, + // {0,3,0,4,0,0,2,0}, + // {0,0,4,0,0,0,2,2}, + // {3,2,0,0,0,3,0,0}, + // {0,2,0,0,3,0,1,0}, + // {0,0,2,2,0,1,0,3}, + // {0,0,0,2,0,0,3,0}}; + + // my compiler wont plat VLA, so we need this workaround + weight_t** adjMat = new weight_t *[n]; + for (size_t i=0; i cuts; + + // initialize vertices + std::map<_id_t, std::list<_id_t>> vertices; + for (int i=0; i(1,i); + + // keep finding cuts until there are no more find + while (vertices.size() > 1) { + // get the first 'a' vertex as the most connected vertex + weight_t max = 0; + weight_t m; + for (int i=0; i max) { + a = i; + max = m; + } + } + + // run a phase of cut + cuts.emplace_back(min_cut_phase(n, adjMat, vertices, a)); + std::cout << std::endl; + } +} + +cut_t min_cut_phase(size_t n_max, weight_t** adjMat, + std::map<_id_t,std::list<_id_t>> &vertices, _id_t a) { + + _id_t s; + _id_t t; + weight_t cut; + size_t n = vertices.size(); + + // generate priority queue + fibonacci q; + for (std::pair<_id_t, std::list<_id_t>> v : vertices) { + if (v.first != a) { + q.push(_node(adjMat[v.first][a], v.first)); + } + } + + // array of vertices ids A + _id_t A[n]; + A[0] = a; + t = a; + + // std::cout << "a=" << a << std::endl; + // greedy insertion loop + for (size_t i=1; ifirst+adjMat[A[i]][it->second], it->second); + // std::cout << "updated: " << fibonacci_updated[j].second << ":" + // << fibonacci_updated[j].first << std::endl; + j++; + } + + // 2 - actually updates the heap + for (j=0; j s1 = vertices.at(s); + std::list<_id_t> s2 = vertices.at(t); + + std::cout << "Got cut " << cut << ":" << std::endl; + std::cout << "\tS1:" << std::endl; + for (_id_t i=0; i 0) + for (_id_t j : vertices.at(i)) + std::cout << "\t\t" << j << std::endl; + std::cout << "\tS2:" << std::endl; + for (_id_t i : s2) + std::cout << "\t\t" << i << std::endl; + + // merge s and t + for (std::pair<_id_t,std::list<_id_t>> _t : vertices) { + if (_t.first == t) { + // add all of t's merged vertices to s + vertices.at(s).insert(vertices.at(s).begin(), + _t.second.begin(), _t.second.end()); + // remove t + vertices.erase(_t.first); + break; + } + } + + // update adjMat by merging the edges of t to s + for (size_t i=0; i> vertices) { + for (std::pair<_id_t,std::list<_id_t>> v : vertices) { + std::cout << v.first << std::endl; + for (_id_t id : v.second) + std::cout << "\t" << id << std::endl; + } +} + +void pf(fibonacci q) { + for (fibonacci::ordered_iterator i=q.ordered_begin(); i!=q.ordered_end(); i++) { + std::cout << i->second << ":" << i->first << std::endl; + } +} \ No newline at end of file From 62f0b2827c0a0eacb3cffaed53b061e07e077a53 Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Wed, 7 Sep 2016 14:43:18 -0300 Subject: [PATCH 31/87] Fixed cut weight calculation and namespace interface to min-cut module. --- .../graph/min_cut.cpp | 108 ++++++------------ .../graph/min_cut.hpp | 54 +++++++++ 2 files changed, 92 insertions(+), 70 deletions(-) create mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/min_cut.hpp diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/min_cut.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/min_cut.cpp index 6456baa..b4e703f 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/min_cut.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/min_cut.cpp @@ -1,54 +1,14 @@ #include -#include #include -#include -#include -/**************************************************/ -/** Basic Entities **/ -/**************************************************/ - -typedef int _id_t; -typedef int weight_t; - -typedef std::pair node_t; -#define _node(w,id) std::make_pair(w,id) +#include "min_cut.hpp" -typedef std::pair, std::list<_id_t>>> cut_t; -#define _cut(w, s1, s2) std::make_pair(w,std::make_pair(s1,s2)) -#define _cut_w(c) c.first -#define _cut_s1(c) c.second.first -#define _cut_t2(c) c.second.second +using namespace mincut; /**************************************************/ -/** Fibonacci Comparator **/ +/** Internal Funs Prototypes **/ /**************************************************/ -/** This is needed to enforce that the weight is **/ -/** ordered in a descending manner, and id is **/ -/** ordered in a ascending manner on the **/ -/** fibonacci heap. **/ -/**************************************************/ - -struct my_comparator { - bool operator() (const node_t& x, const node_t& y) const { - if (x.first != y.first) - return x.first < y.first; - else - return x.second > y.second; - } - typedef node_t first_argument_type; - typedef node_t second_argument_type; - typedef bool result_type; -}; -typedef boost::heap::fibonacci_heap> fibonacci; - -/**************************************************/ -/** Funs Prototypes **/ -/**************************************************/ - -int min_cut(size_t n, weight_t** adjMat); cut_t min_cut_phase(size_t n, weight_t** adjMat, std::map<_id_t,std::list<_id_t>> &vertices, _id_t a); @@ -58,23 +18,24 @@ weight_t sum(size_t n, weight_t* A); /** Main code **/ /**************************************************/ +// this is a test code for min_cut int main() { - size_t n=5; - weight_t _adjMat[n][n]={{0,2,2,1,1}, - {2,0,2,1,1}, - {2,2,0,1,1}, - {1,1,1,0,3}, - {1,1,1,3,0}}; - // weight_t _adjMat[n][n]={{0,2,0,0,3,0,0,0}, - // {2,0,3,0,2,2,0,0}, - // {0,3,0,4,0,0,2,0}, - // {0,0,4,0,0,0,2,2}, - // {3,2,0,0,0,3,0,0}, - // {0,2,0,0,3,0,1,0}, - // {0,0,2,2,0,1,0,3}, - // {0,0,0,2,0,0,3,0}}; + size_t n=8; + // weight_t _adjMat[n][n]={{0,2,2,1,1}, + // {2,0,2,1,1}, + // {2,2,0,1,1}, + // {1,1,1,0,3}, + // {1,1,1,3,0}}; + weight_t _adjMat[n][n]={{0,2,0,0,3,0,0,0}, + {2,0,3,0,2,2,0,0}, + {0,3,0,4,0,0,2,0}, + {0,0,4,0,0,0,2,2}, + {3,2,0,0,0,3,0,0}, + {0,2,0,0,3,0,1,0}, + {0,0,2,2,0,1,0,3}, + {0,0,0,2,0,0,3,0}}; - // my compiler wont plat VLA, so we need this workaround + // my compiler won't do VLA, so we need this workaround weight_t** adjMat = new weight_t *[n]; for (size_t i=0; i mincut::min_cut(size_t n, weight_t** adjMat) { _id_t a; cut_t cut; @@ -111,8 +81,9 @@ int min_cut(size_t n, weight_t** adjMat) { // run a phase of cut cuts.emplace_back(min_cut_phase(n, adjMat, vertices, a)); - std::cout << std::endl; } + + return cuts; } cut_t min_cut_phase(size_t n_max, weight_t** adjMat, @@ -175,10 +146,11 @@ cut_t min_cut_phase(size_t n_max, weight_t** adjMat, } // get cut weight - cut = adjMat[s][t]; + cut = sum(n_max, adjMat[t]); // std::cout << "s=" << s << std::endl; // std::cout << "t=" << t << std::endl; + // std::cout << "cut=" << cut << std::endl; // std::cout << "before merge:" << std::endl; // for (size_t i=0; i s1 = vertices.at(s); std::list<_id_t> s2 = vertices.at(t); + std::list<_id_t> s1; - std::cout << "Got cut " << cut << ":" << std::endl; - std::cout << "\tS1:" << std::endl; + // get all vertices of the first sub-graph for (_id_t i=0; i 0) - for (_id_t j : vertices.at(i)) - std::cout << "\t\t" << j << std::endl; - std::cout << "\tS2:" << std::endl; - for (_id_t i : s2) - std::cout << "\t\t" << i << std::endl; + for (_id_t j : vertices.at(i)) + s1.emplace_back(j); // merge s and t for (std::pair<_id_t,std::list<_id_t>> _t : vertices) { diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/min_cut.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/min_cut.hpp new file mode 100644 index 0000000..9311798 --- /dev/null +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/min_cut.hpp @@ -0,0 +1,54 @@ +#ifndef MIN_CUT_HPP +#define MIN_CUT_HPP + +#include +#include + +/**************************************************/ +/** Basic Entities **/ +/**************************************************/ + +namespace mincut { + + // basic types + typedef int _id_t; + typedef int weight_t; + + typedef std::pair node_t; + inline node_t _node(weight_t w,_id_t id) {return std::make_pair(w,id);} + + typedef std::list<_id_t> subgraph_t; + typedef std::pair> cut_t; + inline cut_t _cut(weight_t w, subgraph_t s1, subgraph_t s2) {return std::make_pair(w,std::make_pair(s1,s2));} + inline weight_t _cut_w(cut_t c) {return c.first;} + inline subgraph_t _cut_s1(cut_t c) {return c.second.first;} + inline subgraph_t _cut_s2(cut_t c) {return c.second.second;} + + /**************************************************/ + /** Fibonacci Comparator **/ + /**************************************************/ + /** This is needed to enforce that the weight is **/ + /** ordered in a descending manner, and id is **/ + /** ordered in a ascending manner on the **/ + /** fibonacci heap. **/ + /**************************************************/ + + struct my_comparator { + bool operator() (const node_t& x, const node_t& y) const { + if (x.first != y.first) + return x.first < y.first; + else + return x.second > y.second; + } + typedef node_t first_argument_type; + typedef node_t second_argument_type; + typedef bool result_type; + }; + + typedef boost::heap::fibonacci_heap> fibonacci; + + std::list min_cut(size_t n, weight_t** adjMat); + +} +#endif \ No newline at end of file From 5f18a87afbaaff78efbca236997137d24f10a3b7 Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Thu, 8 Sep 2016 02:42:05 -0300 Subject: [PATCH 32/87] Integration of mincut with PipelineManager 50% complete. --- runtime/PipelineComponentBase.cpp | 7 - .../PipelineRTFS-NS-Diff-FGO/CMakeLists.txt | 2 +- .../PipelineManager.cpp | 265 +++++++++++++++--- 3 files changed, 231 insertions(+), 43 deletions(-) diff --git a/runtime/PipelineComponentBase.cpp b/runtime/PipelineComponentBase.cpp index 436d5ae..064d79f 100644 --- a/runtime/PipelineComponentBase.cpp +++ b/runtime/PipelineComponentBase.cpp @@ -38,7 +38,6 @@ PipelineComponentBase::~PipelineComponentBase() { ArgumentBase *aux = this->arguments.back(); this->arguments.pop_back(); if (aux->getIo() == ArgumentBase::input) { - std::cout << "[PipelineComponentBase] deleting input " << aux->getName() << std::endl; delete aux; } } @@ -225,9 +224,6 @@ int PipelineComponentBase::serialize(char *buff) memcpy(buff+serialized_bytes, (*t)->getTaskName().c_str(), task_name_size*sizeof(char) ); serialized_bytes+=task_name_size*sizeof(char); - cout << "[PipelineComponentBase] serializing task name " << (*t)->getTaskName() - << " of size " << (*t)->getTaskName().size() << endl; - // copy the task serialized_bytes += (*t)->serialize(buff+serialized_bytes); } @@ -349,9 +345,6 @@ int PipelineComponentBase::deserialize(char *buff) std::string task_name_s = std::string(task_name); // std::string task_name_s = "TaskSegmentation"; - cout << "[PipelineComponentBase] deserializing task name " << task_name_s - << " of size " << task_name_s.size() << endl; - // deserialize the task ReusableTask* task = ReusableTask::ReusableTaskFactory::getTaskFromName(task_name_s); task->setTaskName(task_name_s); diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/CMakeLists.txt b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/CMakeLists.txt index f9f11a1..cfd9934 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/CMakeLists.txt +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/CMakeLists.txt @@ -38,7 +38,7 @@ set(libname componentnsdifffgo) # Source files used by the Runtime System set(libcomponentssrcs NormalizationComp.cpp Segmentation.cpp FeatureExtraction.cpp - TaskFeatures.cpp DiffMaskComp.cpp jsoncpp.cpp) + TaskFeatures.cpp DiffMaskComp.cpp jsoncpp.cpp graph/min_cut.cpp) set(libcomparativeanalysis ../../comparativeanalysis/TaskDiffMask.cpp ../../comparativeanalysis/pixelcompare/PixelCompare.cpp) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 0d5cd0e..4edb5ca 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -14,6 +14,7 @@ #include "RTPipelineComponentBase.h" #include "RegionTemplateCollection.h" #include "ReusableTask.hpp" +#include "graph/min_cut.hpp" using namespace std; @@ -52,6 +53,29 @@ void mapprint(map mapp) { cout << i->first << ":" << i->second->getName() << endl; } +void adj_mat_print(mincut::weight_t** adjMat, size_t n) { + for (int i=0; i id2task, size_t n) { + cout << "x\t"; + for (int i=0; i &workflow_inputs, map> ¶meters_values); @@ -91,7 +115,7 @@ int main(int argc, char* argv[]) { SysEnv sysEnv; // Tell the system which libraries should be used - sysEnv.startupSystem(argc, argv, "libcomponentnsdifffgo.so"); + // sysEnv.startupSystem(argc, argv, "libcomponentnsdifffgo.so"); // region template used by all stages RegionTemplate *rt = new RegionTemplate(); @@ -211,10 +235,10 @@ int main(int argc, char* argv[]) { cout << "\t\t" << i << ":" << expanded_args[i]->getName() << endl; } - cout << endl << "merged args" << endl; - for (pair p : expanded_args) - cout << "\t" << p.first << ":" << p.second->getName() << " = " - << p.second->toString() << " sized: " << p.second->size() << endl; + // cout << endl << "merged args" << endl; + // for (pair p : expanded_args) + // cout << "\t" << p.first << ":" << p.second->getName() << " = " + // << p.second->toString() << " sized: " << p.second->size() << endl; map merged_stages; merge_stages_fine_grain(expanded_stages, base_stages, merged_stages, rt, expanded_args); @@ -945,9 +969,9 @@ list task_generator(map> &tasks_desc, } prev_task = n_task; tasks.emplace_back(n_task); - cout << "[task_generator] new task " << uid << ":" << t->first << " from stage " << p->getId() << endl; - cout << "[task_generator] \targs:" << endl; - n_task->print(); + // cout << "[task_generator] new task " << uid << ":" << t->first << " from stage " << p->getId() << endl; + // cout << "[task_generator] \targs:" << endl; + // n_task->print(); } @@ -1011,6 +1035,44 @@ void merge_stages(PipelineComponentBase* current, PipelineComponentBase* s, map< } } +mincut::weight_t get_reuse_factor(PipelineComponentBase* s1, PipelineComponentBase* s2, map> ref) { + PipelineComponentBase* s1_clone = s1->clone(); + PipelineComponentBase* s2_clone = s2->clone(); + + merge_stages(s1_clone, s2_clone, ref); + + return s1->tasks.size() + s2->tasks.size() - s1_clone->tasks.size(); +} + +int get_reuse_factor(mincut::subgraph_t s1, mincut::subgraph_t s2, map id2task, + map current_stages, map> ref) { + + // get the first stage as a base stage + mincut::subgraph_t::iterator s1_it = s1.begin(); + PipelineComponentBase* current1 = current_stages[id2task[*s1_it]]->clone(); + s1_it++; + for (; s1_it!=s1.end(); s1_it++) { + PipelineComponentBase* clone1 = current_stages[id2task[*s1_it]]->clone(); + if (merging_condition(current1, clone1, ref)) + merge_stages(current1, clone1, ref); + else + current1->tasks.insert(current1->tasks.begin(), clone1->tasks.begin(), clone1->tasks.end()); + } + + // get the first stage as a base stage + mincut::subgraph_t::iterator s2_it = s2.begin(); + PipelineComponentBase* current2 = current_stages[id2task[(*s2_it)]]->clone(); + for (s2_it++; s2_it!=s2.end(); s2_it++) { + PipelineComponentBase* clone2 = current_stages[id2task[*s2_it]]->clone(); + if (merging_condition(current2, clone2, ref)) + merge_stages(current2, clone2, ref); + else + current2->tasks.insert(current2->tasks.begin(), clone2->tasks.begin(), clone2->tasks.end()); + } + + return current1->tasks.size()>current2->tasks.size()?current1->tasks.size():current2->tasks.size(); +} + void merge_stages_fine_grain(const map &all_stages, const map &stages_ref, map &merged_stages, RegionTemplate* rt, map expanded_args) { @@ -1021,40 +1083,173 @@ void merge_stages_fine_grain(const map &all_stages, list current_stages; filter_stages(all_stages, ref->second->getName(), current_stages); - // attempt to merge all current stages - while (!current_stages.empty()) { - // get one stage to start merging - PipelineComponentBase* current = current_stages.front(); - current_stages.pop_front(); + // generate all tasks + for (list::iterator s=current_stages.begin(); s!= current_stages.end(); s++) { + (*s)->tasks = task_generator(ref->second->tasksDesc, *s, rt, expanded_args); + } + + // generate the reuse matrix and the map real-task to min-cut id + size_t id = 0; + size_t n = current_stages.size(); + mincut::weight_t adjMat[n][n]; + map id2task; + for (list::iterator s1=current_stages.begin(); s1!= current_stages.end(); s1++, id++) { + id2task[id] = (*s1)->getId(); + // cout << "map: " << id << ":" << (*s1)->getId() << endl; + size_t id_j = id; + for (list::iterator s2=s1; s2!= current_stages.end(); s2++, id_j++) { + if (id == id_j) + adjMat[id][id] = 0; + else { + adjMat[id][id_j] = get_reuse_factor(*s1, *s2, ref->second->tasksDesc); + adjMat[id_j][id] = adjMat[id][id_j]; + } + } + } + + // my compiler won't do VLA, so we need this workaround + mincut::weight_t** adjMat_ = new mincut::weight_t *[n]; + for (size_t i=0; i cuts = mincut::min_cut(n, adjMat_); + + // get the cut with the minimal weight, using the number of merged tasks as a tiebreaker + mincut::cut_t best_cut = cuts.front(); + mincut::weight_t best_weight = mincut::_cut_w(best_cut); + int best_num_tasks = get_reuse_factor(mincut::_cut_s1(best_cut), mincut::_cut_s2(best_cut), + id2task, all_stages, ref->second->tasksDesc); + mincut::weight_t r; + + for (mincut::cut_t c : cuts) { + cout << "cut: " << mincut::_cut_w(c) << ":" << endl; + cout << "\tS1:" << endl; + for (mincut::_id_t id : mincut::_cut_s1(c)) + cout << "\t\t" << id2task[id] << endl; + cout << "\tS2:" << endl; + for (mincut::_id_t id : mincut::_cut_s2(c)) + cout << "\t\t" << id2task[id] << endl; + cout << endl; + + // updates min cut if the weight is less that the best so far + if (mincut::_cut_w(c) < best_weight) { + best_cut = c; + best_weight = mincut::_cut_w(c); + best_num_tasks = get_reuse_factor(mincut::_cut_s1(c), mincut::_cut_s2(c), + id2task, all_stages, ref->second->tasksDesc); + } + // updates min cut if the weight are the same but this cut is more balanced + else if (mincut::_cut_w(c) == best_weight && (r = get_reuse_factor(mincut::_cut_s1(c), + mincut::_cut_s2(c), id2task, all_stages, ref->second->tasksDesc)) < best_num_tasks) { + best_cut = c; + best_num_tasks = r; + } + } + + cout << "best cut: " << mincut::_cut_w(best_cut) << ":" << endl; + cout << "\tS1:" << endl; + for (mincut::_id_t id : mincut::_cut_s1(best_cut)) + cout << "\t\t" << id2task[id] << endl; + cout << "\tS2:" << endl; + for (mincut::_id_t id : mincut::_cut_s2(best_cut)) + cout << "\t\t" << id2task[id] << endl; - // move forward if this stage was merged with another one - if (current->reused == NULL) { + // merge the stages of the best cut + mincut::subgraph_t::iterator s1_it = mincut::_cut_s1(best_cut).begin(); + PipelineComponentBase* current1 = all_stages.at(id2task[*s1_it]); + cout << *s1_it << endl; + s1_it++; + cout << *s1_it << endl; - // start by generating all tasks - if (current->tasks.size() == 0) - current->tasks = task_generator(ref->second->tasksDesc, current, rt, expanded_args); - // attempt to merge all stages to the current merged stages - list::iterator i = current_stages.begin(); - while (i != current_stages.end()) { - // add stage to merged stages if the merging condition is true - PipelineComponentBase* s = *i; + + cout << "\tS1:" << endl; + for (mincut::_id_t id : mincut::_cut_s1(best_cut)) + cout << "\t\t" << &id << endl; + + cout << "\tS1 it:" << *(mincut::_cut_s1(best_cut).begin()) << endl; + list::iterator id2=(mincut::_cut_s1(best_cut)).begin(); + cout << "\tS1 it:" << &(*(id2)) << endl; + cout << "\tS1 it:" << *(id2++) << endl; + cout << "\tS1 it:" << *(id2++) << endl; + cout << "\tS1 it:" << *(id2) << endl; + for (; ;) { + cout << "\t\t" << (*id2) << endl; + if (id2==mincut::_cut_s1(best_cut).end()) + break; + id2++; + } - // generate tasks if it they weren't generated yet - if (s->tasks.size() == 0) - s->tasks = task_generator(ref->second->tasksDesc, s, rt, expanded_args); - if (merging_condition(s, current, ref->second->tasksDesc)) { - cout << "[merge_stages_fine_grain] mearging " << current->getId() << " with " << s->getId() << endl; - merge_stages(current, s, ref->second->tasksDesc); - } - i++; - } - } - // add merged stages to final map as one stage - merged_stages[((PipelineComponentBase*)current)->getId()] = (PipelineComponentBase*)current; + for (; s1_it!=mincut::_cut_s1(best_cut).end(); s1_it++) { + cout << id2task[*s1_it] << endl; + if (merging_condition(current1, all_stages.at(id2task[*s1_it]), ref->second->tasksDesc)) + merge_stages(current1, all_stages.at(id2task[*s1_it]), ref->second->tasksDesc); + else + current1->tasks.insert(current1->tasks.begin(), all_stages.at(id2task[*s1_it])->tasks.begin(), + all_stages.at(id2task[*s1_it])->tasks.end()); } + + // add merged stages to final map as one stage + merged_stages[current1->getId()] = current1; + + mincut::subgraph_t::iterator s2_it = mincut::_cut_s2(best_cut).begin(); + PipelineComponentBase* current2 = all_stages.at(id2task[*s2_it]); + s2_it++; + for (; s2_it!=mincut::_cut_s2(best_cut).end(); s2_it++) { + if (merging_condition(current2, all_stages.at(id2task[*s2_it]), ref->second->tasksDesc)) + merge_stages(current2, all_stages.at(id2task[*s2_it]), ref->second->tasksDesc); + else + current2->tasks.insert(current2->tasks.begin(), all_stages.at(id2task[*s2_it])->tasks.begin(), + all_stages.at(id2task[*s2_it])->tasks.end()); + } + + // add merged stages to final map as one stage + merged_stages[current2->getId()] = current2; + + + // // attempt to merge all current stages + // while (!current_stages.empty()) { + // // get one stage to start merging + // PipelineComponentBase* current = current_stages.front(); + // current_stages.pop_front(); + + // // move forward if this stage was merged with another one + // if (current->reused == NULL) { + + // // start by generating all tasks + // if (current->tasks.size() == 0) + // current->tasks = task_generator(ref->second->tasksDesc, current, rt, expanded_args); + + // // attempt to merge all stages to the current merged stages + // list::iterator i = current_stages.begin(); + // while (i != current_stages.end()) { + // // add stage to merged stages if the merging condition is true + // PipelineComponentBase* s = *i; + + // // generate tasks if it they weren't generated yet + // if (s->tasks.size() == 0) + // s->tasks = task_generator(ref->second->tasksDesc, s, rt, expanded_args); + + // if (merging_condition(s, current, ref->second->tasksDesc)) { + // cout << "[merge_stages_fine_grain] mearging " << current->getId() << " with " << s->getId() << endl; + // merge_stages(current, s, ref->second->tasksDesc); + // } + // i++; + // } + // } + + // // add merged stages to final map as one stage + // merged_stages[((PipelineComponentBase*)current)->getId()] = (PipelineComponentBase*)current; + // } } } From c26d75921efba4215699428f715c65425cfd9679 Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Thu, 8 Sep 2016 15:30:30 -0300 Subject: [PATCH 33/87] Mincut algorithm fully integrated and, as far as it was tested, working. Milenium bug found: when testing with over 5000 stages the coarse-grain merging breaks. --- .../PipelineManager.cpp | 100 +++++++++--------- 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 4edb5ca..a77baa0 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -115,7 +115,7 @@ int main(int argc, char* argv[]) { SysEnv sysEnv; // Tell the system which libraries should be used - // sysEnv.startupSystem(argc, argv, "libcomponentnsdifffgo.so"); + sysEnv.startupSystem(argc, argv, "libcomponentnsdifffgo.so"); // region template used by all stages RegionTemplate *rt = new RegionTemplate(); @@ -1084,8 +1084,25 @@ void merge_stages_fine_grain(const map &all_stages, filter_stages(all_stages, ref->second->getName(), current_stages); // generate all tasks - for (list::iterator s=current_stages.begin(); s!= current_stages.end(); s++) { + for (list::iterator s=current_stages.begin(); s!= current_stages.end(); ) { + // if the stage isn't composed of reusable tasks then (*s)->tasks = task_generator(ref->second->tasksDesc, *s, rt, expanded_args); + if ((*s)->tasks.size() == 0) { + cout << (*s)->getId() << " has " << (*s)->tasks.size() << endl; + merged_stages[(*s)->getId()] = *s; + s = current_stages.erase(s); + } else { + cout << (*s)->getId() << " hass " << (*s)->tasks.size() << endl; + s++; + } + } + + // if there are no stages left to attempt to merge, or only one stage, don't perform any merging + if (current_stages.size() == 1) { + merged_stages[(*current_stages.begin())->getId()] = *current_stages.begin(); + continue; + } else if (current_stages.size() == 0) { + continue; } // generate the reuse matrix and the map real-task to min-cut id @@ -1161,60 +1178,43 @@ void merge_stages_fine_grain(const map &all_stages, for (mincut::_id_t id : mincut::_cut_s2(best_cut)) cout << "\t\t" << id2task[id] << endl; - // merge the stages of the best cut - mincut::subgraph_t::iterator s1_it = mincut::_cut_s1(best_cut).begin(); - PipelineComponentBase* current1 = all_stages.at(id2task[*s1_it]); - cout << *s1_it << endl; - s1_it++; - cout << *s1_it << endl; - - + // For some unholy reason getting the iterator directly from _cut_s1 messes the iterator up + // so the s1_ is a workaround for it. + // mincut::subgraph_t::iterator s1_it = mincut::_cut_s1(best_cut).begin(); - cout << "\tS1:" << endl; - for (mincut::_id_t id : mincut::_cut_s1(best_cut)) - cout << "\t\t" << &id << endl; - - cout << "\tS1 it:" << *(mincut::_cut_s1(best_cut).begin()) << endl; - list::iterator id2=(mincut::_cut_s1(best_cut)).begin(); - cout << "\tS1 it:" << &(*(id2)) << endl; - cout << "\tS1 it:" << *(id2++) << endl; - cout << "\tS1 it:" << *(id2++) << endl; - cout << "\tS1 it:" << *(id2) << endl; - for (; ;) { - cout << "\t\t" << (*id2) << endl; - if (id2==mincut::_cut_s1(best_cut).end()) - break; - id2++; - } - - + // merge the stages of the best cut + mincut::subgraph_t s1_ = mincut::_cut_s1(best_cut); + for (mincut::subgraph_t::iterator s1_it = s1_.begin(); s1_it!=s1_.end(); s1_it++) { + // attempt to merge s1_it with all other stages + for (mincut::subgraph_t::iterator s2_it = next(s1_it); s2_it!=s1_.end();) { + if (merging_condition(all_stages.at(id2task[*s1_it]), all_stages.at(id2task[*s2_it]), ref->second->tasksDesc)) { + merge_stages(all_stages.at(id2task[*s1_it]), all_stages.at(id2task[*s2_it]), ref->second->tasksDesc); + merged_stages[all_stages.at(id2task[*s2_it])->getId()] = all_stages.at(id2task[*s2_it]); + s2_it = s1_.erase(s2_it); + } else + s2_it++; + } - for (; s1_it!=mincut::_cut_s1(best_cut).end(); s1_it++) { - cout << id2task[*s1_it] << endl; - if (merging_condition(current1, all_stages.at(id2task[*s1_it]), ref->second->tasksDesc)) - merge_stages(current1, all_stages.at(id2task[*s1_it]), ref->second->tasksDesc); - else - current1->tasks.insert(current1->tasks.begin(), all_stages.at(id2task[*s1_it])->tasks.begin(), - all_stages.at(id2task[*s1_it])->tasks.end()); + // add s1_it to merged_stages + merged_stages[all_stages.at(id2task[*s1_it])->getId()] = all_stages.at(id2task[*s1_it]); } - // add merged stages to final map as one stage - merged_stages[current1->getId()] = current1; - - mincut::subgraph_t::iterator s2_it = mincut::_cut_s2(best_cut).begin(); - PipelineComponentBase* current2 = all_stages.at(id2task[*s2_it]); - s2_it++; - for (; s2_it!=mincut::_cut_s2(best_cut).end(); s2_it++) { - if (merging_condition(current2, all_stages.at(id2task[*s2_it]), ref->second->tasksDesc)) - merge_stages(current2, all_stages.at(id2task[*s2_it]), ref->second->tasksDesc); - else - current2->tasks.insert(current2->tasks.begin(), all_stages.at(id2task[*s2_it])->tasks.begin(), - all_stages.at(id2task[*s2_it])->tasks.end()); - } - // add merged stages to final map as one stage - merged_stages[current2->getId()] = current2; + mincut::subgraph_t s2_ = mincut::_cut_s2(best_cut); + for (mincut::subgraph_t::iterator s1_it = s2_.begin(); s1_it!=s2_.end(); s1_it++) { + // attempt to merge s1_it with all other stages + for (mincut::subgraph_t::iterator s2_it = next(s1_it); s2_it!=s2_.end();) { + if (merging_condition(all_stages.at(id2task[*s1_it]), all_stages.at(id2task[*s2_it]), ref->second->tasksDesc)) { + merge_stages(all_stages.at(id2task[*s1_it]), all_stages.at(id2task[*s2_it]), ref->second->tasksDesc); + merged_stages[all_stages.at(id2task[*s2_it])->getId()] = all_stages.at(id2task[*s2_it]); + s2_it = s2_.erase(s2_it); + } else + s2_it++; + } + // add s1_it to merged_stages + merged_stages[all_stages.at(id2task[*s1_it])->getId()] = all_stages.at(id2task[*s1_it]); + } // // attempt to merge all current stages // while (!current_stages.empty()) { From adf673dba5a43dcf740f61e1d916faca4e37bdb9 Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Thu, 8 Sep 2016 16:02:28 -0300 Subject: [PATCH 34/87] Milenium bug fixed The bug was related to a static allocation of a matrix, that when the matrix size was too big the stack would overflow. This problem was fixed and now the only limit to the system is the amount of memory on the host machine (tested with ~1000 stages and the merging algorithm didn't ran out of memory: ~0.7GB used) --- .../PipelineManager.cpp | 92 ++++++------------- 1 file changed, 26 insertions(+), 66 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index a77baa0..ab308d2 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -1088,13 +1088,10 @@ void merge_stages_fine_grain(const map &all_stages, // if the stage isn't composed of reusable tasks then (*s)->tasks = task_generator(ref->second->tasksDesc, *s, rt, expanded_args); if ((*s)->tasks.size() == 0) { - cout << (*s)->getId() << " has " << (*s)->tasks.size() << endl; merged_stages[(*s)->getId()] = *s; s = current_stages.erase(s); - } else { - cout << (*s)->getId() << " hass " << (*s)->tasks.size() << endl; + } else s++; - } } // if there are no stages left to attempt to merge, or only one stage, don't perform any merging @@ -1108,7 +1105,12 @@ void merge_stages_fine_grain(const map &all_stages, // generate the reuse matrix and the map real-task to min-cut id size_t id = 0; size_t n = current_stages.size(); - mincut::weight_t adjMat[n][n]; + + // dynamic allocation of adjMat is needed because if n is waaay too big the stack will overflow + mincut::weight_t** adjMat = new mincut::weight_t *[n]; + for (size_t i=0; i id2task; for (list::iterator s1=current_stages.begin(); s1!= current_stages.end(); s1++, id++) { id2task[id] = (*s1)->getId(); @@ -1124,19 +1126,12 @@ void merge_stages_fine_grain(const map &all_stages, } } - // my compiler won't do VLA, so we need this workaround - mincut::weight_t** adjMat_ = new mincut::weight_t *[n]; - for (size_t i=0; i cuts = mincut::min_cut(n, adjMat_); + list cuts = mincut::min_cut(n, adjMat); // get the cut with the minimal weight, using the number of merged tasks as a tiebreaker mincut::cut_t best_cut = cuts.front(); @@ -1146,14 +1141,14 @@ void merge_stages_fine_grain(const map &all_stages, mincut::weight_t r; for (mincut::cut_t c : cuts) { - cout << "cut: " << mincut::_cut_w(c) << ":" << endl; - cout << "\tS1:" << endl; - for (mincut::_id_t id : mincut::_cut_s1(c)) - cout << "\t\t" << id2task[id] << endl; - cout << "\tS2:" << endl; - for (mincut::_id_t id : mincut::_cut_s2(c)) - cout << "\t\t" << id2task[id] << endl; - cout << endl; + // cout << "cut: " << mincut::_cut_w(c) << ":" << endl; + // cout << "\tS1:" << endl; + // for (mincut::_id_t id : mincut::_cut_s1(c)) + // cout << "\t\t" << id2task[id] << endl; + // cout << "\tS2:" << endl; + // for (mincut::_id_t id : mincut::_cut_s2(c)) + // cout << "\t\t" << id2task[id] << endl; + // cout << endl; // updates min cut if the weight is less that the best so far if (mincut::_cut_w(c) < best_weight) { @@ -1170,13 +1165,13 @@ void merge_stages_fine_grain(const map &all_stages, } } - cout << "best cut: " << mincut::_cut_w(best_cut) << ":" << endl; - cout << "\tS1:" << endl; - for (mincut::_id_t id : mincut::_cut_s1(best_cut)) - cout << "\t\t" << id2task[id] << endl; - cout << "\tS2:" << endl; - for (mincut::_id_t id : mincut::_cut_s2(best_cut)) - cout << "\t\t" << id2task[id] << endl; + // cout << "best cut: " << mincut::_cut_w(best_cut) << ":" << endl; + // cout << "\tS1:" << endl; + // for (mincut::_id_t id : mincut::_cut_s1(best_cut)) + // cout << "\t\t" << id2task[id] << endl; + // cout << "\tS2:" << endl; + // for (mincut::_id_t id : mincut::_cut_s2(best_cut)) + // cout << "\t\t" << id2task[id] << endl; // For some unholy reason getting the iterator directly from _cut_s1 messes the iterator up // so the s1_ is a workaround for it. @@ -1215,41 +1210,6 @@ void merge_stages_fine_grain(const map &all_stages, // add s1_it to merged_stages merged_stages[all_stages.at(id2task[*s1_it])->getId()] = all_stages.at(id2task[*s1_it]); } - - // // attempt to merge all current stages - // while (!current_stages.empty()) { - // // get one stage to start merging - // PipelineComponentBase* current = current_stages.front(); - // current_stages.pop_front(); - - // // move forward if this stage was merged with another one - // if (current->reused == NULL) { - - // // start by generating all tasks - // if (current->tasks.size() == 0) - // current->tasks = task_generator(ref->second->tasksDesc, current, rt, expanded_args); - - // // attempt to merge all stages to the current merged stages - // list::iterator i = current_stages.begin(); - // while (i != current_stages.end()) { - // // add stage to merged stages if the merging condition is true - // PipelineComponentBase* s = *i; - - // // generate tasks if it they weren't generated yet - // if (s->tasks.size() == 0) - // s->tasks = task_generator(ref->second->tasksDesc, s, rt, expanded_args); - - // if (merging_condition(s, current, ref->second->tasksDesc)) { - // cout << "[merge_stages_fine_grain] mearging " << current->getId() << " with " << s->getId() << endl; - // merge_stages(current, s, ref->second->tasksDesc); - // } - // i++; - // } - // } - - // // add merged stages to final map as one stage - // merged_stages[((PipelineComponentBase*)current)->getId()] = (PipelineComponentBase*)current; - // } } } From a06bb55caf2cb64e650b88beac9332fc199c7fc1 Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Tue, 13 Sep 2016 16:32:36 -0300 Subject: [PATCH 35/87] Non-recursive version of new merge-cut algorithm. --- runtime/PipelineComponentBase.h | 3 + .../PipelineManager.cpp | 359 +++++++++++++----- .../graph/min_cut.cpp | 2 +- 3 files changed, 261 insertions(+), 103 deletions(-) diff --git a/runtime/PipelineComponentBase.h b/runtime/PipelineComponentBase.h index 12f8fd9..46c3433 100644 --- a/runtime/PipelineComponentBase.h +++ b/runtime/PipelineComponentBase.h @@ -174,6 +174,9 @@ class PipelineComponentBase: public Task { void printTasks(); + // makespan cost + float getMksp() {return 1;}; + // Factory class is used to build "reflection", and instantiate objects of // PipelineComponentBase subclasses that register with it class ComponentFactory{ diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index ab308d2..c025332 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include "json/json.h" @@ -53,6 +54,11 @@ void mapprint(map mapp) { cout << i->first << ":" << i->second->getName() << endl; } +void listprint(list mapp) { + for (list::iterator i=mapp.begin(); i!=mapp.end();i++) + cout << (*i)->getId() << ":" << (*i)->getName() << endl; +} + void adj_mat_print(mincut::weight_t** adjMat, size_t n) { for (int i=0; i &args, map &expanded_args,map stages, map &expanded_stages, map &workflow_outputs); void merge_stages_fine_grain(const map &all_stages, - const map &stages_ref, map &merged_stages, - RegionTemplate* rt, map expanded_args); + const map &stages_ref, map &merged_stages, + RegionTemplate* rt, map expanded_args, int n_workers); void generate_drs(RegionTemplate* rt, const map &expanded_args); void add_arguments_to_stages(map &merged_stages, map &merged_arguments, @@ -115,7 +121,7 @@ int main(int argc, char* argv[]) { SysEnv sysEnv; // Tell the system which libraries should be used - sysEnv.startupSystem(argc, argv, "libcomponentnsdifffgo.so"); + // sysEnv.startupSystem(argc, argv, "libcomponentnsdifffgo.so"); // region template used by all stages RegionTemplate *rt = new RegionTemplate(); @@ -241,7 +247,9 @@ int main(int argc, char* argv[]) { // << p.second->toString() << " sized: " << p.second->size() << endl; map merged_stages; - merge_stages_fine_grain(expanded_stages, base_stages, merged_stages, rt, expanded_args); + int size = 4; + // MPI_Comm_size(MPI_COMM_WORLD, &size); + merge_stages_fine_grain(expanded_stages, base_stages, merged_stages, rt, expanded_args, size); cout << endl<< "merged-fine: " << endl; for (pair p : merged_stages) { @@ -1035,6 +1043,25 @@ void merge_stages(PipelineComponentBase* current, PipelineComponentBase* s, map< } } +list merge_stages(list stages, map> ref) { + if (stages.size() == 1) + return stages; + + list::iterator i = stages.begin(); + + for (; i!=stages.end(); i++) { + for (list::iterator j = next(i); j!=stages.end();) { + if (merging_condition(*i, *j, ref)) { + merge_stages(*i, *j, ref); + j = stages.erase(j); + } else + j++; + } + } + + return stages; +} + mincut::weight_t get_reuse_factor(PipelineComponentBase* s1, PipelineComponentBase* s2, map> ref) { PipelineComponentBase* s1_clone = s1->clone(); PipelineComponentBase* s2_clone = s2->clone(); @@ -1073,9 +1100,146 @@ int get_reuse_factor(mincut::subgraph_t s1, mincut::subgraph_t s2, maptasks.size()>current2->tasks.size()?current1->tasks.size():current2->tasks.size(); } +float calc_stage_proc(list s, map> ref) { + list::iterator i = s.begin(); + + for (; i!=s.end(); i++) { + PipelineComponentBase* current = (*i)->clone(); + for (list::iterator j = next(i); j!=s.end();) { + if (merging_condition(*i, *j, ref)) { + merge_stages(current, (*j)->clone(), ref); + j = s.erase(j); + } else + j++; + } + (*i) = current; + } + + float proc_cost = 0; + for (PipelineComponentBase* p : s) + for (ReusableTask* t : p->tasks) + // proc_cost += t->getProcCost(); + proc_cost++; + + return proc_cost; +} + +// just add PCB s symbolicaly and calc the cost with stages +float calc_stage_proc(list stages, PipelineComponentBase* s, map> ref) { + stages.emplace_back(s); + return calc_stage_proc(stages, ref); +} + +float calc_stage_mem(list s, map> ref) { + list::iterator i = s.begin(); + + for (; i!=s.end(); i++) { + PipelineComponentBase* current = (*i)->clone(); + for (list::iterator j = next(i); j!=s.end();) { + if (merging_condition(*i, *j, ref)) { + merge_stages(current, (*j)->clone(), ref); + j = s.erase(j); + } else + j++; + } + } + + float mem_cost = 0; + for (PipelineComponentBase* p : s) + for (ReusableTask* t : p->tasks) + // mem_cost += t->getMemCost(); + mem_cost+=0; + + return mem_cost; +} + +bool cutting_condition(list current, float nrS_mksp, float max_mem, map> ref) { + if (calc_stage_proc(current, ref) > nrS_mksp || calc_stage_mem(current, ref) > max_mem) + return true; + else + return false; +} + +pair, list> get_cut(list current_stages, + const map &all_stages, map> ref) { + + // generate the reuse matrix and the map real-task to min-cut id + size_t id = 0; + size_t n = current_stages.size(); + + // dynamic allocation of adjMat is needed because if n is waaay too big the stack will overflow + mincut::weight_t** adjMat = new mincut::weight_t *[n]; + for (size_t i=0; i id2task; + for (list::iterator s1=current_stages.begin(); s1!= current_stages.end(); s1++, id++) { + id2task[id] = (*s1)->getId(); + // cout << "map: " << id << ":" << (*s1)->getId() << endl; + size_t id_j = id; + for (list::iterator s2=s1; s2!= current_stages.end(); s2++, id_j++) { + if (id == id_j) + adjMat[id][id] = 0; + else { + adjMat[id][id_j] = get_reuse_factor(*s1, *s2, ref); + adjMat[id_j][id] = adjMat[id][id_j]; + } + } + } + + // cout << endl; + // adj_mat_print(adjMat, id2task, n); + // cout << endl; + + // send adjMat to mincut algorithm + list cuts = mincut::min_cut(n, adjMat); + + // get the cut with the minimal weight, using the number of merged tasks as a tiebreaker + mincut::cut_t best_cut = cuts.front(); + mincut::weight_t best_weight = mincut::_cut_w(best_cut); + int best_num_tasks = get_reuse_factor(mincut::_cut_s1(best_cut), mincut::_cut_s2(best_cut), + id2task, all_stages, ref); + mincut::weight_t r; + + for (mincut::cut_t c : cuts) { + // cout << "cut: " << mincut::_cut_w(c) << ":" << endl; + // cout << "\tS1:" << endl; + // for (mincut::_id_t id : mincut::_cut_s1(c)) + // cout << "\t\t" << id2task[id] << endl; + // cout << "\tS2:" << endl; + // for (mincut::_id_t id : mincut::_cut_s2(c)) + // cout << "\t\t" << id2task[id] << endl; + // cout << endl; + + // updates min cut if the weight is less that the best so far + if (mincut::_cut_w(c) < best_weight) { + best_cut = c; + best_weight = mincut::_cut_w(c); + best_num_tasks = get_reuse_factor(mincut::_cut_s1(c), mincut::_cut_s2(c), + id2task, all_stages, ref); + } + // updates min cut if the weight are the same but this cut is more balanced + else if (mincut::_cut_w(c) == best_weight && (r = get_reuse_factor(mincut::_cut_s1(c), + mincut::_cut_s2(c), id2task, all_stages, ref)) < best_num_tasks) { + best_cut = c; + best_num_tasks = r; + } + } + + // convert cut to PCB lists for return + pair, list> best_cut_pcb; + for (mincut::_id_t i : mincut::_cut_s1(best_cut)) + best_cut_pcb.first.emplace_back(all_stages.at(id2task[i])); + for (mincut::_id_t i : mincut::_cut_s2(best_cut)) + best_cut_pcb.second.emplace_back(all_stages.at(id2task[i])); + + return best_cut_pcb; +} + void merge_stages_fine_grain(const map &all_stages, const map &stages_ref, map &merged_stages, - RegionTemplate* rt, map expanded_args) { + RegionTemplate* rt, map expanded_args, int n_workers) { // attempt merging for each stage type for (map::const_iterator ref=stages_ref.cbegin(); ref!=stages_ref.cend(); ref++) { @@ -1084,11 +1248,19 @@ void merge_stages_fine_grain(const map &all_stages, filter_stages(all_stages, ref->second->getName(), current_stages); // generate all tasks + int nrS = 0; + double max_nrS_mksp = 0; for (list::iterator s=current_stages.begin(); s!= current_stages.end(); ) { // if the stage isn't composed of reusable tasks then (*s)->tasks = task_generator(ref->second->tasksDesc, *s, rt, expanded_args); if ((*s)->tasks.size() == 0) { merged_stages[(*s)->getId()] = *s; + + // makespan calculations + nrS++; + if ((*s)->getMksp() > max_nrS_mksp) + max_nrS_mksp = (*s)->getMksp(); + s = current_stages.erase(s); } else s++; @@ -1102,114 +1274,97 @@ void merge_stages_fine_grain(const map &all_stages, continue; } - // generate the reuse matrix and the map real-task to min-cut id - size_t id = 0; - size_t n = current_stages.size(); - - // dynamic allocation of adjMat is needed because if n is waaay too big the stack will overflow - mincut::weight_t** adjMat = new mincut::weight_t *[n]; - for (size_t i=0; i id2task; - for (list::iterator s1=current_stages.begin(); s1!= current_stages.end(); s1++, id++) { - id2task[id] = (*s1)->getId(); - // cout << "map: " << id << ":" << (*s1)->getId() << endl; - size_t id_j = id; - for (list::iterator s2=s1; s2!= current_stages.end(); s2++, id_j++) { - if (id == id_j) - adjMat[id][id] = 0; - else { - adjMat[id][id_j] = get_reuse_factor(*s1, *s2, ref->second->tasksDesc); - adjMat[id_j][id] = adjMat[id][id_j]; + // instantiate nedded lists for iterative cutting + list rem[n_workers]; + list last_rem[n_workers]; + int current_index; + float last_mksp = FLT_MAX; + float current_mksp = FLT_MAX/10; + current_index = 0; + rem[0] = current_stages; + + // execute while there is improvement + while(current_mksp < last_mksp) { + // for (int j=0; j<10; j++) { + last_mksp = current_mksp; + + // get the most expensive bucket on rem and set it as current + float worst_proc_cost = 0; + for (int i=0; isecond->tasksDesc); + if (proc_cost > worst_proc_cost && rem[i].size() > 1) { + worst_proc_cost = proc_cost; + current_index = i; } } - } - - // cout << endl; - // adj_mat_print(adjMat, id2task, n); - // cout << endl; - // send adjMat to mincut algorithm - list cuts = mincut::min_cut(n, adjMat); - - // get the cut with the minimal weight, using the number of merged tasks as a tiebreaker - mincut::cut_t best_cut = cuts.front(); - mincut::weight_t best_weight = mincut::_cut_w(best_cut); - int best_num_tasks = get_reuse_factor(mincut::_cut_s1(best_cut), mincut::_cut_s2(best_cut), - id2task, all_stages, ref->second->tasksDesc); - mincut::weight_t r; - - for (mincut::cut_t c : cuts) { - // cout << "cut: " << mincut::_cut_w(c) << ":" << endl; - // cout << "\tS1:" << endl; - // for (mincut::_id_t id : mincut::_cut_s1(c)) - // cout << "\t\t" << id2task[id] << endl; - // cout << "\tS2:" << endl; - // for (mincut::_id_t id : mincut::_cut_s2(c)) - // cout << "\t\t" << id2task[id] << endl; - // cout << endl; - - // updates min cut if the weight is less that the best so far - if (mincut::_cut_w(c) < best_weight) { - best_cut = c; - best_weight = mincut::_cut_w(c); - best_num_tasks = get_reuse_factor(mincut::_cut_s1(c), mincut::_cut_s2(c), - id2task, all_stages, ref->second->tasksDesc); - } - // updates min cut if the weight are the same but this cut is more balanced - else if (mincut::_cut_w(c) == best_weight && (r = get_reuse_factor(mincut::_cut_s1(c), - mincut::_cut_s2(c), id2task, all_stages, ref->second->tasksDesc)) < best_num_tasks) { - best_cut = c; - best_num_tasks = r; + if (rem[current_index].size() < 2) { + break; } - } - // cout << "best cut: " << mincut::_cut_w(best_cut) << ":" << endl; - // cout << "\tS1:" << endl; - // for (mincut::_id_t id : mincut::_cut_s1(best_cut)) - // cout << "\t\t" << id2task[id] << endl; - // cout << "\tS2:" << endl; - // for (mincut::_id_t id : mincut::_cut_s2(best_cut)) - // cout << "\t\t" << id2task[id] << endl; + // cut the current bucket + pair, list> c; + c = get_cut(rem[current_index], all_stages, ref->second->tasksDesc); - // For some unholy reason getting the iterator directly from _cut_s1 messes the iterator up - // so the s1_ is a workaround for it. - // mincut::subgraph_t::iterator s1_it = mincut::_cut_s1(best_cut).begin(); - - // merge the stages of the best cut - mincut::subgraph_t s1_ = mincut::_cut_s1(best_cut); - for (mincut::subgraph_t::iterator s1_it = s1_.begin(); s1_it!=s1_.end(); s1_it++) { - // attempt to merge s1_it with all other stages - for (mincut::subgraph_t::iterator s2_it = next(s1_it); s2_it!=s1_.end();) { - if (merging_condition(all_stages.at(id2task[*s1_it]), all_stages.at(id2task[*s2_it]), ref->second->tasksDesc)) { - merge_stages(all_stages.at(id2task[*s1_it]), all_stages.at(id2task[*s2_it]), ref->second->tasksDesc); - merged_stages[all_stages.at(id2task[*s2_it])->getId()] = all_stages.at(id2task[*s2_it]); - s2_it = s1_.erase(s2_it); - } else - s2_it++; - } + float w1 = calc_stage_proc(c.first, ref->second->tasksDesc); + float w2 = calc_stage_proc(c.second, ref->second->tasksDesc); - // add s1_it to merged_stages - merged_stages[all_stages.at(id2task[*s1_it])->getId()] = all_stages.at(id2task[*s1_it]); - } + list c1 = w1>=w2?c.first:c.second; + list c2 = w1>=w2?c.second:c.first; + + // sets the current rem as the most expensive cut subset + rem[current_index] = c1; + + // redistributes all remaining stages from least expensive cut subset to rem + for (PipelineComponentBase* s : c2) { + float best_mksp = FLT_MAX; + float mksp; + int best_bucket_index; + + // gets best bucket to add the stage s + for (int i=0; isecond->tasksDesc); + if (mksp < best_mksp) { + best_mksp = mksp; + best_bucket_index = i; + } + } + } + // adds the stage s to best bucket + rem[best_bucket_index].emplace_back(s); + } - mincut::subgraph_t s2_ = mincut::_cut_s2(best_cut); - for (mincut::subgraph_t::iterator s1_it = s2_.begin(); s1_it!=s2_.end(); s1_it++) { - // attempt to merge s1_it with all other stages - for (mincut::subgraph_t::iterator s2_it = next(s1_it); s2_it!=s2_.end();) { - if (merging_condition(all_stages.at(id2task[*s1_it]), all_stages.at(id2task[*s2_it]), ref->second->tasksDesc)) { - merge_stages(all_stages.at(id2task[*s1_it]), all_stages.at(id2task[*s2_it]), ref->second->tasksDesc); - merged_stages[all_stages.at(id2task[*s2_it])->getId()] = all_stages.at(id2task[*s2_it]); - s2_it = s2_.erase(s2_it); - } else - s2_it++; + // recalculate current max makespan and set rem backup on last_rem + float mksp; + current_mksp = 0; + for (int i=0; isecond->tasksDesc); + last_rem[i] = rem[i]; + if (mksp > current_mksp) + current_mksp = mksp; } - // add s1_it to merged_stages - merged_stages[all_stages.at(id2task[*s1_it])->getId()] = all_stages.at(id2task[*s1_it]); - } + cout << "current merging state:" << endl; + for (int i=0; isecond->tasksDesc) << ":" << endl; + for (PipelineComponentBase* s : rem[i]) { + cout << "\t\tstage " << s->getId() << ":" << s->getName() << ":" << endl; + for (ReusableTask* t : s->tasks) { + cout << "\t\t\ttask " << t->getId() << ":" << t->getTaskName() << " - parent: " << t->parentTask << endl; + } + } + } + } + + // merge all stages in each bucket, given that they are mergable + for (int i=0; i curr = merge_stages(last_rem[i], ref->second->tasksDesc); + // send rem stages to merged_stages + for (PipelineComponentBase* s : curr) + merged_stages[s->getId()] = s; + } } } diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/min_cut.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/min_cut.cpp index b4e703f..e3ca3d1 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/min_cut.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/min_cut.cpp @@ -58,7 +58,7 @@ int main() { std::list mincut::min_cut(size_t n, weight_t** adjMat) { - _id_t a; + _id_t a=0; cut_t cut; std::list cuts; From ea3023c2e2e95eddb58313508848ce96abeffed2 Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Tue, 13 Sep 2016 17:46:49 -0300 Subject: [PATCH 36/87] Recursive version of merge-cut algorithm implemented and partially working (at least one case where it don't work) --- .../PipelineManager.cpp | 191 ++++++++++-------- 1 file changed, 106 insertions(+), 85 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index c025332..625ac0f 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -1237,6 +1238,108 @@ pair, list> get_cut(list> recursive_cut(list rem, + const map &all_stages, int n, map> ref) { + + list> last_solution; + + // finishes if there is no more need for a cut (i.e n=1) or if we can't make any more cuts (i.e size=1) + if (n == 1 || rem.size() == 1) { + last_solution.emplace_back(rem); + cout << "retuned n=" << n << ", size=" << rem.size() << endl; + return last_solution; + } + + float last_mksp = FLT_MAX; + float current_mksp = FLT_MAX/10; + list rest; + list> buckets; + + cout << ">>>>>>>>>>>>>>>>>>>>>>>>>>>> " << n << " >>>>>>>>>>>>>>>>>>>>>>>>>>>>" << endl; + // execute while there is improvement + while(current_mksp < last_mksp) { + last_mksp = current_mksp; + + // make a copy of this solution in case the next isn't better + last_solution = buckets; + + if (rem.size() == 1) { + cout << "retuned state for size=1, n=" << n << ":" << endl; + for (list b : last_solution) { + cout << "\tbucket with cost " << calc_stage_proc(b, ref) << ":" << endl; + for (PipelineComponentBase* s : b) { + cout << "\t\tstage " << s->getId() << ":" << s->getName() << ":" << endl; + // for (ReusableTask* t : s->tasks) { + // cout << "\t\t\ttask " << t->getId() << ":" << t->getTaskName() << " - parent: " << t->parentTask << endl; + // } + } + } + return last_solution; + } + + cout << "rem:" << endl; + for (PipelineComponentBase* s : rem) { + cout << "\tstage " << s->getId() << ":" << s->getName() << ":" << endl; + } + cout << "rest:" << endl; + for (PipelineComponentBase* s : rest) { + cout << "\tstage " << s->getId() << ":" << s->getName() << ":" << endl; + } + + // cut the current bucket + pair, list> c; + c = get_cut(rem, all_stages, ref); + + float w1 = calc_stage_proc(c.first, ref); + float w2 = calc_stage_proc(c.second, ref); + + list c1 = w1>=w2?c.first:c.second; + list c2 = w1>=w2?c.second:c.first; + + cout << "cut: " << endl; + cout << "\tc1" << endl; + for (PipelineComponentBase* s : c1) + cout << "\t\tstage " << s->getId() << ":" << s->getName() << ":" << endl; + cout << "\tc2" << endl; + for (PipelineComponentBase* s : c2) + cout << "\t\tstage " << s->getId() << ":" << s->getName() << ":" << endl; + + // join c2 with the remaining of rem + c2.insert(c2.begin(), rest.begin(), rest.end()); + + buckets = recursive_cut(c2, all_stages, n-1, ref); + buckets.emplace_back(c1); + + // recalculate current max makespan and set rem backup on last_rem + float mksp; + current_mksp = 0; + for (list b : buckets) { + mksp = calc_stage_proc(b, ref); + if (mksp > current_mksp) + current_mksp = mksp; + } + + cout << "merged state n=" << n << ":" << endl; + for (list b : buckets) { + cout << "\tbucket with cost " << calc_stage_proc(b, ref) << ":" << endl; + for (PipelineComponentBase* s : b) { + cout << "\t\tstage " << s->getId() << ":" << s->getName() << ":" << endl; + // for (ReusableTask* t : s->tasks) { + // cout << "\t\t\ttask " << t->getId() << ":" << t->getTaskName() << " - parent: " << t->parentTask << endl; + // } + } + } + + // set next iteration PCB lists + rem = c1; + rest = c2; + } + + cout << "<<<<<<<<<<<<<<<<<<<<<<<<<<<< " << n << " <<<<<<<<<<<<<<<<<<<<<<<<<<<<" << endl; + + return last_solution; +} + void merge_stages_fine_grain(const map &all_stages, const map &stages_ref, map &merged_stages, RegionTemplate* rt, map expanded_args, int n_workers) { @@ -1274,93 +1377,11 @@ void merge_stages_fine_grain(const map &all_stages, continue; } - // instantiate nedded lists for iterative cutting - list rem[n_workers]; - list last_rem[n_workers]; - int current_index; - float last_mksp = FLT_MAX; - float current_mksp = FLT_MAX/10; - current_index = 0; - rem[0] = current_stages; - - // execute while there is improvement - while(current_mksp < last_mksp) { - // for (int j=0; j<10; j++) { - last_mksp = current_mksp; - - // get the most expensive bucket on rem and set it as current - float worst_proc_cost = 0; - for (int i=0; isecond->tasksDesc); - if (proc_cost > worst_proc_cost && rem[i].size() > 1) { - worst_proc_cost = proc_cost; - current_index = i; - } - } - - if (rem[current_index].size() < 2) { - break; - } - - // cut the current bucket - pair, list> c; - c = get_cut(rem[current_index], all_stages, ref->second->tasksDesc); - - float w1 = calc_stage_proc(c.first, ref->second->tasksDesc); - float w2 = calc_stage_proc(c.second, ref->second->tasksDesc); - - list c1 = w1>=w2?c.first:c.second; - list c2 = w1>=w2?c.second:c.first; - - // sets the current rem as the most expensive cut subset - rem[current_index] = c1; - - // redistributes all remaining stages from least expensive cut subset to rem - for (PipelineComponentBase* s : c2) { - float best_mksp = FLT_MAX; - float mksp; - int best_bucket_index; - - // gets best bucket to add the stage s - for (int i=0; isecond->tasksDesc); - if (mksp < best_mksp) { - best_mksp = mksp; - best_bucket_index = i; - } - } - } - - // adds the stage s to best bucket - rem[best_bucket_index].emplace_back(s); - } - - // recalculate current max makespan and set rem backup on last_rem - float mksp; - current_mksp = 0; - for (int i=0; isecond->tasksDesc); - last_rem[i] = rem[i]; - if (mksp > current_mksp) - current_mksp = mksp; - } - - cout << "current merging state:" << endl; - for (int i=0; isecond->tasksDesc) << ":" << endl; - for (PipelineComponentBase* s : rem[i]) { - cout << "\t\tstage " << s->getId() << ":" << s->getName() << ":" << endl; - for (ReusableTask* t : s->tasks) { - cout << "\t\t\ttask " << t->getId() << ":" << t->getTaskName() << " - parent: " << t->parentTask << endl; - } - } - } - } + list> solution = recursive_cut(current_stages, all_stages, n_workers, ref->second->tasksDesc); // merge all stages in each bucket, given that they are mergable - for (int i=0; i curr = merge_stages(last_rem[i], ref->second->tasksDesc); + for (list bucket : solution) { + list curr = merge_stages(bucket, ref->second->tasksDesc); // send rem stages to merged_stages for (PipelineComponentBase* s : curr) merged_stages[s->getId()] = s; From 247b409a09eb861143c42362af3d695aeac5475f Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Tue, 13 Sep 2016 20:54:03 -0300 Subject: [PATCH 37/87] Getting rid of memory leaks. --- runtime/Argument.cpp | 10 +- runtime/PipelineComponentBase.h | 3 + runtime/regiontemplates/RegionTemplate.cpp | 2 +- .../PipelineManager.cpp | 224 +++++++++++------- 4 files changed, 146 insertions(+), 93 deletions(-) diff --git a/runtime/Argument.cpp b/runtime/Argument.cpp index b68b1e6..251b163 100644 --- a/runtime/Argument.cpp +++ b/runtime/Argument.cpp @@ -209,7 +209,7 @@ ArgumentBase* ArgumentString::clone() { char *buff = new char[size]; this->serialize(buff); retValue->deserialize(buff); - delete buff; + delete[] buff; return retValue; } @@ -294,7 +294,7 @@ ArgumentBase* ArgumentInt::clone() { char *buff = new char[size]; this->serialize(buff); retValue->deserialize(buff); - delete buff; + delete[] buff; return retValue; } @@ -363,7 +363,7 @@ ArgumentBase* ArgumentFloat::clone() { char *buff = new char[size]; this->serialize(buff); retValue->deserialize(buff); - delete buff; + delete[] buff; return retValue; } @@ -469,7 +469,7 @@ ArgumentBase* ArgumentFloatArray::clone() { char *buff = new char[size]; this->serialize(buff); retValue->deserialize(buff); - delete buff; + delete[] buff; return retValue; } @@ -546,7 +546,7 @@ ArgumentBase* ArgumentRT::clone() { char *buff = new char[size]; this->serialize(buff); retValue->deserialize(buff); - delete buff; + delete[] buff; return retValue; } diff --git a/runtime/PipelineComponentBase.h b/runtime/PipelineComponentBase.h index 46c3433..fc52afb 100644 --- a/runtime/PipelineComponentBase.h +++ b/runtime/PipelineComponentBase.h @@ -172,6 +172,9 @@ class PipelineComponentBase: public Task { PipelineComponentBase* reused; + // needed for inter stage dependency verification on task merging + std::vector getArguments() {return arguments;}; + void printTasks(); // makespan cost diff --git a/runtime/regiontemplates/RegionTemplate.cpp b/runtime/regiontemplates/RegionTemplate.cpp index 2c22377..417a2eb 100644 --- a/runtime/regiontemplates/RegionTemplate.cpp +++ b/runtime/regiontemplates/RegionTemplate.cpp @@ -271,7 +271,7 @@ int RegionTemplate::deserialize(char* buff) { // Extract number of data regions int regionSize = ((int*)(buff+deserialized_bytes))[0]; deserialized_bytes += sizeof(int); - std::cout << "\tnDataRegions deserialize:"<< regionSize << std::endl; + // std::cout << "\tnDataRegions deserialize:"<< regionSize << std::endl; // extract each of the data regions for(int i = 0; i < regionSize; i++){ // create data region: assuming that it is a 2D. Might not be the case. diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 625ac0f..27183c8 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -122,7 +122,7 @@ int main(int argc, char* argv[]) { SysEnv sysEnv; // Tell the system which libraries should be used - // sysEnv.startupSystem(argc, argv, "libcomponentnsdifffgo.so"); + sysEnv.startupSystem(argc, argv, "libcomponentnsdifffgo.so"); // region template used by all stages RegionTemplate *rt = new RegionTemplate(); @@ -247,8 +247,12 @@ int main(int argc, char* argv[]) { // cout << "\t" << p.first << ":" << p.second->getName() << " = " // << p.second->toString() << " sized: " << p.second->size() << endl; + // add arguments to each stage + cout << endl << "add_arguments_to_stages" << endl; + add_arguments_to_stages(expanded_stages, expanded_args, rt); + map merged_stages; - int size = 4; + int size = 6; // MPI_Comm_size(MPI_COMM_WORLD, &size); merge_stages_fine_grain(expanded_stages, base_stages, merged_stages, rt, expanded_args, size); @@ -272,13 +276,6 @@ int main(int argc, char* argv[]) { cout << endl << "generate_drs" << endl; generate_drs(rt, expanded_args); - // RegionTemplateCollection* rts; - // rts = RTFromFiles(inputFolderPath); - - // add arguments to each stage - cout << endl << "add_arguments_to_stages" << endl; - add_arguments_to_stages(merged_stages, expanded_args, rt); - // add all stages to manager cout << endl << "executeComponent" << endl; for (pair s : merged_stages) { @@ -929,17 +926,31 @@ bool exists_reusable_task(PipelineComponentBase* merged, PipelineComponentBase* } // for the meantime the mearging will happen whenever at least the first task is reusable -bool merging_condition(PipelineComponentBase* merged, PipelineComponentBase* to_merge, map> ref) { +bool merging_condition(PipelineComponentBase* merged, PipelineComponentBase* to_merge, + map &args, map> ref) { // compatibility with stages that dont implement task reuse if (ref.size() == 0) return false; // verify if the first task is reusable - if (exists_reusable_task(merged, to_merge, ref.begin()->first)) - return true; - else + if (!exists_reusable_task(merged, to_merge, ref.begin()->first)) return false; + + // verify if the stage dependecy is the same + for (ArgumentBase* a1 : merged->getArguments()) { + ArgumentBase* arg1 = args[a1->getId()]; + if (arg1->getParent() != 0) { + for (ArgumentBase* a2 : to_merge->getArguments()) { + ArgumentBase* arg2 = args[a2->getId()]; + if (arg1->getParent() == arg2->getParent()) { + return true; + } + } + } + } + + return false; } // filters all the stages from an input map by the stage's name @@ -1003,7 +1014,7 @@ list find_tasks(list l, string name) { } void merge_stages(PipelineComponentBase* current, PipelineComponentBase* s, map> ref) { - + s->reused = current; ReusableTask* current_frontier_reusable_tasks; @@ -1044,7 +1055,9 @@ void merge_stages(PipelineComponentBase* current, PipelineComponentBase* s, map< } } -list merge_stages(list stages, map> ref) { +list merge_stages(list stages, + map &args, map> ref) { + if (stages.size() == 1) return stages; @@ -1052,7 +1065,7 @@ list merge_stages(list stages, m for (; i!=stages.end(); i++) { for (list::iterator j = next(i); j!=stages.end();) { - if (merging_condition(*i, *j, ref)) { + if (merging_condition(*i, *j, args, ref)) { merge_stages(*i, *j, ref); j = stages.erase(j); } else @@ -1063,17 +1076,29 @@ list merge_stages(list stages, m return stages; } -mincut::weight_t get_reuse_factor(PipelineComponentBase* s1, PipelineComponentBase* s2, map> ref) { +mincut::weight_t get_reuse_factor(PipelineComponentBase* s1, PipelineComponentBase* s2, + map &args, map> ref) { + + if (!merging_condition(s1, s2, args, ref)) + return 0; + PipelineComponentBase* s1_clone = s1->clone(); PipelineComponentBase* s2_clone = s2->clone(); merge_stages(s1_clone, s2_clone, ref); - return s1->tasks.size() + s2->tasks.size() - s1_clone->tasks.size(); + mincut::weight_t ret = s1->tasks.size() + s2->tasks.size() - s1_clone->tasks.size(); + + // clean memory + delete s1_clone; + delete s2_clone; + + return ret; } int get_reuse_factor(mincut::subgraph_t s1, mincut::subgraph_t s2, map id2task, - map current_stages, map> ref) { + map current_stages, map &args, + map> ref) { // get the first stage as a base stage mincut::subgraph_t::iterator s1_it = s1.begin(); @@ -1081,10 +1106,11 @@ int get_reuse_factor(mincut::subgraph_t s1, mincut::subgraph_t s2, mapclone(); - if (merging_condition(current1, clone1, ref)) + if (merging_condition(current1, clone1, args, ref)) merge_stages(current1, clone1, ref); else current1->tasks.insert(current1->tasks.begin(), clone1->tasks.begin(), clone1->tasks.end()); + delete clone1; } // get the first stage as a base stage @@ -1092,23 +1118,31 @@ int get_reuse_factor(mincut::subgraph_t s1, mincut::subgraph_t s2, mapclone(); for (s2_it++; s2_it!=s2.end(); s2_it++) { PipelineComponentBase* clone2 = current_stages[id2task[*s2_it]]->clone(); - if (merging_condition(current2, clone2, ref)) + if (merging_condition(current2, clone2, args, ref)) merge_stages(current2, clone2, ref); else current2->tasks.insert(current2->tasks.begin(), clone2->tasks.begin(), clone2->tasks.end()); + delete clone2; } - return current1->tasks.size()>current2->tasks.size()?current1->tasks.size():current2->tasks.size(); + int ret = current1->tasks.size()>current2->tasks.size()?current1->tasks.size():current2->tasks.size(); + + // clear memory + delete current1; + + return ret; } -float calc_stage_proc(list s, map> ref) { +float calc_stage_proc(list s, map &args, map> ref) { list::iterator i = s.begin(); for (; i!=s.end(); i++) { PipelineComponentBase* current = (*i)->clone(); for (list::iterator j = next(i); j!=s.end();) { - if (merging_condition(*i, *j, ref)) { - merge_stages(current, (*j)->clone(), ref); + if (merging_condition(*i, *j, args, ref)) { + PipelineComponentBase* j_clone = (*j)->clone(); + merge_stages(current, j_clone, ref); + delete j_clone; j = s.erase(j); } else j++; @@ -1117,52 +1151,61 @@ float calc_stage_proc(list s, maptasks) // proc_cost += t->getProcCost(); proc_cost++; + delete p; + } return proc_cost; } // just add PCB s symbolicaly and calc the cost with stages -float calc_stage_proc(list stages, PipelineComponentBase* s, map> ref) { +float calc_stage_proc(list stages, PipelineComponentBase* s, map &args, + map> ref) { stages.emplace_back(s); - return calc_stage_proc(stages, ref); + return calc_stage_proc(stages, args, ref); } -float calc_stage_mem(list s, map> ref) { +float calc_stage_mem(list s, map &args, map> ref) { list::iterator i = s.begin(); for (; i!=s.end(); i++) { PipelineComponentBase* current = (*i)->clone(); for (list::iterator j = next(i); j!=s.end();) { - if (merging_condition(*i, *j, ref)) { - merge_stages(current, (*j)->clone(), ref); + if (merging_condition(*i, *j, args, ref)) { + PipelineComponentBase* j_clone = (*j)->clone(); + merge_stages(current, j_clone, ref); j = s.erase(j); + delete j_clone; } else j++; } } float mem_cost = 0; - for (PipelineComponentBase* p : s) + for (PipelineComponentBase* p : s) { for (ReusableTask* t : p->tasks) // mem_cost += t->getMemCost(); mem_cost+=0; + delete p; + } return mem_cost; } -bool cutting_condition(list current, float nrS_mksp, float max_mem, map> ref) { - if (calc_stage_proc(current, ref) > nrS_mksp || calc_stage_mem(current, ref) > max_mem) +bool cutting_condition(list current, float nrS_mksp, float max_mem, + map &args, map> ref) { + + if (calc_stage_proc(current, args, ref) > nrS_mksp || calc_stage_mem(current, args, ref) > max_mem) return true; else return false; } pair, list> get_cut(list current_stages, - const map &all_stages, map> ref) { + const map &all_stages, map &args, map> ref) { // generate the reuse matrix and the map real-task to min-cut id size_t id = 0; @@ -1183,7 +1226,7 @@ pair, list> get_cut(list, list> get_cut(list, list> get_cut(list, list> get_cut(list> recursive_cut(list rem, - const map &all_stages, int n, map> ref) { +list> recursive_cut(list rem, const map &all_stages, + int n, map &args, map> ref) { list> last_solution; // finishes if there is no more need for a cut (i.e n=1) or if we can't make any more cuts (i.e size=1) if (n == 1 || rem.size() == 1) { last_solution.emplace_back(rem); - cout << "retuned n=" << n << ", size=" << rem.size() << endl; + // cout << "retuned n=" << n << ", size=" << rem.size() << endl; return last_solution; } @@ -1255,7 +1304,6 @@ list> recursive_cut(list re list rest; list> buckets; - cout << ">>>>>>>>>>>>>>>>>>>>>>>>>>>> " << n << " >>>>>>>>>>>>>>>>>>>>>>>>>>>>" << endl; // execute while there is improvement while(current_mksp < last_mksp) { last_mksp = current_mksp; @@ -1264,79 +1312,71 @@ list> recursive_cut(list re last_solution = buckets; if (rem.size() == 1) { - cout << "retuned state for size=1, n=" << n << ":" << endl; - for (list b : last_solution) { - cout << "\tbucket with cost " << calc_stage_proc(b, ref) << ":" << endl; - for (PipelineComponentBase* s : b) { - cout << "\t\tstage " << s->getId() << ":" << s->getName() << ":" << endl; - // for (ReusableTask* t : s->tasks) { - // cout << "\t\t\ttask " << t->getId() << ":" << t->getTaskName() << " - parent: " << t->parentTask << endl; - // } - } - } + // cout << "retuned state for size=1, n=" << n << ":" << endl; + // for (list b : last_solution) { + // cout << "\tbucket with cost " << calc_stage_proc(b, ref) << ":" << endl; + // for (PipelineComponentBase* s : b) { + // cout << "\t\tstage " << s->getId() << ":" << s->getName() << ":" << endl; + // } + // } return last_solution; } - cout << "rem:" << endl; - for (PipelineComponentBase* s : rem) { - cout << "\tstage " << s->getId() << ":" << s->getName() << ":" << endl; - } - cout << "rest:" << endl; - for (PipelineComponentBase* s : rest) { - cout << "\tstage " << s->getId() << ":" << s->getName() << ":" << endl; - } + // cout << "rem:" << endl; + // for (PipelineComponentBase* s : rem) { + // cout << "\tstage " << s->getId() << ":" << s->getName() << ":" << endl; + // } + // cout << "rest:" << endl; + // for (PipelineComponentBase* s : rest) { + // cout << "\tstage " << s->getId() << ":" << s->getName() << ":" << endl; + // } // cut the current bucket pair, list> c; - c = get_cut(rem, all_stages, ref); + c = get_cut(rem, all_stages, args, ref); - float w1 = calc_stage_proc(c.first, ref); - float w2 = calc_stage_proc(c.second, ref); + float w1 = calc_stage_proc(c.first, args, ref); + float w2 = calc_stage_proc(c.second, args, ref); list c1 = w1>=w2?c.first:c.second; list c2 = w1>=w2?c.second:c.first; - cout << "cut: " << endl; - cout << "\tc1" << endl; - for (PipelineComponentBase* s : c1) - cout << "\t\tstage " << s->getId() << ":" << s->getName() << ":" << endl; - cout << "\tc2" << endl; - for (PipelineComponentBase* s : c2) - cout << "\t\tstage " << s->getId() << ":" << s->getName() << ":" << endl; + // cout << "cut: " << endl; + // cout << "\tc1" << endl; + // for (PipelineComponentBase* s : c1) + // cout << "\t\tstage " << s->getId() << ":" << s->getName() << ":" << endl; + // cout << "\tc2" << endl; + // for (PipelineComponentBase* s : c2) + // cout << "\t\tstage " << s->getId() << ":" << s->getName() << ":" << endl; // join c2 with the remaining of rem c2.insert(c2.begin(), rest.begin(), rest.end()); - buckets = recursive_cut(c2, all_stages, n-1, ref); + buckets = recursive_cut(c2, all_stages, n-1, args, ref); buckets.emplace_back(c1); // recalculate current max makespan and set rem backup on last_rem float mksp; current_mksp = 0; for (list b : buckets) { - mksp = calc_stage_proc(b, ref); + mksp = calc_stage_proc(b, args, ref); if (mksp > current_mksp) current_mksp = mksp; } - cout << "merged state n=" << n << ":" << endl; - for (list b : buckets) { - cout << "\tbucket with cost " << calc_stage_proc(b, ref) << ":" << endl; - for (PipelineComponentBase* s : b) { - cout << "\t\tstage " << s->getId() << ":" << s->getName() << ":" << endl; - // for (ReusableTask* t : s->tasks) { - // cout << "\t\t\ttask " << t->getId() << ":" << t->getTaskName() << " - parent: " << t->parentTask << endl; - // } - } - } + // cout << "merged state n=" << n << ":" << endl; + // for (list b : buckets) { + // cout << "\tbucket with cost " << calc_stage_proc(b, args, ref) << ":" << endl; + // for (PipelineComponentBase* s : b) { + // cout << "\t\tstage " << s->getId() << ":" << s->getName() << ":" << endl; + // } + // } // set next iteration PCB lists rem = c1; rest = c2; } - cout << "<<<<<<<<<<<<<<<<<<<<<<<<<<<< " << n << " <<<<<<<<<<<<<<<<<<<<<<<<<<<<" << endl; - return last_solution; } @@ -1377,11 +1417,21 @@ void merge_stages_fine_grain(const map &all_stages, continue; } - list> solution = recursive_cut(current_stages, all_stages, n_workers, ref->second->tasksDesc); + list> solution = recursive_cut(current_stages, all_stages, + n_workers, expanded_args, ref->second->tasksDesc); + + cout << "solution:" << endl; + for (list b : solution) { + cout << "\tbucket with " << b.size() << " stages and cost " + << calc_stage_proc(b, expanded_args, ref->second->tasksDesc) << ":" << endl; + for (PipelineComponentBase* s : b) { + cout << "\t\tstage " << s->getId() << ":" << s->getName() << ":" << endl; + } + } // merge all stages in each bucket, given that they are mergable for (list bucket : solution) { - list curr = merge_stages(bucket, ref->second->tasksDesc); + list curr = merge_stages(bucket, expanded_args, ref->second->tasksDesc); // send rem stages to merged_stages for (PipelineComponentBase* s : curr) merged_stages[s->getId()] = s; From 39e689531f439037ff22c0a1bc612ccb128a4872 Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Wed, 14 Sep 2016 09:44:04 -0300 Subject: [PATCH 38/87] All memory leaks fixed. The execution part of the application, however, is broken now due to double frees and/or args/rts deleted to early. --- runtime/PipelineComponentBase.cpp | 10 ++++++ runtime/regiontemplates/DenseDataRegion2D.cpp | 2 +- .../RTPipelineComponentBase.cpp | 4 +-- .../PipelineManager.cpp | 22 ++++++++++--- .../PipelineRTFS-NS-Diff-FGO/Segmentation.cpp | 31 +++++++++++-------- 5 files changed, 49 insertions(+), 20 deletions(-) diff --git a/runtime/PipelineComponentBase.cpp b/runtime/PipelineComponentBase.cpp index 064d79f..9ec295f 100644 --- a/runtime/PipelineComponentBase.cpp +++ b/runtime/PipelineComponentBase.cpp @@ -42,6 +42,16 @@ PipelineComponentBase::~PipelineComponentBase() { } } if(resultData != NULL) free(resultData); + + for (std::map >::iterator p=tasksDesc.begin(); p!=tasksDesc.end(); p++) { + for (std::list::iterator a=p->second.begin(); a!=p->second.end(); a++) { + delete *a; + } + } + + for (std::list::iterator t=tasks.begin(); t!=tasks.end(); t++) { + delete *t; + } } void PipelineComponentBase::addArgument(ArgumentBase *arg) diff --git a/runtime/regiontemplates/DenseDataRegion2D.cpp b/runtime/regiontemplates/DenseDataRegion2D.cpp index 61b7e8d..98b89f2 100644 --- a/runtime/regiontemplates/DenseDataRegion2D.cpp +++ b/runtime/regiontemplates/DenseDataRegion2D.cpp @@ -18,7 +18,7 @@ DenseDataRegion2D::~DenseDataRegion2D() { it->second.release(); } #ifdef DEBUG - std::cout << "DDR2D destructor:"<< this->getName() << ":"<< this->getId()<< std::endl; + // std::cout << "DDR2D destructor:"<< this->getName() << ":"<< this->getId()<< std::endl; #endif this->dataCPU.release(); } diff --git a/runtime/regiontemplates/RTPipelineComponentBase.cpp b/runtime/regiontemplates/RTPipelineComponentBase.cpp index b63de44..fafbe33 100644 --- a/runtime/regiontemplates/RTPipelineComponentBase.cpp +++ b/runtime/regiontemplates/RTPipelineComponentBase.cpp @@ -25,7 +25,7 @@ RTPipelineComponentBase::~RTPipelineComponentBase() { // the same region templates if(this->getLocation() == PipelineComponentBase::WORKER_SIDE){ #ifdef DEBUG - std::cout << "~RTPipelineComponentBase: nRegionTemplates: " << this->regionTemplates.size() << std::endl; + // std::cout << "~RTPipelineComponentBase: nRegionTemplates: " << this->regionTemplates.size() << std::endl; #endif std::map::iterator rtIt = this->regionTemplates.begin(); for(; rtIt != this->regionTemplates.end(); rtIt++){ @@ -219,7 +219,7 @@ PipelineComponentBase* RTPipelineComponentBase::clone() { char *buff = new char[size]; this->serialize(buff); retValue->deserialize(buff); - delete buff; + delete[] buff; return retValue; } diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 27183c8..97057c3 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -294,6 +294,7 @@ int main(int argc, char* argv[]) { sysEnv.executeComponent(s.second); } } + // return 0; // execute workflows cout << endl << "startupExecution" << endl; @@ -1041,6 +1042,9 @@ void merge_stages(PipelineComponentBase* current, PipelineComponentBase* s, map< if (!reusable) { break; } + + // free t_s since it was reused + delete t_s; } // updates the first non-reusable task dependency @@ -1053,6 +1057,9 @@ void merge_stages(PipelineComponentBase* current, PipelineComponentBase* s, map< for (; p!=ref.end(); p++) { current->tasks.emplace_front(find_task(s->tasks, p->first)); } + + // remove all tasks references since they were either deleted above or have been sent to current + s->tasks.clear(); } list merge_stages(list stages, @@ -1108,8 +1115,11 @@ int get_reuse_factor(mincut::subgraph_t s1, mincut::subgraph_t s2, mapclone(); if (merging_condition(current1, clone1, args, ref)) merge_stages(current1, clone1, ref); - else - current1->tasks.insert(current1->tasks.begin(), clone1->tasks.begin(), clone1->tasks.end()); + else { + for (ReusableTask* t : clone1->tasks) { + current1->tasks.emplace_back(t->clone()); + } + } delete clone1; } @@ -1121,7 +1131,9 @@ int get_reuse_factor(mincut::subgraph_t s1, mincut::subgraph_t s2, maptasks.insert(current2->tasks.begin(), clone2->tasks.begin(), clone2->tasks.end()); + for (ReusableTask* t : clone2->tasks) { + current2->tasks.emplace_back(t->clone()); + } delete clone2; } @@ -1129,12 +1141,14 @@ int get_reuse_factor(mincut::subgraph_t s1, mincut::subgraph_t s2, map s, map &args, map> ref) { list::iterator i = s.begin(); + for (; i!=s.end(); i++) { PipelineComponentBase* current = (*i)->clone(); @@ -1393,7 +1407,7 @@ void merge_stages_fine_grain(const map &all_stages, // generate all tasks int nrS = 0; double max_nrS_mksp = 0; - for (list::iterator s=current_stages.begin(); s!= current_stages.end(); ) { + for (list::iterator s=current_stages.begin(); s!=current_stages.end(); ) { // if the stage isn't composed of reusable tasks then (*s)->tasks = task_generator(ref->second->tasksDesc, *s, rt, expanded_args); if ((*s)->tasks.size() == 0) { diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp index ebbeaee..1569458 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp @@ -207,7 +207,8 @@ TaskSegmentation0::TaskSegmentation0(list args, RegionTemplate* i TaskSegmentation0::~TaskSegmentation0() { if(normalized_rt_temp != NULL) delete normalized_rt_temp; - + delete bgr; + delete rbc; } bool TaskSegmentation0::run(int procType, int tid) { @@ -398,7 +399,7 @@ ReusableTask* TaskSegmentation0::clone() { char *buff = new char[size]; this->serialize(buff); retValue->deserialize(buff); - delete buff; + delete[] buff; return retValue; } @@ -454,7 +455,9 @@ TaskSegmentation1::TaskSegmentation1(list args, RegionTemplate* i } TaskSegmentation1::~TaskSegmentation1() { - + delete rc; + delete rc_recon; + delete rc_open; } bool TaskSegmentation1::run(int procType, int tid) { @@ -571,7 +574,7 @@ ReusableTask* TaskSegmentation1::clone() { char *buff = new char[size]; this->serialize(buff); retValue->deserialize(buff); - delete buff; + delete[] buff; return retValue; } @@ -626,7 +629,8 @@ TaskSegmentation2::TaskSegmentation2(list args, RegionTemplate* i } TaskSegmentation2::~TaskSegmentation2() { - + delete bw1; + delete diffIm; } bool TaskSegmentation2::run(int procType, int tid) { @@ -756,7 +760,7 @@ ReusableTask* TaskSegmentation2::clone() { char *buff = new char[size]; this->serialize(buff); retValue->deserialize(buff); - delete buff; + delete[] buff; return retValue; } @@ -810,7 +814,7 @@ TaskSegmentation3::TaskSegmentation3(list args, RegionTemplate* i } TaskSegmentation3::~TaskSegmentation3() { - + delete bw1_t; } bool TaskSegmentation3::run(int procType, int tid) { @@ -937,7 +941,7 @@ ReusableTask* TaskSegmentation3::clone() { char *buff = new char[size]; this->serialize(buff); retValue->deserialize(buff); - delete buff; + delete[] buff; return retValue; } @@ -986,7 +990,7 @@ TaskSegmentation4::TaskSegmentation4(list args, RegionTemplate* i } TaskSegmentation4::~TaskSegmentation4() { - + delete seg_open; } bool TaskSegmentation4::run(int procType, int tid) { @@ -1103,7 +1107,7 @@ ReusableTask* TaskSegmentation4::clone() { char *buff = new char[size]; this->serialize(buff); retValue->deserialize(buff); - delete buff; + delete[] buff; return retValue; } @@ -1168,6 +1172,7 @@ TaskSegmentation5::TaskSegmentation5(list args, RegionTemplate* i TaskSegmentation5::~TaskSegmentation5() { if(normalized_rt_temp != NULL) delete normalized_rt_temp; + delete seg_nonoverlap; } bool TaskSegmentation5::run(int procType, int tid) { @@ -1329,7 +1334,7 @@ ReusableTask* TaskSegmentation5::clone() { char *buff = new char[size]; this->serialize(buff); retValue->deserialize(buff); - delete buff; + delete[] buff; return retValue; } @@ -1396,7 +1401,7 @@ TaskSegmentation6::TaskSegmentation6(list args, RegionTemplate* i } TaskSegmentation6::~TaskSegmentation6() { - + delete segmented_rt_temp; } bool TaskSegmentation6::run(int procType, int tid) { @@ -1564,7 +1569,7 @@ ReusableTask* TaskSegmentation6::clone() { char *buff = new char[size]; this->serialize(buff); retValue->deserialize(buff); - delete buff; + delete[] buff; return retValue; } From 1bb49581d11c6ac13a11023130d796064b700f11 Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Wed, 14 Sep 2016 09:47:37 -0300 Subject: [PATCH 39/87] Application fully working. In order to do such a memory leakage was reinserted: On Segmentation, the tasks instantiate cvMat's as intertask arguments. These arguments were being deleted on the task destructor. However, the cvMat's were being destroyed before they were used by the next task. Also, we can't just do the delete on the next task since it's possible for another task to have the same dependency. --- runtime/PipelineComponentBase.cpp | 11 ++++++++++ .../RTPipelineComponentBase.cpp | 2 +- .../PipelineManager.cpp | 15 +++++++++++-- .../PipelineRTFS-NS-Diff-FGO/Segmentation.cpp | 22 +++++++++---------- 4 files changed, 36 insertions(+), 14 deletions(-) diff --git a/runtime/PipelineComponentBase.cpp b/runtime/PipelineComponentBase.cpp index 9ec295f..7b64788 100644 --- a/runtime/PipelineComponentBase.cpp +++ b/runtime/PipelineComponentBase.cpp @@ -139,6 +139,9 @@ int PipelineComponentBase::size() // To store the size of the name size_bytes += sizeof(int); + // To store the location + size_bytes += sizeof(int); + // The proper name of the component class size_bytes += this->getComponentName().size() * sizeof(char); @@ -195,6 +198,10 @@ int PipelineComponentBase::serialize(char *buff) memcpy(buff+serialized_bytes, this->getComponentName().c_str(), name_size*sizeof(char) ); serialized_bytes+=name_size*sizeof(char); + // Copy location to buffer + memcpy(buff+serialized_bytes, &location, sizeof(int)); + serialized_bytes+=sizeof(int); + // Copy size of result data size memcpy(buff+serialized_bytes, &resultDataSize, sizeof(int)); serialized_bytes+=sizeof(int); @@ -284,6 +291,10 @@ int PipelineComponentBase::deserialize(char *buff) // set the component name this->setComponentName(component_name); + // Extract the location + this->setLocation((((int*)(buff+deserialized_bytes))[0])); + deserialized_bytes+=sizeof(int); + // Deserialize result data size this->resultDataSize = ((int*)(buff+deserialized_bytes))[0]; deserialized_bytes+=sizeof(int); diff --git a/runtime/regiontemplates/RTPipelineComponentBase.cpp b/runtime/regiontemplates/RTPipelineComponentBase.cpp index fafbe33..6182d33 100644 --- a/runtime/regiontemplates/RTPipelineComponentBase.cpp +++ b/runtime/regiontemplates/RTPipelineComponentBase.cpp @@ -30,7 +30,7 @@ RTPipelineComponentBase::~RTPipelineComponentBase() { std::map::iterator rtIt = this->regionTemplates.begin(); for(; rtIt != this->regionTemplates.end(); rtIt++){ RegionTemplate *rt = rtIt->second; - delete rt; + // delete rt; } } } diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 97057c3..f4fb786 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -253,8 +253,8 @@ int main(int argc, char* argv[]) { map merged_stages; int size = 6; - // MPI_Comm_size(MPI_COMM_WORLD, &size); - merge_stages_fine_grain(expanded_stages, base_stages, merged_stages, rt, expanded_args, size); + MPI_Comm_size(MPI_COMM_WORLD, &size); + merge_stages_fine_grain(expanded_stages, base_stages, merged_stages, rt, expanded_args, size-1); cout << endl<< "merged-fine: " << endl; for (pair p : merged_stages) { @@ -291,6 +291,10 @@ int main(int argc, char* argv[]) { cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " << expanded_args[i]->toString() << endl; ((Task*)s.second)->setId(s.second->getId()); + + // workaround to make sure that the RTs, if any, won't leak on this part of the algorithm + s.second->setLocation(PipelineComponentBase::MANAGER_SIDE); + sysEnv.executeComponent(s.second); } } @@ -594,6 +598,9 @@ void get_stages_from_file(FILE* workflow_descriptor, PipelineComponentBase* stage = PipelineComponentBase::ComponentFactory::getComponentFactory(command)(); stage->setName(name); + // workaround to make sure that the RTs, if any, won't leak on the mearging part of the algorithm + stage->setLocation(PipelineComponentBase::WORKER_SIDE); + // get outputs and add them to the map of arguments // list inputs = get_workflow_ports(workflow_descriptor, "inputPorts"); // cout << "outputs:" << endl; @@ -1378,6 +1385,10 @@ list> recursive_cut(list re current_mksp = mksp; } + for (int i=0; i b : buckets) { // cout << "\tbucket with cost " << calc_stage_proc(b, args, ref) << ":" << endl; diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp index 1569458..c498d3a 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp @@ -207,8 +207,8 @@ TaskSegmentation0::TaskSegmentation0(list args, RegionTemplate* i TaskSegmentation0::~TaskSegmentation0() { if(normalized_rt_temp != NULL) delete normalized_rt_temp; - delete bgr; - delete rbc; + // delete bgr; + // delete rbc; } bool TaskSegmentation0::run(int procType, int tid) { @@ -455,9 +455,9 @@ TaskSegmentation1::TaskSegmentation1(list args, RegionTemplate* i } TaskSegmentation1::~TaskSegmentation1() { - delete rc; - delete rc_recon; - delete rc_open; + // delete rc; + // delete rc_recon; + // delete rc_open; } bool TaskSegmentation1::run(int procType, int tid) { @@ -629,8 +629,8 @@ TaskSegmentation2::TaskSegmentation2(list args, RegionTemplate* i } TaskSegmentation2::~TaskSegmentation2() { - delete bw1; - delete diffIm; + // delete bw1; + // delete diffIm; } bool TaskSegmentation2::run(int procType, int tid) { @@ -814,7 +814,7 @@ TaskSegmentation3::TaskSegmentation3(list args, RegionTemplate* i } TaskSegmentation3::~TaskSegmentation3() { - delete bw1_t; + // delete bw1_t; } bool TaskSegmentation3::run(int procType, int tid) { @@ -990,7 +990,7 @@ TaskSegmentation4::TaskSegmentation4(list args, RegionTemplate* i } TaskSegmentation4::~TaskSegmentation4() { - delete seg_open; + // delete seg_open; } bool TaskSegmentation4::run(int procType, int tid) { @@ -1172,7 +1172,7 @@ TaskSegmentation5::TaskSegmentation5(list args, RegionTemplate* i TaskSegmentation5::~TaskSegmentation5() { if(normalized_rt_temp != NULL) delete normalized_rt_temp; - delete seg_nonoverlap; + // delete seg_nonoverlap; } bool TaskSegmentation5::run(int procType, int tid) { @@ -1401,7 +1401,7 @@ TaskSegmentation6::TaskSegmentation6(list args, RegionTemplate* i } TaskSegmentation6::~TaskSegmentation6() { - delete segmented_rt_temp; + // delete segmented_rt_temp; } bool TaskSegmentation6::run(int procType, int tid) { From f5fc3f688f38a1df9f72864dbae388bde376095a Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Wed, 14 Sep 2016 16:50:25 -0300 Subject: [PATCH 40/87] Recursive montecarlo implementation created. This implementation goal is to outperform the full recursive cutting algorithm execution time. The solution, however, won't be the 'best' solution (as it was especulated that the full recursive algorithm had such performance). In order to test with larger test sets (71 stages on 5 workers) the memory leak problem (intertask cvMat's) was re-fixed, thereby, breaking the execution stage. --- .../PipelineManager.cpp | 168 +++++++++++++++++- .../PipelineRTFS-NS-Diff-FGO/Segmentation.cpp | 22 +-- 2 files changed, 175 insertions(+), 15 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index f4fb786..f6f9531 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -122,7 +122,7 @@ int main(int argc, char* argv[]) { SysEnv sysEnv; // Tell the system which libraries should be used - sysEnv.startupSystem(argc, argv, "libcomponentnsdifffgo.so"); + // sysEnv.startupSystem(argc, argv, "libcomponentnsdifffgo.so"); // region template used by all stages RegionTemplate *rt = new RegionTemplate(); @@ -253,7 +253,7 @@ int main(int argc, char* argv[]) { map merged_stages; int size = 6; - MPI_Comm_size(MPI_COMM_WORLD, &size); + // MPI_Comm_size(MPI_COMM_WORLD, &size); merge_stages_fine_grain(expanded_stages, base_stages, merged_stages, rt, expanded_args, size-1); cout << endl<< "merged-fine: " << endl; @@ -1110,7 +1110,7 @@ mincut::weight_t get_reuse_factor(PipelineComponentBase* s1, PipelineComponentBa return ret; } -int get_reuse_factor(mincut::subgraph_t s1, mincut::subgraph_t s2, map id2task, +mincut::weight_t get_reuse_factor(mincut::subgraph_t s1, mincut::subgraph_t s2, map id2task, map current_stages, map &args, map> ref) { @@ -1405,6 +1405,166 @@ list> recursive_cut(list re return last_solution; } +list> montecarlo_cut(list rem, const map &all_stages, + int n, map &args, map> ref) { + + list> ret; + + cout << "[montecarlo_cut] n=" << n << endl; + + if (n == 1 || rem.size() == 1) { + ret.emplace_back(rem); + cout << "[montecarlo_cut] n=" << n << endl; + return ret; + } + + // perform cuts until there is no more tasks to cut, or, there is no more need for another cut + for (int i=0; i, list> c; + c = get_cut(rem, all_stages, args, ref); + + float w1 = calc_stage_proc(c.first, args, ref); + float w2 = calc_stage_proc(c.second, args, ref); + + list c1 = w1>=w2?c.first:c.second; + list c2 = w1>=w2?c.second:c.first; + + rem = c1; + ret.emplace_back(c2); + + if (rem.size() == 1) { + break; + } + } + + // add last bucket + ret.emplace_back(rem); + + // cout << "[montecarlo_cut] n=" << n << "ret:" << endl; + // int i=0; + // for (list bucket : ret) { + // cout << "\tb:" << i++ << endl; + // for (PipelineComponentBase* s : bucket) + // cout << "\t\t" << s->getId() << ":" << s->getName() << endl; + // } + + return ret; +} + +list> montecarlo_recursive_cut(list rem, + const map &all_stages, int n, map &args, map> ref) { + + list, list>> current_cuts; + pair, list> best_cut; + list> final_cut; + float best_mksp = FLT_MAX; + + cout << "[montecarlo_recursive_cut] n=" << n << endl; + + // stoping condition + if (n == 1) { + final_cut.emplace_back(rem); + cout << "[montecarlo_recursive_cut] n=" << n << " retuned1" << endl; + cout << "\tb0" << endl; + for (PipelineComponentBase* s : rem) + cout << "\t\t" << s->getId() << ":" << s->getName() << endl; + return final_cut; + } + + // attempt all possible cuts on this level + list rest; + while (rem.size() > 1) { + // attempt a cut + pair, list> c; + c = get_cut(rem, all_stages, args, ref); + + // store the cut for the rest to be calculated later + float w1 = calc_stage_proc(c.first, args, ref); + float w2 = calc_stage_proc(c.second, args, ref); + + list c1 = w1>=w2?c.first:c.second; + list c2 = w1>=w2?c.second:c.first; + + // add rest to c2 + c2.insert(c2.begin(), rest.begin(), rest.end()); + + current_cuts.emplace_back(pair, list>(c1, c2)); + + cout << "[montecarlo_recursive_cut] n=" << n << " adding cut" << endl; + cout << "\tc1:" << endl; + for (PipelineComponentBase* s : c1) + cout << "\t\t" << s->getId() << ":" << s->getName() << endl; + cout << "\tc2:" << endl; + for (PipelineComponentBase* s : c2) + cout << "\t\t" << s->getId() << ":" << s->getName() << endl; + + // update rem to get a new cut + rem = c1; + rest = c2; + } + + // runs all dependencies a la montecarlo + for (list, list>>::iterator i=current_cuts.begin(); + i!=current_cuts.end(); i++) { + cout << "[montecarlo_recursive_cut] n=" << n << " running cut" << endl; + cout << "\tc1 - cost=" << calc_stage_proc(i->first, args, ref) << ":" << endl; + for (PipelineComponentBase* s : i->first) + cout << "\t\t" << s->getId() << ":" << s->getName() << endl; + cout << "\tc2 - cost=" << calc_stage_proc(i->second, args, ref) << ":" << endl; + for (PipelineComponentBase* s : i->second) + cout << "\t\t" << s->getId() << ":" << s->getName() << endl; + + list> c = montecarlo_cut(i->second, all_stages, n-1, args, ref); + + // calculates i cut cost with rest c + cout << "[montecarlo_cut] n=" << n << "ret:" << endl; + int ii=0; + float mksp; + float max_mksp = calc_stage_proc(i->first, args, ref); + for (list bucket : c) { + mksp = calc_stage_proc(bucket, args, ref); + if (mksp > max_mksp) + max_mksp = mksp; + cout << "\tb" << ii++ << " - mksp=" << mksp<< endl; + for (PipelineComponentBase* s : bucket) + cout << "\t\t" << s->getId() << ":" << s->getName() << endl; + } + + cout << "\twith mksp=" << max_mksp << endl; + + // updates best cut, if this is the case + if (max_mksp < best_mksp) { + best_mksp = max_mksp; + list flat_c; + for (list bucket : c) + flat_c.insert(flat_c.begin(), bucket.begin(), bucket.end()); + best_cut = pair, list>(i->first, flat_c); + } + } + + cout << "[montecarlo_recursive_cut] n=" << n << " best cut of the stage with mksp=" << best_mksp << endl; + cout << "\tc1:" << endl; + for (PipelineComponentBase* s : best_cut.first) + cout << "\t\t" << s->getId() << ":" << s->getName() << endl; + cout << "\tc2:" << endl; + for (PipelineComponentBase* s : best_cut.second) + cout << "\t\t" << s->getId() << ":" << s->getName() << endl; + + // recursive call on the best rest + final_cut = montecarlo_recursive_cut(best_cut.second, all_stages, n-1, args, ref); + final_cut.emplace_back(best_cut.first); + + cout << "[montecarlo_recursive_cut] n=" << n << " final cut:" << endl; + int i=0; + for (list bucket : final_cut) { + cout << "\tb:" << i++ << endl; + for (PipelineComponentBase* s : bucket) + cout << "\t\t" << s->getId() << ":" << s->getName() << endl; + } + + return final_cut; +} + void merge_stages_fine_grain(const map &all_stages, const map &stages_ref, map &merged_stages, RegionTemplate* rt, map expanded_args, int n_workers) { @@ -1442,7 +1602,7 @@ void merge_stages_fine_grain(const map &all_stages, continue; } - list> solution = recursive_cut(current_stages, all_stages, + list> solution = montecarlo_recursive_cut(current_stages, all_stages, n_workers, expanded_args, ref->second->tasksDesc); cout << "solution:" << endl; diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp index c498d3a..1569458 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp @@ -207,8 +207,8 @@ TaskSegmentation0::TaskSegmentation0(list args, RegionTemplate* i TaskSegmentation0::~TaskSegmentation0() { if(normalized_rt_temp != NULL) delete normalized_rt_temp; - // delete bgr; - // delete rbc; + delete bgr; + delete rbc; } bool TaskSegmentation0::run(int procType, int tid) { @@ -455,9 +455,9 @@ TaskSegmentation1::TaskSegmentation1(list args, RegionTemplate* i } TaskSegmentation1::~TaskSegmentation1() { - // delete rc; - // delete rc_recon; - // delete rc_open; + delete rc; + delete rc_recon; + delete rc_open; } bool TaskSegmentation1::run(int procType, int tid) { @@ -629,8 +629,8 @@ TaskSegmentation2::TaskSegmentation2(list args, RegionTemplate* i } TaskSegmentation2::~TaskSegmentation2() { - // delete bw1; - // delete diffIm; + delete bw1; + delete diffIm; } bool TaskSegmentation2::run(int procType, int tid) { @@ -814,7 +814,7 @@ TaskSegmentation3::TaskSegmentation3(list args, RegionTemplate* i } TaskSegmentation3::~TaskSegmentation3() { - // delete bw1_t; + delete bw1_t; } bool TaskSegmentation3::run(int procType, int tid) { @@ -990,7 +990,7 @@ TaskSegmentation4::TaskSegmentation4(list args, RegionTemplate* i } TaskSegmentation4::~TaskSegmentation4() { - // delete seg_open; + delete seg_open; } bool TaskSegmentation4::run(int procType, int tid) { @@ -1172,7 +1172,7 @@ TaskSegmentation5::TaskSegmentation5(list args, RegionTemplate* i TaskSegmentation5::~TaskSegmentation5() { if(normalized_rt_temp != NULL) delete normalized_rt_temp; - // delete seg_nonoverlap; + delete seg_nonoverlap; } bool TaskSegmentation5::run(int procType, int tid) { @@ -1401,7 +1401,7 @@ TaskSegmentation6::TaskSegmentation6(list args, RegionTemplate* i } TaskSegmentation6::~TaskSegmentation6() { - // delete segmented_rt_temp; + delete segmented_rt_temp; } bool TaskSegmentation6::run(int procType, int tid) { From 552a224eb7bb1545f56351271869aedb76169a06 Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Wed, 14 Sep 2016 18:18:24 -0300 Subject: [PATCH 41/87] Recursive Montecarlo algorithm implemented and tested. In order to use it without any size restriction a bug was introduced into the execution stage. This was done to prevent all memory leaks. --- .../RTPipelineComponentBase.cpp | 2 +- .../PipelineManager.cpp | 21 ++++++++++++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/runtime/regiontemplates/RTPipelineComponentBase.cpp b/runtime/regiontemplates/RTPipelineComponentBase.cpp index 6182d33..fafbe33 100644 --- a/runtime/regiontemplates/RTPipelineComponentBase.cpp +++ b/runtime/regiontemplates/RTPipelineComponentBase.cpp @@ -30,7 +30,7 @@ RTPipelineComponentBase::~RTPipelineComponentBase() { std::map::iterator rtIt = this->regionTemplates.begin(); for(; rtIt != this->regionTemplates.end(); rtIt++){ RegionTemplate *rt = rtIt->second; - // delete rt; + delete rt; } } } diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index f6f9531..3a8923a 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -252,7 +252,7 @@ int main(int argc, char* argv[]) { add_arguments_to_stages(expanded_stages, expanded_args, rt); map merged_stages; - int size = 6; + int size = 9; // MPI_Comm_size(MPI_COMM_WORLD, &size); merge_stages_fine_grain(expanded_stages, base_stages, merged_stages, rt, expanded_args, size-1); @@ -1458,6 +1458,7 @@ list> montecarlo_recursive_cut(list, list> best_cut; list> final_cut; float best_mksp = FLT_MAX; + float best_var = FLT_MAX; cout << "[montecarlo_recursive_cut] n=" << n << endl; @@ -1519,10 +1520,13 @@ list> montecarlo_recursive_cut(listfirst, args, ref); + float avg = calc_stage_proc(i->first, args, ref); for (list bucket : c) { mksp = calc_stage_proc(bucket, args, ref); + avg += mksp; if (mksp > max_mksp) max_mksp = mksp; cout << "\tb" << ii++ << " - mksp=" << mksp<< endl; @@ -1530,11 +1534,22 @@ list> montecarlo_recursive_cut(listgetId() << ":" << s->getName() << endl; } - cout << "\twith mksp=" << max_mksp << endl; + // standard deviation selection metric + avg /= (c.size()+1); + float var = (calc_stage_proc(i->first, args, ref)-avg)*(calc_stage_proc(i->first, args, ref)-avg); + for (list bucket : c) { + mksp = calc_stage_proc(bucket, args, ref); + var += (mksp-avg)*(mksp-avg); + } + var /= (c.size()+1); + + cout << "with mksp=" << max_mksp << endl; + cout << "with var=" << var << endl; // updates best cut, if this is the case - if (max_mksp < best_mksp) { + if (max_mksp < best_mksp || (max_mksp == best_mksp && var < best_var)) { best_mksp = max_mksp; + best_var = var; list flat_c; for (list bucket : c) flat_c.insert(flat_c.begin(), bucket.begin(), bucket.end()); From 5810c934c85e5796f578ded1a05657e585ea1eef Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Mon, 19 Sep 2016 16:21:55 -0300 Subject: [PATCH 42/87] Changed intertask arguments to smart pointers in order to fix the mem leaking and keep the system working. --- runtime/PipelineComponentBase.cpp | 14 +- runtime/ReusableTask.hpp | 2 + .../PipelineManager.cpp | 19 +- .../PipelineRTFS-NS-Diff-FGO/Segmentation.cpp | 177 ++++++++---------- .../PipelineRTFS-NS-Diff-FGO/Segmentation.hpp | 68 +++---- 5 files changed, 126 insertions(+), 154 deletions(-) diff --git a/runtime/PipelineComponentBase.cpp b/runtime/PipelineComponentBase.cpp index 7b64788..e66fbbe 100644 --- a/runtime/PipelineComponentBase.cpp +++ b/runtime/PipelineComponentBase.cpp @@ -50,7 +50,8 @@ PipelineComponentBase::~PipelineComponentBase() { } for (std::list::iterator t=tasks.begin(); t!=tasks.end(); t++) { - delete *t; + if (*t) + delete *t; } } @@ -139,9 +140,6 @@ int PipelineComponentBase::size() // To store the size of the name size_bytes += sizeof(int); - // To store the location - size_bytes += sizeof(int); - // The proper name of the component class size_bytes += this->getComponentName().size() * sizeof(char); @@ -198,10 +196,6 @@ int PipelineComponentBase::serialize(char *buff) memcpy(buff+serialized_bytes, this->getComponentName().c_str(), name_size*sizeof(char) ); serialized_bytes+=name_size*sizeof(char); - // Copy location to buffer - memcpy(buff+serialized_bytes, &location, sizeof(int)); - serialized_bytes+=sizeof(int); - // Copy size of result data size memcpy(buff+serialized_bytes, &resultDataSize, sizeof(int)); serialized_bytes+=sizeof(int); @@ -291,10 +285,6 @@ int PipelineComponentBase::deserialize(char *buff) // set the component name this->setComponentName(component_name); - // Extract the location - this->setLocation((((int*)(buff+deserialized_bytes))[0])); - deserialized_bytes+=sizeof(int); - // Deserialize result data size this->resultDataSize = ((int*)(buff+deserialized_bytes))[0]; deserialized_bytes+=sizeof(int); diff --git a/runtime/ReusableTask.hpp b/runtime/ReusableTask.hpp index b66cb24..92b778e 100644 --- a/runtime/ReusableTask.hpp +++ b/runtime/ReusableTask.hpp @@ -13,11 +13,13 @@ #include "Task.h" #include "Argument.h" #include "RegionTemplate.h" +#include "PipelineComponentBase.h" // Define factory function type that creates objects of type ReusableTask and its subclasses class ReusableTask; class RegionTemplate; +class PipelineComponentBase; typedef ReusableTask* (task_factory_t1)(list args, RegionTemplate* inputRt); typedef ReusableTask* (task_factory_t2)(); diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 3a8923a..7dcb892 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -122,7 +122,7 @@ int main(int argc, char* argv[]) { SysEnv sysEnv; // Tell the system which libraries should be used - // sysEnv.startupSystem(argc, argv, "libcomponentnsdifffgo.so"); + sysEnv.startupSystem(argc, argv, "libcomponentnsdifffgo.so"); // region template used by all stages RegionTemplate *rt = new RegionTemplate(); @@ -253,7 +253,7 @@ int main(int argc, char* argv[]) { map merged_stages; int size = 9; - // MPI_Comm_size(MPI_COMM_WORLD, &size); + MPI_Comm_size(MPI_COMM_WORLD, &size); merge_stages_fine_grain(expanded_stages, base_stages, merged_stages, rt, expanded_args, size-1); cout << endl<< "merged-fine: " << endl; @@ -792,6 +792,7 @@ void expand_stages(const map &args, // cout << "updating stage " << pt->getId() << ":" << pt->getName() << endl; // clone pt basic infoinfoinfo PipelineComponentBase* pt_cpy = pt->clone(); + pt_cpy->setLocation(PipelineComponentBase::WORKER_SIDE); // set name and id pt_cpy->setName(pt->getName()); @@ -970,8 +971,8 @@ void filter_stages(const map &all_stages, filtered_stages.emplace_back(p.second); } -list task_generator(map> &tasks_desc, - PipelineComponentBase* p, RegionTemplate* rt, map expanded_args) { +list task_generator(map> &tasks_desc, PipelineComponentBase* p, + RegionTemplate* rt, map expanded_args) { list tasks; ReusableTask* prev_task = NULL; @@ -1097,7 +1098,9 @@ mincut::weight_t get_reuse_factor(PipelineComponentBase* s1, PipelineComponentBa return 0; PipelineComponentBase* s1_clone = s1->clone(); + s1_clone->setLocation(PipelineComponentBase::WORKER_SIDE); PipelineComponentBase* s2_clone = s2->clone(); + s2_clone->setLocation(PipelineComponentBase::WORKER_SIDE); merge_stages(s1_clone, s2_clone, ref); @@ -1117,9 +1120,11 @@ mincut::weight_t get_reuse_factor(mincut::subgraph_t s1, mincut::subgraph_t s2, // get the first stage as a base stage mincut::subgraph_t::iterator s1_it = s1.begin(); PipelineComponentBase* current1 = current_stages[id2task[*s1_it]]->clone(); + current1->setLocation(PipelineComponentBase::WORKER_SIDE); s1_it++; for (; s1_it!=s1.end(); s1_it++) { PipelineComponentBase* clone1 = current_stages[id2task[*s1_it]]->clone(); + clone1->setLocation(PipelineComponentBase::WORKER_SIDE); if (merging_condition(current1, clone1, args, ref)) merge_stages(current1, clone1, ref); else { @@ -1133,8 +1138,10 @@ mincut::weight_t get_reuse_factor(mincut::subgraph_t s1, mincut::subgraph_t s2, // get the first stage as a base stage mincut::subgraph_t::iterator s2_it = s2.begin(); PipelineComponentBase* current2 = current_stages[id2task[(*s2_it)]]->clone(); + current2->setLocation(PipelineComponentBase::WORKER_SIDE); for (s2_it++; s2_it!=s2.end(); s2_it++) { PipelineComponentBase* clone2 = current_stages[id2task[*s2_it]]->clone(); + clone2->setLocation(PipelineComponentBase::WORKER_SIDE); if (merging_condition(current2, clone2, args, ref)) merge_stages(current2, clone2, ref); else @@ -1159,9 +1166,11 @@ float calc_stage_proc(list s, map &a for (; i!=s.end(); i++) { PipelineComponentBase* current = (*i)->clone(); + current->setLocation(PipelineComponentBase::WORKER_SIDE); for (list::iterator j = next(i); j!=s.end();) { if (merging_condition(*i, *j, args, ref)) { PipelineComponentBase* j_clone = (*j)->clone(); + j_clone->setLocation(PipelineComponentBase::WORKER_SIDE); merge_stages(current, j_clone, ref); delete j_clone; j = s.erase(j); @@ -1194,9 +1203,11 @@ float calc_stage_mem(list s, map &ar for (; i!=s.end(); i++) { PipelineComponentBase* current = (*i)->clone(); + current->setLocation(PipelineComponentBase::WORKER_SIDE); for (list::iterator j = next(i); j!=s.end();) { if (merging_condition(*i, *j, args, ref)) { PipelineComponentBase* j_clone = (*j)->clone(); + j_clone->setLocation(PipelineComponentBase::WORKER_SIDE); merge_stages(current, j_clone, ref); j = s.erase(j); delete j_clone; diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp index 1569458..dfeee6b 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp @@ -151,8 +151,8 @@ bool registeredSegmentation = PipelineComponentBase::ComponentFactory::component /**************************************************************************************/ TaskSegmentation0::TaskSegmentation0() { - bgr = new std::vector; - rbc = new cv::Mat; + bgr = std::shared_ptr>(new std::vector()); + rbc = std::shared_ptr(new cv::Mat()); } @@ -163,10 +163,10 @@ TaskSegmentation0::TaskSegmentation0(list args, RegionTemplate* i if (a->getName().compare("normalized_rt") == 0) { ArgumentRT* normalized_rt_arg; normalized_rt_arg = (ArgumentRT*)a; - this->normalized_rt_temp = new DenseDataRegion2D(); - this->normalized_rt_temp->setName(normalized_rt_arg->getName()); - this->normalized_rt_temp->setId(std::to_string(normalized_rt_arg->getId())); - this->normalized_rt_temp->setVersion(normalized_rt_arg->getId()); + this->normalized_rt_temp = std::make_shared(new DenseDataRegion2D()); + (*this->normalized_rt_temp)->setName(normalized_rt_arg->getName()); + (*this->normalized_rt_temp)->setId(std::to_string(normalized_rt_arg->getId())); + (*this->normalized_rt_temp)->setVersion(normalized_rt_arg->getId()); set_cout++; } @@ -200,29 +200,22 @@ TaskSegmentation0::TaskSegmentation0(list args, RegionTemplate* i if (set_cout < args.size()) std::cout << __FILE__ << ":" << __LINE__ <<" Missing common arguments on Segmentation" << std::endl; - bgr = new std::vector; - rbc = new cv::Mat; + bgr = std::shared_ptr>(new std::vector()); + rbc = std::shared_ptr(new cv::Mat()); } TaskSegmentation0::~TaskSegmentation0() { - if(normalized_rt_temp != NULL) delete normalized_rt_temp; - delete bgr; - delete rbc; } bool TaskSegmentation0::run(int procType, int tid) { - cv::Mat normalized_rt = this->normalized_rt_temp->getData(); - - - std::vector bgr_temp; - cv::Mat rbc_temp; + cv::Mat normalized_rt = (*this->normalized_rt_temp)->getData(); uint64_t t1 = Util::ClockGetTimeProfile(); std::cout << "\t\t\tTaskSegmentation0 executing." << std::endl; - ::nscale::HistologicalEntities::segmentNucleiStg1(normalized_rt, blue, green, red, T1, T2, bgr, rbc); + ::nscale::HistologicalEntities::segmentNucleiStg1(normalized_rt, blue, green, red, T1, T2, &(*bgr), &(*rbc)); uint64_t t2 = Util::ClockGetTimeProfile(); @@ -231,8 +224,9 @@ bool TaskSegmentation0::run(int procType, int tid) { } void TaskSegmentation0::updateDR(RegionTemplate* rt) { - normalized_rt_temp = dynamic_cast(rt->getDataRegion(this->normalized_rt_temp->getName(), - this->normalized_rt_temp->getId(), 0, stoi(this->normalized_rt_temp->getId()))); + normalized_rt_temp = std::make_shared(dynamic_cast( + rt->getDataRegion((*this->normalized_rt_temp)->getName(), + (*this->normalized_rt_temp)->getId(), 0, stoi((*this->normalized_rt_temp)->getId())))); } @@ -259,7 +253,7 @@ void TaskSegmentation0::resolveDependencies(ReusableTask* t) { bool TaskSegmentation0::reusable(ReusableTask* rt) { TaskSegmentation0* t = (TaskSegmentation0*)(rt); if ( - this->normalized_rt_temp->getName() == t->normalized_rt_temp->getName() && + (*this->normalized_rt_temp)->getName() == (*t->normalized_rt_temp)->getName() && this->blue == t->blue && this->green == t->green && this->red == t->red && @@ -278,7 +272,7 @@ bool TaskSegmentation0::reusable(ReusableTask* rt) { int TaskSegmentation0::size() { return sizeof(int) + sizeof(int) + - sizeof(int) + normalized_rt_temp->getName().length()*sizeof(char) + sizeof(int) + + sizeof(int) + (*normalized_rt_temp)->getName().length()*sizeof(char) + sizeof(int) + sizeof(unsigned char) + sizeof(unsigned char) + sizeof(unsigned char) + @@ -301,17 +295,17 @@ int TaskSegmentation0::serialize(char *buff) { serialized_bytes+=sizeof(int); // copy normalized_rt id - int normalized_rt_id = stoi(normalized_rt_temp->getId()); + int normalized_rt_id = stoi((*normalized_rt_temp)->getId()); memcpy(buff+serialized_bytes, &normalized_rt_id, sizeof(int)); serialized_bytes+=sizeof(int); // copy normalized_rt name size - int normalized_rt_name_size = normalized_rt_temp->getName().length(); + int normalized_rt_name_size = (*normalized_rt_temp)->getName().length(); memcpy(buff+serialized_bytes, &normalized_rt_name_size, sizeof(int)); serialized_bytes+=sizeof(int); // copy normalized_rt name - memcpy(buff+serialized_bytes, normalized_rt_temp->getName().c_str(), normalized_rt_name_size*sizeof(char)); + memcpy(buff+serialized_bytes, (*normalized_rt_temp)->getName().c_str(), normalized_rt_name_size*sizeof(char)); serialized_bytes+=normalized_rt_name_size*sizeof(char); // copy field blue @@ -350,12 +344,12 @@ int TaskSegmentation0::deserialize(char *buff) { deserialized_bytes += sizeof(int); // create the normalized_rt - this->normalized_rt_temp = new DenseDataRegion2D(); + this->normalized_rt_temp = std::make_shared(new DenseDataRegion2D()); // extract normalized_rt id int normalized_rt_id = ((int*)(buff+deserialized_bytes))[0]; - this->normalized_rt_temp->setId(to_string(normalized_rt_id)); - this->normalized_rt_temp->setVersion(normalized_rt_id); + (*this->normalized_rt_temp)->setId(to_string(normalized_rt_id)); + (*this->normalized_rt_temp)->setVersion(normalized_rt_id); deserialized_bytes += sizeof(int); // extract normalized_rt name size @@ -367,7 +361,7 @@ int TaskSegmentation0::deserialize(char *buff) { normalized_rt_name[normalized_rt_name_size] = '\0'; memcpy(normalized_rt_name, buff+deserialized_bytes, sizeof(char)*normalized_rt_name_size); deserialized_bytes += sizeof(char)*normalized_rt_name_size; - this->normalized_rt_temp->setName(normalized_rt_name); + (*this->normalized_rt_temp)->setName(normalized_rt_name); // extract field blue this->blue = ((unsigned char*)(buff+deserialized_bytes))[0]; @@ -428,9 +422,9 @@ bool registeredTaskSegmentation02 = ReusableTask::ReusableTaskFactory::taskRegis &Segmentation0Factory1, &Segmentation0Factory2); TaskSegmentation1::TaskSegmentation1() { - rc = new cv::Mat; - rc_recon = new cv::Mat; - rc_open = new cv::Mat; + rc = std::shared_ptr(new cv::Mat()); + rc_recon = std::shared_ptr(new cv::Mat()); + rc_open = std::shared_ptr(new cv::Mat()); } @@ -448,30 +442,22 @@ TaskSegmentation1::TaskSegmentation1(list args, RegionTemplate* i if (set_cout < args.size()) std::cout << __FILE__ << ":" << __LINE__ <<" Missing common arguments on Segmentation" << std::endl; - rc = new cv::Mat; - rc_recon = new cv::Mat; - rc_open = new cv::Mat; + rc = std::shared_ptr(new cv::Mat()); + rc_recon = std::shared_ptr(new cv::Mat()); + rc_open = std::shared_ptr(new cv::Mat()); } TaskSegmentation1::~TaskSegmentation1() { - delete rc; - delete rc_recon; - delete rc_open; } bool TaskSegmentation1::run(int procType, int tid) { - - cv::Mat rc_temp; - cv::Mat rc_recon_temp; - cv::Mat rc_open_temp; - uint64_t t1 = Util::ClockGetTimeProfile(); std::cout << "\t\t\tTaskSegmentation1 executing." << std::endl; - ::nscale::HistologicalEntities::segmentNucleiStg2(reconConnectivity, bgr, rc, rc_recon, rc_open); + ::nscale::HistologicalEntities::segmentNucleiStg2(reconConnectivity, &*bgr, &*rc, &*rc_recon, &*rc_open); uint64_t t2 = Util::ClockGetTimeProfile(); @@ -599,8 +585,8 @@ bool registeredTaskSegmentation12 = ReusableTask::ReusableTaskFactory::taskRegis &Segmentation1Factory1, &Segmentation1Factory2); TaskSegmentation2::TaskSegmentation2() { - bw1 = new cv::Mat; - diffIm = new cv::Mat; + bw1 = std::shared_ptr(new cv::Mat()); + diffIm = std::shared_ptr(new cv::Mat()); } @@ -623,27 +609,21 @@ TaskSegmentation2::TaskSegmentation2(list args, RegionTemplate* i if (set_cout < args.size()) std::cout << __FILE__ << ":" << __LINE__ <<" Missing common arguments on Segmentation" << std::endl; - bw1 = new cv::Mat; - diffIm = new cv::Mat; + bw1 = std::shared_ptr(new cv::Mat()); + diffIm = std::shared_ptr(new cv::Mat()); } TaskSegmentation2::~TaskSegmentation2() { - delete bw1; - delete diffIm; } bool TaskSegmentation2::run(int procType, int tid) { - - cv::Mat bw1_temp; - cv::Mat diffIm_temp; - uint64_t t1 = Util::ClockGetTimeProfile(); std::cout << "\t\t\tTaskSegmentation2 executing." << std::endl; - ::nscale::HistologicalEntities::segmentNucleiStg3(fillHolesConnectivity, G1, rc, rc_recon, rc_open, bw1, diffIm); + ::nscale::HistologicalEntities::segmentNucleiStg3(fillHolesConnectivity, G1, &*rc, &*rc_recon, &*rc_open, &*bw1, &*diffIm); uint64_t t2 = Util::ClockGetTimeProfile(); @@ -786,7 +766,7 @@ bool registeredTaskSegmentation22 = ReusableTask::ReusableTaskFactory::taskRegis &Segmentation2Factory1, &Segmentation2Factory2); TaskSegmentation3::TaskSegmentation3() { - bw1_t = new cv::Mat; + bw1_t = std::shared_ptr(new cv::Mat()); } @@ -809,12 +789,11 @@ TaskSegmentation3::TaskSegmentation3(list args, RegionTemplate* i if (set_cout < args.size()) std::cout << __FILE__ << ":" << __LINE__ <<" Missing common arguments on Segmentation" << std::endl; - bw1_t = new cv::Mat; + bw1_t = std::shared_ptr(new cv::Mat()); } TaskSegmentation3::~TaskSegmentation3() { - delete bw1_t; } bool TaskSegmentation3::run(int procType, int tid) { @@ -826,7 +805,7 @@ bool TaskSegmentation3::run(int procType, int tid) { std::cout << "\t\t\tTaskSegmentation3 executing." << std::endl; - ::nscale::HistologicalEntities::segmentNucleiStg4(minSize, maxSize, bw1, bw1_t); + ::nscale::HistologicalEntities::segmentNucleiStg4(minSize, maxSize, &*bw1, &*bw1_t); uint64_t t2 = Util::ClockGetTimeProfile(); @@ -967,7 +946,7 @@ bool registeredTaskSegmentation32 = ReusableTask::ReusableTaskFactory::taskRegis &Segmentation3Factory1, &Segmentation3Factory2); TaskSegmentation4::TaskSegmentation4() { - seg_open = new cv::Mat; + seg_open = std::shared_ptr(new cv::Mat()); } @@ -985,12 +964,11 @@ TaskSegmentation4::TaskSegmentation4(list args, RegionTemplate* i if (set_cout < args.size()) std::cout << __FILE__ << ":" << __LINE__ <<" Missing common arguments on Segmentation" << std::endl; - seg_open = new cv::Mat; + seg_open = std::shared_ptr(new cv::Mat()); } TaskSegmentation4::~TaskSegmentation4() { - delete seg_open; } bool TaskSegmentation4::run(int procType, int tid) { @@ -1002,7 +980,7 @@ bool TaskSegmentation4::run(int procType, int tid) { std::cout << "\t\t\tTaskSegmentation4 executing." << std::endl; - ::nscale::HistologicalEntities::segmentNucleiStg5(G2, diffIm, bw1_t, rbc, seg_open); + ::nscale::HistologicalEntities::segmentNucleiStg5(G2, &*diffIm, &*bw1_t, &*rbc, &*seg_open); uint64_t t2 = Util::ClockGetTimeProfile(); @@ -1132,7 +1110,7 @@ bool registeredTaskSegmentation42 = ReusableTask::ReusableTaskFactory::taskRegis &Segmentation4Factory1, &Segmentation4Factory2); TaskSegmentation5::TaskSegmentation5() { - seg_nonoverlap = new cv::Mat; + seg_nonoverlap = std::shared_ptr(new cv::Mat()); } @@ -1143,10 +1121,10 @@ TaskSegmentation5::TaskSegmentation5(list args, RegionTemplate* i if (a->getName().compare("normalized_rt") == 0) { ArgumentRT* normalized_rt_arg; normalized_rt_arg = (ArgumentRT*)a; - this->normalized_rt_temp = new DenseDataRegion2D(); - this->normalized_rt_temp->setName(normalized_rt_arg->getName()); - this->normalized_rt_temp->setId(std::to_string(normalized_rt_arg->getId())); - this->normalized_rt_temp->setVersion(normalized_rt_arg->getId()); + this->normalized_rt_temp = std::make_shared(new DenseDataRegion2D()); + (*this->normalized_rt_temp)->setName(normalized_rt_arg->getName()); + (*this->normalized_rt_temp)->setId(std::to_string(normalized_rt_arg->getId())); + (*this->normalized_rt_temp)->setVersion(normalized_rt_arg->getId()); set_cout++; } @@ -1165,18 +1143,15 @@ TaskSegmentation5::TaskSegmentation5(list args, RegionTemplate* i if (set_cout < args.size()) std::cout << __FILE__ << ":" << __LINE__ <<" Missing common arguments on Segmentation" << std::endl; - seg_nonoverlap = new cv::Mat; + seg_nonoverlap = std::shared_ptr(new cv::Mat()); } TaskSegmentation5::~TaskSegmentation5() { - if(normalized_rt_temp != NULL) delete normalized_rt_temp; - - delete seg_nonoverlap; } bool TaskSegmentation5::run(int procType, int tid) { - cv::Mat normalized_rt = this->normalized_rt_temp->getData(); + cv::Mat normalized_rt = (*this->normalized_rt_temp)->getData(); cv::Mat seg_nonoverlap_temp; @@ -1185,7 +1160,7 @@ bool TaskSegmentation5::run(int procType, int tid) { std::cout << "\t\t\tTaskSegmentation5 executing." << std::endl; - ::nscale::HistologicalEntities::segmentNucleiStg6(normalized_rt, minSizePl, watershedConnectivity, seg_open, seg_nonoverlap); + ::nscale::HistologicalEntities::segmentNucleiStg6(normalized_rt, minSizePl, watershedConnectivity, &*seg_open, &*seg_nonoverlap); uint64_t t2 = Util::ClockGetTimeProfile(); @@ -1194,8 +1169,9 @@ bool TaskSegmentation5::run(int procType, int tid) { } void TaskSegmentation5::updateDR(RegionTemplate* rt) { - normalized_rt_temp = dynamic_cast(rt->getDataRegion(this->normalized_rt_temp->getName(), - this->normalized_rt_temp->getId(), 0, stoi(this->normalized_rt_temp->getId()))); + normalized_rt_temp = std::make_shared(dynamic_cast( + rt->getDataRegion((*this->normalized_rt_temp)->getName(), + (*this->normalized_rt_temp)->getId(), 0, stoi((*this->normalized_rt_temp)->getId())))); } @@ -1224,7 +1200,7 @@ void TaskSegmentation5::resolveDependencies(ReusableTask* t) { bool TaskSegmentation5::reusable(ReusableTask* rt) { TaskSegmentation5* t = (TaskSegmentation5*)(rt); if ( - this->normalized_rt_temp->getName() == t->normalized_rt_temp->getName() && + (*this->normalized_rt_temp)->getName() == (*t->normalized_rt_temp)->getName() && this->minSizePl == t->minSizePl && this->watershedConnectivity == t->watershedConnectivity && @@ -1240,7 +1216,7 @@ bool TaskSegmentation5::reusable(ReusableTask* rt) { int TaskSegmentation5::size() { return sizeof(int) + sizeof(int) + - sizeof(int) + normalized_rt_temp->getName().length()*sizeof(char) + sizeof(int) + + sizeof(int) + (*normalized_rt_temp)->getName().length()*sizeof(char) + sizeof(int) + sizeof(int) + sizeof(int) + @@ -1260,17 +1236,17 @@ int TaskSegmentation5::serialize(char *buff) { serialized_bytes+=sizeof(int); // copy normalized_rt id - int normalized_rt_id = stoi(normalized_rt_temp->getId()); + int normalized_rt_id = stoi((*normalized_rt_temp)->getId()); memcpy(buff+serialized_bytes, &normalized_rt_id, sizeof(int)); serialized_bytes+=sizeof(int); // copy normalized_rt name size - int normalized_rt_name_size = normalized_rt_temp->getName().length(); + int normalized_rt_name_size = (*normalized_rt_temp)->getName().length(); memcpy(buff+serialized_bytes, &normalized_rt_name_size, sizeof(int)); serialized_bytes+=sizeof(int); // copy normalized_rt name - memcpy(buff+serialized_bytes, normalized_rt_temp->getName().c_str(), normalized_rt_name_size*sizeof(char)); + memcpy(buff+serialized_bytes, (*normalized_rt_temp)->getName().c_str(), normalized_rt_name_size*sizeof(char)); serialized_bytes+=normalized_rt_name_size*sizeof(char); // copy field minSizePl @@ -1297,12 +1273,12 @@ int TaskSegmentation5::deserialize(char *buff) { deserialized_bytes += sizeof(int); // create the normalized_rt - this->normalized_rt_temp = new DenseDataRegion2D(); + this->normalized_rt_temp = std::make_shared(new DenseDataRegion2D()); // extract normalized_rt id int normalized_rt_id = ((int*)(buff+deserialized_bytes))[0]; - this->normalized_rt_temp->setId(to_string(normalized_rt_id)); - this->normalized_rt_temp->setVersion(normalized_rt_id); + (*this->normalized_rt_temp)->setId(to_string(normalized_rt_id)); + (*this->normalized_rt_temp)->setVersion(normalized_rt_id); deserialized_bytes += sizeof(int); // extract normalized_rt name size @@ -1314,7 +1290,7 @@ int TaskSegmentation5::deserialize(char *buff) { normalized_rt_name[normalized_rt_name_size] = '\0'; memcpy(normalized_rt_name, buff+deserialized_bytes, sizeof(char)*normalized_rt_name_size); deserialized_bytes += sizeof(char)*normalized_rt_name_size; - this->normalized_rt_temp->setName(normalized_rt_name); + (*this->normalized_rt_temp)->setName(normalized_rt_name); // extract field minSizePl this->minSizePl = ((int*)(buff+deserialized_bytes))[0]; @@ -1370,10 +1346,10 @@ TaskSegmentation6::TaskSegmentation6(list args, RegionTemplate* i if (a->getName().compare("segmented_rt") == 0) { ArgumentRT* segmented_rt_arg; segmented_rt_arg = (ArgumentRT*)a; - this->segmented_rt_temp = new DenseDataRegion2D(); - this->segmented_rt_temp->setName(segmented_rt_arg->getName()); - this->segmented_rt_temp->setId(std::to_string(segmented_rt_arg->getId())); - this->segmented_rt_temp->setVersion(segmented_rt_arg->getId()); + this->segmented_rt_temp = std::make_shared(new DenseDataRegion2D()); + (*this->segmented_rt_temp)->setName(segmented_rt_arg->getName()); + (*this->segmented_rt_temp)->setId(std::to_string(segmented_rt_arg->getId())); + (*this->segmented_rt_temp)->setVersion(segmented_rt_arg->getId()); set_cout++; } @@ -1401,7 +1377,6 @@ TaskSegmentation6::TaskSegmentation6(list args, RegionTemplate* i } TaskSegmentation6::~TaskSegmentation6() { - delete segmented_rt_temp; } bool TaskSegmentation6::run(int procType, int tid) { @@ -1413,17 +1388,17 @@ bool TaskSegmentation6::run(int procType, int tid) { std::cout << "\t\t\tTaskSegmentation6 executing." << std::endl; - ::nscale::HistologicalEntities::segmentNucleiStg7(&segmented_rt, minSizeSeg, maxSizeSeg, fillHolesConnectivity, seg_nonoverlap); + ::nscale::HistologicalEntities::segmentNucleiStg7(&segmented_rt, minSizeSeg, maxSizeSeg, fillHolesConnectivity, &*seg_nonoverlap); uint64_t t2 = Util::ClockGetTimeProfile(); - this->segmented_rt_temp->setData(segmented_rt); + (*this->segmented_rt_temp)->setData(segmented_rt); std::cout << "\t\t\tTask Segmentation6 time elapsed: "<< t2-t1 << std::endl; } void TaskSegmentation6::updateDR(RegionTemplate* rt) { -rt->insertDataRegion(this->segmented_rt_temp); +rt->insertDataRegion(*this->segmented_rt_temp); } @@ -1449,7 +1424,7 @@ void TaskSegmentation6::resolveDependencies(ReusableTask* t) { bool TaskSegmentation6::reusable(ReusableTask* rt) { TaskSegmentation6* t = (TaskSegmentation6*)(rt); if ( - this->segmented_rt_temp->getName() == t->segmented_rt_temp->getName() && + (*this->segmented_rt_temp)->getName() == (*t->segmented_rt_temp)->getName() && this->minSizeSeg == t->minSizeSeg && this->maxSizeSeg == t->maxSizeSeg && this->fillHolesConnectivity == t->fillHolesConnectivity && @@ -1466,7 +1441,7 @@ bool TaskSegmentation6::reusable(ReusableTask* rt) { int TaskSegmentation6::size() { return sizeof(int) + sizeof(int) + - sizeof(int) + segmented_rt_temp->getName().length()*sizeof(char) + sizeof(int) + + sizeof(int) + (*segmented_rt_temp)->getName().length()*sizeof(char) + sizeof(int) + sizeof(int) + sizeof(int) + sizeof(int) + @@ -1487,17 +1462,17 @@ int TaskSegmentation6::serialize(char *buff) { serialized_bytes+=sizeof(int); // copy segmented_rt id - int segmented_rt_id = stoi(segmented_rt_temp->getId()); + int segmented_rt_id = stoi((*segmented_rt_temp)->getId()); memcpy(buff+serialized_bytes, &segmented_rt_id, sizeof(int)); serialized_bytes+=sizeof(int); // copy segmented_rt name size - int segmented_rt_name_size = segmented_rt_temp->getName().length(); + int segmented_rt_name_size = (*segmented_rt_temp)->getName().length(); memcpy(buff+serialized_bytes, &segmented_rt_name_size, sizeof(int)); serialized_bytes+=sizeof(int); // copy segmented_rt name - memcpy(buff+serialized_bytes, segmented_rt_temp->getName().c_str(), segmented_rt_name_size*sizeof(char)); + memcpy(buff+serialized_bytes, (*segmented_rt_temp)->getName().c_str(), segmented_rt_name_size*sizeof(char)); serialized_bytes+=segmented_rt_name_size*sizeof(char); // copy field minSizeSeg @@ -1528,12 +1503,12 @@ int TaskSegmentation6::deserialize(char *buff) { deserialized_bytes += sizeof(int); // create the segmented_rt - this->segmented_rt_temp = new DenseDataRegion2D(); + this->segmented_rt_temp = std::make_shared(new DenseDataRegion2D()); // extract segmented_rt id int segmented_rt_id = ((int*)(buff+deserialized_bytes))[0]; - this->segmented_rt_temp->setId(to_string(segmented_rt_id)); - this->segmented_rt_temp->setVersion(segmented_rt_id); + (*this->segmented_rt_temp)->setId(to_string(segmented_rt_id)); + (*this->segmented_rt_temp)->setVersion(segmented_rt_id); deserialized_bytes += sizeof(int); // extract segmented_rt name size @@ -1545,7 +1520,7 @@ int TaskSegmentation6::deserialize(char *buff) { segmented_rt_name[segmented_rt_name_size] = '\0'; memcpy(segmented_rt_name, buff+deserialized_bytes, sizeof(char)*segmented_rt_name_size); deserialized_bytes += sizeof(char)*segmented_rt_name_size; - this->segmented_rt_temp->setName(segmented_rt_name); + (*this->segmented_rt_temp)->setName(segmented_rt_name); // extract field minSizeSeg this->minSizeSeg = ((int*)(buff+deserialized_bytes))[0]; diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp index dda42b6..a9854f4 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp @@ -27,9 +27,10 @@ class Segmentation : public RTPipelineComponentBase { // IMPORTANT: this need to be set during the creation of this object int workflow_id; - list mergable_t1; + std::list mergable_t1; public: + Segmentation(); virtual ~Segmentation(); @@ -53,13 +54,12 @@ friend class TaskSegmentation1; double T2; // intertask arguments - std::vector *bgr; - cv::Mat *rbc; + std::shared_ptr> bgr; + std::shared_ptr rbc; public: - // data regions - DenseDataRegion2D* normalized_rt_temp; + std::shared_ptr normalized_rt_temp; TaskSegmentation0(); TaskSegmentation0(list args, RegionTemplate* inputRt); @@ -90,16 +90,15 @@ friend class TaskSegmentation2; int reconConnectivity; // intertask arguments - std::vector *bgr; - cv::Mat* rc; - cv::Mat* rc_recon; - cv::Mat* rc_open; + std::shared_ptr> bgr; + std::shared_ptr rc; + std::shared_ptr rc_recon; + std::shared_ptr rc_open; // forward intertask arguments - cv::Mat *rbc_fw; + std::shared_ptr rbc_fw; public: - // data regions TaskSegmentation1(); @@ -132,17 +131,16 @@ friend class TaskSegmentation3; unsigned char G1; // intertask arguments - cv::Mat* rc; - cv::Mat* rc_recon; - cv::Mat* rc_open; - cv::Mat* bw1; - cv::Mat* diffIm; + std::shared_ptr rc; + std::shared_ptr rc_recon; + std::shared_ptr rc_open; + std::shared_ptr bw1; + std::shared_ptr diffIm; // forward intertask arguments - cv::Mat *rbc_fw; + std::shared_ptr rbc_fw; public: - // data regions TaskSegmentation2(); @@ -175,15 +173,14 @@ friend class TaskSegmentation4; int maxSize; // intertask arguments - cv::Mat* bw1; - cv::Mat* bw1_t; + std::shared_ptr bw1; + std::shared_ptr bw1_t; // forward intertask arguments - cv::Mat *rbc_fw; - cv::Mat *diffIm_fw; + std::shared_ptr rbc_fw; + std::shared_ptr diffIm_fw; public: - // data regions TaskSegmentation3(); @@ -215,13 +212,12 @@ friend class TaskSegmentation5; unsigned char G2; // intertask arguments - cv::Mat* diffIm; - cv::Mat* bw1_t; - cv::Mat* rbc; - cv::Mat* seg_open; + std::shared_ptr diffIm; + std::shared_ptr bw1_t; + std::shared_ptr rbc; + std::shared_ptr seg_open; public: - // data regions TaskSegmentation4(); @@ -254,16 +250,15 @@ friend class TaskSegmentation6; int watershedConnectivity; // intertask arguments - cv::Mat* seg_open; - cv::Mat* seg_nonoverlap; + std::shared_ptr seg_open; + std::shared_ptr seg_nonoverlap; // forward intertask arguments - cv::Mat *seg_open_fw; + std::shared_ptr seg_open_fw; public: - // data regions - DenseDataRegion2D* normalized_rt_temp; + std::shared_ptr normalized_rt_temp; TaskSegmentation5(); TaskSegmentation5(list args, RegionTemplate* inputRt); @@ -295,13 +290,12 @@ class TaskSegmentation6: public ReusableTask { int fillHolesConnectivity; // intertask arguments - cv::Mat* seg_open; - cv::Mat* seg_nonoverlap; + std::shared_ptr seg_open; + std::shared_ptr seg_nonoverlap; public: - // data regions - DenseDataRegion2D* segmented_rt_temp; + std::shared_ptr segmented_rt_temp; TaskSegmentation6(); TaskSegmentation6(list args, RegionTemplate* inputRt); From b875411960c346c1a0263dc872061425b036a20a Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Mon, 19 Sep 2016 20:25:01 -0300 Subject: [PATCH 43/87] Started new values input implementation. --- .../PipelineManager.cpp | 130 +++++++++++++++++- 1 file changed, 127 insertions(+), 3 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 7dcb892..67d88e3 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -1,6 +1,8 @@ #include +#include #include +#include #include #include #include @@ -102,6 +104,9 @@ void generate_drs(RegionTemplate* rt, const map &expanded_ar void add_arguments_to_stages(map &merged_stages, map &merged_arguments, RegionTemplate *rt); +void generate_pre_defined_stages(FILE* parameters_values_file, map args, + map base_stages, map workflow_outputs, + map expanded_args, map expanded_stages); // Workflow parsing helper functions list line_buffer; @@ -122,12 +127,18 @@ int main(int argc, char* argv[]) { SysEnv sysEnv; // Tell the system which libraries should be used - sysEnv.startupSystem(argc, argv, "libcomponentnsdifffgo.so"); + // sysEnv.startupSystem(argc, argv, "libcomponentnsdifffgo.so"); // region template used by all stages RegionTemplate *rt = new RegionTemplate(); rt->setName("tile"); + // get arguments + if (argc != 1 && argc != 3) { + cout << "usage: ./PipelineRTFS-NS-Diff-FGO [-i DAKOTA_OUTPUT_FILE]" << endl; + return 0; + } + // workflow file FILE* workflow_descriptor = fopen("seg_example.t2flow", "r"); @@ -227,8 +238,11 @@ int main(int argc, char* argv[]) { map expanded_args; map expanded_stages; - expand_stages(args, parameters_values, expanded_args, - base_stages, expanded_stages, workflow_outputs); + // expand_stages(args, parameters_values, expanded_args, + // base_stages, expanded_stages, workflow_outputs); + FILE* parameters_values_file = fopen("dakota_nscale_ps_moat_600_32nodes.out", "r"); + generate_pre_defined_stages(parameters_values_file, args, base_stages, workflow_outputs, + expanded_args, expanded_stages); cout << endl<< "merged: " << endl; for (pair p : expanded_stages) { @@ -719,6 +733,116 @@ void connect_stages_from_file(FILE* workflow_descriptor, /********* Workflow merging and preparation functions **********/ /***************************************************************/ +double str2d (string s) { + istringstream os(s); + double d; + os >> d; + return d; +} + +void generate_pre_defined_stages(FILE* parameters_values_file, map args, + map base_stages, map workflow_outputs, + map expanded_args, map expanded_stages) { + + cout << "[generate_pre_defined_stages]" << endl; + + string pe("Parameters for evaluation"); + + char* line = NULL; + size_t length=0; + + // map of arguments, ordered by name, containing all values of each argument + map> input_arguments; + + list> stages_arguments; + + while(getline(&line, &length, parameters_values_file) != -1) { + // go to the first pe + while (string(line).find(pe) == string::npos) + getline(&line, &length, parameters_values_file); + + list current_args; + + // get all parameters of a workflow + while (string(line).compare("\r\n") != 0) { + getline(&line, &length, parameters_values_file); + + cout << line << endl; + + // get parameter name, value and token + char* token = strtok(line, " \t"); + string value(token); + token = strtok(NULL, " \t"); + string name(token); + token = strtok(NULL, " \t\n"); + string type(token); + + ArgumentBase* arg; + + // verify if the argument is on the map and if it contains the current value + bool found = false; + for (ArgumentBase* a : input_arguments[name]) { + istringstream os(value); + double d; + os >> d; + if (a->getName().compare(name)==0 && a->toString().compare(to_string(d))==0) { + found = true; + arg = a; + } + } + + char* token2; + if (!found) { + switch (get_port_type(type)) { + case parsing::int_t: + arg = new ArgumentInt((int)str2d(value)); + break; + case parsing::string_t: + arg = new ArgumentString(value); + break; + case parsing::float_t: + arg = new ArgumentFloat((float)str2d(value)); + break; + case parsing::float_array_t: + arg = new ArgumentFloatArray(); + token2 = strtok(const_cast(value.c_str()), "[],"); + while (token2 != NULL) { + // convert value + ArgumentFloat f((float)str2d(token2)); + ((ArgumentFloatArray*)arg)->addArgValue(f); + token2 = strtok(NULL, "[],"); + } + break; + default: + exit(-4); + } + arg->setName(name); + arg->setId(new_uid()); + + input_arguments[name].emplace_back(arg); + } + + current_args.emplace_back(arg); + } + + stages_arguments.emplace_back(current_args); + } + + for (list s : stages_arguments) { + cout << "got stage:" << endl; + for (ArgumentBase* a : s) { + cout << "\t" << a->getId() << ":" << a->getName() << " = " << a->toString() << endl; + } + } + + for (pair> p : input_arguments) { + cout << "Argument " << p.first << " with values:" << endl; + for (ArgumentBase* a : p.second) { + cout << "\t" << a->getId() << ": " << a->toString() << endl; + } + } +} + bool all_inps_in(list inps, map> ref) { for (int i : inps) { if (ref.find(i) == ref.end()) From 1970df812503941ad9108ba35c96ce01991f790b Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Wed, 21 Sep 2016 20:15:04 -0300 Subject: [PATCH 44/87] Dakota input file added and partial implementation on PipelineManager. --- .../PipelineManager.cpp | 152 +- .../dakota_nscale_ps_moat_600_32nodes.out | 14718 ++++++++++++++++ 2 files changed, 14832 insertions(+), 38 deletions(-) create mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/dakota_nscale_ps_moat_600_32nodes.out diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 67d88e3..8fac5ac 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include "json/json.h" @@ -740,6 +741,45 @@ double str2d (string s) { return d; } +ArgumentBase* gen_arg(string value, string type) { + ArgumentBase* arg; + char* token2; + switch (get_port_type(type)) { + case parsing::int_t: + arg = new ArgumentInt((int)str2d(value)); + break; + case parsing::string_t: + arg = new ArgumentString(value); + break; + case parsing::float_t: + arg = new ArgumentFloat((float)str2d(value)); + break; + case parsing::float_array_t: + arg = new ArgumentFloatArray(); + token2 = strtok(const_cast(value.c_str()), "[],"); + while (token2 != NULL) { + // convert value + ArgumentFloat f((float)str2d(token2)); + ((ArgumentFloatArray*)arg)->addArgValue(f); + token2 = strtok(NULL, "[],"); + } + break; + default: + exit(-4); + } + return arg; +} + +all_inps_in(p.second->getInputs(), args, input_arguments) + +bool all_inps_in(list inps, map> ref) { + for (int i : inps) { + if (ref.find(i) == ref.end()) + return false; + } + return true; +} + void generate_pre_defined_stages(FILE* parameters_values_file, map args, map base_stages, map workflow_outputs, map expanded_args, map expanded_stages) { @@ -758,20 +798,30 @@ void generate_pre_defined_stages(FILE* parameters_values_file, map current_args; // get all parameters of a workflow - while (string(line).compare("\r\n") != 0) { + while (true) { getline(&line, &length, parameters_values_file); - cout << line << endl; + cout << endl << line; // get parameter name, value and token char* token = strtok(line, " \t"); string value(token); + + // break loop if the line is empty with only a '\n' + if (value.compare("\n")==0) + break; + token = strtok(NULL, " \t"); string name(token); token = strtok(NULL, " \t\n"); @@ -782,40 +832,18 @@ void generate_pre_defined_stages(FILE* parameters_values_file, map> d; - if (a->getName().compare(name)==0 && a->toString().compare(to_string(d))==0) { + ArgumentBase* aa = gen_arg(value, type); + // cout << "[---] comparing " << a->getName() << ":" << a->toString() << " with " << name << ":" << aa->toString() << endl; + if (a->getName().compare(name)==0 && a->toString().compare(aa->toString())==0) { found = true; arg = a; + break; } } char* token2; if (!found) { - switch (get_port_type(type)) { - case parsing::int_t: - arg = new ArgumentInt((int)str2d(value)); - break; - case parsing::string_t: - arg = new ArgumentString(value); - break; - case parsing::float_t: - arg = new ArgumentFloat((float)str2d(value)); - break; - case parsing::float_array_t: - arg = new ArgumentFloatArray(); - token2 = strtok(const_cast(value.c_str()), "[],"); - while (token2 != NULL) { - // convert value - ArgumentFloat f((float)str2d(token2)); - ((ArgumentFloatArray*)arg)->addArgValue(f); - token2 = strtok(NULL, "[],"); - } - break; - default: - exit(-4); - } + arg = gen_arg(value, type); arg->setName(name); arg->setId(new_uid()); @@ -828,19 +856,67 @@ void generate_pre_defined_stages(FILE* parameters_values_file, map s : stages_arguments) { - cout << "got stage:" << endl; - for (ArgumentBase* a : s) { - cout << "\t" << a->getId() << ":" << a->getName() << " = " << a->toString() << endl; - } - } - + // show all generated args for (pair> p : input_arguments) { cout << "Argument " << p.first << " with values:" << endl; for (ArgumentBase* a : p.second) { cout << "\t" << a->getId() << ": " << a->toString() << endl; } } + + // keep expanding stages until there is no stage left + while (base_stages.size() != 0) { + // cout << "base_stages size: " << base_stages.size() << endl; + for (pair p : base_stages) { + // attempt to find a stage witch has all inputs expanded + if (all_inps_in(p.second->getInputs(), args, input_arguments)) { + cout << "stage " << p.second->getName() << " has all inputs" << endl; + + // A list of concatenated arg values, used as a quick way to verify if a stage with + // the same args was already created. + list arg_values_list; + + // expands all input values of stage p + for (list as : stages_arguments) { + PipelineComponentBase* tmp = p.second->clone(); + string arg_values = ""; + // add all arguments from stages_arguments that belong to stage p.second + for (int inp_id : p.second->getInputs()) { + for (ArgumentBase* a : stages_arguments) { + if (args[inp_id]->getName().compare(a->getName())==0 && args[inp_id]->toString().compare(a->toString())) { + arg_values += aa->toString(); + tmp->addArgument(aa); + } + } + } + // verify if there is no other stage with the same values + if (find(arg_values_list.begin(), arg_values_list.end(), arg_values) == arg_values_list.end()) { + arg_values_list.emplace_back(arg_values); + int id = new_uid(); + tmp->setId(id); + expanded_stages[id] = tmp; + } else + delete tmp; + } + + // remove stage descriptor since it was already solved + base_stages.erase(p.first); + } + } + for (map s : expanded_stages) { + cout << s.second->getName() << ":" endl; + for (ArgumentBase* a : s.second->getArguments()) { + cout << "\t" << a->getId() << ":" << a->getName() << " = " << a->toString() << endl; + } + } + } + + for (list s : stages_arguments) { + cout << "got stage:" << endl; + for (ArgumentBase* a : s) { + cout << "\t" << a->getId() << ":" << a->getName() << " = " << a->toString() << endl; + } + } } bool all_inps_in(list inps, map> ref) { diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/dakota_nscale_ps_moat_600_32nodes.out b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/dakota_nscale_ps_moat_600_32nodes.out new file mode 100644 index 0000000..f9ebf88 --- /dev/null +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/dakota_nscale_ps_moat_600_32nodes.out @@ -0,0 +1,14718 @@ +Dakota version 6.3 released November 15 2015. +Subversion revision 3842 built Nov 6 2015 21:42:16. +Running MPI Dakota executable in serial mode. +Start time: Mon Jan 18 12:36:39 2016 + +------------------------ +Begin DAKOTA input file +dakota_nscale_ps_moat.in +------------------------ +# DAKOTA INPUT FILE - dakota_nscale_ps_moat.in +# This is a sample file for parameter study with the nscale segmentation pipeline +# using the PSUADE MOAT method + + +method + psuade_moat + samples = 630 + partitions = 20 + seed = 500 + +model + single + +variables + continuous_design = 15 + lower_bounds 210.0 210.0 210.0 2.5 2.5 5.0 2.0 2.0 900.0 5.0 2.0 900.0 4.0 4.0 4.0 + upper_bounds 240.0 240.0 240.0 7.5 7.5 80.0 40.0 40.0 1500.0 80.0 80.0 1500.0 8.0 8.0 8.0 + descriptors 'blue integer' 'green integer' 'red integer' 'T1 float' 'T2 float' 'G1 integer' 'G2 integer' 'minSize integer' 'maxSize integer' 'minSizePl integer' 'minSizeSeg integer' 'maxSizeSeg integer' 'fillHoles integer' 'recon integer' 'water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string' + +interface, + fork +# asynchronous + analysis_driver = 'simulator_script' + parameters_file = 'params.in' + results_file = 'results.out' + work_directory directory_tag +# uncomment to leave params.in and results.out files in work_dir subdirectories +# named 'workdir' file_save directory_save + + +responses + response_functions = 1 + no_gradients + no_hessians + +--------------------- +End DAKOTA input file +--------------------- + +Using Dakota input file 'dakota_nscale_ps_moat.in' +Writing new restart file dakota.rst + +>>>>> Executing environment. + +>>>>> Running psuade_moat iterator. + +Warning: PSUADE MOAT requires number of samples to be a multiple of num_cdv+1. + Resetting samples to 640. + +Warning: PSUADE MOAT partitions must be odd (even number of levels). + Setting to partitions = 21 (levels = 22). + +PSUADE DACE method = 2568 Samples = 640 Seed (user-specified) = 500 + Partitions = 21 (Levels = 22) + +--------------------- +Begin Evaluation 1 +--------------------- +Parameters for evaluation 1: + 2.2000000000e+02 blue integer + 2.3714285714e+02 green integer + 2.3000000000e+02 red integer + 5.1190476190e+00 T1 float + 5.8333333333e+00 T2 float + 7.6428571429e+01 G1 integer + 2.9142857143e+01 G2 integer + 2.7333333333e+01 minSize integer + 9.0000000000e+02 maxSize integer + 5.5000000000e+01 minSizePl integer + 1.6857142857e+01 minSizeSeg integer + 1.0142857143e+03 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 6.6666666667e+00 recon integer + 4.1904761905e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 1: +Active set vector = { 1 } + 4.8351692300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 2 +--------------------- +Parameters for evaluation 2: + 2.2000000000e+02 blue integer + 2.3714285714e+02 green integer + 2.3000000000e+02 red integer + 5.1190476190e+00 T1 float + 5.8333333333e+00 T2 float + 7.6428571429e+01 G1 integer + 2.9142857143e+01 G2 integer + 2.7333333333e+01 minSize integer + 9.0000000000e+02 maxSize integer + 5.5000000000e+01 minSizePl integer + 1.6857142857e+01 minSizeSeg integer + 1.0142857143e+03 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 6.6666666667e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 2: +Active set vector = { 1 } + 4.7958557100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 3 +--------------------- +Parameters for evaluation 3: + 2.2000000000e+02 blue integer + 2.3714285714e+02 green integer + 2.3000000000e+02 red integer + 5.1190476190e+00 T1 float + 5.8333333333e+00 T2 float + 7.6428571429e+01 G1 integer + 2.9142857143e+01 G2 integer + 7.4285714286e+00 minSize integer + 9.0000000000e+02 maxSize integer + 5.5000000000e+01 minSizePl integer + 1.6857142857e+01 minSizeSeg integer + 1.0142857143e+03 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 6.6666666667e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 3: +Active set vector = { 1 } + 3.7964769100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 4 +--------------------- +Parameters for evaluation 4: + 2.2000000000e+02 blue integer + 2.3714285714e+02 green integer + 2.3000000000e+02 red integer + 5.1190476190e+00 T1 float + 5.8333333333e+00 T2 float + 7.6428571429e+01 G1 integer + 2.9142857143e+01 G2 integer + 7.4285714286e+00 minSize integer + 9.0000000000e+02 maxSize integer + 5.5000000000e+01 minSizePl integer + 1.6857142857e+01 minSizeSeg integer + 1.0142857143e+03 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 4.5714285714e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 4: +Active set vector = { 1 } + 3.3761642400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 5 +--------------------- +Parameters for evaluation 5: + 2.2000000000e+02 blue integer + 2.3714285714e+02 green integer + 2.3000000000e+02 red integer + 5.1190476190e+00 T1 float + 5.8333333333e+00 T2 float + 7.6428571429e+01 G1 integer + 2.9142857143e+01 G2 integer + 7.4285714286e+00 minSize integer + 9.0000000000e+02 maxSize integer + 5.5000000000e+01 minSizePl integer + 5.7714285714e+01 minSizeSeg integer + 1.0142857143e+03 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 4.5714285714e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 5: +Active set vector = { 1 } + 3.4529314500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 6 +--------------------- +Parameters for evaluation 6: + 2.3571428571e+02 blue integer + 2.3714285714e+02 green integer + 2.3000000000e+02 red integer + 5.1190476190e+00 T1 float + 5.8333333333e+00 T2 float + 7.6428571429e+01 G1 integer + 2.9142857143e+01 G2 integer + 7.4285714286e+00 minSize integer + 9.0000000000e+02 maxSize integer + 5.5000000000e+01 minSizePl integer + 5.7714285714e+01 minSizeSeg integer + 1.0142857143e+03 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 4.5714285714e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 6: +Active set vector = { 1 } + 3.4529314500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 7 +--------------------- +Parameters for evaluation 7: + 2.3571428571e+02 blue integer + 2.3714285714e+02 green integer + 2.3000000000e+02 red integer + 5.1190476190e+00 T1 float + 5.8333333333e+00 T2 float + 3.7142857143e+01 G1 integer + 2.9142857143e+01 G2 integer + 7.4285714286e+00 minSize integer + 9.0000000000e+02 maxSize integer + 5.5000000000e+01 minSizePl integer + 5.7714285714e+01 minSizeSeg integer + 1.0142857143e+03 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 4.5714285714e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 7: +Active set vector = { 1 } + 3.0657114900e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 8 +--------------------- +Parameters for evaluation 8: + 2.3571428571e+02 blue integer + 2.3714285714e+02 green integer + 2.3000000000e+02 red integer + 5.1190476190e+00 T1 float + 5.8333333333e+00 T2 float + 3.7142857143e+01 G1 integer + 2.9142857143e+01 G2 integer + 7.4285714286e+00 minSize integer + 1.2142857143e+03 maxSize integer + 5.5000000000e+01 minSizePl integer + 5.7714285714e+01 minSizeSeg integer + 1.0142857143e+03 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 4.5714285714e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 8: +Active set vector = { 1 } + 3.0499782100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 9 +--------------------- +Parameters for evaluation 9: + 2.3571428571e+02 blue integer + 2.3714285714e+02 green integer + 2.3000000000e+02 red integer + 5.1190476190e+00 T1 float + 5.8333333333e+00 T2 float + 3.7142857143e+01 G1 integer + 2.9142857143e+01 G2 integer + 7.4285714286e+00 minSize integer + 1.2142857143e+03 maxSize integer + 5.5000000000e+01 minSizePl integer + 5.7714285714e+01 minSizeSeg integer + 1.3285714286e+03 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 4.5714285714e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 9: +Active set vector = { 1 } + 3.0505543600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 10 +--------------------- +Parameters for evaluation 10: + 2.3571428571e+02 blue integer + 2.3714285714e+02 green integer + 2.3000000000e+02 red integer + 5.1190476190e+00 T1 float + 5.8333333333e+00 T2 float + 3.7142857143e+01 G1 integer + 2.9142857143e+01 G2 integer + 7.4285714286e+00 minSize integer + 1.2142857143e+03 maxSize integer + 5.5000000000e+01 minSizePl integer + 5.7714285714e+01 minSizeSeg integer + 1.3285714286e+03 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 4.5714285714e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 10: +Active set vector = { 1 } + 3.0506628100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 11 +--------------------- +Parameters for evaluation 11: + 2.3571428571e+02 blue integer + 2.3714285714e+02 green integer + 2.3000000000e+02 red integer + 5.1190476190e+00 T1 float + 5.8333333333e+00 T2 float + 3.7142857143e+01 G1 integer + 2.9142857143e+01 G2 integer + 7.4285714286e+00 minSize integer + 1.2142857143e+03 maxSize integer + 1.5714285714e+01 minSizePl integer + 5.7714285714e+01 minSizeSeg integer + 1.3285714286e+03 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 4.5714285714e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 11: +Active set vector = { 1 } + 2.9959738900e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 12 +--------------------- +Parameters for evaluation 12: + 2.3571428571e+02 blue integer + 2.2142857143e+02 green integer + 2.3000000000e+02 red integer + 5.1190476190e+00 T1 float + 5.8333333333e+00 T2 float + 3.7142857143e+01 G1 integer + 2.9142857143e+01 G2 integer + 7.4285714286e+00 minSize integer + 1.2142857143e+03 maxSize integer + 1.5714285714e+01 minSizePl integer + 5.7714285714e+01 minSizeSeg integer + 1.3285714286e+03 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 4.5714285714e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 12: +Active set vector = { 1 } + 2.9959738900e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 13 +--------------------- +Parameters for evaluation 13: + 2.3571428571e+02 blue integer + 2.2142857143e+02 green integer + 2.1428571429e+02 red integer + 5.1190476190e+00 T1 float + 5.8333333333e+00 T2 float + 3.7142857143e+01 G1 integer + 2.9142857143e+01 G2 integer + 7.4285714286e+00 minSize integer + 1.2142857143e+03 maxSize integer + 1.5714285714e+01 minSizePl integer + 5.7714285714e+01 minSizeSeg integer + 1.3285714286e+03 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 4.5714285714e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 13: +Active set vector = { 1 } + 2.9959738900e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 14 +--------------------- +Parameters for evaluation 14: + 2.3571428571e+02 blue integer + 2.2142857143e+02 green integer + 2.1428571429e+02 red integer + 2.5000000000e+00 T1 float + 5.8333333333e+00 T2 float + 3.7142857143e+01 G1 integer + 2.9142857143e+01 G2 integer + 7.4285714286e+00 minSize integer + 1.2142857143e+03 maxSize integer + 1.5714285714e+01 minSizePl integer + 5.7714285714e+01 minSizeSeg integer + 1.3285714286e+03 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 4.5714285714e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 14: +Active set vector = { 1 } + 2.9959738900e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 15 +--------------------- +Parameters for evaluation 15: + 2.3571428571e+02 blue integer + 2.2142857143e+02 green integer + 2.1428571429e+02 red integer + 2.5000000000e+00 T1 float + 5.8333333333e+00 T2 float + 3.7142857143e+01 G1 integer + 9.2380952381e+00 G2 integer + 7.4285714286e+00 minSize integer + 1.2142857143e+03 maxSize integer + 1.5714285714e+01 minSizePl integer + 5.7714285714e+01 minSizeSeg integer + 1.3285714286e+03 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 4.5714285714e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 15: +Active set vector = { 1 } + 3.9134950500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 16 +--------------------- +Parameters for evaluation 16: + 2.3571428571e+02 blue integer + 2.2142857143e+02 green integer + 2.1428571429e+02 red integer + 2.5000000000e+00 T1 float + 3.2142857143e+00 T2 float + 3.7142857143e+01 G1 integer + 9.2380952381e+00 G2 integer + 7.4285714286e+00 minSize integer + 1.2142857143e+03 maxSize integer + 1.5714285714e+01 minSizePl integer + 5.7714285714e+01 minSizeSeg integer + 1.3285714286e+03 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 4.5714285714e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 16: +Active set vector = { 1 } + 3.7573355100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 17 +--------------------- +Parameters for evaluation 17: + 2.1428571429e+02 blue integer + 2.1714285714e+02 green integer + 2.2142857143e+02 red integer + 4.6428571429e+00 T1 float + 6.5476190476e+00 T2 float + 8.5714285714e+00 G1 integer + 1.1047619048e+01 G2 integer + 1.8285714286e+01 minSize integer + 1.5000000000e+03 maxSize integer + 4.4285714286e+01 minSizePl integer + 7.6285714286e+01 minSizeSeg integer + 1.2428571429e+03 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 8.0000000000e+00 recon integer + 5.9047619048e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 17: +Active set vector = { 1 } + 3.6481518000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 18 +--------------------- +Parameters for evaluation 18: + 2.1428571429e+02 blue integer + 2.1714285714e+02 green integer + 2.2142857143e+02 red integer + 4.6428571429e+00 T1 float + 6.5476190476e+00 T2 float + 8.5714285714e+00 G1 integer + 1.1047619048e+01 G2 integer + 3.8190476190e+01 minSize integer + 1.5000000000e+03 maxSize integer + 4.4285714286e+01 minSizePl integer + 7.6285714286e+01 minSizeSeg integer + 1.2428571429e+03 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 8.0000000000e+00 recon integer + 5.9047619048e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 18: +Active set vector = { 1 } + 3.6481518000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 19 +--------------------- +Parameters for evaluation 19: + 2.1428571429e+02 blue integer + 2.1714285714e+02 green integer + 2.2142857143e+02 red integer + 7.2619047619e+00 T1 float + 6.5476190476e+00 T2 float + 8.5714285714e+00 G1 integer + 1.1047619048e+01 G2 integer + 3.8190476190e+01 minSize integer + 1.5000000000e+03 maxSize integer + 4.4285714286e+01 minSizePl integer + 7.6285714286e+01 minSizeSeg integer + 1.2428571429e+03 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 8.0000000000e+00 recon integer + 5.9047619048e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 19: +Active set vector = { 1 } + 3.6485548600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 20 +--------------------- +Parameters for evaluation 20: + 2.1428571429e+02 blue integer + 2.1714285714e+02 green integer + 2.2142857143e+02 red integer + 7.2619047619e+00 T1 float + 6.5476190476e+00 T2 float + 8.5714285714e+00 G1 integer + 1.1047619048e+01 G2 integer + 3.8190476190e+01 minSize integer + 1.5000000000e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 7.6285714286e+01 minSizeSeg integer + 1.2428571429e+03 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 8.0000000000e+00 recon integer + 5.9047619048e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 20: +Active set vector = { 1 } + 3.6721923300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 21 +--------------------- +Parameters for evaluation 21: + 2.1428571429e+02 blue integer + 2.1714285714e+02 green integer + 2.2142857143e+02 red integer + 7.2619047619e+00 T1 float + 6.5476190476e+00 T2 float + 8.5714285714e+00 G1 integer + 1.1047619048e+01 G2 integer + 3.8190476190e+01 minSize integer + 1.5000000000e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 7.6285714286e+01 minSizeSeg integer + 9.2857142857e+02 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 8.0000000000e+00 recon integer + 5.9047619048e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 21: +Active set vector = { 1 } + 3.6893387300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 22 +--------------------- +Parameters for evaluation 22: + 2.1428571429e+02 blue integer + 2.1714285714e+02 green integer + 2.2142857143e+02 red integer + 7.2619047619e+00 T1 float + 6.5476190476e+00 T2 float + 8.5714285714e+00 G1 integer + 1.1047619048e+01 G2 integer + 3.8190476190e+01 minSize integer + 1.5000000000e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 7.6285714286e+01 minSizeSeg integer + 9.2857142857e+02 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 8.0000000000e+00 recon integer + 8.0000000000e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 22: +Active set vector = { 1 } + 3.5810104800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 23 +--------------------- +Parameters for evaluation 23: + 2.1428571429e+02 blue integer + 2.1714285714e+02 green integer + 2.2142857143e+02 red integer + 7.2619047619e+00 T1 float + 6.5476190476e+00 T2 float + 8.5714285714e+00 G1 integer + 1.1047619048e+01 G2 integer + 3.8190476190e+01 minSize integer + 1.5000000000e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 7.6285714286e+01 minSizeSeg integer + 9.2857142857e+02 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 5.9047619048e+00 recon integer + 8.0000000000e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 23: +Active set vector = { 1 } + 5.0191888500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 24 +--------------------- +Parameters for evaluation 24: + 2.1428571429e+02 blue integer + 2.1714285714e+02 green integer + 2.2142857143e+02 red integer + 7.2619047619e+00 T1 float + 3.9285714286e+00 T2 float + 8.5714285714e+00 G1 integer + 1.1047619048e+01 G2 integer + 3.8190476190e+01 minSize integer + 1.5000000000e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 7.6285714286e+01 minSizeSeg integer + 9.2857142857e+02 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 5.9047619048e+00 recon integer + 8.0000000000e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 24: +Active set vector = { 1 } + 4.9958261200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 25 +--------------------- +Parameters for evaluation 25: + 2.1428571429e+02 blue integer + 2.1714285714e+02 green integer + 2.2142857143e+02 red integer + 7.2619047619e+00 T1 float + 3.9285714286e+00 T2 float + 8.5714285714e+00 G1 integer + 1.1047619048e+01 G2 integer + 3.8190476190e+01 minSize integer + 1.5000000000e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 3.5428571429e+01 minSizeSeg integer + 9.2857142857e+02 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 5.9047619048e+00 recon integer + 8.0000000000e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 25: +Active set vector = { 1 } + 5.3772396400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 26 +--------------------- +Parameters for evaluation 26: + 2.1428571429e+02 blue integer + 2.3285714286e+02 green integer + 2.2142857143e+02 red integer + 7.2619047619e+00 T1 float + 3.9285714286e+00 T2 float + 8.5714285714e+00 G1 integer + 1.1047619048e+01 G2 integer + 3.8190476190e+01 minSize integer + 1.5000000000e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 3.5428571429e+01 minSizeSeg integer + 9.2857142857e+02 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 5.9047619048e+00 recon integer + 8.0000000000e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 26: +Active set vector = { 1 } + 5.3772428400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 27 +--------------------- +Parameters for evaluation 27: + 2.1428571429e+02 blue integer + 2.3285714286e+02 green integer + 2.3714285714e+02 red integer + 7.2619047619e+00 T1 float + 3.9285714286e+00 T2 float + 8.5714285714e+00 G1 integer + 1.1047619048e+01 G2 integer + 3.8190476190e+01 minSize integer + 1.5000000000e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 3.5428571429e+01 minSizeSeg integer + 9.2857142857e+02 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 5.9047619048e+00 recon integer + 8.0000000000e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 27: +Active set vector = { 1 } + 5.3772428400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 28 +--------------------- +Parameters for evaluation 28: + 2.3000000000e+02 blue integer + 2.3285714286e+02 green integer + 2.3714285714e+02 red integer + 7.2619047619e+00 T1 float + 3.9285714286e+00 T2 float + 8.5714285714e+00 G1 integer + 1.1047619048e+01 G2 integer + 3.8190476190e+01 minSize integer + 1.5000000000e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 3.5428571429e+01 minSizeSeg integer + 9.2857142857e+02 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 5.9047619048e+00 recon integer + 8.0000000000e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 28: +Active set vector = { 1 } + 5.3772428400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 29 +--------------------- +Parameters for evaluation 29: + 2.3000000000e+02 blue integer + 2.3285714286e+02 green integer + 2.3714285714e+02 red integer + 7.2619047619e+00 T1 float + 3.9285714286e+00 T2 float + 8.5714285714e+00 G1 integer + 1.1047619048e+01 G2 integer + 3.8190476190e+01 minSize integer + 1.5000000000e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 3.5428571429e+01 minSizeSeg integer + 9.2857142857e+02 maxSizeSeg integer + 6.4761904762e+00 fillHoles integer + 5.9047619048e+00 recon integer + 8.0000000000e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 29: +Active set vector = { 1 } + 5.3358350500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 30 +--------------------- +Parameters for evaluation 30: + 2.3000000000e+02 blue integer + 2.3285714286e+02 green integer + 2.3714285714e+02 red integer + 7.2619047619e+00 T1 float + 3.9285714286e+00 T2 float + 8.5714285714e+00 G1 integer + 3.0952380952e+01 G2 integer + 3.8190476190e+01 minSize integer + 1.5000000000e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 3.5428571429e+01 minSizeSeg integer + 9.2857142857e+02 maxSizeSeg integer + 6.4761904762e+00 fillHoles integer + 5.9047619048e+00 recon integer + 8.0000000000e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 30: +Active set vector = { 1 } + 4.6312778500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 31 +--------------------- +Parameters for evaluation 31: + 2.3000000000e+02 blue integer + 2.3285714286e+02 green integer + 2.3714285714e+02 red integer + 7.2619047619e+00 T1 float + 3.9285714286e+00 T2 float + 8.5714285714e+00 G1 integer + 3.0952380952e+01 G2 integer + 3.8190476190e+01 minSize integer + 1.1857142857e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 3.5428571429e+01 minSizeSeg integer + 9.2857142857e+02 maxSizeSeg integer + 6.4761904762e+00 fillHoles integer + 5.9047619048e+00 recon integer + 8.0000000000e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 31: +Active set vector = { 1 } + 4.9642346000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 32 +--------------------- +Parameters for evaluation 32: + 2.3000000000e+02 blue integer + 2.3285714286e+02 green integer + 2.3714285714e+02 red integer + 7.2619047619e+00 T1 float + 3.9285714286e+00 T2 float + 4.7857142857e+01 G1 integer + 3.0952380952e+01 G2 integer + 3.8190476190e+01 minSize integer + 1.1857142857e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 3.5428571429e+01 minSizeSeg integer + 9.2857142857e+02 maxSizeSeg integer + 6.4761904762e+00 fillHoles integer + 5.9047619048e+00 recon integer + 8.0000000000e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 32: +Active set vector = { 1 } + 3.1293123600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 33 +--------------------- +Parameters for evaluation 33: + 2.1428571429e+02 blue integer + 2.2571428571e+02 green integer + 2.2714285714e+02 red integer + 6.5476190476e+00 T1 float + 4.6428571429e+00 T2 float + 3.3571428571e+01 G1 integer + 2.9142857143e+01 G2 integer + 2.0000000000e+00 minSize integer + 9.2857142857e+02 maxSize integer + 3.7142857143e+01 minSizePl integer + 4.6571428571e+01 minSizeSeg integer + 1.0428571429e+03 maxSizeSeg integer + 5.3333333333e+00 fillHoles integer + 5.1428571429e+00 recon integer + 4.1904761905e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 33: +Active set vector = { 1 } + 3.0668021500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 34 +--------------------- +Parameters for evaluation 34: + 2.1428571429e+02 blue integer + 2.2571428571e+02 green integer + 2.2714285714e+02 red integer + 6.5476190476e+00 T1 float + 4.6428571429e+00 T2 float + 7.2857142857e+01 G1 integer + 2.9142857143e+01 G2 integer + 2.0000000000e+00 minSize integer + 9.2857142857e+02 maxSize integer + 3.7142857143e+01 minSizePl integer + 4.6571428571e+01 minSizeSeg integer + 1.0428571429e+03 maxSizeSeg integer + 5.3333333333e+00 fillHoles integer + 5.1428571429e+00 recon integer + 4.1904761905e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 34: +Active set vector = { 1 } + 3.1146309200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 35 +--------------------- +Parameters for evaluation 35: + 2.1428571429e+02 blue integer + 2.2571428571e+02 green integer + 2.2714285714e+02 red integer + 6.5476190476e+00 T1 float + 4.6428571429e+00 T2 float + 7.2857142857e+01 G1 integer + 2.9142857143e+01 G2 integer + 2.0000000000e+00 minSize integer + 9.2857142857e+02 maxSize integer + 3.7142857143e+01 minSizePl integer + 4.6571428571e+01 minSizeSeg integer + 1.0428571429e+03 maxSizeSeg integer + 5.3333333333e+00 fillHoles integer + 7.2380952381e+00 recon integer + 4.1904761905e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 35: +Active set vector = { 1 } + 3.5105010800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 36 +--------------------- +Parameters for evaluation 36: + 2.1428571429e+02 blue integer + 2.2571428571e+02 green integer + 2.2714285714e+02 red integer + 6.5476190476e+00 T1 float + 7.2619047619e+00 T2 float + 7.2857142857e+01 G1 integer + 2.9142857143e+01 G2 integer + 2.0000000000e+00 minSize integer + 9.2857142857e+02 maxSize integer + 3.7142857143e+01 minSizePl integer + 4.6571428571e+01 minSizeSeg integer + 1.0428571429e+03 maxSizeSeg integer + 5.3333333333e+00 fillHoles integer + 7.2380952381e+00 recon integer + 4.1904761905e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 36: +Active set vector = { 1 } + 3.5162975400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 37 +--------------------- +Parameters for evaluation 37: + 2.3000000000e+02 blue integer + 2.2571428571e+02 green integer + 2.2714285714e+02 red integer + 6.5476190476e+00 T1 float + 7.2619047619e+00 T2 float + 7.2857142857e+01 G1 integer + 2.9142857143e+01 G2 integer + 2.0000000000e+00 minSize integer + 9.2857142857e+02 maxSize integer + 3.7142857143e+01 minSizePl integer + 4.6571428571e+01 minSizeSeg integer + 1.0428571429e+03 maxSizeSeg integer + 5.3333333333e+00 fillHoles integer + 7.2380952381e+00 recon integer + 4.1904761905e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 37: +Active set vector = { 1 } + 3.5162975400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 38 +--------------------- +Parameters for evaluation 38: + 2.3000000000e+02 blue integer + 2.1000000000e+02 green integer + 2.2714285714e+02 red integer + 6.5476190476e+00 T1 float + 7.2619047619e+00 T2 float + 7.2857142857e+01 G1 integer + 2.9142857143e+01 G2 integer + 2.0000000000e+00 minSize integer + 9.2857142857e+02 maxSize integer + 3.7142857143e+01 minSizePl integer + 4.6571428571e+01 minSizeSeg integer + 1.0428571429e+03 maxSizeSeg integer + 5.3333333333e+00 fillHoles integer + 7.2380952381e+00 recon integer + 4.1904761905e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 38: +Active set vector = { 1 } + 3.5162975400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 39 +--------------------- +Parameters for evaluation 39: + 2.3000000000e+02 blue integer + 2.1000000000e+02 green integer + 2.2714285714e+02 red integer + 6.5476190476e+00 T1 float + 7.2619047619e+00 T2 float + 7.2857142857e+01 G1 integer + 2.9142857143e+01 G2 integer + 2.0000000000e+00 minSize integer + 9.2857142857e+02 maxSize integer + 3.7142857143e+01 minSizePl integer + 4.6571428571e+01 minSizeSeg integer + 1.0428571429e+03 maxSizeSeg integer + 7.4285714286e+00 fillHoles integer + 7.2380952381e+00 recon integer + 4.1904761905e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 39: +Active set vector = { 1 } + 3.5168342600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 40 +--------------------- +Parameters for evaluation 40: + 2.3000000000e+02 blue integer + 2.1000000000e+02 green integer + 2.2714285714e+02 red integer + 6.5476190476e+00 T1 float + 7.2619047619e+00 T2 float + 7.2857142857e+01 G1 integer + 2.9142857143e+01 G2 integer + 2.0000000000e+00 minSize integer + 9.2857142857e+02 maxSize integer + 3.7142857143e+01 minSizePl integer + 4.6571428571e+01 minSizeSeg integer + 1.3571428571e+03 maxSizeSeg integer + 7.4285714286e+00 fillHoles integer + 7.2380952381e+00 recon integer + 4.1904761905e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 40: +Active set vector = { 1 } + 3.5184267200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 41 +--------------------- +Parameters for evaluation 41: + 2.3000000000e+02 blue integer + 2.1000000000e+02 green integer + 2.1142857143e+02 red integer + 6.5476190476e+00 T1 float + 7.2619047619e+00 T2 float + 7.2857142857e+01 G1 integer + 2.9142857143e+01 G2 integer + 2.0000000000e+00 minSize integer + 9.2857142857e+02 maxSize integer + 3.7142857143e+01 minSizePl integer + 4.6571428571e+01 minSizeSeg integer + 1.3571428571e+03 maxSizeSeg integer + 7.4285714286e+00 fillHoles integer + 7.2380952381e+00 recon integer + 4.1904761905e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 41: +Active set vector = { 1 } + 3.5184267200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 42 +--------------------- +Parameters for evaluation 42: + 2.3000000000e+02 blue integer + 2.1000000000e+02 green integer + 2.1142857143e+02 red integer + 6.5476190476e+00 T1 float + 7.2619047619e+00 T2 float + 7.2857142857e+01 G1 integer + 2.9142857143e+01 G2 integer + 2.0000000000e+00 minSize integer + 9.2857142857e+02 maxSize integer + 7.6428571429e+01 minSizePl integer + 4.6571428571e+01 minSizeSeg integer + 1.3571428571e+03 maxSizeSeg integer + 7.4285714286e+00 fillHoles integer + 7.2380952381e+00 recon integer + 4.1904761905e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 42: +Active set vector = { 1 } + 3.7982736400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 43 +--------------------- +Parameters for evaluation 43: + 2.3000000000e+02 blue integer + 2.1000000000e+02 green integer + 2.1142857143e+02 red integer + 3.9285714286e+00 T1 float + 7.2619047619e+00 T2 float + 7.2857142857e+01 G1 integer + 2.9142857143e+01 G2 integer + 2.0000000000e+00 minSize integer + 9.2857142857e+02 maxSize integer + 7.6428571429e+01 minSizePl integer + 4.6571428571e+01 minSizeSeg integer + 1.3571428571e+03 maxSizeSeg integer + 7.4285714286e+00 fillHoles integer + 7.2380952381e+00 recon integer + 4.1904761905e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 43: +Active set vector = { 1 } + 3.7982736400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 44 +--------------------- +Parameters for evaluation 44: + 2.3000000000e+02 blue integer + 2.1000000000e+02 green integer + 2.1142857143e+02 red integer + 3.9285714286e+00 T1 float + 7.2619047619e+00 T2 float + 7.2857142857e+01 G1 integer + 2.9142857143e+01 G2 integer + 2.0000000000e+00 minSize integer + 9.2857142857e+02 maxSize integer + 7.6428571429e+01 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 1.3571428571e+03 maxSizeSeg integer + 7.4285714286e+00 fillHoles integer + 7.2380952381e+00 recon integer + 4.1904761905e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 44: +Active set vector = { 1 } + 3.7220017000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 45 +--------------------- +Parameters for evaluation 45: + 2.3000000000e+02 blue integer + 2.1000000000e+02 green integer + 2.1142857143e+02 red integer + 3.9285714286e+00 T1 float + 7.2619047619e+00 T2 float + 7.2857142857e+01 G1 integer + 2.9142857143e+01 G2 integer + 2.0000000000e+00 minSize integer + 1.2428571429e+03 maxSize integer + 7.6428571429e+01 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 1.3571428571e+03 maxSizeSeg integer + 7.4285714286e+00 fillHoles integer + 7.2380952381e+00 recon integer + 4.1904761905e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 45: +Active set vector = { 1 } + 3.7219762500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 46 +--------------------- +Parameters for evaluation 46: + 2.3000000000e+02 blue integer + 2.1000000000e+02 green integer + 2.1142857143e+02 red integer + 3.9285714286e+00 T1 float + 7.2619047619e+00 T2 float + 7.2857142857e+01 G1 integer + 2.9142857143e+01 G2 integer + 2.0000000000e+00 minSize integer + 1.2428571429e+03 maxSize integer + 7.6428571429e+01 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 1.3571428571e+03 maxSizeSeg integer + 7.4285714286e+00 fillHoles integer + 7.2380952381e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 46: +Active set vector = { 1 } + 3.6727717300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 47 +--------------------- +Parameters for evaluation 47: + 2.3000000000e+02 blue integer + 2.1000000000e+02 green integer + 2.1142857143e+02 red integer + 3.9285714286e+00 T1 float + 7.2619047619e+00 T2 float + 7.2857142857e+01 G1 integer + 9.2380952381e+00 G2 integer + 2.0000000000e+00 minSize integer + 1.2428571429e+03 maxSize integer + 7.6428571429e+01 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 1.3571428571e+03 maxSizeSeg integer + 7.4285714286e+00 fillHoles integer + 7.2380952381e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 47: +Active set vector = { 1 } + 2.9621689300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 48 +--------------------- +Parameters for evaluation 48: + 2.3000000000e+02 blue integer + 2.1000000000e+02 green integer + 2.1142857143e+02 red integer + 3.9285714286e+00 T1 float + 7.2619047619e+00 T2 float + 7.2857142857e+01 G1 integer + 9.2380952381e+00 G2 integer + 2.1904761905e+01 minSize integer + 1.2428571429e+03 maxSize integer + 7.6428571429e+01 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 1.3571428571e+03 maxSizeSeg integer + 7.4285714286e+00 fillHoles integer + 7.2380952381e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 48: +Active set vector = { 1 } + 3.8433809500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 49 +--------------------- +Parameters for evaluation 49: + 2.3142857143e+02 blue integer + 2.3571428571e+02 green integer + 2.3714285714e+02 red integer + 5.1190476190e+00 T1 float + 4.1666666667e+00 T2 float + 5.8571428571e+01 G1 integer + 4.0000000000e+01 G2 integer + 4.0000000000e+01 minSize integer + 1.4428571429e+03 maxSize integer + 4.7857142857e+01 minSizePl integer + 7.6285714286e+01 minSizeSeg integer + 1.2714285714e+03 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 6.2857142857e+00 recon integer + 5.9047619048e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 49: +Active set vector = { 1 } + 5.3603877000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 50 +--------------------- +Parameters for evaluation 50: + 2.3142857143e+02 blue integer + 2.3571428571e+02 green integer + 2.3714285714e+02 red integer + 5.1190476190e+00 T1 float + 4.1666666667e+00 T2 float + 5.8571428571e+01 G1 integer + 4.0000000000e+01 G2 integer + 4.0000000000e+01 minSize integer + 1.4428571429e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 7.6285714286e+01 minSizeSeg integer + 1.2714285714e+03 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 6.2857142857e+00 recon integer + 5.9047619048e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 50: +Active set vector = { 1 } + 5.3454902600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 51 +--------------------- +Parameters for evaluation 51: + 2.3142857143e+02 blue integer + 2.3571428571e+02 green integer + 2.3714285714e+02 red integer + 5.1190476190e+00 T1 float + 4.1666666667e+00 T2 float + 5.8571428571e+01 G1 integer + 4.0000000000e+01 G2 integer + 4.0000000000e+01 minSize integer + 1.4428571429e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 7.6285714286e+01 minSizeSeg integer + 1.2714285714e+03 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 4.1904761905e+00 recon integer + 5.9047619048e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 51: +Active set vector = { 1 } + 4.9521069200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 52 +--------------------- +Parameters for evaluation 52: + 2.3142857143e+02 blue integer + 2.3571428571e+02 green integer + 2.3714285714e+02 red integer + 5.1190476190e+00 T1 float + 4.1666666667e+00 T2 float + 5.8571428571e+01 G1 integer + 4.0000000000e+01 G2 integer + 4.0000000000e+01 minSize integer + 1.4428571429e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 7.6285714286e+01 minSizeSeg integer + 1.2714285714e+03 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 4.1904761905e+00 recon integer + 8.0000000000e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 52: +Active set vector = { 1 } + 4.7459727500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 53 +--------------------- +Parameters for evaluation 53: + 2.3142857143e+02 blue integer + 2.3571428571e+02 green integer + 2.3714285714e+02 red integer + 2.5000000000e+00 T1 float + 4.1666666667e+00 T2 float + 5.8571428571e+01 G1 integer + 4.0000000000e+01 G2 integer + 4.0000000000e+01 minSize integer + 1.4428571429e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 7.6285714286e+01 minSizeSeg integer + 1.2714285714e+03 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 4.1904761905e+00 recon integer + 8.0000000000e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 53: +Active set vector = { 1 } + 4.7462487000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 54 +--------------------- +Parameters for evaluation 54: + 2.3142857143e+02 blue integer + 2.3571428571e+02 green integer + 2.3714285714e+02 red integer + 2.5000000000e+00 T1 float + 4.1666666667e+00 T2 float + 1.9285714286e+01 G1 integer + 4.0000000000e+01 G2 integer + 4.0000000000e+01 minSize integer + 1.4428571429e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 7.6285714286e+01 minSizeSeg integer + 1.2714285714e+03 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 4.1904761905e+00 recon integer + 8.0000000000e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 54: +Active set vector = { 1 } + 4.7450943900e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 55 +--------------------- +Parameters for evaluation 55: + 2.3142857143e+02 blue integer + 2.3571428571e+02 green integer + 2.3714285714e+02 red integer + 2.5000000000e+00 T1 float + 4.1666666667e+00 T2 float + 1.9285714286e+01 G1 integer + 4.0000000000e+01 G2 integer + 4.0000000000e+01 minSize integer + 1.4428571429e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 7.6285714286e+01 minSizeSeg integer + 9.5714285714e+02 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 4.1904761905e+00 recon integer + 8.0000000000e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 55: +Active set vector = { 1 } + 4.7451510100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 56 +--------------------- +Parameters for evaluation 56: + 2.3142857143e+02 blue integer + 2.3571428571e+02 green integer + 2.3714285714e+02 red integer + 2.5000000000e+00 T1 float + 4.1666666667e+00 T2 float + 1.9285714286e+01 G1 integer + 4.0000000000e+01 G2 integer + 4.0000000000e+01 minSize integer + 1.4428571429e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 7.6285714286e+01 minSizeSeg integer + 9.5714285714e+02 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 4.1904761905e+00 recon integer + 8.0000000000e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 56: +Active set vector = { 1 } + 4.7392140100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 57 +--------------------- +Parameters for evaluation 57: + 2.3142857143e+02 blue integer + 2.3571428571e+02 green integer + 2.3714285714e+02 red integer + 2.5000000000e+00 T1 float + 4.1666666667e+00 T2 float + 1.9285714286e+01 G1 integer + 4.0000000000e+01 G2 integer + 4.0000000000e+01 minSize integer + 1.1285714286e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 7.6285714286e+01 minSizeSeg integer + 9.5714285714e+02 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 4.1904761905e+00 recon integer + 8.0000000000e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 57: +Active set vector = { 1 } + 4.8551825500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 58 +--------------------- +Parameters for evaluation 58: + 2.1571428571e+02 blue integer + 2.3571428571e+02 green integer + 2.3714285714e+02 red integer + 2.5000000000e+00 T1 float + 4.1666666667e+00 T2 float + 1.9285714286e+01 G1 integer + 4.0000000000e+01 G2 integer + 4.0000000000e+01 minSize integer + 1.1285714286e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 7.6285714286e+01 minSizeSeg integer + 9.5714285714e+02 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 4.1904761905e+00 recon integer + 8.0000000000e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 58: +Active set vector = { 1 } + 4.8551825500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 59 +--------------------- +Parameters for evaluation 59: + 2.1571428571e+02 blue integer + 2.3571428571e+02 green integer + 2.3714285714e+02 red integer + 2.5000000000e+00 T1 float + 4.1666666667e+00 T2 float + 1.9285714286e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.0095238095e+01 minSize integer + 1.1285714286e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 7.6285714286e+01 minSizeSeg integer + 9.5714285714e+02 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 4.1904761905e+00 recon integer + 8.0000000000e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 59: +Active set vector = { 1 } + 4.8550122000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 60 +--------------------- +Parameters for evaluation 60: + 2.1571428571e+02 blue integer + 2.3571428571e+02 green integer + 2.3714285714e+02 red integer + 2.5000000000e+00 T1 float + 6.7857142857e+00 T2 float + 1.9285714286e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.0095238095e+01 minSize integer + 1.1285714286e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 7.6285714286e+01 minSizeSeg integer + 9.5714285714e+02 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 4.1904761905e+00 recon integer + 8.0000000000e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 60: +Active set vector = { 1 } + 4.8582458600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 61 +--------------------- +Parameters for evaluation 61: + 2.1571428571e+02 blue integer + 2.3571428571e+02 green integer + 2.3714285714e+02 red integer + 2.5000000000e+00 T1 float + 6.7857142857e+00 T2 float + 1.9285714286e+01 G1 integer + 2.0095238095e+01 G2 integer + 2.0095238095e+01 minSize integer + 1.1285714286e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 7.6285714286e+01 minSizeSeg integer + 9.5714285714e+02 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 4.1904761905e+00 recon integer + 8.0000000000e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 61: +Active set vector = { 1 } + 2.9564958400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 62 +--------------------- +Parameters for evaluation 62: + 2.1571428571e+02 blue integer + 2.3571428571e+02 green integer + 2.2142857143e+02 red integer + 2.5000000000e+00 T1 float + 6.7857142857e+00 T2 float + 1.9285714286e+01 G1 integer + 2.0095238095e+01 G2 integer + 2.0095238095e+01 minSize integer + 1.1285714286e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 7.6285714286e+01 minSizeSeg integer + 9.5714285714e+02 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 4.1904761905e+00 recon integer + 8.0000000000e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 62: +Active set vector = { 1 } + 2.9564958400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 63 +--------------------- +Parameters for evaluation 63: + 2.1571428571e+02 blue integer + 2.2000000000e+02 green integer + 2.2142857143e+02 red integer + 2.5000000000e+00 T1 float + 6.7857142857e+00 T2 float + 1.9285714286e+01 G1 integer + 2.0095238095e+01 G2 integer + 2.0095238095e+01 minSize integer + 1.1285714286e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 7.6285714286e+01 minSizeSeg integer + 9.5714285714e+02 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 4.1904761905e+00 recon integer + 8.0000000000e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 63: +Active set vector = { 1 } + 2.9564958400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 64 +--------------------- +Parameters for evaluation 64: + 2.1571428571e+02 blue integer + 2.2000000000e+02 green integer + 2.2142857143e+02 red integer + 2.5000000000e+00 T1 float + 6.7857142857e+00 T2 float + 1.9285714286e+01 G1 integer + 2.0095238095e+01 G2 integer + 2.0095238095e+01 minSize integer + 1.1285714286e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 3.5428571429e+01 minSizeSeg integer + 9.5714285714e+02 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 4.1904761905e+00 recon integer + 8.0000000000e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 64: +Active set vector = { 1 } + 2.6490519300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 65 +--------------------- +Parameters for evaluation 65: + 2.2000000000e+02 blue integer + 2.1142857143e+02 green integer + 2.1000000000e+02 red integer + 3.6904761905e+00 T1 float + 5.3571428571e+00 T2 float + 3.3571428571e+01 G1 integer + 2.3714285714e+01 G2 integer + 2.1904761905e+01 minSize integer + 9.8571428571e+02 maxSize integer + 8.0000000000e+01 minSizePl integer + 5.7714285714e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 4.3809523810e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 65: +Active set vector = { 1 } + 2.8771799200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 66 +--------------------- +Parameters for evaluation 66: + 2.2000000000e+02 blue integer + 2.1142857143e+02 green integer + 2.1000000000e+02 red integer + 6.3095238095e+00 T1 float + 5.3571428571e+00 T2 float + 3.3571428571e+01 G1 integer + 2.3714285714e+01 G2 integer + 2.1904761905e+01 minSize integer + 9.8571428571e+02 maxSize integer + 8.0000000000e+01 minSizePl integer + 5.7714285714e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 4.3809523810e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 66: +Active set vector = { 1 } + 2.8780633100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 67 +--------------------- +Parameters for evaluation 67: + 2.2000000000e+02 blue integer + 2.1142857143e+02 green integer + 2.1000000000e+02 red integer + 6.3095238095e+00 T1 float + 5.3571428571e+00 T2 float + 3.3571428571e+01 G1 integer + 2.3714285714e+01 G2 integer + 2.1904761905e+01 minSize integer + 9.8571428571e+02 maxSize integer + 8.0000000000e+01 minSizePl integer + 5.7714285714e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 6.4761904762e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 67: +Active set vector = { 1 } + 3.2297567500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 68 +--------------------- +Parameters for evaluation 68: + 2.2000000000e+02 blue integer + 2.1142857143e+02 green integer + 2.1000000000e+02 red integer + 6.3095238095e+00 T1 float + 5.3571428571e+00 T2 float + 3.3571428571e+01 G1 integer + 2.3714285714e+01 G2 integer + 2.1904761905e+01 minSize integer + 9.8571428571e+02 maxSize integer + 8.0000000000e+01 minSizePl integer + 5.7714285714e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 6.4761904762e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 68: +Active set vector = { 1 } + 3.2300977700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 69 +--------------------- +Parameters for evaluation 69: + 2.3571428571e+02 blue integer + 2.1142857143e+02 green integer + 2.1000000000e+02 red integer + 6.3095238095e+00 T1 float + 5.3571428571e+00 T2 float + 3.3571428571e+01 G1 integer + 2.3714285714e+01 G2 integer + 2.1904761905e+01 minSize integer + 9.8571428571e+02 maxSize integer + 8.0000000000e+01 minSizePl integer + 5.7714285714e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 6.4761904762e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 69: +Active set vector = { 1 } + 3.2306577800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 70 +--------------------- +Parameters for evaluation 70: + 2.3571428571e+02 blue integer + 2.1142857143e+02 green integer + 2.1000000000e+02 red integer + 6.3095238095e+00 T1 float + 2.7380952381e+00 T2 float + 3.3571428571e+01 G1 integer + 2.3714285714e+01 G2 integer + 2.1904761905e+01 minSize integer + 9.8571428571e+02 maxSize integer + 8.0000000000e+01 minSizePl integer + 5.7714285714e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 6.4761904762e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 70: +Active set vector = { 1 } + 3.2352006100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 71 +--------------------- +Parameters for evaluation 71: + 2.3571428571e+02 blue integer + 2.1142857143e+02 green integer + 2.1000000000e+02 red integer + 6.3095238095e+00 T1 float + 2.7380952381e+00 T2 float + 3.3571428571e+01 G1 integer + 2.3714285714e+01 G2 integer + 2.0000000000e+00 minSize integer + 9.8571428571e+02 maxSize integer + 8.0000000000e+01 minSizePl integer + 5.7714285714e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 6.4761904762e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 71: +Active set vector = { 1 } + 3.2227605100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 72 +--------------------- +Parameters for evaluation 72: + 2.3571428571e+02 blue integer + 2.1142857143e+02 green integer + 2.1000000000e+02 red integer + 6.3095238095e+00 T1 float + 2.7380952381e+00 T2 float + 3.3571428571e+01 G1 integer + 3.8095238095e+00 G2 integer + 2.0000000000e+00 minSize integer + 9.8571428571e+02 maxSize integer + 8.0000000000e+01 minSizePl integer + 5.7714285714e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 6.4761904762e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 72: +Active set vector = { 1 } + 5.1738144700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 73 +--------------------- +Parameters for evaluation 73: + 2.3571428571e+02 blue integer + 2.1142857143e+02 green integer + 2.1000000000e+02 red integer + 6.3095238095e+00 T1 float + 2.7380952381e+00 T2 float + 3.3571428571e+01 G1 integer + 3.8095238095e+00 G2 integer + 2.0000000000e+00 minSize integer + 9.8571428571e+02 maxSize integer + 8.0000000000e+01 minSizePl integer + 5.7714285714e+01 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 6.4761904762e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 73: +Active set vector = { 1 } + 5.1081487700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 74 +--------------------- +Parameters for evaluation 74: + 2.3571428571e+02 blue integer + 2.1142857143e+02 green integer + 2.1000000000e+02 red integer + 6.3095238095e+00 T1 float + 2.7380952381e+00 T2 float + 7.2857142857e+01 G1 integer + 3.8095238095e+00 G2 integer + 2.0000000000e+00 minSize integer + 9.8571428571e+02 maxSize integer + 8.0000000000e+01 minSizePl integer + 5.7714285714e+01 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 6.4761904762e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 74: +Active set vector = { 1 } + 4.9005510200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 75 +--------------------- +Parameters for evaluation 75: + 2.3571428571e+02 blue integer + 2.1142857143e+02 green integer + 2.1000000000e+02 red integer + 6.3095238095e+00 T1 float + 2.7380952381e+00 T2 float + 7.2857142857e+01 G1 integer + 3.8095238095e+00 G2 integer + 2.0000000000e+00 minSize integer + 9.8571428571e+02 maxSize integer + 8.0000000000e+01 minSizePl integer + 1.6857142857e+01 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 6.4761904762e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 75: +Active set vector = { 1 } + 4.8936144400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 76 +--------------------- +Parameters for evaluation 76: + 2.3571428571e+02 blue integer + 2.1142857143e+02 green integer + 2.1000000000e+02 red integer + 6.3095238095e+00 T1 float + 2.7380952381e+00 T2 float + 7.2857142857e+01 G1 integer + 3.8095238095e+00 G2 integer + 2.0000000000e+00 minSize integer + 1.3000000000e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 1.6857142857e+01 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 6.4761904762e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 76: +Active set vector = { 1 } + 4.8936177300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 77 +--------------------- +Parameters for evaluation 77: + 2.3571428571e+02 blue integer + 2.1142857143e+02 green integer + 2.1000000000e+02 red integer + 6.3095238095e+00 T1 float + 2.7380952381e+00 T2 float + 7.2857142857e+01 G1 integer + 3.8095238095e+00 G2 integer + 2.0000000000e+00 minSize integer + 1.3000000000e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 1.6857142857e+01 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 6.4761904762e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 77: +Active set vector = { 1 } + 4.8643666100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 78 +--------------------- +Parameters for evaluation 78: + 2.3571428571e+02 blue integer + 2.2714285714e+02 green integer + 2.1000000000e+02 red integer + 6.3095238095e+00 T1 float + 2.7380952381e+00 T2 float + 7.2857142857e+01 G1 integer + 3.8095238095e+00 G2 integer + 2.0000000000e+00 minSize integer + 1.3000000000e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 1.6857142857e+01 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 6.4761904762e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 78: +Active set vector = { 1 } + 4.8643666100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 79 +--------------------- +Parameters for evaluation 79: + 2.3571428571e+02 blue integer + 2.2714285714e+02 green integer + 2.1000000000e+02 red integer + 6.3095238095e+00 T1 float + 2.7380952381e+00 T2 float + 7.2857142857e+01 G1 integer + 3.8095238095e+00 G2 integer + 2.0000000000e+00 minSize integer + 1.3000000000e+03 maxSize integer + 4.0714285714e+01 minSizePl integer + 1.6857142857e+01 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 6.4761904762e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 79: +Active set vector = { 1 } + 4.9518329000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 80 +--------------------- +Parameters for evaluation 80: + 2.3571428571e+02 blue integer + 2.2714285714e+02 green integer + 2.2571428571e+02 red integer + 6.3095238095e+00 T1 float + 2.7380952381e+00 T2 float + 7.2857142857e+01 G1 integer + 3.8095238095e+00 G2 integer + 2.0000000000e+00 minSize integer + 1.3000000000e+03 maxSize integer + 4.0714285714e+01 minSizePl integer + 1.6857142857e+01 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 6.4761904762e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 80: +Active set vector = { 1 } + 4.9518329000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 81 +--------------------- +Parameters for evaluation 81: + 2.2000000000e+02 blue integer + 2.4000000000e+02 green integer + 2.3857142857e+02 red integer + 2.5000000000e+00 T1 float + 3.6904761905e+00 T2 float + 8.0000000000e+01 G1 integer + 2.0095238095e+01 G2 integer + 7.4285714286e+00 minSize integer + 1.5000000000e+03 maxSize integer + 7.6428571429e+01 minSizePl integer + 5.4000000000e+01 minSizeSeg integer + 1.4142857143e+03 maxSizeSeg integer + 5.1428571429e+00 fillHoles integer + 7.2380952381e+00 recon integer + 4.0000000000e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 81: +Active set vector = { 1 } + 3.5943578000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 82 +--------------------- +Parameters for evaluation 82: + 2.2000000000e+02 blue integer + 2.4000000000e+02 green integer + 2.3857142857e+02 red integer + 2.5000000000e+00 T1 float + 3.6904761905e+00 T2 float + 8.0000000000e+01 G1 integer + 2.0095238095e+01 G2 integer + 7.4285714286e+00 minSize integer + 1.5000000000e+03 maxSize integer + 7.6428571429e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.4142857143e+03 maxSizeSeg integer + 5.1428571429e+00 fillHoles integer + 7.2380952381e+00 recon integer + 4.0000000000e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 82: +Active set vector = { 1 } + 3.5160460400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 83 +--------------------- +Parameters for evaluation 83: + 2.2000000000e+02 blue integer + 2.4000000000e+02 green integer + 2.3857142857e+02 red integer + 2.5000000000e+00 T1 float + 3.6904761905e+00 T2 float + 8.0000000000e+01 G1 integer + 4.0000000000e+01 G2 integer + 7.4285714286e+00 minSize integer + 1.5000000000e+03 maxSize integer + 7.6428571429e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.4142857143e+03 maxSizeSeg integer + 5.1428571429e+00 fillHoles integer + 7.2380952381e+00 recon integer + 4.0000000000e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 83: +Active set vector = { 1 } + 5.1077152900e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 84 +--------------------- +Parameters for evaluation 84: + 2.2000000000e+02 blue integer + 2.4000000000e+02 green integer + 2.3857142857e+02 red integer + 2.5000000000e+00 T1 float + 3.6904761905e+00 T2 float + 8.0000000000e+01 G1 integer + 4.0000000000e+01 G2 integer + 7.4285714286e+00 minSize integer + 1.5000000000e+03 maxSize integer + 7.6428571429e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.4142857143e+03 maxSizeSeg integer + 5.1428571429e+00 fillHoles integer + 7.2380952381e+00 recon integer + 6.0952380952e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 84: +Active set vector = { 1 } + 5.0671306900e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 85 +--------------------- +Parameters for evaluation 85: + 2.2000000000e+02 blue integer + 2.4000000000e+02 green integer + 2.3857142857e+02 red integer + 2.5000000000e+00 T1 float + 3.6904761905e+00 T2 float + 8.0000000000e+01 G1 integer + 4.0000000000e+01 G2 integer + 7.4285714286e+00 minSize integer + 1.5000000000e+03 maxSize integer + 3.7142857143e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.4142857143e+03 maxSizeSeg integer + 5.1428571429e+00 fillHoles integer + 7.2380952381e+00 recon integer + 6.0952380952e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 85: +Active set vector = { 1 } + 4.6701720000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 86 +--------------------- +Parameters for evaluation 86: + 2.3571428571e+02 blue integer + 2.4000000000e+02 green integer + 2.3857142857e+02 red integer + 2.5000000000e+00 T1 float + 3.6904761905e+00 T2 float + 8.0000000000e+01 G1 integer + 4.0000000000e+01 G2 integer + 7.4285714286e+00 minSize integer + 1.5000000000e+03 maxSize integer + 3.7142857143e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.4142857143e+03 maxSizeSeg integer + 5.1428571429e+00 fillHoles integer + 7.2380952381e+00 recon integer + 6.0952380952e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 86: +Active set vector = { 1 } + 4.6701720000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 87 +--------------------- +Parameters for evaluation 87: + 2.3571428571e+02 blue integer + 2.4000000000e+02 green integer + 2.3857142857e+02 red integer + 2.5000000000e+00 T1 float + 3.6904761905e+00 T2 float + 8.0000000000e+01 G1 integer + 4.0000000000e+01 G2 integer + 7.4285714286e+00 minSize integer + 1.5000000000e+03 maxSize integer + 3.7142857143e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.1000000000e+03 maxSizeSeg integer + 5.1428571429e+00 fillHoles integer + 7.2380952381e+00 recon integer + 6.0952380952e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 87: +Active set vector = { 1 } + 4.6696380500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 88 +--------------------- +Parameters for evaluation 88: + 2.3571428571e+02 blue integer + 2.4000000000e+02 green integer + 2.3857142857e+02 red integer + 2.5000000000e+00 T1 float + 3.6904761905e+00 T2 float + 8.0000000000e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.5000000000e+03 maxSize integer + 3.7142857143e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.1000000000e+03 maxSizeSeg integer + 5.1428571429e+00 fillHoles integer + 7.2380952381e+00 recon integer + 6.0952380952e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 88: +Active set vector = { 1 } + 5.5524489800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 89 +--------------------- +Parameters for evaluation 89: + 2.3571428571e+02 blue integer + 2.4000000000e+02 green integer + 2.3857142857e+02 red integer + 2.5000000000e+00 T1 float + 6.3095238095e+00 T2 float + 8.0000000000e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.5000000000e+03 maxSize integer + 3.7142857143e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.1000000000e+03 maxSizeSeg integer + 5.1428571429e+00 fillHoles integer + 7.2380952381e+00 recon integer + 6.0952380952e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 89: +Active set vector = { 1 } + 5.5537837800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 90 +--------------------- +Parameters for evaluation 90: + 2.3571428571e+02 blue integer + 2.4000000000e+02 green integer + 2.3857142857e+02 red integer + 2.5000000000e+00 T1 float + 6.3095238095e+00 T2 float + 8.0000000000e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.5000000000e+03 maxSize integer + 3.7142857143e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.1000000000e+03 maxSizeSeg integer + 7.2380952381e+00 fillHoles integer + 7.2380952381e+00 recon integer + 6.0952380952e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 90: +Active set vector = { 1 } + 5.5660317900e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 91 +--------------------- +Parameters for evaluation 91: + 2.3571428571e+02 blue integer + 2.4000000000e+02 green integer + 2.3857142857e+02 red integer + 2.5000000000e+00 T1 float + 6.3095238095e+00 T2 float + 8.0000000000e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.5000000000e+03 maxSize integer + 3.7142857143e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.1000000000e+03 maxSizeSeg integer + 7.2380952381e+00 fillHoles integer + 5.1428571429e+00 recon integer + 6.0952380952e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 91: +Active set vector = { 1 } + 5.1643709300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 92 +--------------------- +Parameters for evaluation 92: + 2.3571428571e+02 blue integer + 2.2428571429e+02 green integer + 2.3857142857e+02 red integer + 2.5000000000e+00 T1 float + 6.3095238095e+00 T2 float + 8.0000000000e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.5000000000e+03 maxSize integer + 3.7142857143e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.1000000000e+03 maxSizeSeg integer + 7.2380952381e+00 fillHoles integer + 5.1428571429e+00 recon integer + 6.0952380952e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 92: +Active set vector = { 1 } + 5.1643709300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 93 +--------------------- +Parameters for evaluation 93: + 2.3571428571e+02 blue integer + 2.2428571429e+02 green integer + 2.3857142857e+02 red integer + 5.1190476190e+00 T1 float + 6.3095238095e+00 T2 float + 8.0000000000e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.5000000000e+03 maxSize integer + 3.7142857143e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.1000000000e+03 maxSizeSeg integer + 7.2380952381e+00 fillHoles integer + 5.1428571429e+00 recon integer + 6.0952380952e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 93: +Active set vector = { 1 } + 5.1643709300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 94 +--------------------- +Parameters for evaluation 94: + 2.3571428571e+02 blue integer + 2.2428571429e+02 green integer + 2.2285714286e+02 red integer + 5.1190476190e+00 T1 float + 6.3095238095e+00 T2 float + 8.0000000000e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.5000000000e+03 maxSize integer + 3.7142857143e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.1000000000e+03 maxSizeSeg integer + 7.2380952381e+00 fillHoles integer + 5.1428571429e+00 recon integer + 6.0952380952e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 94: +Active set vector = { 1 } + 5.1643709300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 95 +--------------------- +Parameters for evaluation 95: + 2.3571428571e+02 blue integer + 2.2428571429e+02 green integer + 2.2285714286e+02 red integer + 5.1190476190e+00 T1 float + 6.3095238095e+00 T2 float + 8.0000000000e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.1857142857e+03 maxSize integer + 3.7142857143e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.1000000000e+03 maxSizeSeg integer + 7.2380952381e+00 fillHoles integer + 5.1428571429e+00 recon integer + 6.0952380952e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 95: +Active set vector = { 1 } + 5.1643739700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 96 +--------------------- +Parameters for evaluation 96: + 2.3571428571e+02 blue integer + 2.2428571429e+02 green integer + 2.2285714286e+02 red integer + 5.1190476190e+00 T1 float + 6.3095238095e+00 T2 float + 4.0714285714e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.1857142857e+03 maxSize integer + 3.7142857143e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.1000000000e+03 maxSizeSeg integer + 7.2380952381e+00 fillHoles integer + 5.1428571429e+00 recon integer + 6.0952380952e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 96: +Active set vector = { 1 } + 3.9170473500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 97 +--------------------- +Parameters for evaluation 97: + 2.1142857143e+02 blue integer + 2.1000000000e+02 green integer + 2.2714285714e+02 red integer + 6.7857142857e+00 T1 float + 5.3571428571e+00 T2 float + 4.7857142857e+01 G1 integer + 1.2857142857e+01 G2 integer + 1.8285714286e+01 minSize integer + 9.5714285714e+02 maxSize integer + 6.5714285714e+01 minSizePl integer + 3.9142857143e+01 minSizeSeg integer + 1.1285714286e+03 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 4.0000000000e+00 recon integer + 5.3333333333e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 97: +Active set vector = { 1 } + 2.9832012700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 98 +--------------------- +Parameters for evaluation 98: + 2.1142857143e+02 blue integer + 2.1000000000e+02 green integer + 2.2714285714e+02 red integer + 6.7857142857e+00 T1 float + 5.3571428571e+00 T2 float + 8.5714285714e+00 G1 integer + 1.2857142857e+01 G2 integer + 1.8285714286e+01 minSize integer + 9.5714285714e+02 maxSize integer + 6.5714285714e+01 minSizePl integer + 3.9142857143e+01 minSizeSeg integer + 1.1285714286e+03 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 4.0000000000e+00 recon integer + 5.3333333333e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 98: +Active set vector = { 1 } + 5.2569864100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 99 +--------------------- +Parameters for evaluation 99: + 2.1142857143e+02 blue integer + 2.1000000000e+02 green integer + 2.2714285714e+02 red integer + 4.1666666667e+00 T1 float + 5.3571428571e+00 T2 float + 8.5714285714e+00 G1 integer + 1.2857142857e+01 G2 integer + 1.8285714286e+01 minSize integer + 9.5714285714e+02 maxSize integer + 6.5714285714e+01 minSizePl integer + 3.9142857143e+01 minSizeSeg integer + 1.1285714286e+03 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 4.0000000000e+00 recon integer + 5.3333333333e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 99: +Active set vector = { 1 } + 5.2543794600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 100 +--------------------- +Parameters for evaluation 100: + 2.1142857143e+02 blue integer + 2.1000000000e+02 green integer + 2.2714285714e+02 red integer + 4.1666666667e+00 T1 float + 5.3571428571e+00 T2 float + 8.5714285714e+00 G1 integer + 3.2761904762e+01 G2 integer + 1.8285714286e+01 minSize integer + 9.5714285714e+02 maxSize integer + 6.5714285714e+01 minSizePl integer + 3.9142857143e+01 minSizeSeg integer + 1.1285714286e+03 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 4.0000000000e+00 recon integer + 5.3333333333e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 100: +Active set vector = { 1 } + 5.6897291700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 101 +--------------------- +Parameters for evaluation 101: + 2.1142857143e+02 blue integer + 2.1000000000e+02 green integer + 2.2714285714e+02 red integer + 4.1666666667e+00 T1 float + 2.7380952381e+00 T2 float + 8.5714285714e+00 G1 integer + 3.2761904762e+01 G2 integer + 1.8285714286e+01 minSize integer + 9.5714285714e+02 maxSize integer + 6.5714285714e+01 minSizePl integer + 3.9142857143e+01 minSizeSeg integer + 1.1285714286e+03 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 4.0000000000e+00 recon integer + 5.3333333333e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 101: +Active set vector = { 1 } + 5.7210119400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 102 +--------------------- +Parameters for evaluation 102: + 2.1142857143e+02 blue integer + 2.1000000000e+02 green integer + 2.2714285714e+02 red integer + 4.1666666667e+00 T1 float + 2.7380952381e+00 T2 float + 8.5714285714e+00 G1 integer + 3.2761904762e+01 G2 integer + 1.8285714286e+01 minSize integer + 9.5714285714e+02 maxSize integer + 6.5714285714e+01 minSizePl integer + 3.9142857143e+01 minSizeSeg integer + 1.1285714286e+03 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 4.0000000000e+00 recon integer + 5.3333333333e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 102: +Active set vector = { 1 } + 5.7603166200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 103 +--------------------- +Parameters for evaluation 103: + 2.1142857143e+02 blue integer + 2.1000000000e+02 green integer + 2.2714285714e+02 red integer + 4.1666666667e+00 T1 float + 2.7380952381e+00 T2 float + 8.5714285714e+00 G1 integer + 3.2761904762e+01 G2 integer + 1.8285714286e+01 minSize integer + 9.5714285714e+02 maxSize integer + 6.5714285714e+01 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 1.1285714286e+03 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 4.0000000000e+00 recon integer + 5.3333333333e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 103: +Active set vector = { 1 } + 6.1018145800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 104 +--------------------- +Parameters for evaluation 104: + 2.1142857143e+02 blue integer + 2.1000000000e+02 green integer + 2.2714285714e+02 red integer + 4.1666666667e+00 T1 float + 2.7380952381e+00 T2 float + 8.5714285714e+00 G1 integer + 3.2761904762e+01 G2 integer + 3.8190476190e+01 minSize integer + 9.5714285714e+02 maxSize integer + 6.5714285714e+01 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 1.1285714286e+03 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 4.0000000000e+00 recon integer + 5.3333333333e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 104: +Active set vector = { 1 } + 6.1018145800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 105 +--------------------- +Parameters for evaluation 105: + 2.1142857143e+02 blue integer + 2.1000000000e+02 green integer + 2.2714285714e+02 red integer + 4.1666666667e+00 T1 float + 2.7380952381e+00 T2 float + 8.5714285714e+00 G1 integer + 3.2761904762e+01 G2 integer + 3.8190476190e+01 minSize integer + 9.5714285714e+02 maxSize integer + 2.6428571429e+01 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 1.1285714286e+03 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 4.0000000000e+00 recon integer + 5.3333333333e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 105: +Active set vector = { 1 } + 6.0880357800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 106 +--------------------- +Parameters for evaluation 106: + 2.1142857143e+02 blue integer + 2.1000000000e+02 green integer + 2.1142857143e+02 red integer + 4.1666666667e+00 T1 float + 2.7380952381e+00 T2 float + 8.5714285714e+00 G1 integer + 3.2761904762e+01 G2 integer + 3.8190476190e+01 minSize integer + 9.5714285714e+02 maxSize integer + 2.6428571429e+01 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 1.1285714286e+03 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 4.0000000000e+00 recon integer + 5.3333333333e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 106: +Active set vector = { 1 } + 6.0880357800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 107 +--------------------- +Parameters for evaluation 107: + 2.1142857143e+02 blue integer + 2.1000000000e+02 green integer + 2.1142857143e+02 red integer + 4.1666666667e+00 T1 float + 2.7380952381e+00 T2 float + 8.5714285714e+00 G1 integer + 3.2761904762e+01 G2 integer + 3.8190476190e+01 minSize integer + 9.5714285714e+02 maxSize integer + 2.6428571429e+01 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 4.0000000000e+00 recon integer + 5.3333333333e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 107: +Active set vector = { 1 } + 6.0880357800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 108 +--------------------- +Parameters for evaluation 108: + 2.1142857143e+02 blue integer + 2.1000000000e+02 green integer + 2.1142857143e+02 red integer + 4.1666666667e+00 T1 float + 2.7380952381e+00 T2 float + 8.5714285714e+00 G1 integer + 3.2761904762e+01 G2 integer + 3.8190476190e+01 minSize integer + 9.5714285714e+02 maxSize integer + 2.6428571429e+01 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 4.0000000000e+00 recon integer + 7.4285714286e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 108: +Active set vector = { 1 } + 5.9560317500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 109 +--------------------- +Parameters for evaluation 109: + 2.1142857143e+02 blue integer + 2.1000000000e+02 green integer + 2.1142857143e+02 red integer + 4.1666666667e+00 T1 float + 2.7380952381e+00 T2 float + 8.5714285714e+00 G1 integer + 3.2761904762e+01 G2 integer + 3.8190476190e+01 minSize integer + 9.5714285714e+02 maxSize integer + 2.6428571429e+01 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 6.0952380952e+00 recon integer + 7.4285714286e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 109: +Active set vector = { 1 } + 5.3681022900e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 110 +--------------------- +Parameters for evaluation 110: + 2.1142857143e+02 blue integer + 2.2571428571e+02 green integer + 2.1142857143e+02 red integer + 4.1666666667e+00 T1 float + 2.7380952381e+00 T2 float + 8.5714285714e+00 G1 integer + 3.2761904762e+01 G2 integer + 3.8190476190e+01 minSize integer + 9.5714285714e+02 maxSize integer + 2.6428571429e+01 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 6.0952380952e+00 recon integer + 7.4285714286e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 110: +Active set vector = { 1 } + 5.3677878800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 111 +--------------------- +Parameters for evaluation 111: + 2.1142857143e+02 blue integer + 2.2571428571e+02 green integer + 2.1142857143e+02 red integer + 4.1666666667e+00 T1 float + 2.7380952381e+00 T2 float + 8.5714285714e+00 G1 integer + 3.2761904762e+01 G2 integer + 3.8190476190e+01 minSize integer + 1.2714285714e+03 maxSize integer + 2.6428571429e+01 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 6.0952380952e+00 recon integer + 7.4285714286e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 111: +Active set vector = { 1 } + 5.0488697300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 112 +--------------------- +Parameters for evaluation 112: + 2.2714285714e+02 blue integer + 2.2571428571e+02 green integer + 2.1142857143e+02 red integer + 4.1666666667e+00 T1 float + 2.7380952381e+00 T2 float + 8.5714285714e+00 G1 integer + 3.2761904762e+01 G2 integer + 3.8190476190e+01 minSize integer + 1.2714285714e+03 maxSize integer + 2.6428571429e+01 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 6.0952380952e+00 recon integer + 7.4285714286e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 112: +Active set vector = { 1 } + 5.0488697300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 113 +--------------------- +Parameters for evaluation 113: + 2.3857142857e+02 blue integer + 2.1857142857e+02 green integer + 2.2571428571e+02 red integer + 7.0238095238e+00 T1 float + 7.5000000000e+00 T2 float + 4.0714285714e+01 G1 integer + 7.4285714286e+00 G2 integer + 3.0952380952e+01 minSize integer + 1.4714285714e+03 maxSize integer + 1.9285714286e+01 minSizePl integer + 4.6571428571e+01 minSizeSeg integer + 1.4142857143e+03 maxSizeSeg integer + 7.6190476190e+00 fillHoles integer + 7.0476190476e+00 recon integer + 4.3809523810e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 113: +Active set vector = { 1 } + 3.3829197800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 114 +--------------------- +Parameters for evaluation 114: + 2.3857142857e+02 blue integer + 2.1857142857e+02 green integer + 2.1000000000e+02 red integer + 7.0238095238e+00 T1 float + 7.5000000000e+00 T2 float + 4.0714285714e+01 G1 integer + 7.4285714286e+00 G2 integer + 3.0952380952e+01 minSize integer + 1.4714285714e+03 maxSize integer + 1.9285714286e+01 minSizePl integer + 4.6571428571e+01 minSizeSeg integer + 1.4142857143e+03 maxSizeSeg integer + 7.6190476190e+00 fillHoles integer + 7.0476190476e+00 recon integer + 4.3809523810e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 114: +Active set vector = { 1 } + 3.3829197800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 115 +--------------------- +Parameters for evaluation 115: + 2.3857142857e+02 blue integer + 2.1857142857e+02 green integer + 2.1000000000e+02 red integer + 7.0238095238e+00 T1 float + 7.5000000000e+00 T2 float + 4.0714285714e+01 G1 integer + 7.4285714286e+00 G2 integer + 3.0952380952e+01 minSize integer + 1.4714285714e+03 maxSize integer + 1.9285714286e+01 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 1.4142857143e+03 maxSizeSeg integer + 7.6190476190e+00 fillHoles integer + 7.0476190476e+00 recon integer + 4.3809523810e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 115: +Active set vector = { 1 } + 3.4016108500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 116 +--------------------- +Parameters for evaluation 116: + 2.3857142857e+02 blue integer + 2.1857142857e+02 green integer + 2.1000000000e+02 red integer + 7.0238095238e+00 T1 float + 7.5000000000e+00 T2 float + 4.0714285714e+01 G1 integer + 7.4285714286e+00 G2 integer + 1.1047619048e+01 minSize integer + 1.4714285714e+03 maxSize integer + 1.9285714286e+01 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 1.4142857143e+03 maxSizeSeg integer + 7.6190476190e+00 fillHoles integer + 7.0476190476e+00 recon integer + 4.3809523810e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 116: +Active set vector = { 1 } + 3.3686984500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 117 +--------------------- +Parameters for evaluation 117: + 2.3857142857e+02 blue integer + 2.1857142857e+02 green integer + 2.1000000000e+02 red integer + 7.0238095238e+00 T1 float + 7.5000000000e+00 T2 float + 4.0714285714e+01 G1 integer + 7.4285714286e+00 G2 integer + 1.1047619048e+01 minSize integer + 1.4714285714e+03 maxSize integer + 1.9285714286e+01 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 1.4142857143e+03 maxSizeSeg integer + 5.5238095238e+00 fillHoles integer + 7.0476190476e+00 recon integer + 4.3809523810e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 117: +Active set vector = { 1 } + 3.3690968400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 118 +--------------------- +Parameters for evaluation 118: + 2.3857142857e+02 blue integer + 2.3428571429e+02 green integer + 2.1000000000e+02 red integer + 7.0238095238e+00 T1 float + 7.5000000000e+00 T2 float + 4.0714285714e+01 G1 integer + 7.4285714286e+00 G2 integer + 1.1047619048e+01 minSize integer + 1.4714285714e+03 maxSize integer + 1.9285714286e+01 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 1.4142857143e+03 maxSizeSeg integer + 5.5238095238e+00 fillHoles integer + 7.0476190476e+00 recon integer + 4.3809523810e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 118: +Active set vector = { 1 } + 3.3690968400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 119 +--------------------- +Parameters for evaluation 119: + 2.3857142857e+02 blue integer + 2.3428571429e+02 green integer + 2.1000000000e+02 red integer + 7.0238095238e+00 T1 float + 7.5000000000e+00 T2 float + 8.0000000000e+01 G1 integer + 7.4285714286e+00 G2 integer + 1.1047619048e+01 minSize integer + 1.4714285714e+03 maxSize integer + 1.9285714286e+01 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 1.4142857143e+03 maxSizeSeg integer + 5.5238095238e+00 fillHoles integer + 7.0476190476e+00 recon integer + 4.3809523810e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 119: +Active set vector = { 1 } + 4.1127459300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 120 +--------------------- +Parameters for evaluation 120: + 2.3857142857e+02 blue integer + 2.3428571429e+02 green integer + 2.1000000000e+02 red integer + 7.0238095238e+00 T1 float + 7.5000000000e+00 T2 float + 8.0000000000e+01 G1 integer + 7.4285714286e+00 G2 integer + 1.1047619048e+01 minSize integer + 1.4714285714e+03 maxSize integer + 1.9285714286e+01 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 1.1000000000e+03 maxSizeSeg integer + 5.5238095238e+00 fillHoles integer + 7.0476190476e+00 recon integer + 4.3809523810e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 120: +Active set vector = { 1 } + 4.1393919500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 121 +--------------------- +Parameters for evaluation 121: + 2.3857142857e+02 blue integer + 2.3428571429e+02 green integer + 2.1000000000e+02 red integer + 7.0238095238e+00 T1 float + 7.5000000000e+00 T2 float + 8.0000000000e+01 G1 integer + 7.4285714286e+00 G2 integer + 1.1047619048e+01 minSize integer + 1.4714285714e+03 maxSize integer + 1.9285714286e+01 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 1.1000000000e+03 maxSizeSeg integer + 5.5238095238e+00 fillHoles integer + 7.0476190476e+00 recon integer + 6.4761904762e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 121: +Active set vector = { 1 } + 4.1354875200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 122 +--------------------- +Parameters for evaluation 122: + 2.3857142857e+02 blue integer + 2.3428571429e+02 green integer + 2.1000000000e+02 red integer + 4.4047619048e+00 T1 float + 7.5000000000e+00 T2 float + 8.0000000000e+01 G1 integer + 7.4285714286e+00 G2 integer + 1.1047619048e+01 minSize integer + 1.4714285714e+03 maxSize integer + 1.9285714286e+01 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 1.1000000000e+03 maxSizeSeg integer + 5.5238095238e+00 fillHoles integer + 7.0476190476e+00 recon integer + 6.4761904762e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 122: +Active set vector = { 1 } + 4.1354875200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 123 +--------------------- +Parameters for evaluation 123: + 2.3857142857e+02 blue integer + 2.3428571429e+02 green integer + 2.1000000000e+02 red integer + 4.4047619048e+00 T1 float + 4.8809523810e+00 T2 float + 8.0000000000e+01 G1 integer + 7.4285714286e+00 G2 integer + 1.1047619048e+01 minSize integer + 1.4714285714e+03 maxSize integer + 1.9285714286e+01 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 1.1000000000e+03 maxSizeSeg integer + 5.5238095238e+00 fillHoles integer + 7.0476190476e+00 recon integer + 6.4761904762e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 123: +Active set vector = { 1 } + 4.1204586700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 124 +--------------------- +Parameters for evaluation 124: + 2.2285714286e+02 blue integer + 2.3428571429e+02 green integer + 2.1000000000e+02 red integer + 4.4047619048e+00 T1 float + 4.8809523810e+00 T2 float + 8.0000000000e+01 G1 integer + 7.4285714286e+00 G2 integer + 1.1047619048e+01 minSize integer + 1.4714285714e+03 maxSize integer + 1.9285714286e+01 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 1.1000000000e+03 maxSizeSeg integer + 5.5238095238e+00 fillHoles integer + 7.0476190476e+00 recon integer + 6.4761904762e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 124: +Active set vector = { 1 } + 4.1204586700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 125 +--------------------- +Parameters for evaluation 125: + 2.2285714286e+02 blue integer + 2.3428571429e+02 green integer + 2.1000000000e+02 red integer + 4.4047619048e+00 T1 float + 4.8809523810e+00 T2 float + 8.0000000000e+01 G1 integer + 7.4285714286e+00 G2 integer + 1.1047619048e+01 minSize integer + 1.4714285714e+03 maxSize integer + 1.9285714286e+01 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 1.1000000000e+03 maxSizeSeg integer + 5.5238095238e+00 fillHoles integer + 4.9523809524e+00 recon integer + 6.4761904762e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 125: +Active set vector = { 1 } + 5.3362801400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 126 +--------------------- +Parameters for evaluation 126: + 2.2285714286e+02 blue integer + 2.3428571429e+02 green integer + 2.1000000000e+02 red integer + 4.4047619048e+00 T1 float + 4.8809523810e+00 T2 float + 8.0000000000e+01 G1 integer + 2.7333333333e+01 G2 integer + 1.1047619048e+01 minSize integer + 1.4714285714e+03 maxSize integer + 1.9285714286e+01 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 1.1000000000e+03 maxSizeSeg integer + 5.5238095238e+00 fillHoles integer + 4.9523809524e+00 recon integer + 6.4761904762e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 126: +Active set vector = { 1 } + 3.6039575000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 127 +--------------------- +Parameters for evaluation 127: + 2.2285714286e+02 blue integer + 2.3428571429e+02 green integer + 2.1000000000e+02 red integer + 4.4047619048e+00 T1 float + 4.8809523810e+00 T2 float + 8.0000000000e+01 G1 integer + 2.7333333333e+01 G2 integer + 1.1047619048e+01 minSize integer + 1.1571428571e+03 maxSize integer + 1.9285714286e+01 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 1.1000000000e+03 maxSizeSeg integer + 5.5238095238e+00 fillHoles integer + 4.9523809524e+00 recon integer + 6.4761904762e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 127: +Active set vector = { 1 } + 3.6039575000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 128 +--------------------- +Parameters for evaluation 128: + 2.2285714286e+02 blue integer + 2.3428571429e+02 green integer + 2.1000000000e+02 red integer + 4.4047619048e+00 T1 float + 4.8809523810e+00 T2 float + 8.0000000000e+01 G1 integer + 2.7333333333e+01 G2 integer + 1.1047619048e+01 minSize integer + 1.1571428571e+03 maxSize integer + 5.8571428571e+01 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 1.1000000000e+03 maxSizeSeg integer + 5.5238095238e+00 fillHoles integer + 4.9523809524e+00 recon integer + 6.4761904762e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 128: +Active set vector = { 1 } + 3.6690664500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 129 +--------------------- +Parameters for evaluation 129: + 2.1142857143e+02 blue integer + 2.2714285714e+02 green integer + 2.2428571429e+02 red integer + 5.1190476190e+00 T1 float + 2.5000000000e+00 T2 float + 2.6428571429e+01 G1 integer + 3.2761904762e+01 G2 integer + 7.4285714286e+00 minSize integer + 1.0428571429e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 6.1428571429e+01 minSizeSeg integer + 1.3857142857e+03 maxSizeSeg integer + 6.6666666667e+00 fillHoles integer + 4.9523809524e+00 recon integer + 6.8571428571e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 129: +Active set vector = { 1 } + 3.8276781700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 130 +--------------------- +Parameters for evaluation 130: + 2.1142857143e+02 blue integer + 2.2714285714e+02 green integer + 2.4000000000e+02 red integer + 5.1190476190e+00 T1 float + 2.5000000000e+00 T2 float + 2.6428571429e+01 G1 integer + 3.2761904762e+01 G2 integer + 7.4285714286e+00 minSize integer + 1.0428571429e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 6.1428571429e+01 minSizeSeg integer + 1.3857142857e+03 maxSizeSeg integer + 6.6666666667e+00 fillHoles integer + 4.9523809524e+00 recon integer + 6.8571428571e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 130: +Active set vector = { 1 } + 3.8276781700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 131 +--------------------- +Parameters for evaluation 131: + 2.1142857143e+02 blue integer + 2.2714285714e+02 green integer + 2.4000000000e+02 red integer + 2.5000000000e+00 T1 float + 2.5000000000e+00 T2 float + 2.6428571429e+01 G1 integer + 3.2761904762e+01 G2 integer + 7.4285714286e+00 minSize integer + 1.0428571429e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 6.1428571429e+01 minSizeSeg integer + 1.3857142857e+03 maxSizeSeg integer + 6.6666666667e+00 fillHoles integer + 4.9523809524e+00 recon integer + 6.8571428571e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 131: +Active set vector = { 1 } + 3.9916017500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 132 +--------------------- +Parameters for evaluation 132: + 2.1142857143e+02 blue integer + 2.2714285714e+02 green integer + 2.4000000000e+02 red integer + 2.5000000000e+00 T1 float + 2.5000000000e+00 T2 float + 2.6428571429e+01 G1 integer + 3.2761904762e+01 G2 integer + 7.4285714286e+00 minSize integer + 1.0428571429e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 6.1428571429e+01 minSizeSeg integer + 1.3857142857e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 4.9523809524e+00 recon integer + 6.8571428571e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 132: +Active set vector = { 1 } + 3.9975138500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 133 +--------------------- +Parameters for evaluation 133: + 2.1142857143e+02 blue integer + 2.2714285714e+02 green integer + 2.4000000000e+02 red integer + 2.5000000000e+00 T1 float + 2.5000000000e+00 T2 float + 2.6428571429e+01 G1 integer + 3.2761904762e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.0428571429e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 6.1428571429e+01 minSizeSeg integer + 1.3857142857e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 4.9523809524e+00 recon integer + 6.8571428571e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 133: +Active set vector = { 1 } + 3.9975138500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 134 +--------------------- +Parameters for evaluation 134: + 2.1142857143e+02 blue integer + 2.2714285714e+02 green integer + 2.4000000000e+02 red integer + 2.5000000000e+00 T1 float + 2.5000000000e+00 T2 float + 2.6428571429e+01 G1 integer + 1.2857142857e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.0428571429e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 6.1428571429e+01 minSizeSeg integer + 1.3857142857e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 4.9523809524e+00 recon integer + 6.8571428571e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 134: +Active set vector = { 1 } + 2.9866257200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 135 +--------------------- +Parameters for evaluation 135: + 2.1142857143e+02 blue integer + 2.2714285714e+02 green integer + 2.4000000000e+02 red integer + 2.5000000000e+00 T1 float + 2.5000000000e+00 T2 float + 2.6428571429e+01 G1 integer + 1.2857142857e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.0428571429e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 6.1428571429e+01 minSizeSeg integer + 1.0714285714e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 4.9523809524e+00 recon integer + 6.8571428571e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 135: +Active set vector = { 1 } + 3.0283128100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 136 +--------------------- +Parameters for evaluation 136: + 2.1142857143e+02 blue integer + 2.1142857143e+02 green integer + 2.4000000000e+02 red integer + 2.5000000000e+00 T1 float + 2.5000000000e+00 T2 float + 2.6428571429e+01 G1 integer + 1.2857142857e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.0428571429e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 6.1428571429e+01 minSizeSeg integer + 1.0714285714e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 4.9523809524e+00 recon integer + 6.8571428571e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 136: +Active set vector = { 1 } + 3.0283128100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 137 +--------------------- +Parameters for evaluation 137: + 2.1142857143e+02 blue integer + 2.1142857143e+02 green integer + 2.4000000000e+02 red integer + 2.5000000000e+00 T1 float + 2.5000000000e+00 T2 float + 2.6428571429e+01 G1 integer + 1.2857142857e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.3571428571e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 6.1428571429e+01 minSizeSeg integer + 1.0714285714e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 4.9523809524e+00 recon integer + 6.8571428571e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 137: +Active set vector = { 1 } + 3.0138198300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 138 +--------------------- +Parameters for evaluation 138: + 2.1142857143e+02 blue integer + 2.1142857143e+02 green integer + 2.4000000000e+02 red integer + 2.5000000000e+00 T1 float + 2.5000000000e+00 T2 float + 2.6428571429e+01 G1 integer + 1.2857142857e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.3571428571e+03 maxSize integer + 4.0714285714e+01 minSizePl integer + 6.1428571429e+01 minSizeSeg integer + 1.0714285714e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 4.9523809524e+00 recon integer + 6.8571428571e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 138: +Active set vector = { 1 } + 2.9641679600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 139 +--------------------- +Parameters for evaluation 139: + 2.1142857143e+02 blue integer + 2.1142857143e+02 green integer + 2.4000000000e+02 red integer + 2.5000000000e+00 T1 float + 2.5000000000e+00 T2 float + 2.6428571429e+01 G1 integer + 1.2857142857e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.3571428571e+03 maxSize integer + 4.0714285714e+01 minSizePl integer + 6.1428571429e+01 minSizeSeg integer + 1.0714285714e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 7.0476190476e+00 recon integer + 6.8571428571e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 139: +Active set vector = { 1 } + 2.6403756900e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 140 +--------------------- +Parameters for evaluation 140: + 2.1142857143e+02 blue integer + 2.1142857143e+02 green integer + 2.4000000000e+02 red integer + 2.5000000000e+00 T1 float + 2.5000000000e+00 T2 float + 6.5714285714e+01 G1 integer + 1.2857142857e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.3571428571e+03 maxSize integer + 4.0714285714e+01 minSizePl integer + 6.1428571429e+01 minSizeSeg integer + 1.0714285714e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 7.0476190476e+00 recon integer + 6.8571428571e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 140: +Active set vector = { 1 } + 3.5919452000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 141 +--------------------- +Parameters for evaluation 141: + 2.1142857143e+02 blue integer + 2.1142857143e+02 green integer + 2.4000000000e+02 red integer + 2.5000000000e+00 T1 float + 2.5000000000e+00 T2 float + 6.5714285714e+01 G1 integer + 1.2857142857e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.3571428571e+03 maxSize integer + 4.0714285714e+01 minSizePl integer + 2.0571428571e+01 minSizeSeg integer + 1.0714285714e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 7.0476190476e+00 recon integer + 6.8571428571e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 141: +Active set vector = { 1 } + 3.5421166100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 142 +--------------------- +Parameters for evaluation 142: + 2.2714285714e+02 blue integer + 2.1142857143e+02 green integer + 2.4000000000e+02 red integer + 2.5000000000e+00 T1 float + 2.5000000000e+00 T2 float + 6.5714285714e+01 G1 integer + 1.2857142857e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.3571428571e+03 maxSize integer + 4.0714285714e+01 minSizePl integer + 2.0571428571e+01 minSizeSeg integer + 1.0714285714e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 7.0476190476e+00 recon integer + 6.8571428571e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 142: +Active set vector = { 1 } + 3.5421166100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 143 +--------------------- +Parameters for evaluation 143: + 2.2714285714e+02 blue integer + 2.1142857143e+02 green integer + 2.4000000000e+02 red integer + 2.5000000000e+00 T1 float + 5.1190476190e+00 T2 float + 6.5714285714e+01 G1 integer + 1.2857142857e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.3571428571e+03 maxSize integer + 4.0714285714e+01 minSizePl integer + 2.0571428571e+01 minSizeSeg integer + 1.0714285714e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 7.0476190476e+00 recon integer + 6.8571428571e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 143: +Active set vector = { 1 } + 3.4400521800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 144 +--------------------- +Parameters for evaluation 144: + 2.2714285714e+02 blue integer + 2.1142857143e+02 green integer + 2.4000000000e+02 red integer + 2.5000000000e+00 T1 float + 5.1190476190e+00 T2 float + 6.5714285714e+01 G1 integer + 1.2857142857e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.3571428571e+03 maxSize integer + 4.0714285714e+01 minSizePl integer + 2.0571428571e+01 minSizeSeg integer + 1.0714285714e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 7.0476190476e+00 recon integer + 4.7619047619e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 144: +Active set vector = { 1 } + 3.4795266200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 145 +--------------------- +Parameters for evaluation 145: + 2.3428571429e+02 blue integer + 2.2428571429e+02 green integer + 2.2571428571e+02 red integer + 6.5476190476e+00 T1 float + 6.0714285714e+00 T2 float + 8.5714285714e+00 G1 integer + 2.0095238095e+01 G2 integer + 3.6380952381e+01 minSize integer + 1.1285714286e+03 maxSize integer + 4.4285714286e+01 minSizePl integer + 3.5428571429e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 7.0476190476e+00 recon integer + 6.6666666667e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 145: +Active set vector = { 1 } + 3.6506545400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 146 +--------------------- +Parameters for evaluation 146: + 2.3428571429e+02 blue integer + 2.2428571429e+02 green integer + 2.1000000000e+02 red integer + 6.5476190476e+00 T1 float + 6.0714285714e+00 T2 float + 8.5714285714e+00 G1 integer + 2.0095238095e+01 G2 integer + 3.6380952381e+01 minSize integer + 1.1285714286e+03 maxSize integer + 4.4285714286e+01 minSizePl integer + 3.5428571429e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 7.0476190476e+00 recon integer + 6.6666666667e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 146: +Active set vector = { 1 } + 3.6506545400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 147 +--------------------- +Parameters for evaluation 147: + 2.3428571429e+02 blue integer + 2.2428571429e+02 green integer + 2.1000000000e+02 red integer + 6.5476190476e+00 T1 float + 6.0714285714e+00 T2 float + 8.5714285714e+00 G1 integer + 4.0000000000e+01 G2 integer + 3.6380952381e+01 minSize integer + 1.1285714286e+03 maxSize integer + 4.4285714286e+01 minSizePl integer + 3.5428571429e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 7.0476190476e+00 recon integer + 6.6666666667e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 147: +Active set vector = { 1 } + 5.1986914100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 148 +--------------------- +Parameters for evaluation 148: + 2.3428571429e+02 blue integer + 2.2428571429e+02 green integer + 2.1000000000e+02 red integer + 6.5476190476e+00 T1 float + 6.0714285714e+00 T2 float + 8.5714285714e+00 G1 integer + 4.0000000000e+01 G2 integer + 3.6380952381e+01 minSize integer + 1.1285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 3.5428571429e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 7.0476190476e+00 recon integer + 6.6666666667e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 148: +Active set vector = { 1 } + 5.0002955800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 149 +--------------------- +Parameters for evaluation 149: + 2.3428571429e+02 blue integer + 2.4000000000e+02 green integer + 2.1000000000e+02 red integer + 6.5476190476e+00 T1 float + 6.0714285714e+00 T2 float + 8.5714285714e+00 G1 integer + 4.0000000000e+01 G2 integer + 3.6380952381e+01 minSize integer + 1.1285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 3.5428571429e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 7.0476190476e+00 recon integer + 6.6666666667e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 149: +Active set vector = { 1 } + 5.0002955800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 150 +--------------------- +Parameters for evaluation 150: + 2.3428571429e+02 blue integer + 2.4000000000e+02 green integer + 2.1000000000e+02 red integer + 6.5476190476e+00 T1 float + 6.0714285714e+00 T2 float + 8.5714285714e+00 G1 integer + 4.0000000000e+01 G2 integer + 1.6476190476e+01 minSize integer + 1.1285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 3.5428571429e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 7.0476190476e+00 recon integer + 6.6666666667e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 150: +Active set vector = { 1 } + 5.0003225200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 151 +--------------------- +Parameters for evaluation 151: + 2.3428571429e+02 blue integer + 2.4000000000e+02 green integer + 2.1000000000e+02 red integer + 6.5476190476e+00 T1 float + 3.4523809524e+00 T2 float + 8.5714285714e+00 G1 integer + 4.0000000000e+01 G2 integer + 1.6476190476e+01 minSize integer + 1.1285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 3.5428571429e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 7.0476190476e+00 recon integer + 6.6666666667e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 151: +Active set vector = { 1 } + 4.9915703400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 152 +--------------------- +Parameters for evaluation 152: + 2.3428571429e+02 blue integer + 2.4000000000e+02 green integer + 2.1000000000e+02 red integer + 6.5476190476e+00 T1 float + 3.4523809524e+00 T2 float + 8.5714285714e+00 G1 integer + 4.0000000000e+01 G2 integer + 1.6476190476e+01 minSize integer + 1.4428571429e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 3.5428571429e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 7.0476190476e+00 recon integer + 6.6666666667e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 152: +Active set vector = { 1 } + 4.7569806400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 153 +--------------------- +Parameters for evaluation 153: + 2.3428571429e+02 blue integer + 2.4000000000e+02 green integer + 2.1000000000e+02 red integer + 6.5476190476e+00 T1 float + 3.4523809524e+00 T2 float + 4.7857142857e+01 G1 integer + 4.0000000000e+01 G2 integer + 1.6476190476e+01 minSize integer + 1.4428571429e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 3.5428571429e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 7.0476190476e+00 recon integer + 6.6666666667e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 153: +Active set vector = { 1 } + 4.1372075800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 154 +--------------------- +Parameters for evaluation 154: + 2.3428571429e+02 blue integer + 2.4000000000e+02 green integer + 2.1000000000e+02 red integer + 6.5476190476e+00 T1 float + 3.4523809524e+00 T2 float + 4.7857142857e+01 G1 integer + 4.0000000000e+01 G2 integer + 1.6476190476e+01 minSize integer + 1.4428571429e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 3.5428571429e+01 minSizeSeg integer + 1.1285714286e+03 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 7.0476190476e+00 recon integer + 6.6666666667e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 154: +Active set vector = { 1 } + 4.1366673600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 155 +--------------------- +Parameters for evaluation 155: + 2.3428571429e+02 blue integer + 2.4000000000e+02 green integer + 2.1000000000e+02 red integer + 6.5476190476e+00 T1 float + 3.4523809524e+00 T2 float + 4.7857142857e+01 G1 integer + 4.0000000000e+01 G2 integer + 1.6476190476e+01 minSize integer + 1.4428571429e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 3.5428571429e+01 minSizeSeg integer + 1.1285714286e+03 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 7.0476190476e+00 recon integer + 6.6666666667e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 155: +Active set vector = { 1 } + 4.1378473800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 156 +--------------------- +Parameters for evaluation 156: + 2.3428571429e+02 blue integer + 2.4000000000e+02 green integer + 2.1000000000e+02 red integer + 3.9285714286e+00 T1 float + 3.4523809524e+00 T2 float + 4.7857142857e+01 G1 integer + 4.0000000000e+01 G2 integer + 1.6476190476e+01 minSize integer + 1.4428571429e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 3.5428571429e+01 minSizeSeg integer + 1.1285714286e+03 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 7.0476190476e+00 recon integer + 6.6666666667e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 156: +Active set vector = { 1 } + 4.1349325200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 157 +--------------------- +Parameters for evaluation 157: + 2.3428571429e+02 blue integer + 2.4000000000e+02 green integer + 2.1000000000e+02 red integer + 3.9285714286e+00 T1 float + 3.4523809524e+00 T2 float + 4.7857142857e+01 G1 integer + 4.0000000000e+01 G2 integer + 1.6476190476e+01 minSize integer + 1.4428571429e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 7.6285714286e+01 minSizeSeg integer + 1.1285714286e+03 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 7.0476190476e+00 recon integer + 6.6666666667e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 157: +Active set vector = { 1 } + 4.9885811200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 158 +--------------------- +Parameters for evaluation 158: + 2.1857142857e+02 blue integer + 2.4000000000e+02 green integer + 2.1000000000e+02 red integer + 3.9285714286e+00 T1 float + 3.4523809524e+00 T2 float + 4.7857142857e+01 G1 integer + 4.0000000000e+01 G2 integer + 1.6476190476e+01 minSize integer + 1.4428571429e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 7.6285714286e+01 minSizeSeg integer + 1.1285714286e+03 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 7.0476190476e+00 recon integer + 6.6666666667e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 158: +Active set vector = { 1 } + 4.9885811200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 159 +--------------------- +Parameters for evaluation 159: + 2.1857142857e+02 blue integer + 2.4000000000e+02 green integer + 2.1000000000e+02 red integer + 3.9285714286e+00 T1 float + 3.4523809524e+00 T2 float + 4.7857142857e+01 G1 integer + 4.0000000000e+01 G2 integer + 1.6476190476e+01 minSize integer + 1.4428571429e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 7.6285714286e+01 minSizeSeg integer + 1.1285714286e+03 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 7.0476190476e+00 recon integer + 4.5714285714e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 159: +Active set vector = { 1 } + 5.2253646000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 160 +--------------------- +Parameters for evaluation 160: + 2.1857142857e+02 blue integer + 2.4000000000e+02 green integer + 2.1000000000e+02 red integer + 3.9285714286e+00 T1 float + 3.4523809524e+00 T2 float + 4.7857142857e+01 G1 integer + 4.0000000000e+01 G2 integer + 1.6476190476e+01 minSize integer + 1.4428571429e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 7.6285714286e+01 minSizeSeg integer + 1.1285714286e+03 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 4.9523809524e+00 recon integer + 4.5714285714e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 160: +Active set vector = { 1 } + 4.8327136000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 161 +--------------------- +Parameters for evaluation 161: + 2.1142857143e+02 blue integer + 2.2714285714e+02 green integer + 2.3857142857e+02 red integer + 5.3571428571e+00 T1 float + 4.4047619048e+00 T2 float + 8.5714285714e+00 G1 integer + 2.3714285714e+01 G2 integer + 1.6476190476e+01 minSize integer + 9.2857142857e+02 maxSize integer + 7.2857142857e+01 minSizePl integer + 2.0000000000e+00 minSizeSeg integer + 1.5000000000e+03 maxSizeSeg integer + 4.9523809524e+00 fillHoles integer + 4.9523809524e+00 recon integer + 4.1904761905e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 161: +Active set vector = { 1 } + 5.3344151300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 162 +--------------------- +Parameters for evaluation 162: + 2.1142857143e+02 blue integer + 2.2714285714e+02 green integer + 2.3857142857e+02 red integer + 5.3571428571e+00 T1 float + 4.4047619048e+00 T2 float + 4.7857142857e+01 G1 integer + 2.3714285714e+01 G2 integer + 1.6476190476e+01 minSize integer + 9.2857142857e+02 maxSize integer + 7.2857142857e+01 minSizePl integer + 2.0000000000e+00 minSizeSeg integer + 1.5000000000e+03 maxSizeSeg integer + 4.9523809524e+00 fillHoles integer + 4.9523809524e+00 recon integer + 4.1904761905e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 162: +Active set vector = { 1 } + 2.6714811500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 163 +--------------------- +Parameters for evaluation 163: + 2.1142857143e+02 blue integer + 2.2714285714e+02 green integer + 2.3857142857e+02 red integer + 5.3571428571e+00 T1 float + 4.4047619048e+00 T2 float + 4.7857142857e+01 G1 integer + 2.3714285714e+01 G2 integer + 1.6476190476e+01 minSize integer + 9.2857142857e+02 maxSize integer + 7.2857142857e+01 minSizePl integer + 2.0000000000e+00 minSizeSeg integer + 1.5000000000e+03 maxSizeSeg integer + 4.9523809524e+00 fillHoles integer + 4.9523809524e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 163: +Active set vector = { 1 } + 2.6196304000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 164 +--------------------- +Parameters for evaluation 164: + 2.1142857143e+02 blue integer + 2.2714285714e+02 green integer + 2.3857142857e+02 red integer + 5.3571428571e+00 T1 float + 4.4047619048e+00 T2 float + 4.7857142857e+01 G1 integer + 3.8095238095e+00 G2 integer + 1.6476190476e+01 minSize integer + 9.2857142857e+02 maxSize integer + 7.2857142857e+01 minSizePl integer + 2.0000000000e+00 minSizeSeg integer + 1.5000000000e+03 maxSizeSeg integer + 4.9523809524e+00 fillHoles integer + 4.9523809524e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 164: +Active set vector = { 1 } + 8.6468185500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 165 +--------------------- +Parameters for evaluation 165: + 2.1142857143e+02 blue integer + 2.2714285714e+02 green integer + 2.3857142857e+02 red integer + 5.3571428571e+00 T1 float + 4.4047619048e+00 T2 float + 4.7857142857e+01 G1 integer + 3.8095238095e+00 G2 integer + 1.6476190476e+01 minSize integer + 9.2857142857e+02 maxSize integer + 7.2857142857e+01 minSizePl integer + 2.0000000000e+00 minSizeSeg integer + 1.1857142857e+03 maxSizeSeg integer + 4.9523809524e+00 fillHoles integer + 4.9523809524e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 165: +Active set vector = { 1 } + 8.4848379400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 166 +--------------------- +Parameters for evaluation 166: + 2.1142857143e+02 blue integer + 2.2714285714e+02 green integer + 2.3857142857e+02 red integer + 5.3571428571e+00 T1 float + 7.0238095238e+00 T2 float + 4.7857142857e+01 G1 integer + 3.8095238095e+00 G2 integer + 1.6476190476e+01 minSize integer + 9.2857142857e+02 maxSize integer + 7.2857142857e+01 minSizePl integer + 2.0000000000e+00 minSizeSeg integer + 1.1857142857e+03 maxSizeSeg integer + 4.9523809524e+00 fillHoles integer + 4.9523809524e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 166: +Active set vector = { 1 } + 8.5221110600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 167 +--------------------- +Parameters for evaluation 167: + 2.1142857143e+02 blue integer + 2.2714285714e+02 green integer + 2.3857142857e+02 red integer + 2.7380952381e+00 T1 float + 7.0238095238e+00 T2 float + 4.7857142857e+01 G1 integer + 3.8095238095e+00 G2 integer + 1.6476190476e+01 minSize integer + 9.2857142857e+02 maxSize integer + 7.2857142857e+01 minSizePl integer + 2.0000000000e+00 minSizeSeg integer + 1.1857142857e+03 maxSizeSeg integer + 4.9523809524e+00 fillHoles integer + 4.9523809524e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 167: +Active set vector = { 1 } + 8.5221110600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 168 +--------------------- +Parameters for evaluation 168: + 2.1142857143e+02 blue integer + 2.2714285714e+02 green integer + 2.3857142857e+02 red integer + 2.7380952381e+00 T1 float + 7.0238095238e+00 T2 float + 4.7857142857e+01 G1 integer + 3.8095238095e+00 G2 integer + 1.6476190476e+01 minSize integer + 9.2857142857e+02 maxSize integer + 7.2857142857e+01 minSizePl integer + 2.0000000000e+00 minSizeSeg integer + 1.1857142857e+03 maxSizeSeg integer + 7.0476190476e+00 fillHoles integer + 4.9523809524e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 168: +Active set vector = { 1 } + 8.5201854700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 169 +--------------------- +Parameters for evaluation 169: + 2.1142857143e+02 blue integer + 2.1142857143e+02 green integer + 2.3857142857e+02 red integer + 2.7380952381e+00 T1 float + 7.0238095238e+00 T2 float + 4.7857142857e+01 G1 integer + 3.8095238095e+00 G2 integer + 1.6476190476e+01 minSize integer + 9.2857142857e+02 maxSize integer + 7.2857142857e+01 minSizePl integer + 2.0000000000e+00 minSizeSeg integer + 1.1857142857e+03 maxSizeSeg integer + 7.0476190476e+00 fillHoles integer + 4.9523809524e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 169: +Active set vector = { 1 } + 8.5201854700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 170 +--------------------- +Parameters for evaluation 170: + 2.1142857143e+02 blue integer + 2.1142857143e+02 green integer + 2.3857142857e+02 red integer + 2.7380952381e+00 T1 float + 7.0238095238e+00 T2 float + 4.7857142857e+01 G1 integer + 3.8095238095e+00 G2 integer + 1.6476190476e+01 minSize integer + 1.2428571429e+03 maxSize integer + 7.2857142857e+01 minSizePl integer + 2.0000000000e+00 minSizeSeg integer + 1.1857142857e+03 maxSizeSeg integer + 7.0476190476e+00 fillHoles integer + 4.9523809524e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 170: +Active set vector = { 1 } + 8.5200682800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 171 +--------------------- +Parameters for evaluation 171: + 2.1142857143e+02 blue integer + 2.1142857143e+02 green integer + 2.3857142857e+02 red integer + 2.7380952381e+00 T1 float + 7.0238095238e+00 T2 float + 4.7857142857e+01 G1 integer + 3.8095238095e+00 G2 integer + 1.6476190476e+01 minSize integer + 1.2428571429e+03 maxSize integer + 3.3571428571e+01 minSizePl integer + 2.0000000000e+00 minSizeSeg integer + 1.1857142857e+03 maxSizeSeg integer + 7.0476190476e+00 fillHoles integer + 4.9523809524e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 171: +Active set vector = { 1 } + 8.7889824700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 172 +--------------------- +Parameters for evaluation 172: + 2.2714285714e+02 blue integer + 2.1142857143e+02 green integer + 2.3857142857e+02 red integer + 2.7380952381e+00 T1 float + 7.0238095238e+00 T2 float + 4.7857142857e+01 G1 integer + 3.8095238095e+00 G2 integer + 1.6476190476e+01 minSize integer + 1.2428571429e+03 maxSize integer + 3.3571428571e+01 minSizePl integer + 2.0000000000e+00 minSizeSeg integer + 1.1857142857e+03 maxSizeSeg integer + 7.0476190476e+00 fillHoles integer + 4.9523809524e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 172: +Active set vector = { 1 } + 8.7889824700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 173 +--------------------- +Parameters for evaluation 173: + 2.2714285714e+02 blue integer + 2.1142857143e+02 green integer + 2.3857142857e+02 red integer + 2.7380952381e+00 T1 float + 7.0238095238e+00 T2 float + 4.7857142857e+01 G1 integer + 3.8095238095e+00 G2 integer + 3.6380952381e+01 minSize integer + 1.2428571429e+03 maxSize integer + 3.3571428571e+01 minSizePl integer + 2.0000000000e+00 minSizeSeg integer + 1.1857142857e+03 maxSizeSeg integer + 7.0476190476e+00 fillHoles integer + 4.9523809524e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 173: +Active set vector = { 1 } + 8.6914699100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 174 +--------------------- +Parameters for evaluation 174: + 2.2714285714e+02 blue integer + 2.1142857143e+02 green integer + 2.3857142857e+02 red integer + 2.7380952381e+00 T1 float + 7.0238095238e+00 T2 float + 4.7857142857e+01 G1 integer + 3.8095238095e+00 G2 integer + 3.6380952381e+01 minSize integer + 1.2428571429e+03 maxSize integer + 3.3571428571e+01 minSizePl integer + 2.0000000000e+00 minSizeSeg integer + 1.1857142857e+03 maxSizeSeg integer + 7.0476190476e+00 fillHoles integer + 7.0476190476e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 174: +Active set vector = { 1 } + 5.0895994300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 175 +--------------------- +Parameters for evaluation 175: + 2.2714285714e+02 blue integer + 2.1142857143e+02 green integer + 2.2285714286e+02 red integer + 2.7380952381e+00 T1 float + 7.0238095238e+00 T2 float + 4.7857142857e+01 G1 integer + 3.8095238095e+00 G2 integer + 3.6380952381e+01 minSize integer + 1.2428571429e+03 maxSize integer + 3.3571428571e+01 minSizePl integer + 2.0000000000e+00 minSizeSeg integer + 1.1857142857e+03 maxSizeSeg integer + 7.0476190476e+00 fillHoles integer + 7.0476190476e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 175: +Active set vector = { 1 } + 5.0895994300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 176 +--------------------- +Parameters for evaluation 176: + 2.2714285714e+02 blue integer + 2.1142857143e+02 green integer + 2.2285714286e+02 red integer + 2.7380952381e+00 T1 float + 7.0238095238e+00 T2 float + 4.7857142857e+01 G1 integer + 3.8095238095e+00 G2 integer + 3.6380952381e+01 minSize integer + 1.2428571429e+03 maxSize integer + 3.3571428571e+01 minSizePl integer + 4.2857142857e+01 minSizeSeg integer + 1.1857142857e+03 maxSizeSeg integer + 7.0476190476e+00 fillHoles integer + 7.0476190476e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 176: +Active set vector = { 1 } + 5.0509651700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 177 +--------------------- +Parameters for evaluation 177: + 2.2142857143e+02 blue integer + 2.2428571429e+02 green integer + 2.3571428571e+02 red integer + 6.5476190476e+00 T1 float + 5.1190476190e+00 T2 float + 8.0000000000e+01 G1 integer + 3.8095238095e+00 G2 integer + 2.5523809524e+01 minSize integer + 1.3285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 7.8095238095e+00 recon integer + 4.5714285714e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 177: +Active set vector = { 1 } + 5.7841261800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 178 +--------------------- +Parameters for evaluation 178: + 2.2142857143e+02 blue integer + 2.4000000000e+02 green integer + 2.3571428571e+02 red integer + 6.5476190476e+00 T1 float + 5.1190476190e+00 T2 float + 8.0000000000e+01 G1 integer + 3.8095238095e+00 G2 integer + 2.5523809524e+01 minSize integer + 1.3285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 7.8095238095e+00 recon integer + 4.5714285714e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 178: +Active set vector = { 1 } + 5.7841261800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 179 +--------------------- +Parameters for evaluation 179: + 2.2142857143e+02 blue integer + 2.4000000000e+02 green integer + 2.2000000000e+02 red integer + 6.5476190476e+00 T1 float + 5.1190476190e+00 T2 float + 8.0000000000e+01 G1 integer + 3.8095238095e+00 G2 integer + 2.5523809524e+01 minSize integer + 1.3285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 7.8095238095e+00 recon integer + 4.5714285714e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 179: +Active set vector = { 1 } + 5.7841261800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 180 +--------------------- +Parameters for evaluation 180: + 2.2142857143e+02 blue integer + 2.4000000000e+02 green integer + 2.2000000000e+02 red integer + 6.5476190476e+00 T1 float + 2.5000000000e+00 T2 float + 8.0000000000e+01 G1 integer + 3.8095238095e+00 G2 integer + 2.5523809524e+01 minSize integer + 1.3285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 7.8095238095e+00 recon integer + 4.5714285714e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 180: +Active set vector = { 1 } + 5.7544039800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 181 +--------------------- +Parameters for evaluation 181: + 2.2142857143e+02 blue integer + 2.4000000000e+02 green integer + 2.2000000000e+02 red integer + 6.5476190476e+00 T1 float + 2.5000000000e+00 T2 float + 8.0000000000e+01 G1 integer + 3.8095238095e+00 G2 integer + 2.5523809524e+01 minSize integer + 1.3285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 7.8095238095e+00 recon integer + 4.5714285714e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 181: +Active set vector = { 1 } + 5.7616956500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 182 +--------------------- +Parameters for evaluation 182: + 2.2142857143e+02 blue integer + 2.4000000000e+02 green integer + 2.2000000000e+02 red integer + 6.5476190476e+00 T1 float + 2.5000000000e+00 T2 float + 8.0000000000e+01 G1 integer + 2.3714285714e+01 G2 integer + 2.5523809524e+01 minSize integer + 1.3285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 7.8095238095e+00 recon integer + 4.5714285714e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 182: +Active set vector = { 1 } + 5.0427134900e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 183 +--------------------- +Parameters for evaluation 183: + 2.2142857143e+02 blue integer + 2.4000000000e+02 green integer + 2.2000000000e+02 red integer + 6.5476190476e+00 T1 float + 2.5000000000e+00 T2 float + 8.0000000000e+01 G1 integer + 2.3714285714e+01 G2 integer + 2.5523809524e+01 minSize integer + 1.3285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 7.8095238095e+00 recon integer + 4.5714285714e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 183: +Active set vector = { 1 } + 5.0355099900e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 184 +--------------------- +Parameters for evaluation 184: + 2.2142857143e+02 blue integer + 2.4000000000e+02 green integer + 2.2000000000e+02 red integer + 6.5476190476e+00 T1 float + 2.5000000000e+00 T2 float + 8.0000000000e+01 G1 integer + 2.3714285714e+01 G2 integer + 5.6190476190e+00 minSize integer + 1.3285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 7.8095238095e+00 recon integer + 4.5714285714e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 184: +Active set vector = { 1 } + 3.8913464100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 185 +--------------------- +Parameters for evaluation 185: + 2.2142857143e+02 blue integer + 2.4000000000e+02 green integer + 2.2000000000e+02 red integer + 6.5476190476e+00 T1 float + 2.5000000000e+00 T2 float + 8.0000000000e+01 G1 integer + 2.3714285714e+01 G2 integer + 5.6190476190e+00 minSize integer + 1.3285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 5.7142857143e+00 recon integer + 4.5714285714e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 185: +Active set vector = { 1 } + 3.4774790500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 186 +--------------------- +Parameters for evaluation 186: + 2.2142857143e+02 blue integer + 2.4000000000e+02 green integer + 2.2000000000e+02 red integer + 3.9285714286e+00 T1 float + 2.5000000000e+00 T2 float + 8.0000000000e+01 G1 integer + 2.3714285714e+01 G2 integer + 5.6190476190e+00 minSize integer + 1.3285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 5.7142857143e+00 recon integer + 4.5714285714e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 186: +Active set vector = { 1 } + 3.5402614400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 187 +--------------------- +Parameters for evaluation 187: + 2.2142857143e+02 blue integer + 2.4000000000e+02 green integer + 2.2000000000e+02 red integer + 3.9285714286e+00 T1 float + 2.5000000000e+00 T2 float + 8.0000000000e+01 G1 integer + 2.3714285714e+01 G2 integer + 5.6190476190e+00 minSize integer + 1.0142857143e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 5.7142857143e+00 recon integer + 4.5714285714e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 187: +Active set vector = { 1 } + 3.5402614400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 188 +--------------------- +Parameters for evaluation 188: + 2.3714285714e+02 blue integer + 2.4000000000e+02 green integer + 2.2000000000e+02 red integer + 3.9285714286e+00 T1 float + 2.5000000000e+00 T2 float + 8.0000000000e+01 G1 integer + 2.3714285714e+01 G2 integer + 5.6190476190e+00 minSize integer + 1.0142857143e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 5.7142857143e+00 recon integer + 4.5714285714e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 188: +Active set vector = { 1 } + 3.5402614400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 189 +--------------------- +Parameters for evaluation 189: + 2.3714285714e+02 blue integer + 2.4000000000e+02 green integer + 2.2000000000e+02 red integer + 3.9285714286e+00 T1 float + 2.5000000000e+00 T2 float + 8.0000000000e+01 G1 integer + 2.3714285714e+01 G2 integer + 5.6190476190e+00 minSize integer + 1.0142857143e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 3.9142857143e+01 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 5.7142857143e+00 recon integer + 4.5714285714e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 189: +Active set vector = { 1 } + 3.0819077000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 190 +--------------------- +Parameters for evaluation 190: + 2.3714285714e+02 blue integer + 2.4000000000e+02 green integer + 2.2000000000e+02 red integer + 3.9285714286e+00 T1 float + 2.5000000000e+00 T2 float + 8.0000000000e+01 G1 integer + 2.3714285714e+01 G2 integer + 5.6190476190e+00 minSize integer + 1.0142857143e+03 maxSize integer + 4.4285714286e+01 minSizePl integer + 3.9142857143e+01 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 5.7142857143e+00 recon integer + 4.5714285714e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 190: +Active set vector = { 1 } + 3.0996758700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 191 +--------------------- +Parameters for evaluation 191: + 2.3714285714e+02 blue integer + 2.4000000000e+02 green integer + 2.2000000000e+02 red integer + 3.9285714286e+00 T1 float + 2.5000000000e+00 T2 float + 8.0000000000e+01 G1 integer + 2.3714285714e+01 G2 integer + 5.6190476190e+00 minSize integer + 1.0142857143e+03 maxSize integer + 4.4285714286e+01 minSizePl integer + 3.9142857143e+01 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 5.7142857143e+00 recon integer + 6.6666666667e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 191: +Active set vector = { 1 } + 3.0017912600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 192 +--------------------- +Parameters for evaluation 192: + 2.3714285714e+02 blue integer + 2.4000000000e+02 green integer + 2.2000000000e+02 red integer + 3.9285714286e+00 T1 float + 2.5000000000e+00 T2 float + 4.0714285714e+01 G1 integer + 2.3714285714e+01 G2 integer + 5.6190476190e+00 minSize integer + 1.0142857143e+03 maxSize integer + 4.4285714286e+01 minSizePl integer + 3.9142857143e+01 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 5.7142857143e+00 recon integer + 6.6666666667e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 192: +Active set vector = { 1 } + 2.3814175400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 193 +--------------------- +Parameters for evaluation 193: + 2.3142857143e+02 blue integer + 2.3428571429e+02 green integer + 2.3571428571e+02 red integer + 5.5952380952e+00 T1 float + 7.5000000000e+00 T2 float + 2.2857142857e+01 G1 integer + 1.4666666667e+01 G2 integer + 2.0095238095e+01 minSize integer + 1.2142857143e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 2.0000000000e+00 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 6.6666666667e+00 fillHoles integer + 4.0000000000e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 193: +Active set vector = { 1 } + 2.7932854400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 194 +--------------------- +Parameters for evaluation 194: + 2.3142857143e+02 blue integer + 2.3428571429e+02 green integer + 2.3571428571e+02 red integer + 5.5952380952e+00 T1 float + 7.5000000000e+00 T2 float + 2.2857142857e+01 G1 integer + 1.4666666667e+01 G2 integer + 2.0095238095e+01 minSize integer + 1.2142857143e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 2.0000000000e+00 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 6.6666666667e+00 fillHoles integer + 4.0000000000e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 194: +Active set vector = { 1 } + 2.7672024800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 195 +--------------------- +Parameters for evaluation 195: + 2.3142857143e+02 blue integer + 2.3428571429e+02 green integer + 2.3571428571e+02 red integer + 5.5952380952e+00 T1 float + 7.5000000000e+00 T2 float + 2.2857142857e+01 G1 integer + 1.4666666667e+01 G2 integer + 4.0000000000e+01 minSize integer + 1.2142857143e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 2.0000000000e+00 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 6.6666666667e+00 fillHoles integer + 4.0000000000e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 195: +Active set vector = { 1 } + 2.7661251100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 196 +--------------------- +Parameters for evaluation 196: + 2.3142857143e+02 blue integer + 2.3428571429e+02 green integer + 2.3571428571e+02 red integer + 5.5952380952e+00 T1 float + 7.5000000000e+00 T2 float + 2.2857142857e+01 G1 integer + 1.4666666667e+01 G2 integer + 4.0000000000e+01 minSize integer + 9.0000000000e+02 maxSize integer + 8.0000000000e+01 minSizePl integer + 2.0000000000e+00 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 6.6666666667e+00 fillHoles integer + 4.0000000000e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 196: +Active set vector = { 1 } + 2.8382297200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 197 +--------------------- +Parameters for evaluation 197: + 2.3142857143e+02 blue integer + 2.1857142857e+02 green integer + 2.3571428571e+02 red integer + 5.5952380952e+00 T1 float + 7.5000000000e+00 T2 float + 2.2857142857e+01 G1 integer + 1.4666666667e+01 G2 integer + 4.0000000000e+01 minSize integer + 9.0000000000e+02 maxSize integer + 8.0000000000e+01 minSizePl integer + 2.0000000000e+00 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 6.6666666667e+00 fillHoles integer + 4.0000000000e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 197: +Active set vector = { 1 } + 2.8382297200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 198 +--------------------- +Parameters for evaluation 198: + 2.3142857143e+02 blue integer + 2.1857142857e+02 green integer + 2.2000000000e+02 red integer + 5.5952380952e+00 T1 float + 7.5000000000e+00 T2 float + 2.2857142857e+01 G1 integer + 1.4666666667e+01 G2 integer + 4.0000000000e+01 minSize integer + 9.0000000000e+02 maxSize integer + 8.0000000000e+01 minSizePl integer + 2.0000000000e+00 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 6.6666666667e+00 fillHoles integer + 4.0000000000e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 198: +Active set vector = { 1 } + 2.8382297200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 199 +--------------------- +Parameters for evaluation 199: + 2.1571428571e+02 blue integer + 2.1857142857e+02 green integer + 2.2000000000e+02 red integer + 5.5952380952e+00 T1 float + 7.5000000000e+00 T2 float + 2.2857142857e+01 G1 integer + 1.4666666667e+01 G2 integer + 4.0000000000e+01 minSize integer + 9.0000000000e+02 maxSize integer + 8.0000000000e+01 minSizePl integer + 2.0000000000e+00 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 6.6666666667e+00 fillHoles integer + 4.0000000000e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 199: +Active set vector = { 1 } + 2.8382297200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 200 +--------------------- +Parameters for evaluation 200: + 2.1571428571e+02 blue integer + 2.1857142857e+02 green integer + 2.2000000000e+02 red integer + 5.5952380952e+00 T1 float + 7.5000000000e+00 T2 float + 2.2857142857e+01 G1 integer + 1.4666666667e+01 G2 integer + 4.0000000000e+01 minSize integer + 9.0000000000e+02 maxSize integer + 8.0000000000e+01 minSizePl integer + 2.0000000000e+00 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 4.0000000000e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 200: +Active set vector = { 1 } + 2.8428613800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 201 +--------------------- +Parameters for evaluation 201: + 2.1571428571e+02 blue integer + 2.1857142857e+02 green integer + 2.2000000000e+02 red integer + 5.5952380952e+00 T1 float + 7.5000000000e+00 T2 float + 2.2857142857e+01 G1 integer + 3.4571428571e+01 G2 integer + 4.0000000000e+01 minSize integer + 9.0000000000e+02 maxSize integer + 8.0000000000e+01 minSizePl integer + 2.0000000000e+00 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 4.0000000000e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 201: +Active set vector = { 1 } + 4.2064054000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 202 +--------------------- +Parameters for evaluation 202: + 2.1571428571e+02 blue integer + 2.1857142857e+02 green integer + 2.2000000000e+02 red integer + 5.5952380952e+00 T1 float + 7.5000000000e+00 T2 float + 2.2857142857e+01 G1 integer + 3.4571428571e+01 G2 integer + 4.0000000000e+01 minSize integer + 9.0000000000e+02 maxSize integer + 8.0000000000e+01 minSizePl integer + 2.0000000000e+00 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 4.0000000000e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 202: +Active set vector = { 1 } + 4.2063871800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 203 +--------------------- +Parameters for evaluation 203: + 2.1571428571e+02 blue integer + 2.1857142857e+02 green integer + 2.2000000000e+02 red integer + 5.5952380952e+00 T1 float + 7.5000000000e+00 T2 float + 6.2142857143e+01 G1 integer + 3.4571428571e+01 G2 integer + 4.0000000000e+01 minSize integer + 9.0000000000e+02 maxSize integer + 8.0000000000e+01 minSizePl integer + 2.0000000000e+00 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 4.0000000000e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 203: +Active set vector = { 1 } + 4.3057480200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 204 +--------------------- +Parameters for evaluation 204: + 2.1571428571e+02 blue integer + 2.1857142857e+02 green integer + 2.2000000000e+02 red integer + 5.5952380952e+00 T1 float + 7.5000000000e+00 T2 float + 6.2142857143e+01 G1 integer + 3.4571428571e+01 G2 integer + 4.0000000000e+01 minSize integer + 9.0000000000e+02 maxSize integer + 8.0000000000e+01 minSizePl integer + 4.2857142857e+01 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 4.0000000000e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 204: +Active set vector = { 1 } + 4.3083959700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 205 +--------------------- +Parameters for evaluation 205: + 2.1571428571e+02 blue integer + 2.1857142857e+02 green integer + 2.2000000000e+02 red integer + 2.9761904762e+00 T1 float + 7.5000000000e+00 T2 float + 6.2142857143e+01 G1 integer + 3.4571428571e+01 G2 integer + 4.0000000000e+01 minSize integer + 9.0000000000e+02 maxSize integer + 8.0000000000e+01 minSizePl integer + 4.2857142857e+01 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 4.0000000000e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 205: +Active set vector = { 1 } + 4.3083959700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 206 +--------------------- +Parameters for evaluation 206: + 2.1571428571e+02 blue integer + 2.1857142857e+02 green integer + 2.2000000000e+02 red integer + 2.9761904762e+00 T1 float + 7.5000000000e+00 T2 float + 6.2142857143e+01 G1 integer + 3.4571428571e+01 G2 integer + 4.0000000000e+01 minSize integer + 9.0000000000e+02 maxSize integer + 8.0000000000e+01 minSizePl integer + 4.2857142857e+01 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 6.0952380952e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 206: +Active set vector = { 1 } + 4.7585063700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 207 +--------------------- +Parameters for evaluation 207: + 2.1571428571e+02 blue integer + 2.1857142857e+02 green integer + 2.2000000000e+02 red integer + 2.9761904762e+00 T1 float + 7.5000000000e+00 T2 float + 6.2142857143e+01 G1 integer + 3.4571428571e+01 G2 integer + 4.0000000000e+01 minSize integer + 9.0000000000e+02 maxSize integer + 4.0714285714e+01 minSizePl integer + 4.2857142857e+01 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 6.0952380952e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 207: +Active set vector = { 1 } + 4.5589718500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 208 +--------------------- +Parameters for evaluation 208: + 2.1571428571e+02 blue integer + 2.1857142857e+02 green integer + 2.2000000000e+02 red integer + 2.9761904762e+00 T1 float + 4.8809523810e+00 T2 float + 6.2142857143e+01 G1 integer + 3.4571428571e+01 G2 integer + 4.0000000000e+01 minSize integer + 9.0000000000e+02 maxSize integer + 4.0714285714e+01 minSizePl integer + 4.2857142857e+01 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 6.0952380952e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 208: +Active set vector = { 1 } + 4.5563968000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 209 +--------------------- +Parameters for evaluation 209: + 2.1714285714e+02 blue integer + 2.3857142857e+02 green integer + 2.1142857143e+02 red integer + 4.6428571429e+00 T1 float + 2.9761904762e+00 T2 float + 6.2142857143e+01 G1 integer + 3.0952380952e+01 G2 integer + 3.8095238095e+00 minSize integer + 1.4428571429e+03 maxSize integer + 4.4285714286e+01 minSizePl integer + 2.8000000000e+01 minSizeSeg integer + 1.1285714286e+03 maxSizeSeg integer + 6.2857142857e+00 fillHoles integer + 6.4761904762e+00 recon integer + 4.3809523810e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 209: +Active set vector = { 1 } + 3.4365978900e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 210 +--------------------- +Parameters for evaluation 210: + 2.1714285714e+02 blue integer + 2.3857142857e+02 green integer + 2.1142857143e+02 red integer + 4.6428571429e+00 T1 float + 2.9761904762e+00 T2 float + 6.2142857143e+01 G1 integer + 3.0952380952e+01 G2 integer + 3.8095238095e+00 minSize integer + 1.4428571429e+03 maxSize integer + 4.4285714286e+01 minSizePl integer + 2.8000000000e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 6.2857142857e+00 fillHoles integer + 6.4761904762e+00 recon integer + 4.3809523810e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 210: +Active set vector = { 1 } + 3.4377122000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 211 +--------------------- +Parameters for evaluation 211: + 2.1714285714e+02 blue integer + 2.3857142857e+02 green integer + 2.1142857143e+02 red integer + 4.6428571429e+00 T1 float + 2.9761904762e+00 T2 float + 6.2142857143e+01 G1 integer + 3.0952380952e+01 G2 integer + 3.8095238095e+00 minSize integer + 1.4428571429e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 2.8000000000e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 6.2857142857e+00 fillHoles integer + 6.4761904762e+00 recon integer + 4.3809523810e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 211: +Active set vector = { 1 } + 3.2952618000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 212 +--------------------- +Parameters for evaluation 212: + 2.1714285714e+02 blue integer + 2.3857142857e+02 green integer + 2.1142857143e+02 red integer + 4.6428571429e+00 T1 float + 2.9761904762e+00 T2 float + 6.2142857143e+01 G1 integer + 3.0952380952e+01 G2 integer + 3.8095238095e+00 minSize integer + 1.4428571429e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 2.8000000000e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 4.1904761905e+00 fillHoles integer + 6.4761904762e+00 recon integer + 4.3809523810e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 212: +Active set vector = { 1 } + 3.2946765200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 213 +--------------------- +Parameters for evaluation 213: + 2.3285714286e+02 blue integer + 2.3857142857e+02 green integer + 2.1142857143e+02 red integer + 4.6428571429e+00 T1 float + 2.9761904762e+00 T2 float + 6.2142857143e+01 G1 integer + 3.0952380952e+01 G2 integer + 3.8095238095e+00 minSize integer + 1.4428571429e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 2.8000000000e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 4.1904761905e+00 fillHoles integer + 6.4761904762e+00 recon integer + 4.3809523810e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 213: +Active set vector = { 1 } + 3.2946765200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 214 +--------------------- +Parameters for evaluation 214: + 2.3285714286e+02 blue integer + 2.3857142857e+02 green integer + 2.1142857143e+02 red integer + 4.6428571429e+00 T1 float + 2.9761904762e+00 T2 float + 6.2142857143e+01 G1 integer + 1.1047619048e+01 G2 integer + 3.8095238095e+00 minSize integer + 1.4428571429e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 2.8000000000e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 4.1904761905e+00 fillHoles integer + 6.4761904762e+00 recon integer + 4.3809523810e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 214: +Active set vector = { 1 } + 2.6171067200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 215 +--------------------- +Parameters for evaluation 215: + 2.3285714286e+02 blue integer + 2.3857142857e+02 green integer + 2.1142857143e+02 red integer + 7.2619047619e+00 T1 float + 2.9761904762e+00 T2 float + 6.2142857143e+01 G1 integer + 1.1047619048e+01 G2 integer + 3.8095238095e+00 minSize integer + 1.4428571429e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 2.8000000000e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 4.1904761905e+00 fillHoles integer + 6.4761904762e+00 recon integer + 4.3809523810e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 215: +Active set vector = { 1 } + 2.6520558500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 216 +--------------------- +Parameters for evaluation 216: + 2.3285714286e+02 blue integer + 2.3857142857e+02 green integer + 2.1142857143e+02 red integer + 7.2619047619e+00 T1 float + 2.9761904762e+00 T2 float + 6.2142857143e+01 G1 integer + 1.1047619048e+01 G2 integer + 3.8095238095e+00 minSize integer + 1.4428571429e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 6.8857142857e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 4.1904761905e+00 fillHoles integer + 6.4761904762e+00 recon integer + 4.3809523810e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 216: +Active set vector = { 1 } + 2.8369218800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 217 +--------------------- +Parameters for evaluation 217: + 2.3285714286e+02 blue integer + 2.3857142857e+02 green integer + 2.1142857143e+02 red integer + 7.2619047619e+00 T1 float + 2.9761904762e+00 T2 float + 6.2142857143e+01 G1 integer + 1.1047619048e+01 G2 integer + 3.8095238095e+00 minSize integer + 1.1285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 6.8857142857e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 4.1904761905e+00 fillHoles integer + 6.4761904762e+00 recon integer + 4.3809523810e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 217: +Active set vector = { 1 } + 2.8369043500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 218 +--------------------- +Parameters for evaluation 218: + 2.3285714286e+02 blue integer + 2.3857142857e+02 green integer + 2.1142857143e+02 red integer + 7.2619047619e+00 T1 float + 5.5952380952e+00 T2 float + 6.2142857143e+01 G1 integer + 1.1047619048e+01 G2 integer + 3.8095238095e+00 minSize integer + 1.1285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 6.8857142857e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 4.1904761905e+00 fillHoles integer + 6.4761904762e+00 recon integer + 4.3809523810e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 218: +Active set vector = { 1 } + 2.8786433700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 219 +--------------------- +Parameters for evaluation 219: + 2.3285714286e+02 blue integer + 2.3857142857e+02 green integer + 2.2714285714e+02 red integer + 7.2619047619e+00 T1 float + 5.5952380952e+00 T2 float + 6.2142857143e+01 G1 integer + 1.1047619048e+01 G2 integer + 3.8095238095e+00 minSize integer + 1.1285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 6.8857142857e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 4.1904761905e+00 fillHoles integer + 6.4761904762e+00 recon integer + 4.3809523810e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 219: +Active set vector = { 1 } + 2.8786433700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 220 +--------------------- +Parameters for evaluation 220: + 2.3285714286e+02 blue integer + 2.2285714286e+02 green integer + 2.2714285714e+02 red integer + 7.2619047619e+00 T1 float + 5.5952380952e+00 T2 float + 6.2142857143e+01 G1 integer + 1.1047619048e+01 G2 integer + 3.8095238095e+00 minSize integer + 1.1285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 6.8857142857e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 4.1904761905e+00 fillHoles integer + 6.4761904762e+00 recon integer + 4.3809523810e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 220: +Active set vector = { 1 } + 2.8786433700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 221 +--------------------- +Parameters for evaluation 221: + 2.3285714286e+02 blue integer + 2.2285714286e+02 green integer + 2.2714285714e+02 red integer + 7.2619047619e+00 T1 float + 5.5952380952e+00 T2 float + 6.2142857143e+01 G1 integer + 1.1047619048e+01 G2 integer + 3.8095238095e+00 minSize integer + 1.1285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 6.8857142857e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 4.1904761905e+00 fillHoles integer + 6.4761904762e+00 recon integer + 6.4761904762e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 221: +Active set vector = { 1 } + 2.7406846600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 222 +--------------------- +Parameters for evaluation 222: + 2.3285714286e+02 blue integer + 2.2285714286e+02 green integer + 2.2714285714e+02 red integer + 7.2619047619e+00 T1 float + 5.5952380952e+00 T2 float + 6.2142857143e+01 G1 integer + 1.1047619048e+01 G2 integer + 3.8095238095e+00 minSize integer + 1.1285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 6.8857142857e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 4.1904761905e+00 fillHoles integer + 4.3809523810e+00 recon integer + 6.4761904762e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 222: +Active set vector = { 1 } + 3.2232747900e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 223 +--------------------- +Parameters for evaluation 223: + 2.3285714286e+02 blue integer + 2.2285714286e+02 green integer + 2.2714285714e+02 red integer + 7.2619047619e+00 T1 float + 5.5952380952e+00 T2 float + 6.2142857143e+01 G1 integer + 1.1047619048e+01 G2 integer + 2.3714285714e+01 minSize integer + 1.1285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 6.8857142857e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 4.1904761905e+00 fillHoles integer + 4.3809523810e+00 recon integer + 6.4761904762e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 223: +Active set vector = { 1 } + 3.5113664000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 224 +--------------------- +Parameters for evaluation 224: + 2.3285714286e+02 blue integer + 2.2285714286e+02 green integer + 2.2714285714e+02 red integer + 7.2619047619e+00 T1 float + 5.5952380952e+00 T2 float + 2.2857142857e+01 G1 integer + 1.1047619048e+01 G2 integer + 2.3714285714e+01 minSize integer + 1.1285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 6.8857142857e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 4.1904761905e+00 fillHoles integer + 4.3809523810e+00 recon integer + 6.4761904762e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 224: +Active set vector = { 1 } + 3.3112655100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 225 +--------------------- +Parameters for evaluation 225: + 2.2000000000e+02 blue integer + 2.3000000000e+02 green integer + 2.1000000000e+02 red integer + 5.1190476190e+00 T1 float + 2.5000000000e+00 T2 float + 8.5714285714e+00 G1 integer + 1.2857142857e+01 G2 integer + 4.0000000000e+01 minSize integer + 1.0714285714e+03 maxSize integer + 7.6428571429e+01 minSizePl integer + 7.2571428571e+01 minSizeSeg integer + 1.2428571429e+03 maxSizeSeg integer + 4.0000000000e+00 fillHoles integer + 4.1904761905e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 225: +Active set vector = { 1 } + 5.2612289900e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 226 +--------------------- +Parameters for evaluation 226: + 2.2000000000e+02 blue integer + 2.3000000000e+02 green integer + 2.1000000000e+02 red integer + 5.1190476190e+00 T1 float + 2.5000000000e+00 T2 float + 8.5714285714e+00 G1 integer + 1.2857142857e+01 G2 integer + 4.0000000000e+01 minSize integer + 1.0714285714e+03 maxSize integer + 7.6428571429e+01 minSizePl integer + 7.2571428571e+01 minSizeSeg integer + 1.2428571429e+03 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 4.1904761905e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 226: +Active set vector = { 1 } + 5.2170119000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 227 +--------------------- +Parameters for evaluation 227: + 2.2000000000e+02 blue integer + 2.3000000000e+02 green integer + 2.1000000000e+02 red integer + 5.1190476190e+00 T1 float + 2.5000000000e+00 T2 float + 8.5714285714e+00 G1 integer + 1.2857142857e+01 G2 integer + 4.0000000000e+01 minSize integer + 1.0714285714e+03 maxSize integer + 7.6428571429e+01 minSizePl integer + 7.2571428571e+01 minSizeSeg integer + 9.2857142857e+02 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 4.1904761905e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 227: +Active set vector = { 1 } + 5.2181224200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 228 +--------------------- +Parameters for evaluation 228: + 2.2000000000e+02 blue integer + 2.3000000000e+02 green integer + 2.1000000000e+02 red integer + 2.5000000000e+00 T1 float + 2.5000000000e+00 T2 float + 8.5714285714e+00 G1 integer + 1.2857142857e+01 G2 integer + 4.0000000000e+01 minSize integer + 1.0714285714e+03 maxSize integer + 7.6428571429e+01 minSizePl integer + 7.2571428571e+01 minSizeSeg integer + 9.2857142857e+02 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 4.1904761905e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 228: +Active set vector = { 1 } + 5.2932553000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 229 +--------------------- +Parameters for evaluation 229: + 2.2000000000e+02 blue integer + 2.3000000000e+02 green integer + 2.1000000000e+02 red integer + 2.5000000000e+00 T1 float + 2.5000000000e+00 T2 float + 8.5714285714e+00 G1 integer + 1.2857142857e+01 G2 integer + 4.0000000000e+01 minSize integer + 1.0714285714e+03 maxSize integer + 7.6428571429e+01 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 9.2857142857e+02 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 4.1904761905e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 229: +Active set vector = { 1 } + 5.1986012700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 230 +--------------------- +Parameters for evaluation 230: + 2.2000000000e+02 blue integer + 2.3000000000e+02 green integer + 2.1000000000e+02 red integer + 2.5000000000e+00 T1 float + 2.5000000000e+00 T2 float + 8.5714285714e+00 G1 integer + 1.2857142857e+01 G2 integer + 4.0000000000e+01 minSize integer + 1.0714285714e+03 maxSize integer + 7.6428571429e+01 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 9.2857142857e+02 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 4.1904761905e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 230: +Active set vector = { 1 } + 5.1584248400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 231 +--------------------- +Parameters for evaluation 231: + 2.2000000000e+02 blue integer + 2.3000000000e+02 green integer + 2.1000000000e+02 red integer + 2.5000000000e+00 T1 float + 2.5000000000e+00 T2 float + 8.5714285714e+00 G1 integer + 3.2761904762e+01 G2 integer + 4.0000000000e+01 minSize integer + 1.0714285714e+03 maxSize integer + 7.6428571429e+01 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 9.2857142857e+02 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 4.1904761905e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 231: +Active set vector = { 1 } + 5.7432077500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 232 +--------------------- +Parameters for evaluation 232: + 2.2000000000e+02 blue integer + 2.3000000000e+02 green integer + 2.1000000000e+02 red integer + 2.5000000000e+00 T1 float + 2.5000000000e+00 T2 float + 8.5714285714e+00 G1 integer + 3.2761904762e+01 G2 integer + 4.0000000000e+01 minSize integer + 1.0714285714e+03 maxSize integer + 7.6428571429e+01 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 9.2857142857e+02 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 6.2857142857e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 232: +Active set vector = { 1 } + 5.1634512200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 233 +--------------------- +Parameters for evaluation 233: + 2.2000000000e+02 blue integer + 2.3000000000e+02 green integer + 2.1000000000e+02 red integer + 2.5000000000e+00 T1 float + 5.1190476190e+00 T2 float + 8.5714285714e+00 G1 integer + 3.2761904762e+01 G2 integer + 4.0000000000e+01 minSize integer + 1.0714285714e+03 maxSize integer + 7.6428571429e+01 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 9.2857142857e+02 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 6.2857142857e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 233: +Active set vector = { 1 } + 4.9710063500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 234 +--------------------- +Parameters for evaluation 234: + 2.2000000000e+02 blue integer + 2.1428571429e+02 green integer + 2.1000000000e+02 red integer + 2.5000000000e+00 T1 float + 5.1190476190e+00 T2 float + 8.5714285714e+00 G1 integer + 3.2761904762e+01 G2 integer + 4.0000000000e+01 minSize integer + 1.0714285714e+03 maxSize integer + 7.6428571429e+01 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 9.2857142857e+02 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 6.2857142857e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 234: +Active set vector = { 1 } + 4.9710063500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 235 +--------------------- +Parameters for evaluation 235: + 2.2000000000e+02 blue integer + 2.1428571429e+02 green integer + 2.1000000000e+02 red integer + 2.5000000000e+00 T1 float + 5.1190476190e+00 T2 float + 8.5714285714e+00 G1 integer + 3.2761904762e+01 G2 integer + 2.0095238095e+01 minSize integer + 1.0714285714e+03 maxSize integer + 7.6428571429e+01 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 9.2857142857e+02 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 6.2857142857e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 235: +Active set vector = { 1 } + 4.9710063500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 236 +--------------------- +Parameters for evaluation 236: + 2.2000000000e+02 blue integer + 2.1428571429e+02 green integer + 2.1000000000e+02 red integer + 2.5000000000e+00 T1 float + 5.1190476190e+00 T2 float + 8.5714285714e+00 G1 integer + 3.2761904762e+01 G2 integer + 2.0095238095e+01 minSize integer + 1.0714285714e+03 maxSize integer + 3.7142857143e+01 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 9.2857142857e+02 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 6.2857142857e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 236: +Active set vector = { 1 } + 4.5311251200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 237 +--------------------- +Parameters for evaluation 237: + 2.3571428571e+02 blue integer + 2.1428571429e+02 green integer + 2.1000000000e+02 red integer + 2.5000000000e+00 T1 float + 5.1190476190e+00 T2 float + 8.5714285714e+00 G1 integer + 3.2761904762e+01 G2 integer + 2.0095238095e+01 minSize integer + 1.0714285714e+03 maxSize integer + 3.7142857143e+01 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 9.2857142857e+02 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 6.2857142857e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 237: +Active set vector = { 1 } + 4.5310198400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 238 +--------------------- +Parameters for evaluation 238: + 2.3571428571e+02 blue integer + 2.1428571429e+02 green integer + 2.2571428571e+02 red integer + 2.5000000000e+00 T1 float + 5.1190476190e+00 T2 float + 8.5714285714e+00 G1 integer + 3.2761904762e+01 G2 integer + 2.0095238095e+01 minSize integer + 1.0714285714e+03 maxSize integer + 3.7142857143e+01 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 9.2857142857e+02 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 6.2857142857e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 238: +Active set vector = { 1 } + 4.5310198400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 239 +--------------------- +Parameters for evaluation 239: + 2.3571428571e+02 blue integer + 2.1428571429e+02 green integer + 2.2571428571e+02 red integer + 2.5000000000e+00 T1 float + 5.1190476190e+00 T2 float + 8.5714285714e+00 G1 integer + 3.2761904762e+01 G2 integer + 2.0095238095e+01 minSize integer + 1.3857142857e+03 maxSize integer + 3.7142857143e+01 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 9.2857142857e+02 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 6.2857142857e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 239: +Active set vector = { 1 } + 4.2333764300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 240 +--------------------- +Parameters for evaluation 240: + 2.3571428571e+02 blue integer + 2.1428571429e+02 green integer + 2.2571428571e+02 red integer + 2.5000000000e+00 T1 float + 5.1190476190e+00 T2 float + 4.7857142857e+01 G1 integer + 3.2761904762e+01 G2 integer + 2.0095238095e+01 minSize integer + 1.3857142857e+03 maxSize integer + 3.7142857143e+01 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 9.2857142857e+02 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 6.2857142857e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 240: +Active set vector = { 1 } + 3.5174410400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 241 +--------------------- +Parameters for evaluation 241: + 2.2571428571e+02 blue integer + 2.4000000000e+02 green integer + 2.1571428571e+02 red integer + 7.2619047619e+00 T1 float + 4.4047619048e+00 T2 float + 3.7142857143e+01 G1 integer + 2.0000000000e+00 G2 integer + 3.0952380952e+01 minSize integer + 1.1857142857e+03 maxSize integer + 5.5000000000e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.3285714286e+03 maxSizeSeg integer + 6.6666666667e+00 fillHoles integer + 4.1904761905e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 241: +Active set vector = { 1 } + 8.7773918300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 242 +--------------------- +Parameters for evaluation 242: + 2.2571428571e+02 blue integer + 2.4000000000e+02 green integer + 2.3142857143e+02 red integer + 7.2619047619e+00 T1 float + 4.4047619048e+00 T2 float + 3.7142857143e+01 G1 integer + 2.0000000000e+00 G2 integer + 3.0952380952e+01 minSize integer + 1.1857142857e+03 maxSize integer + 5.5000000000e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.3285714286e+03 maxSizeSeg integer + 6.6666666667e+00 fillHoles integer + 4.1904761905e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 242: +Active set vector = { 1 } + 8.7773918300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 243 +--------------------- +Parameters for evaluation 243: + 2.2571428571e+02 blue integer + 2.4000000000e+02 green integer + 2.3142857143e+02 red integer + 7.2619047619e+00 T1 float + 4.4047619048e+00 T2 float + 3.7142857143e+01 G1 integer + 2.0000000000e+00 G2 integer + 3.0952380952e+01 minSize integer + 1.1857142857e+03 maxSize integer + 5.5000000000e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.3285714286e+03 maxSizeSeg integer + 6.6666666667e+00 fillHoles integer + 4.1904761905e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 243: +Active set vector = { 1 } + 8.8383628000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 244 +--------------------- +Parameters for evaluation 244: + 2.2571428571e+02 blue integer + 2.4000000000e+02 green integer + 2.3142857143e+02 red integer + 7.2619047619e+00 T1 float + 7.0238095238e+00 T2 float + 3.7142857143e+01 G1 integer + 2.0000000000e+00 G2 integer + 3.0952380952e+01 minSize integer + 1.1857142857e+03 maxSize integer + 5.5000000000e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.3285714286e+03 maxSizeSeg integer + 6.6666666667e+00 fillHoles integer + 4.1904761905e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 244: +Active set vector = { 1 } + 8.8544362600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 245 +--------------------- +Parameters for evaluation 245: + 2.2571428571e+02 blue integer + 2.4000000000e+02 green integer + 2.3142857143e+02 red integer + 7.2619047619e+00 T1 float + 7.0238095238e+00 T2 float + 3.7142857143e+01 G1 integer + 2.0000000000e+00 G2 integer + 3.0952380952e+01 minSize integer + 1.1857142857e+03 maxSize integer + 1.5714285714e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.3285714286e+03 maxSizeSeg integer + 6.6666666667e+00 fillHoles integer + 4.1904761905e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 245: +Active set vector = { 1 } + 9.1425444500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 246 +--------------------- +Parameters for evaluation 246: + 2.1000000000e+02 blue integer + 2.4000000000e+02 green integer + 2.3142857143e+02 red integer + 7.2619047619e+00 T1 float + 7.0238095238e+00 T2 float + 3.7142857143e+01 G1 integer + 2.0000000000e+00 G2 integer + 3.0952380952e+01 minSize integer + 1.1857142857e+03 maxSize integer + 1.5714285714e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.3285714286e+03 maxSizeSeg integer + 6.6666666667e+00 fillHoles integer + 4.1904761905e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 246: +Active set vector = { 1 } + 9.1425444500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 247 +--------------------- +Parameters for evaluation 247: + 2.1000000000e+02 blue integer + 2.4000000000e+02 green integer + 2.3142857143e+02 red integer + 7.2619047619e+00 T1 float + 7.0238095238e+00 T2 float + 7.6428571429e+01 G1 integer + 2.0000000000e+00 G2 integer + 3.0952380952e+01 minSize integer + 1.1857142857e+03 maxSize integer + 1.5714285714e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.3285714286e+03 maxSizeSeg integer + 6.6666666667e+00 fillHoles integer + 4.1904761905e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 247: +Active set vector = { 1 } + 8.9365752600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 248 +--------------------- +Parameters for evaluation 248: + 2.1000000000e+02 blue integer + 2.4000000000e+02 green integer + 2.3142857143e+02 red integer + 7.2619047619e+00 T1 float + 7.0238095238e+00 T2 float + 7.6428571429e+01 G1 integer + 2.0000000000e+00 G2 integer + 3.0952380952e+01 minSize integer + 1.1857142857e+03 maxSize integer + 1.5714285714e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.3285714286e+03 maxSizeSeg integer + 6.6666666667e+00 fillHoles integer + 6.2857142857e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 248: +Active set vector = { 1 } + 6.4026058500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 249 +--------------------- +Parameters for evaluation 249: + 2.1000000000e+02 blue integer + 2.4000000000e+02 green integer + 2.3142857143e+02 red integer + 7.2619047619e+00 T1 float + 7.0238095238e+00 T2 float + 7.6428571429e+01 G1 integer + 2.0000000000e+00 G2 integer + 3.0952380952e+01 minSize integer + 1.5000000000e+03 maxSize integer + 1.5714285714e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.3285714286e+03 maxSizeSeg integer + 6.6666666667e+00 fillHoles integer + 6.2857142857e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 249: +Active set vector = { 1 } + 6.4026058500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 250 +--------------------- +Parameters for evaluation 250: + 2.1000000000e+02 blue integer + 2.4000000000e+02 green integer + 2.3142857143e+02 red integer + 7.2619047619e+00 T1 float + 7.0238095238e+00 T2 float + 7.6428571429e+01 G1 integer + 2.1904761905e+01 G2 integer + 3.0952380952e+01 minSize integer + 1.5000000000e+03 maxSize integer + 1.5714285714e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.3285714286e+03 maxSizeSeg integer + 6.6666666667e+00 fillHoles integer + 6.2857142857e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 250: +Active set vector = { 1 } + 4.5558357000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 251 +--------------------- +Parameters for evaluation 251: + 2.1000000000e+02 blue integer + 2.4000000000e+02 green integer + 2.3142857143e+02 red integer + 7.2619047619e+00 T1 float + 7.0238095238e+00 T2 float + 7.6428571429e+01 G1 integer + 2.1904761905e+01 G2 integer + 1.1047619048e+01 minSize integer + 1.5000000000e+03 maxSize integer + 1.5714285714e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.3285714286e+03 maxSizeSeg integer + 6.6666666667e+00 fillHoles integer + 6.2857142857e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 251: +Active set vector = { 1 } + 3.5332217300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 252 +--------------------- +Parameters for evaluation 252: + 2.1000000000e+02 blue integer + 2.4000000000e+02 green integer + 2.3142857143e+02 red integer + 7.2619047619e+00 T1 float + 7.0238095238e+00 T2 float + 7.6428571429e+01 G1 integer + 2.1904761905e+01 G2 integer + 1.1047619048e+01 minSize integer + 1.5000000000e+03 maxSize integer + 1.5714285714e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.3285714286e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 6.2857142857e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 252: +Active set vector = { 1 } + 3.5310550100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 253 +--------------------- +Parameters for evaluation 253: + 2.1000000000e+02 blue integer + 2.4000000000e+02 green integer + 2.3142857143e+02 red integer + 7.2619047619e+00 T1 float + 7.0238095238e+00 T2 float + 7.6428571429e+01 G1 integer + 2.1904761905e+01 G2 integer + 1.1047619048e+01 minSize integer + 1.5000000000e+03 maxSize integer + 1.5714285714e+01 minSizePl integer + 5.4000000000e+01 minSizeSeg integer + 1.3285714286e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 6.2857142857e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 253: +Active set vector = { 1 } + 3.6736748100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 254 +--------------------- +Parameters for evaluation 254: + 2.1000000000e+02 blue integer + 2.4000000000e+02 green integer + 2.3142857143e+02 red integer + 4.6428571429e+00 T1 float + 7.0238095238e+00 T2 float + 7.6428571429e+01 G1 integer + 2.1904761905e+01 G2 integer + 1.1047619048e+01 minSize integer + 1.5000000000e+03 maxSize integer + 1.5714285714e+01 minSizePl integer + 5.4000000000e+01 minSizeSeg integer + 1.3285714286e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 6.2857142857e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 254: +Active set vector = { 1 } + 3.6736468100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 255 +--------------------- +Parameters for evaluation 255: + 2.1000000000e+02 blue integer + 2.4000000000e+02 green integer + 2.3142857143e+02 red integer + 4.6428571429e+00 T1 float + 7.0238095238e+00 T2 float + 7.6428571429e+01 G1 integer + 2.1904761905e+01 G2 integer + 1.1047619048e+01 minSize integer + 1.5000000000e+03 maxSize integer + 1.5714285714e+01 minSizePl integer + 5.4000000000e+01 minSizeSeg integer + 1.0142857143e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 6.2857142857e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 255: +Active set vector = { 1 } + 3.6753668000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 256 +--------------------- +Parameters for evaluation 256: + 2.1000000000e+02 blue integer + 2.2428571429e+02 green integer + 2.3142857143e+02 red integer + 4.6428571429e+00 T1 float + 7.0238095238e+00 T2 float + 7.6428571429e+01 G1 integer + 2.1904761905e+01 G2 integer + 1.1047619048e+01 minSize integer + 1.5000000000e+03 maxSize integer + 1.5714285714e+01 minSizePl integer + 5.4000000000e+01 minSizeSeg integer + 1.0142857143e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 6.2857142857e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 256: +Active set vector = { 1 } + 3.6753668000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 257 +--------------------- +Parameters for evaluation 257: + 2.2857142857e+02 blue integer + 2.3428571429e+02 green integer + 2.2428571429e+02 red integer + 3.4523809524e+00 T1 float + 2.5000000000e+00 T2 float + 5.0000000000e+00 G1 integer + 3.8190476190e+01 G2 integer + 2.1904761905e+01 minSize integer + 1.2428571429e+03 maxSize integer + 7.6428571429e+01 minSizePl integer + 3.9142857143e+01 minSizeSeg integer + 1.3000000000e+03 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 5.7142857143e+00 recon integer + 4.5714285714e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 257: +Active set vector = { 1 } + 6.9088727900e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 258 +--------------------- +Parameters for evaluation 258: + 2.2857142857e+02 blue integer + 2.3428571429e+02 green integer + 2.2428571429e+02 red integer + 3.4523809524e+00 T1 float + 2.5000000000e+00 T2 float + 5.0000000000e+00 G1 integer + 3.8190476190e+01 G2 integer + 2.1904761905e+01 minSize integer + 1.2428571429e+03 maxSize integer + 7.6428571429e+01 minSizePl integer + 3.9142857143e+01 minSizeSeg integer + 1.3000000000e+03 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 7.8095238095e+00 recon integer + 4.5714285714e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 258: +Active set vector = { 1 } + 5.9761617100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 259 +--------------------- +Parameters for evaluation 259: + 2.2857142857e+02 blue integer + 2.3428571429e+02 green integer + 2.2428571429e+02 red integer + 3.4523809524e+00 T1 float + 2.5000000000e+00 T2 float + 5.0000000000e+00 G1 integer + 3.8190476190e+01 G2 integer + 2.1904761905e+01 minSize integer + 1.2428571429e+03 maxSize integer + 7.6428571429e+01 minSizePl integer + 3.9142857143e+01 minSizeSeg integer + 9.8571428571e+02 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 7.8095238095e+00 recon integer + 4.5714285714e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 259: +Active set vector = { 1 } + 5.9761707200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 260 +--------------------- +Parameters for evaluation 260: + 2.2857142857e+02 blue integer + 2.1857142857e+02 green integer + 2.2428571429e+02 red integer + 3.4523809524e+00 T1 float + 2.5000000000e+00 T2 float + 5.0000000000e+00 G1 integer + 3.8190476190e+01 G2 integer + 2.1904761905e+01 minSize integer + 1.2428571429e+03 maxSize integer + 7.6428571429e+01 minSizePl integer + 3.9142857143e+01 minSizeSeg integer + 9.8571428571e+02 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 7.8095238095e+00 recon integer + 4.5714285714e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 260: +Active set vector = { 1 } + 5.9761707200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 261 +--------------------- +Parameters for evaluation 261: + 2.2857142857e+02 blue integer + 2.1857142857e+02 green integer + 2.2428571429e+02 red integer + 3.4523809524e+00 T1 float + 5.1190476190e+00 T2 float + 5.0000000000e+00 G1 integer + 3.8190476190e+01 G2 integer + 2.1904761905e+01 minSize integer + 1.2428571429e+03 maxSize integer + 7.6428571429e+01 minSizePl integer + 3.9142857143e+01 minSizeSeg integer + 9.8571428571e+02 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 7.8095238095e+00 recon integer + 4.5714285714e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 261: +Active set vector = { 1 } + 5.8752098500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 262 +--------------------- +Parameters for evaluation 262: + 2.2857142857e+02 blue integer + 2.1857142857e+02 green integer + 2.2428571429e+02 red integer + 3.4523809524e+00 T1 float + 5.1190476190e+00 T2 float + 5.0000000000e+00 G1 integer + 3.8190476190e+01 G2 integer + 2.1904761905e+01 minSize integer + 1.2428571429e+03 maxSize integer + 7.6428571429e+01 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 9.8571428571e+02 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 7.8095238095e+00 recon integer + 4.5714285714e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 262: +Active set vector = { 1 } + 6.1647566000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 263 +--------------------- +Parameters for evaluation 263: + 2.2857142857e+02 blue integer + 2.1857142857e+02 green integer + 2.2428571429e+02 red integer + 6.0714285714e+00 T1 float + 5.1190476190e+00 T2 float + 5.0000000000e+00 G1 integer + 3.8190476190e+01 G2 integer + 2.1904761905e+01 minSize integer + 1.2428571429e+03 maxSize integer + 7.6428571429e+01 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 9.8571428571e+02 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 7.8095238095e+00 recon integer + 4.5714285714e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 263: +Active set vector = { 1 } + 6.1645061300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 264 +--------------------- +Parameters for evaluation 264: + 2.2857142857e+02 blue integer + 2.1857142857e+02 green integer + 2.2428571429e+02 red integer + 6.0714285714e+00 T1 float + 5.1190476190e+00 T2 float + 5.0000000000e+00 G1 integer + 3.8190476190e+01 G2 integer + 2.1904761905e+01 minSize integer + 9.2857142857e+02 maxSize integer + 7.6428571429e+01 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 9.8571428571e+02 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 7.8095238095e+00 recon integer + 4.5714285714e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 264: +Active set vector = { 1 } + 6.4337835700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 265 +--------------------- +Parameters for evaluation 265: + 2.1285714286e+02 blue integer + 2.1857142857e+02 green integer + 2.2428571429e+02 red integer + 6.0714285714e+00 T1 float + 5.1190476190e+00 T2 float + 5.0000000000e+00 G1 integer + 3.8190476190e+01 G2 integer + 2.1904761905e+01 minSize integer + 9.2857142857e+02 maxSize integer + 7.6428571429e+01 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 9.8571428571e+02 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 7.8095238095e+00 recon integer + 4.5714285714e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 265: +Active set vector = { 1 } + 6.4337835700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 266 +--------------------- +Parameters for evaluation 266: + 2.1285714286e+02 blue integer + 2.1857142857e+02 green integer + 2.4000000000e+02 red integer + 6.0714285714e+00 T1 float + 5.1190476190e+00 T2 float + 5.0000000000e+00 G1 integer + 3.8190476190e+01 G2 integer + 2.1904761905e+01 minSize integer + 9.2857142857e+02 maxSize integer + 7.6428571429e+01 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 9.8571428571e+02 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 7.8095238095e+00 recon integer + 4.5714285714e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 266: +Active set vector = { 1 } + 6.4337835700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 267 +--------------------- +Parameters for evaluation 267: + 2.1285714286e+02 blue integer + 2.1857142857e+02 green integer + 2.4000000000e+02 red integer + 6.0714285714e+00 T1 float + 5.1190476190e+00 T2 float + 5.0000000000e+00 G1 integer + 1.8285714286e+01 G2 integer + 2.1904761905e+01 minSize integer + 9.2857142857e+02 maxSize integer + 7.6428571429e+01 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 9.8571428571e+02 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 7.8095238095e+00 recon integer + 4.5714285714e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 267: +Active set vector = { 1 } + 5.2257385800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 268 +--------------------- +Parameters for evaluation 268: + 2.1285714286e+02 blue integer + 2.1857142857e+02 green integer + 2.4000000000e+02 red integer + 6.0714285714e+00 T1 float + 5.1190476190e+00 T2 float + 5.0000000000e+00 G1 integer + 1.8285714286e+01 G2 integer + 2.0000000000e+00 minSize integer + 9.2857142857e+02 maxSize integer + 7.6428571429e+01 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 9.8571428571e+02 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 7.8095238095e+00 recon integer + 4.5714285714e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 268: +Active set vector = { 1 } + 5.2257385800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 269 +--------------------- +Parameters for evaluation 269: + 2.1285714286e+02 blue integer + 2.1857142857e+02 green integer + 2.4000000000e+02 red integer + 6.0714285714e+00 T1 float + 5.1190476190e+00 T2 float + 4.4285714286e+01 G1 integer + 1.8285714286e+01 G2 integer + 2.0000000000e+00 minSize integer + 9.2857142857e+02 maxSize integer + 7.6428571429e+01 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 9.8571428571e+02 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 7.8095238095e+00 recon integer + 4.5714285714e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 269: +Active set vector = { 1 } + 3.0465046300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 270 +--------------------- +Parameters for evaluation 270: + 2.1285714286e+02 blue integer + 2.1857142857e+02 green integer + 2.4000000000e+02 red integer + 6.0714285714e+00 T1 float + 5.1190476190e+00 T2 float + 4.4285714286e+01 G1 integer + 1.8285714286e+01 G2 integer + 2.0000000000e+00 minSize integer + 9.2857142857e+02 maxSize integer + 7.6428571429e+01 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 9.8571428571e+02 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 7.8095238095e+00 recon integer + 6.6666666667e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 270: +Active set vector = { 1 } + 2.8038518600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 271 +--------------------- +Parameters for evaluation 271: + 2.1285714286e+02 blue integer + 2.1857142857e+02 green integer + 2.4000000000e+02 red integer + 6.0714285714e+00 T1 float + 5.1190476190e+00 T2 float + 4.4285714286e+01 G1 integer + 1.8285714286e+01 G2 integer + 2.0000000000e+00 minSize integer + 9.2857142857e+02 maxSize integer + 7.6428571429e+01 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 9.8571428571e+02 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 7.8095238095e+00 recon integer + 6.6666666667e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 271: +Active set vector = { 1 } + 2.8037471500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 272 +--------------------- +Parameters for evaluation 272: + 2.1285714286e+02 blue integer + 2.1857142857e+02 green integer + 2.4000000000e+02 red integer + 6.0714285714e+00 T1 float + 5.1190476190e+00 T2 float + 4.4285714286e+01 G1 integer + 1.8285714286e+01 G2 integer + 2.0000000000e+00 minSize integer + 9.2857142857e+02 maxSize integer + 3.7142857143e+01 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 9.8571428571e+02 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 7.8095238095e+00 recon integer + 6.6666666667e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 272: +Active set vector = { 1 } + 2.7793394900e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 273 +--------------------- +Parameters for evaluation 273: + 2.3285714286e+02 blue integer + 2.1285714286e+02 green integer + 2.1142857143e+02 red integer + 5.8333333333e+00 T1 float + 7.5000000000e+00 T2 float + 5.8571428571e+01 G1 integer + 2.5523809524e+01 G2 integer + 3.8095238095e+00 minSize integer + 1.1000000000e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 9.4285714286e+00 minSizeSeg integer + 1.0142857143e+03 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 6.4761904762e+00 recon integer + 7.6190476190e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 273: +Active set vector = { 1 } + 2.7713392500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 274 +--------------------- +Parameters for evaluation 274: + 2.3285714286e+02 blue integer + 2.1285714286e+02 green integer + 2.1142857143e+02 red integer + 5.8333333333e+00 T1 float + 7.5000000000e+00 T2 float + 5.8571428571e+01 G1 integer + 2.5523809524e+01 G2 integer + 3.8095238095e+00 minSize integer + 1.1000000000e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 9.4285714286e+00 minSizeSeg integer + 1.0142857143e+03 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 4.3809523810e+00 recon integer + 7.6190476190e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 274: +Active set vector = { 1 } + 2.4905718900e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 275 +--------------------- +Parameters for evaluation 275: + 2.3285714286e+02 blue integer + 2.1285714286e+02 green integer + 2.1142857143e+02 red integer + 5.8333333333e+00 T1 float + 7.5000000000e+00 T2 float + 5.8571428571e+01 G1 integer + 2.5523809524e+01 G2 integer + 2.3714285714e+01 minSize integer + 1.1000000000e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 9.4285714286e+00 minSizeSeg integer + 1.0142857143e+03 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 4.3809523810e+00 recon integer + 7.6190476190e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 275: +Active set vector = { 1 } + 2.9266479000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 276 +--------------------- +Parameters for evaluation 276: + 2.3285714286e+02 blue integer + 2.1285714286e+02 green integer + 2.1142857143e+02 red integer + 5.8333333333e+00 T1 float + 7.5000000000e+00 T2 float + 5.8571428571e+01 G1 integer + 2.5523809524e+01 G2 integer + 2.3714285714e+01 minSize integer + 1.1000000000e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 9.4285714286e+00 minSizeSeg integer + 1.0142857143e+03 maxSizeSeg integer + 4.0000000000e+00 fillHoles integer + 4.3809523810e+00 recon integer + 7.6190476190e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 276: +Active set vector = { 1 } + 2.9225914700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 277 +--------------------- +Parameters for evaluation 277: + 2.3285714286e+02 blue integer + 2.1285714286e+02 green integer + 2.1142857143e+02 red integer + 3.2142857143e+00 T1 float + 7.5000000000e+00 T2 float + 5.8571428571e+01 G1 integer + 2.5523809524e+01 G2 integer + 2.3714285714e+01 minSize integer + 1.1000000000e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 9.4285714286e+00 minSizeSeg integer + 1.0142857143e+03 maxSizeSeg integer + 4.0000000000e+00 fillHoles integer + 4.3809523810e+00 recon integer + 7.6190476190e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 277: +Active set vector = { 1 } + 2.9225914700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 278 +--------------------- +Parameters for evaluation 278: + 2.3285714286e+02 blue integer + 2.2857142857e+02 green integer + 2.1142857143e+02 red integer + 3.2142857143e+00 T1 float + 7.5000000000e+00 T2 float + 5.8571428571e+01 G1 integer + 2.5523809524e+01 G2 integer + 2.3714285714e+01 minSize integer + 1.1000000000e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 9.4285714286e+00 minSizeSeg integer + 1.0142857143e+03 maxSizeSeg integer + 4.0000000000e+00 fillHoles integer + 4.3809523810e+00 recon integer + 7.6190476190e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 278: +Active set vector = { 1 } + 2.9225914700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 279 +--------------------- +Parameters for evaluation 279: + 2.3285714286e+02 blue integer + 2.2857142857e+02 green integer + 2.1142857143e+02 red integer + 3.2142857143e+00 T1 float + 7.5000000000e+00 T2 float + 5.8571428571e+01 G1 integer + 2.5523809524e+01 G2 integer + 2.3714285714e+01 minSize integer + 1.1000000000e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 9.4285714286e+00 minSizeSeg integer + 1.3285714286e+03 maxSizeSeg integer + 4.0000000000e+00 fillHoles integer + 4.3809523810e+00 recon integer + 7.6190476190e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 279: +Active set vector = { 1 } + 2.9202293900e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 280 +--------------------- +Parameters for evaluation 280: + 2.3285714286e+02 blue integer + 2.2857142857e+02 green integer + 2.1142857143e+02 red integer + 3.2142857143e+00 T1 float + 7.5000000000e+00 T2 float + 5.8571428571e+01 G1 integer + 5.6190476190e+00 G2 integer + 2.3714285714e+01 minSize integer + 1.1000000000e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 9.4285714286e+00 minSizeSeg integer + 1.3285714286e+03 maxSizeSeg integer + 4.0000000000e+00 fillHoles integer + 4.3809523810e+00 recon integer + 7.6190476190e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 280: +Active set vector = { 1 } + 7.6337672600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 281 +--------------------- +Parameters for evaluation 281: + 2.3285714286e+02 blue integer + 2.2857142857e+02 green integer + 2.1142857143e+02 red integer + 3.2142857143e+00 T1 float + 7.5000000000e+00 T2 float + 1.9285714286e+01 G1 integer + 5.6190476190e+00 G2 integer + 2.3714285714e+01 minSize integer + 1.1000000000e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 9.4285714286e+00 minSizeSeg integer + 1.3285714286e+03 maxSizeSeg integer + 4.0000000000e+00 fillHoles integer + 4.3809523810e+00 recon integer + 7.6190476190e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 281: +Active set vector = { 1 } + 8.3482605900e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 282 +--------------------- +Parameters for evaluation 282: + 2.3285714286e+02 blue integer + 2.2857142857e+02 green integer + 2.1142857143e+02 red integer + 3.2142857143e+00 T1 float + 7.5000000000e+00 T2 float + 1.9285714286e+01 G1 integer + 5.6190476190e+00 G2 integer + 2.3714285714e+01 minSize integer + 1.1000000000e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 5.0285714286e+01 minSizeSeg integer + 1.3285714286e+03 maxSizeSeg integer + 4.0000000000e+00 fillHoles integer + 4.3809523810e+00 recon integer + 7.6190476190e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 282: +Active set vector = { 1 } + 7.5016556000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 283 +--------------------- +Parameters for evaluation 283: + 2.3285714286e+02 blue integer + 2.2857142857e+02 green integer + 2.1142857143e+02 red integer + 3.2142857143e+00 T1 float + 7.5000000000e+00 T2 float + 1.9285714286e+01 G1 integer + 5.6190476190e+00 G2 integer + 2.3714285714e+01 minSize integer + 1.1000000000e+03 maxSize integer + 4.7857142857e+01 minSizePl integer + 5.0285714286e+01 minSizeSeg integer + 1.3285714286e+03 maxSizeSeg integer + 4.0000000000e+00 fillHoles integer + 4.3809523810e+00 recon integer + 7.6190476190e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 283: +Active set vector = { 1 } + 7.0062592500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 284 +--------------------- +Parameters for evaluation 284: + 2.3285714286e+02 blue integer + 2.2857142857e+02 green integer + 2.1142857143e+02 red integer + 3.2142857143e+00 T1 float + 7.5000000000e+00 T2 float + 1.9285714286e+01 G1 integer + 5.6190476190e+00 G2 integer + 2.3714285714e+01 minSize integer + 1.4142857143e+03 maxSize integer + 4.7857142857e+01 minSizePl integer + 5.0285714286e+01 minSizeSeg integer + 1.3285714286e+03 maxSizeSeg integer + 4.0000000000e+00 fillHoles integer + 4.3809523810e+00 recon integer + 7.6190476190e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 284: +Active set vector = { 1 } + 7.0017629400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 285 +--------------------- +Parameters for evaluation 285: + 2.3285714286e+02 blue integer + 2.2857142857e+02 green integer + 2.1142857143e+02 red integer + 3.2142857143e+00 T1 float + 7.5000000000e+00 T2 float + 1.9285714286e+01 G1 integer + 5.6190476190e+00 G2 integer + 2.3714285714e+01 minSize integer + 1.4142857143e+03 maxSize integer + 4.7857142857e+01 minSizePl integer + 5.0285714286e+01 minSizeSeg integer + 1.3285714286e+03 maxSizeSeg integer + 4.0000000000e+00 fillHoles integer + 4.3809523810e+00 recon integer + 5.5238095238e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 285: +Active set vector = { 1 } + 6.9511865100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 286 +--------------------- +Parameters for evaluation 286: + 2.3285714286e+02 blue integer + 2.2857142857e+02 green integer + 2.1142857143e+02 red integer + 3.2142857143e+00 T1 float + 4.8809523810e+00 T2 float + 1.9285714286e+01 G1 integer + 5.6190476190e+00 G2 integer + 2.3714285714e+01 minSize integer + 1.4142857143e+03 maxSize integer + 4.7857142857e+01 minSizePl integer + 5.0285714286e+01 minSizeSeg integer + 1.3285714286e+03 maxSizeSeg integer + 4.0000000000e+00 fillHoles integer + 4.3809523810e+00 recon integer + 5.5238095238e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 286: +Active set vector = { 1 } + 6.9118724900e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 287 +--------------------- +Parameters for evaluation 287: + 2.3285714286e+02 blue integer + 2.2857142857e+02 green integer + 2.2714285714e+02 red integer + 3.2142857143e+00 T1 float + 4.8809523810e+00 T2 float + 1.9285714286e+01 G1 integer + 5.6190476190e+00 G2 integer + 2.3714285714e+01 minSize integer + 1.4142857143e+03 maxSize integer + 4.7857142857e+01 minSizePl integer + 5.0285714286e+01 minSizeSeg integer + 1.3285714286e+03 maxSizeSeg integer + 4.0000000000e+00 fillHoles integer + 4.3809523810e+00 recon integer + 5.5238095238e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 287: +Active set vector = { 1 } + 6.9118724900e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 288 +--------------------- +Parameters for evaluation 288: + 2.1714285714e+02 blue integer + 2.2857142857e+02 green integer + 2.2714285714e+02 red integer + 3.2142857143e+00 T1 float + 4.8809523810e+00 T2 float + 1.9285714286e+01 G1 integer + 5.6190476190e+00 G2 integer + 2.3714285714e+01 minSize integer + 1.4142857143e+03 maxSize integer + 4.7857142857e+01 minSizePl integer + 5.0285714286e+01 minSizeSeg integer + 1.3285714286e+03 maxSizeSeg integer + 4.0000000000e+00 fillHoles integer + 4.3809523810e+00 recon integer + 5.5238095238e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 288: +Active set vector = { 1 } + 6.9118724900e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 289 +--------------------- +Parameters for evaluation 289: + 2.1714285714e+02 blue integer + 2.2714285714e+02 green integer + 2.3857142857e+02 red integer + 7.5000000000e+00 T1 float + 5.5952380952e+00 T2 float + 4.0714285714e+01 G1 integer + 3.6380952381e+01 G2 integer + 2.5523809524e+01 minSize integer + 1.1285714286e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 1.1000000000e+03 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 5.5238095238e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 289: +Active set vector = { 1 } + 4.3100835900e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 290 +--------------------- +Parameters for evaluation 290: + 2.1714285714e+02 blue integer + 2.2714285714e+02 green integer + 2.3857142857e+02 red integer + 7.5000000000e+00 T1 float + 5.5952380952e+00 T2 float + 4.0714285714e+01 G1 integer + 3.6380952381e+01 G2 integer + 2.5523809524e+01 minSize integer + 1.1285714286e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 1.4142857143e+03 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 5.5238095238e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 290: +Active set vector = { 1 } + 4.3105935800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 291 +--------------------- +Parameters for evaluation 291: + 2.1714285714e+02 blue integer + 2.2714285714e+02 green integer + 2.3857142857e+02 red integer + 7.5000000000e+00 T1 float + 5.5952380952e+00 T2 float + 4.0714285714e+01 G1 integer + 1.6476190476e+01 G2 integer + 2.5523809524e+01 minSize integer + 1.1285714286e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 1.4142857143e+03 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 5.5238095238e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 291: +Active set vector = { 1 } + 2.6430417700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 292 +--------------------- +Parameters for evaluation 292: + 2.1714285714e+02 blue integer + 2.1142857143e+02 green integer + 2.3857142857e+02 red integer + 7.5000000000e+00 T1 float + 5.5952380952e+00 T2 float + 4.0714285714e+01 G1 integer + 1.6476190476e+01 G2 integer + 2.5523809524e+01 minSize integer + 1.1285714286e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 1.4142857143e+03 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 5.5238095238e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 292: +Active set vector = { 1 } + 2.6430417700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 293 +--------------------- +Parameters for evaluation 293: + 2.1714285714e+02 blue integer + 2.1142857143e+02 green integer + 2.3857142857e+02 red integer + 7.5000000000e+00 T1 float + 5.5952380952e+00 T2 float + 8.0000000000e+01 G1 integer + 1.6476190476e+01 G2 integer + 2.5523809524e+01 minSize integer + 1.1285714286e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 1.4142857143e+03 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 5.5238095238e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 293: +Active set vector = { 1 } + 4.1405510300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 294 +--------------------- +Parameters for evaluation 294: + 2.1714285714e+02 blue integer + 2.1142857143e+02 green integer + 2.3857142857e+02 red integer + 7.5000000000e+00 T1 float + 2.9761904762e+00 T2 float + 8.0000000000e+01 G1 integer + 1.6476190476e+01 G2 integer + 2.5523809524e+01 minSize integer + 1.1285714286e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 1.4142857143e+03 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 5.5238095238e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 294: +Active set vector = { 1 } + 4.1256099400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 295 +--------------------- +Parameters for evaluation 295: + 2.1714285714e+02 blue integer + 2.1142857143e+02 green integer + 2.3857142857e+02 red integer + 7.5000000000e+00 T1 float + 2.9761904762e+00 T2 float + 8.0000000000e+01 G1 integer + 1.6476190476e+01 G2 integer + 2.5523809524e+01 minSize integer + 1.4428571429e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 8.0000000000e+01 minSizeSeg integer + 1.4142857143e+03 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 5.5238095238e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 295: +Active set vector = { 1 } + 4.1256099400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 296 +--------------------- +Parameters for evaluation 296: + 2.1714285714e+02 blue integer + 2.1142857143e+02 green integer + 2.3857142857e+02 red integer + 7.5000000000e+00 T1 float + 2.9761904762e+00 T2 float + 8.0000000000e+01 G1 integer + 1.6476190476e+01 G2 integer + 2.5523809524e+01 minSize integer + 1.4428571429e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 3.9142857143e+01 minSizeSeg integer + 1.4142857143e+03 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 5.5238095238e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 296: +Active set vector = { 1 } + 4.0677227900e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 297 +--------------------- +Parameters for evaluation 297: + 2.1714285714e+02 blue integer + 2.1142857143e+02 green integer + 2.3857142857e+02 red integer + 7.5000000000e+00 T1 float + 2.9761904762e+00 T2 float + 8.0000000000e+01 G1 integer + 1.6476190476e+01 G2 integer + 2.5523809524e+01 minSize integer + 1.4428571429e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 3.9142857143e+01 minSizeSeg integer + 1.4142857143e+03 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 7.6190476190e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 297: +Active set vector = { 1 } + 4.4823963200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 298 +--------------------- +Parameters for evaluation 298: + 2.1714285714e+02 blue integer + 2.1142857143e+02 green integer + 2.3857142857e+02 red integer + 7.5000000000e+00 T1 float + 2.9761904762e+00 T2 float + 8.0000000000e+01 G1 integer + 1.6476190476e+01 G2 integer + 2.5523809524e+01 minSize integer + 1.4428571429e+03 maxSize integer + 4.0714285714e+01 minSizePl integer + 3.9142857143e+01 minSizeSeg integer + 1.4142857143e+03 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 7.6190476190e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 298: +Active set vector = { 1 } + 4.4194383500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 299 +--------------------- +Parameters for evaluation 299: + 2.1714285714e+02 blue integer + 2.1142857143e+02 green integer + 2.2285714286e+02 red integer + 7.5000000000e+00 T1 float + 2.9761904762e+00 T2 float + 8.0000000000e+01 G1 integer + 1.6476190476e+01 G2 integer + 2.5523809524e+01 minSize integer + 1.4428571429e+03 maxSize integer + 4.0714285714e+01 minSizePl integer + 3.9142857143e+01 minSizeSeg integer + 1.4142857143e+03 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 7.6190476190e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 299: +Active set vector = { 1 } + 4.4194383500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 300 +--------------------- +Parameters for evaluation 300: + 2.1714285714e+02 blue integer + 2.1142857143e+02 green integer + 2.2285714286e+02 red integer + 7.5000000000e+00 T1 float + 2.9761904762e+00 T2 float + 8.0000000000e+01 G1 integer + 1.6476190476e+01 G2 integer + 2.5523809524e+01 minSize integer + 1.4428571429e+03 maxSize integer + 4.0714285714e+01 minSizePl integer + 3.9142857143e+01 minSizeSeg integer + 1.4142857143e+03 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 7.6190476190e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 300: +Active set vector = { 1 } + 4.4351110000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 301 +--------------------- +Parameters for evaluation 301: + 2.1714285714e+02 blue integer + 2.1142857143e+02 green integer + 2.2285714286e+02 red integer + 7.5000000000e+00 T1 float + 2.9761904762e+00 T2 float + 8.0000000000e+01 G1 integer + 1.6476190476e+01 G2 integer + 2.5523809524e+01 minSize integer + 1.4428571429e+03 maxSize integer + 4.0714285714e+01 minSizePl integer + 3.9142857143e+01 minSizeSeg integer + 1.4142857143e+03 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 7.6190476190e+00 recon integer + 4.1904761905e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 301: +Active set vector = { 1 } + 4.4915808100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 302 +--------------------- +Parameters for evaluation 302: + 2.1714285714e+02 blue integer + 2.1142857143e+02 green integer + 2.2285714286e+02 red integer + 7.5000000000e+00 T1 float + 2.9761904762e+00 T2 float + 8.0000000000e+01 G1 integer + 1.6476190476e+01 G2 integer + 5.6190476190e+00 minSize integer + 1.4428571429e+03 maxSize integer + 4.0714285714e+01 minSizePl integer + 3.9142857143e+01 minSizeSeg integer + 1.4142857143e+03 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 7.6190476190e+00 recon integer + 4.1904761905e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 302: +Active set vector = { 1 } + 3.0723845000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 303 +--------------------- +Parameters for evaluation 303: + 2.1714285714e+02 blue integer + 2.1142857143e+02 green integer + 2.2285714286e+02 red integer + 4.8809523810e+00 T1 float + 2.9761904762e+00 T2 float + 8.0000000000e+01 G1 integer + 1.6476190476e+01 G2 integer + 5.6190476190e+00 minSize integer + 1.4428571429e+03 maxSize integer + 4.0714285714e+01 minSizePl integer + 3.9142857143e+01 minSizeSeg integer + 1.4142857143e+03 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 7.6190476190e+00 recon integer + 4.1904761905e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 303: +Active set vector = { 1 } + 3.0674428600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 304 +--------------------- +Parameters for evaluation 304: + 2.3285714286e+02 blue integer + 2.1142857143e+02 green integer + 2.2285714286e+02 red integer + 4.8809523810e+00 T1 float + 2.9761904762e+00 T2 float + 8.0000000000e+01 G1 integer + 1.6476190476e+01 G2 integer + 5.6190476190e+00 minSize integer + 1.4428571429e+03 maxSize integer + 4.0714285714e+01 minSizePl integer + 3.9142857143e+01 minSizeSeg integer + 1.4142857143e+03 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 7.6190476190e+00 recon integer + 4.1904761905e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 304: +Active set vector = { 1 } + 3.0668980100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 305 +--------------------- +Parameters for evaluation 305: + 2.3285714286e+02 blue integer + 2.4000000000e+02 green integer + 2.1428571429e+02 red integer + 2.9761904762e+00 T1 float + 6.3095238095e+00 T2 float + 1.9285714286e+01 G1 integer + 2.0095238095e+01 G2 integer + 2.0000000000e+00 minSize integer + 1.0142857143e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 8.0000000000e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 305: +Active set vector = { 1 } + 3.0119996000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 306 +--------------------- +Parameters for evaluation 306: + 2.3285714286e+02 blue integer + 2.4000000000e+02 green integer + 2.1428571429e+02 red integer + 2.9761904762e+00 T1 float + 6.3095238095e+00 T2 float + 1.9285714286e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.0000000000e+00 minSize integer + 1.0142857143e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 8.0000000000e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 306: +Active set vector = { 1 } + 4.1477711800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 307 +--------------------- +Parameters for evaluation 307: + 2.3285714286e+02 blue integer + 2.4000000000e+02 green integer + 2.1428571429e+02 red integer + 2.9761904762e+00 T1 float + 6.3095238095e+00 T2 float + 1.9285714286e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.0000000000e+00 minSize integer + 1.0142857143e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 5.9047619048e+00 fillHoles integer + 5.9047619048e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 307: +Active set vector = { 1 } + 4.0089450800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 308 +--------------------- +Parameters for evaluation 308: + 2.3285714286e+02 blue integer + 2.4000000000e+02 green integer + 2.1428571429e+02 red integer + 2.9761904762e+00 T1 float + 6.3095238095e+00 T2 float + 1.9285714286e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.0000000000e+00 minSize integer + 1.0142857143e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 5.9047619048e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 308: +Active set vector = { 1 } + 3.9985509500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 309 +--------------------- +Parameters for evaluation 309: + 2.3285714286e+02 blue integer + 2.4000000000e+02 green integer + 2.1428571429e+02 red integer + 2.9761904762e+00 T1 float + 6.3095238095e+00 T2 float + 5.8571428571e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.0000000000e+00 minSize integer + 1.0142857143e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 5.9047619048e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 309: +Active set vector = { 1 } + 3.6413893000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 310 +--------------------- +Parameters for evaluation 310: + 2.3285714286e+02 blue integer + 2.2428571429e+02 green integer + 2.1428571429e+02 red integer + 2.9761904762e+00 T1 float + 6.3095238095e+00 T2 float + 5.8571428571e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.0000000000e+00 minSize integer + 1.0142857143e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 5.9047619048e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 310: +Active set vector = { 1 } + 3.6413893000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 311 +--------------------- +Parameters for evaluation 311: + 2.3285714286e+02 blue integer + 2.2428571429e+02 green integer + 2.1428571429e+02 red integer + 2.9761904762e+00 T1 float + 6.3095238095e+00 T2 float + 5.8571428571e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.0000000000e+00 minSize integer + 1.3285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 5.9047619048e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 311: +Active set vector = { 1 } + 3.6413154900e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 312 +--------------------- +Parameters for evaluation 312: + 2.1714285714e+02 blue integer + 2.2428571429e+02 green integer + 2.1428571429e+02 red integer + 2.9761904762e+00 T1 float + 6.3095238095e+00 T2 float + 5.8571428571e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.0000000000e+00 minSize integer + 1.3285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 5.9047619048e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 312: +Active set vector = { 1 } + 3.6413154900e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 313 +--------------------- +Parameters for evaluation 313: + 2.1714285714e+02 blue integer + 2.2428571429e+02 green integer + 2.1428571429e+02 red integer + 2.9761904762e+00 T1 float + 6.3095238095e+00 T2 float + 5.8571428571e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.0000000000e+00 minSize integer + 1.3285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 5.9047619048e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 313: +Active set vector = { 1 } + 3.6410148400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 314 +--------------------- +Parameters for evaluation 314: + 2.1714285714e+02 blue integer + 2.2428571429e+02 green integer + 2.3000000000e+02 red integer + 2.9761904762e+00 T1 float + 6.3095238095e+00 T2 float + 5.8571428571e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.0000000000e+00 minSize integer + 1.3285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 5.9047619048e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 314: +Active set vector = { 1 } + 3.6410148400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 315 +--------------------- +Parameters for evaluation 315: + 2.1714285714e+02 blue integer + 2.2428571429e+02 green integer + 2.3000000000e+02 red integer + 2.9761904762e+00 T1 float + 6.3095238095e+00 T2 float + 5.8571428571e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.0000000000e+00 minSize integer + 1.3285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 5.9047619048e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 315: +Active set vector = { 1 } + 3.7270759600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 316 +--------------------- +Parameters for evaluation 316: + 2.1714285714e+02 blue integer + 2.2428571429e+02 green integer + 2.3000000000e+02 red integer + 2.9761904762e+00 T1 float + 6.3095238095e+00 T2 float + 5.8571428571e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.0000000000e+00 minSize integer + 1.3285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 4.6571428571e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 5.9047619048e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 316: +Active set vector = { 1 } + 4.1815079500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 317 +--------------------- +Parameters for evaluation 317: + 2.1714285714e+02 blue integer + 2.2428571429e+02 green integer + 2.3000000000e+02 red integer + 2.9761904762e+00 T1 float + 6.3095238095e+00 T2 float + 5.8571428571e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.1904761905e+01 minSize integer + 1.3285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 4.6571428571e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 5.9047619048e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 317: +Active set vector = { 1 } + 4.2836768600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 318 +--------------------- +Parameters for evaluation 318: + 2.1714285714e+02 blue integer + 2.2428571429e+02 green integer + 2.3000000000e+02 red integer + 2.9761904762e+00 T1 float + 3.6904761905e+00 T2 float + 5.8571428571e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.1904761905e+01 minSize integer + 1.3285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 4.6571428571e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 5.9047619048e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 318: +Active set vector = { 1 } + 4.2760747900e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 319 +--------------------- +Parameters for evaluation 319: + 2.1714285714e+02 blue integer + 2.2428571429e+02 green integer + 2.3000000000e+02 red integer + 5.5952380952e+00 T1 float + 3.6904761905e+00 T2 float + 5.8571428571e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.1904761905e+01 minSize integer + 1.3285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 4.6571428571e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 5.9047619048e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 319: +Active set vector = { 1 } + 4.2753739700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 320 +--------------------- +Parameters for evaluation 320: + 2.1714285714e+02 blue integer + 2.2428571429e+02 green integer + 2.3000000000e+02 red integer + 5.5952380952e+00 T1 float + 3.6904761905e+00 T2 float + 5.8571428571e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.1904761905e+01 minSize integer + 1.3285714286e+03 maxSize integer + 4.4285714286e+01 minSizePl integer + 4.6571428571e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 8.0000000000e+00 fillHoles integer + 5.9047619048e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 320: +Active set vector = { 1 } + 4.3079139700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 321 +--------------------- +Parameters for evaluation 321: + 2.3142857143e+02 blue integer + 2.2571428571e+02 green integer + 2.2000000000e+02 red integer + 7.0238095238e+00 T1 float + 6.3095238095e+00 T2 float + 4.4285714286e+01 G1 integer + 1.2857142857e+01 G2 integer + 1.4666666667e+01 minSize integer + 1.2428571429e+03 maxSize integer + 4.0714285714e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 6.6666666667e+00 fillHoles integer + 5.5238095238e+00 recon integer + 6.0952380952e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 321: +Active set vector = { 1 } + 2.8257418100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 322 +--------------------- +Parameters for evaluation 322: + 2.3142857143e+02 blue integer + 2.2571428571e+02 green integer + 2.2000000000e+02 red integer + 7.0238095238e+00 T1 float + 6.3095238095e+00 T2 float + 4.4285714286e+01 G1 integer + 1.2857142857e+01 G2 integer + 1.4666666667e+01 minSize integer + 1.2428571429e+03 maxSize integer + 4.0714285714e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 5.5238095238e+00 recon integer + 6.0952380952e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 322: +Active set vector = { 1 } + 2.8262401300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 323 +--------------------- +Parameters for evaluation 323: + 2.1571428571e+02 blue integer + 2.2571428571e+02 green integer + 2.2000000000e+02 red integer + 7.0238095238e+00 T1 float + 6.3095238095e+00 T2 float + 4.4285714286e+01 G1 integer + 1.2857142857e+01 G2 integer + 1.4666666667e+01 minSize integer + 1.2428571429e+03 maxSize integer + 4.0714285714e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 5.5238095238e+00 recon integer + 6.0952380952e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 323: +Active set vector = { 1 } + 2.8262401300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 324 +--------------------- +Parameters for evaluation 324: + 2.1571428571e+02 blue integer + 2.2571428571e+02 green integer + 2.3571428571e+02 red integer + 7.0238095238e+00 T1 float + 6.3095238095e+00 T2 float + 4.4285714286e+01 G1 integer + 1.2857142857e+01 G2 integer + 1.4666666667e+01 minSize integer + 1.2428571429e+03 maxSize integer + 4.0714285714e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 5.5238095238e+00 recon integer + 6.0952380952e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 324: +Active set vector = { 1 } + 2.8262401300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 325 +--------------------- +Parameters for evaluation 325: + 2.1571428571e+02 blue integer + 2.2571428571e+02 green integer + 2.3571428571e+02 red integer + 7.0238095238e+00 T1 float + 6.3095238095e+00 T2 float + 4.4285714286e+01 G1 integer + 1.2857142857e+01 G2 integer + 1.4666666667e+01 minSize integer + 1.2428571429e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 5.5238095238e+00 recon integer + 6.0952380952e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 325: +Active set vector = { 1 } + 2.9158815800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 326 +--------------------- +Parameters for evaluation 326: + 2.1571428571e+02 blue integer + 2.2571428571e+02 green integer + 2.3571428571e+02 red integer + 7.0238095238e+00 T1 float + 6.3095238095e+00 T2 float + 4.4285714286e+01 G1 integer + 1.2857142857e+01 G2 integer + 1.4666666667e+01 minSize integer + 1.2428571429e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 5.4000000000e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 5.5238095238e+00 recon integer + 6.0952380952e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 326: +Active set vector = { 1 } + 2.9137630500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 327 +--------------------- +Parameters for evaluation 327: + 2.1571428571e+02 blue integer + 2.2571428571e+02 green integer + 2.3571428571e+02 red integer + 7.0238095238e+00 T1 float + 6.3095238095e+00 T2 float + 5.0000000000e+00 G1 integer + 1.2857142857e+01 G2 integer + 1.4666666667e+01 minSize integer + 1.2428571429e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 5.4000000000e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 5.5238095238e+00 recon integer + 6.0952380952e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 327: +Active set vector = { 1 } + 6.4439797800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 328 +--------------------- +Parameters for evaluation 328: + 2.1571428571e+02 blue integer + 2.2571428571e+02 green integer + 2.3571428571e+02 red integer + 7.0238095238e+00 T1 float + 6.3095238095e+00 T2 float + 5.0000000000e+00 G1 integer + 1.2857142857e+01 G2 integer + 3.4571428571e+01 minSize integer + 1.2428571429e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 5.4000000000e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 5.5238095238e+00 recon integer + 6.0952380952e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 328: +Active set vector = { 1 } + 6.4439797800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 329 +--------------------- +Parameters for evaluation 329: + 2.1571428571e+02 blue integer + 2.2571428571e+02 green integer + 2.3571428571e+02 red integer + 7.0238095238e+00 T1 float + 6.3095238095e+00 T2 float + 5.0000000000e+00 G1 integer + 1.2857142857e+01 G2 integer + 3.4571428571e+01 minSize integer + 1.2428571429e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 5.4000000000e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 5.5238095238e+00 recon integer + 4.0000000000e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 329: +Active set vector = { 1 } + 6.4769420700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 330 +--------------------- +Parameters for evaluation 330: + 2.1571428571e+02 blue integer + 2.2571428571e+02 green integer + 2.3571428571e+02 red integer + 7.0238095238e+00 T1 float + 6.3095238095e+00 T2 float + 5.0000000000e+00 G1 integer + 1.2857142857e+01 G2 integer + 3.4571428571e+01 minSize integer + 1.2428571429e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 5.4000000000e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 7.6190476190e+00 recon integer + 4.0000000000e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 330: +Active set vector = { 1 } + 4.4953658400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 331 +--------------------- +Parameters for evaluation 331: + 2.1571428571e+02 blue integer + 2.2571428571e+02 green integer + 2.3571428571e+02 red integer + 4.4047619048e+00 T1 float + 6.3095238095e+00 T2 float + 5.0000000000e+00 G1 integer + 1.2857142857e+01 G2 integer + 3.4571428571e+01 minSize integer + 1.2428571429e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 5.4000000000e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 7.6190476190e+00 recon integer + 4.0000000000e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 331: +Active set vector = { 1 } + 4.4949953400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 332 +--------------------- +Parameters for evaluation 332: + 2.1571428571e+02 blue integer + 2.1000000000e+02 green integer + 2.3571428571e+02 red integer + 4.4047619048e+00 T1 float + 6.3095238095e+00 T2 float + 5.0000000000e+00 G1 integer + 1.2857142857e+01 G2 integer + 3.4571428571e+01 minSize integer + 1.2428571429e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 5.4000000000e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 7.6190476190e+00 recon integer + 4.0000000000e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 332: +Active set vector = { 1 } + 4.4949953400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 333 +--------------------- +Parameters for evaluation 333: + 2.1571428571e+02 blue integer + 2.1000000000e+02 green integer + 2.3571428571e+02 red integer + 4.4047619048e+00 T1 float + 6.3095238095e+00 T2 float + 5.0000000000e+00 G1 integer + 1.2857142857e+01 G2 integer + 3.4571428571e+01 minSize integer + 9.2857142857e+02 maxSize integer + 8.0000000000e+01 minSizePl integer + 5.4000000000e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 7.6190476190e+00 recon integer + 4.0000000000e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 333: +Active set vector = { 1 } + 4.9681512600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 334 +--------------------- +Parameters for evaluation 334: + 2.1571428571e+02 blue integer + 2.1000000000e+02 green integer + 2.3571428571e+02 red integer + 4.4047619048e+00 T1 float + 6.3095238095e+00 T2 float + 5.0000000000e+00 G1 integer + 1.2857142857e+01 G2 integer + 3.4571428571e+01 minSize integer + 9.2857142857e+02 maxSize integer + 8.0000000000e+01 minSizePl integer + 5.4000000000e+01 minSizeSeg integer + 1.1285714286e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 7.6190476190e+00 recon integer + 4.0000000000e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 334: +Active set vector = { 1 } + 4.9681512600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 335 +--------------------- +Parameters for evaluation 335: + 2.1571428571e+02 blue integer + 2.1000000000e+02 green integer + 2.3571428571e+02 red integer + 4.4047619048e+00 T1 float + 3.6904761905e+00 T2 float + 5.0000000000e+00 G1 integer + 1.2857142857e+01 G2 integer + 3.4571428571e+01 minSize integer + 9.2857142857e+02 maxSize integer + 8.0000000000e+01 minSizePl integer + 5.4000000000e+01 minSizeSeg integer + 1.1285714286e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 7.6190476190e+00 recon integer + 4.0000000000e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 335: +Active set vector = { 1 } + 4.9488750500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 336 +--------------------- +Parameters for evaluation 336: + 2.1571428571e+02 blue integer + 2.1000000000e+02 green integer + 2.3571428571e+02 red integer + 4.4047619048e+00 T1 float + 3.6904761905e+00 T2 float + 5.0000000000e+00 G1 integer + 3.2761904762e+01 G2 integer + 3.4571428571e+01 minSize integer + 9.2857142857e+02 maxSize integer + 8.0000000000e+01 minSizePl integer + 5.4000000000e+01 minSizeSeg integer + 1.1285714286e+03 maxSizeSeg integer + 4.5714285714e+00 fillHoles integer + 7.6190476190e+00 recon integer + 4.0000000000e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 336: +Active set vector = { 1 } + 5.9182041500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 337 +--------------------- +Parameters for evaluation 337: + 2.3714285714e+02 blue integer + 2.3285714286e+02 green integer + 2.2571428571e+02 red integer + 2.5000000000e+00 T1 float + 4.8809523810e+00 T2 float + 4.0714285714e+01 G1 integer + 2.0095238095e+01 G2 integer + 3.8095238095e+00 minSize integer + 1.3000000000e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 4.6571428571e+01 minSizeSeg integer + 1.4714285714e+03 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 8.0000000000e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 337: +Active set vector = { 1 } + 2.5777724000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 338 +--------------------- +Parameters for evaluation 338: + 2.3714285714e+02 blue integer + 2.3285714286e+02 green integer + 2.2571428571e+02 red integer + 2.5000000000e+00 T1 float + 4.8809523810e+00 T2 float + 8.0000000000e+01 G1 integer + 2.0095238095e+01 G2 integer + 3.8095238095e+00 minSize integer + 1.3000000000e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 4.6571428571e+01 minSizeSeg integer + 1.4714285714e+03 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 8.0000000000e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 338: +Active set vector = { 1 } + 3.0296327800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 339 +--------------------- +Parameters for evaluation 339: + 2.3714285714e+02 blue integer + 2.3285714286e+02 green integer + 2.2571428571e+02 red integer + 2.5000000000e+00 T1 float + 4.8809523810e+00 T2 float + 8.0000000000e+01 G1 integer + 2.0095238095e+01 G2 integer + 3.8095238095e+00 minSize integer + 1.3000000000e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 4.6571428571e+01 minSizeSeg integer + 1.4714285714e+03 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 8.0000000000e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 339: +Active set vector = { 1 } + 2.9159345300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 340 +--------------------- +Parameters for evaluation 340: + 2.3714285714e+02 blue integer + 2.3285714286e+02 green integer + 2.2571428571e+02 red integer + 2.5000000000e+00 T1 float + 4.8809523810e+00 T2 float + 8.0000000000e+01 G1 integer + 2.0095238095e+01 G2 integer + 3.8095238095e+00 minSize integer + 1.3000000000e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 4.6571428571e+01 minSizeSeg integer + 1.1571428571e+03 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 8.0000000000e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 340: +Active set vector = { 1 } + 2.9146113500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 341 +--------------------- +Parameters for evaluation 341: + 2.3714285714e+02 blue integer + 2.3285714286e+02 green integer + 2.2571428571e+02 red integer + 2.5000000000e+00 T1 float + 4.8809523810e+00 T2 float + 8.0000000000e+01 G1 integer + 2.0095238095e+01 G2 integer + 2.3714285714e+01 minSize integer + 1.3000000000e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 4.6571428571e+01 minSizeSeg integer + 1.1571428571e+03 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 8.0000000000e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 341: +Active set vector = { 1 } + 4.4671751600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 342 +--------------------- +Parameters for evaluation 342: + 2.3714285714e+02 blue integer + 2.3285714286e+02 green integer + 2.2571428571e+02 red integer + 2.5000000000e+00 T1 float + 4.8809523810e+00 T2 float + 8.0000000000e+01 G1 integer + 2.0095238095e+01 G2 integer + 2.3714285714e+01 minSize integer + 9.8571428571e+02 maxSize integer + 8.5714285714e+00 minSizePl integer + 4.6571428571e+01 minSizeSeg integer + 1.1571428571e+03 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 8.0000000000e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 342: +Active set vector = { 1 } + 4.4671884000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 343 +--------------------- +Parameters for evaluation 343: + 2.3714285714e+02 blue integer + 2.3285714286e+02 green integer + 2.1000000000e+02 red integer + 2.5000000000e+00 T1 float + 4.8809523810e+00 T2 float + 8.0000000000e+01 G1 integer + 2.0095238095e+01 G2 integer + 2.3714285714e+01 minSize integer + 9.8571428571e+02 maxSize integer + 8.5714285714e+00 minSizePl integer + 4.6571428571e+01 minSizeSeg integer + 1.1571428571e+03 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 8.0000000000e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 343: +Active set vector = { 1 } + 4.4671884000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 344 +--------------------- +Parameters for evaluation 344: + 2.3714285714e+02 blue integer + 2.3285714286e+02 green integer + 2.1000000000e+02 red integer + 2.5000000000e+00 T1 float + 4.8809523810e+00 T2 float + 8.0000000000e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.3714285714e+01 minSize integer + 9.8571428571e+02 maxSize integer + 8.5714285714e+00 minSizePl integer + 4.6571428571e+01 minSizeSeg integer + 1.1571428571e+03 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 8.0000000000e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 344: +Active set vector = { 1 } + 5.4421404300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 345 +--------------------- +Parameters for evaluation 345: + 2.3714285714e+02 blue integer + 2.3285714286e+02 green integer + 2.1000000000e+02 red integer + 2.5000000000e+00 T1 float + 4.8809523810e+00 T2 float + 8.0000000000e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.3714285714e+01 minSize integer + 9.8571428571e+02 maxSize integer + 8.5714285714e+00 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 1.1571428571e+03 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 8.0000000000e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 345: +Active set vector = { 1 } + 5.3979836800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 346 +--------------------- +Parameters for evaluation 346: + 2.3714285714e+02 blue integer + 2.3285714286e+02 green integer + 2.1000000000e+02 red integer + 2.5000000000e+00 T1 float + 7.5000000000e+00 T2 float + 8.0000000000e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.3714285714e+01 minSize integer + 9.8571428571e+02 maxSize integer + 8.5714285714e+00 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 1.1571428571e+03 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 8.0000000000e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 346: +Active set vector = { 1 } + 5.3989739300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 347 +--------------------- +Parameters for evaluation 347: + 2.2142857143e+02 blue integer + 2.3285714286e+02 green integer + 2.1000000000e+02 red integer + 2.5000000000e+00 T1 float + 7.5000000000e+00 T2 float + 8.0000000000e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.3714285714e+01 minSize integer + 9.8571428571e+02 maxSize integer + 8.5714285714e+00 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 1.1571428571e+03 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 8.0000000000e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 347: +Active set vector = { 1 } + 5.3989739300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 348 +--------------------- +Parameters for evaluation 348: + 2.2142857143e+02 blue integer + 2.3285714286e+02 green integer + 2.1000000000e+02 red integer + 2.5000000000e+00 T1 float + 7.5000000000e+00 T2 float + 8.0000000000e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.3714285714e+01 minSize integer + 9.8571428571e+02 maxSize integer + 8.5714285714e+00 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 1.1571428571e+03 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 5.9047619048e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 348: +Active set vector = { 1 } + 4.9932445100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 349 +--------------------- +Parameters for evaluation 349: + 2.2142857143e+02 blue integer + 2.3285714286e+02 green integer + 2.1000000000e+02 red integer + 5.1190476190e+00 T1 float + 7.5000000000e+00 T2 float + 8.0000000000e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.3714285714e+01 minSize integer + 9.8571428571e+02 maxSize integer + 8.5714285714e+00 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 1.1571428571e+03 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 5.9047619048e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 349: +Active set vector = { 1 } + 4.9932445100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 350 +--------------------- +Parameters for evaluation 350: + 2.2142857143e+02 blue integer + 2.3285714286e+02 green integer + 2.1000000000e+02 red integer + 5.1190476190e+00 T1 float + 7.5000000000e+00 T2 float + 8.0000000000e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.3714285714e+01 minSize integer + 9.8571428571e+02 maxSize integer + 8.5714285714e+00 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 1.1571428571e+03 maxSizeSeg integer + 4.0000000000e+00 fillHoles integer + 5.9047619048e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 350: +Active set vector = { 1 } + 4.9842680700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 351 +--------------------- +Parameters for evaluation 351: + 2.2142857143e+02 blue integer + 2.3285714286e+02 green integer + 2.1000000000e+02 red integer + 5.1190476190e+00 T1 float + 7.5000000000e+00 T2 float + 8.0000000000e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.3714285714e+01 minSize integer + 9.8571428571e+02 maxSize integer + 4.7857142857e+01 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 1.1571428571e+03 maxSizeSeg integer + 4.0000000000e+00 fillHoles integer + 5.9047619048e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 351: +Active set vector = { 1 } + 5.0210730100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 352 +--------------------- +Parameters for evaluation 352: + 2.2142857143e+02 blue integer + 2.1714285714e+02 green integer + 2.1000000000e+02 red integer + 5.1190476190e+00 T1 float + 7.5000000000e+00 T2 float + 8.0000000000e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.3714285714e+01 minSize integer + 9.8571428571e+02 maxSize integer + 4.7857142857e+01 minSizePl integer + 5.7142857143e+00 minSizeSeg integer + 1.1571428571e+03 maxSizeSeg integer + 4.0000000000e+00 fillHoles integer + 5.9047619048e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 352: +Active set vector = { 1 } + 5.0210730100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 353 +--------------------- +Parameters for evaluation 353: + 2.1000000000e+02 blue integer + 2.1000000000e+02 green integer + 2.2428571429e+02 red integer + 5.5952380952e+00 T1 float + 2.7380952381e+00 T2 float + 4.4285714286e+01 G1 integer + 2.3714285714e+01 G2 integer + 4.0000000000e+01 minSize integer + 9.2857142857e+02 maxSize integer + 3.0000000000e+01 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 1.5000000000e+03 maxSizeSeg integer + 5.3333333333e+00 fillHoles integer + 6.4761904762e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 353: +Active set vector = { 1 } + 2.9716293700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 354 +--------------------- +Parameters for evaluation 354: + 2.1000000000e+02 blue integer + 2.1000000000e+02 green integer + 2.4000000000e+02 red integer + 5.5952380952e+00 T1 float + 2.7380952381e+00 T2 float + 4.4285714286e+01 G1 integer + 2.3714285714e+01 G2 integer + 4.0000000000e+01 minSize integer + 9.2857142857e+02 maxSize integer + 3.0000000000e+01 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 1.5000000000e+03 maxSizeSeg integer + 5.3333333333e+00 fillHoles integer + 6.4761904762e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 354: +Active set vector = { 1 } + 2.9704404100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 355 +--------------------- +Parameters for evaluation 355: + 2.1000000000e+02 blue integer + 2.1000000000e+02 green integer + 2.4000000000e+02 red integer + 5.5952380952e+00 T1 float + 2.7380952381e+00 T2 float + 4.4285714286e+01 G1 integer + 2.3714285714e+01 G2 integer + 4.0000000000e+01 minSize integer + 9.2857142857e+02 maxSize integer + 3.0000000000e+01 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 1.5000000000e+03 maxSizeSeg integer + 5.3333333333e+00 fillHoles integer + 4.3809523810e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 355: +Active set vector = { 1 } + 2.6069279900e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 356 +--------------------- +Parameters for evaluation 356: + 2.1000000000e+02 blue integer + 2.1000000000e+02 green integer + 2.4000000000e+02 red integer + 5.5952380952e+00 T1 float + 5.3571428571e+00 T2 float + 4.4285714286e+01 G1 integer + 2.3714285714e+01 G2 integer + 4.0000000000e+01 minSize integer + 9.2857142857e+02 maxSize integer + 3.0000000000e+01 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 1.5000000000e+03 maxSizeSeg integer + 5.3333333333e+00 fillHoles integer + 4.3809523810e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 356: +Active set vector = { 1 } + 2.6244674600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 357 +--------------------- +Parameters for evaluation 357: + 2.1000000000e+02 blue integer + 2.1000000000e+02 green integer + 2.4000000000e+02 red integer + 5.5952380952e+00 T1 float + 5.3571428571e+00 T2 float + 4.4285714286e+01 G1 integer + 2.3714285714e+01 G2 integer + 2.0095238095e+01 minSize integer + 9.2857142857e+02 maxSize integer + 3.0000000000e+01 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 1.5000000000e+03 maxSizeSeg integer + 5.3333333333e+00 fillHoles integer + 4.3809523810e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 357: +Active set vector = { 1 } + 2.3909605600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 358 +--------------------- +Parameters for evaluation 358: + 2.1000000000e+02 blue integer + 2.1000000000e+02 green integer + 2.4000000000e+02 red integer + 5.5952380952e+00 T1 float + 5.3571428571e+00 T2 float + 4.4285714286e+01 G1 integer + 3.8095238095e+00 G2 integer + 2.0095238095e+01 minSize integer + 9.2857142857e+02 maxSize integer + 3.0000000000e+01 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 1.5000000000e+03 maxSizeSeg integer + 5.3333333333e+00 fillHoles integer + 4.3809523810e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 358: +Active set vector = { 1 } + 8.9535575300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 359 +--------------------- +Parameters for evaluation 359: + 2.1000000000e+02 blue integer + 2.1000000000e+02 green integer + 2.4000000000e+02 red integer + 5.5952380952e+00 T1 float + 5.3571428571e+00 T2 float + 5.0000000000e+00 G1 integer + 3.8095238095e+00 G2 integer + 2.0095238095e+01 minSize integer + 9.2857142857e+02 maxSize integer + 3.0000000000e+01 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 1.5000000000e+03 maxSizeSeg integer + 5.3333333333e+00 fillHoles integer + 4.3809523810e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 359: +Active set vector = { 1 } + 9.7389100200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 360 +--------------------- +Parameters for evaluation 360: + 2.1000000000e+02 blue integer + 2.1000000000e+02 green integer + 2.4000000000e+02 red integer + 5.5952380952e+00 T1 float + 5.3571428571e+00 T2 float + 5.0000000000e+00 G1 integer + 3.8095238095e+00 G2 integer + 2.0095238095e+01 minSize integer + 9.2857142857e+02 maxSize integer + 3.0000000000e+01 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 1.5000000000e+03 maxSizeSeg integer + 7.4285714286e+00 fillHoles integer + 4.3809523810e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 360: +Active set vector = { 1 } + 9.7390170600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 361 +--------------------- +Parameters for evaluation 361: + 2.1000000000e+02 blue integer + 2.1000000000e+02 green integer + 2.4000000000e+02 red integer + 5.5952380952e+00 T1 float + 5.3571428571e+00 T2 float + 5.0000000000e+00 G1 integer + 3.8095238095e+00 G2 integer + 2.0095238095e+01 minSize integer + 9.2857142857e+02 maxSize integer + 3.0000000000e+01 minSizePl integer + 7.2571428571e+01 minSizeSeg integer + 1.5000000000e+03 maxSizeSeg integer + 7.4285714286e+00 fillHoles integer + 4.3809523810e+00 recon integer + 6.2857142857e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 361: +Active set vector = { 1 } + 9.2524695000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 362 +--------------------- +Parameters for evaluation 362: + 2.1000000000e+02 blue integer + 2.1000000000e+02 green integer + 2.4000000000e+02 red integer + 5.5952380952e+00 T1 float + 5.3571428571e+00 T2 float + 5.0000000000e+00 G1 integer + 3.8095238095e+00 G2 integer + 2.0095238095e+01 minSize integer + 9.2857142857e+02 maxSize integer + 3.0000000000e+01 minSizePl integer + 7.2571428571e+01 minSizeSeg integer + 1.5000000000e+03 maxSizeSeg integer + 7.4285714286e+00 fillHoles integer + 4.3809523810e+00 recon integer + 4.1904761905e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 362: +Active set vector = { 1 } + 9.1336021700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 363 +--------------------- +Parameters for evaluation 363: + 2.1000000000e+02 blue integer + 2.1000000000e+02 green integer + 2.4000000000e+02 red integer + 2.9761904762e+00 T1 float + 5.3571428571e+00 T2 float + 5.0000000000e+00 G1 integer + 3.8095238095e+00 G2 integer + 2.0095238095e+01 minSize integer + 9.2857142857e+02 maxSize integer + 3.0000000000e+01 minSizePl integer + 7.2571428571e+01 minSizeSeg integer + 1.5000000000e+03 maxSizeSeg integer + 7.4285714286e+00 fillHoles integer + 4.3809523810e+00 recon integer + 4.1904761905e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 363: +Active set vector = { 1 } + 9.1329809600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 364 +--------------------- +Parameters for evaluation 364: + 2.2571428571e+02 blue integer + 2.1000000000e+02 green integer + 2.4000000000e+02 red integer + 2.9761904762e+00 T1 float + 5.3571428571e+00 T2 float + 5.0000000000e+00 G1 integer + 3.8095238095e+00 G2 integer + 2.0095238095e+01 minSize integer + 9.2857142857e+02 maxSize integer + 3.0000000000e+01 minSizePl integer + 7.2571428571e+01 minSizeSeg integer + 1.5000000000e+03 maxSizeSeg integer + 7.4285714286e+00 fillHoles integer + 4.3809523810e+00 recon integer + 4.1904761905e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 364: +Active set vector = { 1 } + 9.1329809600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 365 +--------------------- +Parameters for evaluation 365: + 2.2571428571e+02 blue integer + 2.2571428571e+02 green integer + 2.4000000000e+02 red integer + 2.9761904762e+00 T1 float + 5.3571428571e+00 T2 float + 5.0000000000e+00 G1 integer + 3.8095238095e+00 G2 integer + 2.0095238095e+01 minSize integer + 9.2857142857e+02 maxSize integer + 3.0000000000e+01 minSizePl integer + 7.2571428571e+01 minSizeSeg integer + 1.5000000000e+03 maxSizeSeg integer + 7.4285714286e+00 fillHoles integer + 4.3809523810e+00 recon integer + 4.1904761905e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 365: +Active set vector = { 1 } + 9.1329809600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 366 +--------------------- +Parameters for evaluation 366: + 2.2571428571e+02 blue integer + 2.2571428571e+02 green integer + 2.4000000000e+02 red integer + 2.9761904762e+00 T1 float + 5.3571428571e+00 T2 float + 5.0000000000e+00 G1 integer + 3.8095238095e+00 G2 integer + 2.0095238095e+01 minSize integer + 9.2857142857e+02 maxSize integer + 3.0000000000e+01 minSizePl integer + 7.2571428571e+01 minSizeSeg integer + 1.1857142857e+03 maxSizeSeg integer + 7.4285714286e+00 fillHoles integer + 4.3809523810e+00 recon integer + 4.1904761905e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 366: +Active set vector = { 1 } + 8.9622553400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 367 +--------------------- +Parameters for evaluation 367: + 2.2571428571e+02 blue integer + 2.2571428571e+02 green integer + 2.4000000000e+02 red integer + 2.9761904762e+00 T1 float + 5.3571428571e+00 T2 float + 5.0000000000e+00 G1 integer + 3.8095238095e+00 G2 integer + 2.0095238095e+01 minSize integer + 1.2428571429e+03 maxSize integer + 3.0000000000e+01 minSizePl integer + 7.2571428571e+01 minSizeSeg integer + 1.1857142857e+03 maxSizeSeg integer + 7.4285714286e+00 fillHoles integer + 4.3809523810e+00 recon integer + 4.1904761905e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 367: +Active set vector = { 1 } + 8.9627653600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 368 +--------------------- +Parameters for evaluation 368: + 2.2571428571e+02 blue integer + 2.2571428571e+02 green integer + 2.4000000000e+02 red integer + 2.9761904762e+00 T1 float + 5.3571428571e+00 T2 float + 5.0000000000e+00 G1 integer + 3.8095238095e+00 G2 integer + 2.0095238095e+01 minSize integer + 1.2428571429e+03 maxSize integer + 6.9285714286e+01 minSizePl integer + 7.2571428571e+01 minSizeSeg integer + 1.1857142857e+03 maxSizeSeg integer + 7.4285714286e+00 fillHoles integer + 4.3809523810e+00 recon integer + 4.1904761905e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 368: +Active set vector = { 1 } + 8.8617962500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 369 +--------------------- +Parameters for evaluation 369: + 2.1142857143e+02 blue integer + 2.2285714286e+02 green integer + 2.3000000000e+02 red integer + 6.0714285714e+00 T1 float + 5.1190476190e+00 T2 float + 3.0000000000e+01 G1 integer + 2.0095238095e+01 G2 integer + 2.0000000000e+00 minSize integer + 1.1285714286e+03 maxSize integer + 4.7857142857e+01 minSizePl integer + 4.2857142857e+01 minSizeSeg integer + 9.5714285714e+02 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 7.4285714286e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 369: +Active set vector = { 1 } + 2.4418842800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 370 +--------------------- +Parameters for evaluation 370: + 2.1142857143e+02 blue integer + 2.2285714286e+02 green integer + 2.3000000000e+02 red integer + 6.0714285714e+00 T1 float + 5.1190476190e+00 T2 float + 6.9285714286e+01 G1 integer + 2.0095238095e+01 G2 integer + 2.0000000000e+00 minSize integer + 1.1285714286e+03 maxSize integer + 4.7857142857e+01 minSizePl integer + 4.2857142857e+01 minSizeSeg integer + 9.5714285714e+02 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 7.4285714286e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 370: +Active set vector = { 1 } + 2.5706278300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 371 +--------------------- +Parameters for evaluation 371: + 2.1142857143e+02 blue integer + 2.2285714286e+02 green integer + 2.1428571429e+02 red integer + 6.0714285714e+00 T1 float + 5.1190476190e+00 T2 float + 6.9285714286e+01 G1 integer + 2.0095238095e+01 G2 integer + 2.0000000000e+00 minSize integer + 1.1285714286e+03 maxSize integer + 4.7857142857e+01 minSizePl integer + 4.2857142857e+01 minSizeSeg integer + 9.5714285714e+02 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 7.4285714286e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 371: +Active set vector = { 1 } + 2.5706278300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 372 +--------------------- +Parameters for evaluation 372: + 2.1142857143e+02 blue integer + 2.2285714286e+02 green integer + 2.1428571429e+02 red integer + 6.0714285714e+00 T1 float + 5.1190476190e+00 T2 float + 6.9285714286e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.0000000000e+00 minSize integer + 1.1285714286e+03 maxSize integer + 4.7857142857e+01 minSizePl integer + 4.2857142857e+01 minSizeSeg integer + 9.5714285714e+02 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 7.4285714286e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 372: +Active set vector = { 1 } + 4.4402506400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 373 +--------------------- +Parameters for evaluation 373: + 2.1142857143e+02 blue integer + 2.3857142857e+02 green integer + 2.1428571429e+02 red integer + 6.0714285714e+00 T1 float + 5.1190476190e+00 T2 float + 6.9285714286e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.0000000000e+00 minSize integer + 1.1285714286e+03 maxSize integer + 4.7857142857e+01 minSizePl integer + 4.2857142857e+01 minSizeSeg integer + 9.5714285714e+02 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 7.4285714286e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 373: +Active set vector = { 1 } + 4.4402506400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 374 +--------------------- +Parameters for evaluation 374: + 2.1142857143e+02 blue integer + 2.3857142857e+02 green integer + 2.1428571429e+02 red integer + 3.4523809524e+00 T1 float + 5.1190476190e+00 T2 float + 6.9285714286e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.0000000000e+00 minSize integer + 1.1285714286e+03 maxSize integer + 4.7857142857e+01 minSizePl integer + 4.2857142857e+01 minSizeSeg integer + 9.5714285714e+02 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 7.4285714286e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 374: +Active set vector = { 1 } + 4.4403340600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 375 +--------------------- +Parameters for evaluation 375: + 2.1142857143e+02 blue integer + 2.3857142857e+02 green integer + 2.1428571429e+02 red integer + 3.4523809524e+00 T1 float + 2.5000000000e+00 T2 float + 6.9285714286e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.0000000000e+00 minSize integer + 1.1285714286e+03 maxSize integer + 4.7857142857e+01 minSizePl integer + 4.2857142857e+01 minSizeSeg integer + 9.5714285714e+02 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 7.4285714286e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 375: +Active set vector = { 1 } + 4.5670206500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 376 +--------------------- +Parameters for evaluation 376: + 2.1142857143e+02 blue integer + 2.3857142857e+02 green integer + 2.1428571429e+02 red integer + 3.4523809524e+00 T1 float + 2.5000000000e+00 T2 float + 6.9285714286e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.1904761905e+01 minSize integer + 1.1285714286e+03 maxSize integer + 4.7857142857e+01 minSizePl integer + 4.2857142857e+01 minSizeSeg integer + 9.5714285714e+02 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 7.4285714286e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 376: +Active set vector = { 1 } + 4.9491014900e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 377 +--------------------- +Parameters for evaluation 377: + 2.1142857143e+02 blue integer + 2.3857142857e+02 green integer + 2.1428571429e+02 red integer + 3.4523809524e+00 T1 float + 2.5000000000e+00 T2 float + 6.9285714286e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.1904761905e+01 minSize integer + 1.1285714286e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 4.2857142857e+01 minSizeSeg integer + 9.5714285714e+02 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 7.4285714286e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 377: +Active set vector = { 1 } + 4.8973536100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 378 +--------------------- +Parameters for evaluation 378: + 2.2714285714e+02 blue integer + 2.3857142857e+02 green integer + 2.1428571429e+02 red integer + 3.4523809524e+00 T1 float + 2.5000000000e+00 T2 float + 6.9285714286e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.1904761905e+01 minSize integer + 1.1285714286e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 4.2857142857e+01 minSizeSeg integer + 9.5714285714e+02 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 7.4285714286e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 378: +Active set vector = { 1 } + 4.8973536100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 379 +--------------------- +Parameters for evaluation 379: + 2.2714285714e+02 blue integer + 2.3857142857e+02 green integer + 2.1428571429e+02 red integer + 3.4523809524e+00 T1 float + 2.5000000000e+00 T2 float + 6.9285714286e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.1904761905e+01 minSize integer + 1.1285714286e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 4.2857142857e+01 minSizeSeg integer + 9.5714285714e+02 maxSizeSeg integer + 6.4761904762e+00 fillHoles integer + 7.4285714286e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 379: +Active set vector = { 1 } + 4.9018781300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 380 +--------------------- +Parameters for evaluation 380: + 2.2714285714e+02 blue integer + 2.3857142857e+02 green integer + 2.1428571429e+02 red integer + 3.4523809524e+00 T1 float + 2.5000000000e+00 T2 float + 6.9285714286e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.1904761905e+01 minSize integer + 1.1285714286e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 2.0000000000e+00 minSizeSeg integer + 9.5714285714e+02 maxSizeSeg integer + 6.4761904762e+00 fillHoles integer + 7.4285714286e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 380: +Active set vector = { 1 } + 4.8177728200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 381 +--------------------- +Parameters for evaluation 381: + 2.2714285714e+02 blue integer + 2.3857142857e+02 green integer + 2.1428571429e+02 red integer + 3.4523809524e+00 T1 float + 2.5000000000e+00 T2 float + 6.9285714286e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.1904761905e+01 minSize integer + 1.1285714286e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 2.0000000000e+00 minSizeSeg integer + 9.5714285714e+02 maxSizeSeg integer + 6.4761904762e+00 fillHoles integer + 5.3333333333e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 381: +Active set vector = { 1 } + 4.4200257700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 382 +--------------------- +Parameters for evaluation 382: + 2.2714285714e+02 blue integer + 2.3857142857e+02 green integer + 2.1428571429e+02 red integer + 3.4523809524e+00 T1 float + 2.5000000000e+00 T2 float + 6.9285714286e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.1904761905e+01 minSize integer + 1.1285714286e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 2.0000000000e+00 minSizeSeg integer + 1.2714285714e+03 maxSizeSeg integer + 6.4761904762e+00 fillHoles integer + 5.3333333333e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 382: +Active set vector = { 1 } + 4.4201190400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 383 +--------------------- +Parameters for evaluation 383: + 2.2714285714e+02 blue integer + 2.3857142857e+02 green integer + 2.1428571429e+02 red integer + 3.4523809524e+00 T1 float + 2.5000000000e+00 T2 float + 6.9285714286e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.1904761905e+01 minSize integer + 1.4428571429e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 2.0000000000e+00 minSizeSeg integer + 1.2714285714e+03 maxSizeSeg integer + 6.4761904762e+00 fillHoles integer + 5.3333333333e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 383: +Active set vector = { 1 } + 4.4201040400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 384 +--------------------- +Parameters for evaluation 384: + 2.2714285714e+02 blue integer + 2.3857142857e+02 green integer + 2.1428571429e+02 red integer + 3.4523809524e+00 T1 float + 2.5000000000e+00 T2 float + 6.9285714286e+01 G1 integer + 4.0000000000e+01 G2 integer + 2.1904761905e+01 minSize integer + 1.4428571429e+03 maxSize integer + 8.5714285714e+00 minSizePl integer + 2.0000000000e+00 minSizeSeg integer + 1.2714285714e+03 maxSizeSeg integer + 6.4761904762e+00 fillHoles integer + 5.3333333333e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 384: +Active set vector = { 1 } + 4.4714467500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 385 +--------------------- +Parameters for evaluation 385: + 2.2000000000e+02 blue integer + 2.2857142857e+02 green integer + 2.3714285714e+02 red integer + 5.8333333333e+00 T1 float + 7.5000000000e+00 T2 float + 1.9285714286e+01 G1 integer + 2.5523809524e+01 G2 integer + 4.0000000000e+01 minSize integer + 1.1285714286e+03 maxSize integer + 4.4285714286e+01 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 7.6190476190e+00 fillHoles integer + 6.0952380952e+00 recon integer + 5.5238095238e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 385: +Active set vector = { 1 } + 3.1023251500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 386 +--------------------- +Parameters for evaluation 386: + 2.2000000000e+02 blue integer + 2.2857142857e+02 green integer + 2.3714285714e+02 red integer + 5.8333333333e+00 T1 float + 7.5000000000e+00 T2 float + 1.9285714286e+01 G1 integer + 2.5523809524e+01 G2 integer + 4.0000000000e+01 minSize integer + 1.4428571429e+03 maxSize integer + 4.4285714286e+01 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 7.6190476190e+00 fillHoles integer + 6.0952380952e+00 recon integer + 5.5238095238e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 386: +Active set vector = { 1 } + 3.0014810700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 387 +--------------------- +Parameters for evaluation 387: + 2.2000000000e+02 blue integer + 2.1285714286e+02 green integer + 2.3714285714e+02 red integer + 5.8333333333e+00 T1 float + 7.5000000000e+00 T2 float + 1.9285714286e+01 G1 integer + 2.5523809524e+01 G2 integer + 4.0000000000e+01 minSize integer + 1.4428571429e+03 maxSize integer + 4.4285714286e+01 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 7.6190476190e+00 fillHoles integer + 6.0952380952e+00 recon integer + 5.5238095238e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 387: +Active set vector = { 1 } + 3.0014810700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 388 +--------------------- +Parameters for evaluation 388: + 2.2000000000e+02 blue integer + 2.1285714286e+02 green integer + 2.3714285714e+02 red integer + 5.8333333333e+00 T1 float + 7.5000000000e+00 T2 float + 1.9285714286e+01 G1 integer + 5.6190476190e+00 G2 integer + 4.0000000000e+01 minSize integer + 1.4428571429e+03 maxSize integer + 4.4285714286e+01 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 7.6190476190e+00 fillHoles integer + 6.0952380952e+00 recon integer + 5.5238095238e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 388: +Active set vector = { 1 } + 4.0008985800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 389 +--------------------- +Parameters for evaluation 389: + 2.2000000000e+02 blue integer + 2.1285714286e+02 green integer + 2.3714285714e+02 red integer + 5.8333333333e+00 T1 float + 7.5000000000e+00 T2 float + 1.9285714286e+01 G1 integer + 5.6190476190e+00 G2 integer + 4.0000000000e+01 minSize integer + 1.4428571429e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 7.6190476190e+00 fillHoles integer + 6.0952380952e+00 recon integer + 5.5238095238e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 389: +Active set vector = { 1 } + 4.2305082600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 390 +--------------------- +Parameters for evaluation 390: + 2.2000000000e+02 blue integer + 2.1285714286e+02 green integer + 2.3714285714e+02 red integer + 3.2142857143e+00 T1 float + 7.5000000000e+00 T2 float + 1.9285714286e+01 G1 integer + 5.6190476190e+00 G2 integer + 4.0000000000e+01 minSize integer + 1.4428571429e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 1.4428571429e+03 maxSizeSeg integer + 7.6190476190e+00 fillHoles integer + 6.0952380952e+00 recon integer + 5.5238095238e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 390: +Active set vector = { 1 } + 4.2305082600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 391 +--------------------- +Parameters for evaluation 391: + 2.2000000000e+02 blue integer + 2.1285714286e+02 green integer + 2.3714285714e+02 red integer + 3.2142857143e+00 T1 float + 7.5000000000e+00 T2 float + 1.9285714286e+01 G1 integer + 5.6190476190e+00 G2 integer + 4.0000000000e+01 minSize integer + 1.4428571429e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 1.1285714286e+03 maxSizeSeg integer + 7.6190476190e+00 fillHoles integer + 6.0952380952e+00 recon integer + 5.5238095238e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 391: +Active set vector = { 1 } + 4.2509965700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 392 +--------------------- +Parameters for evaluation 392: + 2.2000000000e+02 blue integer + 2.1285714286e+02 green integer + 2.3714285714e+02 red integer + 3.2142857143e+00 T1 float + 7.5000000000e+00 T2 float + 1.9285714286e+01 G1 integer + 5.6190476190e+00 G2 integer + 4.0000000000e+01 minSize integer + 1.4428571429e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 1.1285714286e+03 maxSizeSeg integer + 7.6190476190e+00 fillHoles integer + 4.0000000000e+00 recon integer + 5.5238095238e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 392: +Active set vector = { 1 } + 7.4303807500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 393 +--------------------- +Parameters for evaluation 393: + 2.3571428571e+02 blue integer + 2.1285714286e+02 green integer + 2.3714285714e+02 red integer + 3.2142857143e+00 T1 float + 7.5000000000e+00 T2 float + 1.9285714286e+01 G1 integer + 5.6190476190e+00 G2 integer + 4.0000000000e+01 minSize integer + 1.4428571429e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 1.1285714286e+03 maxSizeSeg integer + 7.6190476190e+00 fillHoles integer + 4.0000000000e+00 recon integer + 5.5238095238e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 393: +Active set vector = { 1 } + 7.4303807500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 394 +--------------------- +Parameters for evaluation 394: + 2.3571428571e+02 blue integer + 2.1285714286e+02 green integer + 2.3714285714e+02 red integer + 3.2142857143e+00 T1 float + 4.8809523810e+00 T2 float + 1.9285714286e+01 G1 integer + 5.6190476190e+00 G2 integer + 4.0000000000e+01 minSize integer + 1.4428571429e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 1.1285714286e+03 maxSizeSeg integer + 7.6190476190e+00 fillHoles integer + 4.0000000000e+00 recon integer + 5.5238095238e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 394: +Active set vector = { 1 } + 7.4007218400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 395 +--------------------- +Parameters for evaluation 395: + 2.3571428571e+02 blue integer + 2.1285714286e+02 green integer + 2.3714285714e+02 red integer + 3.2142857143e+00 T1 float + 4.8809523810e+00 T2 float + 5.8571428571e+01 G1 integer + 5.6190476190e+00 G2 integer + 4.0000000000e+01 minSize integer + 1.4428571429e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 1.1285714286e+03 maxSizeSeg integer + 7.6190476190e+00 fillHoles integer + 4.0000000000e+00 recon integer + 5.5238095238e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 395: +Active set vector = { 1 } + 7.0793900500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 396 +--------------------- +Parameters for evaluation 396: + 2.3571428571e+02 blue integer + 2.1285714286e+02 green integer + 2.3714285714e+02 red integer + 3.2142857143e+00 T1 float + 4.8809523810e+00 T2 float + 5.8571428571e+01 G1 integer + 5.6190476190e+00 G2 integer + 4.0000000000e+01 minSize integer + 1.4428571429e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 7.2571428571e+01 minSizeSeg integer + 1.1285714286e+03 maxSizeSeg integer + 7.6190476190e+00 fillHoles integer + 4.0000000000e+00 recon integer + 5.5238095238e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 396: +Active set vector = { 1 } + 6.6826896600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 397 +--------------------- +Parameters for evaluation 397: + 2.3571428571e+02 blue integer + 2.1285714286e+02 green integer + 2.3714285714e+02 red integer + 3.2142857143e+00 T1 float + 4.8809523810e+00 T2 float + 5.8571428571e+01 G1 integer + 5.6190476190e+00 G2 integer + 2.0095238095e+01 minSize integer + 1.4428571429e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 7.2571428571e+01 minSizeSeg integer + 1.1285714286e+03 maxSizeSeg integer + 7.6190476190e+00 fillHoles integer + 4.0000000000e+00 recon integer + 5.5238095238e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 397: +Active set vector = { 1 } + 6.6866889000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 398 +--------------------- +Parameters for evaluation 398: + 2.3571428571e+02 blue integer + 2.1285714286e+02 green integer + 2.2142857143e+02 red integer + 3.2142857143e+00 T1 float + 4.8809523810e+00 T2 float + 5.8571428571e+01 G1 integer + 5.6190476190e+00 G2 integer + 2.0095238095e+01 minSize integer + 1.4428571429e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 7.2571428571e+01 minSizeSeg integer + 1.1285714286e+03 maxSizeSeg integer + 7.6190476190e+00 fillHoles integer + 4.0000000000e+00 recon integer + 5.5238095238e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 398: +Active set vector = { 1 } + 6.6866889000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 399 +--------------------- +Parameters for evaluation 399: + 2.3571428571e+02 blue integer + 2.1285714286e+02 green integer + 2.2142857143e+02 red integer + 3.2142857143e+00 T1 float + 4.8809523810e+00 T2 float + 5.8571428571e+01 G1 integer + 5.6190476190e+00 G2 integer + 2.0095238095e+01 minSize integer + 1.4428571429e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 7.2571428571e+01 minSizeSeg integer + 1.1285714286e+03 maxSizeSeg integer + 7.6190476190e+00 fillHoles integer + 4.0000000000e+00 recon integer + 7.6190476190e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 399: +Active set vector = { 1 } + 6.7822762400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 400 +--------------------- +Parameters for evaluation 400: + 2.3571428571e+02 blue integer + 2.1285714286e+02 green integer + 2.2142857143e+02 red integer + 3.2142857143e+00 T1 float + 4.8809523810e+00 T2 float + 5.8571428571e+01 G1 integer + 5.6190476190e+00 G2 integer + 2.0095238095e+01 minSize integer + 1.4428571429e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 7.2571428571e+01 minSizeSeg integer + 1.1285714286e+03 maxSizeSeg integer + 5.5238095238e+00 fillHoles integer + 4.0000000000e+00 recon integer + 7.6190476190e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 400: +Active set vector = { 1 } + 6.7858097300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 401 +--------------------- +Parameters for evaluation 401: + 2.1142857143e+02 blue integer + 2.2428571429e+02 green integer + 2.3142857143e+02 red integer + 3.9285714286e+00 T1 float + 7.5000000000e+00 T2 float + 8.0000000000e+01 G1 integer + 5.6190476190e+00 G2 integer + 2.0000000000e+00 minSize integer + 1.2142857143e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 5.0285714286e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 7.6190476190e+00 recon integer + 5.3333333333e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 401: +Active set vector = { 1 } + 4.1568211000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 402 +--------------------- +Parameters for evaluation 402: + 2.1142857143e+02 blue integer + 2.2428571429e+02 green integer + 2.3142857143e+02 red integer + 3.9285714286e+00 T1 float + 4.8809523810e+00 T2 float + 8.0000000000e+01 G1 integer + 5.6190476190e+00 G2 integer + 2.0000000000e+00 minSize integer + 1.2142857143e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 5.0285714286e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 7.6190476190e+00 recon integer + 5.3333333333e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 402: +Active set vector = { 1 } + 4.1300918700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 403 +--------------------- +Parameters for evaluation 403: + 2.1142857143e+02 blue integer + 2.2428571429e+02 green integer + 2.1571428571e+02 red integer + 3.9285714286e+00 T1 float + 4.8809523810e+00 T2 float + 8.0000000000e+01 G1 integer + 5.6190476190e+00 G2 integer + 2.0000000000e+00 minSize integer + 1.2142857143e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 5.0285714286e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 7.6190476190e+00 recon integer + 5.3333333333e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 403: +Active set vector = { 1 } + 4.1300918700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 404 +--------------------- +Parameters for evaluation 404: + 2.1142857143e+02 blue integer + 2.2428571429e+02 green integer + 2.1571428571e+02 red integer + 3.9285714286e+00 T1 float + 4.8809523810e+00 T2 float + 8.0000000000e+01 G1 integer + 5.6190476190e+00 G2 integer + 2.0000000000e+00 minSize integer + 1.2142857143e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 5.0285714286e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 7.6190476190e+00 recon integer + 7.4285714286e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 404: +Active set vector = { 1 } + 4.1007095400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 405 +--------------------- +Parameters for evaluation 405: + 2.1142857143e+02 blue integer + 2.2428571429e+02 green integer + 2.1571428571e+02 red integer + 3.9285714286e+00 T1 float + 4.8809523810e+00 T2 float + 4.0714285714e+01 G1 integer + 5.6190476190e+00 G2 integer + 2.0000000000e+00 minSize integer + 1.2142857143e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 5.0285714286e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 7.6190476190e+00 recon integer + 7.4285714286e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 405: +Active set vector = { 1 } + 4.1073716000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 406 +--------------------- +Parameters for evaluation 406: + 2.1142857143e+02 blue integer + 2.2428571429e+02 green integer + 2.1571428571e+02 red integer + 6.5476190476e+00 T1 float + 4.8809523810e+00 T2 float + 4.0714285714e+01 G1 integer + 5.6190476190e+00 G2 integer + 2.0000000000e+00 minSize integer + 1.2142857143e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 5.0285714286e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 7.6190476190e+00 recon integer + 7.4285714286e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 406: +Active set vector = { 1 } + 4.1162365700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 407 +--------------------- +Parameters for evaluation 407: + 2.1142857143e+02 blue integer + 2.2428571429e+02 green integer + 2.1571428571e+02 red integer + 6.5476190476e+00 T1 float + 4.8809523810e+00 T2 float + 4.0714285714e+01 G1 integer + 5.6190476190e+00 G2 integer + 2.1904761905e+01 minSize integer + 1.2142857143e+03 maxSize integer + 8.0000000000e+01 minSizePl integer + 5.0285714286e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 7.6190476190e+00 recon integer + 7.4285714286e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 407: +Active set vector = { 1 } + 4.0191013200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 408 +--------------------- +Parameters for evaluation 408: + 2.1142857143e+02 blue integer + 2.2428571429e+02 green integer + 2.1571428571e+02 red integer + 6.5476190476e+00 T1 float + 4.8809523810e+00 T2 float + 4.0714285714e+01 G1 integer + 5.6190476190e+00 G2 integer + 2.1904761905e+01 minSize integer + 9.0000000000e+02 maxSize integer + 8.0000000000e+01 minSizePl integer + 5.0285714286e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 7.6190476190e+00 recon integer + 7.4285714286e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 408: +Active set vector = { 1 } + 4.0196373100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 409 +--------------------- +Parameters for evaluation 409: + 2.2714285714e+02 blue integer + 2.2428571429e+02 green integer + 2.1571428571e+02 red integer + 6.5476190476e+00 T1 float + 4.8809523810e+00 T2 float + 4.0714285714e+01 G1 integer + 5.6190476190e+00 G2 integer + 2.1904761905e+01 minSize integer + 9.0000000000e+02 maxSize integer + 8.0000000000e+01 minSizePl integer + 5.0285714286e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 7.6190476190e+00 recon integer + 7.4285714286e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 409: +Active set vector = { 1 } + 4.0196373100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 410 +--------------------- +Parameters for evaluation 410: + 2.2714285714e+02 blue integer + 2.2428571429e+02 green integer + 2.1571428571e+02 red integer + 6.5476190476e+00 T1 float + 4.8809523810e+00 T2 float + 4.0714285714e+01 G1 integer + 5.6190476190e+00 G2 integer + 2.1904761905e+01 minSize integer + 9.0000000000e+02 maxSize integer + 8.0000000000e+01 minSizePl integer + 9.4285714286e+00 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 7.6190476190e+00 recon integer + 7.4285714286e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 410: +Active set vector = { 1 } + 4.0340857400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 411 +--------------------- +Parameters for evaluation 411: + 2.2714285714e+02 blue integer + 2.2428571429e+02 green integer + 2.1571428571e+02 red integer + 6.5476190476e+00 T1 float + 4.8809523810e+00 T2 float + 4.0714285714e+01 G1 integer + 5.6190476190e+00 G2 integer + 2.1904761905e+01 minSize integer + 9.0000000000e+02 maxSize integer + 8.0000000000e+01 minSizePl integer + 9.4285714286e+00 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 7.6190476190e+00 recon integer + 7.4285714286e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 411: +Active set vector = { 1 } + 3.9171219800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 412 +--------------------- +Parameters for evaluation 412: + 2.2714285714e+02 blue integer + 2.2428571429e+02 green integer + 2.1571428571e+02 red integer + 6.5476190476e+00 T1 float + 4.8809523810e+00 T2 float + 4.0714285714e+01 G1 integer + 2.5523809524e+01 G2 integer + 2.1904761905e+01 minSize integer + 9.0000000000e+02 maxSize integer + 8.0000000000e+01 minSizePl integer + 9.4285714286e+00 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 7.6190476190e+00 recon integer + 7.4285714286e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 412: +Active set vector = { 1 } + 3.2588011700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 413 +--------------------- +Parameters for evaluation 413: + 2.2714285714e+02 blue integer + 2.2428571429e+02 green integer + 2.1571428571e+02 red integer + 6.5476190476e+00 T1 float + 4.8809523810e+00 T2 float + 4.0714285714e+01 G1 integer + 2.5523809524e+01 G2 integer + 2.1904761905e+01 minSize integer + 9.0000000000e+02 maxSize integer + 4.0714285714e+01 minSizePl integer + 9.4285714286e+00 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 7.6190476190e+00 recon integer + 7.4285714286e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 413: +Active set vector = { 1 } + 2.8211113500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 414 +--------------------- +Parameters for evaluation 414: + 2.2714285714e+02 blue integer + 2.4000000000e+02 green integer + 2.1571428571e+02 red integer + 6.5476190476e+00 T1 float + 4.8809523810e+00 T2 float + 4.0714285714e+01 G1 integer + 2.5523809524e+01 G2 integer + 2.1904761905e+01 minSize integer + 9.0000000000e+02 maxSize integer + 4.0714285714e+01 minSizePl integer + 9.4285714286e+00 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 7.6190476190e+00 recon integer + 7.4285714286e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 414: +Active set vector = { 1 } + 2.8211113500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 415 +--------------------- +Parameters for evaluation 415: + 2.2714285714e+02 blue integer + 2.4000000000e+02 green integer + 2.1571428571e+02 red integer + 6.5476190476e+00 T1 float + 4.8809523810e+00 T2 float + 4.0714285714e+01 G1 integer + 2.5523809524e+01 G2 integer + 2.1904761905e+01 minSize integer + 9.0000000000e+02 maxSize integer + 4.0714285714e+01 minSizePl integer + 9.4285714286e+00 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 4.3809523810e+00 fillHoles integer + 5.5238095238e+00 recon integer + 7.4285714286e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 415: +Active set vector = { 1 } + 2.4774654900e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 416 +--------------------- +Parameters for evaluation 416: + 2.2714285714e+02 blue integer + 2.4000000000e+02 green integer + 2.1571428571e+02 red integer + 6.5476190476e+00 T1 float + 4.8809523810e+00 T2 float + 4.0714285714e+01 G1 integer + 2.5523809524e+01 G2 integer + 2.1904761905e+01 minSize integer + 9.0000000000e+02 maxSize integer + 4.0714285714e+01 minSizePl integer + 9.4285714286e+00 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 6.4761904762e+00 fillHoles integer + 5.5238095238e+00 recon integer + 7.4285714286e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 416: +Active set vector = { 1 } + 2.4775430100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 417 +--------------------- +Parameters for evaluation 417: + 2.3571428571e+02 blue integer + 2.3428571429e+02 green integer + 2.3571428571e+02 red integer + 3.6904761905e+00 T1 float + 6.0714285714e+00 T2 float + 4.4285714286e+01 G1 integer + 1.4666666667e+01 G2 integer + 7.4285714286e+00 minSize integer + 1.3285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 5.4000000000e+01 minSizeSeg integer + 1.5000000000e+03 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 4.3809523810e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 417: +Active set vector = { 1 } + 2.6030777500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 418 +--------------------- +Parameters for evaluation 418: + 2.3571428571e+02 blue integer + 2.3428571429e+02 green integer + 2.3571428571e+02 red integer + 3.6904761905e+00 T1 float + 6.0714285714e+00 T2 float + 4.4285714286e+01 G1 integer + 1.4666666667e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.3285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 5.4000000000e+01 minSizeSeg integer + 1.5000000000e+03 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 4.3809523810e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 418: +Active set vector = { 1 } + 2.6681873400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 419 +--------------------- +Parameters for evaluation 419: + 2.3571428571e+02 blue integer + 2.3428571429e+02 green integer + 2.3571428571e+02 red integer + 6.3095238095e+00 T1 float + 6.0714285714e+00 T2 float + 4.4285714286e+01 G1 integer + 1.4666666667e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.3285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 5.4000000000e+01 minSizeSeg integer + 1.5000000000e+03 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 4.3809523810e+00 recon integer + 7.8095238095e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 419: +Active set vector = { 1 } + 2.6683727000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 420 +--------------------- +Parameters for evaluation 420: + 2.3571428571e+02 blue integer + 2.3428571429e+02 green integer + 2.3571428571e+02 red integer + 6.3095238095e+00 T1 float + 6.0714285714e+00 T2 float + 4.4285714286e+01 G1 integer + 1.4666666667e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.3285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 5.4000000000e+01 minSizeSeg integer + 1.5000000000e+03 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 4.3809523810e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 420: +Active set vector = { 1 } + 2.7718064100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 421 +--------------------- +Parameters for evaluation 421: + 2.3571428571e+02 blue integer + 2.3428571429e+02 green integer + 2.3571428571e+02 red integer + 6.3095238095e+00 T1 float + 6.0714285714e+00 T2 float + 4.4285714286e+01 G1 integer + 3.4571428571e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.3285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 5.4000000000e+01 minSizeSeg integer + 1.5000000000e+03 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 4.3809523810e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 421: +Active set vector = { 1 } + 3.7053749500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 422 +--------------------- +Parameters for evaluation 422: + 2.3571428571e+02 blue integer + 2.3428571429e+02 green integer + 2.3571428571e+02 red integer + 6.3095238095e+00 T1 float + 3.4523809524e+00 T2 float + 4.4285714286e+01 G1 integer + 3.4571428571e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.3285714286e+03 maxSize integer + 5.0000000000e+00 minSizePl integer + 5.4000000000e+01 minSizeSeg integer + 1.5000000000e+03 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 4.3809523810e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 422: +Active set vector = { 1 } + 3.6951324600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 423 +--------------------- +Parameters for evaluation 423: + 2.3571428571e+02 blue integer + 2.3428571429e+02 green integer + 2.3571428571e+02 red integer + 6.3095238095e+00 T1 float + 3.4523809524e+00 T2 float + 4.4285714286e+01 G1 integer + 3.4571428571e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.3285714286e+03 maxSize integer + 4.4285714286e+01 minSizePl integer + 5.4000000000e+01 minSizeSeg integer + 1.5000000000e+03 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 4.3809523810e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 423: +Active set vector = { 1 } + 3.7268812200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 424 +--------------------- +Parameters for evaluation 424: + 2.3571428571e+02 blue integer + 2.3428571429e+02 green integer + 2.3571428571e+02 red integer + 6.3095238095e+00 T1 float + 3.4523809524e+00 T2 float + 5.0000000000e+00 G1 integer + 3.4571428571e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.3285714286e+03 maxSize integer + 4.4285714286e+01 minSizePl integer + 5.4000000000e+01 minSizeSeg integer + 1.5000000000e+03 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 4.3809523810e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 424: +Active set vector = { 1 } + 6.5946209100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 425 +--------------------- +Parameters for evaluation 425: + 2.3571428571e+02 blue integer + 2.3428571429e+02 green integer + 2.3571428571e+02 red integer + 6.3095238095e+00 T1 float + 3.4523809524e+00 T2 float + 5.0000000000e+00 G1 integer + 3.4571428571e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.3285714286e+03 maxSize integer + 4.4285714286e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.5000000000e+03 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 4.3809523810e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 425: +Active set vector = { 1 } + 6.4716330300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 426 +--------------------- +Parameters for evaluation 426: + 2.3571428571e+02 blue integer + 2.1857142857e+02 green integer + 2.3571428571e+02 red integer + 6.3095238095e+00 T1 float + 3.4523809524e+00 T2 float + 5.0000000000e+00 G1 integer + 3.4571428571e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.3285714286e+03 maxSize integer + 4.4285714286e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.5000000000e+03 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 4.3809523810e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 426: +Active set vector = { 1 } + 6.4716330300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 427 +--------------------- +Parameters for evaluation 427: + 2.3571428571e+02 blue integer + 2.1857142857e+02 green integer + 2.2000000000e+02 red integer + 6.3095238095e+00 T1 float + 3.4523809524e+00 T2 float + 5.0000000000e+00 G1 integer + 3.4571428571e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.3285714286e+03 maxSize integer + 4.4285714286e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.5000000000e+03 maxSizeSeg integer + 7.8095238095e+00 fillHoles integer + 4.3809523810e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 427: +Active set vector = { 1 } + 6.4716330300e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 428 +--------------------- +Parameters for evaluation 428: + 2.3571428571e+02 blue integer + 2.1857142857e+02 green integer + 2.2000000000e+02 red integer + 6.3095238095e+00 T1 float + 3.4523809524e+00 T2 float + 5.0000000000e+00 G1 integer + 3.4571428571e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.3285714286e+03 maxSize integer + 4.4285714286e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.5000000000e+03 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 4.3809523810e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 428: +Active set vector = { 1 } + 6.5228017400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 429 +--------------------- +Parameters for evaluation 429: + 2.3571428571e+02 blue integer + 2.1857142857e+02 green integer + 2.2000000000e+02 red integer + 6.3095238095e+00 T1 float + 3.4523809524e+00 T2 float + 5.0000000000e+00 G1 integer + 3.4571428571e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.3285714286e+03 maxSize integer + 4.4285714286e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.1857142857e+03 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 4.3809523810e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 429: +Active set vector = { 1 } + 6.5227897000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 430 +--------------------- +Parameters for evaluation 430: + 2.3571428571e+02 blue integer + 2.1857142857e+02 green integer + 2.2000000000e+02 red integer + 6.3095238095e+00 T1 float + 3.4523809524e+00 T2 float + 5.0000000000e+00 G1 integer + 3.4571428571e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.0142857143e+03 maxSize integer + 4.4285714286e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.1857142857e+03 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 4.3809523810e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 430: +Active set vector = { 1 } + 6.7527172800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 431 +--------------------- +Parameters for evaluation 431: + 2.3571428571e+02 blue integer + 2.1857142857e+02 green integer + 2.2000000000e+02 red integer + 6.3095238095e+00 T1 float + 3.4523809524e+00 T2 float + 5.0000000000e+00 G1 integer + 3.4571428571e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.0142857143e+03 maxSize integer + 4.4285714286e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.1857142857e+03 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 6.4761904762e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 431: +Active set vector = { 1 } + 5.5105730600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 432 +--------------------- +Parameters for evaluation 432: + 2.2000000000e+02 blue integer + 2.1857142857e+02 green integer + 2.2000000000e+02 red integer + 6.3095238095e+00 T1 float + 3.4523809524e+00 T2 float + 5.0000000000e+00 G1 integer + 3.4571428571e+01 G2 integer + 2.7333333333e+01 minSize integer + 1.0142857143e+03 maxSize integer + 4.4285714286e+01 minSizePl integer + 1.3142857143e+01 minSizeSeg integer + 1.1857142857e+03 maxSizeSeg integer + 5.7142857143e+00 fillHoles integer + 6.4761904762e+00 recon integer + 5.7142857143e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 432: +Active set vector = { 1 } + 5.5105730600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 433 +--------------------- +Parameters for evaluation 433: + 2.1000000000e+02 blue integer + 2.3428571429e+02 green integer + 2.2857142857e+02 red integer + 2.5000000000e+00 T1 float + 4.1666666667e+00 T2 float + 3.7142857143e+01 G1 integer + 9.2380952381e+00 G2 integer + 4.0000000000e+01 minSize integer + 1.2142857143e+03 maxSize integer + 7.6428571429e+01 minSizePl integer + 7.2571428571e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 4.1904761905e+00 fillHoles integer + 4.3809523810e+00 recon integer + 6.8571428571e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 433: +Active set vector = { 1 } + 3.8243541100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 434 +--------------------- +Parameters for evaluation 434: + 2.1000000000e+02 blue integer + 2.3428571429e+02 green integer + 2.2857142857e+02 red integer + 2.5000000000e+00 T1 float + 4.1666666667e+00 T2 float + 3.7142857143e+01 G1 integer + 9.2380952381e+00 G2 integer + 4.0000000000e+01 minSize integer + 9.0000000000e+02 maxSize integer + 7.6428571429e+01 minSizePl integer + 7.2571428571e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 4.1904761905e+00 fillHoles integer + 4.3809523810e+00 recon integer + 6.8571428571e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 434: +Active set vector = { 1 } + 3.8264836200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 435 +--------------------- +Parameters for evaluation 435: + 2.1000000000e+02 blue integer + 2.3428571429e+02 green integer + 2.2857142857e+02 red integer + 2.5000000000e+00 T1 float + 4.1666666667e+00 T2 float + 3.7142857143e+01 G1 integer + 9.2380952381e+00 G2 integer + 4.0000000000e+01 minSize integer + 9.0000000000e+02 maxSize integer + 3.7142857143e+01 minSizePl integer + 7.2571428571e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 4.1904761905e+00 fillHoles integer + 4.3809523810e+00 recon integer + 6.8571428571e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 435: +Active set vector = { 1 } + 3.8557743900e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 436 +--------------------- +Parameters for evaluation 436: + 2.1000000000e+02 blue integer + 2.3428571429e+02 green integer + 2.2857142857e+02 red integer + 2.5000000000e+00 T1 float + 4.1666666667e+00 T2 float + 3.7142857143e+01 G1 integer + 9.2380952381e+00 G2 integer + 4.0000000000e+01 minSize integer + 9.0000000000e+02 maxSize integer + 3.7142857143e+01 minSizePl integer + 7.2571428571e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 4.1904761905e+00 fillHoles integer + 6.4761904762e+00 recon integer + 6.8571428571e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 436: +Active set vector = { 1 } + 3.0572359100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 437 +--------------------- +Parameters for evaluation 437: + 2.1000000000e+02 blue integer + 2.3428571429e+02 green integer + 2.2857142857e+02 red integer + 2.5000000000e+00 T1 float + 4.1666666667e+00 T2 float + 7.6428571429e+01 G1 integer + 9.2380952381e+00 G2 integer + 4.0000000000e+01 minSize integer + 9.0000000000e+02 maxSize integer + 3.7142857143e+01 minSizePl integer + 7.2571428571e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 4.1904761905e+00 fillHoles integer + 6.4761904762e+00 recon integer + 6.8571428571e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 437: +Active set vector = { 1 } + 4.9039805400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 438 +--------------------- +Parameters for evaluation 438: + 2.1000000000e+02 blue integer + 2.1857142857e+02 green integer + 2.2857142857e+02 red integer + 2.5000000000e+00 T1 float + 4.1666666667e+00 T2 float + 7.6428571429e+01 G1 integer + 9.2380952381e+00 G2 integer + 4.0000000000e+01 minSize integer + 9.0000000000e+02 maxSize integer + 3.7142857143e+01 minSizePl integer + 7.2571428571e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 4.1904761905e+00 fillHoles integer + 6.4761904762e+00 recon integer + 6.8571428571e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 438: +Active set vector = { 1 } + 4.9039805400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 439 +--------------------- +Parameters for evaluation 439: + 2.1000000000e+02 blue integer + 2.1857142857e+02 green integer + 2.2857142857e+02 red integer + 2.5000000000e+00 T1 float + 4.1666666667e+00 T2 float + 7.6428571429e+01 G1 integer + 9.2380952381e+00 G2 integer + 4.0000000000e+01 minSize integer + 9.0000000000e+02 maxSize integer + 3.7142857143e+01 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 4.1904761905e+00 fillHoles integer + 6.4761904762e+00 recon integer + 6.8571428571e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 439: +Active set vector = { 1 } + 4.8845807600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 440 +--------------------- +Parameters for evaluation 440: + 2.1000000000e+02 blue integer + 2.1857142857e+02 green integer + 2.1285714286e+02 red integer + 2.5000000000e+00 T1 float + 4.1666666667e+00 T2 float + 7.6428571429e+01 G1 integer + 9.2380952381e+00 G2 integer + 4.0000000000e+01 minSize integer + 9.0000000000e+02 maxSize integer + 3.7142857143e+01 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 4.1904761905e+00 fillHoles integer + 6.4761904762e+00 recon integer + 6.8571428571e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 440: +Active set vector = { 1 } + 4.8845807600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 441 +--------------------- +Parameters for evaluation 441: + 2.1000000000e+02 blue integer + 2.1857142857e+02 green integer + 2.1285714286e+02 red integer + 5.1190476190e+00 T1 float + 4.1666666667e+00 T2 float + 7.6428571429e+01 G1 integer + 9.2380952381e+00 G2 integer + 4.0000000000e+01 minSize integer + 9.0000000000e+02 maxSize integer + 3.7142857143e+01 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 4.1904761905e+00 fillHoles integer + 6.4761904762e+00 recon integer + 6.8571428571e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 441: +Active set vector = { 1 } + 4.8866651800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 442 +--------------------- +Parameters for evaluation 442: + 2.1000000000e+02 blue integer + 2.1857142857e+02 green integer + 2.1285714286e+02 red integer + 5.1190476190e+00 T1 float + 4.1666666667e+00 T2 float + 7.6428571429e+01 G1 integer + 9.2380952381e+00 G2 integer + 4.0000000000e+01 minSize integer + 9.0000000000e+02 maxSize integer + 3.7142857143e+01 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 6.2857142857e+00 fillHoles integer + 6.4761904762e+00 recon integer + 6.8571428571e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 442: +Active set vector = { 1 } + 4.9182293000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 443 +--------------------- +Parameters for evaluation 443: + 2.1000000000e+02 blue integer + 2.1857142857e+02 green integer + 2.1285714286e+02 red integer + 5.1190476190e+00 T1 float + 6.7857142857e+00 T2 float + 7.6428571429e+01 G1 integer + 9.2380952381e+00 G2 integer + 4.0000000000e+01 minSize integer + 9.0000000000e+02 maxSize integer + 3.7142857143e+01 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 6.2857142857e+00 fillHoles integer + 6.4761904762e+00 recon integer + 6.8571428571e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 443: +Active set vector = { 1 } + 4.9349151600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 444 +--------------------- +Parameters for evaluation 444: + 2.1000000000e+02 blue integer + 2.1857142857e+02 green integer + 2.1285714286e+02 red integer + 5.1190476190e+00 T1 float + 6.7857142857e+00 T2 float + 7.6428571429e+01 G1 integer + 9.2380952381e+00 G2 integer + 2.0095238095e+01 minSize integer + 9.0000000000e+02 maxSize integer + 3.7142857143e+01 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 6.2857142857e+00 fillHoles integer + 6.4761904762e+00 recon integer + 6.8571428571e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 444: +Active set vector = { 1 } + 4.1092018600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 445 +--------------------- +Parameters for evaluation 445: + 2.1000000000e+02 blue integer + 2.1857142857e+02 green integer + 2.1285714286e+02 red integer + 5.1190476190e+00 T1 float + 6.7857142857e+00 T2 float + 7.6428571429e+01 G1 integer + 2.9142857143e+01 G2 integer + 2.0095238095e+01 minSize integer + 9.0000000000e+02 maxSize integer + 3.7142857143e+01 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 6.2857142857e+00 fillHoles integer + 6.4761904762e+00 recon integer + 6.8571428571e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 445: +Active set vector = { 1 } + 4.4639432100e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 446 +--------------------- +Parameters for evaluation 446: + 2.1000000000e+02 blue integer + 2.1857142857e+02 green integer + 2.1285714286e+02 red integer + 5.1190476190e+00 T1 float + 6.7857142857e+00 T2 float + 7.6428571429e+01 G1 integer + 2.9142857143e+01 G2 integer + 2.0095238095e+01 minSize integer + 9.0000000000e+02 maxSize integer + 3.7142857143e+01 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 6.2857142857e+00 fillHoles integer + 6.4761904762e+00 recon integer + 4.7619047619e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 446: +Active set vector = { 1 } + 4.5254373500e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 447 +--------------------- +Parameters for evaluation 447: + 2.2571428571e+02 blue integer + 2.1857142857e+02 green integer + 2.1285714286e+02 red integer + 5.1190476190e+00 T1 float + 6.7857142857e+00 T2 float + 7.6428571429e+01 G1 integer + 2.9142857143e+01 G2 integer + 2.0095238095e+01 minSize integer + 9.0000000000e+02 maxSize integer + 3.7142857143e+01 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 9.0000000000e+02 maxSizeSeg integer + 6.2857142857e+00 fillHoles integer + 6.4761904762e+00 recon integer + 4.7619047619e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 447: +Active set vector = { 1 } + 4.5252138000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 448 +--------------------- +Parameters for evaluation 448: + 2.2571428571e+02 blue integer + 2.1857142857e+02 green integer + 2.1285714286e+02 red integer + 5.1190476190e+00 T1 float + 6.7857142857e+00 T2 float + 7.6428571429e+01 G1 integer + 2.9142857143e+01 G2 integer + 2.0095238095e+01 minSize integer + 9.0000000000e+02 maxSize integer + 3.7142857143e+01 minSizePl integer + 3.1714285714e+01 minSizeSeg integer + 1.2142857143e+03 maxSizeSeg integer + 6.2857142857e+00 fillHoles integer + 6.4761904762e+00 recon integer + 4.7619047619e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 448: +Active set vector = { 1 } + 4.5238173700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 449 +--------------------- +Parameters for evaluation 449: + 2.2142857143e+02 blue integer + 2.4000000000e+02 green integer + 2.2428571429e+02 red integer + 4.4047619048e+00 T1 float + 4.4047619048e+00 T2 float + 1.9285714286e+01 G1 integer + 3.8190476190e+01 G2 integer + 1.4666666667e+01 minSize integer + 1.1000000000e+03 maxSize integer + 6.5714285714e+01 minSizePl integer + 2.4285714286e+01 minSizeSeg integer + 1.1857142857e+03 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 7.8095238095e+00 recon integer + 4.3809523810e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 449: +Active set vector = { 1 } + 4.6843312600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 450 +--------------------- +Parameters for evaluation 450: + 2.2142857143e+02 blue integer + 2.4000000000e+02 green integer + 2.4000000000e+02 red integer + 4.4047619048e+00 T1 float + 4.4047619048e+00 T2 float + 1.9285714286e+01 G1 integer + 3.8190476190e+01 G2 integer + 1.4666666667e+01 minSize integer + 1.1000000000e+03 maxSize integer + 6.5714285714e+01 minSizePl integer + 2.4285714286e+01 minSizeSeg integer + 1.1857142857e+03 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 7.8095238095e+00 recon integer + 4.3809523810e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 450: +Active set vector = { 1 } + 4.6843312600e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 451 +--------------------- +Parameters for evaluation 451: + 2.2142857143e+02 blue integer + 2.4000000000e+02 green integer + 2.4000000000e+02 red integer + 4.4047619048e+00 T1 float + 4.4047619048e+00 T2 float + 1.9285714286e+01 G1 integer + 3.8190476190e+01 G2 integer + 1.4666666667e+01 minSize integer + 1.4142857143e+03 maxSize integer + 6.5714285714e+01 minSizePl integer + 2.4285714286e+01 minSizeSeg integer + 1.1857142857e+03 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 7.8095238095e+00 recon integer + 4.3809523810e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 451: +Active set vector = { 1 } + 4.6029766200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 452 +--------------------- +Parameters for evaluation 452: + 2.2142857143e+02 blue integer + 2.4000000000e+02 green integer + 2.4000000000e+02 red integer + 4.4047619048e+00 T1 float + 4.4047619048e+00 T2 float + 1.9285714286e+01 G1 integer + 3.8190476190e+01 G2 integer + 1.4666666667e+01 minSize integer + 1.4142857143e+03 maxSize integer + 6.5714285714e+01 minSizePl integer + 2.4285714286e+01 minSizeSeg integer + 1.1857142857e+03 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 5.7142857143e+00 recon integer + 4.3809523810e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 452: +Active set vector = { 1 } + 4.2922540200e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 453 +--------------------- +Parameters for evaluation 453: + 2.2142857143e+02 blue integer + 2.4000000000e+02 green integer + 2.4000000000e+02 red integer + 4.4047619048e+00 T1 float + 4.4047619048e+00 T2 float + 1.9285714286e+01 G1 integer + 3.8190476190e+01 G2 integer + 1.4666666667e+01 minSize integer + 1.4142857143e+03 maxSize integer + 6.5714285714e+01 minSizePl integer + 6.5142857143e+01 minSizeSeg integer + 1.1857142857e+03 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 5.7142857143e+00 recon integer + 4.3809523810e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 453: +Active set vector = { 1 } + 4.5654752700e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 454 +--------------------- +Parameters for evaluation 454: + 2.2142857143e+02 blue integer + 2.4000000000e+02 green integer + 2.4000000000e+02 red integer + 4.4047619048e+00 T1 float + 4.4047619048e+00 T2 float + 1.9285714286e+01 G1 integer + 3.8190476190e+01 G2 integer + 1.4666666667e+01 minSize integer + 1.4142857143e+03 maxSize integer + 6.5714285714e+01 minSizePl integer + 6.5142857143e+01 minSizeSeg integer + 1.5000000000e+03 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 5.7142857143e+00 recon integer + 4.3809523810e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 454: +Active set vector = { 1 } + 4.5655233800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 455 +--------------------- +Parameters for evaluation 455: + 2.3714285714e+02 blue integer + 2.4000000000e+02 green integer + 2.4000000000e+02 red integer + 4.4047619048e+00 T1 float + 4.4047619048e+00 T2 float + 1.9285714286e+01 G1 integer + 3.8190476190e+01 G2 integer + 1.4666666667e+01 minSize integer + 1.4142857143e+03 maxSize integer + 6.5714285714e+01 minSizePl integer + 6.5142857143e+01 minSizeSeg integer + 1.5000000000e+03 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 5.7142857143e+00 recon integer + 4.3809523810e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 455: +Active set vector = { 1 } + 4.5655233800e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 456 +--------------------- +Parameters for evaluation 456: + 2.3714285714e+02 blue integer + 2.4000000000e+02 green integer + 2.4000000000e+02 red integer + 7.0238095238e+00 T1 float + 4.4047619048e+00 T2 float + 1.9285714286e+01 G1 integer + 3.8190476190e+01 G2 integer + 1.4666666667e+01 minSize integer + 1.4142857143e+03 maxSize integer + 6.5714285714e+01 minSizePl integer + 6.5142857143e+01 minSizeSeg integer + 1.5000000000e+03 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 5.7142857143e+00 recon integer + 4.3809523810e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 456: +Active set vector = { 1 } + 4.5654004400e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 457 +--------------------- +Parameters for evaluation 457: + 2.3714285714e+02 blue integer + 2.4000000000e+02 green integer + 2.4000000000e+02 red integer + 7.0238095238e+00 T1 float + 4.4047619048e+00 T2 float + 1.9285714286e+01 G1 integer + 3.8190476190e+01 G2 integer + 1.4666666667e+01 minSize integer + 1.4142857143e+03 maxSize integer + 6.5714285714e+01 minSizePl integer + 6.5142857143e+01 minSizeSeg integer + 1.5000000000e+03 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 5.7142857143e+00 recon integer + 6.4761904762e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out + +Active response data for evaluation 457: +Active set vector = { 1 } + 4.3782187000e+08 response_fn_1 + + + +--------------------- +Begin Evaluation 458 +--------------------- +Parameters for evaluation 458: + 2.3714285714e+02 blue integer + 2.4000000000e+02 green integer + 2.4000000000e+02 red integer + 7.0238095238e+00 T1 float + 7.0238095238e+00 T2 float + 1.9285714286e+01 G1 integer + 3.8190476190e+01 G2 integer + 1.4666666667e+01 minSize integer + 1.4142857143e+03 maxSize integer + 6.5714285714e+01 minSizePl integer + 6.5142857143e+01 minSizeSeg integer + 1.5000000000e+03 maxSizeSeg integer + 6.0952380952e+00 fillHoles integer + 5.7142857143e+00 recon integer + 6.4761904762e+00 water integer + [0.26235,0.0514831,0.0114217] target_std floatarray + [-0.632356,-0.0516004,0.0376543] target_mean floatarray + /home/willian/Desktop/images15/image3.tiff input_img string + /home/willian/Desktop/images15/image3.mask.png input_ref_img string + +blocking fork: simulator_script params.in results.out end From f4cbf750b56cbcf5476d9f59ebe4ae5528a407ae Mon Sep 17 00:00:00 2001 From: Willian Date: Thu, 22 Sep 2016 15:02:20 -0300 Subject: [PATCH 45/87] Stage creation implemented. Still need to add interstage arguments. --- .../PipelineManager.cpp | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 8fac5ac..d4c12f9 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -770,12 +770,13 @@ ArgumentBase* gen_arg(string value, string type) { return arg; } -all_inps_in(p.second->getInputs(), args, input_arguments) +bool all_inps_in(const list& inps, const map& args, + const map>& input_arguments) { -bool all_inps_in(list inps, map> ref) { for (int i : inps) { - if (ref.find(i) == ref.end()) + if (input_arguments.find(args.at(i)->getName()) == input_arguments.end()) { return false; + } } return true; } @@ -812,8 +813,6 @@ void generate_pre_defined_stages(FILE* parameters_values_file, map s : stages_arguments) { + cout << "got stage:" << endl; + for (ArgumentBase* a : s) { + cout << "\t" << a->getId() << ":" << a->getName() << " = " << a->toString() << endl; + } + } + // keep expanding stages until there is no stage left while (base_stages.size() != 0) { // cout << "base_stages size: " << base_stages.size() << endl; @@ -882,10 +888,10 @@ void generate_pre_defined_stages(FILE* parameters_values_file, mapgetInputs()) { - for (ArgumentBase* a : stages_arguments) { - if (args[inp_id]->getName().compare(a->getName())==0 && args[inp_id]->toString().compare(a->toString())) { - arg_values += aa->toString(); - tmp->addArgument(aa); + for (ArgumentBase* a : as) { + if (args.at(inp_id)->getName().compare(a->getName())==0) { + arg_values += a->toString(); + tmp->addArgument(a->clone()); } } } @@ -894,6 +900,7 @@ void generate_pre_defined_stages(FILE* parameters_values_file, mapsetId(id); + tmp->setName(p.second->getName()); expanded_stages[id] = tmp; } else delete tmp; @@ -903,8 +910,8 @@ void generate_pre_defined_stages(FILE* parameters_values_file, map s : expanded_stages) { - cout << s.second->getName() << ":" endl; + for (pair s : expanded_stages) { + cout << s.second->getName() << ":" << endl; for (ArgumentBase* a : s.second->getArguments()) { cout << "\t" << a->getId() << ":" << a->getName() << " = " << a->toString() << endl; } From 65f9c73155f3883bfb108716c6d7c36c7f95acc5 Mon Sep 17 00:00:00 2001 From: Willian Date: Fri, 23 Sep 2016 12:44:51 -0300 Subject: [PATCH 46/87] Workflows generation almost complete: Stages are being generated already merged with the correct interstage args. The outputs haven't been set yet. Fine-grain merge bug found: When testing with three generated workflows and size=9 one stage of segmentation disapeared from the merging result. --- .../PipelineManager.cpp | 193 +++++++++++++----- 1 file changed, 137 insertions(+), 56 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index d4c12f9..70c8d7f 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -106,8 +106,8 @@ void add_arguments_to_stages(map &merged_stages, map &merged_arguments, RegionTemplate *rt); void generate_pre_defined_stages(FILE* parameters_values_file, map args, - map base_stages, map workflow_outputs, - map expanded_args, map expanded_stages); + map base_stages, map& workflow_outputs, + map& expanded_args, map& expanded_stages); // Workflow parsing helper functions list line_buffer; @@ -118,7 +118,9 @@ void get_workflow_arguments(FILE* workflow, list &output_argument vector get_all_fields(FILE* workflow, string start, string end); PipelineComponentBase* find_stage(map stages, string name); int find_stage_id(map stages, string name); -ArgumentBase* find_argument(const map arguments, string name); +ArgumentBase* find_argument(const map& arguments, string name); +ArgumentBase* find_argument(const list& arguments, int id); +ArgumentBase* find_argument(const list& arguments, string name); ArgumentBase* new_typed_arg_base(string type); parsing::port_type_t get_port_type(string s); @@ -178,19 +180,19 @@ int main(int argc, char* argv[]) { map base_stages; map interstage_arguments; get_stages_from_file(workflow_descriptor, base_stages, interstage_arguments); - cout << endl << "base_stages:" << endl; - for (pair p : base_stages) { - cout << p.first << ":" << p.second->getName() << endl; - cout << "\toutputs: " << p.second->getOutputs().size() << endl << endl; - for (int i : p.second->getOutputs()) - cout << "\t\t" << i << ":" << interstage_arguments[i]->getName() << endl; - cout << "\t task descriptors:" << endl; - for (pair> d : p.second->tasksDesc) { - cout << "\t\ttask: " << d.first << endl; - for (ArgumentBase* a : d.second) - cout << "\t\t\t" << a->getName() << endl; - } - } + // cout << endl << "base_stages:" << endl; + // for (pair p : base_stages) { + // cout << p.first << ":" << p.second->getName() << endl; + // cout << "\toutputs: " << p.second->getOutputs().size() << endl << endl; + // for (int i : p.second->getOutputs()) + // cout << "\t\t" << i << ":" << interstage_arguments[i]->getName() << endl; + // cout << "\t task descriptors:" << endl; + // for (pair> d : p.second->tasksDesc) { + // cout << "\t\ttask: " << d.first << endl; + // for (ArgumentBase* a : d.second) + // cout << "\t\t\t" << a->getName() << endl; + // } + // } // cout << endl << "interstage_arguments:" << endl; @@ -218,10 +220,10 @@ int main(int argc, char* argv[]) { // cout << endl << "connected base_stages:" << endl; // for (pair p : base_stages) { // cout << p.first << ":" << p.second->getName() << endl; - // cout << "\tinputs: " << p.second->getInputs().size() << endl << endl; + // cout << "\tinputs: " << p.second->getInputs().size() << endl; // for (int i : p.second->getInputs()) // cout << "\t\t" << i << ":" << all_argument[i]->getName() << endl; - // cout << "\toutputs: " << p.second->getOutputs().size() << endl << endl; + // cout << "\toutputs: " << p.second->getOutputs().size() << endl; // for (int i : p.second->getOutputs()) // cout << "\t\t" << i << ":" << all_argument[i]->getName() << endl; // } @@ -267,7 +269,7 @@ int main(int argc, char* argv[]) { add_arguments_to_stages(expanded_stages, expanded_args, rt); map merged_stages; - int size = 9; + int size = 3; MPI_Comm_size(MPI_COMM_WORLD, &size); merge_stages_fine_grain(expanded_stages, base_stages, merged_stages, rt, expanded_args, size-1); @@ -771,10 +773,14 @@ ArgumentBase* gen_arg(string value, string type) { } bool all_inps_in(const list& inps, const map& args, - const map>& input_arguments) { + const map>& input_arguments, + const list& args_values) { for (int i : inps) { - if (input_arguments.find(args.at(i)->getName()) == input_arguments.end()) { + // cout << "checking arg " << args.at(i)->getId() << ":" << args.at(i)->getName() << endl; + if (input_arguments.find(args.at(i)->getName()) == input_arguments.end() && + find_argument(args_values, args.at(i)->getName()) == NULL) { + // cout << "not here" << endl; return false; } } @@ -782,8 +788,8 @@ bool all_inps_in(const list& inps, const map& args, } void generate_pre_defined_stages(FILE* parameters_values_file, map args, - map base_stages, map workflow_outputs, - map expanded_args, map expanded_stages) { + map base_stages, map& workflow_outputs, + map& expanded_args, map& expanded_stages) { cout << "[generate_pre_defined_stages]" << endl; @@ -795,7 +801,14 @@ void generate_pre_defined_stages(FILE* parameters_values_file, map> input_arguments; - list> stages_arguments; + // list of the stages' arguments + map> stages_arguments; + + // interstage args + list args_values; + + // list of stages created here + list stages_iterative; while(getline(&line, &length, parameters_values_file) != -1) { // go to the first pe @@ -852,7 +865,7 @@ void generate_pre_defined_stages(FILE* parameters_values_file, map s : stages_arguments) { - cout << "got stage:" << endl; - for (ArgumentBase* a : s) { - cout << "\t" << a->getId() << ":" << a->getName() << " = " << a->toString() << endl; - } - } + // for (list s : stages_arguments) { + // cout << "got stage:" << endl; + // for (ArgumentBase* a : s) { + // cout << "\t" << a->getId() << ":" << a->getName() << " = " << a->toString() << endl; + // } + // } // keep expanding stages until there is no stage left while (base_stages.size() != 0) { // cout << "base_stages size: " << base_stages.size() << endl; for (pair p : base_stages) { - // attempt to find a stage witch has all inputs expanded - if (all_inps_in(p.second->getInputs(), args, input_arguments)) { - cout << "stage " << p.second->getName() << " has all inputs" << endl; + // attempt to find a stage witch has all inputs expanded either on the workflow inputs or interstage ones + // cout << "checking stage " << p.second->getName() << endl; + if (all_inps_in(p.second->getInputs(), args, input_arguments, args_values)) { + // cout << "stage " << p.second->getName() << " has all inputs" << endl; // A list of concatenated arg values, used as a quick way to verify if a stage with // the same args was already created. - list arg_values_list; + map arg_values_list; // expands all input values of stage p - for (list as : stages_arguments) { + for (pair> as : stages_arguments) { PipelineComponentBase* tmp = p.second->clone(); string arg_values = ""; // add all arguments from stages_arguments that belong to stage p.second for (int inp_id : p.second->getInputs()) { - for (ArgumentBase* a : as) { + // cout << "checking input " << args[inp_id]->getName() << " of " << p.second->getName() << endl; + for (ArgumentBase* a : as.second) { if (args.at(inp_id)->getName().compare(a->getName())==0) { - arg_values += a->toString(); - tmp->addArgument(a->clone()); + arg_values += to_string(a->getId()); + tmp->addInput(a->getId()); + break; } } } + map::iterator it = arg_values_list.find(arg_values); // verify if there is no other stage with the same values - if (find(arg_values_list.begin(), arg_values_list.end(), arg_values) == arg_values_list.end()) { - arg_values_list.emplace_back(arg_values); + if (it == arg_values_list.end()) { + // add current stage and args values to be compared later + arg_values_list[arg_values] = tmp; + + // finishes to generate the stage int id = new_uid(); tmp->setId(id); tmp->setName(p.second->getName()); - expanded_stages[id] = tmp; - } else - delete tmp; + tmp->setLocation(PipelineComponentBase::WORKER_SIDE); + + // generate outputs + for (int out_id : p.second->getOutputs()) { + int new_id = new_uid(); + ArgumentBase* ab_cpy = args.at(out_id)->clone(); + ab_cpy->setName(args.at(out_id)->getName()); + ab_cpy->setId(new_id); + ab_cpy->setParent(tmp->getId()); + tmp->replaceOutput(out_id, new_id); + + // add stage's output arguments to current workflow's argument list + stages_arguments[as.first].emplace_back(ab_cpy); + + // add output to interstage args map + args_values.emplace_back(ab_cpy); + } + + // add stage to final stages list + expanded_stages[tmp->getId()] = tmp; + } else { + // if the stage already exists, reuse it + for (int out_id : it->second->getOutputs()) { + // add reused stage's output arguments to current workflow's argument list + // cout << "reusing stage " << out_id << " from workflow " + // << it->second->getId() << endl; + stages_arguments[as.first].emplace_back(find_argument(args_values, out_id)); + } + + // TODO: solve mem leaking + // delete tmp; + } } - // remove stage descriptor since it was already solved + // remove stage descriptor since it was already solved and break the loop base_stages.erase(p.first); + break; } } - for (pair s : expanded_stages) { - cout << s.second->getName() << ":" << endl; - for (ArgumentBase* a : s.second->getArguments()) { - cout << "\t" << a->getId() << ":" << a->getName() << " = " << a->toString() << endl; - } - } + } - for (list s : stages_arguments) { - cout << "got stage:" << endl; - for (ArgumentBase* a : s) { - cout << "\t" << a->getId() << ":" << a->getName() << " = " << a->toString() << endl; + // add stages_arguments inputs to expanded_args + for (pair> p : stages_arguments) { + for (ArgumentBase* a : p.second) { + expanded_args[a->getId()] = a; } } + + // // update the output arguments + // map workflow_outputs_cpy = workflow_outputs; + // while (workflow_outputs_cpy.size() != 0) { + // // get the first output argument + // ArgumentBase* old_arg = (workflow_outputs_cpy.begin())->second; + + // // get the list of parameters (i.e the number of copies and the final ids) of the outputs + // list l = args_values[old_arg->getId()]; + + // // remove the current, outdated, argument from final map + // workflow_outputs.erase(old_arg->getId()); + // workflow_outputs_cpy.erase(old_arg->getId()); + + // // add a copy of the old arg with the correct id to the final map for each repeated output + // for (ArgumentBase* a : l) { + // ArgumentBase* temp = old_arg->clone(); + // temp->setParent(old_arg->getParent()); + // temp->setId(a->getId()); + // workflow_outputs[temp->getId()] = temp; + // } + // } } bool all_inps_in(list inps, map> ref) { @@ -2076,13 +2143,27 @@ int find_stage_id(map stages, string name) { return -1; } -ArgumentBase* find_argument(const map arguments, string name) { +ArgumentBase* find_argument(const map& arguments, string name) { for (pair p : arguments) if (p.second->getName().compare(name) == 0) return p.second; return NULL; } +ArgumentBase* find_argument(const list& arguments, int id) { + for (ArgumentBase* a : arguments) + if (a->getId() == id) + return a; + return NULL; +} + +ArgumentBase* find_argument(const list& arguments, string name) { + for (ArgumentBase* a : arguments) + if (a->getName().compare(name) == 0) + return a; + return NULL; +} + // taken from: http://stackoverflow.com/questions/16388510/evaluate-a-string-with-a-switch-in-c constexpr unsigned int str2int(const char* str, int h = 0) { return !str[h] ? 5381 : (str2int(str, h+1) * 33) ^ str[h]; From aaa1b2ee6162f2a6b214e631b580f894807b0568 Mon Sep 17 00:00:00 2001 From: Willian Date: Sat, 24 Sep 2016 14:08:38 -0300 Subject: [PATCH 47/87] The workflows are executing, but the manager is finishing before all workflows are finished. This may happen because the last stages dependencies aren't being set propperly --- .../PipelineManager.cpp | 85 +++++++++++-------- 1 file changed, 49 insertions(+), 36 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 70c8d7f..2548b2c 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -130,7 +130,7 @@ int main(int argc, char* argv[]) { SysEnv sysEnv; // Tell the system which libraries should be used - // sysEnv.startupSystem(argc, argv, "libcomponentnsdifffgo.so"); + sysEnv.startupSystem(argc, argv, "libcomponentnsdifffgo.so"); // region template used by all stages RegionTemplate *rt = new RegionTemplate(); @@ -766,6 +766,9 @@ ArgumentBase* gen_arg(string value, string type) { token2 = strtok(NULL, "[],"); } break; + case parsing::rt_t: + arg = new ArgumentRT(value); + break; default: exit(-4); } @@ -845,6 +848,7 @@ void generate_pre_defined_stages(FILE* parameters_values_file, mapgetName() << ":" << a->toString() << " with " << name << ":" << aa->toString() << endl; if (a->getName().compare(name)==0 && a->toString().compare(aa->toString())==0) { found = true; @@ -856,6 +860,12 @@ void generate_pre_defined_stages(FILE* parameters_values_file, mapgetType() == ArgumentBase::RT) + ((ArgumentRT*)arg)->isFileInput = true; + + // set remaining atributes arg->setName(name); arg->setId(new_uid()); @@ -970,27 +980,26 @@ void generate_pre_defined_stages(FILE* parameters_values_file, map workflow_outputs_cpy = workflow_outputs; - // while (workflow_outputs_cpy.size() != 0) { - // // get the first output argument - // ArgumentBase* old_arg = (workflow_outputs_cpy.begin())->second; - - // // get the list of parameters (i.e the number of copies and the final ids) of the outputs - // list l = args_values[old_arg->getId()]; - - // // remove the current, outdated, argument from final map - // workflow_outputs.erase(old_arg->getId()); - // workflow_outputs_cpy.erase(old_arg->getId()); - - // // add a copy of the old arg with the correct id to the final map for each repeated output - // for (ArgumentBase* a : l) { - // ArgumentBase* temp = old_arg->clone(); - // temp->setParent(old_arg->getParent()); - // temp->setId(a->getId()); - // workflow_outputs[temp->getId()] = temp; - // } - // } + // update the output arguments + map workflow_outputs_cpy = workflow_outputs; + while (workflow_outputs_cpy.size() != 0) { + // get the first output argument + ArgumentBase* old_arg = (workflow_outputs_cpy.begin())->second; + + // remove the current, outdated, argument from final map + workflow_outputs.erase(old_arg->getId()); + workflow_outputs_cpy.erase(old_arg->getId()); + + // add a copy of the old arg with the correct id to the final map for each repeated output + for (ArgumentBase* a : args_values) { + if (a->getName().compare(old_arg->getName()) == 0) { + ArgumentBase* temp = old_arg->clone(); + temp->setParent(old_arg->getParent()); + temp->setId(a->getId()); + workflow_outputs[temp->getId()] = temp; + } + } + } } bool all_inps_in(list inps, map> ref) { @@ -1019,15 +1028,15 @@ void expand_stages(const map &args, // mapprint(args); // cout << endl; - // cout << endl << "arg_values:" << endl; - for (pair> p : args_values) { - // cout << "base argument " << p.first << ":" << args.at(p.first)->getName() << endl; - for (ArgumentBase* a : p.second) { - a->setId(new_uid()); - a->setName(args.at(p.first)->getName()); - // cout << "\t" << a->getId() << ":" << a->getName() << " = " << a->toString() << endl; - } - } + // // cout << endl << "arg_values:" << endl; + // for (pair> p : args_values) { + // // cout << "base argument " << p.first << ":" << args.at(p.first)->getName() << endl; + // for (ArgumentBase* a : p.second) { + // a->setId(new_uid()); + // a->setName(args.at(p.first)->getName()); + // // cout << "\t" << a->getId() << ":" << a->getName() << " = " << a->toString() << endl; + // } + // } // cout << endl << "stages:" << endl; // mapprint(stages); @@ -1929,9 +1938,12 @@ void generate_drs(RegionTemplate* rt, // verify every argument for (pair p : expanded_args) { + cout << "------------checking arg" << p.first << ":" << p.second->getName() << endl; // if an argument is a region template data region if (p.second->getType() == ArgumentBase::RT) { + cout << "arg" << p.first << ":" << p.second->getName() << " is RT" << endl; if (((ArgumentRT*)p.second)->isFileInput) { + cout << "arg" << p.first << ":" << p.second->getName() << " is file inptut" << endl; // create the data region and add it to the input region template DenseDataRegion2D *ddr2d = new DenseDataRegion2D(); ddr2d->setName(p.second->getName()); @@ -1959,14 +1971,15 @@ void add_arguments_to_stages(map &merged_stages, for (int arg_id : stage.second->getInputs()) { ArgumentBase* new_arg = merged_arguments[arg_id]->clone(); stage.second->addArgument(new_arg); - if (merged_arguments[arg_id]->getType() == ArgumentBase::RT) { - // cout << "input RT : " << merged_arguments[arg_id]->getName() << endl; + if (new_arg->getType() == ArgumentBase::RT) { + cout << "input RT : " << merged_arguments[arg_id]->getName() << endl; // insert the region template on the parent stage if the argument is a DR and if the RT wasn't already added if (((RTPipelineComponentBase*)stage.second)-> - getRegionTemplateInstance(rt->getName()) == NULL) + getRegionTemplateInstance(rt->getName()) == NULL) { ((RTPipelineComponentBase*)stage.second)->addRegionTemplateInstance(rt, rt->getName()); + } ((RTPipelineComponentBase*)stage.second)->addInputOutputDataRegion( - rt->getName(), merged_arguments[arg_id]->getName(), RTPipelineComponentBase::INPUT); + rt->getName(), new_arg->getName(), RTPipelineComponentBase::INPUT); } if (merged_arguments[arg_id]->getParent() != 0) { // verify if the dependency stage was reused @@ -1986,7 +1999,7 @@ void add_arguments_to_stages(map &merged_stages, ArgumentBase* new_arg = merged_arguments[arg_id]->clone(); stage.second->addArgument(new_arg); if (merged_arguments[arg_id]->getType() == ArgumentBase::RT) { - // cout << "output RT : " << merged_arguments[arg_id]->getName() << endl; + cout << "output RT : " << merged_arguments[arg_id]->getName() << endl; // insert the region template on the parent stage if the argument is a DR and if the RT wasn't already added if (((RTPipelineComponentBase*)stage.second)->getRegionTemplateInstance(rt->getName()) == NULL) ((RTPipelineComponentBase*)stage.second)->addRegionTemplateInstance(rt, rt->getName()); From 77c9183c9a53c11f86fedfca1d5624838a479b59 Mon Sep 17 00:00:00 2001 From: Willian Date: Sun, 25 Sep 2016 22:52:02 -0300 Subject: [PATCH 48/87] Bug Fixes: 1. Fixed stage dependency after merging using dakota input; 2. Fixed input arguments from reused stages; 3. Fixed output Arguments being destroyed prematurelt by being considered as input. There is a problem enforcing the fine grain tasks dependencies. This was temporarily fixed by executing the tasks on the Segmentation run method instead of sending them to the local manager. The system is working with -np 2 but crashing on anything >2. --- runtime/PipelineComponentBase.cpp | 25 ++- runtime/PipelineComponentBase.h | 8 + .../PipelineManager.cpp | 84 +++++++++- .../PipelineRTFS-NS-Diff-FGO/Segmentation.cpp | 148 +++++++++++++++++- .../PipelineRTFS-NS-Diff-FGO/Segmentation.hpp | 3 - 5 files changed, 250 insertions(+), 18 deletions(-) diff --git a/runtime/PipelineComponentBase.cpp b/runtime/PipelineComponentBase.cpp index e66fbbe..14b2d0d 100644 --- a/runtime/PipelineComponentBase.cpp +++ b/runtime/PipelineComponentBase.cpp @@ -73,13 +73,22 @@ ArgumentBase *PipelineComponentBase::getArgument(int index) ArgumentBase *PipelineComponentBase::getArgumentById(int id) { - ArgumentBase *retArg = NULL; for (vector::iterator i = this->arguments.begin(); i != this->arguments.end(); i++) { if ((*i)->getId() == id) { - retArg = *i; + return *i; } } - return retArg; + return NULL; +} + +ArgumentBase *PipelineComponentBase::getArgumentByName(std::string name) +{ + for (vector::iterator i = this->arguments.begin(); i != this->arguments.end(); i++) { + if ((*i)->getName().compare(name) == 0) { + return *i; + } + } + return NULL; } std::string PipelineComponentBase::getComponentName() const @@ -379,6 +388,16 @@ PipelineComponentBase* PipelineComponentBase::clone() { return retValue; } +void PipelineComponentBase::replaceArgument(int old_id, ArgumentBase* new_a) { + for (std::vector::iterator i=arguments.begin(); i!=arguments.end(); i++) { + if ((*i)->getId() == old_id) { + arguments.erase(i); + arguments.push_back(new_a); + return; + } + } +} + void PipelineComponentBase::printTasks() { for (std::list::iterator i = tasks.begin(); i!=tasks.end(); i++) { (*i)->print(); diff --git a/runtime/PipelineComponentBase.h b/runtime/PipelineComponentBase.h index fc52afb..a443d65 100644 --- a/runtime/PipelineComponentBase.h +++ b/runtime/PipelineComponentBase.h @@ -115,6 +115,11 @@ class PipelineComponentBase: public Task { // instead of changing getArgument(int) for compatibility reasons ArgumentBase *getArgumentById(int id); + // Retrieve an argument with 'id', if it exists, otherwise NULL is returned + // This is used by the fine-grain merging and was added here as a new function + // instead of changing getArgument(int) for compatibility reasons + ArgumentBase *getArgumentByName(std::string name); + // Get current number of arguments associated to this component. int getArgumentsSize(); @@ -175,6 +180,9 @@ class PipelineComponentBase: public Task { // needed for inter stage dependency verification on task merging std::vector getArguments() {return arguments;}; + // needed to update an argument of a reused stage on fine-grain merging + void replaceArgument(int old_id, ArgumentBase* new_a); + void printTasks(); // makespan cost diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 2548b2c..d852f31 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -273,6 +273,44 @@ int main(int argc, char* argv[]) { MPI_Comm_size(MPI_COMM_WORLD, &size); merge_stages_fine_grain(expanded_stages, base_stages, merged_stages, rt, expanded_args, size-1); + // resolve dependencies of reused stages + for (pair p : merged_stages) { + // add correct stage dependencies + list deps_tmp; + for (int i=0; igetNumberDependencies(); i++) { + if (merged_stages.find(p.second->getDependency(i)) != merged_stages.end() && + merged_stages[p.second->getDependency(i)]->reused != NULL) { + deps_tmp.emplace_back(merged_stages[p.second->getDependency(i)]->reused->getId()); + } + } + for (int d : deps_tmp) + p.second->addDependency(d); + + // connect correct output arguments + bool updated = true; + while (updated) { + updated = false; + for (ArgumentBase* a : p.second->getArguments()) { + if (a->getParent() != 0 && merged_stages[a->getParent()]->reused != NULL) { + updated = true; + p.second->replaceArgument(a->getId(), + merged_stages[a->getParent()]->reused->getArgumentByName(a->getName())); + break; + } + } + } + + // replace arguments with clones to avoid double free when stages are finished + // map args_clones; + // for (ArgumentBase* a : p.second->getArguments()) { + // ArgumentBase* cpy = a->clone(); + // cpy->setId(new_uid()); + // args_clones[a->getId()] = cpy; + // } + // for (pair a : args_clones) + // p.second->replaceArgument(a.first, a.second); + } + cout << endl<< "merged-fine: " << endl; for (pair p : merged_stages) { string s = p.second->reused!=NULL?" - reused":""; @@ -298,7 +336,11 @@ int main(int argc, char* argv[]) { for (pair s : merged_stages) { if (s.second->reused == NULL) { cout << "sent component " << s.second->getId() << ":" - << s.second->getName() << " to execute with args:" << endl; + << s.second->getName() << " sized " << s.second->size() << " to execute with args:" << endl; + cout << "\tall args: " << endl; + for (ArgumentBase* a : s.second->getArguments()) + cout << "\t\t" << a->getId() << ":" << a->getName() << " = " + << a->toString() << " parent " << a->getParent() << endl; cout << "\tinputs: " << endl; for (int i : s.second->getInputs()) cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " @@ -898,9 +940,9 @@ void generate_pre_defined_stages(FILE* parameters_values_file, map p : base_stages) { // attempt to find a stage witch has all inputs expanded either on the workflow inputs or interstage ones - // cout << "checking stage " << p.second->getName() << endl; + cout << "checking stage " << p.second->getName() << endl; if (all_inps_in(p.second->getInputs(), args, input_arguments, args_values)) { - // cout << "stage " << p.second->getName() << " has all inputs" << endl; + cout << "stage " << p.second->getName() << " has all inputs" << endl; // A list of concatenated arg values, used as a quick way to verify if a stage with // the same args was already created. @@ -917,6 +959,7 @@ void generate_pre_defined_stages(FILE* parameters_values_file, mapgetName().compare(a->getName())==0) { arg_values += to_string(a->getId()); tmp->addInput(a->getId()); + // tmp->addArgument(a->clone()); break; } } @@ -991,8 +1034,11 @@ void generate_pre_defined_stages(FILE* parameters_values_file, mapgetId()); // add a copy of the old arg with the correct id to the final map for each repeated output + cout << "checking output " << old_arg->getId() << ":" << old_arg->getName() << endl; for (ArgumentBase* a : args_values) { + cout << "comparing with output " << a->getId() << ":" << a->getName() << endl; if (a->getName().compare(old_arg->getName()) == 0) { + cout << "output found" << endl; ArgumentBase* temp = old_arg->clone(); temp->setParent(old_arg->getParent()); temp->setId(a->getId()); @@ -1353,6 +1399,7 @@ void merge_stages(PipelineComponentBase* current, PipelineComponentBase* s, map< s->tasks.clear(); } +// attempt to merge a list of PCB, returning the new list with only the merged PCBs list merge_stages(list stages, map &args, map> ref) { @@ -1374,6 +1421,29 @@ list merge_stages(list stages, return stages; } +// Attempt to merge a list of PCB, returning a list of PCBs with the same size. +// The new list will have the merged PCBs without any tasks and with the reuse +// atribute set as true. +list merge_stages_full(list stages, + map &args, map> ref) { + + if (stages.size() == 1) + return stages; + + list::iterator i = stages.begin(); + + for (; i!=stages.end(); i++) { + for (list::iterator j = next(i); j!=stages.end(); j++) { + if (merging_condition(*i, *j, args, ref)) { + merge_stages(*i, *j, ref); + (*j)->reused = *i; + } + } + } + + return stages; +} + mincut::weight_t get_reuse_factor(PipelineComponentBase* s1, PipelineComponentBase* s2, map &args, map> ref) { @@ -1925,7 +1995,7 @@ void merge_stages_fine_grain(const map &all_stages, // merge all stages in each bucket, given that they are mergable for (list bucket : solution) { - list curr = merge_stages(bucket, expanded_args, ref->second->tasksDesc); + list curr = merge_stages_full(bucket, expanded_args, ref->second->tasksDesc); // send rem stages to merged_stages for (PipelineComponentBase* s : curr) merged_stages[s->getId()] = s; @@ -1938,12 +2008,9 @@ void generate_drs(RegionTemplate* rt, // verify every argument for (pair p : expanded_args) { - cout << "------------checking arg" << p.first << ":" << p.second->getName() << endl; // if an argument is a region template data region if (p.second->getType() == ArgumentBase::RT) { - cout << "arg" << p.first << ":" << p.second->getName() << " is RT" << endl; if (((ArgumentRT*)p.second)->isFileInput) { - cout << "arg" << p.first << ":" << p.second->getName() << " is file inptut" << endl; // create the data region and add it to the input region template DenseDataRegion2D *ddr2d = new DenseDataRegion2D(); ddr2d->setName(p.second->getName()); @@ -1970,6 +2037,7 @@ void add_arguments_to_stages(map &merged_stages, // add input arguments to stage, adding them as RT as needed for (int arg_id : stage.second->getInputs()) { ArgumentBase* new_arg = merged_arguments[arg_id]->clone(); + new_arg->setParent(merged_arguments[arg_id]->getParent()); stage.second->addArgument(new_arg); if (new_arg->getType() == ArgumentBase::RT) { cout << "input RT : " << merged_arguments[arg_id]->getName() << endl; @@ -1997,6 +2065,8 @@ void add_arguments_to_stages(map &merged_stages, // add output arguments to stage, adding them as RT as needed for (int arg_id : stage.second->getOutputs()) { ArgumentBase* new_arg = merged_arguments[arg_id]->clone(); + new_arg->setParent(merged_arguments[arg_id]->getParent()); + new_arg->setIo(ArgumentBase::output); stage.second->addArgument(new_arg); if (merged_arguments[arg_id]->getType() == ArgumentBase::RT) { cout << "output RT : " << merged_arguments[arg_id]->getName() << endl; diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp index dfeee6b..d9ae859 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp @@ -116,24 +116,28 @@ int Segmentation::run() { map prev_map; for (list::reverse_iterator task=tasks.rbegin(); task!=tasks.rend(); task++) { - cout << "\t\t\t[Segmentation] sending task " << (*task)->getId() << endl; // generate a task copy and update the DR, getting the actual data ReusableTask* t = (*task)->clone(); t->updateDR(inputRt); + cout << "\t\t\t[Segmentation] sending task " << (*task)->getId() << endl; + // solve dependency if it isn't the first task if (t->parentTask != -1) { - t->addDependency(prev_map[t->parentTask]); + cout << "\t\t\t[Segmentation] setting dep of " << t->getId() << " to " << prev_map[t->parentTask]->getId() << endl; + t->addDependency(prev_map[t->parentTask]->getId()); t->resolveDependencies(prev_map[t->parentTask]); } - // send task to be executed - this->executeTask(t); - // add this task to parent list for future dependency resolution prev_map[t->getId()] = t; + t->run(); } + // send all tasks to be executed + // for (pair p : prev_map) + // this->executeTask(p.second); + return 0; } @@ -206,6 +210,8 @@ TaskSegmentation0::TaskSegmentation0(list args, RegionTemplate* i } TaskSegmentation0::~TaskSegmentation0() { + //std::cout << "bgr: " << to_string(bgr.use_count()) << " = " << &*bgr << endl; + //std::cout << "rbc: " << to_string(rbc.use_count()) << " = " << &*rbc << endl; } bool TaskSegmentation0::run(int procType, int tid) { @@ -215,6 +221,15 @@ bool TaskSegmentation0::run(int procType, int tid) { std::cout << "\t\t\tTaskSegmentation0 executing." << std::endl; + if (bgr.use_count() <= 0) { + std::cout << "bgr counter is " << bgr.use_count() << std::endl; + exit(-1); + } + if (rbc.use_count() <= 0) { + std::cout << "rbc counter is " << rbc.use_count() << std::endl; + exit(-1); + } + ::nscale::HistologicalEntities::segmentNucleiStg1(normalized_rt, blue, green, red, T1, T2, &(*bgr), &(*rbc)); uint64_t t2 = Util::ClockGetTimeProfile(); @@ -449,6 +464,11 @@ TaskSegmentation1::TaskSegmentation1(list args, RegionTemplate* i } TaskSegmentation1::~TaskSegmentation1() { + //std::cout << "bgr: " << to_string(bgr.use_count()) << " = " << &*bgr << endl; + //std::cout << "rc: " << to_string(rc.use_count()) << " = " << &*rc << endl; + //std::cout << "rc_recon: " << to_string(rc_recon.use_count()) << " = " << &*rc_recon << endl; + //std::cout << "rc_open: " << to_string(rc_open.use_count()) << " = " << &*rc_open << endl; + //std::cout << "rbc_fw: " << to_string(rbc_fw.use_count()) << " = " << &*rbc_fw << endl; } bool TaskSegmentation1::run(int procType, int tid) { @@ -457,6 +477,30 @@ bool TaskSegmentation1::run(int procType, int tid) { std::cout << "\t\t\tTaskSegmentation1 executing." << std::endl; + if (bgr.use_count() <= 0) { + std::cout << "bgr counter is " + << bgr.use_count() << std::endl; + exit(-1); + } + + if (rc.use_count() <= 0) { + std::cout << "rc counter is " + << rc.use_count() << std::endl; + exit(-1); + } + + if (rc_recon.use_count() <= 0) { + std::cout << "rc_recon counter is " + << rc_recon.use_count() << std::endl; + exit(-1); + } + + if (rc_open.use_count() <= 0) { + std::cout << "rc_open counter is " + << rc_open.use_count() << std::endl; + exit(-1); + } + ::nscale::HistologicalEntities::segmentNucleiStg2(reconConnectivity, &*bgr, &*rc, &*rc_recon, &*rc_open); uint64_t t2 = Util::ClockGetTimeProfile(); @@ -615,6 +659,12 @@ TaskSegmentation2::TaskSegmentation2(list args, RegionTemplate* i } TaskSegmentation2::~TaskSegmentation2() { + //std::cout << "rc: " << to_string(rc.use_count()) << " = " << &*rc << endl; + //std::cout << "rc_recon: " << to_string(rc_recon.use_count()) << " = " << &*rc_recon << endl; + //std::cout << "rc_open: " << to_string(rc_open.use_count()) << " = " << &*rc_open << endl; + //std::cout << "bw1: " << to_string(bw1.use_count()) << " = " << &*bw1 << endl; + //std::cout << "diffIm: " << to_string(diffIm.use_count()) << " = " << &*diffIm << endl; + //std::cout << "rbc_fw: " << to_string(rbc_fw.use_count()) << " = " << &*rbc_fw << endl; } bool TaskSegmentation2::run(int procType, int tid) { @@ -623,6 +673,32 @@ bool TaskSegmentation2::run(int procType, int tid) { std::cout << "\t\t\tTaskSegmentation2 executing." << std::endl; + if (rc.use_count() <= 0) { + std::cout << "rc counter is " + << rc.use_count() << std::endl; + exit(-1); + } + if (rc_recon.use_count() <= 0) { + std::cout << "rc_recon counter is " + << rc_recon.use_count() << std::endl; + exit(-1); + } + if (rc_open.use_count() <= 0) { + std::cout << "rc_open counter is " + << rc_open.use_count() << std::endl; + exit(-1); + } + if (bw1.use_count() <= 0) { + std::cout << "bw1 counter is " + << bw1.use_count() << std::endl; + exit(-1); + } + if (diffIm.use_count() <= 0) { + std::cout << "diffIm counter is " + << diffIm.use_count() << std::endl; + exit(-1); + } + ::nscale::HistologicalEntities::segmentNucleiStg3(fillHolesConnectivity, G1, &*rc, &*rc_recon, &*rc_open, &*bw1, &*diffIm); uint64_t t2 = Util::ClockGetTimeProfile(); @@ -794,6 +870,10 @@ TaskSegmentation3::TaskSegmentation3(list args, RegionTemplate* i } TaskSegmentation3::~TaskSegmentation3() { + //std::cout << "bw1: " << to_string(bw1.use_count()) << " = " << &*bw1 << endl; + //std::cout << "bw1_t: " << to_string(bw1_t.use_count()) << " = " << &*bw1_t << endl; + //std::cout << "rbc_fw: " << to_string(rbc_fw.use_count()) << " = " << &*rbc_fw << endl; + //std::cout << "diffIm_fw: " << to_string(diffIm_fw.use_count()) << " = " << &*diffIm_fw << endl; } bool TaskSegmentation3::run(int procType, int tid) { @@ -805,6 +885,17 @@ bool TaskSegmentation3::run(int procType, int tid) { std::cout << "\t\t\tTaskSegmentation3 executing." << std::endl; + if (bw1.use_count() <= 0) { + std::cout << "bw1 counter is " + << bw1.use_count() << std::endl; + exit(-1); + } + if (bw1_t.use_count() <= 0) { + std::cout << "bw1_t counter is " + << bw1_t.use_count() << std::endl; + exit(-1); + } + ::nscale::HistologicalEntities::segmentNucleiStg4(minSize, maxSize, &*bw1, &*bw1_t); uint64_t t2 = Util::ClockGetTimeProfile(); @@ -969,6 +1060,10 @@ TaskSegmentation4::TaskSegmentation4(list args, RegionTemplate* i } TaskSegmentation4::~TaskSegmentation4() { + //std::cout << "diffIm: " << to_string(diffIm.use_count()) << " = " << &*diffIm << endl; + //std::cout << "bw1_t: " << to_string(bw1_t.use_count()) << " = " << &*bw1_t << endl; + //std::cout << "rbc: " << to_string(rbc.use_count()) << " = " << &*rbc << endl; + //std::cout << "seg_open: " << to_string(seg_open.use_count()) << " = " << &*seg_open << endl; } bool TaskSegmentation4::run(int procType, int tid) { @@ -980,6 +1075,27 @@ bool TaskSegmentation4::run(int procType, int tid) { std::cout << "\t\t\tTaskSegmentation4 executing." << std::endl; + if (diffIm.use_count() <= 0) { + std::cout << "diffIm counter is " + << diffIm.use_count() << std::endl; + exit(-1); + } + if (bw1_t.use_count() <= 0) { + std::cout << "bw1_t counter is " + << bw1_t.use_count() << std::endl; + exit(-1); + } + if (rbc.use_count() <= 0) { + std::cout << "rbc counter is " + << rbc.use_count() << std::endl; + exit(-1); + } + if (seg_open.use_count() <= 0) { + std::cout << "seg_open counter is " + << seg_open.use_count() << std::endl; + exit(-1); + } + ::nscale::HistologicalEntities::segmentNucleiStg5(G2, &*diffIm, &*bw1_t, &*rbc, &*seg_open); uint64_t t2 = Util::ClockGetTimeProfile(); @@ -1148,6 +1264,8 @@ TaskSegmentation5::TaskSegmentation5(list args, RegionTemplate* i } TaskSegmentation5::~TaskSegmentation5() { + //std::cout << "seg_open: " << to_string(seg_open.use_count()) << " = " << &*seg_open << endl; + //std::cout << "seg_nonoverlap: " << to_string(seg_nonoverlap.use_count()) << " = " << &*seg_nonoverlap << endl; } bool TaskSegmentation5::run(int procType, int tid) { @@ -1160,6 +1278,17 @@ bool TaskSegmentation5::run(int procType, int tid) { std::cout << "\t\t\tTaskSegmentation5 executing." << std::endl; + if (seg_open.use_count() <= 0) { + std::cout << "seg_open counter is " + << seg_open.use_count() << std::endl; + exit(-1); + } + if (seg_nonoverlap.use_count() <= 0) { + std::cout << "seg_nonoverlap counter is " + << seg_nonoverlap.use_count() << std::endl; + exit(-1); + } + ::nscale::HistologicalEntities::segmentNucleiStg6(normalized_rt, minSizePl, watershedConnectivity, &*seg_open, &*seg_nonoverlap); uint64_t t2 = Util::ClockGetTimeProfile(); @@ -1377,6 +1506,8 @@ TaskSegmentation6::TaskSegmentation6(list args, RegionTemplate* i } TaskSegmentation6::~TaskSegmentation6() { + //std::cout << "seg_open: " << to_string(seg_open.use_count()) << " = " << &*seg_open << endl; + //std::cout << "seg_nonoverlap: " << to_string(seg_nonoverlap.use_count()) << " = " << &*seg_nonoverlap << endl; } bool TaskSegmentation6::run(int procType, int tid) { @@ -1388,6 +1519,13 @@ bool TaskSegmentation6::run(int procType, int tid) { std::cout << "\t\t\tTaskSegmentation6 executing." << std::endl; + if (seg_nonoverlap.use_count() <= 0) { + std::cout << "seg_nonoverlap counter is " + << seg_nonoverlap.use_count() << std::endl; + exit(-1); + } + + ::nscale::HistologicalEntities::segmentNucleiStg7(&segmented_rt, minSizeSeg, maxSizeSeg, fillHolesConnectivity, &*seg_nonoverlap); uint64_t t2 = Util::ClockGetTimeProfile(); diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp index a9854f4..d79aba8 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp @@ -253,9 +253,6 @@ friend class TaskSegmentation6; std::shared_ptr seg_open; std::shared_ptr seg_nonoverlap; - // forward intertask arguments - std::shared_ptr seg_open_fw; - public: // data regions std::shared_ptr normalized_rt_temp; From 68439283a3aa1751c5ebfdc84444bf97f0aae821 Mon Sep 17 00:00:00 2001 From: Willian Date: Sun, 25 Sep 2016 23:09:57 -0300 Subject: [PATCH 49/87] Fixed np > 2 bug. --- .../examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index d852f31..b7dfbdc 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -1271,6 +1271,10 @@ bool merging_condition(PipelineComponentBase* merged, PipelineComponentBase* to_ if (ref.size() == 0) return false; + // if any of the stages were already reused they can't be merged + if (to_merge->reused != NULL) + return false; + // verify if the first task is reusable if (!exists_reusable_task(merged, to_merge, ref.begin()->first)) return false; From 40aa440b6e0371f6eb1fcaf93fac9ea154700d8f Mon Sep 17 00:00:00 2001 From: Willian Date: Mon, 26 Sep 2016 00:10:04 -0300 Subject: [PATCH 50/87] Changed the format of the dakota input --- .../dakota_nscale_ps_moat_600_32nodes.out | 4586 ++++++++--------- 1 file changed, 2293 insertions(+), 2293 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/dakota_nscale_ps_moat_600_32nodes.out b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/dakota_nscale_ps_moat_600_32nodes.out index f9ebf88..6f6529d 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/dakota_nscale_ps_moat_600_32nodes.out +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/dakota_nscale_ps_moat_600_32nodes.out @@ -25,11 +25,11 @@ variables continuous_design = 15 lower_bounds 210.0 210.0 210.0 2.5 2.5 5.0 2.0 2.0 900.0 5.0 2.0 900.0 4.0 4.0 4.0 upper_bounds 240.0 240.0 240.0 7.5 7.5 80.0 40.0 40.0 1500.0 80.0 80.0 1500.0 8.0 8.0 8.0 - descriptors 'blue integer' 'green integer' 'red integer' 'T1 float' 'T2 float' 'G1 integer' 'G2 integer' 'minSize integer' 'maxSize integer' 'minSizePl integer' 'minSizeSeg integer' 'maxSizeSeg integer' 'fillHoles integer' 'recon integer' 'water integer + descriptors 'blue integer' 'green integer' 'red integer' 'T1 float' 'T2 float' 'G1 integer' 'G2 integer' 'minSize integer' 'maxSize integer' 'minSizePl integer' 'minSizeSeg integer' 'maxSizeSeg integer' 'fillHolesConnectivity integer' 'reconConnectivity integer' 'watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string' + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt' interface, fork @@ -83,13 +83,13 @@ Parameters for evaluation 1: 5.5000000000e+01 minSizePl integer 1.6857142857e+01 minSizeSeg integer 1.0142857143e+03 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 6.6666666667e+00 recon integer - 4.1904761905e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 6.6666666667e+00 reconConnectivity integer + 4.1904761905e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -115,13 +115,13 @@ Parameters for evaluation 2: 5.5000000000e+01 minSizePl integer 1.6857142857e+01 minSizeSeg integer 1.0142857143e+03 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 6.6666666667e+00 recon integer - 6.2857142857e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 6.6666666667e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -147,13 +147,13 @@ Parameters for evaluation 3: 5.5000000000e+01 minSizePl integer 1.6857142857e+01 minSizeSeg integer 1.0142857143e+03 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 6.6666666667e+00 recon integer - 6.2857142857e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 6.6666666667e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -179,13 +179,13 @@ Parameters for evaluation 4: 5.5000000000e+01 minSizePl integer 1.6857142857e+01 minSizeSeg integer 1.0142857143e+03 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 4.5714285714e+00 recon integer - 6.2857142857e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 4.5714285714e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -211,13 +211,13 @@ Parameters for evaluation 5: 5.5000000000e+01 minSizePl integer 5.7714285714e+01 minSizeSeg integer 1.0142857143e+03 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 4.5714285714e+00 recon integer - 6.2857142857e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 4.5714285714e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -243,13 +243,13 @@ Parameters for evaluation 6: 5.5000000000e+01 minSizePl integer 5.7714285714e+01 minSizeSeg integer 1.0142857143e+03 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 4.5714285714e+00 recon integer - 6.2857142857e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 4.5714285714e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -275,13 +275,13 @@ Parameters for evaluation 7: 5.5000000000e+01 minSizePl integer 5.7714285714e+01 minSizeSeg integer 1.0142857143e+03 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 4.5714285714e+00 recon integer - 6.2857142857e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 4.5714285714e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -307,13 +307,13 @@ Parameters for evaluation 8: 5.5000000000e+01 minSizePl integer 5.7714285714e+01 minSizeSeg integer 1.0142857143e+03 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 4.5714285714e+00 recon integer - 6.2857142857e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 4.5714285714e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -339,13 +339,13 @@ Parameters for evaluation 9: 5.5000000000e+01 minSizePl integer 5.7714285714e+01 minSizeSeg integer 1.3285714286e+03 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 4.5714285714e+00 recon integer - 6.2857142857e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 4.5714285714e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -371,13 +371,13 @@ Parameters for evaluation 10: 5.5000000000e+01 minSizePl integer 5.7714285714e+01 minSizeSeg integer 1.3285714286e+03 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 4.5714285714e+00 recon integer - 6.2857142857e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 4.5714285714e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -403,13 +403,13 @@ Parameters for evaluation 11: 1.5714285714e+01 minSizePl integer 5.7714285714e+01 minSizeSeg integer 1.3285714286e+03 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 4.5714285714e+00 recon integer - 6.2857142857e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 4.5714285714e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -435,13 +435,13 @@ Parameters for evaluation 12: 1.5714285714e+01 minSizePl integer 5.7714285714e+01 minSizeSeg integer 1.3285714286e+03 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 4.5714285714e+00 recon integer - 6.2857142857e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 4.5714285714e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -467,13 +467,13 @@ Parameters for evaluation 13: 1.5714285714e+01 minSizePl integer 5.7714285714e+01 minSizeSeg integer 1.3285714286e+03 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 4.5714285714e+00 recon integer - 6.2857142857e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 4.5714285714e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -499,13 +499,13 @@ Parameters for evaluation 14: 1.5714285714e+01 minSizePl integer 5.7714285714e+01 minSizeSeg integer 1.3285714286e+03 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 4.5714285714e+00 recon integer - 6.2857142857e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 4.5714285714e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -531,13 +531,13 @@ Parameters for evaluation 15: 1.5714285714e+01 minSizePl integer 5.7714285714e+01 minSizeSeg integer 1.3285714286e+03 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 4.5714285714e+00 recon integer - 6.2857142857e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 4.5714285714e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -563,13 +563,13 @@ Parameters for evaluation 16: 1.5714285714e+01 minSizePl integer 5.7714285714e+01 minSizeSeg integer 1.3285714286e+03 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 4.5714285714e+00 recon integer - 6.2857142857e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 4.5714285714e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -595,13 +595,13 @@ Parameters for evaluation 17: 4.4285714286e+01 minSizePl integer 7.6285714286e+01 minSizeSeg integer 1.2428571429e+03 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 8.0000000000e+00 recon integer - 5.9047619048e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 8.0000000000e+00 reconConnectivity integer + 5.9047619048e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -627,13 +627,13 @@ Parameters for evaluation 18: 4.4285714286e+01 minSizePl integer 7.6285714286e+01 minSizeSeg integer 1.2428571429e+03 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 8.0000000000e+00 recon integer - 5.9047619048e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 8.0000000000e+00 reconConnectivity integer + 5.9047619048e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -659,13 +659,13 @@ Parameters for evaluation 19: 4.4285714286e+01 minSizePl integer 7.6285714286e+01 minSizeSeg integer 1.2428571429e+03 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 8.0000000000e+00 recon integer - 5.9047619048e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 8.0000000000e+00 reconConnectivity integer + 5.9047619048e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -691,13 +691,13 @@ Parameters for evaluation 20: 5.0000000000e+00 minSizePl integer 7.6285714286e+01 minSizeSeg integer 1.2428571429e+03 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 8.0000000000e+00 recon integer - 5.9047619048e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 8.0000000000e+00 reconConnectivity integer + 5.9047619048e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -723,13 +723,13 @@ Parameters for evaluation 21: 5.0000000000e+00 minSizePl integer 7.6285714286e+01 minSizeSeg integer 9.2857142857e+02 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 8.0000000000e+00 recon integer - 5.9047619048e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 8.0000000000e+00 reconConnectivity integer + 5.9047619048e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -755,13 +755,13 @@ Parameters for evaluation 22: 5.0000000000e+00 minSizePl integer 7.6285714286e+01 minSizeSeg integer 9.2857142857e+02 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 8.0000000000e+00 recon integer - 8.0000000000e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 8.0000000000e+00 reconConnectivity integer + 8.0000000000e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -787,13 +787,13 @@ Parameters for evaluation 23: 5.0000000000e+00 minSizePl integer 7.6285714286e+01 minSizeSeg integer 9.2857142857e+02 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 5.9047619048e+00 recon integer - 8.0000000000e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 5.9047619048e+00 reconConnectivity integer + 8.0000000000e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -819,13 +819,13 @@ Parameters for evaluation 24: 5.0000000000e+00 minSizePl integer 7.6285714286e+01 minSizeSeg integer 9.2857142857e+02 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 5.9047619048e+00 recon integer - 8.0000000000e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 5.9047619048e+00 reconConnectivity integer + 8.0000000000e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -851,13 +851,13 @@ Parameters for evaluation 25: 5.0000000000e+00 minSizePl integer 3.5428571429e+01 minSizeSeg integer 9.2857142857e+02 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 5.9047619048e+00 recon integer - 8.0000000000e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 5.9047619048e+00 reconConnectivity integer + 8.0000000000e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -883,13 +883,13 @@ Parameters for evaluation 26: 5.0000000000e+00 minSizePl integer 3.5428571429e+01 minSizeSeg integer 9.2857142857e+02 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 5.9047619048e+00 recon integer - 8.0000000000e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 5.9047619048e+00 reconConnectivity integer + 8.0000000000e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -915,13 +915,13 @@ Parameters for evaluation 27: 5.0000000000e+00 minSizePl integer 3.5428571429e+01 minSizeSeg integer 9.2857142857e+02 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 5.9047619048e+00 recon integer - 8.0000000000e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 5.9047619048e+00 reconConnectivity integer + 8.0000000000e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -947,13 +947,13 @@ Parameters for evaluation 28: 5.0000000000e+00 minSizePl integer 3.5428571429e+01 minSizeSeg integer 9.2857142857e+02 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 5.9047619048e+00 recon integer - 8.0000000000e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 5.9047619048e+00 reconConnectivity integer + 8.0000000000e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -979,13 +979,13 @@ Parameters for evaluation 29: 5.0000000000e+00 minSizePl integer 3.5428571429e+01 minSizeSeg integer 9.2857142857e+02 maxSizeSeg integer - 6.4761904762e+00 fillHoles integer - 5.9047619048e+00 recon integer - 8.0000000000e+00 water integer + 6.4761904762e+00 fillHolesConnectivity integer + 5.9047619048e+00 reconConnectivity integer + 8.0000000000e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -1011,13 +1011,13 @@ Parameters for evaluation 30: 5.0000000000e+00 minSizePl integer 3.5428571429e+01 minSizeSeg integer 9.2857142857e+02 maxSizeSeg integer - 6.4761904762e+00 fillHoles integer - 5.9047619048e+00 recon integer - 8.0000000000e+00 water integer + 6.4761904762e+00 fillHolesConnectivity integer + 5.9047619048e+00 reconConnectivity integer + 8.0000000000e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -1043,13 +1043,13 @@ Parameters for evaluation 31: 5.0000000000e+00 minSizePl integer 3.5428571429e+01 minSizeSeg integer 9.2857142857e+02 maxSizeSeg integer - 6.4761904762e+00 fillHoles integer - 5.9047619048e+00 recon integer - 8.0000000000e+00 water integer + 6.4761904762e+00 fillHolesConnectivity integer + 5.9047619048e+00 reconConnectivity integer + 8.0000000000e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -1075,13 +1075,13 @@ Parameters for evaluation 32: 5.0000000000e+00 minSizePl integer 3.5428571429e+01 minSizeSeg integer 9.2857142857e+02 maxSizeSeg integer - 6.4761904762e+00 fillHoles integer - 5.9047619048e+00 recon integer - 8.0000000000e+00 water integer + 6.4761904762e+00 fillHolesConnectivity integer + 5.9047619048e+00 reconConnectivity integer + 8.0000000000e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -1107,13 +1107,13 @@ Parameters for evaluation 33: 3.7142857143e+01 minSizePl integer 4.6571428571e+01 minSizeSeg integer 1.0428571429e+03 maxSizeSeg integer - 5.3333333333e+00 fillHoles integer - 5.1428571429e+00 recon integer - 4.1904761905e+00 water integer + 5.3333333333e+00 fillHolesConnectivity integer + 5.1428571429e+00 reconConnectivity integer + 4.1904761905e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -1139,13 +1139,13 @@ Parameters for evaluation 34: 3.7142857143e+01 minSizePl integer 4.6571428571e+01 minSizeSeg integer 1.0428571429e+03 maxSizeSeg integer - 5.3333333333e+00 fillHoles integer - 5.1428571429e+00 recon integer - 4.1904761905e+00 water integer + 5.3333333333e+00 fillHolesConnectivity integer + 5.1428571429e+00 reconConnectivity integer + 4.1904761905e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -1171,13 +1171,13 @@ Parameters for evaluation 35: 3.7142857143e+01 minSizePl integer 4.6571428571e+01 minSizeSeg integer 1.0428571429e+03 maxSizeSeg integer - 5.3333333333e+00 fillHoles integer - 7.2380952381e+00 recon integer - 4.1904761905e+00 water integer + 5.3333333333e+00 fillHolesConnectivity integer + 7.2380952381e+00 reconConnectivity integer + 4.1904761905e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -1203,13 +1203,13 @@ Parameters for evaluation 36: 3.7142857143e+01 minSizePl integer 4.6571428571e+01 minSizeSeg integer 1.0428571429e+03 maxSizeSeg integer - 5.3333333333e+00 fillHoles integer - 7.2380952381e+00 recon integer - 4.1904761905e+00 water integer + 5.3333333333e+00 fillHolesConnectivity integer + 7.2380952381e+00 reconConnectivity integer + 4.1904761905e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -1235,13 +1235,13 @@ Parameters for evaluation 37: 3.7142857143e+01 minSizePl integer 4.6571428571e+01 minSizeSeg integer 1.0428571429e+03 maxSizeSeg integer - 5.3333333333e+00 fillHoles integer - 7.2380952381e+00 recon integer - 4.1904761905e+00 water integer + 5.3333333333e+00 fillHolesConnectivity integer + 7.2380952381e+00 reconConnectivity integer + 4.1904761905e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -1267,13 +1267,13 @@ Parameters for evaluation 38: 3.7142857143e+01 minSizePl integer 4.6571428571e+01 minSizeSeg integer 1.0428571429e+03 maxSizeSeg integer - 5.3333333333e+00 fillHoles integer - 7.2380952381e+00 recon integer - 4.1904761905e+00 water integer + 5.3333333333e+00 fillHolesConnectivity integer + 7.2380952381e+00 reconConnectivity integer + 4.1904761905e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -1299,13 +1299,13 @@ Parameters for evaluation 39: 3.7142857143e+01 minSizePl integer 4.6571428571e+01 minSizeSeg integer 1.0428571429e+03 maxSizeSeg integer - 7.4285714286e+00 fillHoles integer - 7.2380952381e+00 recon integer - 4.1904761905e+00 water integer + 7.4285714286e+00 fillHolesConnectivity integer + 7.2380952381e+00 reconConnectivity integer + 4.1904761905e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -1331,13 +1331,13 @@ Parameters for evaluation 40: 3.7142857143e+01 minSizePl integer 4.6571428571e+01 minSizeSeg integer 1.3571428571e+03 maxSizeSeg integer - 7.4285714286e+00 fillHoles integer - 7.2380952381e+00 recon integer - 4.1904761905e+00 water integer + 7.4285714286e+00 fillHolesConnectivity integer + 7.2380952381e+00 reconConnectivity integer + 4.1904761905e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -1363,13 +1363,13 @@ Parameters for evaluation 41: 3.7142857143e+01 minSizePl integer 4.6571428571e+01 minSizeSeg integer 1.3571428571e+03 maxSizeSeg integer - 7.4285714286e+00 fillHoles integer - 7.2380952381e+00 recon integer - 4.1904761905e+00 water integer + 7.4285714286e+00 fillHolesConnectivity integer + 7.2380952381e+00 reconConnectivity integer + 4.1904761905e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -1395,13 +1395,13 @@ Parameters for evaluation 42: 7.6428571429e+01 minSizePl integer 4.6571428571e+01 minSizeSeg integer 1.3571428571e+03 maxSizeSeg integer - 7.4285714286e+00 fillHoles integer - 7.2380952381e+00 recon integer - 4.1904761905e+00 water integer + 7.4285714286e+00 fillHolesConnectivity integer + 7.2380952381e+00 reconConnectivity integer + 4.1904761905e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -1427,13 +1427,13 @@ Parameters for evaluation 43: 7.6428571429e+01 minSizePl integer 4.6571428571e+01 minSizeSeg integer 1.3571428571e+03 maxSizeSeg integer - 7.4285714286e+00 fillHoles integer - 7.2380952381e+00 recon integer - 4.1904761905e+00 water integer + 7.4285714286e+00 fillHolesConnectivity integer + 7.2380952381e+00 reconConnectivity integer + 4.1904761905e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -1459,13 +1459,13 @@ Parameters for evaluation 44: 7.6428571429e+01 minSizePl integer 5.7142857143e+00 minSizeSeg integer 1.3571428571e+03 maxSizeSeg integer - 7.4285714286e+00 fillHoles integer - 7.2380952381e+00 recon integer - 4.1904761905e+00 water integer + 7.4285714286e+00 fillHolesConnectivity integer + 7.2380952381e+00 reconConnectivity integer + 4.1904761905e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -1491,13 +1491,13 @@ Parameters for evaluation 45: 7.6428571429e+01 minSizePl integer 5.7142857143e+00 minSizeSeg integer 1.3571428571e+03 maxSizeSeg integer - 7.4285714286e+00 fillHoles integer - 7.2380952381e+00 recon integer - 4.1904761905e+00 water integer + 7.4285714286e+00 fillHolesConnectivity integer + 7.2380952381e+00 reconConnectivity integer + 4.1904761905e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -1523,13 +1523,13 @@ Parameters for evaluation 46: 7.6428571429e+01 minSizePl integer 5.7142857143e+00 minSizeSeg integer 1.3571428571e+03 maxSizeSeg integer - 7.4285714286e+00 fillHoles integer - 7.2380952381e+00 recon integer - 6.2857142857e+00 water integer + 7.4285714286e+00 fillHolesConnectivity integer + 7.2380952381e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -1555,13 +1555,13 @@ Parameters for evaluation 47: 7.6428571429e+01 minSizePl integer 5.7142857143e+00 minSizeSeg integer 1.3571428571e+03 maxSizeSeg integer - 7.4285714286e+00 fillHoles integer - 7.2380952381e+00 recon integer - 6.2857142857e+00 water integer + 7.4285714286e+00 fillHolesConnectivity integer + 7.2380952381e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -1587,13 +1587,13 @@ Parameters for evaluation 48: 7.6428571429e+01 minSizePl integer 5.7142857143e+00 minSizeSeg integer 1.3571428571e+03 maxSizeSeg integer - 7.4285714286e+00 fillHoles integer - 7.2380952381e+00 recon integer - 6.2857142857e+00 water integer + 7.4285714286e+00 fillHolesConnectivity integer + 7.2380952381e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -1619,13 +1619,13 @@ Parameters for evaluation 49: 4.7857142857e+01 minSizePl integer 7.6285714286e+01 minSizeSeg integer 1.2714285714e+03 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 6.2857142857e+00 recon integer - 5.9047619048e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 6.2857142857e+00 reconConnectivity integer + 5.9047619048e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -1651,13 +1651,13 @@ Parameters for evaluation 50: 8.5714285714e+00 minSizePl integer 7.6285714286e+01 minSizeSeg integer 1.2714285714e+03 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 6.2857142857e+00 recon integer - 5.9047619048e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 6.2857142857e+00 reconConnectivity integer + 5.9047619048e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -1683,13 +1683,13 @@ Parameters for evaluation 51: 8.5714285714e+00 minSizePl integer 7.6285714286e+01 minSizeSeg integer 1.2714285714e+03 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 4.1904761905e+00 recon integer - 5.9047619048e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 4.1904761905e+00 reconConnectivity integer + 5.9047619048e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -1715,13 +1715,13 @@ Parameters for evaluation 52: 8.5714285714e+00 minSizePl integer 7.6285714286e+01 minSizeSeg integer 1.2714285714e+03 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 4.1904761905e+00 recon integer - 8.0000000000e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 4.1904761905e+00 reconConnectivity integer + 8.0000000000e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -1747,13 +1747,13 @@ Parameters for evaluation 53: 8.5714285714e+00 minSizePl integer 7.6285714286e+01 minSizeSeg integer 1.2714285714e+03 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 4.1904761905e+00 recon integer - 8.0000000000e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 4.1904761905e+00 reconConnectivity integer + 8.0000000000e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -1779,13 +1779,13 @@ Parameters for evaluation 54: 8.5714285714e+00 minSizePl integer 7.6285714286e+01 minSizeSeg integer 1.2714285714e+03 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 4.1904761905e+00 recon integer - 8.0000000000e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 4.1904761905e+00 reconConnectivity integer + 8.0000000000e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -1811,13 +1811,13 @@ Parameters for evaluation 55: 8.5714285714e+00 minSizePl integer 7.6285714286e+01 minSizeSeg integer 9.5714285714e+02 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 4.1904761905e+00 recon integer - 8.0000000000e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 4.1904761905e+00 reconConnectivity integer + 8.0000000000e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -1843,13 +1843,13 @@ Parameters for evaluation 56: 8.5714285714e+00 minSizePl integer 7.6285714286e+01 minSizeSeg integer 9.5714285714e+02 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 4.1904761905e+00 recon integer - 8.0000000000e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 4.1904761905e+00 reconConnectivity integer + 8.0000000000e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -1875,13 +1875,13 @@ Parameters for evaluation 57: 8.5714285714e+00 minSizePl integer 7.6285714286e+01 minSizeSeg integer 9.5714285714e+02 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 4.1904761905e+00 recon integer - 8.0000000000e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 4.1904761905e+00 reconConnectivity integer + 8.0000000000e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -1907,13 +1907,13 @@ Parameters for evaluation 58: 8.5714285714e+00 minSizePl integer 7.6285714286e+01 minSizeSeg integer 9.5714285714e+02 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 4.1904761905e+00 recon integer - 8.0000000000e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 4.1904761905e+00 reconConnectivity integer + 8.0000000000e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -1939,13 +1939,13 @@ Parameters for evaluation 59: 8.5714285714e+00 minSizePl integer 7.6285714286e+01 minSizeSeg integer 9.5714285714e+02 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 4.1904761905e+00 recon integer - 8.0000000000e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 4.1904761905e+00 reconConnectivity integer + 8.0000000000e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -1971,13 +1971,13 @@ Parameters for evaluation 60: 8.5714285714e+00 minSizePl integer 7.6285714286e+01 minSizeSeg integer 9.5714285714e+02 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 4.1904761905e+00 recon integer - 8.0000000000e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 4.1904761905e+00 reconConnectivity integer + 8.0000000000e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -2003,13 +2003,13 @@ Parameters for evaluation 61: 8.5714285714e+00 minSizePl integer 7.6285714286e+01 minSizeSeg integer 9.5714285714e+02 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 4.1904761905e+00 recon integer - 8.0000000000e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 4.1904761905e+00 reconConnectivity integer + 8.0000000000e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -2035,13 +2035,13 @@ Parameters for evaluation 62: 8.5714285714e+00 minSizePl integer 7.6285714286e+01 minSizeSeg integer 9.5714285714e+02 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 4.1904761905e+00 recon integer - 8.0000000000e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 4.1904761905e+00 reconConnectivity integer + 8.0000000000e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -2067,13 +2067,13 @@ Parameters for evaluation 63: 8.5714285714e+00 minSizePl integer 7.6285714286e+01 minSizeSeg integer 9.5714285714e+02 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 4.1904761905e+00 recon integer - 8.0000000000e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 4.1904761905e+00 reconConnectivity integer + 8.0000000000e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -2099,13 +2099,13 @@ Parameters for evaluation 64: 8.5714285714e+00 minSizePl integer 3.5428571429e+01 minSizeSeg integer 9.5714285714e+02 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 4.1904761905e+00 recon integer - 8.0000000000e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 4.1904761905e+00 reconConnectivity integer + 8.0000000000e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -2131,13 +2131,13 @@ Parameters for evaluation 65: 8.0000000000e+01 minSizePl integer 5.7714285714e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 4.3809523810e+00 recon integer - 5.7142857143e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -2163,13 +2163,13 @@ Parameters for evaluation 66: 8.0000000000e+01 minSizePl integer 5.7714285714e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 4.3809523810e+00 recon integer - 5.7142857143e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -2195,13 +2195,13 @@ Parameters for evaluation 67: 8.0000000000e+01 minSizePl integer 5.7714285714e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 6.4761904762e+00 recon integer - 5.7142857143e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -2227,13 +2227,13 @@ Parameters for evaluation 68: 8.0000000000e+01 minSizePl integer 5.7714285714e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 6.4761904762e+00 recon integer - 5.7142857143e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -2259,13 +2259,13 @@ Parameters for evaluation 69: 8.0000000000e+01 minSizePl integer 5.7714285714e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 6.4761904762e+00 recon integer - 5.7142857143e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -2291,13 +2291,13 @@ Parameters for evaluation 70: 8.0000000000e+01 minSizePl integer 5.7714285714e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 6.4761904762e+00 recon integer - 5.7142857143e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -2323,13 +2323,13 @@ Parameters for evaluation 71: 8.0000000000e+01 minSizePl integer 5.7714285714e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 6.4761904762e+00 recon integer - 5.7142857143e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -2355,13 +2355,13 @@ Parameters for evaluation 72: 8.0000000000e+01 minSizePl integer 5.7714285714e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 6.4761904762e+00 recon integer - 5.7142857143e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -2387,13 +2387,13 @@ Parameters for evaluation 73: 8.0000000000e+01 minSizePl integer 5.7714285714e+01 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 6.4761904762e+00 recon integer - 5.7142857143e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -2419,13 +2419,13 @@ Parameters for evaluation 74: 8.0000000000e+01 minSizePl integer 5.7714285714e+01 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 6.4761904762e+00 recon integer - 5.7142857143e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -2451,13 +2451,13 @@ Parameters for evaluation 75: 8.0000000000e+01 minSizePl integer 1.6857142857e+01 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 6.4761904762e+00 recon integer - 5.7142857143e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -2483,13 +2483,13 @@ Parameters for evaluation 76: 8.0000000000e+01 minSizePl integer 1.6857142857e+01 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 6.4761904762e+00 recon integer - 5.7142857143e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -2515,13 +2515,13 @@ Parameters for evaluation 77: 8.0000000000e+01 minSizePl integer 1.6857142857e+01 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 6.4761904762e+00 recon integer - 7.8095238095e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -2547,13 +2547,13 @@ Parameters for evaluation 78: 8.0000000000e+01 minSizePl integer 1.6857142857e+01 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 6.4761904762e+00 recon integer - 7.8095238095e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -2579,13 +2579,13 @@ Parameters for evaluation 79: 4.0714285714e+01 minSizePl integer 1.6857142857e+01 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 6.4761904762e+00 recon integer - 7.8095238095e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -2611,13 +2611,13 @@ Parameters for evaluation 80: 4.0714285714e+01 minSizePl integer 1.6857142857e+01 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 6.4761904762e+00 recon integer - 7.8095238095e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -2643,13 +2643,13 @@ Parameters for evaluation 81: 7.6428571429e+01 minSizePl integer 5.4000000000e+01 minSizeSeg integer 1.4142857143e+03 maxSizeSeg integer - 5.1428571429e+00 fillHoles integer - 7.2380952381e+00 recon integer - 4.0000000000e+00 water integer + 5.1428571429e+00 fillHolesConnectivity integer + 7.2380952381e+00 reconConnectivity integer + 4.0000000000e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -2675,13 +2675,13 @@ Parameters for evaluation 82: 7.6428571429e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.4142857143e+03 maxSizeSeg integer - 5.1428571429e+00 fillHoles integer - 7.2380952381e+00 recon integer - 4.0000000000e+00 water integer + 5.1428571429e+00 fillHolesConnectivity integer + 7.2380952381e+00 reconConnectivity integer + 4.0000000000e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -2707,13 +2707,13 @@ Parameters for evaluation 83: 7.6428571429e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.4142857143e+03 maxSizeSeg integer - 5.1428571429e+00 fillHoles integer - 7.2380952381e+00 recon integer - 4.0000000000e+00 water integer + 5.1428571429e+00 fillHolesConnectivity integer + 7.2380952381e+00 reconConnectivity integer + 4.0000000000e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -2739,13 +2739,13 @@ Parameters for evaluation 84: 7.6428571429e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.4142857143e+03 maxSizeSeg integer - 5.1428571429e+00 fillHoles integer - 7.2380952381e+00 recon integer - 6.0952380952e+00 water integer + 5.1428571429e+00 fillHolesConnectivity integer + 7.2380952381e+00 reconConnectivity integer + 6.0952380952e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -2771,13 +2771,13 @@ Parameters for evaluation 85: 3.7142857143e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.4142857143e+03 maxSizeSeg integer - 5.1428571429e+00 fillHoles integer - 7.2380952381e+00 recon integer - 6.0952380952e+00 water integer + 5.1428571429e+00 fillHolesConnectivity integer + 7.2380952381e+00 reconConnectivity integer + 6.0952380952e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -2803,13 +2803,13 @@ Parameters for evaluation 86: 3.7142857143e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.4142857143e+03 maxSizeSeg integer - 5.1428571429e+00 fillHoles integer - 7.2380952381e+00 recon integer - 6.0952380952e+00 water integer + 5.1428571429e+00 fillHolesConnectivity integer + 7.2380952381e+00 reconConnectivity integer + 6.0952380952e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -2835,13 +2835,13 @@ Parameters for evaluation 87: 3.7142857143e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.1000000000e+03 maxSizeSeg integer - 5.1428571429e+00 fillHoles integer - 7.2380952381e+00 recon integer - 6.0952380952e+00 water integer + 5.1428571429e+00 fillHolesConnectivity integer + 7.2380952381e+00 reconConnectivity integer + 6.0952380952e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -2867,13 +2867,13 @@ Parameters for evaluation 88: 3.7142857143e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.1000000000e+03 maxSizeSeg integer - 5.1428571429e+00 fillHoles integer - 7.2380952381e+00 recon integer - 6.0952380952e+00 water integer + 5.1428571429e+00 fillHolesConnectivity integer + 7.2380952381e+00 reconConnectivity integer + 6.0952380952e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -2899,13 +2899,13 @@ Parameters for evaluation 89: 3.7142857143e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.1000000000e+03 maxSizeSeg integer - 5.1428571429e+00 fillHoles integer - 7.2380952381e+00 recon integer - 6.0952380952e+00 water integer + 5.1428571429e+00 fillHolesConnectivity integer + 7.2380952381e+00 reconConnectivity integer + 6.0952380952e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -2931,13 +2931,13 @@ Parameters for evaluation 90: 3.7142857143e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.1000000000e+03 maxSizeSeg integer - 7.2380952381e+00 fillHoles integer - 7.2380952381e+00 recon integer - 6.0952380952e+00 water integer + 7.2380952381e+00 fillHolesConnectivity integer + 7.2380952381e+00 reconConnectivity integer + 6.0952380952e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -2963,13 +2963,13 @@ Parameters for evaluation 91: 3.7142857143e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.1000000000e+03 maxSizeSeg integer - 7.2380952381e+00 fillHoles integer - 5.1428571429e+00 recon integer - 6.0952380952e+00 water integer + 7.2380952381e+00 fillHolesConnectivity integer + 5.1428571429e+00 reconConnectivity integer + 6.0952380952e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -2995,13 +2995,13 @@ Parameters for evaluation 92: 3.7142857143e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.1000000000e+03 maxSizeSeg integer - 7.2380952381e+00 fillHoles integer - 5.1428571429e+00 recon integer - 6.0952380952e+00 water integer + 7.2380952381e+00 fillHolesConnectivity integer + 5.1428571429e+00 reconConnectivity integer + 6.0952380952e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -3027,13 +3027,13 @@ Parameters for evaluation 93: 3.7142857143e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.1000000000e+03 maxSizeSeg integer - 7.2380952381e+00 fillHoles integer - 5.1428571429e+00 recon integer - 6.0952380952e+00 water integer + 7.2380952381e+00 fillHolesConnectivity integer + 5.1428571429e+00 reconConnectivity integer + 6.0952380952e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -3059,13 +3059,13 @@ Parameters for evaluation 94: 3.7142857143e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.1000000000e+03 maxSizeSeg integer - 7.2380952381e+00 fillHoles integer - 5.1428571429e+00 recon integer - 6.0952380952e+00 water integer + 7.2380952381e+00 fillHolesConnectivity integer + 5.1428571429e+00 reconConnectivity integer + 6.0952380952e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -3091,13 +3091,13 @@ Parameters for evaluation 95: 3.7142857143e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.1000000000e+03 maxSizeSeg integer - 7.2380952381e+00 fillHoles integer - 5.1428571429e+00 recon integer - 6.0952380952e+00 water integer + 7.2380952381e+00 fillHolesConnectivity integer + 5.1428571429e+00 reconConnectivity integer + 6.0952380952e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -3123,13 +3123,13 @@ Parameters for evaluation 96: 3.7142857143e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.1000000000e+03 maxSizeSeg integer - 7.2380952381e+00 fillHoles integer - 5.1428571429e+00 recon integer - 6.0952380952e+00 water integer + 7.2380952381e+00 fillHolesConnectivity integer + 5.1428571429e+00 reconConnectivity integer + 6.0952380952e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -3155,13 +3155,13 @@ Parameters for evaluation 97: 6.5714285714e+01 minSizePl integer 3.9142857143e+01 minSizeSeg integer 1.1285714286e+03 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 4.0000000000e+00 recon integer - 5.3333333333e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 4.0000000000e+00 reconConnectivity integer + 5.3333333333e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -3187,13 +3187,13 @@ Parameters for evaluation 98: 6.5714285714e+01 minSizePl integer 3.9142857143e+01 minSizeSeg integer 1.1285714286e+03 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 4.0000000000e+00 recon integer - 5.3333333333e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 4.0000000000e+00 reconConnectivity integer + 5.3333333333e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -3219,13 +3219,13 @@ Parameters for evaluation 99: 6.5714285714e+01 minSizePl integer 3.9142857143e+01 minSizeSeg integer 1.1285714286e+03 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 4.0000000000e+00 recon integer - 5.3333333333e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 4.0000000000e+00 reconConnectivity integer + 5.3333333333e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -3251,13 +3251,13 @@ Parameters for evaluation 100: 6.5714285714e+01 minSizePl integer 3.9142857143e+01 minSizeSeg integer 1.1285714286e+03 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 4.0000000000e+00 recon integer - 5.3333333333e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 4.0000000000e+00 reconConnectivity integer + 5.3333333333e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -3283,13 +3283,13 @@ Parameters for evaluation 101: 6.5714285714e+01 minSizePl integer 3.9142857143e+01 minSizeSeg integer 1.1285714286e+03 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 4.0000000000e+00 recon integer - 5.3333333333e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 4.0000000000e+00 reconConnectivity integer + 5.3333333333e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -3315,13 +3315,13 @@ Parameters for evaluation 102: 6.5714285714e+01 minSizePl integer 3.9142857143e+01 minSizeSeg integer 1.1285714286e+03 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 4.0000000000e+00 recon integer - 5.3333333333e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 4.0000000000e+00 reconConnectivity integer + 5.3333333333e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -3347,13 +3347,13 @@ Parameters for evaluation 103: 6.5714285714e+01 minSizePl integer 8.0000000000e+01 minSizeSeg integer 1.1285714286e+03 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 4.0000000000e+00 recon integer - 5.3333333333e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 4.0000000000e+00 reconConnectivity integer + 5.3333333333e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -3379,13 +3379,13 @@ Parameters for evaluation 104: 6.5714285714e+01 minSizePl integer 8.0000000000e+01 minSizeSeg integer 1.1285714286e+03 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 4.0000000000e+00 recon integer - 5.3333333333e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 4.0000000000e+00 reconConnectivity integer + 5.3333333333e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -3411,13 +3411,13 @@ Parameters for evaluation 105: 2.6428571429e+01 minSizePl integer 8.0000000000e+01 minSizeSeg integer 1.1285714286e+03 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 4.0000000000e+00 recon integer - 5.3333333333e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 4.0000000000e+00 reconConnectivity integer + 5.3333333333e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -3443,13 +3443,13 @@ Parameters for evaluation 106: 2.6428571429e+01 minSizePl integer 8.0000000000e+01 minSizeSeg integer 1.1285714286e+03 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 4.0000000000e+00 recon integer - 5.3333333333e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 4.0000000000e+00 reconConnectivity integer + 5.3333333333e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -3475,13 +3475,13 @@ Parameters for evaluation 107: 2.6428571429e+01 minSizePl integer 8.0000000000e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 4.0000000000e+00 recon integer - 5.3333333333e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 4.0000000000e+00 reconConnectivity integer + 5.3333333333e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -3507,13 +3507,13 @@ Parameters for evaluation 108: 2.6428571429e+01 minSizePl integer 8.0000000000e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 4.0000000000e+00 recon integer - 7.4285714286e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 4.0000000000e+00 reconConnectivity integer + 7.4285714286e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -3539,13 +3539,13 @@ Parameters for evaluation 109: 2.6428571429e+01 minSizePl integer 8.0000000000e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 6.0952380952e+00 recon integer - 7.4285714286e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 6.0952380952e+00 reconConnectivity integer + 7.4285714286e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -3571,13 +3571,13 @@ Parameters for evaluation 110: 2.6428571429e+01 minSizePl integer 8.0000000000e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 6.0952380952e+00 recon integer - 7.4285714286e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 6.0952380952e+00 reconConnectivity integer + 7.4285714286e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -3603,13 +3603,13 @@ Parameters for evaluation 111: 2.6428571429e+01 minSizePl integer 8.0000000000e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 6.0952380952e+00 recon integer - 7.4285714286e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 6.0952380952e+00 reconConnectivity integer + 7.4285714286e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -3635,13 +3635,13 @@ Parameters for evaluation 112: 2.6428571429e+01 minSizePl integer 8.0000000000e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 6.0952380952e+00 recon integer - 7.4285714286e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 6.0952380952e+00 reconConnectivity integer + 7.4285714286e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -3667,13 +3667,13 @@ Parameters for evaluation 113: 1.9285714286e+01 minSizePl integer 4.6571428571e+01 minSizeSeg integer 1.4142857143e+03 maxSizeSeg integer - 7.6190476190e+00 fillHoles integer - 7.0476190476e+00 recon integer - 4.3809523810e+00 water integer + 7.6190476190e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 4.3809523810e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -3699,13 +3699,13 @@ Parameters for evaluation 114: 1.9285714286e+01 minSizePl integer 4.6571428571e+01 minSizeSeg integer 1.4142857143e+03 maxSizeSeg integer - 7.6190476190e+00 fillHoles integer - 7.0476190476e+00 recon integer - 4.3809523810e+00 water integer + 7.6190476190e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 4.3809523810e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -3731,13 +3731,13 @@ Parameters for evaluation 115: 1.9285714286e+01 minSizePl integer 5.7142857143e+00 minSizeSeg integer 1.4142857143e+03 maxSizeSeg integer - 7.6190476190e+00 fillHoles integer - 7.0476190476e+00 recon integer - 4.3809523810e+00 water integer + 7.6190476190e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 4.3809523810e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -3763,13 +3763,13 @@ Parameters for evaluation 116: 1.9285714286e+01 minSizePl integer 5.7142857143e+00 minSizeSeg integer 1.4142857143e+03 maxSizeSeg integer - 7.6190476190e+00 fillHoles integer - 7.0476190476e+00 recon integer - 4.3809523810e+00 water integer + 7.6190476190e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 4.3809523810e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -3795,13 +3795,13 @@ Parameters for evaluation 117: 1.9285714286e+01 minSizePl integer 5.7142857143e+00 minSizeSeg integer 1.4142857143e+03 maxSizeSeg integer - 5.5238095238e+00 fillHoles integer - 7.0476190476e+00 recon integer - 4.3809523810e+00 water integer + 5.5238095238e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 4.3809523810e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -3827,13 +3827,13 @@ Parameters for evaluation 118: 1.9285714286e+01 minSizePl integer 5.7142857143e+00 minSizeSeg integer 1.4142857143e+03 maxSizeSeg integer - 5.5238095238e+00 fillHoles integer - 7.0476190476e+00 recon integer - 4.3809523810e+00 water integer + 5.5238095238e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 4.3809523810e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -3859,13 +3859,13 @@ Parameters for evaluation 119: 1.9285714286e+01 minSizePl integer 5.7142857143e+00 minSizeSeg integer 1.4142857143e+03 maxSizeSeg integer - 5.5238095238e+00 fillHoles integer - 7.0476190476e+00 recon integer - 4.3809523810e+00 water integer + 5.5238095238e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 4.3809523810e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -3891,13 +3891,13 @@ Parameters for evaluation 120: 1.9285714286e+01 minSizePl integer 5.7142857143e+00 minSizeSeg integer 1.1000000000e+03 maxSizeSeg integer - 5.5238095238e+00 fillHoles integer - 7.0476190476e+00 recon integer - 4.3809523810e+00 water integer + 5.5238095238e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 4.3809523810e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -3923,13 +3923,13 @@ Parameters for evaluation 121: 1.9285714286e+01 minSizePl integer 5.7142857143e+00 minSizeSeg integer 1.1000000000e+03 maxSizeSeg integer - 5.5238095238e+00 fillHoles integer - 7.0476190476e+00 recon integer - 6.4761904762e+00 water integer + 5.5238095238e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 6.4761904762e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -3955,13 +3955,13 @@ Parameters for evaluation 122: 1.9285714286e+01 minSizePl integer 5.7142857143e+00 minSizeSeg integer 1.1000000000e+03 maxSizeSeg integer - 5.5238095238e+00 fillHoles integer - 7.0476190476e+00 recon integer - 6.4761904762e+00 water integer + 5.5238095238e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 6.4761904762e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -3987,13 +3987,13 @@ Parameters for evaluation 123: 1.9285714286e+01 minSizePl integer 5.7142857143e+00 minSizeSeg integer 1.1000000000e+03 maxSizeSeg integer - 5.5238095238e+00 fillHoles integer - 7.0476190476e+00 recon integer - 6.4761904762e+00 water integer + 5.5238095238e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 6.4761904762e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -4019,13 +4019,13 @@ Parameters for evaluation 124: 1.9285714286e+01 minSizePl integer 5.7142857143e+00 minSizeSeg integer 1.1000000000e+03 maxSizeSeg integer - 5.5238095238e+00 fillHoles integer - 7.0476190476e+00 recon integer - 6.4761904762e+00 water integer + 5.5238095238e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 6.4761904762e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -4051,13 +4051,13 @@ Parameters for evaluation 125: 1.9285714286e+01 minSizePl integer 5.7142857143e+00 minSizeSeg integer 1.1000000000e+03 maxSizeSeg integer - 5.5238095238e+00 fillHoles integer - 4.9523809524e+00 recon integer - 6.4761904762e+00 water integer + 5.5238095238e+00 fillHolesConnectivity integer + 4.9523809524e+00 reconConnectivity integer + 6.4761904762e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -4083,13 +4083,13 @@ Parameters for evaluation 126: 1.9285714286e+01 minSizePl integer 5.7142857143e+00 minSizeSeg integer 1.1000000000e+03 maxSizeSeg integer - 5.5238095238e+00 fillHoles integer - 4.9523809524e+00 recon integer - 6.4761904762e+00 water integer + 5.5238095238e+00 fillHolesConnectivity integer + 4.9523809524e+00 reconConnectivity integer + 6.4761904762e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -4115,13 +4115,13 @@ Parameters for evaluation 127: 1.9285714286e+01 minSizePl integer 5.7142857143e+00 minSizeSeg integer 1.1000000000e+03 maxSizeSeg integer - 5.5238095238e+00 fillHoles integer - 4.9523809524e+00 recon integer - 6.4761904762e+00 water integer + 5.5238095238e+00 fillHolesConnectivity integer + 4.9523809524e+00 reconConnectivity integer + 6.4761904762e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -4147,13 +4147,13 @@ Parameters for evaluation 128: 5.8571428571e+01 minSizePl integer 5.7142857143e+00 minSizeSeg integer 1.1000000000e+03 maxSizeSeg integer - 5.5238095238e+00 fillHoles integer - 4.9523809524e+00 recon integer - 6.4761904762e+00 water integer + 5.5238095238e+00 fillHolesConnectivity integer + 4.9523809524e+00 reconConnectivity integer + 6.4761904762e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -4179,13 +4179,13 @@ Parameters for evaluation 129: 8.0000000000e+01 minSizePl integer 6.1428571429e+01 minSizeSeg integer 1.3857142857e+03 maxSizeSeg integer - 6.6666666667e+00 fillHoles integer - 4.9523809524e+00 recon integer - 6.8571428571e+00 water integer + 6.6666666667e+00 fillHolesConnectivity integer + 4.9523809524e+00 reconConnectivity integer + 6.8571428571e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -4211,13 +4211,13 @@ Parameters for evaluation 130: 8.0000000000e+01 minSizePl integer 6.1428571429e+01 minSizeSeg integer 1.3857142857e+03 maxSizeSeg integer - 6.6666666667e+00 fillHoles integer - 4.9523809524e+00 recon integer - 6.8571428571e+00 water integer + 6.6666666667e+00 fillHolesConnectivity integer + 4.9523809524e+00 reconConnectivity integer + 6.8571428571e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -4243,13 +4243,13 @@ Parameters for evaluation 131: 8.0000000000e+01 minSizePl integer 6.1428571429e+01 minSizeSeg integer 1.3857142857e+03 maxSizeSeg integer - 6.6666666667e+00 fillHoles integer - 4.9523809524e+00 recon integer - 6.8571428571e+00 water integer + 6.6666666667e+00 fillHolesConnectivity integer + 4.9523809524e+00 reconConnectivity integer + 6.8571428571e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -4275,13 +4275,13 @@ Parameters for evaluation 132: 8.0000000000e+01 minSizePl integer 6.1428571429e+01 minSizeSeg integer 1.3857142857e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 4.9523809524e+00 recon integer - 6.8571428571e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 4.9523809524e+00 reconConnectivity integer + 6.8571428571e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -4307,13 +4307,13 @@ Parameters for evaluation 133: 8.0000000000e+01 minSizePl integer 6.1428571429e+01 minSizeSeg integer 1.3857142857e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 4.9523809524e+00 recon integer - 6.8571428571e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 4.9523809524e+00 reconConnectivity integer + 6.8571428571e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -4339,13 +4339,13 @@ Parameters for evaluation 134: 8.0000000000e+01 minSizePl integer 6.1428571429e+01 minSizeSeg integer 1.3857142857e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 4.9523809524e+00 recon integer - 6.8571428571e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 4.9523809524e+00 reconConnectivity integer + 6.8571428571e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -4371,13 +4371,13 @@ Parameters for evaluation 135: 8.0000000000e+01 minSizePl integer 6.1428571429e+01 minSizeSeg integer 1.0714285714e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 4.9523809524e+00 recon integer - 6.8571428571e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 4.9523809524e+00 reconConnectivity integer + 6.8571428571e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -4403,13 +4403,13 @@ Parameters for evaluation 136: 8.0000000000e+01 minSizePl integer 6.1428571429e+01 minSizeSeg integer 1.0714285714e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 4.9523809524e+00 recon integer - 6.8571428571e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 4.9523809524e+00 reconConnectivity integer + 6.8571428571e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -4435,13 +4435,13 @@ Parameters for evaluation 137: 8.0000000000e+01 minSizePl integer 6.1428571429e+01 minSizeSeg integer 1.0714285714e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 4.9523809524e+00 recon integer - 6.8571428571e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 4.9523809524e+00 reconConnectivity integer + 6.8571428571e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -4467,13 +4467,13 @@ Parameters for evaluation 138: 4.0714285714e+01 minSizePl integer 6.1428571429e+01 minSizeSeg integer 1.0714285714e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 4.9523809524e+00 recon integer - 6.8571428571e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 4.9523809524e+00 reconConnectivity integer + 6.8571428571e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -4499,13 +4499,13 @@ Parameters for evaluation 139: 4.0714285714e+01 minSizePl integer 6.1428571429e+01 minSizeSeg integer 1.0714285714e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 7.0476190476e+00 recon integer - 6.8571428571e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 6.8571428571e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -4531,13 +4531,13 @@ Parameters for evaluation 140: 4.0714285714e+01 minSizePl integer 6.1428571429e+01 minSizeSeg integer 1.0714285714e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 7.0476190476e+00 recon integer - 6.8571428571e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 6.8571428571e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -4563,13 +4563,13 @@ Parameters for evaluation 141: 4.0714285714e+01 minSizePl integer 2.0571428571e+01 minSizeSeg integer 1.0714285714e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 7.0476190476e+00 recon integer - 6.8571428571e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 6.8571428571e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -4595,13 +4595,13 @@ Parameters for evaluation 142: 4.0714285714e+01 minSizePl integer 2.0571428571e+01 minSizeSeg integer 1.0714285714e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 7.0476190476e+00 recon integer - 6.8571428571e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 6.8571428571e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -4627,13 +4627,13 @@ Parameters for evaluation 143: 4.0714285714e+01 minSizePl integer 2.0571428571e+01 minSizeSeg integer 1.0714285714e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 7.0476190476e+00 recon integer - 6.8571428571e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 6.8571428571e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -4659,13 +4659,13 @@ Parameters for evaluation 144: 4.0714285714e+01 minSizePl integer 2.0571428571e+01 minSizeSeg integer 1.0714285714e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 7.0476190476e+00 recon integer - 4.7619047619e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 4.7619047619e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -4691,13 +4691,13 @@ Parameters for evaluation 145: 4.4285714286e+01 minSizePl integer 3.5428571429e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 7.0476190476e+00 recon integer - 6.6666666667e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 6.6666666667e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -4723,13 +4723,13 @@ Parameters for evaluation 146: 4.4285714286e+01 minSizePl integer 3.5428571429e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 7.0476190476e+00 recon integer - 6.6666666667e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 6.6666666667e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -4755,13 +4755,13 @@ Parameters for evaluation 147: 4.4285714286e+01 minSizePl integer 3.5428571429e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 7.0476190476e+00 recon integer - 6.6666666667e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 6.6666666667e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -4787,13 +4787,13 @@ Parameters for evaluation 148: 5.0000000000e+00 minSizePl integer 3.5428571429e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 7.0476190476e+00 recon integer - 6.6666666667e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 6.6666666667e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -4819,13 +4819,13 @@ Parameters for evaluation 149: 5.0000000000e+00 minSizePl integer 3.5428571429e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 7.0476190476e+00 recon integer - 6.6666666667e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 6.6666666667e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -4851,13 +4851,13 @@ Parameters for evaluation 150: 5.0000000000e+00 minSizePl integer 3.5428571429e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 7.0476190476e+00 recon integer - 6.6666666667e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 6.6666666667e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -4883,13 +4883,13 @@ Parameters for evaluation 151: 5.0000000000e+00 minSizePl integer 3.5428571429e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 7.0476190476e+00 recon integer - 6.6666666667e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 6.6666666667e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -4915,13 +4915,13 @@ Parameters for evaluation 152: 5.0000000000e+00 minSizePl integer 3.5428571429e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 7.0476190476e+00 recon integer - 6.6666666667e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 6.6666666667e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -4947,13 +4947,13 @@ Parameters for evaluation 153: 5.0000000000e+00 minSizePl integer 3.5428571429e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 7.0476190476e+00 recon integer - 6.6666666667e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 6.6666666667e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -4979,13 +4979,13 @@ Parameters for evaluation 154: 5.0000000000e+00 minSizePl integer 3.5428571429e+01 minSizeSeg integer 1.1285714286e+03 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 7.0476190476e+00 recon integer - 6.6666666667e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 6.6666666667e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -5011,13 +5011,13 @@ Parameters for evaluation 155: 5.0000000000e+00 minSizePl integer 3.5428571429e+01 minSizeSeg integer 1.1285714286e+03 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 7.0476190476e+00 recon integer - 6.6666666667e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 6.6666666667e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -5043,13 +5043,13 @@ Parameters for evaluation 156: 5.0000000000e+00 minSizePl integer 3.5428571429e+01 minSizeSeg integer 1.1285714286e+03 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 7.0476190476e+00 recon integer - 6.6666666667e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 6.6666666667e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -5075,13 +5075,13 @@ Parameters for evaluation 157: 5.0000000000e+00 minSizePl integer 7.6285714286e+01 minSizeSeg integer 1.1285714286e+03 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 7.0476190476e+00 recon integer - 6.6666666667e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 6.6666666667e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -5107,13 +5107,13 @@ Parameters for evaluation 158: 5.0000000000e+00 minSizePl integer 7.6285714286e+01 minSizeSeg integer 1.1285714286e+03 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 7.0476190476e+00 recon integer - 6.6666666667e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 6.6666666667e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -5139,13 +5139,13 @@ Parameters for evaluation 159: 5.0000000000e+00 minSizePl integer 7.6285714286e+01 minSizeSeg integer 1.1285714286e+03 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 7.0476190476e+00 recon integer - 4.5714285714e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 4.5714285714e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -5171,13 +5171,13 @@ Parameters for evaluation 160: 5.0000000000e+00 minSizePl integer 7.6285714286e+01 minSizeSeg integer 1.1285714286e+03 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 4.9523809524e+00 recon integer - 4.5714285714e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 4.9523809524e+00 reconConnectivity integer + 4.5714285714e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -5203,13 +5203,13 @@ Parameters for evaluation 161: 7.2857142857e+01 minSizePl integer 2.0000000000e+00 minSizeSeg integer 1.5000000000e+03 maxSizeSeg integer - 4.9523809524e+00 fillHoles integer - 4.9523809524e+00 recon integer - 4.1904761905e+00 water integer + 4.9523809524e+00 fillHolesConnectivity integer + 4.9523809524e+00 reconConnectivity integer + 4.1904761905e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -5235,13 +5235,13 @@ Parameters for evaluation 162: 7.2857142857e+01 minSizePl integer 2.0000000000e+00 minSizeSeg integer 1.5000000000e+03 maxSizeSeg integer - 4.9523809524e+00 fillHoles integer - 4.9523809524e+00 recon integer - 4.1904761905e+00 water integer + 4.9523809524e+00 fillHolesConnectivity integer + 4.9523809524e+00 reconConnectivity integer + 4.1904761905e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -5267,13 +5267,13 @@ Parameters for evaluation 163: 7.2857142857e+01 minSizePl integer 2.0000000000e+00 minSizeSeg integer 1.5000000000e+03 maxSizeSeg integer - 4.9523809524e+00 fillHoles integer - 4.9523809524e+00 recon integer - 6.2857142857e+00 water integer + 4.9523809524e+00 fillHolesConnectivity integer + 4.9523809524e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -5299,13 +5299,13 @@ Parameters for evaluation 164: 7.2857142857e+01 minSizePl integer 2.0000000000e+00 minSizeSeg integer 1.5000000000e+03 maxSizeSeg integer - 4.9523809524e+00 fillHoles integer - 4.9523809524e+00 recon integer - 6.2857142857e+00 water integer + 4.9523809524e+00 fillHolesConnectivity integer + 4.9523809524e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -5331,13 +5331,13 @@ Parameters for evaluation 165: 7.2857142857e+01 minSizePl integer 2.0000000000e+00 minSizeSeg integer 1.1857142857e+03 maxSizeSeg integer - 4.9523809524e+00 fillHoles integer - 4.9523809524e+00 recon integer - 6.2857142857e+00 water integer + 4.9523809524e+00 fillHolesConnectivity integer + 4.9523809524e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -5363,13 +5363,13 @@ Parameters for evaluation 166: 7.2857142857e+01 minSizePl integer 2.0000000000e+00 minSizeSeg integer 1.1857142857e+03 maxSizeSeg integer - 4.9523809524e+00 fillHoles integer - 4.9523809524e+00 recon integer - 6.2857142857e+00 water integer + 4.9523809524e+00 fillHolesConnectivity integer + 4.9523809524e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -5395,13 +5395,13 @@ Parameters for evaluation 167: 7.2857142857e+01 minSizePl integer 2.0000000000e+00 minSizeSeg integer 1.1857142857e+03 maxSizeSeg integer - 4.9523809524e+00 fillHoles integer - 4.9523809524e+00 recon integer - 6.2857142857e+00 water integer + 4.9523809524e+00 fillHolesConnectivity integer + 4.9523809524e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -5427,13 +5427,13 @@ Parameters for evaluation 168: 7.2857142857e+01 minSizePl integer 2.0000000000e+00 minSizeSeg integer 1.1857142857e+03 maxSizeSeg integer - 7.0476190476e+00 fillHoles integer - 4.9523809524e+00 recon integer - 6.2857142857e+00 water integer + 7.0476190476e+00 fillHolesConnectivity integer + 4.9523809524e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -5459,13 +5459,13 @@ Parameters for evaluation 169: 7.2857142857e+01 minSizePl integer 2.0000000000e+00 minSizeSeg integer 1.1857142857e+03 maxSizeSeg integer - 7.0476190476e+00 fillHoles integer - 4.9523809524e+00 recon integer - 6.2857142857e+00 water integer + 7.0476190476e+00 fillHolesConnectivity integer + 4.9523809524e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -5491,13 +5491,13 @@ Parameters for evaluation 170: 7.2857142857e+01 minSizePl integer 2.0000000000e+00 minSizeSeg integer 1.1857142857e+03 maxSizeSeg integer - 7.0476190476e+00 fillHoles integer - 4.9523809524e+00 recon integer - 6.2857142857e+00 water integer + 7.0476190476e+00 fillHolesConnectivity integer + 4.9523809524e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -5523,13 +5523,13 @@ Parameters for evaluation 171: 3.3571428571e+01 minSizePl integer 2.0000000000e+00 minSizeSeg integer 1.1857142857e+03 maxSizeSeg integer - 7.0476190476e+00 fillHoles integer - 4.9523809524e+00 recon integer - 6.2857142857e+00 water integer + 7.0476190476e+00 fillHolesConnectivity integer + 4.9523809524e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -5555,13 +5555,13 @@ Parameters for evaluation 172: 3.3571428571e+01 minSizePl integer 2.0000000000e+00 minSizeSeg integer 1.1857142857e+03 maxSizeSeg integer - 7.0476190476e+00 fillHoles integer - 4.9523809524e+00 recon integer - 6.2857142857e+00 water integer + 7.0476190476e+00 fillHolesConnectivity integer + 4.9523809524e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -5587,13 +5587,13 @@ Parameters for evaluation 173: 3.3571428571e+01 minSizePl integer 2.0000000000e+00 minSizeSeg integer 1.1857142857e+03 maxSizeSeg integer - 7.0476190476e+00 fillHoles integer - 4.9523809524e+00 recon integer - 6.2857142857e+00 water integer + 7.0476190476e+00 fillHolesConnectivity integer + 4.9523809524e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -5619,13 +5619,13 @@ Parameters for evaluation 174: 3.3571428571e+01 minSizePl integer 2.0000000000e+00 minSizeSeg integer 1.1857142857e+03 maxSizeSeg integer - 7.0476190476e+00 fillHoles integer - 7.0476190476e+00 recon integer - 6.2857142857e+00 water integer + 7.0476190476e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -5651,13 +5651,13 @@ Parameters for evaluation 175: 3.3571428571e+01 minSizePl integer 2.0000000000e+00 minSizeSeg integer 1.1857142857e+03 maxSizeSeg integer - 7.0476190476e+00 fillHoles integer - 7.0476190476e+00 recon integer - 6.2857142857e+00 water integer + 7.0476190476e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -5683,13 +5683,13 @@ Parameters for evaluation 176: 3.3571428571e+01 minSizePl integer 4.2857142857e+01 minSizeSeg integer 1.1857142857e+03 maxSizeSeg integer - 7.0476190476e+00 fillHoles integer - 7.0476190476e+00 recon integer - 6.2857142857e+00 water integer + 7.0476190476e+00 fillHolesConnectivity integer + 7.0476190476e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -5715,13 +5715,13 @@ Parameters for evaluation 177: 5.0000000000e+00 minSizePl integer 8.0000000000e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 7.8095238095e+00 recon integer - 4.5714285714e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 7.8095238095e+00 reconConnectivity integer + 4.5714285714e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -5747,13 +5747,13 @@ Parameters for evaluation 178: 5.0000000000e+00 minSizePl integer 8.0000000000e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 7.8095238095e+00 recon integer - 4.5714285714e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 7.8095238095e+00 reconConnectivity integer + 4.5714285714e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -5779,13 +5779,13 @@ Parameters for evaluation 179: 5.0000000000e+00 minSizePl integer 8.0000000000e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 7.8095238095e+00 recon integer - 4.5714285714e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 7.8095238095e+00 reconConnectivity integer + 4.5714285714e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -5811,13 +5811,13 @@ Parameters for evaluation 180: 5.0000000000e+00 minSizePl integer 8.0000000000e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 7.8095238095e+00 recon integer - 4.5714285714e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 7.8095238095e+00 reconConnectivity integer + 4.5714285714e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -5843,13 +5843,13 @@ Parameters for evaluation 181: 5.0000000000e+00 minSizePl integer 8.0000000000e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 7.8095238095e+00 recon integer - 4.5714285714e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 7.8095238095e+00 reconConnectivity integer + 4.5714285714e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -5875,13 +5875,13 @@ Parameters for evaluation 182: 5.0000000000e+00 minSizePl integer 8.0000000000e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 7.8095238095e+00 recon integer - 4.5714285714e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 7.8095238095e+00 reconConnectivity integer + 4.5714285714e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -5907,13 +5907,13 @@ Parameters for evaluation 183: 5.0000000000e+00 minSizePl integer 8.0000000000e+01 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 7.8095238095e+00 recon integer - 4.5714285714e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 7.8095238095e+00 reconConnectivity integer + 4.5714285714e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -5939,13 +5939,13 @@ Parameters for evaluation 184: 5.0000000000e+00 minSizePl integer 8.0000000000e+01 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 7.8095238095e+00 recon integer - 4.5714285714e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 7.8095238095e+00 reconConnectivity integer + 4.5714285714e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -5971,13 +5971,13 @@ Parameters for evaluation 185: 5.0000000000e+00 minSizePl integer 8.0000000000e+01 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 5.7142857143e+00 recon integer - 4.5714285714e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 5.7142857143e+00 reconConnectivity integer + 4.5714285714e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -6003,13 +6003,13 @@ Parameters for evaluation 186: 5.0000000000e+00 minSizePl integer 8.0000000000e+01 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 5.7142857143e+00 recon integer - 4.5714285714e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 5.7142857143e+00 reconConnectivity integer + 4.5714285714e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -6035,13 +6035,13 @@ Parameters for evaluation 187: 5.0000000000e+00 minSizePl integer 8.0000000000e+01 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 5.7142857143e+00 recon integer - 4.5714285714e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 5.7142857143e+00 reconConnectivity integer + 4.5714285714e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -6067,13 +6067,13 @@ Parameters for evaluation 188: 5.0000000000e+00 minSizePl integer 8.0000000000e+01 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 5.7142857143e+00 recon integer - 4.5714285714e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 5.7142857143e+00 reconConnectivity integer + 4.5714285714e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -6099,13 +6099,13 @@ Parameters for evaluation 189: 5.0000000000e+00 minSizePl integer 3.9142857143e+01 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 5.7142857143e+00 recon integer - 4.5714285714e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 5.7142857143e+00 reconConnectivity integer + 4.5714285714e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -6131,13 +6131,13 @@ Parameters for evaluation 190: 4.4285714286e+01 minSizePl integer 3.9142857143e+01 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 5.7142857143e+00 recon integer - 4.5714285714e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 5.7142857143e+00 reconConnectivity integer + 4.5714285714e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -6163,13 +6163,13 @@ Parameters for evaluation 191: 4.4285714286e+01 minSizePl integer 3.9142857143e+01 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 5.7142857143e+00 recon integer - 6.6666666667e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 5.7142857143e+00 reconConnectivity integer + 6.6666666667e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -6195,13 +6195,13 @@ Parameters for evaluation 192: 4.4285714286e+01 minSizePl integer 3.9142857143e+01 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 5.7142857143e+00 recon integer - 6.6666666667e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 5.7142857143e+00 reconConnectivity integer + 6.6666666667e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -6227,13 +6227,13 @@ Parameters for evaluation 193: 8.0000000000e+01 minSizePl integer 2.0000000000e+00 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 6.6666666667e+00 fillHoles integer - 4.0000000000e+00 recon integer - 5.7142857143e+00 water integer + 6.6666666667e+00 fillHolesConnectivity integer + 4.0000000000e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -6259,13 +6259,13 @@ Parameters for evaluation 194: 8.0000000000e+01 minSizePl integer 2.0000000000e+00 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 6.6666666667e+00 fillHoles integer - 4.0000000000e+00 recon integer - 7.8095238095e+00 water integer + 6.6666666667e+00 fillHolesConnectivity integer + 4.0000000000e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -6291,13 +6291,13 @@ Parameters for evaluation 195: 8.0000000000e+01 minSizePl integer 2.0000000000e+00 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 6.6666666667e+00 fillHoles integer - 4.0000000000e+00 recon integer - 7.8095238095e+00 water integer + 6.6666666667e+00 fillHolesConnectivity integer + 4.0000000000e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -6323,13 +6323,13 @@ Parameters for evaluation 196: 8.0000000000e+01 minSizePl integer 2.0000000000e+00 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 6.6666666667e+00 fillHoles integer - 4.0000000000e+00 recon integer - 7.8095238095e+00 water integer + 6.6666666667e+00 fillHolesConnectivity integer + 4.0000000000e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -6355,13 +6355,13 @@ Parameters for evaluation 197: 8.0000000000e+01 minSizePl integer 2.0000000000e+00 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 6.6666666667e+00 fillHoles integer - 4.0000000000e+00 recon integer - 7.8095238095e+00 water integer + 6.6666666667e+00 fillHolesConnectivity integer + 4.0000000000e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -6387,13 +6387,13 @@ Parameters for evaluation 198: 8.0000000000e+01 minSizePl integer 2.0000000000e+00 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 6.6666666667e+00 fillHoles integer - 4.0000000000e+00 recon integer - 7.8095238095e+00 water integer + 6.6666666667e+00 fillHolesConnectivity integer + 4.0000000000e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -6419,13 +6419,13 @@ Parameters for evaluation 199: 8.0000000000e+01 minSizePl integer 2.0000000000e+00 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 6.6666666667e+00 fillHoles integer - 4.0000000000e+00 recon integer - 7.8095238095e+00 water integer + 6.6666666667e+00 fillHolesConnectivity integer + 4.0000000000e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -6451,13 +6451,13 @@ Parameters for evaluation 200: 8.0000000000e+01 minSizePl integer 2.0000000000e+00 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 4.0000000000e+00 recon integer - 7.8095238095e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 4.0000000000e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -6483,13 +6483,13 @@ Parameters for evaluation 201: 8.0000000000e+01 minSizePl integer 2.0000000000e+00 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 4.0000000000e+00 recon integer - 7.8095238095e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 4.0000000000e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -6515,13 +6515,13 @@ Parameters for evaluation 202: 8.0000000000e+01 minSizePl integer 2.0000000000e+00 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 4.0000000000e+00 recon integer - 7.8095238095e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 4.0000000000e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -6547,13 +6547,13 @@ Parameters for evaluation 203: 8.0000000000e+01 minSizePl integer 2.0000000000e+00 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 4.0000000000e+00 recon integer - 7.8095238095e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 4.0000000000e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -6579,13 +6579,13 @@ Parameters for evaluation 204: 8.0000000000e+01 minSizePl integer 4.2857142857e+01 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 4.0000000000e+00 recon integer - 7.8095238095e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 4.0000000000e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -6611,13 +6611,13 @@ Parameters for evaluation 205: 8.0000000000e+01 minSizePl integer 4.2857142857e+01 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 4.0000000000e+00 recon integer - 7.8095238095e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 4.0000000000e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -6643,13 +6643,13 @@ Parameters for evaluation 206: 8.0000000000e+01 minSizePl integer 4.2857142857e+01 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 6.0952380952e+00 recon integer - 7.8095238095e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 6.0952380952e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -6675,13 +6675,13 @@ Parameters for evaluation 207: 4.0714285714e+01 minSizePl integer 4.2857142857e+01 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 6.0952380952e+00 recon integer - 7.8095238095e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 6.0952380952e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -6707,13 +6707,13 @@ Parameters for evaluation 208: 4.0714285714e+01 minSizePl integer 4.2857142857e+01 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 6.0952380952e+00 recon integer - 7.8095238095e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 6.0952380952e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -6739,13 +6739,13 @@ Parameters for evaluation 209: 4.4285714286e+01 minSizePl integer 2.8000000000e+01 minSizeSeg integer 1.1285714286e+03 maxSizeSeg integer - 6.2857142857e+00 fillHoles integer - 6.4761904762e+00 recon integer - 4.3809523810e+00 water integer + 6.2857142857e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 4.3809523810e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -6771,13 +6771,13 @@ Parameters for evaluation 210: 4.4285714286e+01 minSizePl integer 2.8000000000e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 6.2857142857e+00 fillHoles integer - 6.4761904762e+00 recon integer - 4.3809523810e+00 water integer + 6.2857142857e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 4.3809523810e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -6803,13 +6803,13 @@ Parameters for evaluation 211: 5.0000000000e+00 minSizePl integer 2.8000000000e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 6.2857142857e+00 fillHoles integer - 6.4761904762e+00 recon integer - 4.3809523810e+00 water integer + 6.2857142857e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 4.3809523810e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -6835,13 +6835,13 @@ Parameters for evaluation 212: 5.0000000000e+00 minSizePl integer 2.8000000000e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 4.1904761905e+00 fillHoles integer - 6.4761904762e+00 recon integer - 4.3809523810e+00 water integer + 4.1904761905e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 4.3809523810e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -6867,13 +6867,13 @@ Parameters for evaluation 213: 5.0000000000e+00 minSizePl integer 2.8000000000e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 4.1904761905e+00 fillHoles integer - 6.4761904762e+00 recon integer - 4.3809523810e+00 water integer + 4.1904761905e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 4.3809523810e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -6899,13 +6899,13 @@ Parameters for evaluation 214: 5.0000000000e+00 minSizePl integer 2.8000000000e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 4.1904761905e+00 fillHoles integer - 6.4761904762e+00 recon integer - 4.3809523810e+00 water integer + 4.1904761905e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 4.3809523810e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -6931,13 +6931,13 @@ Parameters for evaluation 215: 5.0000000000e+00 minSizePl integer 2.8000000000e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 4.1904761905e+00 fillHoles integer - 6.4761904762e+00 recon integer - 4.3809523810e+00 water integer + 4.1904761905e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 4.3809523810e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -6963,13 +6963,13 @@ Parameters for evaluation 216: 5.0000000000e+00 minSizePl integer 6.8857142857e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 4.1904761905e+00 fillHoles integer - 6.4761904762e+00 recon integer - 4.3809523810e+00 water integer + 4.1904761905e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 4.3809523810e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -6995,13 +6995,13 @@ Parameters for evaluation 217: 5.0000000000e+00 minSizePl integer 6.8857142857e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 4.1904761905e+00 fillHoles integer - 6.4761904762e+00 recon integer - 4.3809523810e+00 water integer + 4.1904761905e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 4.3809523810e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -7027,13 +7027,13 @@ Parameters for evaluation 218: 5.0000000000e+00 minSizePl integer 6.8857142857e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 4.1904761905e+00 fillHoles integer - 6.4761904762e+00 recon integer - 4.3809523810e+00 water integer + 4.1904761905e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 4.3809523810e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -7059,13 +7059,13 @@ Parameters for evaluation 219: 5.0000000000e+00 minSizePl integer 6.8857142857e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 4.1904761905e+00 fillHoles integer - 6.4761904762e+00 recon integer - 4.3809523810e+00 water integer + 4.1904761905e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 4.3809523810e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -7091,13 +7091,13 @@ Parameters for evaluation 220: 5.0000000000e+00 minSizePl integer 6.8857142857e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 4.1904761905e+00 fillHoles integer - 6.4761904762e+00 recon integer - 4.3809523810e+00 water integer + 4.1904761905e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 4.3809523810e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -7123,13 +7123,13 @@ Parameters for evaluation 221: 5.0000000000e+00 minSizePl integer 6.8857142857e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 4.1904761905e+00 fillHoles integer - 6.4761904762e+00 recon integer - 6.4761904762e+00 water integer + 4.1904761905e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 6.4761904762e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -7155,13 +7155,13 @@ Parameters for evaluation 222: 5.0000000000e+00 minSizePl integer 6.8857142857e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 4.1904761905e+00 fillHoles integer - 4.3809523810e+00 recon integer - 6.4761904762e+00 water integer + 4.1904761905e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 6.4761904762e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -7187,13 +7187,13 @@ Parameters for evaluation 223: 5.0000000000e+00 minSizePl integer 6.8857142857e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 4.1904761905e+00 fillHoles integer - 4.3809523810e+00 recon integer - 6.4761904762e+00 water integer + 4.1904761905e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 6.4761904762e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -7219,13 +7219,13 @@ Parameters for evaluation 224: 5.0000000000e+00 minSizePl integer 6.8857142857e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 4.1904761905e+00 fillHoles integer - 4.3809523810e+00 recon integer - 6.4761904762e+00 water integer + 4.1904761905e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 6.4761904762e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -7251,13 +7251,13 @@ Parameters for evaluation 225: 7.6428571429e+01 minSizePl integer 7.2571428571e+01 minSizeSeg integer 1.2428571429e+03 maxSizeSeg integer - 4.0000000000e+00 fillHoles integer - 4.1904761905e+00 recon integer - 5.7142857143e+00 water integer + 4.0000000000e+00 fillHolesConnectivity integer + 4.1904761905e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -7283,13 +7283,13 @@ Parameters for evaluation 226: 7.6428571429e+01 minSizePl integer 7.2571428571e+01 minSizeSeg integer 1.2428571429e+03 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 4.1904761905e+00 recon integer - 5.7142857143e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 4.1904761905e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -7315,13 +7315,13 @@ Parameters for evaluation 227: 7.6428571429e+01 minSizePl integer 7.2571428571e+01 minSizeSeg integer 9.2857142857e+02 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 4.1904761905e+00 recon integer - 5.7142857143e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 4.1904761905e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -7347,13 +7347,13 @@ Parameters for evaluation 228: 7.6428571429e+01 minSizePl integer 7.2571428571e+01 minSizeSeg integer 9.2857142857e+02 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 4.1904761905e+00 recon integer - 5.7142857143e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 4.1904761905e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -7379,13 +7379,13 @@ Parameters for evaluation 229: 7.6428571429e+01 minSizePl integer 3.1714285714e+01 minSizeSeg integer 9.2857142857e+02 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 4.1904761905e+00 recon integer - 5.7142857143e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 4.1904761905e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -7411,13 +7411,13 @@ Parameters for evaluation 230: 7.6428571429e+01 minSizePl integer 3.1714285714e+01 minSizeSeg integer 9.2857142857e+02 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 4.1904761905e+00 recon integer - 7.8095238095e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 4.1904761905e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -7443,13 +7443,13 @@ Parameters for evaluation 231: 7.6428571429e+01 minSizePl integer 3.1714285714e+01 minSizeSeg integer 9.2857142857e+02 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 4.1904761905e+00 recon integer - 7.8095238095e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 4.1904761905e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -7475,13 +7475,13 @@ Parameters for evaluation 232: 7.6428571429e+01 minSizePl integer 3.1714285714e+01 minSizeSeg integer 9.2857142857e+02 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 6.2857142857e+00 recon integer - 7.8095238095e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 6.2857142857e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -7507,13 +7507,13 @@ Parameters for evaluation 233: 7.6428571429e+01 minSizePl integer 3.1714285714e+01 minSizeSeg integer 9.2857142857e+02 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 6.2857142857e+00 recon integer - 7.8095238095e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 6.2857142857e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -7539,13 +7539,13 @@ Parameters for evaluation 234: 7.6428571429e+01 minSizePl integer 3.1714285714e+01 minSizeSeg integer 9.2857142857e+02 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 6.2857142857e+00 recon integer - 7.8095238095e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 6.2857142857e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -7571,13 +7571,13 @@ Parameters for evaluation 235: 7.6428571429e+01 minSizePl integer 3.1714285714e+01 minSizeSeg integer 9.2857142857e+02 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 6.2857142857e+00 recon integer - 7.8095238095e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 6.2857142857e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -7603,13 +7603,13 @@ Parameters for evaluation 236: 3.7142857143e+01 minSizePl integer 3.1714285714e+01 minSizeSeg integer 9.2857142857e+02 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 6.2857142857e+00 recon integer - 7.8095238095e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 6.2857142857e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -7635,13 +7635,13 @@ Parameters for evaluation 237: 3.7142857143e+01 minSizePl integer 3.1714285714e+01 minSizeSeg integer 9.2857142857e+02 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 6.2857142857e+00 recon integer - 7.8095238095e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 6.2857142857e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -7667,13 +7667,13 @@ Parameters for evaluation 238: 3.7142857143e+01 minSizePl integer 3.1714285714e+01 minSizeSeg integer 9.2857142857e+02 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 6.2857142857e+00 recon integer - 7.8095238095e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 6.2857142857e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -7699,13 +7699,13 @@ Parameters for evaluation 239: 3.7142857143e+01 minSizePl integer 3.1714285714e+01 minSizeSeg integer 9.2857142857e+02 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 6.2857142857e+00 recon integer - 7.8095238095e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 6.2857142857e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -7731,13 +7731,13 @@ Parameters for evaluation 240: 3.7142857143e+01 minSizePl integer 3.1714285714e+01 minSizeSeg integer 9.2857142857e+02 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 6.2857142857e+00 recon integer - 7.8095238095e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 6.2857142857e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -7763,13 +7763,13 @@ Parameters for evaluation 241: 5.5000000000e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.3285714286e+03 maxSizeSeg integer - 6.6666666667e+00 fillHoles integer - 4.1904761905e+00 recon integer - 7.8095238095e+00 water integer + 6.6666666667e+00 fillHolesConnectivity integer + 4.1904761905e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -7795,13 +7795,13 @@ Parameters for evaluation 242: 5.5000000000e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.3285714286e+03 maxSizeSeg integer - 6.6666666667e+00 fillHoles integer - 4.1904761905e+00 recon integer - 7.8095238095e+00 water integer + 6.6666666667e+00 fillHolesConnectivity integer + 4.1904761905e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -7827,13 +7827,13 @@ Parameters for evaluation 243: 5.5000000000e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.3285714286e+03 maxSizeSeg integer - 6.6666666667e+00 fillHoles integer - 4.1904761905e+00 recon integer - 5.7142857143e+00 water integer + 6.6666666667e+00 fillHolesConnectivity integer + 4.1904761905e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -7859,13 +7859,13 @@ Parameters for evaluation 244: 5.5000000000e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.3285714286e+03 maxSizeSeg integer - 6.6666666667e+00 fillHoles integer - 4.1904761905e+00 recon integer - 5.7142857143e+00 water integer + 6.6666666667e+00 fillHolesConnectivity integer + 4.1904761905e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -7891,13 +7891,13 @@ Parameters for evaluation 245: 1.5714285714e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.3285714286e+03 maxSizeSeg integer - 6.6666666667e+00 fillHoles integer - 4.1904761905e+00 recon integer - 5.7142857143e+00 water integer + 6.6666666667e+00 fillHolesConnectivity integer + 4.1904761905e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -7923,13 +7923,13 @@ Parameters for evaluation 246: 1.5714285714e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.3285714286e+03 maxSizeSeg integer - 6.6666666667e+00 fillHoles integer - 4.1904761905e+00 recon integer - 5.7142857143e+00 water integer + 6.6666666667e+00 fillHolesConnectivity integer + 4.1904761905e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -7955,13 +7955,13 @@ Parameters for evaluation 247: 1.5714285714e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.3285714286e+03 maxSizeSeg integer - 6.6666666667e+00 fillHoles integer - 4.1904761905e+00 recon integer - 5.7142857143e+00 water integer + 6.6666666667e+00 fillHolesConnectivity integer + 4.1904761905e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -7987,13 +7987,13 @@ Parameters for evaluation 248: 1.5714285714e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.3285714286e+03 maxSizeSeg integer - 6.6666666667e+00 fillHoles integer - 6.2857142857e+00 recon integer - 5.7142857143e+00 water integer + 6.6666666667e+00 fillHolesConnectivity integer + 6.2857142857e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -8019,13 +8019,13 @@ Parameters for evaluation 249: 1.5714285714e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.3285714286e+03 maxSizeSeg integer - 6.6666666667e+00 fillHoles integer - 6.2857142857e+00 recon integer - 5.7142857143e+00 water integer + 6.6666666667e+00 fillHolesConnectivity integer + 6.2857142857e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -8051,13 +8051,13 @@ Parameters for evaluation 250: 1.5714285714e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.3285714286e+03 maxSizeSeg integer - 6.6666666667e+00 fillHoles integer - 6.2857142857e+00 recon integer - 5.7142857143e+00 water integer + 6.6666666667e+00 fillHolesConnectivity integer + 6.2857142857e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -8083,13 +8083,13 @@ Parameters for evaluation 251: 1.5714285714e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.3285714286e+03 maxSizeSeg integer - 6.6666666667e+00 fillHoles integer - 6.2857142857e+00 recon integer - 5.7142857143e+00 water integer + 6.6666666667e+00 fillHolesConnectivity integer + 6.2857142857e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -8115,13 +8115,13 @@ Parameters for evaluation 252: 1.5714285714e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.3285714286e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 6.2857142857e+00 recon integer - 5.7142857143e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 6.2857142857e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -8147,13 +8147,13 @@ Parameters for evaluation 253: 1.5714285714e+01 minSizePl integer 5.4000000000e+01 minSizeSeg integer 1.3285714286e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 6.2857142857e+00 recon integer - 5.7142857143e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 6.2857142857e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -8179,13 +8179,13 @@ Parameters for evaluation 254: 1.5714285714e+01 minSizePl integer 5.4000000000e+01 minSizeSeg integer 1.3285714286e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 6.2857142857e+00 recon integer - 5.7142857143e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 6.2857142857e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -8211,13 +8211,13 @@ Parameters for evaluation 255: 1.5714285714e+01 minSizePl integer 5.4000000000e+01 minSizeSeg integer 1.0142857143e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 6.2857142857e+00 recon integer - 5.7142857143e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 6.2857142857e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -8243,13 +8243,13 @@ Parameters for evaluation 256: 1.5714285714e+01 minSizePl integer 5.4000000000e+01 minSizeSeg integer 1.0142857143e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 6.2857142857e+00 recon integer - 5.7142857143e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 6.2857142857e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -8275,13 +8275,13 @@ Parameters for evaluation 257: 7.6428571429e+01 minSizePl integer 3.9142857143e+01 minSizeSeg integer 1.3000000000e+03 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 5.7142857143e+00 recon integer - 4.5714285714e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 5.7142857143e+00 reconConnectivity integer + 4.5714285714e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -8307,13 +8307,13 @@ Parameters for evaluation 258: 7.6428571429e+01 minSizePl integer 3.9142857143e+01 minSizeSeg integer 1.3000000000e+03 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 7.8095238095e+00 recon integer - 4.5714285714e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 7.8095238095e+00 reconConnectivity integer + 4.5714285714e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -8339,13 +8339,13 @@ Parameters for evaluation 259: 7.6428571429e+01 minSizePl integer 3.9142857143e+01 minSizeSeg integer 9.8571428571e+02 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 7.8095238095e+00 recon integer - 4.5714285714e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 7.8095238095e+00 reconConnectivity integer + 4.5714285714e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -8371,13 +8371,13 @@ Parameters for evaluation 260: 7.6428571429e+01 minSizePl integer 3.9142857143e+01 minSizeSeg integer 9.8571428571e+02 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 7.8095238095e+00 recon integer - 4.5714285714e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 7.8095238095e+00 reconConnectivity integer + 4.5714285714e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -8403,13 +8403,13 @@ Parameters for evaluation 261: 7.6428571429e+01 minSizePl integer 3.9142857143e+01 minSizeSeg integer 9.8571428571e+02 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 7.8095238095e+00 recon integer - 4.5714285714e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 7.8095238095e+00 reconConnectivity integer + 4.5714285714e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -8435,13 +8435,13 @@ Parameters for evaluation 262: 7.6428571429e+01 minSizePl integer 8.0000000000e+01 minSizeSeg integer 9.8571428571e+02 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 7.8095238095e+00 recon integer - 4.5714285714e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 7.8095238095e+00 reconConnectivity integer + 4.5714285714e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -8467,13 +8467,13 @@ Parameters for evaluation 263: 7.6428571429e+01 minSizePl integer 8.0000000000e+01 minSizeSeg integer 9.8571428571e+02 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 7.8095238095e+00 recon integer - 4.5714285714e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 7.8095238095e+00 reconConnectivity integer + 4.5714285714e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -8499,13 +8499,13 @@ Parameters for evaluation 264: 7.6428571429e+01 minSizePl integer 8.0000000000e+01 minSizeSeg integer 9.8571428571e+02 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 7.8095238095e+00 recon integer - 4.5714285714e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 7.8095238095e+00 reconConnectivity integer + 4.5714285714e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -8531,13 +8531,13 @@ Parameters for evaluation 265: 7.6428571429e+01 minSizePl integer 8.0000000000e+01 minSizeSeg integer 9.8571428571e+02 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 7.8095238095e+00 recon integer - 4.5714285714e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 7.8095238095e+00 reconConnectivity integer + 4.5714285714e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -8563,13 +8563,13 @@ Parameters for evaluation 266: 7.6428571429e+01 minSizePl integer 8.0000000000e+01 minSizeSeg integer 9.8571428571e+02 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 7.8095238095e+00 recon integer - 4.5714285714e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 7.8095238095e+00 reconConnectivity integer + 4.5714285714e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -8595,13 +8595,13 @@ Parameters for evaluation 267: 7.6428571429e+01 minSizePl integer 8.0000000000e+01 minSizeSeg integer 9.8571428571e+02 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 7.8095238095e+00 recon integer - 4.5714285714e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 7.8095238095e+00 reconConnectivity integer + 4.5714285714e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -8627,13 +8627,13 @@ Parameters for evaluation 268: 7.6428571429e+01 minSizePl integer 8.0000000000e+01 minSizeSeg integer 9.8571428571e+02 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 7.8095238095e+00 recon integer - 4.5714285714e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 7.8095238095e+00 reconConnectivity integer + 4.5714285714e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -8659,13 +8659,13 @@ Parameters for evaluation 269: 7.6428571429e+01 minSizePl integer 8.0000000000e+01 minSizeSeg integer 9.8571428571e+02 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 7.8095238095e+00 recon integer - 4.5714285714e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 7.8095238095e+00 reconConnectivity integer + 4.5714285714e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -8691,13 +8691,13 @@ Parameters for evaluation 270: 7.6428571429e+01 minSizePl integer 8.0000000000e+01 minSizeSeg integer 9.8571428571e+02 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 7.8095238095e+00 recon integer - 6.6666666667e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 7.8095238095e+00 reconConnectivity integer + 6.6666666667e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -8723,13 +8723,13 @@ Parameters for evaluation 271: 7.6428571429e+01 minSizePl integer 8.0000000000e+01 minSizeSeg integer 9.8571428571e+02 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 7.8095238095e+00 recon integer - 6.6666666667e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 7.8095238095e+00 reconConnectivity integer + 6.6666666667e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -8755,13 +8755,13 @@ Parameters for evaluation 272: 3.7142857143e+01 minSizePl integer 8.0000000000e+01 minSizeSeg integer 9.8571428571e+02 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 7.8095238095e+00 recon integer - 6.6666666667e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 7.8095238095e+00 reconConnectivity integer + 6.6666666667e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -8787,13 +8787,13 @@ Parameters for evaluation 273: 8.5714285714e+00 minSizePl integer 9.4285714286e+00 minSizeSeg integer 1.0142857143e+03 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 6.4761904762e+00 recon integer - 7.6190476190e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 7.6190476190e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -8819,13 +8819,13 @@ Parameters for evaluation 274: 8.5714285714e+00 minSizePl integer 9.4285714286e+00 minSizeSeg integer 1.0142857143e+03 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 4.3809523810e+00 recon integer - 7.6190476190e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 7.6190476190e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -8851,13 +8851,13 @@ Parameters for evaluation 275: 8.5714285714e+00 minSizePl integer 9.4285714286e+00 minSizeSeg integer 1.0142857143e+03 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 4.3809523810e+00 recon integer - 7.6190476190e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 7.6190476190e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -8883,13 +8883,13 @@ Parameters for evaluation 276: 8.5714285714e+00 minSizePl integer 9.4285714286e+00 minSizeSeg integer 1.0142857143e+03 maxSizeSeg integer - 4.0000000000e+00 fillHoles integer - 4.3809523810e+00 recon integer - 7.6190476190e+00 water integer + 4.0000000000e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 7.6190476190e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -8915,13 +8915,13 @@ Parameters for evaluation 277: 8.5714285714e+00 minSizePl integer 9.4285714286e+00 minSizeSeg integer 1.0142857143e+03 maxSizeSeg integer - 4.0000000000e+00 fillHoles integer - 4.3809523810e+00 recon integer - 7.6190476190e+00 water integer + 4.0000000000e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 7.6190476190e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -8947,13 +8947,13 @@ Parameters for evaluation 278: 8.5714285714e+00 minSizePl integer 9.4285714286e+00 minSizeSeg integer 1.0142857143e+03 maxSizeSeg integer - 4.0000000000e+00 fillHoles integer - 4.3809523810e+00 recon integer - 7.6190476190e+00 water integer + 4.0000000000e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 7.6190476190e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -8979,13 +8979,13 @@ Parameters for evaluation 279: 8.5714285714e+00 minSizePl integer 9.4285714286e+00 minSizeSeg integer 1.3285714286e+03 maxSizeSeg integer - 4.0000000000e+00 fillHoles integer - 4.3809523810e+00 recon integer - 7.6190476190e+00 water integer + 4.0000000000e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 7.6190476190e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -9011,13 +9011,13 @@ Parameters for evaluation 280: 8.5714285714e+00 minSizePl integer 9.4285714286e+00 minSizeSeg integer 1.3285714286e+03 maxSizeSeg integer - 4.0000000000e+00 fillHoles integer - 4.3809523810e+00 recon integer - 7.6190476190e+00 water integer + 4.0000000000e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 7.6190476190e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -9043,13 +9043,13 @@ Parameters for evaluation 281: 8.5714285714e+00 minSizePl integer 9.4285714286e+00 minSizeSeg integer 1.3285714286e+03 maxSizeSeg integer - 4.0000000000e+00 fillHoles integer - 4.3809523810e+00 recon integer - 7.6190476190e+00 water integer + 4.0000000000e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 7.6190476190e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -9075,13 +9075,13 @@ Parameters for evaluation 282: 8.5714285714e+00 minSizePl integer 5.0285714286e+01 minSizeSeg integer 1.3285714286e+03 maxSizeSeg integer - 4.0000000000e+00 fillHoles integer - 4.3809523810e+00 recon integer - 7.6190476190e+00 water integer + 4.0000000000e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 7.6190476190e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -9107,13 +9107,13 @@ Parameters for evaluation 283: 4.7857142857e+01 minSizePl integer 5.0285714286e+01 minSizeSeg integer 1.3285714286e+03 maxSizeSeg integer - 4.0000000000e+00 fillHoles integer - 4.3809523810e+00 recon integer - 7.6190476190e+00 water integer + 4.0000000000e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 7.6190476190e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -9139,13 +9139,13 @@ Parameters for evaluation 284: 4.7857142857e+01 minSizePl integer 5.0285714286e+01 minSizeSeg integer 1.3285714286e+03 maxSizeSeg integer - 4.0000000000e+00 fillHoles integer - 4.3809523810e+00 recon integer - 7.6190476190e+00 water integer + 4.0000000000e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 7.6190476190e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -9171,13 +9171,13 @@ Parameters for evaluation 285: 4.7857142857e+01 minSizePl integer 5.0285714286e+01 minSizeSeg integer 1.3285714286e+03 maxSizeSeg integer - 4.0000000000e+00 fillHoles integer - 4.3809523810e+00 recon integer - 5.5238095238e+00 water integer + 4.0000000000e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 5.5238095238e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -9203,13 +9203,13 @@ Parameters for evaluation 286: 4.7857142857e+01 minSizePl integer 5.0285714286e+01 minSizeSeg integer 1.3285714286e+03 maxSizeSeg integer - 4.0000000000e+00 fillHoles integer - 4.3809523810e+00 recon integer - 5.5238095238e+00 water integer + 4.0000000000e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 5.5238095238e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -9235,13 +9235,13 @@ Parameters for evaluation 287: 4.7857142857e+01 minSizePl integer 5.0285714286e+01 minSizeSeg integer 1.3285714286e+03 maxSizeSeg integer - 4.0000000000e+00 fillHoles integer - 4.3809523810e+00 recon integer - 5.5238095238e+00 water integer + 4.0000000000e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 5.5238095238e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -9267,13 +9267,13 @@ Parameters for evaluation 288: 4.7857142857e+01 minSizePl integer 5.0285714286e+01 minSizeSeg integer 1.3285714286e+03 maxSizeSeg integer - 4.0000000000e+00 fillHoles integer - 4.3809523810e+00 recon integer - 5.5238095238e+00 water integer + 4.0000000000e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 5.5238095238e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -9299,13 +9299,13 @@ Parameters for evaluation 289: 8.0000000000e+01 minSizePl integer 8.0000000000e+01 minSizeSeg integer 1.1000000000e+03 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 5.5238095238e+00 recon integer - 6.2857142857e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 5.5238095238e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -9331,13 +9331,13 @@ Parameters for evaluation 290: 8.0000000000e+01 minSizePl integer 8.0000000000e+01 minSizeSeg integer 1.4142857143e+03 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 5.5238095238e+00 recon integer - 6.2857142857e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 5.5238095238e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -9363,13 +9363,13 @@ Parameters for evaluation 291: 8.0000000000e+01 minSizePl integer 8.0000000000e+01 minSizeSeg integer 1.4142857143e+03 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 5.5238095238e+00 recon integer - 6.2857142857e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 5.5238095238e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -9395,13 +9395,13 @@ Parameters for evaluation 292: 8.0000000000e+01 minSizePl integer 8.0000000000e+01 minSizeSeg integer 1.4142857143e+03 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 5.5238095238e+00 recon integer - 6.2857142857e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 5.5238095238e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -9427,13 +9427,13 @@ Parameters for evaluation 293: 8.0000000000e+01 minSizePl integer 8.0000000000e+01 minSizeSeg integer 1.4142857143e+03 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 5.5238095238e+00 recon integer - 6.2857142857e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 5.5238095238e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -9459,13 +9459,13 @@ Parameters for evaluation 294: 8.0000000000e+01 minSizePl integer 8.0000000000e+01 minSizeSeg integer 1.4142857143e+03 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 5.5238095238e+00 recon integer - 6.2857142857e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 5.5238095238e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -9491,13 +9491,13 @@ Parameters for evaluation 295: 8.0000000000e+01 minSizePl integer 8.0000000000e+01 minSizeSeg integer 1.4142857143e+03 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 5.5238095238e+00 recon integer - 6.2857142857e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 5.5238095238e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -9523,13 +9523,13 @@ Parameters for evaluation 296: 8.0000000000e+01 minSizePl integer 3.9142857143e+01 minSizeSeg integer 1.4142857143e+03 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 5.5238095238e+00 recon integer - 6.2857142857e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 5.5238095238e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -9555,13 +9555,13 @@ Parameters for evaluation 297: 8.0000000000e+01 minSizePl integer 3.9142857143e+01 minSizeSeg integer 1.4142857143e+03 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 7.6190476190e+00 recon integer - 6.2857142857e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 7.6190476190e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -9587,13 +9587,13 @@ Parameters for evaluation 298: 4.0714285714e+01 minSizePl integer 3.9142857143e+01 minSizeSeg integer 1.4142857143e+03 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 7.6190476190e+00 recon integer - 6.2857142857e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 7.6190476190e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -9619,13 +9619,13 @@ Parameters for evaluation 299: 4.0714285714e+01 minSizePl integer 3.9142857143e+01 minSizeSeg integer 1.4142857143e+03 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 7.6190476190e+00 recon integer - 6.2857142857e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 7.6190476190e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -9651,13 +9651,13 @@ Parameters for evaluation 300: 4.0714285714e+01 minSizePl integer 3.9142857143e+01 minSizeSeg integer 1.4142857143e+03 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 7.6190476190e+00 recon integer - 6.2857142857e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 7.6190476190e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -9683,13 +9683,13 @@ Parameters for evaluation 301: 4.0714285714e+01 minSizePl integer 3.9142857143e+01 minSizeSeg integer 1.4142857143e+03 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 7.6190476190e+00 recon integer - 4.1904761905e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 7.6190476190e+00 reconConnectivity integer + 4.1904761905e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -9715,13 +9715,13 @@ Parameters for evaluation 302: 4.0714285714e+01 minSizePl integer 3.9142857143e+01 minSizeSeg integer 1.4142857143e+03 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 7.6190476190e+00 recon integer - 4.1904761905e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 7.6190476190e+00 reconConnectivity integer + 4.1904761905e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -9747,13 +9747,13 @@ Parameters for evaluation 303: 4.0714285714e+01 minSizePl integer 3.9142857143e+01 minSizeSeg integer 1.4142857143e+03 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 7.6190476190e+00 recon integer - 4.1904761905e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 7.6190476190e+00 reconConnectivity integer + 4.1904761905e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -9779,13 +9779,13 @@ Parameters for evaluation 304: 4.0714285714e+01 minSizePl integer 3.9142857143e+01 minSizeSeg integer 1.4142857143e+03 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 7.6190476190e+00 recon integer - 4.1904761905e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 7.6190476190e+00 reconConnectivity integer + 4.1904761905e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -9811,13 +9811,13 @@ Parameters for evaluation 305: 5.0000000000e+00 minSizePl integer 5.7142857143e+00 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 8.0000000000e+00 recon integer - 7.8095238095e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 8.0000000000e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -9843,13 +9843,13 @@ Parameters for evaluation 306: 5.0000000000e+00 minSizePl integer 5.7142857143e+00 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 8.0000000000e+00 recon integer - 7.8095238095e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 8.0000000000e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -9875,13 +9875,13 @@ Parameters for evaluation 307: 5.0000000000e+00 minSizePl integer 5.7142857143e+00 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 5.9047619048e+00 fillHoles integer - 5.9047619048e+00 recon integer - 7.8095238095e+00 water integer + 5.9047619048e+00 fillHolesConnectivity integer + 5.9047619048e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -9907,13 +9907,13 @@ Parameters for evaluation 308: 5.0000000000e+00 minSizePl integer 5.7142857143e+00 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 5.9047619048e+00 recon integer - 7.8095238095e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 5.9047619048e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -9939,13 +9939,13 @@ Parameters for evaluation 309: 5.0000000000e+00 minSizePl integer 5.7142857143e+00 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 5.9047619048e+00 recon integer - 7.8095238095e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 5.9047619048e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -9971,13 +9971,13 @@ Parameters for evaluation 310: 5.0000000000e+00 minSizePl integer 5.7142857143e+00 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 5.9047619048e+00 recon integer - 7.8095238095e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 5.9047619048e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -10003,13 +10003,13 @@ Parameters for evaluation 311: 5.0000000000e+00 minSizePl integer 5.7142857143e+00 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 5.9047619048e+00 recon integer - 7.8095238095e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 5.9047619048e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -10035,13 +10035,13 @@ Parameters for evaluation 312: 5.0000000000e+00 minSizePl integer 5.7142857143e+00 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 5.9047619048e+00 recon integer - 7.8095238095e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 5.9047619048e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -10067,13 +10067,13 @@ Parameters for evaluation 313: 5.0000000000e+00 minSizePl integer 5.7142857143e+00 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 5.9047619048e+00 recon integer - 7.8095238095e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 5.9047619048e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -10099,13 +10099,13 @@ Parameters for evaluation 314: 5.0000000000e+00 minSizePl integer 5.7142857143e+00 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 5.9047619048e+00 recon integer - 7.8095238095e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 5.9047619048e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -10131,13 +10131,13 @@ Parameters for evaluation 315: 5.0000000000e+00 minSizePl integer 5.7142857143e+00 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 5.9047619048e+00 recon integer - 5.7142857143e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 5.9047619048e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -10163,13 +10163,13 @@ Parameters for evaluation 316: 5.0000000000e+00 minSizePl integer 4.6571428571e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 5.9047619048e+00 recon integer - 5.7142857143e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 5.9047619048e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -10195,13 +10195,13 @@ Parameters for evaluation 317: 5.0000000000e+00 minSizePl integer 4.6571428571e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 5.9047619048e+00 recon integer - 5.7142857143e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 5.9047619048e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -10227,13 +10227,13 @@ Parameters for evaluation 318: 5.0000000000e+00 minSizePl integer 4.6571428571e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 5.9047619048e+00 recon integer - 5.7142857143e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 5.9047619048e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -10259,13 +10259,13 @@ Parameters for evaluation 319: 5.0000000000e+00 minSizePl integer 4.6571428571e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 5.9047619048e+00 recon integer - 5.7142857143e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 5.9047619048e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -10291,13 +10291,13 @@ Parameters for evaluation 320: 4.4285714286e+01 minSizePl integer 4.6571428571e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 8.0000000000e+00 fillHoles integer - 5.9047619048e+00 recon integer - 5.7142857143e+00 water integer + 8.0000000000e+00 fillHolesConnectivity integer + 5.9047619048e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -10323,13 +10323,13 @@ Parameters for evaluation 321: 4.0714285714e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 6.6666666667e+00 fillHoles integer - 5.5238095238e+00 recon integer - 6.0952380952e+00 water integer + 6.6666666667e+00 fillHolesConnectivity integer + 5.5238095238e+00 reconConnectivity integer + 6.0952380952e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -10355,13 +10355,13 @@ Parameters for evaluation 322: 4.0714285714e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 5.5238095238e+00 recon integer - 6.0952380952e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 5.5238095238e+00 reconConnectivity integer + 6.0952380952e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -10387,13 +10387,13 @@ Parameters for evaluation 323: 4.0714285714e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 5.5238095238e+00 recon integer - 6.0952380952e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 5.5238095238e+00 reconConnectivity integer + 6.0952380952e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -10419,13 +10419,13 @@ Parameters for evaluation 324: 4.0714285714e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 5.5238095238e+00 recon integer - 6.0952380952e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 5.5238095238e+00 reconConnectivity integer + 6.0952380952e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -10451,13 +10451,13 @@ Parameters for evaluation 325: 8.0000000000e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 5.5238095238e+00 recon integer - 6.0952380952e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 5.5238095238e+00 reconConnectivity integer + 6.0952380952e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -10483,13 +10483,13 @@ Parameters for evaluation 326: 8.0000000000e+01 minSizePl integer 5.4000000000e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 5.5238095238e+00 recon integer - 6.0952380952e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 5.5238095238e+00 reconConnectivity integer + 6.0952380952e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -10515,13 +10515,13 @@ Parameters for evaluation 327: 8.0000000000e+01 minSizePl integer 5.4000000000e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 5.5238095238e+00 recon integer - 6.0952380952e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 5.5238095238e+00 reconConnectivity integer + 6.0952380952e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -10547,13 +10547,13 @@ Parameters for evaluation 328: 8.0000000000e+01 minSizePl integer 5.4000000000e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 5.5238095238e+00 recon integer - 6.0952380952e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 5.5238095238e+00 reconConnectivity integer + 6.0952380952e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -10579,13 +10579,13 @@ Parameters for evaluation 329: 8.0000000000e+01 minSizePl integer 5.4000000000e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 5.5238095238e+00 recon integer - 4.0000000000e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 5.5238095238e+00 reconConnectivity integer + 4.0000000000e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -10611,13 +10611,13 @@ Parameters for evaluation 330: 8.0000000000e+01 minSizePl integer 5.4000000000e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 7.6190476190e+00 recon integer - 4.0000000000e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 7.6190476190e+00 reconConnectivity integer + 4.0000000000e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -10643,13 +10643,13 @@ Parameters for evaluation 331: 8.0000000000e+01 minSizePl integer 5.4000000000e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 7.6190476190e+00 recon integer - 4.0000000000e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 7.6190476190e+00 reconConnectivity integer + 4.0000000000e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -10675,13 +10675,13 @@ Parameters for evaluation 332: 8.0000000000e+01 minSizePl integer 5.4000000000e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 7.6190476190e+00 recon integer - 4.0000000000e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 7.6190476190e+00 reconConnectivity integer + 4.0000000000e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -10707,13 +10707,13 @@ Parameters for evaluation 333: 8.0000000000e+01 minSizePl integer 5.4000000000e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 7.6190476190e+00 recon integer - 4.0000000000e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 7.6190476190e+00 reconConnectivity integer + 4.0000000000e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -10739,13 +10739,13 @@ Parameters for evaluation 334: 8.0000000000e+01 minSizePl integer 5.4000000000e+01 minSizeSeg integer 1.1285714286e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 7.6190476190e+00 recon integer - 4.0000000000e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 7.6190476190e+00 reconConnectivity integer + 4.0000000000e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -10771,13 +10771,13 @@ Parameters for evaluation 335: 8.0000000000e+01 minSizePl integer 5.4000000000e+01 minSizeSeg integer 1.1285714286e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 7.6190476190e+00 recon integer - 4.0000000000e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 7.6190476190e+00 reconConnectivity integer + 4.0000000000e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -10803,13 +10803,13 @@ Parameters for evaluation 336: 8.0000000000e+01 minSizePl integer 5.4000000000e+01 minSizeSeg integer 1.1285714286e+03 maxSizeSeg integer - 4.5714285714e+00 fillHoles integer - 7.6190476190e+00 recon integer - 4.0000000000e+00 water integer + 4.5714285714e+00 fillHolesConnectivity integer + 7.6190476190e+00 reconConnectivity integer + 4.0000000000e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -10835,13 +10835,13 @@ Parameters for evaluation 337: 8.5714285714e+00 minSizePl integer 4.6571428571e+01 minSizeSeg integer 1.4714285714e+03 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 8.0000000000e+00 recon integer - 5.7142857143e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 8.0000000000e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -10867,13 +10867,13 @@ Parameters for evaluation 338: 8.5714285714e+00 minSizePl integer 4.6571428571e+01 minSizeSeg integer 1.4714285714e+03 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 8.0000000000e+00 recon integer - 5.7142857143e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 8.0000000000e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -10899,13 +10899,13 @@ Parameters for evaluation 339: 8.5714285714e+00 minSizePl integer 4.6571428571e+01 minSizeSeg integer 1.4714285714e+03 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 8.0000000000e+00 recon integer - 7.8095238095e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 8.0000000000e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -10931,13 +10931,13 @@ Parameters for evaluation 340: 8.5714285714e+00 minSizePl integer 4.6571428571e+01 minSizeSeg integer 1.1571428571e+03 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 8.0000000000e+00 recon integer - 7.8095238095e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 8.0000000000e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -10963,13 +10963,13 @@ Parameters for evaluation 341: 8.5714285714e+00 minSizePl integer 4.6571428571e+01 minSizeSeg integer 1.1571428571e+03 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 8.0000000000e+00 recon integer - 7.8095238095e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 8.0000000000e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -10995,13 +10995,13 @@ Parameters for evaluation 342: 8.5714285714e+00 minSizePl integer 4.6571428571e+01 minSizeSeg integer 1.1571428571e+03 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 8.0000000000e+00 recon integer - 7.8095238095e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 8.0000000000e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -11027,13 +11027,13 @@ Parameters for evaluation 343: 8.5714285714e+00 minSizePl integer 4.6571428571e+01 minSizeSeg integer 1.1571428571e+03 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 8.0000000000e+00 recon integer - 7.8095238095e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 8.0000000000e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -11059,13 +11059,13 @@ Parameters for evaluation 344: 8.5714285714e+00 minSizePl integer 4.6571428571e+01 minSizeSeg integer 1.1571428571e+03 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 8.0000000000e+00 recon integer - 7.8095238095e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 8.0000000000e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -11091,13 +11091,13 @@ Parameters for evaluation 345: 8.5714285714e+00 minSizePl integer 5.7142857143e+00 minSizeSeg integer 1.1571428571e+03 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 8.0000000000e+00 recon integer - 7.8095238095e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 8.0000000000e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -11123,13 +11123,13 @@ Parameters for evaluation 346: 8.5714285714e+00 minSizePl integer 5.7142857143e+00 minSizeSeg integer 1.1571428571e+03 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 8.0000000000e+00 recon integer - 7.8095238095e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 8.0000000000e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -11155,13 +11155,13 @@ Parameters for evaluation 347: 8.5714285714e+00 minSizePl integer 5.7142857143e+00 minSizeSeg integer 1.1571428571e+03 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 8.0000000000e+00 recon integer - 7.8095238095e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 8.0000000000e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -11187,13 +11187,13 @@ Parameters for evaluation 348: 8.5714285714e+00 minSizePl integer 5.7142857143e+00 minSizeSeg integer 1.1571428571e+03 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 5.9047619048e+00 recon integer - 7.8095238095e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 5.9047619048e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -11219,13 +11219,13 @@ Parameters for evaluation 349: 8.5714285714e+00 minSizePl integer 5.7142857143e+00 minSizeSeg integer 1.1571428571e+03 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 5.9047619048e+00 recon integer - 7.8095238095e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 5.9047619048e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -11251,13 +11251,13 @@ Parameters for evaluation 350: 8.5714285714e+00 minSizePl integer 5.7142857143e+00 minSizeSeg integer 1.1571428571e+03 maxSizeSeg integer - 4.0000000000e+00 fillHoles integer - 5.9047619048e+00 recon integer - 7.8095238095e+00 water integer + 4.0000000000e+00 fillHolesConnectivity integer + 5.9047619048e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -11283,13 +11283,13 @@ Parameters for evaluation 351: 4.7857142857e+01 minSizePl integer 5.7142857143e+00 minSizeSeg integer 1.1571428571e+03 maxSizeSeg integer - 4.0000000000e+00 fillHoles integer - 5.9047619048e+00 recon integer - 7.8095238095e+00 water integer + 4.0000000000e+00 fillHolesConnectivity integer + 5.9047619048e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -11315,13 +11315,13 @@ Parameters for evaluation 352: 4.7857142857e+01 minSizePl integer 5.7142857143e+00 minSizeSeg integer 1.1571428571e+03 maxSizeSeg integer - 4.0000000000e+00 fillHoles integer - 5.9047619048e+00 recon integer - 7.8095238095e+00 water integer + 4.0000000000e+00 fillHolesConnectivity integer + 5.9047619048e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -11347,13 +11347,13 @@ Parameters for evaluation 353: 3.0000000000e+01 minSizePl integer 3.1714285714e+01 minSizeSeg integer 1.5000000000e+03 maxSizeSeg integer - 5.3333333333e+00 fillHoles integer - 6.4761904762e+00 recon integer - 6.2857142857e+00 water integer + 5.3333333333e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -11379,13 +11379,13 @@ Parameters for evaluation 354: 3.0000000000e+01 minSizePl integer 3.1714285714e+01 minSizeSeg integer 1.5000000000e+03 maxSizeSeg integer - 5.3333333333e+00 fillHoles integer - 6.4761904762e+00 recon integer - 6.2857142857e+00 water integer + 5.3333333333e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -11411,13 +11411,13 @@ Parameters for evaluation 355: 3.0000000000e+01 minSizePl integer 3.1714285714e+01 minSizeSeg integer 1.5000000000e+03 maxSizeSeg integer - 5.3333333333e+00 fillHoles integer - 4.3809523810e+00 recon integer - 6.2857142857e+00 water integer + 5.3333333333e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -11443,13 +11443,13 @@ Parameters for evaluation 356: 3.0000000000e+01 minSizePl integer 3.1714285714e+01 minSizeSeg integer 1.5000000000e+03 maxSizeSeg integer - 5.3333333333e+00 fillHoles integer - 4.3809523810e+00 recon integer - 6.2857142857e+00 water integer + 5.3333333333e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -11475,13 +11475,13 @@ Parameters for evaluation 357: 3.0000000000e+01 minSizePl integer 3.1714285714e+01 minSizeSeg integer 1.5000000000e+03 maxSizeSeg integer - 5.3333333333e+00 fillHoles integer - 4.3809523810e+00 recon integer - 6.2857142857e+00 water integer + 5.3333333333e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -11507,13 +11507,13 @@ Parameters for evaluation 358: 3.0000000000e+01 minSizePl integer 3.1714285714e+01 minSizeSeg integer 1.5000000000e+03 maxSizeSeg integer - 5.3333333333e+00 fillHoles integer - 4.3809523810e+00 recon integer - 6.2857142857e+00 water integer + 5.3333333333e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -11539,13 +11539,13 @@ Parameters for evaluation 359: 3.0000000000e+01 minSizePl integer 3.1714285714e+01 minSizeSeg integer 1.5000000000e+03 maxSizeSeg integer - 5.3333333333e+00 fillHoles integer - 4.3809523810e+00 recon integer - 6.2857142857e+00 water integer + 5.3333333333e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -11571,13 +11571,13 @@ Parameters for evaluation 360: 3.0000000000e+01 minSizePl integer 3.1714285714e+01 minSizeSeg integer 1.5000000000e+03 maxSizeSeg integer - 7.4285714286e+00 fillHoles integer - 4.3809523810e+00 recon integer - 6.2857142857e+00 water integer + 7.4285714286e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -11603,13 +11603,13 @@ Parameters for evaluation 361: 3.0000000000e+01 minSizePl integer 7.2571428571e+01 minSizeSeg integer 1.5000000000e+03 maxSizeSeg integer - 7.4285714286e+00 fillHoles integer - 4.3809523810e+00 recon integer - 6.2857142857e+00 water integer + 7.4285714286e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 6.2857142857e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -11635,13 +11635,13 @@ Parameters for evaluation 362: 3.0000000000e+01 minSizePl integer 7.2571428571e+01 minSizeSeg integer 1.5000000000e+03 maxSizeSeg integer - 7.4285714286e+00 fillHoles integer - 4.3809523810e+00 recon integer - 4.1904761905e+00 water integer + 7.4285714286e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 4.1904761905e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -11667,13 +11667,13 @@ Parameters for evaluation 363: 3.0000000000e+01 minSizePl integer 7.2571428571e+01 minSizeSeg integer 1.5000000000e+03 maxSizeSeg integer - 7.4285714286e+00 fillHoles integer - 4.3809523810e+00 recon integer - 4.1904761905e+00 water integer + 7.4285714286e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 4.1904761905e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -11699,13 +11699,13 @@ Parameters for evaluation 364: 3.0000000000e+01 minSizePl integer 7.2571428571e+01 minSizeSeg integer 1.5000000000e+03 maxSizeSeg integer - 7.4285714286e+00 fillHoles integer - 4.3809523810e+00 recon integer - 4.1904761905e+00 water integer + 7.4285714286e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 4.1904761905e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -11731,13 +11731,13 @@ Parameters for evaluation 365: 3.0000000000e+01 minSizePl integer 7.2571428571e+01 minSizeSeg integer 1.5000000000e+03 maxSizeSeg integer - 7.4285714286e+00 fillHoles integer - 4.3809523810e+00 recon integer - 4.1904761905e+00 water integer + 7.4285714286e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 4.1904761905e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -11763,13 +11763,13 @@ Parameters for evaluation 366: 3.0000000000e+01 minSizePl integer 7.2571428571e+01 minSizeSeg integer 1.1857142857e+03 maxSizeSeg integer - 7.4285714286e+00 fillHoles integer - 4.3809523810e+00 recon integer - 4.1904761905e+00 water integer + 7.4285714286e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 4.1904761905e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -11795,13 +11795,13 @@ Parameters for evaluation 367: 3.0000000000e+01 minSizePl integer 7.2571428571e+01 minSizeSeg integer 1.1857142857e+03 maxSizeSeg integer - 7.4285714286e+00 fillHoles integer - 4.3809523810e+00 recon integer - 4.1904761905e+00 water integer + 7.4285714286e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 4.1904761905e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -11827,13 +11827,13 @@ Parameters for evaluation 368: 6.9285714286e+01 minSizePl integer 7.2571428571e+01 minSizeSeg integer 1.1857142857e+03 maxSizeSeg integer - 7.4285714286e+00 fillHoles integer - 4.3809523810e+00 recon integer - 4.1904761905e+00 water integer + 7.4285714286e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 4.1904761905e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -11859,13 +11859,13 @@ Parameters for evaluation 369: 4.7857142857e+01 minSizePl integer 4.2857142857e+01 minSizeSeg integer 9.5714285714e+02 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 7.4285714286e+00 recon integer - 7.8095238095e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 7.4285714286e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -11891,13 +11891,13 @@ Parameters for evaluation 370: 4.7857142857e+01 minSizePl integer 4.2857142857e+01 minSizeSeg integer 9.5714285714e+02 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 7.4285714286e+00 recon integer - 7.8095238095e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 7.4285714286e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -11923,13 +11923,13 @@ Parameters for evaluation 371: 4.7857142857e+01 minSizePl integer 4.2857142857e+01 minSizeSeg integer 9.5714285714e+02 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 7.4285714286e+00 recon integer - 7.8095238095e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 7.4285714286e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -11955,13 +11955,13 @@ Parameters for evaluation 372: 4.7857142857e+01 minSizePl integer 4.2857142857e+01 minSizeSeg integer 9.5714285714e+02 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 7.4285714286e+00 recon integer - 7.8095238095e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 7.4285714286e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -11987,13 +11987,13 @@ Parameters for evaluation 373: 4.7857142857e+01 minSizePl integer 4.2857142857e+01 minSizeSeg integer 9.5714285714e+02 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 7.4285714286e+00 recon integer - 7.8095238095e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 7.4285714286e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -12019,13 +12019,13 @@ Parameters for evaluation 374: 4.7857142857e+01 minSizePl integer 4.2857142857e+01 minSizeSeg integer 9.5714285714e+02 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 7.4285714286e+00 recon integer - 7.8095238095e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 7.4285714286e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -12051,13 +12051,13 @@ Parameters for evaluation 375: 4.7857142857e+01 minSizePl integer 4.2857142857e+01 minSizeSeg integer 9.5714285714e+02 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 7.4285714286e+00 recon integer - 7.8095238095e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 7.4285714286e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -12083,13 +12083,13 @@ Parameters for evaluation 376: 4.7857142857e+01 minSizePl integer 4.2857142857e+01 minSizeSeg integer 9.5714285714e+02 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 7.4285714286e+00 recon integer - 7.8095238095e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 7.4285714286e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -12115,13 +12115,13 @@ Parameters for evaluation 377: 8.5714285714e+00 minSizePl integer 4.2857142857e+01 minSizeSeg integer 9.5714285714e+02 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 7.4285714286e+00 recon integer - 7.8095238095e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 7.4285714286e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -12147,13 +12147,13 @@ Parameters for evaluation 378: 8.5714285714e+00 minSizePl integer 4.2857142857e+01 minSizeSeg integer 9.5714285714e+02 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 7.4285714286e+00 recon integer - 7.8095238095e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 7.4285714286e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -12179,13 +12179,13 @@ Parameters for evaluation 379: 8.5714285714e+00 minSizePl integer 4.2857142857e+01 minSizeSeg integer 9.5714285714e+02 maxSizeSeg integer - 6.4761904762e+00 fillHoles integer - 7.4285714286e+00 recon integer - 7.8095238095e+00 water integer + 6.4761904762e+00 fillHolesConnectivity integer + 7.4285714286e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -12211,13 +12211,13 @@ Parameters for evaluation 380: 8.5714285714e+00 minSizePl integer 2.0000000000e+00 minSizeSeg integer 9.5714285714e+02 maxSizeSeg integer - 6.4761904762e+00 fillHoles integer - 7.4285714286e+00 recon integer - 7.8095238095e+00 water integer + 6.4761904762e+00 fillHolesConnectivity integer + 7.4285714286e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -12243,13 +12243,13 @@ Parameters for evaluation 381: 8.5714285714e+00 minSizePl integer 2.0000000000e+00 minSizeSeg integer 9.5714285714e+02 maxSizeSeg integer - 6.4761904762e+00 fillHoles integer - 5.3333333333e+00 recon integer - 7.8095238095e+00 water integer + 6.4761904762e+00 fillHolesConnectivity integer + 5.3333333333e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -12275,13 +12275,13 @@ Parameters for evaluation 382: 8.5714285714e+00 minSizePl integer 2.0000000000e+00 minSizeSeg integer 1.2714285714e+03 maxSizeSeg integer - 6.4761904762e+00 fillHoles integer - 5.3333333333e+00 recon integer - 7.8095238095e+00 water integer + 6.4761904762e+00 fillHolesConnectivity integer + 5.3333333333e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -12307,13 +12307,13 @@ Parameters for evaluation 383: 8.5714285714e+00 minSizePl integer 2.0000000000e+00 minSizeSeg integer 1.2714285714e+03 maxSizeSeg integer - 6.4761904762e+00 fillHoles integer - 5.3333333333e+00 recon integer - 7.8095238095e+00 water integer + 6.4761904762e+00 fillHolesConnectivity integer + 5.3333333333e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -12339,13 +12339,13 @@ Parameters for evaluation 384: 8.5714285714e+00 minSizePl integer 2.0000000000e+00 minSizeSeg integer 1.2714285714e+03 maxSizeSeg integer - 6.4761904762e+00 fillHoles integer - 5.3333333333e+00 recon integer - 5.7142857143e+00 water integer + 6.4761904762e+00 fillHolesConnectivity integer + 5.3333333333e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -12371,13 +12371,13 @@ Parameters for evaluation 385: 4.4285714286e+01 minSizePl integer 3.1714285714e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 7.6190476190e+00 fillHoles integer - 6.0952380952e+00 recon integer - 5.5238095238e+00 water integer + 7.6190476190e+00 fillHolesConnectivity integer + 6.0952380952e+00 reconConnectivity integer + 5.5238095238e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -12403,13 +12403,13 @@ Parameters for evaluation 386: 4.4285714286e+01 minSizePl integer 3.1714285714e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 7.6190476190e+00 fillHoles integer - 6.0952380952e+00 recon integer - 5.5238095238e+00 water integer + 7.6190476190e+00 fillHolesConnectivity integer + 6.0952380952e+00 reconConnectivity integer + 5.5238095238e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -12435,13 +12435,13 @@ Parameters for evaluation 387: 4.4285714286e+01 minSizePl integer 3.1714285714e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 7.6190476190e+00 fillHoles integer - 6.0952380952e+00 recon integer - 5.5238095238e+00 water integer + 7.6190476190e+00 fillHolesConnectivity integer + 6.0952380952e+00 reconConnectivity integer + 5.5238095238e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -12467,13 +12467,13 @@ Parameters for evaluation 388: 4.4285714286e+01 minSizePl integer 3.1714285714e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 7.6190476190e+00 fillHoles integer - 6.0952380952e+00 recon integer - 5.5238095238e+00 water integer + 7.6190476190e+00 fillHolesConnectivity integer + 6.0952380952e+00 reconConnectivity integer + 5.5238095238e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -12499,13 +12499,13 @@ Parameters for evaluation 389: 5.0000000000e+00 minSizePl integer 3.1714285714e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 7.6190476190e+00 fillHoles integer - 6.0952380952e+00 recon integer - 5.5238095238e+00 water integer + 7.6190476190e+00 fillHolesConnectivity integer + 6.0952380952e+00 reconConnectivity integer + 5.5238095238e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -12531,13 +12531,13 @@ Parameters for evaluation 390: 5.0000000000e+00 minSizePl integer 3.1714285714e+01 minSizeSeg integer 1.4428571429e+03 maxSizeSeg integer - 7.6190476190e+00 fillHoles integer - 6.0952380952e+00 recon integer - 5.5238095238e+00 water integer + 7.6190476190e+00 fillHolesConnectivity integer + 6.0952380952e+00 reconConnectivity integer + 5.5238095238e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -12563,13 +12563,13 @@ Parameters for evaluation 391: 5.0000000000e+00 minSizePl integer 3.1714285714e+01 minSizeSeg integer 1.1285714286e+03 maxSizeSeg integer - 7.6190476190e+00 fillHoles integer - 6.0952380952e+00 recon integer - 5.5238095238e+00 water integer + 7.6190476190e+00 fillHolesConnectivity integer + 6.0952380952e+00 reconConnectivity integer + 5.5238095238e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -12595,13 +12595,13 @@ Parameters for evaluation 392: 5.0000000000e+00 minSizePl integer 3.1714285714e+01 minSizeSeg integer 1.1285714286e+03 maxSizeSeg integer - 7.6190476190e+00 fillHoles integer - 4.0000000000e+00 recon integer - 5.5238095238e+00 water integer + 7.6190476190e+00 fillHolesConnectivity integer + 4.0000000000e+00 reconConnectivity integer + 5.5238095238e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -12627,13 +12627,13 @@ Parameters for evaluation 393: 5.0000000000e+00 minSizePl integer 3.1714285714e+01 minSizeSeg integer 1.1285714286e+03 maxSizeSeg integer - 7.6190476190e+00 fillHoles integer - 4.0000000000e+00 recon integer - 5.5238095238e+00 water integer + 7.6190476190e+00 fillHolesConnectivity integer + 4.0000000000e+00 reconConnectivity integer + 5.5238095238e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -12659,13 +12659,13 @@ Parameters for evaluation 394: 5.0000000000e+00 minSizePl integer 3.1714285714e+01 minSizeSeg integer 1.1285714286e+03 maxSizeSeg integer - 7.6190476190e+00 fillHoles integer - 4.0000000000e+00 recon integer - 5.5238095238e+00 water integer + 7.6190476190e+00 fillHolesConnectivity integer + 4.0000000000e+00 reconConnectivity integer + 5.5238095238e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -12691,13 +12691,13 @@ Parameters for evaluation 395: 5.0000000000e+00 minSizePl integer 3.1714285714e+01 minSizeSeg integer 1.1285714286e+03 maxSizeSeg integer - 7.6190476190e+00 fillHoles integer - 4.0000000000e+00 recon integer - 5.5238095238e+00 water integer + 7.6190476190e+00 fillHolesConnectivity integer + 4.0000000000e+00 reconConnectivity integer + 5.5238095238e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -12723,13 +12723,13 @@ Parameters for evaluation 396: 5.0000000000e+00 minSizePl integer 7.2571428571e+01 minSizeSeg integer 1.1285714286e+03 maxSizeSeg integer - 7.6190476190e+00 fillHoles integer - 4.0000000000e+00 recon integer - 5.5238095238e+00 water integer + 7.6190476190e+00 fillHolesConnectivity integer + 4.0000000000e+00 reconConnectivity integer + 5.5238095238e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -12755,13 +12755,13 @@ Parameters for evaluation 397: 5.0000000000e+00 minSizePl integer 7.2571428571e+01 minSizeSeg integer 1.1285714286e+03 maxSizeSeg integer - 7.6190476190e+00 fillHoles integer - 4.0000000000e+00 recon integer - 5.5238095238e+00 water integer + 7.6190476190e+00 fillHolesConnectivity integer + 4.0000000000e+00 reconConnectivity integer + 5.5238095238e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -12787,13 +12787,13 @@ Parameters for evaluation 398: 5.0000000000e+00 minSizePl integer 7.2571428571e+01 minSizeSeg integer 1.1285714286e+03 maxSizeSeg integer - 7.6190476190e+00 fillHoles integer - 4.0000000000e+00 recon integer - 5.5238095238e+00 water integer + 7.6190476190e+00 fillHolesConnectivity integer + 4.0000000000e+00 reconConnectivity integer + 5.5238095238e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -12819,13 +12819,13 @@ Parameters for evaluation 399: 5.0000000000e+00 minSizePl integer 7.2571428571e+01 minSizeSeg integer 1.1285714286e+03 maxSizeSeg integer - 7.6190476190e+00 fillHoles integer - 4.0000000000e+00 recon integer - 7.6190476190e+00 water integer + 7.6190476190e+00 fillHolesConnectivity integer + 4.0000000000e+00 reconConnectivity integer + 7.6190476190e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -12851,13 +12851,13 @@ Parameters for evaluation 400: 5.0000000000e+00 minSizePl integer 7.2571428571e+01 minSizeSeg integer 1.1285714286e+03 maxSizeSeg integer - 5.5238095238e+00 fillHoles integer - 4.0000000000e+00 recon integer - 7.6190476190e+00 water integer + 5.5238095238e+00 fillHolesConnectivity integer + 4.0000000000e+00 reconConnectivity integer + 7.6190476190e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -12883,13 +12883,13 @@ Parameters for evaluation 401: 8.0000000000e+01 minSizePl integer 5.0285714286e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 7.6190476190e+00 recon integer - 5.3333333333e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 7.6190476190e+00 reconConnectivity integer + 5.3333333333e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -12915,13 +12915,13 @@ Parameters for evaluation 402: 8.0000000000e+01 minSizePl integer 5.0285714286e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 7.6190476190e+00 recon integer - 5.3333333333e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 7.6190476190e+00 reconConnectivity integer + 5.3333333333e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -12947,13 +12947,13 @@ Parameters for evaluation 403: 8.0000000000e+01 minSizePl integer 5.0285714286e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 7.6190476190e+00 recon integer - 5.3333333333e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 7.6190476190e+00 reconConnectivity integer + 5.3333333333e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -12979,13 +12979,13 @@ Parameters for evaluation 404: 8.0000000000e+01 minSizePl integer 5.0285714286e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 7.6190476190e+00 recon integer - 7.4285714286e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 7.6190476190e+00 reconConnectivity integer + 7.4285714286e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -13011,13 +13011,13 @@ Parameters for evaluation 405: 8.0000000000e+01 minSizePl integer 5.0285714286e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 7.6190476190e+00 recon integer - 7.4285714286e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 7.6190476190e+00 reconConnectivity integer + 7.4285714286e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -13043,13 +13043,13 @@ Parameters for evaluation 406: 8.0000000000e+01 minSizePl integer 5.0285714286e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 7.6190476190e+00 recon integer - 7.4285714286e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 7.6190476190e+00 reconConnectivity integer + 7.4285714286e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -13075,13 +13075,13 @@ Parameters for evaluation 407: 8.0000000000e+01 minSizePl integer 5.0285714286e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 7.6190476190e+00 recon integer - 7.4285714286e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 7.6190476190e+00 reconConnectivity integer + 7.4285714286e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -13107,13 +13107,13 @@ Parameters for evaluation 408: 8.0000000000e+01 minSizePl integer 5.0285714286e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 7.6190476190e+00 recon integer - 7.4285714286e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 7.6190476190e+00 reconConnectivity integer + 7.4285714286e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -13139,13 +13139,13 @@ Parameters for evaluation 409: 8.0000000000e+01 minSizePl integer 5.0285714286e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 7.6190476190e+00 recon integer - 7.4285714286e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 7.6190476190e+00 reconConnectivity integer + 7.4285714286e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -13171,13 +13171,13 @@ Parameters for evaluation 410: 8.0000000000e+01 minSizePl integer 9.4285714286e+00 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 7.6190476190e+00 recon integer - 7.4285714286e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 7.6190476190e+00 reconConnectivity integer + 7.4285714286e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -13203,13 +13203,13 @@ Parameters for evaluation 411: 8.0000000000e+01 minSizePl integer 9.4285714286e+00 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 7.6190476190e+00 recon integer - 7.4285714286e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 7.6190476190e+00 reconConnectivity integer + 7.4285714286e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -13235,13 +13235,13 @@ Parameters for evaluation 412: 8.0000000000e+01 minSizePl integer 9.4285714286e+00 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 7.6190476190e+00 recon integer - 7.4285714286e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 7.6190476190e+00 reconConnectivity integer + 7.4285714286e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -13267,13 +13267,13 @@ Parameters for evaluation 413: 4.0714285714e+01 minSizePl integer 9.4285714286e+00 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 7.6190476190e+00 recon integer - 7.4285714286e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 7.6190476190e+00 reconConnectivity integer + 7.4285714286e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -13299,13 +13299,13 @@ Parameters for evaluation 414: 4.0714285714e+01 minSizePl integer 9.4285714286e+00 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 7.6190476190e+00 recon integer - 7.4285714286e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 7.6190476190e+00 reconConnectivity integer + 7.4285714286e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -13331,13 +13331,13 @@ Parameters for evaluation 415: 4.0714285714e+01 minSizePl integer 9.4285714286e+00 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 4.3809523810e+00 fillHoles integer - 5.5238095238e+00 recon integer - 7.4285714286e+00 water integer + 4.3809523810e+00 fillHolesConnectivity integer + 5.5238095238e+00 reconConnectivity integer + 7.4285714286e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -13363,13 +13363,13 @@ Parameters for evaluation 416: 4.0714285714e+01 minSizePl integer 9.4285714286e+00 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 6.4761904762e+00 fillHoles integer - 5.5238095238e+00 recon integer - 7.4285714286e+00 water integer + 6.4761904762e+00 fillHolesConnectivity integer + 5.5238095238e+00 reconConnectivity integer + 7.4285714286e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -13395,13 +13395,13 @@ Parameters for evaluation 417: 5.0000000000e+00 minSizePl integer 5.4000000000e+01 minSizeSeg integer 1.5000000000e+03 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 4.3809523810e+00 recon integer - 7.8095238095e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -13427,13 +13427,13 @@ Parameters for evaluation 418: 5.0000000000e+00 minSizePl integer 5.4000000000e+01 minSizeSeg integer 1.5000000000e+03 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 4.3809523810e+00 recon integer - 7.8095238095e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -13459,13 +13459,13 @@ Parameters for evaluation 419: 5.0000000000e+00 minSizePl integer 5.4000000000e+01 minSizeSeg integer 1.5000000000e+03 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 4.3809523810e+00 recon integer - 7.8095238095e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 7.8095238095e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -13491,13 +13491,13 @@ Parameters for evaluation 420: 5.0000000000e+00 minSizePl integer 5.4000000000e+01 minSizeSeg integer 1.5000000000e+03 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 4.3809523810e+00 recon integer - 5.7142857143e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -13523,13 +13523,13 @@ Parameters for evaluation 421: 5.0000000000e+00 minSizePl integer 5.4000000000e+01 minSizeSeg integer 1.5000000000e+03 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 4.3809523810e+00 recon integer - 5.7142857143e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -13555,13 +13555,13 @@ Parameters for evaluation 422: 5.0000000000e+00 minSizePl integer 5.4000000000e+01 minSizeSeg integer 1.5000000000e+03 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 4.3809523810e+00 recon integer - 5.7142857143e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -13587,13 +13587,13 @@ Parameters for evaluation 423: 4.4285714286e+01 minSizePl integer 5.4000000000e+01 minSizeSeg integer 1.5000000000e+03 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 4.3809523810e+00 recon integer - 5.7142857143e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -13619,13 +13619,13 @@ Parameters for evaluation 424: 4.4285714286e+01 minSizePl integer 5.4000000000e+01 minSizeSeg integer 1.5000000000e+03 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 4.3809523810e+00 recon integer - 5.7142857143e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -13651,13 +13651,13 @@ Parameters for evaluation 425: 4.4285714286e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.5000000000e+03 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 4.3809523810e+00 recon integer - 5.7142857143e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -13683,13 +13683,13 @@ Parameters for evaluation 426: 4.4285714286e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.5000000000e+03 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 4.3809523810e+00 recon integer - 5.7142857143e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -13715,13 +13715,13 @@ Parameters for evaluation 427: 4.4285714286e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.5000000000e+03 maxSizeSeg integer - 7.8095238095e+00 fillHoles integer - 4.3809523810e+00 recon integer - 5.7142857143e+00 water integer + 7.8095238095e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -13747,13 +13747,13 @@ Parameters for evaluation 428: 4.4285714286e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.5000000000e+03 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 4.3809523810e+00 recon integer - 5.7142857143e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -13779,13 +13779,13 @@ Parameters for evaluation 429: 4.4285714286e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.1857142857e+03 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 4.3809523810e+00 recon integer - 5.7142857143e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -13811,13 +13811,13 @@ Parameters for evaluation 430: 4.4285714286e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.1857142857e+03 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 4.3809523810e+00 recon integer - 5.7142857143e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -13843,13 +13843,13 @@ Parameters for evaluation 431: 4.4285714286e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.1857142857e+03 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 6.4761904762e+00 recon integer - 5.7142857143e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -13875,13 +13875,13 @@ Parameters for evaluation 432: 4.4285714286e+01 minSizePl integer 1.3142857143e+01 minSizeSeg integer 1.1857142857e+03 maxSizeSeg integer - 5.7142857143e+00 fillHoles integer - 6.4761904762e+00 recon integer - 5.7142857143e+00 water integer + 5.7142857143e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 5.7142857143e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -13907,13 +13907,13 @@ Parameters for evaluation 433: 7.6428571429e+01 minSizePl integer 7.2571428571e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 4.1904761905e+00 fillHoles integer - 4.3809523810e+00 recon integer - 6.8571428571e+00 water integer + 4.1904761905e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 6.8571428571e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -13939,13 +13939,13 @@ Parameters for evaluation 434: 7.6428571429e+01 minSizePl integer 7.2571428571e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 4.1904761905e+00 fillHoles integer - 4.3809523810e+00 recon integer - 6.8571428571e+00 water integer + 4.1904761905e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 6.8571428571e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -13971,13 +13971,13 @@ Parameters for evaluation 435: 3.7142857143e+01 minSizePl integer 7.2571428571e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 4.1904761905e+00 fillHoles integer - 4.3809523810e+00 recon integer - 6.8571428571e+00 water integer + 4.1904761905e+00 fillHolesConnectivity integer + 4.3809523810e+00 reconConnectivity integer + 6.8571428571e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -14003,13 +14003,13 @@ Parameters for evaluation 436: 3.7142857143e+01 minSizePl integer 7.2571428571e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 4.1904761905e+00 fillHoles integer - 6.4761904762e+00 recon integer - 6.8571428571e+00 water integer + 4.1904761905e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 6.8571428571e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -14035,13 +14035,13 @@ Parameters for evaluation 437: 3.7142857143e+01 minSizePl integer 7.2571428571e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 4.1904761905e+00 fillHoles integer - 6.4761904762e+00 recon integer - 6.8571428571e+00 water integer + 4.1904761905e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 6.8571428571e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -14067,13 +14067,13 @@ Parameters for evaluation 438: 3.7142857143e+01 minSizePl integer 7.2571428571e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 4.1904761905e+00 fillHoles integer - 6.4761904762e+00 recon integer - 6.8571428571e+00 water integer + 4.1904761905e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 6.8571428571e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -14099,13 +14099,13 @@ Parameters for evaluation 439: 3.7142857143e+01 minSizePl integer 3.1714285714e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 4.1904761905e+00 fillHoles integer - 6.4761904762e+00 recon integer - 6.8571428571e+00 water integer + 4.1904761905e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 6.8571428571e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -14131,13 +14131,13 @@ Parameters for evaluation 440: 3.7142857143e+01 minSizePl integer 3.1714285714e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 4.1904761905e+00 fillHoles integer - 6.4761904762e+00 recon integer - 6.8571428571e+00 water integer + 4.1904761905e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 6.8571428571e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -14163,13 +14163,13 @@ Parameters for evaluation 441: 3.7142857143e+01 minSizePl integer 3.1714285714e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 4.1904761905e+00 fillHoles integer - 6.4761904762e+00 recon integer - 6.8571428571e+00 water integer + 4.1904761905e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 6.8571428571e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -14195,13 +14195,13 @@ Parameters for evaluation 442: 3.7142857143e+01 minSizePl integer 3.1714285714e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 6.2857142857e+00 fillHoles integer - 6.4761904762e+00 recon integer - 6.8571428571e+00 water integer + 6.2857142857e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 6.8571428571e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -14227,13 +14227,13 @@ Parameters for evaluation 443: 3.7142857143e+01 minSizePl integer 3.1714285714e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 6.2857142857e+00 fillHoles integer - 6.4761904762e+00 recon integer - 6.8571428571e+00 water integer + 6.2857142857e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 6.8571428571e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -14259,13 +14259,13 @@ Parameters for evaluation 444: 3.7142857143e+01 minSizePl integer 3.1714285714e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 6.2857142857e+00 fillHoles integer - 6.4761904762e+00 recon integer - 6.8571428571e+00 water integer + 6.2857142857e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 6.8571428571e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -14291,13 +14291,13 @@ Parameters for evaluation 445: 3.7142857143e+01 minSizePl integer 3.1714285714e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 6.2857142857e+00 fillHoles integer - 6.4761904762e+00 recon integer - 6.8571428571e+00 water integer + 6.2857142857e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 6.8571428571e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -14323,13 +14323,13 @@ Parameters for evaluation 446: 3.7142857143e+01 minSizePl integer 3.1714285714e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 6.2857142857e+00 fillHoles integer - 6.4761904762e+00 recon integer - 4.7619047619e+00 water integer + 6.2857142857e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 4.7619047619e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -14355,13 +14355,13 @@ Parameters for evaluation 447: 3.7142857143e+01 minSizePl integer 3.1714285714e+01 minSizeSeg integer 9.0000000000e+02 maxSizeSeg integer - 6.2857142857e+00 fillHoles integer - 6.4761904762e+00 recon integer - 4.7619047619e+00 water integer + 6.2857142857e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 4.7619047619e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -14387,13 +14387,13 @@ Parameters for evaluation 448: 3.7142857143e+01 minSizePl integer 3.1714285714e+01 minSizeSeg integer 1.2142857143e+03 maxSizeSeg integer - 6.2857142857e+00 fillHoles integer - 6.4761904762e+00 recon integer - 4.7619047619e+00 water integer + 6.2857142857e+00 fillHolesConnectivity integer + 6.4761904762e+00 reconConnectivity integer + 4.7619047619e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -14419,13 +14419,13 @@ Parameters for evaluation 449: 6.5714285714e+01 minSizePl integer 2.4285714286e+01 minSizeSeg integer 1.1857142857e+03 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 7.8095238095e+00 recon integer - 4.3809523810e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 7.8095238095e+00 reconConnectivity integer + 4.3809523810e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -14451,13 +14451,13 @@ Parameters for evaluation 450: 6.5714285714e+01 minSizePl integer 2.4285714286e+01 minSizeSeg integer 1.1857142857e+03 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 7.8095238095e+00 recon integer - 4.3809523810e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 7.8095238095e+00 reconConnectivity integer + 4.3809523810e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -14483,13 +14483,13 @@ Parameters for evaluation 451: 6.5714285714e+01 minSizePl integer 2.4285714286e+01 minSizeSeg integer 1.1857142857e+03 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 7.8095238095e+00 recon integer - 4.3809523810e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 7.8095238095e+00 reconConnectivity integer + 4.3809523810e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -14515,13 +14515,13 @@ Parameters for evaluation 452: 6.5714285714e+01 minSizePl integer 2.4285714286e+01 minSizeSeg integer 1.1857142857e+03 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 5.7142857143e+00 recon integer - 4.3809523810e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 5.7142857143e+00 reconConnectivity integer + 4.3809523810e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -14547,13 +14547,13 @@ Parameters for evaluation 453: 6.5714285714e+01 minSizePl integer 6.5142857143e+01 minSizeSeg integer 1.1857142857e+03 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 5.7142857143e+00 recon integer - 4.3809523810e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 5.7142857143e+00 reconConnectivity integer + 4.3809523810e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -14579,13 +14579,13 @@ Parameters for evaluation 454: 6.5714285714e+01 minSizePl integer 6.5142857143e+01 minSizeSeg integer 1.5000000000e+03 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 5.7142857143e+00 recon integer - 4.3809523810e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 5.7142857143e+00 reconConnectivity integer + 4.3809523810e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -14611,13 +14611,13 @@ Parameters for evaluation 455: 6.5714285714e+01 minSizePl integer 6.5142857143e+01 minSizeSeg integer 1.5000000000e+03 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 5.7142857143e+00 recon integer - 4.3809523810e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 5.7142857143e+00 reconConnectivity integer + 4.3809523810e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -14643,13 +14643,13 @@ Parameters for evaluation 456: 6.5714285714e+01 minSizePl integer 6.5142857143e+01 minSizeSeg integer 1.5000000000e+03 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 5.7142857143e+00 recon integer - 4.3809523810e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 5.7142857143e+00 reconConnectivity integer + 4.3809523810e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -14675,13 +14675,13 @@ Parameters for evaluation 457: 6.5714285714e+01 minSizePl integer 6.5142857143e+01 minSizeSeg integer 1.5000000000e+03 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 5.7142857143e+00 recon integer - 6.4761904762e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 5.7142857143e+00 reconConnectivity integer + 6.4761904762e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out @@ -14707,12 +14707,12 @@ Parameters for evaluation 458: 6.5714285714e+01 minSizePl integer 6.5142857143e+01 minSizeSeg integer 1.5000000000e+03 maxSizeSeg integer - 6.0952380952e+00 fillHoles integer - 5.7142857143e+00 recon integer - 6.4761904762e+00 water integer + 6.0952380952e+00 fillHolesConnectivity integer + 5.7142857143e+00 reconConnectivity integer + 6.4761904762e+00 watershedConnectivity integer [0.26235,0.0514831,0.0114217] target_std floatarray [-0.632356,-0.0516004,0.0376543] target_mean floatarray - /home/willian/Desktop/images15/image3.tiff input_img string - /home/willian/Desktop/images15/image3.mask.png input_ref_img string + /home/will/Desktop/images15/image3.tiff input_img rt + /home/will/Desktop/images15/image3.mask.png input_ref_img rt blocking fork: simulator_script params.in results.out end From 5aa2b210535b106d4198c775d7efe6fc12715303 Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Mon, 26 Sep 2016 12:07:30 -0300 Subject: [PATCH 51/87] Fixed non-enforced task dependency bug: The tasks were being sent on the wrong order by the Segmentation::run method, thus, creating a racing condition --- .../examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp index d9ae859..588c41d 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp @@ -115,6 +115,7 @@ int Segmentation::run() { map prev_map; + list ordered_tasks; for (list::reverse_iterator task=tasks.rbegin(); task!=tasks.rend(); task++) { // generate a task copy and update the DR, getting the actual data ReusableTask* t = (*task)->clone(); @@ -131,12 +132,12 @@ int Segmentation::run() { // add this task to parent list for future dependency resolution prev_map[t->getId()] = t; - t->run(); + ordered_tasks.emplace_back(t); } // send all tasks to be executed - // for (pair p : prev_map) - // this->executeTask(p.second); + for (ReusableTask* t : ordered_tasks) + this->executeTask(t); return 0; } From 74b43b51144fb19c6cee9c04d382e0967f310b31 Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Mon, 26 Sep 2016 18:31:33 -0300 Subject: [PATCH 52/87] Stage-task code generation: Header generator reimplemented and tested. Also, found a little bug: the workflow_output map is empty, however, all workflows are running propperly. --- .../PipelineRTFS-NS-Diff-FGO/Segmentation.hpp | 71 +++++++-------- .../PipelineRTFS-NS-Diff-FGO/gen/gen.cpp | 91 +++++++++++-------- .../gen/header_task_template | 32 +++++++ .../gen/header_template | 23 ++--- .../gen/segmentation_desc | 2 +- 5 files changed, 129 insertions(+), 90 deletions(-) create mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/header_task_template diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp index d79aba8..4846bc1 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp @@ -27,10 +27,7 @@ class Segmentation : public RTPipelineComponentBase { // IMPORTANT: this need to be set during the creation of this object int workflow_id; - std::list mergable_t1; - public: - Segmentation(); virtual ~Segmentation(); @@ -41,9 +38,14 @@ class Segmentation : public RTPipelineComponentBase { int run(); }; -// Task1Segmentation header +/**************************************************************************************/ +/*********************************** Task functions ***********************************/ +/**************************************************************************************/ + +// TaskSegmentation0 header class TaskSegmentation0: public ReusableTask { -friend class TaskSegmentation1; + friend class TaskSegmentation1; + private: // all parameters @@ -52,7 +54,7 @@ friend class TaskSegmentation1; unsigned char red; double T1; double T2; - + // intertask arguments std::shared_ptr> bgr; std::shared_ptr rbc; @@ -80,24 +82,22 @@ friend class TaskSegmentation1; void print(); }; - -// Task2Segmentation header +// TaskSegmentation1 header class TaskSegmentation1: public ReusableTask { -friend class TaskSegmentation2; + friend class TaskSegmentation2; + private: // all parameters int reconConnectivity; - + // intertask arguments std::shared_ptr> bgr; + std::shared_ptr rbc_fw; std::shared_ptr rc; std::shared_ptr rc_recon; std::shared_ptr rc_open; - // forward intertask arguments - std::shared_ptr rbc_fw; - public: // data regions @@ -120,26 +120,24 @@ friend class TaskSegmentation2; void print(); }; - // TaskSegmentation2 header class TaskSegmentation2: public ReusableTask { -friend class TaskSegmentation3; + friend class TaskSegmentation3; + private: // all parameters int fillHolesConnectivity; - unsigned char G1; - + int G1; + // intertask arguments std::shared_ptr rc; std::shared_ptr rc_recon; std::shared_ptr rc_open; + std::shared_ptr rbc_fw; std::shared_ptr bw1; std::shared_ptr diffIm; - // forward intertask arguments - std::shared_ptr rbc_fw; - public: // data regions @@ -162,23 +160,21 @@ friend class TaskSegmentation3; void print(); }; - // TaskSegmentation3 header class TaskSegmentation3: public ReusableTask { -friend class TaskSegmentation4; + friend class TaskSegmentation4; + private: // all parameters int minSize; int maxSize; - + // intertask arguments std::shared_ptr bw1; - std::shared_ptr bw1_t; - - // forward intertask arguments std::shared_ptr rbc_fw; std::shared_ptr diffIm_fw; + std::shared_ptr bw1_t; public: // data regions @@ -202,15 +198,15 @@ friend class TaskSegmentation4; void print(); }; - // TaskSegmentation4 header class TaskSegmentation4: public ReusableTask { -friend class TaskSegmentation5; + friend class TaskSegmentation5; + private: // all parameters - unsigned char G2; - + int G2; + // intertask arguments std::shared_ptr diffIm; std::shared_ptr bw1_t; @@ -239,16 +235,16 @@ friend class TaskSegmentation5; void print(); }; - -// Task5Segmentation5 header +// TaskSegmentation5 header class TaskSegmentation5: public ReusableTask { -friend class TaskSegmentation6; + friend class TaskSegmentation6; + private: // all parameters int minSizePl; int watershedConnectivity; - + // intertask arguments std::shared_ptr seg_open; std::shared_ptr seg_nonoverlap; @@ -276,18 +272,18 @@ friend class TaskSegmentation6; void print(); }; - // TaskSegmentation6 header class TaskSegmentation6: public ReusableTask { + + private: // all parameters int minSizeSeg; int maxSizeSeg; int fillHolesConnectivity; - + // intertask arguments - std::shared_ptr seg_open; std::shared_ptr seg_nonoverlap; public: @@ -314,4 +310,5 @@ class TaskSegmentation6: public ReusableTask { void print(); }; + #endif /* Segmentation_H_ */ diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/gen.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/gen.cpp index c640156..069409a 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/gen.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/gen.cpp @@ -58,18 +58,16 @@ int main(int argc, char** argv) { string name = data["name"].asString(); - // string header = generate_header(data); - // std::ofstream header_file(string(name + ".hpp")); - // header_file << header; - // header_file.close(); + string header = generate_header(data); + std::ofstream header_file(string(name + ".hpp")); + header_file << header; + header_file.close(); string source = generate_source(data); std::ofstream source_file(string(name + ".cpp")); source_file << source; source_file.close(); - // TODO: get descriptor from argv - // cout << source << endl; } @@ -80,31 +78,59 @@ string generate_header(Json::Value data) { // get includes string string includes = data["includes"].asString(); - // generate DataRegion variables string - string dataRegionVariables; - string dataRegionVariablesNames; - for (int i=0; i " + data["tasks"][i]["interstage_args"][j]["name"].asString() + "_fw;\n"; + } else { + intertask_args += "\tstd::shared_ptr<" + + getMatDRType(data["tasks"][i]["interstage_args"][j]["type"].asString()) + + "> " + data["tasks"][i]["interstage_args"][j]["name"].asString() + ";\n"; + } } - // remove last comma from commonVariablesNames - size_t pos; - commonVariablesNames.erase(commonVariablesNames.length()-2, 2); + // open task_header_template file + char* line; + size_t length=0; + FILE* task_header_template = fopen("header_task_template", "r"); + + // concat all task_header_template lines + string task_header; + while(getline(&line, &length, task_header_template) != -1) + task_header += string(line); + + replace_multiple_string(task_header, "$NAME$", name+to_string(i)); + replace_multiple_string(task_header, "$FRIEND_TASK$", task_friend); + replace_multiple_string(task_header, "$ARGS$", args); + replace_multiple_string(task_header, "$INTERTASK_ARGS$", intertask_args); + replace_multiple_string(task_header, "$DR_ARGS$", dr_args); + + tasks += task_header; + + } // open header file char* line; @@ -118,20 +144,13 @@ string generate_header(Json::Value data) { // add includes - pos = header.find("$INCLUDES$"); - header.erase(pos, 10); - header.insert(pos, includes); + replace_multiple_string(header, "$INCLUDES$", includes); // add filename replace_multiple_string(header, "$NAME$", name); // add DataRegions - replace_multiple_string(header, "$DR_VARS$", dataRegionVariables); - replace_multiple_string(header, "$DR_VARS_NAMES$", dataRegionVariablesNames); - - // add other variables - replace_multiple_string(header, "$COMMON_VARS$", commonVariables); - replace_multiple_string(header, "$COMMON_VARS_NAMES$", commonVariablesNames); + replace_multiple_string(header, "$TASKS$", tasks); return header; diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/header_task_template b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/header_task_template new file mode 100644 index 0000000..e8d1036 --- /dev/null +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/header_task_template @@ -0,0 +1,32 @@ +// Task$NAME$ header +class Task$NAME$: public ReusableTask { +$FRIEND_TASK$ + +private: + + // all parameters +$ARGS$ + // intertask arguments +$INTERTASK_ARGS$ +public: + // data regions +$DR_ARGS$ + Task$NAME$(); + Task$NAME$(list args, RegionTemplate* inputRt); + + virtual ~Task$NAME$(); + + bool run(int procType=ExecEngineConstants::CPU, int tid=0); + + bool reusable(ReusableTask* t); + void updateDR(RegionTemplate* rt); + void updateInterStageArgs(ReusableTask* t); + void resolveDependencies(ReusableTask* t); + + int serialize(char *buff); + int deserialize(char *buff); + ReusableTask* clone(); + int size(); + + void print(); +}; diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/header_template b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/header_template index 7bdb1d2..f21d37c 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/header_template +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/header_template @@ -13,6 +13,7 @@ #include "FileUtils.h" #include "Task.h" #include "DenseDataRegion2D.h" +#include "ReusableTask.hpp" $INCLUDES$ @@ -30,25 +31,15 @@ public: void set_workflow_id(int id) {workflow_id = id;}; + void print(); + int run(); }; -// Task header -class Task$NAME$: public Task { -private: - - // data regions -$DR_VARS$ - - // all other variables -$COMMON_VARS$ +/**************************************************************************************/ +/*********************************** Task functions ***********************************/ +/**************************************************************************************/ -public: - Task$NAME$($DR_VARS_NAMES$$COMMON_VARS_NAMES$); - - virtual ~Task$NAME$(); - - bool run(int procType=ExecEngineConstants::CPU, int tid=0); -}; +$TASKS$ #endif /* $NAME$_H_ */ diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/segmentation_desc b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/segmentation_desc index a2df58b..fe9f7df 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/segmentation_desc +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/segmentation_desc @@ -38,7 +38,7 @@ ], "interstage_args":[ {"name":"rc", "type":"mat", "io":"input"}, - {"name":"rc_recon", "type":"mxat", "io":"input"}, + {"name":"rc_recon", "type":"mat", "io":"input"}, {"name":"rc_open", "type":"mat", "io":"input"}, {"name":"rbc", "type":"mat", "io":"forward"}, {"name":"bw1", "type":"mat", "io":"output"}, From e929216a3d85016d202a847f72cb66c897df9b6e Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Mon, 26 Sep 2016 19:28:43 -0300 Subject: [PATCH 53/87] Finished and tested the stage-task code generator. --- .../PipelineRTFS-NS-Diff-FGO/Segmentation.cpp | 329 ++++++------------ .../PipelineRTFS-NS-Diff-FGO/gen/Makefile | 20 +- .../examples/PipelineRTFS-NS-Diff-FGO/gen/gen | Bin 492209 -> 0 bytes .../PipelineRTFS-NS-Diff-FGO/gen/gen.cpp | 81 +++-- .../gen/source_task_template | 4 +- .../gen/source_template | 14 +- 6 files changed, 160 insertions(+), 288 deletions(-) delete mode 100755 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/gen diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp index 588c41d..144a16f 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp @@ -106,7 +106,7 @@ Segmentation::~Segmentation() {} int Segmentation::run() { // Print name and id of the component instance - std::cout << "\t\t\tExecuting component: " << this->getComponentName() << " instance id: " << this->getId() <getComponentName() << " instance id: " << this->getId() <getRegionTemplateInstance("tile"); this->addInputOutputDataRegion("tile", "normalized_rt", RTPipelineComponentBase::INPUT); @@ -117,12 +117,11 @@ int Segmentation::run() { map prev_map; list ordered_tasks; for (list::reverse_iterator task=tasks.rbegin(); task!=tasks.rend(); task++) { + cout << "[Segmentation] sending task " << (*task)->getId() << endl; // generate a task copy and update the DR, getting the actual data ReusableTask* t = (*task)->clone(); t->updateDR(inputRt); - cout << "\t\t\t[Segmentation] sending task " << (*task)->getId() << endl; - // solve dependency if it isn't the first task if (t->parentTask != -1) { cout << "\t\t\t[Segmentation] setting dep of " << t->getId() << " to " << prev_map[t->parentTask]->getId() << endl; @@ -136,8 +135,10 @@ int Segmentation::run() { } // send all tasks to be executed - for (ReusableTask* t : ordered_tasks) + for (ReusableTask* t : ordered_tasks) { + cout << "\t\t\t[Segmentation] sending task " << t->getId() << endl; this->executeTask(t); + } return 0; } @@ -156,8 +157,8 @@ bool registeredSegmentation = PipelineComponentBase::ComponentFactory::component /**************************************************************************************/ TaskSegmentation0::TaskSegmentation0() { - bgr = std::shared_ptr>(new std::vector()); - rbc = std::shared_ptr(new cv::Mat()); + bgr = std::shared_ptr>(new std::vector); + rbc = std::shared_ptr(new cv::Mat); } @@ -205,43 +206,34 @@ TaskSegmentation0::TaskSegmentation0(list args, RegionTemplate* i if (set_cout < args.size()) std::cout << __FILE__ << ":" << __LINE__ <<" Missing common arguments on Segmentation" << std::endl; - bgr = std::shared_ptr>(new std::vector()); - rbc = std::shared_ptr(new cv::Mat()); + bgr = std::shared_ptr>(new std::vector); + rbc = std::shared_ptr(new cv::Mat); } -TaskSegmentation0::~TaskSegmentation0() { - //std::cout << "bgr: " << to_string(bgr.use_count()) << " = " << &*bgr << endl; - //std::cout << "rbc: " << to_string(rbc.use_count()) << " = " << &*rbc << endl; -} +TaskSegmentation0::~TaskSegmentation0() {} bool TaskSegmentation0::run(int procType, int tid) { cv::Mat normalized_rt = (*this->normalized_rt_temp)->getData(); - uint64_t t1 = Util::ClockGetTimeProfile(); - std::cout << "\t\t\tTaskSegmentation0 executing." << std::endl; + std::vector bgr_temp; + cv::Mat rbc_temp; - if (bgr.use_count() <= 0) { - std::cout << "bgr counter is " << bgr.use_count() << std::endl; - exit(-1); - } - if (rbc.use_count() <= 0) { - std::cout << "rbc counter is " << rbc.use_count() << std::endl; - exit(-1); - } + uint64_t t1 = Util::ClockGetTimeProfile(); + + std::cout << "TaskSegmentation0 executing." << std::endl; - ::nscale::HistologicalEntities::segmentNucleiStg1(normalized_rt, blue, green, red, T1, T2, &(*bgr), &(*rbc)); + ::nscale::HistologicalEntities::segmentNucleiStg1(normalized_rt, blue, green, red, T1, T2, &*bgr, &*rbc); uint64_t t2 = Util::ClockGetTimeProfile(); - std::cout << "\t\t\tTask Segmentation0 time elapsed: "<< t2-t1 << std::endl; + std::cout << "Task Segmentation0 time elapsed: "<< t2-t1 << std::endl; } void TaskSegmentation0::updateDR(RegionTemplate* rt) { - normalized_rt_temp = std::make_shared(dynamic_cast( - rt->getDataRegion((*this->normalized_rt_temp)->getName(), + normalized_rt_temp = std::make_shared(dynamic_cast(rt->getDataRegion((*this->normalized_rt_temp)->getName(), (*this->normalized_rt_temp)->getId(), 0, stoi((*this->normalized_rt_temp)->getId())))); } @@ -249,7 +241,7 @@ void TaskSegmentation0::updateDR(RegionTemplate* rt) { void TaskSegmentation0::updateInterStageArgs(ReusableTask* t) { // verify if the tasks are compatible if (typeid(t) != typeid(this)) { - std::cout << "\t\t\t[TaskSegmentation0] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + std::cout << "[TaskSegmentation0] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; return; } @@ -259,7 +251,7 @@ void TaskSegmentation0::updateInterStageArgs(ReusableTask* t) { void TaskSegmentation0::resolveDependencies(ReusableTask* t) { // verify if the task type is compatible if (typeid(t) != typeid(TaskSegmentation1)) { - std::cout << "\t\t\t[TaskSegmentation1] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + std::cout << "[TaskSegmentation1] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; } @@ -288,7 +280,7 @@ bool TaskSegmentation0::reusable(ReusableTask* rt) { int TaskSegmentation0::size() { return sizeof(int) + sizeof(int) + - sizeof(int) + (*normalized_rt_temp)->getName().length()*sizeof(char) + sizeof(int) + + sizeof(int) + (*this->normalized_rt_temp)->getName().length()*sizeof(char) + sizeof(int) + sizeof(unsigned char) + sizeof(unsigned char) + sizeof(unsigned char) + @@ -409,17 +401,17 @@ ReusableTask* TaskSegmentation0::clone() { char *buff = new char[size]; this->serialize(buff); retValue->deserialize(buff); - delete[] buff; + delete buff; return retValue; } void TaskSegmentation0::print() { - cout << "\t\t\tblue: " << blue << endl; - cout << "\t\t\tgreen: " << green << endl; - cout << "\t\t\tred: " << red << endl; - cout << "\t\t\tT1: " << T1 << endl; - cout << "\t\t\tT2: " << T2 << endl; + cout << "blue: " << blue << endl; + cout << "green: " << green << endl; + cout << "red: " << red << endl; + cout << "T1: " << T1 << endl; + cout << "T2: " << T2 << endl; } @@ -438,9 +430,9 @@ bool registeredTaskSegmentation02 = ReusableTask::ReusableTaskFactory::taskRegis &Segmentation0Factory1, &Segmentation0Factory2); TaskSegmentation1::TaskSegmentation1() { - rc = std::shared_ptr(new cv::Mat()); - rc_recon = std::shared_ptr(new cv::Mat()); - rc_open = std::shared_ptr(new cv::Mat()); + rc = std::shared_ptr(new cv::Mat); + rc_recon = std::shared_ptr(new cv::Mat); + rc_open = std::shared_ptr(new cv::Mat); } @@ -458,56 +450,31 @@ TaskSegmentation1::TaskSegmentation1(list args, RegionTemplate* i if (set_cout < args.size()) std::cout << __FILE__ << ":" << __LINE__ <<" Missing common arguments on Segmentation" << std::endl; - rc = std::shared_ptr(new cv::Mat()); - rc_recon = std::shared_ptr(new cv::Mat()); - rc_open = std::shared_ptr(new cv::Mat()); + rc = std::shared_ptr(new cv::Mat); + rc_recon = std::shared_ptr(new cv::Mat); + rc_open = std::shared_ptr(new cv::Mat); } -TaskSegmentation1::~TaskSegmentation1() { - //std::cout << "bgr: " << to_string(bgr.use_count()) << " = " << &*bgr << endl; - //std::cout << "rc: " << to_string(rc.use_count()) << " = " << &*rc << endl; - //std::cout << "rc_recon: " << to_string(rc_recon.use_count()) << " = " << &*rc_recon << endl; - //std::cout << "rc_open: " << to_string(rc_open.use_count()) << " = " << &*rc_open << endl; - //std::cout << "rbc_fw: " << to_string(rbc_fw.use_count()) << " = " << &*rbc_fw << endl; -} +TaskSegmentation1::~TaskSegmentation1() {} bool TaskSegmentation1::run(int procType, int tid) { - uint64_t t1 = Util::ClockGetTimeProfile(); - - std::cout << "\t\t\tTaskSegmentation1 executing." << std::endl; - if (bgr.use_count() <= 0) { - std::cout << "bgr counter is " - << bgr.use_count() << std::endl; - exit(-1); - } - - if (rc.use_count() <= 0) { - std::cout << "rc counter is " - << rc.use_count() << std::endl; - exit(-1); - } + cv::Mat rc_temp; + cv::Mat rc_recon_temp; + cv::Mat rc_open_temp; - if (rc_recon.use_count() <= 0) { - std::cout << "rc_recon counter is " - << rc_recon.use_count() << std::endl; - exit(-1); - } + uint64_t t1 = Util::ClockGetTimeProfile(); - if (rc_open.use_count() <= 0) { - std::cout << "rc_open counter is " - << rc_open.use_count() << std::endl; - exit(-1); - } + std::cout << "TaskSegmentation1 executing." << std::endl; ::nscale::HistologicalEntities::segmentNucleiStg2(reconConnectivity, &*bgr, &*rc, &*rc_recon, &*rc_open); uint64_t t2 = Util::ClockGetTimeProfile(); - std::cout << "\t\t\tTask Segmentation1 time elapsed: "<< t2-t1 << std::endl; + std::cout << "Task Segmentation1 time elapsed: "<< t2-t1 << std::endl; } void TaskSegmentation1::updateDR(RegionTemplate* rt) { @@ -517,7 +484,7 @@ void TaskSegmentation1::updateDR(RegionTemplate* rt) { void TaskSegmentation1::updateInterStageArgs(ReusableTask* t) { // verify if the tasks are compatible if (typeid(t) != typeid(this)) { - std::cout << "\t\t\t[TaskSegmentation1] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + std::cout << "[TaskSegmentation1] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; return; } @@ -529,7 +496,7 @@ void TaskSegmentation1::updateInterStageArgs(ReusableTask* t) { void TaskSegmentation1::resolveDependencies(ReusableTask* t) { // verify if the task type is compatible if (typeid(t) != typeid(TaskSegmentation2)) { - std::cout << "\t\t\t[TaskSegmentation2] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + std::cout << "[TaskSegmentation2] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; } @@ -605,13 +572,13 @@ ReusableTask* TaskSegmentation1::clone() { char *buff = new char[size]; this->serialize(buff); retValue->deserialize(buff); - delete[] buff; + delete buff; return retValue; } void TaskSegmentation1::print() { - cout << "\t\t\treconConnectivity: " << reconConnectivity << endl; + cout << "reconConnectivity: " << reconConnectivity << endl; } @@ -630,8 +597,8 @@ bool registeredTaskSegmentation12 = ReusableTask::ReusableTaskFactory::taskRegis &Segmentation1Factory1, &Segmentation1Factory2); TaskSegmentation2::TaskSegmentation2() { - bw1 = std::shared_ptr(new cv::Mat()); - diffIm = std::shared_ptr(new cv::Mat()); + bw1 = std::shared_ptr(new cv::Mat); + diffIm = std::shared_ptr(new cv::Mat); } @@ -654,58 +621,29 @@ TaskSegmentation2::TaskSegmentation2(list args, RegionTemplate* i if (set_cout < args.size()) std::cout << __FILE__ << ":" << __LINE__ <<" Missing common arguments on Segmentation" << std::endl; - bw1 = std::shared_ptr(new cv::Mat()); - diffIm = std::shared_ptr(new cv::Mat()); + bw1 = std::shared_ptr(new cv::Mat); + diffIm = std::shared_ptr(new cv::Mat); } -TaskSegmentation2::~TaskSegmentation2() { - //std::cout << "rc: " << to_string(rc.use_count()) << " = " << &*rc << endl; - //std::cout << "rc_recon: " << to_string(rc_recon.use_count()) << " = " << &*rc_recon << endl; - //std::cout << "rc_open: " << to_string(rc_open.use_count()) << " = " << &*rc_open << endl; - //std::cout << "bw1: " << to_string(bw1.use_count()) << " = " << &*bw1 << endl; - //std::cout << "diffIm: " << to_string(diffIm.use_count()) << " = " << &*diffIm << endl; - //std::cout << "rbc_fw: " << to_string(rbc_fw.use_count()) << " = " << &*rbc_fw << endl; -} +TaskSegmentation2::~TaskSegmentation2() {} bool TaskSegmentation2::run(int procType, int tid) { - uint64_t t1 = Util::ClockGetTimeProfile(); - std::cout << "\t\t\tTaskSegmentation2 executing." << std::endl; + cv::Mat bw1_temp; + cv::Mat diffIm_temp; - if (rc.use_count() <= 0) { - std::cout << "rc counter is " - << rc.use_count() << std::endl; - exit(-1); - } - if (rc_recon.use_count() <= 0) { - std::cout << "rc_recon counter is " - << rc_recon.use_count() << std::endl; - exit(-1); - } - if (rc_open.use_count() <= 0) { - std::cout << "rc_open counter is " - << rc_open.use_count() << std::endl; - exit(-1); - } - if (bw1.use_count() <= 0) { - std::cout << "bw1 counter is " - << bw1.use_count() << std::endl; - exit(-1); - } - if (diffIm.use_count() <= 0) { - std::cout << "diffIm counter is " - << diffIm.use_count() << std::endl; - exit(-1); - } + uint64_t t1 = Util::ClockGetTimeProfile(); + + std::cout << "TaskSegmentation2 executing." << std::endl; ::nscale::HistologicalEntities::segmentNucleiStg3(fillHolesConnectivity, G1, &*rc, &*rc_recon, &*rc_open, &*bw1, &*diffIm); uint64_t t2 = Util::ClockGetTimeProfile(); - std::cout << "\t\t\tTask Segmentation2 time elapsed: "<< t2-t1 << std::endl; + std::cout << "Task Segmentation2 time elapsed: "<< t2-t1 << std::endl; } void TaskSegmentation2::updateDR(RegionTemplate* rt) { @@ -715,7 +653,7 @@ void TaskSegmentation2::updateDR(RegionTemplate* rt) { void TaskSegmentation2::updateInterStageArgs(ReusableTask* t) { // verify if the tasks are compatible if (typeid(t) != typeid(this)) { - std::cout << "\t\t\t[TaskSegmentation2] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + std::cout << "[TaskSegmentation2] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; return; } @@ -729,7 +667,7 @@ void TaskSegmentation2::updateInterStageArgs(ReusableTask* t) { void TaskSegmentation2::resolveDependencies(ReusableTask* t) { // verify if the task type is compatible if (typeid(t) != typeid(TaskSegmentation3)) { - std::cout << "\t\t\t[TaskSegmentation3] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + std::cout << "[TaskSegmentation3] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; } @@ -817,14 +755,14 @@ ReusableTask* TaskSegmentation2::clone() { char *buff = new char[size]; this->serialize(buff); retValue->deserialize(buff); - delete[] buff; + delete buff; return retValue; } void TaskSegmentation2::print() { - cout << "\t\t\tfillHolesConnectivity: " << fillHolesConnectivity << endl; - cout << "\t\t\tG1: " << G1 << endl; + cout << "fillHolesConnectivity: " << fillHolesConnectivity << endl; + cout << "G1: " << G1 << endl; } @@ -843,7 +781,7 @@ bool registeredTaskSegmentation22 = ReusableTask::ReusableTaskFactory::taskRegis &Segmentation2Factory1, &Segmentation2Factory2); TaskSegmentation3::TaskSegmentation3() { - bw1_t = std::shared_ptr(new cv::Mat()); + bw1_t = std::shared_ptr(new cv::Mat); } @@ -866,16 +804,11 @@ TaskSegmentation3::TaskSegmentation3(list args, RegionTemplate* i if (set_cout < args.size()) std::cout << __FILE__ << ":" << __LINE__ <<" Missing common arguments on Segmentation" << std::endl; - bw1_t = std::shared_ptr(new cv::Mat()); + bw1_t = std::shared_ptr(new cv::Mat); } -TaskSegmentation3::~TaskSegmentation3() { - //std::cout << "bw1: " << to_string(bw1.use_count()) << " = " << &*bw1 << endl; - //std::cout << "bw1_t: " << to_string(bw1_t.use_count()) << " = " << &*bw1_t << endl; - //std::cout << "rbc_fw: " << to_string(rbc_fw.use_count()) << " = " << &*rbc_fw << endl; - //std::cout << "diffIm_fw: " << to_string(diffIm_fw.use_count()) << " = " << &*diffIm_fw << endl; -} +TaskSegmentation3::~TaskSegmentation3() {} bool TaskSegmentation3::run(int procType, int tid) { @@ -884,25 +817,14 @@ bool TaskSegmentation3::run(int procType, int tid) { uint64_t t1 = Util::ClockGetTimeProfile(); - std::cout << "\t\t\tTaskSegmentation3 executing." << std::endl; - - if (bw1.use_count() <= 0) { - std::cout << "bw1 counter is " - << bw1.use_count() << std::endl; - exit(-1); - } - if (bw1_t.use_count() <= 0) { - std::cout << "bw1_t counter is " - << bw1_t.use_count() << std::endl; - exit(-1); - } + std::cout << "TaskSegmentation3 executing." << std::endl; ::nscale::HistologicalEntities::segmentNucleiStg4(minSize, maxSize, &*bw1, &*bw1_t); uint64_t t2 = Util::ClockGetTimeProfile(); - std::cout << "\t\t\tTask Segmentation3 time elapsed: "<< t2-t1 << std::endl; + std::cout << "Task Segmentation3 time elapsed: "<< t2-t1 << std::endl; } void TaskSegmentation3::updateDR(RegionTemplate* rt) { @@ -912,7 +834,7 @@ void TaskSegmentation3::updateDR(RegionTemplate* rt) { void TaskSegmentation3::updateInterStageArgs(ReusableTask* t) { // verify if the tasks are compatible if (typeid(t) != typeid(this)) { - std::cout << "\t\t\t[TaskSegmentation3] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + std::cout << "[TaskSegmentation3] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; return; } @@ -925,7 +847,7 @@ void TaskSegmentation3::updateInterStageArgs(ReusableTask* t) { void TaskSegmentation3::resolveDependencies(ReusableTask* t) { // verify if the task type is compatible if (typeid(t) != typeid(TaskSegmentation4)) { - std::cout << "\t\t\t[TaskSegmentation4] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + std::cout << "[TaskSegmentation4] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; } @@ -1012,14 +934,14 @@ ReusableTask* TaskSegmentation3::clone() { char *buff = new char[size]; this->serialize(buff); retValue->deserialize(buff); - delete[] buff; + delete buff; return retValue; } void TaskSegmentation3::print() { - cout << "\t\t\tminSize: " << minSize << endl; - cout << "\t\t\tmaxSize: " << maxSize << endl; + cout << "minSize: " << minSize << endl; + cout << "maxSize: " << maxSize << endl; } @@ -1038,7 +960,7 @@ bool registeredTaskSegmentation32 = ReusableTask::ReusableTaskFactory::taskRegis &Segmentation3Factory1, &Segmentation3Factory2); TaskSegmentation4::TaskSegmentation4() { - seg_open = std::shared_ptr(new cv::Mat()); + seg_open = std::shared_ptr(new cv::Mat); } @@ -1056,16 +978,11 @@ TaskSegmentation4::TaskSegmentation4(list args, RegionTemplate* i if (set_cout < args.size()) std::cout << __FILE__ << ":" << __LINE__ <<" Missing common arguments on Segmentation" << std::endl; - seg_open = std::shared_ptr(new cv::Mat()); + seg_open = std::shared_ptr(new cv::Mat); } -TaskSegmentation4::~TaskSegmentation4() { - //std::cout << "diffIm: " << to_string(diffIm.use_count()) << " = " << &*diffIm << endl; - //std::cout << "bw1_t: " << to_string(bw1_t.use_count()) << " = " << &*bw1_t << endl; - //std::cout << "rbc: " << to_string(rbc.use_count()) << " = " << &*rbc << endl; - //std::cout << "seg_open: " << to_string(seg_open.use_count()) << " = " << &*seg_open << endl; -} +TaskSegmentation4::~TaskSegmentation4() {} bool TaskSegmentation4::run(int procType, int tid) { @@ -1074,35 +991,14 @@ bool TaskSegmentation4::run(int procType, int tid) { uint64_t t1 = Util::ClockGetTimeProfile(); - std::cout << "\t\t\tTaskSegmentation4 executing." << std::endl; - - if (diffIm.use_count() <= 0) { - std::cout << "diffIm counter is " - << diffIm.use_count() << std::endl; - exit(-1); - } - if (bw1_t.use_count() <= 0) { - std::cout << "bw1_t counter is " - << bw1_t.use_count() << std::endl; - exit(-1); - } - if (rbc.use_count() <= 0) { - std::cout << "rbc counter is " - << rbc.use_count() << std::endl; - exit(-1); - } - if (seg_open.use_count() <= 0) { - std::cout << "seg_open counter is " - << seg_open.use_count() << std::endl; - exit(-1); - } + std::cout << "TaskSegmentation4 executing." << std::endl; ::nscale::HistologicalEntities::segmentNucleiStg5(G2, &*diffIm, &*bw1_t, &*rbc, &*seg_open); uint64_t t2 = Util::ClockGetTimeProfile(); - std::cout << "\t\t\tTask Segmentation4 time elapsed: "<< t2-t1 << std::endl; + std::cout << "Task Segmentation4 time elapsed: "<< t2-t1 << std::endl; } void TaskSegmentation4::updateDR(RegionTemplate* rt) { @@ -1112,7 +1008,7 @@ void TaskSegmentation4::updateDR(RegionTemplate* rt) { void TaskSegmentation4::updateInterStageArgs(ReusableTask* t) { // verify if the tasks are compatible if (typeid(t) != typeid(this)) { - std::cout << "\t\t\t[TaskSegmentation4] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + std::cout << "[TaskSegmentation4] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; return; } @@ -1125,7 +1021,7 @@ void TaskSegmentation4::updateInterStageArgs(ReusableTask* t) { void TaskSegmentation4::resolveDependencies(ReusableTask* t) { // verify if the task type is compatible if (typeid(t) != typeid(TaskSegmentation5)) { - std::cout << "\t\t\t[TaskSegmentation5] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + std::cout << "[TaskSegmentation5] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; } @@ -1202,13 +1098,13 @@ ReusableTask* TaskSegmentation4::clone() { char *buff = new char[size]; this->serialize(buff); retValue->deserialize(buff); - delete[] buff; + delete buff; return retValue; } void TaskSegmentation4::print() { - cout << "\t\t\tG2: " << G2 << endl; + cout << "G2: " << G2 << endl; } @@ -1227,7 +1123,7 @@ bool registeredTaskSegmentation42 = ReusableTask::ReusableTaskFactory::taskRegis &Segmentation4Factory1, &Segmentation4Factory2); TaskSegmentation5::TaskSegmentation5() { - seg_nonoverlap = std::shared_ptr(new cv::Mat()); + seg_nonoverlap = std::shared_ptr(new cv::Mat); } @@ -1260,14 +1156,11 @@ TaskSegmentation5::TaskSegmentation5(list args, RegionTemplate* i if (set_cout < args.size()) std::cout << __FILE__ << ":" << __LINE__ <<" Missing common arguments on Segmentation" << std::endl; - seg_nonoverlap = std::shared_ptr(new cv::Mat()); + seg_nonoverlap = std::shared_ptr(new cv::Mat); } -TaskSegmentation5::~TaskSegmentation5() { - //std::cout << "seg_open: " << to_string(seg_open.use_count()) << " = " << &*seg_open << endl; - //std::cout << "seg_nonoverlap: " << to_string(seg_nonoverlap.use_count()) << " = " << &*seg_nonoverlap << endl; -} +TaskSegmentation5::~TaskSegmentation5() {} bool TaskSegmentation5::run(int procType, int tid) { cv::Mat normalized_rt = (*this->normalized_rt_temp)->getData(); @@ -1277,30 +1170,18 @@ bool TaskSegmentation5::run(int procType, int tid) { uint64_t t1 = Util::ClockGetTimeProfile(); - std::cout << "\t\t\tTaskSegmentation5 executing." << std::endl; - - if (seg_open.use_count() <= 0) { - std::cout << "seg_open counter is " - << seg_open.use_count() << std::endl; - exit(-1); - } - if (seg_nonoverlap.use_count() <= 0) { - std::cout << "seg_nonoverlap counter is " - << seg_nonoverlap.use_count() << std::endl; - exit(-1); - } + std::cout << "TaskSegmentation5 executing." << std::endl; ::nscale::HistologicalEntities::segmentNucleiStg6(normalized_rt, minSizePl, watershedConnectivity, &*seg_open, &*seg_nonoverlap); uint64_t t2 = Util::ClockGetTimeProfile(); - std::cout << "\t\t\tTask Segmentation5 time elapsed: "<< t2-t1 << std::endl; + std::cout << "Task Segmentation5 time elapsed: "<< t2-t1 << std::endl; } void TaskSegmentation5::updateDR(RegionTemplate* rt) { - normalized_rt_temp = std::make_shared(dynamic_cast( - rt->getDataRegion((*this->normalized_rt_temp)->getName(), + normalized_rt_temp = std::make_shared(dynamic_cast(rt->getDataRegion((*this->normalized_rt_temp)->getName(), (*this->normalized_rt_temp)->getId(), 0, stoi((*this->normalized_rt_temp)->getId())))); } @@ -1308,7 +1189,7 @@ void TaskSegmentation5::updateDR(RegionTemplate* rt) { void TaskSegmentation5::updateInterStageArgs(ReusableTask* t) { // verify if the tasks are compatible if (typeid(t) != typeid(this)) { - std::cout << "\t\t\t[TaskSegmentation5] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + std::cout << "[TaskSegmentation5] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; return; } @@ -1319,7 +1200,7 @@ void TaskSegmentation5::updateInterStageArgs(ReusableTask* t) { void TaskSegmentation5::resolveDependencies(ReusableTask* t) { // verify if the task type is compatible if (typeid(t) != typeid(TaskSegmentation6)) { - std::cout << "\t\t\t[TaskSegmentation6] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + std::cout << "[TaskSegmentation6] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; } @@ -1346,7 +1227,7 @@ bool TaskSegmentation5::reusable(ReusableTask* rt) { int TaskSegmentation5::size() { return sizeof(int) + sizeof(int) + - sizeof(int) + (*normalized_rt_temp)->getName().length()*sizeof(char) + sizeof(int) + + sizeof(int) + (*this->normalized_rt_temp)->getName().length()*sizeof(char) + sizeof(int) + sizeof(int) + sizeof(int) + @@ -1440,14 +1321,14 @@ ReusableTask* TaskSegmentation5::clone() { char *buff = new char[size]; this->serialize(buff); retValue->deserialize(buff); - delete[] buff; + delete buff; return retValue; } void TaskSegmentation5::print() { - cout << "\t\t\tminSizePl: " << minSizePl << endl; - cout << "\t\t\twatershedConnectivity: " << watershedConnectivity << endl; + cout << "minSizePl: " << minSizePl << endl; + cout << "watershedConnectivity: " << watershedConnectivity << endl; } @@ -1506,10 +1387,7 @@ TaskSegmentation6::TaskSegmentation6(list args, RegionTemplate* i } -TaskSegmentation6::~TaskSegmentation6() { - //std::cout << "seg_open: " << to_string(seg_open.use_count()) << " = " << &*seg_open << endl; - //std::cout << "seg_nonoverlap: " << to_string(seg_nonoverlap.use_count()) << " = " << &*seg_nonoverlap << endl; -} +TaskSegmentation6::~TaskSegmentation6() {} bool TaskSegmentation6::run(int procType, int tid) { @@ -1518,14 +1396,7 @@ bool TaskSegmentation6::run(int procType, int tid) { uint64_t t1 = Util::ClockGetTimeProfile(); - std::cout << "\t\t\tTaskSegmentation6 executing." << std::endl; - - if (seg_nonoverlap.use_count() <= 0) { - std::cout << "seg_nonoverlap counter is " - << seg_nonoverlap.use_count() << std::endl; - exit(-1); - } - + std::cout << "TaskSegmentation6 executing." << std::endl; ::nscale::HistologicalEntities::segmentNucleiStg7(&segmented_rt, minSizeSeg, maxSizeSeg, fillHolesConnectivity, &*seg_nonoverlap); @@ -1533,7 +1404,7 @@ bool TaskSegmentation6::run(int procType, int tid) { (*this->segmented_rt_temp)->setData(segmented_rt); - std::cout << "\t\t\tTask Segmentation6 time elapsed: "<< t2-t1 << std::endl; + std::cout << "Task Segmentation6 time elapsed: "<< t2-t1 << std::endl; } void TaskSegmentation6::updateDR(RegionTemplate* rt) { @@ -1544,7 +1415,7 @@ rt->insertDataRegion(*this->segmented_rt_temp); void TaskSegmentation6::updateInterStageArgs(ReusableTask* t) { // verify if the tasks are compatible if (typeid(t) != typeid(this)) { - std::cout << "\t\t\t[TaskSegmentation6] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + std::cout << "[TaskSegmentation6] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; return; } @@ -1580,7 +1451,7 @@ bool TaskSegmentation6::reusable(ReusableTask* rt) { int TaskSegmentation6::size() { return sizeof(int) + sizeof(int) + - sizeof(int) + (*segmented_rt_temp)->getName().length()*sizeof(char) + sizeof(int) + + sizeof(int) + (*this->segmented_rt_temp)->getName().length()*sizeof(char) + sizeof(int) + sizeof(int) + sizeof(int) + sizeof(int) + @@ -1683,15 +1554,15 @@ ReusableTask* TaskSegmentation6::clone() { char *buff = new char[size]; this->serialize(buff); retValue->deserialize(buff); - delete[] buff; + delete buff; return retValue; } void TaskSegmentation6::print() { - cout << "\t\t\tminSizeSeg: " << minSizeSeg << endl; - cout << "\t\t\tmaxSizeSeg: " << maxSizeSeg << endl; - cout << "\t\t\tfillHolesConnectivity: " << fillHolesConnectivity << endl; + cout << "minSizeSeg: " << minSizeSeg << endl; + cout << "maxSizeSeg: " << maxSizeSeg << endl; + cout << "fillHolesConnectivity: " << fillHolesConnectivity << endl; } diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/Makefile b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/Makefile index 86c85cd..80290ae 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/Makefile +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/Makefile @@ -1,13 +1,13 @@ all: - g++ gen.cpp jsoncpp -std=c++11 -o gen - ./gen -d segmentation_desc - # ./gen -d normalization_desc - mv Segmentation.* .. - # mv NormalizationComp.* .. + @g++ gen.cpp jsoncpp -std=c++11 -o gen.out + @./gen.out -d segmentation_desc + # @./gen.out -d normalization_desc + @mv Segmentation.* .. + # @mv NormalizationComp.* .. debug: - g++ -g -ggdb -gdwarf-2 gen.cpp jsoncpp -std=c++11 -o gen + g++ -g -ggdb -gdwarf-2 gen.cpp jsoncpp -std=c++11 -o gen.out gen: - ./gen -d segmentation_desc - # ./gen -d normalization_desc - mv Segmentation.* .. - # mv NormalizationComp.* .. \ No newline at end of file + @./gen.out -d segmentation_desc + # @./gen.out -d normalization_desc + @mv Segmentation.* .. + # @mv NormalizationComp.* .. \ No newline at end of file diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/gen b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/gen deleted file mode 100755 index 0c98260fe2779869e555c90932a16de347e59271..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 492209 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

u&y#qiX=etn%I{H(xi*m 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≷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 aBf2()isexeoH|_9XW*nQ4!$y5iu`}|+NoFo diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/gen.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/gen.cpp index 069409a..9db6a6c 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/gen.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/gen.cpp @@ -225,7 +225,6 @@ string generate_tasks(Json::Value data, string &desc_decl, string &desc_def) { string name_prev = data["name"].asString() + to_string(i-1); string type_check = ""; string task_args; - string input_dr_delete; string input_mat_dr; string output_mat_dr; string intertask_mat; @@ -265,43 +264,45 @@ string generate_tasks(Json::Value data, string &desc_decl, string &desc_def) { data["tasks"][i]["args"][j]["name"].asString() + "\") == 0) {\n\t\t\tArgumentRT* " + data["tasks"][i]["args"][j]["name"].asString() + "_arg;\n\t\t\t" + data["tasks"][i]["args"][j]["name"].asString() + "_arg = (ArgumentRT*)a;\n\t\t\tthis->" + - data["tasks"][i]["args"][j]["name"].asString() + "_temp = new DenseDataRegion2D();\n\t\t\tthis->" + - data["tasks"][i]["args"][j]["name"].asString() + "_temp->setName(" + - data["tasks"][i]["args"][j]["name"].asString() + "_arg->getName());\n\t\t\tthis->" + - data["tasks"][i]["args"][j]["name"].asString() + "_temp->setId(std::to_string(" + - data["tasks"][i]["args"][j]["name"].asString() + "_arg->getId()));\n\t\t\tthis->" + - data["tasks"][i]["args"][j]["name"].asString() + "_temp->setVersion(" + + data["tasks"][i]["args"][j]["name"].asString() + + "_temp = std::make_shared(new DenseDataRegion2D());\n\t\t\t(*this->" + + data["tasks"][i]["args"][j]["name"].asString() + "_temp)->setName(" + + data["tasks"][i]["args"][j]["name"].asString() + "_arg->getName());\n\t\t\t(*this->" + + data["tasks"][i]["args"][j]["name"].asString() + "_temp)->setId(std::to_string(" + + data["tasks"][i]["args"][j]["name"].asString() + "_arg->getId()));\n\t\t\t(*this->" + + data["tasks"][i]["args"][j]["name"].asString() + "_temp)->setVersion(" + data["tasks"][i]["args"][j]["name"].asString() + "_arg->getId());\n\t\t\tset_cout++;\n\t\t}\n\n"; - reusable_cond += "\t\tthis->" + data["tasks"][i]["args"][j]["name"].asString() + "_temp->getName() == t->" + - data["tasks"][i]["args"][j]["name"].asString() + "_temp->getName() &&\n"; + reusable_cond += "\t\t(*this->" + data["tasks"][i]["args"][j]["name"].asString() + "_temp)->getName() == (*t->" + + data["tasks"][i]["args"][j]["name"].asString() + "_temp)->getName() &&\n"; - task_size += "\t\tsizeof(int) + " + data["tasks"][i]["args"][j]["name"].asString() + - "_temp->getName().length()*sizeof(char) + sizeof(int) +\n"; + task_size += "\t\tsizeof(int) + (*this->" + data["tasks"][i]["args"][j]["name"].asString() + + "_temp)->getName().length()*sizeof(char) + sizeof(int) +\n"; task_serialize += "\t// copy " + data["tasks"][i]["args"][j]["name"].asString() + " id\n\tint " + - data["tasks"][i]["args"][j]["name"].asString() + "_id = stoi(" + - data["tasks"][i]["args"][j]["name"].asString() + "_temp->getId());\n\tmemcpy(buff+serialized_bytes, &" + + data["tasks"][i]["args"][j]["name"].asString() + "_id = stoi((*" + + data["tasks"][i]["args"][j]["name"].asString() + "_temp)->getId());\n\tmemcpy(buff+serialized_bytes, &" + data["tasks"][i]["args"][j]["name"].asString() + "_id, sizeof(int));\n\tserialized_bytes+=sizeof(int);\n\n\t// copy " + data["tasks"][i]["args"][j]["name"].asString() + " name size\n\tint " + - data["tasks"][i]["args"][j]["name"].asString() + "_name_size = " + + data["tasks"][i]["args"][j]["name"].asString() + "_name_size = (*" + data["tasks"][i]["args"][j]["name"].asString() + - "_temp->getName().length();\n\tmemcpy(buff+serialized_bytes, &" + + "_temp)->getName().length();\n\tmemcpy(buff+serialized_bytes, &" + data["tasks"][i]["args"][j]["name"].asString() + "_name_size, sizeof(int));\n\tserialized_bytes+=sizeof(int);\n\n\t// copy " + - data["tasks"][i]["args"][j]["name"].asString() + " name\n\tmemcpy(buff+serialized_bytes, " + - data["tasks"][i]["args"][j]["name"].asString() + "_temp->getName().c_str(), " + + data["tasks"][i]["args"][j]["name"].asString() + " name\n\tmemcpy(buff+serialized_bytes, (*" + + data["tasks"][i]["args"][j]["name"].asString() + "_temp)->getName().c_str(), " + data["tasks"][i]["args"][j]["name"].asString() + "_name_size*sizeof(char));\n\tserialized_bytes+=" + data["tasks"][i]["args"][j]["name"].asString() + "_name_size*sizeof(char);\n\n"; task_deserialize += "\t// create the " + data["tasks"][i]["args"][j]["name"].asString() + "\n\tthis->" + - data["tasks"][i]["args"][j]["name"].asString() + "_temp = new DenseDataRegion2D();\n\n\t// extract " + + data["tasks"][i]["args"][j]["name"].asString() + + "_temp = std::make_shared(new DenseDataRegion2D());\n\n\t// extract " + data["tasks"][i]["args"][j]["name"].asString() + " id\n\tint " + - data["tasks"][i]["args"][j]["name"].asString() + "_id = ((int*)(buff+deserialized_bytes))[0];\n\tthis->" + - data["tasks"][i]["args"][j]["name"].asString() + "_temp->setId(to_string(" + - data["tasks"][i]["args"][j]["name"].asString() + "_id));\n\tthis->" + - data["tasks"][i]["args"][j]["name"].asString() + "_temp->setVersion(" + + data["tasks"][i]["args"][j]["name"].asString() + "_id = ((int*)(buff+deserialized_bytes))[0];\n\t(*this->" + + data["tasks"][i]["args"][j]["name"].asString() + "_temp)->setId(to_string(" + + data["tasks"][i]["args"][j]["name"].asString() + "_id));\n\t(*this->" + + data["tasks"][i]["args"][j]["name"].asString() + "_temp)->setVersion(" + data["tasks"][i]["args"][j]["name"].asString() + "_id);\n\tdeserialized_bytes += sizeof(int);\n\n\t// extract " + data["tasks"][i]["args"][j]["name"].asString() + " name size\n\tint " + @@ -315,33 +316,31 @@ string generate_tasks(Json::Value data, string &desc_decl, string &desc_def) { data["tasks"][i]["args"][j]["name"].asString() + "_name_size] = \'\\0\';\n\tmemcpy(" + data["tasks"][i]["args"][j]["name"].asString() + "_name, buff+deserialized_bytes, sizeof(char)*" + data["tasks"][i]["args"][j]["name"].asString() + "_name_size);\n\tdeserialized_bytes += sizeof(char)*" + - data["tasks"][i]["args"][j]["name"].asString() + "_name_size;\n\tthis->" + - data["tasks"][i]["args"][j]["name"].asString() + "_temp->setName(" + + data["tasks"][i]["args"][j]["name"].asString() + "_name_size;\n\t(*this->" + + data["tasks"][i]["args"][j]["name"].asString() + "_temp)->setName(" + data["tasks"][i]["args"][j]["name"].asString() + "_name);\n\n"; if (data["tasks"][i]["args"][j]["io"].asString().compare("input") == 0) { call_args += data["tasks"][i]["args"][j]["name"].asString() + ", "; - input_dr_delete += "\tif(" + data["tasks"][i]["args"][j]["name"].asString() + "_temp != NULL) delete " + - data["tasks"][i]["args"][j]["name"].asString() + "_temp;\n"; - - input_mat_dr += "\tcv::Mat " + data["tasks"][i]["args"][j]["name"].asString() + " = this->" + - data["tasks"][i]["args"][j]["name"].asString() + "_temp->getData();\n"; + input_mat_dr += "\tcv::Mat " + data["tasks"][i]["args"][j]["name"].asString() + " = (*this->" + + data["tasks"][i]["args"][j]["name"].asString() + "_temp)->getData();\n"; update_mat_dr += "\t" + data["tasks"][i]["args"][j]["name"].asString() + - "_temp = dynamic_cast(rt->getDataRegion(this->" + - data["tasks"][i]["args"][j]["name"].asString() + "_temp->getName(),\n\t\tthis->" + - data["tasks"][i]["args"][j]["name"].asString() + "_temp->getId(), 0, stoi(this->" + - data["tasks"][i]["args"][j]["name"].asString() + "_temp->getId())));\n"; + "_temp = std::make_shared(dynamic_cast" + + "(rt->getDataRegion((*this->" + + data["tasks"][i]["args"][j]["name"].asString() + "_temp)->getName(),\n\t\t(*this->" + + data["tasks"][i]["args"][j]["name"].asString() + "_temp)->getId(), 0, stoi((*this->" + + data["tasks"][i]["args"][j]["name"].asString() + "_temp)->getId()))));\n"; } else { call_args += "&" + data["tasks"][i]["args"][j]["name"].asString() + ", "; output_mat_dr += "\tcv::Mat " + data["tasks"][i]["args"][j]["name"].asString() + ";\n"; - output_dr_return += "\tthis->" + data["tasks"][i]["args"][j]["name"].asString() + - "_temp->setData(" + data["tasks"][i]["args"][j]["name"].asString() + ");\n"; + output_dr_return += "\t(*this->" + data["tasks"][i]["args"][j]["name"].asString() + + "_temp)->setData(" + data["tasks"][i]["args"][j]["name"].asString() + ");\n"; - update_mat_dr += "rt->insertDataRegion(this->" + + update_mat_dr += "rt->insertDataRegion(*this->" + data["tasks"][i]["args"][j]["name"].asString() + "_temp);\n"; } } else { @@ -393,16 +392,17 @@ string generate_tasks(Json::Value data, string &desc_decl, string &desc_def) { " = ((Task" + name_prev + "*)t)->" + data["tasks"][i]["interstage_args"][j]["name"].asString() + ";\n"; } - call_args += data["tasks"][i]["interstage_args"][j]["name"].asString() + ", "; + call_args += "&*" + data["tasks"][i]["interstage_args"][j]["name"].asString() + ", "; } else if (data["tasks"][i]["interstage_args"][j]["io"].asString().compare("output") == 0) { - call_args += data["tasks"][i]["interstage_args"][j]["name"].asString() + ", "; + call_args += "&*" + data["tasks"][i]["interstage_args"][j]["name"].asString() + ", "; fisrt_forward[data["tasks"][i]["interstage_args"][j]["name"].asString()] = false; intertask_mat += "\t" + getMatDRType(data["tasks"][i]["interstage_args"][j]["type"].asString()) + " " + data["tasks"][i]["interstage_args"][j]["name"].asString() + "_temp;\n"; intertask_inst += "\t" + data["tasks"][i]["interstage_args"][j]["name"].asString() + - " = new " + getMatDRType(data["tasks"][i]["interstage_args"][j]["type"].asString()) + ";\n"; + " = std::shared_ptr<" + getMatDRType(data["tasks"][i]["interstage_args"][j]["type"].asString()) + + ">(new " + getMatDRType(data["tasks"][i]["interstage_args"][j]["type"].asString()) + ");\n"; } else { update_ints_args += "\tthis->" + data["tasks"][i]["interstage_args"][j]["name"].asString() + @@ -438,9 +438,6 @@ string generate_tasks(Json::Value data, string &desc_decl, string &desc_def) { // $TASK_ARGS$ replace_multiple_string(source, "$TASK_ARGS$", task_args); - // $INPUT_DR_DELETE$ - replace_multiple_string(source, "$INPUT_DR_DELETE$", input_dr_delete); - // $INPUT_MAT_DR$ replace_multiple_string(source, "$INPUT_MAT_DR$", input_mat_dr); diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/source_task_template b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/source_task_template index 945ad76..a5340b6 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/source_task_template +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/source_task_template @@ -14,9 +14,7 @@ $TASK_ARGS$ $INTERTASK_INST$ } -Task$NAME$::~Task$NAME$() { -$INPUT_DR_DELETE$ -} +Task$NAME$::~Task$NAME$() {} bool Task$NAME$::run(int procType, int tid) { $INPUT_MAT_DR$ diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/source_template b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/source_template index f05ff79..d56eed6 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/source_template +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/source_template @@ -35,6 +35,7 @@ $STAGE_INPUT_DR$ $STAGE_OUTPUT_DR$ map prev_map; + list ordered_tasks; for (list::reverse_iterator task=tasks.rbegin(); task!=tasks.rend(); task++) { cout << "[Segmentation] sending task " << (*task)->getId() << endl; // generate a task copy and update the DR, getting the actual data @@ -43,15 +44,20 @@ $STAGE_OUTPUT_DR$ // solve dependency if it isn't the first task if (t->parentTask != -1) { - t->addDependency(prev_map[t->parentTask]); + cout << "\t\t\t[Segmentation] setting dep of " << t->getId() << " to " << prev_map[t->parentTask]->getId() << endl; + t->addDependency(prev_map[t->parentTask]->getId()); t->resolveDependencies(prev_map[t->parentTask]); } - // send task to be executed - this->executeTask(t); - // add this task to parent list for future dependency resolution prev_map[t->getId()] = t; + ordered_tasks.emplace_back(t); + } + + // send all tasks to be executed + for (ReusableTask* t : ordered_tasks) { + cout << "\t\t\t[Segmentation] sending task " << t->getId() << endl; + this->executeTask(t); } return 0; From 071068a628e5f5137013b61398aa497dfbc20ac3 Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Mon, 26 Sep 2016 19:57:19 -0300 Subject: [PATCH 54/87] Fixed the workflow outputs and added a file output to the fine grain merging solution. --- .../PipelineManager.cpp | 8 + .../seg_example.t2flow | 432 ++++++++++++------ 2 files changed, 292 insertions(+), 148 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index b7dfbdc..4cc014a 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -1988,14 +1989,21 @@ void merge_stages_fine_grain(const map &all_stages, list> solution = montecarlo_recursive_cut(current_stages, all_stages, n_workers, expanded_args, ref->second->tasksDesc); + // write merging solution + ofstream solution_file; + solution_file.open("fine-grain-merging-solution", ios::trunc); cout << "solution:" << endl; for (list b : solution) { cout << "\tbucket with " << b.size() << " stages and cost " << calc_stage_proc(b, expanded_args, ref->second->tasksDesc) << ":" << endl; + solution_file << "\tbucket with " << b.size() << " stages and cost " + << calc_stage_proc(b, expanded_args, ref->second->tasksDesc) << ":" << endl; for (PipelineComponentBase* s : b) { cout << "\t\tstage " << s->getId() << ":" << s->getName() << ":" << endl; + solution_file << "\t\tstage " << s->getId() << ":" << s->getName() << ":" << endl; } } + solution_file.close(); // merge all stages in each bucket, given that they are mergable for (list bucket : solution) { diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/seg_example.t2flow b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/seg_example.t2flow index a8a9059..0d5f862 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/seg_example.t2flow +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/seg_example.t2flow @@ -1,8 +1,8 @@ -Workflow2T100 +Workflow2T100 - {"type":"float","value":"5.0"} + {"type":"float","values":[5.0]} 2016-05-23 13:06:10.434 UTC @@ -13,7 +13,7 @@ - {"type":"float", "value":"4"} + {"type":"float", "values":[4]} 2016-05-20 13:33:51.322 UTC @@ -24,7 +24,7 @@ - {"type":"integer", "value":"80"} + {"type":"integer", "values":[80]} 2016-05-20 13:34:56.186 UTC @@ -35,7 +35,7 @@ - {"type":"integer", "value":"45"} + {"type":"integer", "values":[45]} 2016-05-20 13:35:09.604 UTC @@ -46,7 +46,7 @@ - {"type":"integer", "value":"220"} + {"type":"integer", "values":[220]} 2016-05-20 13:32:06.124 UTC @@ -57,7 +57,7 @@ - {"type":"integer", "value":"220"} + {"type":"integer", "values":[220]} 2016-05-20 13:32:23.990 UTC @@ -68,7 +68,7 @@ - {"type":"integer", "value":"220"} + {"type":"integer", "values":[220]} 2016-05-20 13:33:02.0 UTC @@ -79,7 +79,7 @@ - {"type":"integer", "value":"11"} + {"type":"integer", "values":[11]} 2016-05-20 13:35:32.219 UTC @@ -90,7 +90,7 @@ - {"type":"integer", "value":"1000"} + {"type":"integer", "values":[1000]} 2016-05-20 13:35:41.983 UTC @@ -101,7 +101,7 @@ - {"type":"integer", "value":"30"} + {"type":"integer", "values":[30]} 2016-05-20 13:35:53.573 UTC @@ -112,7 +112,7 @@ - {"type":"integer", "value":"21"} + {"type":"integer", "values":[21]} 2016-05-20 13:36:07.383 UTC @@ -123,7 +123,7 @@ - {"type":"integer", "value":"1000"} + {"type":"integer", "values":[1000, 111]} 2016-05-20 13:36:14.214 UTC @@ -134,7 +134,7 @@ - {"type":"integer", "value":"4"} + {"type":"integer", "values":[4, 5]} 2016-05-20 13:36:38.7 UTC @@ -145,7 +145,7 @@ - {"type":"integer", "value":"8"} + {"type":"integer", "values":[8]} 2016-05-20 13:36:48.672 UTC @@ -156,7 +156,7 @@ - {"type":"integer", "value":"8"} + {"type":"integer", "values":[8]} 2016-05-20 13:36:56.118 UTC @@ -166,10 +166,10 @@ target_std00 - - {"type":"array", "value":{"type":"float", "value":["0.26235", "0.0514831", "0.0114217"]}} + + - 2016-05-20 13:41:22.159 UTC + 2016-05-20 13:49:48.942 UTC @@ -177,10 +177,10 @@ - - + + {"type":"floatarray", "values":[[0.26235, 0.0514831, 0.0114217]]} - 2016-05-20 13:49:48.942 UTC + 2016-05-20 13:41:22.159 UTC @@ -189,7 +189,7 @@ - {array, float, [-0.632356, -0.0516004, 0.0376543]} + {"type":"floatarray", "values":[[-0.632356, -0.0516004, 0.0376543]]} 2016-05-20 13:40:34.480 UTC @@ -200,9 +200,9 @@ - temp + {"type":"rt", "values":["/home/willian/Desktop/images15/image3.tiff"]} - 2016-05-20 14:19:36.399 UTC + 2016-06-02 21:50:58.623 UTC @@ -211,101 +211,25 @@ - temp2 + {"type":"rt", "values":["/home/willian/Desktop/images15/image3.mask.png"]} 2016-05-20 14:33:42.942 UTC -dif0norm_stagetarget_mean0target_std0norm_input_rt0normalized_rt00net.sf.taverna.t2.activitiesexternal-tool-activity1.5net.sf.taverna.t2.activities.externaltool.ExternalToolActivity - 789663B8-DA91-428A-9F7D-B3F3DA185FD4 - default local - <?xml version="1.0" encoding="UTF-8"?> -<localInvocation><shellPrefix>/bin/sh -c</shellPrefix><linkCommand>/bin/ln -s %%PATH_TO_ORIGINAL%% %%TARGET_NAME%%</linkCommand></localInvocation> - - 296c295f-3841-4f53-8cf8-563c608f67a1 - - - - norm - 1200 - 1800 - - - - - - - - target_std - - target_std - true - false - false - UTF-8 - false - false - false - - - - - norm_input_rt - - norm_input_rt - true - false - false - UTF-8 - false - false - false - - - - - target_mean - - target_mean - true - false - false - UTF-8 - false - false - false - - - - - - - normalized_rt - - normalized_rt - false - - - - - false - true - true - - 0 - - - false -net.sf.taverna.t2.coreworkflowmodel-impl1.5net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize - 1 -net.sf.taverna.t2.coreworkflowmodel-impl1.5net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBouncenet.sf.taverna.t2.coreworkflowmodel-impl1.5net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failovernet.sf.taverna.t2.coreworkflowmodel-impl1.5net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry - 1.0 - 1000 - 5000 - 0 -net.sf.taverna.t2.coreworkflowmodel-impl1.5net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invokesegmentationblue0watershed_connectivity0T20T10red0recon_connectivity0min_size_seg0min_size_pl0min_size0max_size_seg0max_size0green0G20G10fill_holes_connectivity0seg_rt_inpt0segmented_rt00net.sf.taverna.t2.activitiesexternal-tool-activity1.5net.sf.taverna.t2.activities.externaltool.ExternalToolActivity +diff0 + + + + {"type":"floatarray"} + + 2016-06-20 23:56:56.361 UTC + + + + +segmentationblue0watershed_connectivity0T20T10red0recon_connectivity0min_size_seg0min_size_pl0min_size0max_size_seg0max_size0green0G20G10fill_holes_connectivity0seg_rt_inpt0segmented_rt00net.sf.taverna.t2.activitiesexternal-tool-activity1.5net.sf.taverna.t2.activities.externaltool.ExternalToolActivity 789663B8-DA91-428A-9F7D-B3F3DA185FD4 default local <?xml version="1.0" encoding="UTF-8"?> @@ -315,7 +239,7 @@ - seg + Segmentation 1200 1800 @@ -553,7 +477,7 @@ segmented_rt - segmented_rt + rt false @@ -584,7 +508,7 @@ - diff + DiffMaskComp 1200 1800 @@ -626,8 +550,8 @@ diff - diff - false + floatarray + true @@ -647,17 +571,17 @@ 1000 5000 0 -net.sf.taverna.t2.coreworkflowmodel-impl1.5net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invokegenerate_rtinput_img0ref0rt00net.sf.taverna.t2.activitiesexternal-tool-activity1.5net.sf.taverna.t2.activities.externaltool.ExternalToolActivity +net.sf.taverna.t2.coreworkflowmodel-impl1.5net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invokenorm_stagetarget_std0target_mean0norm_input_rt0normalized_rt00net.sf.taverna.t2.activitiesexternal-tool-activity1.5net.sf.taverna.t2.activities.externaltool.ExternalToolActivity 789663B8-DA91-428A-9F7D-B3F3DA185FD4 default local <?xml version="1.0" encoding="UTF-8"?> <localInvocation><shellPrefix>/bin/sh -c</shellPrefix><linkCommand>/bin/ln -s %%PATH_TO_ORIGINAL%% %%TARGET_NAME%%</linkCommand></localInvocation> - cb1a8740-7b3a-4310-821e-90a3b3f089be + 296c295f-3841-4f53-8cf8-563c608f67a1 - convert2rt + NormalizationComp 1200 1800 @@ -667,9 +591,23 @@ - ref + target_std + + target_std + true + false + false + UTF-8 + false + false + false + + + + + norm_input_rt - ref + norm_input_rt true false false @@ -681,9 +619,9 @@ - input_img + target_mean - input_img + target_mean true false false @@ -697,7 +635,7 @@ - rt + normalized_rt rt false @@ -720,13 +658,57 @@ 1000 5000 0 -net.sf.taverna.t2.coreworkflowmodel-impl1.5net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invokenorm_stagetarget_meantarget_meannorm_stagetarget_stdtarget_stdnorm_stagenorm_input_rtgenerate_rtrtsegmentationbluebluesegmentationwatershed_connectivitywatershedConnectivitysegmentationT2T2segmentationT1T1segmentationredredsegmentationrecon_connectivityreconConnectivitysegmentationmin_size_segminSizeSegsegmentationmin_size_plminSizePlsegmentationmin_sizeminSizesegmentationmax_size_segmaxSizeSegsegmentationmax_sizemaxSizesegmentationgreengreensegmentationG2G2segmentationG1G1segmentationfill_holes_connectivityfillHolesConnectivitysegmentationseg_rt_inptnorm_stagenormalized_rtdiff_stagecomputed_masksegmentationsegmented_rtdiff_stageoriginal_maskgenerate_rtrtgenerate_rtinput_imginput_imggenerate_rtrefinput_ref_imgdifdiff_stagediff +net.sf.taverna.t2.coreworkflowmodel-impl1.5net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invokesegmentationbluebluesegmentationwatershed_connectivitywatershedConnectivitysegmentationT2T2segmentationT1T1segmentationredredsegmentationrecon_connectivityreconConnectivitysegmentationmin_size_segminSizeSegsegmentationmin_size_plminSizePlsegmentationmin_sizeminSizesegmentationmax_size_segmaxSizeSegsegmentationmax_sizemaxSizesegmentationgreengreensegmentationG2G2segmentationG1G1segmentationfill_holes_connectivityfillHolesConnectivitysegmentationseg_rt_inptnorm_stagenormalized_rtdiff_stagecomputed_masksegmentationsegmented_rtdiff_stageoriginal_maskinput_ref_imgnorm_stagetarget_stdtarget_stdnorm_stagetarget_meantarget_meannorm_stagenorm_input_rtinput_imgdiffdiff_stagediff - 93f65527-470e-4e46-a7ff-9a1413e71f9f + 1a188d86-91e4-4897-a8a5-a03142eef0f8 - 2016-05-20 13:54:29.965 UTC + 2016-06-20 23:56:57.458 UTC + + + + + + + + + c1cf530f-c89d-4ee8-a160-ce331a9dead3 + + 2016-05-18 19:38:37.813 UTC + + + + + + + + + cb447b8a-8474-49b1-8dab-9a719e926768 + + 2016-05-20 13:48:39.241 UTC + + + + + + + + + 6473b4d3-502e-496c-89f6-8a408389305a + + 2016-06-02 22:09:04.31 UTC + + + + + + + + + f5c7a265-91bb-4305-953a-8e4f5e1b3298 + + 2016-05-18 19:04:34.237 UTC @@ -746,9 +728,9 @@ - 46074bb5-bad6-4ab8-afb1-739d32dd54e1 + b66815e8-6326-417f-98cd-ef2943539c0d - 2016-05-18 20:20:31.495 UTC + 2016-06-02 14:15:50.27 UTC @@ -757,9 +739,9 @@ - d6aa8eee-7a14-474e-9ed5-2be48d2c8448 + e11cf840-592d-45c5-91f4-9bee0c290087 - 2016-05-20 13:37:01.632 UTC + 2016-06-02 21:57:13.800 UTC @@ -768,9 +750,9 @@ - cb447b8a-8474-49b1-8dab-9a719e926768 + baec5ea9-5092-4fc2-bbcd-9cf2278f1595 - 2016-05-20 13:48:39.241 UTC + 2016-06-02 22:08:24.922 UTC @@ -779,9 +761,9 @@ - c1430382-50c9-4c54-acb5-25155777d162 + 8ac2b23a-6026-4e5e-b258-2b812167c501 - 2016-05-20 14:33:23.558 UTC + 2016-06-02 21:53:09.500 UTC @@ -790,9 +772,75 @@ - 0949901b-c406-4579-84c3-a009be46223b + 7b655ea8-b73b-41c4-9f8e-17e124e1a40c - 2016-05-20 14:33:44.973 UTC + 2016-06-02 21:53:16.900 UTC + + + + + + + + + 468be6a5-f2d1-4460-97c9-4701249f3cf4 + + 2016-05-25 18:18:23.603 UTC + + + + + + + + + 5488af58-0bfb-408d-8e8d-d79f063e6505 + + 2016-06-02 22:09:38.310 UTC + + + + + + + + + 93f65527-470e-4e46-a7ff-9a1413e71f9f + + 2016-05-20 13:54:29.965 UTC + + + + + + + + + 19217faf-08fd-4a5b-9074-52c0b1faa9cc + + 2016-05-20 13:35:09.729 UTC + + + + + + + + + d9ff9e27-3833-4fd9-a646-2e36b8383ff2 + + 2016-06-02 22:15:36.871 UTC + + + + + + + + + 6844b465-b4fa-4f55-9578-bc77cca2e1f5 + + 2016-06-03 00:47:34.249 UTC @@ -808,6 +856,39 @@ + + + + + 0949901b-c406-4579-84c3-a009be46223b + + 2016-05-20 14:33:44.973 UTC + + + + + + + + + d6aa8eee-7a14-474e-9ed5-2be48d2c8448 + + 2016-05-20 13:37:01.632 UTC + + + + + + + + + ba9886c8-b4ce-486b-ab1a-6dff1e5cd7ec + + 2016-06-02 21:54:53.874 UTC + + + + @@ -823,9 +904,9 @@ - c1cf530f-c89d-4ee8-a160-ce331a9dead3 + aed7eaab-48bd-44b3-acb1-fd26a7d89687 - 2016-05-18 19:38:37.813 UTC + 2016-06-02 22:04:56.771 UTC @@ -834,9 +915,9 @@ - 19217faf-08fd-4a5b-9074-52c0b1faa9cc + a3777151-e985-413e-8270-f7b587bf46f4 - 2016-05-20 13:35:09.729 UTC + 2016-06-02 22:08:10.303 UTC @@ -845,9 +926,42 @@ - 32989400-11c7-4dcb-8e09-b70e8c9c67e1 + c1430382-50c9-4c54-acb5-25155777d162 - 2016-05-19 20:47:11.670 UTC + 2016-05-20 14:33:23.558 UTC + + + + + + + + + bb6aedc8-1d80-4a13-b7cf-47d2872d791d + + 2016-06-02 21:51:41.557 UTC + + + + + + + + + dd1638dd-820d-4ac4-9ff4-91856672f08a + + 2016-06-02 22:10:26.838 UTC + + + + + + + + + 7845d7af-905d-4036-8f20-e4d51beef2ed + + 2016-06-02 22:05:15.287 UTC @@ -863,6 +977,17 @@ + + + + + 46074bb5-bad6-4ab8-afb1-739d32dd54e1 + + 2016-05-18 20:20:31.495 UTC + + + + @@ -878,9 +1003,20 @@ - f5c7a265-91bb-4305-953a-8e4f5e1b3298 + 1a038ded-f352-4ead-afa8-7ccf891a5b0b - 2016-05-18 19:04:34.237 UTC + 2016-06-02 21:56:16.324 UTC + + + + + + + + + 32989400-11c7-4dcb-8e09-b70e8c9c67e1 + + 2016-05-19 20:47:11.670 UTC From 8859face75126dfe49465c3494577a142c6f8699 Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Mon, 26 Sep 2016 21:43:25 -0300 Subject: [PATCH 55/87] Fixed the missing stage on merge bug. --- runtime/CMakeCache.txt | 580 +++++++++++++++++- .../PipelineManager.cpp | 130 ++-- 2 files changed, 654 insertions(+), 56 deletions(-) diff --git a/runtime/CMakeCache.txt b/runtime/CMakeCache.txt index 87ee0a3..afb6e44 100644 --- a/runtime/CMakeCache.txt +++ b/runtime/CMakeCache.txt @@ -1,5 +1,5 @@ # This is the CMakeCache file. -# For build in directory: /home/willian/mestrado/my/region-templates/runtime +# For build in directory: /home/willian/mestrado/original/region-templates/runtime # It was generated by CMake: /usr/bin/cmake # You can edit this file to change values found and used by cmake. # If you do not want to change any of the values, simply exit the editor. @@ -14,27 +14,603 @@ # EXTERNAL cache entries ######################## +//Inform whether sample applications should be built +BUILD_SAMPLE_APPLICTIONS:BOOL=ON + +//Path to a program. +CMAKE_AR:FILEPATH=/usr/bin/ar + +//Choose the type of build, options are: None Debug Release RelWithDebInfo +// MinSizeRel. +CMAKE_BUILD_TYPE:STRING=Release + +//Enable/Disable color output during build. +CMAKE_COLOR_MAKEFILE:BOOL=ON + +//CXX compiler. +CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/c++ + +//Flags used by the compiler during all build types. +CMAKE_CXX_FLAGS:STRING=-pg + +//Flags used by the compiler during debug builds. +CMAKE_CXX_FLAGS_DEBUG:STRING=-g + +//Flags used by the compiler during release minsize builds. +CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds (/MD /Ob1 /Oi +// /Ot /Oy /Gs will produce slightly less optimized but smaller +// files). +CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG + +//Flags used by the compiler during Release with Debug Info builds. +CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g + +//C compiler. +CMAKE_C_COMPILER:FILEPATH=/usr/bin/gcc + +//Flags used by the compiler during all build types. +CMAKE_C_FLAGS:STRING=-pg + +//Flags used by the compiler during debug builds. +CMAKE_C_FLAGS_DEBUG:STRING=-g + +//Flags used by the compiler during release minsize builds. +CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds (/MD /Ob1 /Oi +// /Ot /Oy /Gs will produce slightly less optimized but smaller +// files). +CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUG + +//Flags used by the compiler during Release with Debug Info builds. +CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g + +//Flags used by the linker. +CMAKE_EXE_LINKER_FLAGS:STRING=-pg + +//Flags used by the linker during debug builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING=-pg + +//Flags used by the linker during release minsize builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING=-pg + +//Flags used by the linker during release builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING=-pg + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING=-pg + +//Enable/Disable output of compile commands during generation. +CMAKE_EXPORT_COMPILE_COMMANDS:BOOL=OFF + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=/usr/local + +//Path to a program. +CMAKE_LINKER:FILEPATH=/usr/bin/ld + +//Path to a program. +CMAKE_MAKE_PROGRAM:FILEPATH=/usr/bin/make + +//Flags used by the linker during the creation of modules. +CMAKE_MODULE_LINKER_FLAGS:STRING=-pg + +//Flags used by the linker during debug builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING=-pg + +//Flags used by the linker during release minsize builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING=-pg + +//Flags used by the linker during release builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING=-pg + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING=-pg + +//Path to a program. +CMAKE_NM:FILEPATH=/usr/bin/nm + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=/usr/bin/objcopy + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=/usr/bin/objdump + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=Runtime + +//Path to a program. +CMAKE_RANLIB:FILEPATH=/usr/bin/ranlib + +//Flags used by the linker during the creation of dll's. +CMAKE_SHARED_LINKER_FLAGS:STRING=-pg + +//Flags used by the linker during debug builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING=-pg + +//Flags used by the linker during release minsize builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING=-pg + +//Flags used by the linker during release builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING=-pg + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING=-pg + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Path to a program. +CMAKE_STRIP:FILEPATH=/usr/bin/strip + +//If true, cmake will use relative paths in makefiles and projects. +CMAKE_USE_RELATIVE_PATHS:BOOL=OFF + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//Value Computed by CMake +ExamplesRT_BINARY_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/regiontemplates/examples + +//Value Computed by CMake +ExamplesRT_SOURCE_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/regiontemplates/examples + +//Value Computed by CMake +ExamplesSys_BINARY_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/examples + +//Value Computed by CMake +ExamplesSys_SOURCE_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/examples + +//Value Computed by CMake +ExecEngine_BINARY_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/ResourceManager + +//Value Computed by CMake +ExecEngine_SOURCE_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/ResourceManager + +//Value Computed by CMake +HelloWorldRT_BINARY_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/regiontemplates/examples/HelloWorldRT + +//Value Computed by CMake +HelloWorldRT_SOURCE_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/regiontemplates/examples/HelloWorldRT + +//Value Computed by CMake +HelloWorldSys_BINARY_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/examples/HelloWorld + +//Value Computed by CMake +HelloWorldSys_SOURCE_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/examples/HelloWorld + +//Value Computed by CMake +Hello_BINARY_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/ResourceManager/examples/hello + +//Value Computed by CMake +Hello_SOURCE_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/ResourceManager/examples/hello + +//Executable for running MPI programs. +MPIEXEC:FILEPATH=/usr/bin/mpiexec + +//Maximum number of processors available to run MPI applications. +MPIEXEC_MAX_NUMPROCS:STRING=2 + +//Flag used by MPI to specify the number of processes for MPIEXEC; +// the next option will be the number of processes. +MPIEXEC_NUMPROC_FLAG:STRING=-np + +//These flags will come after all flags given to MPIEXEC. +MPIEXEC_POSTFLAGS:STRING= + +//These flags will be directly before the executable that is being +// run by MPIEXEC. +MPIEXEC_PREFLAGS:STRING= + +//Cleared +MPI_CXX_COMPILER:FILEPATH=/usr/bin/mpicxx + +//MPI CXX compilation flags +MPI_CXX_COMPILE_FLAGS:STRING=-pg + +//MPI CXX include path +MPI_CXX_INCLUDE_PATH:STRING=/usr/lib/openmpi/include;/usr/lib/openmpi/include/openmpi + +//MPI CXX libraries to link against +MPI_CXX_LIBRARIES:STRING=/usr/lib/openmpi/lib/libmpi_cxx.so;/usr/lib/openmpi/lib/libmpi.so;/usr/lib/openmpi/lib/libopen-rte.so;/usr/lib/openmpi/lib/libopen-pal.so;/usr/lib/x86_64-linux-gnu/libdl.so;/usr/lib/x86_64-linux-gnu/libnsl.so;/usr/lib/x86_64-linux-gnu/libutil.so;/usr/lib/x86_64-linux-gnu/libm.so;/usr/lib/x86_64-linux-gnu/libdl.so + +//MPI CXX linking flags +MPI_CXX_LINK_FLAGS:STRING= -Wl,--export-dynamic,-pg + +//Cleared +MPI_C_COMPILER:FILEPATH=/usr/bin/mpicc + +//MPI C compilation flags +MPI_C_COMPILE_FLAGS:STRING=-pg + +//MPI C include path +MPI_C_INCLUDE_PATH:STRING=/usr/lib/openmpi/include;/usr/lib/openmpi/include/openmpi + +//MPI C libraries to link against +MPI_C_LIBRARIES:STRING=/usr/lib/openmpi/lib/libmpi.so;/usr/lib/openmpi/lib/libopen-rte.so;/usr/lib/openmpi/lib/libopen-pal.so;/usr/lib/x86_64-linux-gnu/libdl.so;/usr/lib/x86_64-linux-gnu/libnsl.so;/usr/lib/x86_64-linux-gnu/libutil.so;/usr/lib/x86_64-linux-gnu/libm.so;/usr/lib/x86_64-linux-gnu/libdl.so + +//MPI C linking flags +MPI_C_LINK_FLAGS:STRING= -Wl,--export-dynamic,-pg + +//Extra MPI libraries to link against +MPI_EXTRA_LIBRARY:STRING=/usr/lib/openmpi/lib/libmpi.so;/usr/lib/openmpi/lib/libopen-rte.so;/usr/lib/openmpi/lib/libopen-pal.so;/usr/lib/x86_64-linux-gnu/libdl.so;/usr/lib/x86_64-linux-gnu/libnsl.so;/usr/lib/x86_64-linux-gnu/libutil.so;/usr/lib/x86_64-linux-gnu/libm.so;/usr/lib/x86_64-linux-gnu/libdl.so + +//MPI library to link against +MPI_LIBRARY:FILEPATH=/usr/lib/openmpi/lib/libmpi_cxx.so + +//Path to a file. +NSCALE_BUILD_DIR:PATH=/home/willian/mestrado/my/nscale/build + +//Path to a file. +NSCALE_SRC_DIR:PATH=/home/willian/mestrado/my/nscale/src + +//Path where debug 3rdpaty OpenCV dependencies are located +OpenCV_3RDPARTY_LIB_DIR_DBG:PATH= + +//Path where release 3rdpaty OpenCV dependencies are located +OpenCV_3RDPARTY_LIB_DIR_OPT:PATH= + +OpenCV_CONFIG_PATH:FILEPATH=/home/willian/git/opencv-2.4.9/build + +//The directory containing a CMake configuration file for OpenCV. +OpenCV_DIR:PATH=/home/willian/git/opencv-2.4.9/build + +//Path where debug OpenCV libraries are located +OpenCV_LIB_DIR_DBG:PATH= + +//Path where release OpenCV libraries are located +OpenCV_LIB_DIR_OPT:PATH= + +//Value Computed by CMake +PipelineRTFS-SF_BINARY_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/regiontemplates/examples/PipelineRTFS-SF + +//Value Computed by CMake +PipelineRTFS-SF_SOURCE_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/regiontemplates/examples/PipelineRTFS-SF + +//Value Computed by CMake +PipelineTasks_BINARY_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/examples/PipelineTasks + +//Value Computed by CMake +PipelineTasks_SOURCE_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/examples/PipelineTasks + +//Enable compilation of Region Templates examples +RTEMPLATES_EXAMPLES:BOOL=ON + +//Enable compilation of Region Templates unit tests +RTEMPLATES_UNIT_TESTS:BOOL=OFF + +//Enable compilation of NScale example with Parameter Study +RT_PARAMETER_STUDY_NSCALE_EXAMPLE:BOOL=OFF + +//Enable compilation of Yi's example with Parameter Study +RT_PARAMETER_STUDY_YI_EXAMPLE:BOOL=OFF + +//Enable compilation of NScale example with tuning +RT_TUNING_NSCALE_EXAMPLE:BOOL=OFF + +//Enable compilation of Yi's examples with tuning +RT_TUNING_YI_EXAMPLE:BOOL=OFF + +//Value Computed by CMake +RegionTemplate_BINARY_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/regiontemplates + +//Value Computed by CMake +RegionTemplate_SOURCE_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/regiontemplates + +//Value Computed by CMake +Runtime_BINARY_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime + +//Value Computed by CMake +Runtime_SOURCE_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime + +//Value Computed by CMake +SystemTests_BINARY_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/tests + +//Value Computed by CMake +SystemTests_SOURCE_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/tests + +//Value Computed by CMake +TaskDependency_BINARY_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/ResourceManager/examples/taskDependency + +//Value Computed by CMake +TaskDependency_SOURCE_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/ResourceManager/examples/taskDependency + +//Value Computed by CMake +Tests_BINARY_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/ResourceManager/tests + +//Value Computed by CMake +Tests_SOURCE_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/ResourceManager/tests + +//Include compilation of Activer Harmony +USE_ACTIVE_HARMONY:BOOL=OFF + +//Include NVidia CUDA Runtime support +USE_CUDA:BOOL=OFF + +//Include support for Data Spaces in the Region Templates framework +USE_DATA_SPACES:BOOL=OFF + +//Enable use of fine grain segmentation tasks of NScale for tuning +// optimization +USE_FINE_GRAIN_SEG_TASKS:BOOL=ON + +//Compile HadoopGIS examples (Requires Hadoopgis) +USE_HADOOPGIS:BOOL=OFF + +//Include compilation of the Region Templates framework +USE_REGION_TEMPLATES:BOOL=ON + +//Value Computed by CMake +abc_BINARY_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/ResourceManager/examples/abc + +//Value Computed by CMake +abc_SOURCE_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/ResourceManager/examples/abc + +//Value Computed by CMake +abcde_BINARY_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/ResourceManager/examples/abcde + +//Value Computed by CMake +abcde_SOURCE_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/ResourceManager/examples/abcde + +//Dependencies for the target +componentsPipeTasks_LIB_DEPENDS:STATIC=general;runtimesystem; + +//Dependencies for the target +components_LIB_DEPENDS:STATIC=general;runtimesystem; + +//Dependencies for the target +componentsrt_LIB_DEPENDS:STATIC=general;runtimesystem;general;regiontemplates;general;segment;general;featuresAll;general;opencv_videostab;general;opencv_video;general;opencv_ts;general;opencv_superres;general;opencv_stitching;general;opencv_photo;general;opencv_ocl;general;opencv_objdetect;general;opencv_nonfree;general;opencv_ml;general;opencv_legacy;general;opencv_imgproc;general;opencv_highgui;general;opencv_gpu;general;opencv_flann;general;opencv_features2d;general;opencv_core;general;opencv_contrib;general;opencv_calib3d;general;opencv_videostab;general;opencv_video;general;opencv_ts;general;opencv_superres;general;opencv_stitching;general;opencv_photo;general;opencv_ocl;general;opencv_objdetect;general;opencv_nonfree;general;opencv_ml;general;opencv_legacy;general;opencv_imgproc;general;opencv_highgui;general;opencv_gpu;general;opencv_flann;general;opencv_features2d;general;opencv_core;general;opencv_contrib;general;opencv_calib3d;general;opencv_videostab;general;opencv_video;general;opencv_ts;general;opencv_superres;general;opencv_stitching;general;opencv_photo;general;opencv_ocl;general;opencv_objdetect;general;opencv_nonfree;general;opencv_ml;general;opencv_legacy;general;opencv_imgproc;general;opencv_highgui;general;opencv_gpu;general;opencv_flann;general;opencv_features2d;general;opencv_core;general;opencv_contrib;general;opencv_calib3d; + +//Dependencies for the target +componentsrtfs_LIB_DEPENDS:STATIC=general;runtimesystem;general;regiontemplates;general;segment;general;featuresAll;general;opencv_videostab;general;opencv_video;general;opencv_ts;general;opencv_superres;general;opencv_stitching;general;opencv_photo;general;opencv_ocl;general;opencv_objdetect;general;opencv_nonfree;general;opencv_ml;general;opencv_legacy;general;opencv_imgproc;general;opencv_highgui;general;opencv_gpu;general;opencv_flann;general;opencv_features2d;general;opencv_core;general;opencv_contrib;general;opencv_calib3d;general;opencv_videostab;general;opencv_video;general;opencv_ts;general;opencv_superres;general;opencv_stitching;general;opencv_photo;general;opencv_ocl;general;opencv_objdetect;general;opencv_nonfree;general;opencv_ml;general;opencv_legacy;general;opencv_imgproc;general;opencv_highgui;general;opencv_gpu;general;opencv_flann;general;opencv_features2d;general;opencv_core;general;opencv_contrib;general;opencv_calib3d;general;opencv_videostab;general;opencv_video;general;opencv_ts;general;opencv_superres;general;opencv_stitching;general;opencv_photo;general;opencv_ocl;general;opencv_objdetect;general;opencv_nonfree;general;opencv_ml;general;opencv_legacy;general;opencv_imgproc;general;opencv_highgui;general;opencv_gpu;general;opencv_flann;general;opencv_features2d;general;opencv_core;general;opencv_contrib;general;opencv_calib3d; + +//Dependencies for the target +execengine_LIB_DEPENDS:STATIC=general;-lpthread;general;opencv_videostab;general;opencv_video;general;opencv_ts;general;opencv_superres;general;opencv_stitching;general;opencv_photo;general;opencv_ocl;general;opencv_objdetect;general;opencv_nonfree;general;opencv_ml;general;opencv_legacy;general;opencv_imgproc;general;opencv_highgui;general;opencv_gpu;general;opencv_flann;general;opencv_features2d;general;opencv_core;general;opencv_contrib;general;opencv_calib3d;general;opencv_videostab;general;opencv_video;general;opencv_ts;general;opencv_superres;general;opencv_stitching;general;opencv_photo;general;opencv_ocl;general;opencv_objdetect;general;opencv_nonfree;general;opencv_ml;general;opencv_legacy;general;opencv_imgproc;general;opencv_highgui;general;opencv_gpu;general;opencv_flann;general;opencv_features2d;general;opencv_core;general;opencv_contrib;general;opencv_calib3d; + +//Path to a program. +file_cmd:FILEPATH=/usr/bin/file + +//Dependencies for the target +regiontemplates_LIB_DEPENDS:STATIC=general;/usr/lib/openmpi/lib/libmpi_cxx.so;general;/usr/lib/openmpi/lib/libmpi.so;general;/usr/lib/openmpi/lib/libopen-rte.so;general;/usr/lib/openmpi/lib/libopen-pal.so;general;/usr/lib/x86_64-linux-gnu/libdl.so;general;/usr/lib/x86_64-linux-gnu/libnsl.so;general;/usr/lib/x86_64-linux-gnu/libutil.so;general;/usr/lib/x86_64-linux-gnu/libm.so;general;/usr/lib/x86_64-linux-gnu/libdl.so;general;opencv_videostab;general;opencv_video;general;opencv_ts;general;opencv_superres;general;opencv_stitching;general;opencv_photo;general;opencv_ocl;general;opencv_objdetect;general;opencv_nonfree;general;opencv_ml;general;opencv_legacy;general;opencv_imgproc;general;opencv_highgui;general;opencv_gpu;general;opencv_flann;general;opencv_features2d;general;opencv_core;general;opencv_contrib;general;opencv_calib3d;general;opencv_videostab;general;opencv_video;general;opencv_ts;general;opencv_superres;general;opencv_stitching;general;opencv_photo;general;opencv_ocl;general;opencv_objdetect;general;opencv_nonfree;general;opencv_ml;general;opencv_legacy;general;opencv_imgproc;general;opencv_highgui;general;opencv_gpu;general;opencv_flann;general;opencv_features2d;general;opencv_core;general;opencv_contrib;general;opencv_calib3d; + +//Dependencies for the target +runtimesystem_LIB_DEPENDS:STATIC=general;/usr/lib/openmpi/lib/libmpi_cxx.so;general;/usr/lib/openmpi/lib/libmpi.so;general;/usr/lib/openmpi/lib/libopen-rte.so;general;/usr/lib/openmpi/lib/libopen-pal.so;general;/usr/lib/x86_64-linux-gnu/libdl.so;general;/usr/lib/x86_64-linux-gnu/libnsl.so;general;/usr/lib/x86_64-linux-gnu/libutil.so;general;/usr/lib/x86_64-linux-gnu/libm.so;general;/usr/lib/x86_64-linux-gnu/libdl.so;general;execengine;general;regiontemplates; + ######################## # INTERNAL cache entries ######################## +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_BUILD_TOOL +CMAKE_BUILD_TOOL-ADVANCED:INTERNAL=1 +//What is the target build tool cmake is generating for. +CMAKE_BUILD_TOOL:INTERNAL=/usr/bin/make //This is the directory where this CMakeCache.txt was created -CMAKE_CACHEFILE_DIR:INTERNAL=/home/willian/mestrado/my/region-templates/runtime +CMAKE_CACHEFILE_DIR:INTERNAL=/home/willian/mestrado/original/region-templates/runtime //Major version of cmake used to create the current loaded cache CMAKE_CACHE_MAJOR_VERSION:INTERNAL=2 //Minor version of cmake used to create the current loaded cache CMAKE_CACHE_MINOR_VERSION:INTERNAL=8 //Patch version of cmake used to create the current loaded cache CMAKE_CACHE_PATCH_VERSION:INTERNAL=7 +//ADVANCED property for variable: CMAKE_COLOR_MAKEFILE +CMAKE_COLOR_MAKEFILE-ADVANCED:INTERNAL=1 //Path to CMake executable. CMAKE_COMMAND:INTERNAL=/usr/bin/cmake //Path to cpack program executable. CMAKE_CPACK_COMMAND:INTERNAL=/usr/bin/cpack //Path to ctest program executable. CMAKE_CTEST_COMMAND:INTERNAL=/usr/bin/ctest +//ADVANCED property for variable: CMAKE_CXX_COMPILER +CMAKE_CXX_COMPILER-ADVANCED:INTERNAL=1 +CMAKE_CXX_COMPILER_WORKS:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS +CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG +CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL +CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE +CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO +CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER +CMAKE_C_COMPILER-ADVANCED:INTERNAL=1 +CMAKE_C_COMPILER_WORKS:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS +CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 +//MODIFIED property for variable: CMAKE_C_FLAGS +CMAKE_C_FLAGS-MODIFIED:INTERNAL=ON +//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG +CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL +CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE +CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO +CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//Result of TRY_COMPILE +CMAKE_DETERMINE_CXX_ABI_COMPILED:INTERNAL=TRUE +//Result of TRY_COMPILE +CMAKE_DETERMINE_C_ABI_COMPILED:INTERNAL=TRUE //Path to cache edit program executable. CMAKE_EDIT_COMMAND:INTERNAL=/usr/bin/ccmake +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//MODIFIED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-MODIFIED:INTERNAL=ON +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//MODIFIED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-MODIFIED:INTERNAL=ON +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//MODIFIED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-MODIFIED:INTERNAL=ON +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//MODIFIED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-MODIFIED:INTERNAL=ON +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//MODIFIED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-MODIFIED:INTERNAL=ON +//ADVANCED property for variable: CMAKE_EXPORT_COMPILE_COMMANDS +CMAKE_EXPORT_COMPILE_COMMANDS-ADVANCED:INTERNAL=1 +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Unix Makefiles +//Have library pthreads +CMAKE_HAVE_PTHREADS_CREATE:INTERNAL= +//Have library pthread +CMAKE_HAVE_PTHREAD_CREATE:INTERNAL=1 +//Have include CMAKE_HAVE_PTHREAD_H +CMAKE_HAVE_PTHREAD_H:INTERNAL=1 +//Start directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=/home/willian/mestrado/original/region-templates/runtime +//Install .so files without execute permission. +CMAKE_INSTALL_SO_NO_EXE:INTERNAL=1 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MAKE_PROGRAM +CMAKE_MAKE_PROGRAM-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//MODIFIED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-MODIFIED:INTERNAL=ON +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//MODIFIED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-MODIFIED:INTERNAL=ON +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//MODIFIED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-MODIFIED:INTERNAL=ON +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//MODIFIED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-MODIFIED:INTERNAL=ON +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//MODIFIED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-MODIFIED:INTERNAL=ON +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_LOCAL_GENERATORS:INTERNAL=15 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 //Path to CMake installation. CMAKE_ROOT:INTERNAL=/usr/share/cmake-2.8 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//MODIFIED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-MODIFIED:INTERNAL=ON +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//MODIFIED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-MODIFIED:INTERNAL=ON +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//MODIFIED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-MODIFIED:INTERNAL=ON +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//MODIFIED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-MODIFIED:INTERNAL=ON +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//MODIFIED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-MODIFIED:INTERNAL=ON +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//uname command +CMAKE_UNAME:INTERNAL=/bin/uname +//ADVANCED property for variable: CMAKE_USE_RELATIVE_PATHS +CMAKE_USE_RELATIVE_PATHS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 +//Details about finding MPI_C +FIND_PACKAGE_MESSAGE_DETAILS_MPI_C:INTERNAL=[/usr/lib/openmpi/lib/libmpi.so;/usr/lib/openmpi/lib/libopen-rte.so;/usr/lib/openmpi/lib/libopen-pal.so;/usr/lib/x86_64-linux-gnu/libdl.so;/usr/lib/x86_64-linux-gnu/libnsl.so;/usr/lib/x86_64-linux-gnu/libutil.so;/usr/lib/x86_64-linux-gnu/libm.so;/usr/lib/x86_64-linux-gnu/libdl.so][/usr/lib/openmpi/include;/usr/lib/openmpi/include/openmpi][v()] +//Details about finding MPI_CXX +FIND_PACKAGE_MESSAGE_DETAILS_MPI_CXX:INTERNAL=[/usr/lib/openmpi/lib/libmpi_cxx.so;/usr/lib/openmpi/lib/libmpi.so;/usr/lib/openmpi/lib/libopen-rte.so;/usr/lib/openmpi/lib/libopen-pal.so;/usr/lib/x86_64-linux-gnu/libdl.so;/usr/lib/x86_64-linux-gnu/libnsl.so;/usr/lib/x86_64-linux-gnu/libutil.so;/usr/lib/x86_64-linux-gnu/libm.so;/usr/lib/x86_64-linux-gnu/libdl.so][/usr/lib/openmpi/include;/usr/lib/openmpi/include/openmpi][v()] +//Details about finding Threads +FIND_PACKAGE_MESSAGE_DETAILS_Threads:INTERNAL=[TRUE][v()] +//ADVANCED property for variable: MPIEXEC +MPIEXEC-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: MPIEXEC_MAX_NUMPROCS +MPIEXEC_MAX_NUMPROCS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: MPIEXEC_NUMPROC_FLAG +MPIEXEC_NUMPROC_FLAG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: MPIEXEC_POSTFLAGS +MPIEXEC_POSTFLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: MPIEXEC_PREFLAGS +MPIEXEC_PREFLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: MPI_CXX_COMPILER +MPI_CXX_COMPILER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: MPI_CXX_COMPILE_FLAGS +MPI_CXX_COMPILE_FLAGS-ADVANCED:INTERNAL=1 +//MODIFIED property for variable: MPI_CXX_COMPILE_FLAGS +MPI_CXX_COMPILE_FLAGS-MODIFIED:INTERNAL=ON +//ADVANCED property for variable: MPI_CXX_INCLUDE_PATH +MPI_CXX_INCLUDE_PATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: MPI_CXX_LIBRARIES +MPI_CXX_LIBRARIES-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: MPI_CXX_LINK_FLAGS +MPI_CXX_LINK_FLAGS-ADVANCED:INTERNAL=1 +//MODIFIED property for variable: MPI_CXX_LINK_FLAGS +MPI_CXX_LINK_FLAGS-MODIFIED:INTERNAL=ON +//ADVANCED property for variable: MPI_C_COMPILER +MPI_C_COMPILER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: MPI_C_COMPILE_FLAGS +MPI_C_COMPILE_FLAGS-ADVANCED:INTERNAL=1 +//MODIFIED property for variable: MPI_C_COMPILE_FLAGS +MPI_C_COMPILE_FLAGS-MODIFIED:INTERNAL=ON +//ADVANCED property for variable: MPI_C_INCLUDE_PATH +MPI_C_INCLUDE_PATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: MPI_C_LIBRARIES +MPI_C_LIBRARIES-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: MPI_C_LINK_FLAGS +MPI_C_LINK_FLAGS-ADVANCED:INTERNAL=1 +//MODIFIED property for variable: MPI_C_LINK_FLAGS +MPI_C_LINK_FLAGS-MODIFIED:INTERNAL=ON +//Scratch variable for MPI header detection +MPI_HEADER_PATH:INTERNAL=MPI_HEADER_PATH-NOTFOUND +//Scratch variable for MPI lib detection +MPI_LIB:INTERNAL=MPI_LIB-NOTFOUND +//MODIFIED property for variable: NSCALE_BUILD_DIR +NSCALE_BUILD_DIR-MODIFIED:INTERNAL=ON +//MODIFIED property for variable: NSCALE_SRC_DIR +NSCALE_SRC_DIR-MODIFIED:INTERNAL=ON +//ADVANCED property for variable: OpenCV_3RDPARTY_LIB_DIR_DBG +OpenCV_3RDPARTY_LIB_DIR_DBG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: OpenCV_3RDPARTY_LIB_DIR_OPT +OpenCV_3RDPARTY_LIB_DIR_OPT-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: OpenCV_CONFIG_PATH +OpenCV_CONFIG_PATH-ADVANCED:INTERNAL=1 +//MODIFIED property for variable: OpenCV_DIR +OpenCV_DIR-MODIFIED:INTERNAL=ON +//ADVANCED property for variable: OpenCV_LIB_DIR_DBG +OpenCV_LIB_DIR_DBG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: OpenCV_LIB_DIR_OPT +OpenCV_LIB_DIR_OPT-ADVANCED:INTERNAL=1 +//MODIFIED property for variable: RTEMPLATES_EXAMPLES +RTEMPLATES_EXAMPLES-MODIFIED:INTERNAL=ON +//MODIFIED property for variable: USE_FINE_GRAIN_SEG_TASKS +USE_FINE_GRAIN_SEG_TASKS-MODIFIED:INTERNAL=ON diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 4cc014a..a77c94f 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -270,10 +270,21 @@ int main(int argc, char* argv[]) { add_arguments_to_stages(expanded_stages, expanded_args, rt); map merged_stages; - int size = 3; - MPI_Comm_size(MPI_COMM_WORLD, &size); + int size = 30; + // MPI_Comm_size(MPI_COMM_WORLD, &size); merge_stages_fine_grain(expanded_stages, base_stages, merged_stages, rt, expanded_args, size-1); + cout << endl<< "merged-fine before deps resolution: " << endl; + for (pair p : merged_stages) { + string s = p.second->reused!=NULL?" - reused":""; + cout << "stage " << p.second->getId() << ":" << p.second->getName() << s << endl; + cout << "\ttasks: " << endl; + for (ReusableTask* t : p.second->tasks) { + cout << "\t\t" << t->getId() << ":" << t->getTaskName() << endl; + cout << "\t\t\tparent_task: " << t->parentTask << endl; + } + } + // resolve dependencies of reused stages for (pair p : merged_stages) { // add correct stage dependencies @@ -320,7 +331,6 @@ int main(int argc, char* argv[]) { for (ReusableTask* t : p.second->tasks) { cout << "\t\t" << t->getId() << ":" << t->getTaskName() << endl; cout << "\t\t\tparent_task: " << t->parentTask << endl; - t->print(); } } @@ -1820,6 +1830,61 @@ list> montecarlo_cut(list r return ret; } +void montecarlo_dep(int n, list c1, list c2, + const map &all_stages, map &args, + map> ref, float &best_mksp, float &best_var, + pair, list> &best_cut) { + + cout << "[montecarlo_recursive_cut] n=" << n << " running cut" << endl; + cout << "\tc1 - cost=" << calc_stage_proc(c1, args, ref) << ":" << endl; + for (PipelineComponentBase* s : c1) + cout << "\t\t" << s->getId() << ":" << s->getName() << endl; + cout << "\tc2 - cost=" << calc_stage_proc(c2, args, ref) << ":" << endl; + for (PipelineComponentBase* s : c2) + cout << "\t\t" << s->getId() << ":" << s->getName() << endl; + + list> c = montecarlo_cut(c2, all_stages, n-1, args, ref); + + // calculates i cut cost with rest c + cout << "[montecarlo_cut] n=" << n << "ret:" << endl; + int ii=0; + // mksp selection metric + float mksp; + float max_mksp = calc_stage_proc(c1, args, ref); + float avg = calc_stage_proc(c1, args, ref); + for (list bucket : c) { + mksp = calc_stage_proc(bucket, args, ref); + avg += mksp; + if (mksp > max_mksp) + max_mksp = mksp; + cout << "\tb" << ii++ << " - mksp=" << mksp<< endl; + for (PipelineComponentBase* s : bucket) + cout << "\t\t" << s->getId() << ":" << s->getName() << endl; + } + + // standard deviation selection metric + avg /= (c.size()+1); + float var = (calc_stage_proc(c1, args, ref)-avg)*(calc_stage_proc(c1, args, ref)-avg); + for (list bucket : c) { + mksp = calc_stage_proc(bucket, args, ref); + var += (mksp-avg)*(mksp-avg); + } + var /= (c.size()+1); + + cout << "with mksp=" << max_mksp << endl; + cout << "with var=" << var << endl; + + // updates best cut, if this is the case + if (max_mksp < best_mksp || (max_mksp == best_mksp && var < best_var)) { + best_mksp = max_mksp; + best_var = var; + list flat_c; + for (list bucket : c) + flat_c.insert(flat_c.begin(), bucket.begin(), bucket.end()); + best_cut = pair, list>(c1, flat_c); + } +} + list> montecarlo_recursive_cut(list rem, const map &all_stages, int n, map &args, map> ref) { @@ -1832,7 +1897,7 @@ list> montecarlo_recursive_cut(list> montecarlo_recursive_cut(list, list>>::iterator i=current_cuts.begin(); i!=current_cuts.end(); i++) { - cout << "[montecarlo_recursive_cut] n=" << n << " running cut" << endl; - cout << "\tc1 - cost=" << calc_stage_proc(i->first, args, ref) << ":" << endl; - for (PipelineComponentBase* s : i->first) - cout << "\t\t" << s->getId() << ":" << s->getName() << endl; - cout << "\tc2 - cost=" << calc_stage_proc(i->second, args, ref) << ":" << endl; - for (PipelineComponentBase* s : i->second) - cout << "\t\t" << s->getId() << ":" << s->getName() << endl; - - list> c = montecarlo_cut(i->second, all_stages, n-1, args, ref); - - // calculates i cut cost with rest c - cout << "[montecarlo_cut] n=" << n << "ret:" << endl; - int ii=0; - // mksp selection metric - float mksp; - float max_mksp = calc_stage_proc(i->first, args, ref); - float avg = calc_stage_proc(i->first, args, ref); - for (list bucket : c) { - mksp = calc_stage_proc(bucket, args, ref); - avg += mksp; - if (mksp > max_mksp) - max_mksp = mksp; - cout << "\tb" << ii++ << " - mksp=" << mksp<< endl; - for (PipelineComponentBase* s : bucket) - cout << "\t\t" << s->getId() << ":" << s->getName() << endl; - } - - // standard deviation selection metric - avg /= (c.size()+1); - float var = (calc_stage_proc(i->first, args, ref)-avg)*(calc_stage_proc(i->first, args, ref)-avg); - for (list bucket : c) { - mksp = calc_stage_proc(bucket, args, ref); - var += (mksp-avg)*(mksp-avg); - } - var /= (c.size()+1); - - cout << "with mksp=" << max_mksp << endl; - cout << "with var=" << var << endl; - - // updates best cut, if this is the case - if (max_mksp < best_mksp || (max_mksp == best_mksp && var < best_var)) { - best_mksp = max_mksp; - best_var = var; - list flat_c; - for (list bucket : c) - flat_c.insert(flat_c.begin(), bucket.begin(), bucket.end()); - best_cut = pair, list>(i->first, flat_c); - } + // WARNING: best cut is shared between all montecarlo_dep runs + montecarlo_dep(n, i->first, i->second, all_stages, args, ref, best_mksp, best_var, best_cut); } cout << "[montecarlo_recursive_cut] n=" << n << " best cut of the stage with mksp=" << best_mksp << endl; @@ -2007,10 +2026,13 @@ void merge_stages_fine_grain(const map &all_stages, // merge all stages in each bucket, given that they are mergable for (list bucket : solution) { + // cout << "bucket merging" << endl; list curr = merge_stages_full(bucket, expanded_args, ref->second->tasksDesc); // send rem stages to merged_stages - for (PipelineComponentBase* s : curr) - merged_stages[s->getId()] = s; + for (PipelineComponentBase* s : curr) { + // cout << "\tadding stage " << s->getId() << endl; + merged_stages[s->getId()] = s; + } } } } From ac732b15baef1bd40c811f2279f35ba3d4b4ae21 Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Mon, 26 Sep 2016 23:26:36 -0300 Subject: [PATCH 56/87] Used OpenMP to speed the merging part of the montecarlo recursive cut algorithm. --- runtime/CMakeCache.txt | 616 ------------------ .../PipelineRTFS-NS-Diff-FGO/CMakeLists.txt | 2 +- .../PipelineManager.cpp | 48 +- 3 files changed, 37 insertions(+), 629 deletions(-) delete mode 100644 runtime/CMakeCache.txt diff --git a/runtime/CMakeCache.txt b/runtime/CMakeCache.txt deleted file mode 100644 index afb6e44..0000000 --- a/runtime/CMakeCache.txt +++ /dev/null @@ -1,616 +0,0 @@ -# This is the CMakeCache file. -# For build in directory: /home/willian/mestrado/original/region-templates/runtime -# It was generated by CMake: /usr/bin/cmake -# You can edit this file to change values found and used by cmake. -# If you do not want to change any of the values, simply exit the editor. -# If you do want to change a value, simply edit, save, and exit the editor. -# The syntax for the file is as follows: -# KEY:TYPE=VALUE -# KEY is the name of a variable in the cache. -# TYPE is a hint to GUI's for the type of VALUE, DO NOT EDIT TYPE!. -# VALUE is the current value for the KEY. - -######################## -# EXTERNAL cache entries -######################## - -//Inform whether sample applications should be built -BUILD_SAMPLE_APPLICTIONS:BOOL=ON - -//Path to a program. -CMAKE_AR:FILEPATH=/usr/bin/ar - -//Choose the type of build, options are: None Debug Release RelWithDebInfo -// MinSizeRel. -CMAKE_BUILD_TYPE:STRING=Release - -//Enable/Disable color output during build. -CMAKE_COLOR_MAKEFILE:BOOL=ON - -//CXX compiler. -CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/c++ - -//Flags used by the compiler during all build types. -CMAKE_CXX_FLAGS:STRING=-pg - -//Flags used by the compiler during debug builds. -CMAKE_CXX_FLAGS_DEBUG:STRING=-g - -//Flags used by the compiler during release minsize builds. -CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG - -//Flags used by the compiler during release builds (/MD /Ob1 /Oi -// /Ot /Oy /Gs will produce slightly less optimized but smaller -// files). -CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG - -//Flags used by the compiler during Release with Debug Info builds. -CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g - -//C compiler. -CMAKE_C_COMPILER:FILEPATH=/usr/bin/gcc - -//Flags used by the compiler during all build types. -CMAKE_C_FLAGS:STRING=-pg - -//Flags used by the compiler during debug builds. -CMAKE_C_FLAGS_DEBUG:STRING=-g - -//Flags used by the compiler during release minsize builds. -CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG - -//Flags used by the compiler during release builds (/MD /Ob1 /Oi -// /Ot /Oy /Gs will produce slightly less optimized but smaller -// files). -CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUG - -//Flags used by the compiler during Release with Debug Info builds. -CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g - -//Flags used by the linker. -CMAKE_EXE_LINKER_FLAGS:STRING=-pg - -//Flags used by the linker during debug builds. -CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING=-pg - -//Flags used by the linker during release minsize builds. -CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING=-pg - -//Flags used by the linker during release builds. -CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING=-pg - -//Flags used by the linker during Release with Debug Info builds. -CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING=-pg - -//Enable/Disable output of compile commands during generation. -CMAKE_EXPORT_COMPILE_COMMANDS:BOOL=OFF - -//Install path prefix, prepended onto install directories. -CMAKE_INSTALL_PREFIX:PATH=/usr/local - -//Path to a program. -CMAKE_LINKER:FILEPATH=/usr/bin/ld - -//Path to a program. -CMAKE_MAKE_PROGRAM:FILEPATH=/usr/bin/make - -//Flags used by the linker during the creation of modules. -CMAKE_MODULE_LINKER_FLAGS:STRING=-pg - -//Flags used by the linker during debug builds. -CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING=-pg - -//Flags used by the linker during release minsize builds. -CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING=-pg - -//Flags used by the linker during release builds. -CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING=-pg - -//Flags used by the linker during Release with Debug Info builds. -CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING=-pg - -//Path to a program. -CMAKE_NM:FILEPATH=/usr/bin/nm - -//Path to a program. -CMAKE_OBJCOPY:FILEPATH=/usr/bin/objcopy - -//Path to a program. -CMAKE_OBJDUMP:FILEPATH=/usr/bin/objdump - -//Value Computed by CMake -CMAKE_PROJECT_NAME:STATIC=Runtime - -//Path to a program. -CMAKE_RANLIB:FILEPATH=/usr/bin/ranlib - -//Flags used by the linker during the creation of dll's. -CMAKE_SHARED_LINKER_FLAGS:STRING=-pg - -//Flags used by the linker during debug builds. -CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING=-pg - -//Flags used by the linker during release minsize builds. -CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING=-pg - -//Flags used by the linker during release builds. -CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING=-pg - -//Flags used by the linker during Release with Debug Info builds. -CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING=-pg - -//If set, runtime paths are not added when using shared libraries. -CMAKE_SKIP_RPATH:BOOL=NO - -//Path to a program. -CMAKE_STRIP:FILEPATH=/usr/bin/strip - -//If true, cmake will use relative paths in makefiles and projects. -CMAKE_USE_RELATIVE_PATHS:BOOL=OFF - -//If this value is on, makefiles will be generated without the -// .SILENT directive, and all commands will be echoed to the console -// during the make. This is useful for debugging only. With Visual -// Studio IDE projects all commands are done without /nologo. -CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE - -//Value Computed by CMake -ExamplesRT_BINARY_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/regiontemplates/examples - -//Value Computed by CMake -ExamplesRT_SOURCE_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/regiontemplates/examples - -//Value Computed by CMake -ExamplesSys_BINARY_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/examples - -//Value Computed by CMake -ExamplesSys_SOURCE_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/examples - -//Value Computed by CMake -ExecEngine_BINARY_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/ResourceManager - -//Value Computed by CMake -ExecEngine_SOURCE_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/ResourceManager - -//Value Computed by CMake -HelloWorldRT_BINARY_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/regiontemplates/examples/HelloWorldRT - -//Value Computed by CMake -HelloWorldRT_SOURCE_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/regiontemplates/examples/HelloWorldRT - -//Value Computed by CMake -HelloWorldSys_BINARY_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/examples/HelloWorld - -//Value Computed by CMake -HelloWorldSys_SOURCE_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/examples/HelloWorld - -//Value Computed by CMake -Hello_BINARY_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/ResourceManager/examples/hello - -//Value Computed by CMake -Hello_SOURCE_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/ResourceManager/examples/hello - -//Executable for running MPI programs. -MPIEXEC:FILEPATH=/usr/bin/mpiexec - -//Maximum number of processors available to run MPI applications. -MPIEXEC_MAX_NUMPROCS:STRING=2 - -//Flag used by MPI to specify the number of processes for MPIEXEC; -// the next option will be the number of processes. -MPIEXEC_NUMPROC_FLAG:STRING=-np - -//These flags will come after all flags given to MPIEXEC. -MPIEXEC_POSTFLAGS:STRING= - -//These flags will be directly before the executable that is being -// run by MPIEXEC. -MPIEXEC_PREFLAGS:STRING= - -//Cleared -MPI_CXX_COMPILER:FILEPATH=/usr/bin/mpicxx - -//MPI CXX compilation flags -MPI_CXX_COMPILE_FLAGS:STRING=-pg - -//MPI CXX include path -MPI_CXX_INCLUDE_PATH:STRING=/usr/lib/openmpi/include;/usr/lib/openmpi/include/openmpi - -//MPI CXX libraries to link against -MPI_CXX_LIBRARIES:STRING=/usr/lib/openmpi/lib/libmpi_cxx.so;/usr/lib/openmpi/lib/libmpi.so;/usr/lib/openmpi/lib/libopen-rte.so;/usr/lib/openmpi/lib/libopen-pal.so;/usr/lib/x86_64-linux-gnu/libdl.so;/usr/lib/x86_64-linux-gnu/libnsl.so;/usr/lib/x86_64-linux-gnu/libutil.so;/usr/lib/x86_64-linux-gnu/libm.so;/usr/lib/x86_64-linux-gnu/libdl.so - -//MPI CXX linking flags -MPI_CXX_LINK_FLAGS:STRING= -Wl,--export-dynamic,-pg - -//Cleared -MPI_C_COMPILER:FILEPATH=/usr/bin/mpicc - -//MPI C compilation flags -MPI_C_COMPILE_FLAGS:STRING=-pg - -//MPI C include path -MPI_C_INCLUDE_PATH:STRING=/usr/lib/openmpi/include;/usr/lib/openmpi/include/openmpi - -//MPI C libraries to link against -MPI_C_LIBRARIES:STRING=/usr/lib/openmpi/lib/libmpi.so;/usr/lib/openmpi/lib/libopen-rte.so;/usr/lib/openmpi/lib/libopen-pal.so;/usr/lib/x86_64-linux-gnu/libdl.so;/usr/lib/x86_64-linux-gnu/libnsl.so;/usr/lib/x86_64-linux-gnu/libutil.so;/usr/lib/x86_64-linux-gnu/libm.so;/usr/lib/x86_64-linux-gnu/libdl.so - -//MPI C linking flags -MPI_C_LINK_FLAGS:STRING= -Wl,--export-dynamic,-pg - -//Extra MPI libraries to link against -MPI_EXTRA_LIBRARY:STRING=/usr/lib/openmpi/lib/libmpi.so;/usr/lib/openmpi/lib/libopen-rte.so;/usr/lib/openmpi/lib/libopen-pal.so;/usr/lib/x86_64-linux-gnu/libdl.so;/usr/lib/x86_64-linux-gnu/libnsl.so;/usr/lib/x86_64-linux-gnu/libutil.so;/usr/lib/x86_64-linux-gnu/libm.so;/usr/lib/x86_64-linux-gnu/libdl.so - -//MPI library to link against -MPI_LIBRARY:FILEPATH=/usr/lib/openmpi/lib/libmpi_cxx.so - -//Path to a file. -NSCALE_BUILD_DIR:PATH=/home/willian/mestrado/my/nscale/build - -//Path to a file. -NSCALE_SRC_DIR:PATH=/home/willian/mestrado/my/nscale/src - -//Path where debug 3rdpaty OpenCV dependencies are located -OpenCV_3RDPARTY_LIB_DIR_DBG:PATH= - -//Path where release 3rdpaty OpenCV dependencies are located -OpenCV_3RDPARTY_LIB_DIR_OPT:PATH= - -OpenCV_CONFIG_PATH:FILEPATH=/home/willian/git/opencv-2.4.9/build - -//The directory containing a CMake configuration file for OpenCV. -OpenCV_DIR:PATH=/home/willian/git/opencv-2.4.9/build - -//Path where debug OpenCV libraries are located -OpenCV_LIB_DIR_DBG:PATH= - -//Path where release OpenCV libraries are located -OpenCV_LIB_DIR_OPT:PATH= - -//Value Computed by CMake -PipelineRTFS-SF_BINARY_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/regiontemplates/examples/PipelineRTFS-SF - -//Value Computed by CMake -PipelineRTFS-SF_SOURCE_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/regiontemplates/examples/PipelineRTFS-SF - -//Value Computed by CMake -PipelineTasks_BINARY_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/examples/PipelineTasks - -//Value Computed by CMake -PipelineTasks_SOURCE_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/examples/PipelineTasks - -//Enable compilation of Region Templates examples -RTEMPLATES_EXAMPLES:BOOL=ON - -//Enable compilation of Region Templates unit tests -RTEMPLATES_UNIT_TESTS:BOOL=OFF - -//Enable compilation of NScale example with Parameter Study -RT_PARAMETER_STUDY_NSCALE_EXAMPLE:BOOL=OFF - -//Enable compilation of Yi's example with Parameter Study -RT_PARAMETER_STUDY_YI_EXAMPLE:BOOL=OFF - -//Enable compilation of NScale example with tuning -RT_TUNING_NSCALE_EXAMPLE:BOOL=OFF - -//Enable compilation of Yi's examples with tuning -RT_TUNING_YI_EXAMPLE:BOOL=OFF - -//Value Computed by CMake -RegionTemplate_BINARY_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/regiontemplates - -//Value Computed by CMake -RegionTemplate_SOURCE_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/regiontemplates - -//Value Computed by CMake -Runtime_BINARY_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime - -//Value Computed by CMake -Runtime_SOURCE_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime - -//Value Computed by CMake -SystemTests_BINARY_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/tests - -//Value Computed by CMake -SystemTests_SOURCE_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/tests - -//Value Computed by CMake -TaskDependency_BINARY_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/ResourceManager/examples/taskDependency - -//Value Computed by CMake -TaskDependency_SOURCE_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/ResourceManager/examples/taskDependency - -//Value Computed by CMake -Tests_BINARY_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/ResourceManager/tests - -//Value Computed by CMake -Tests_SOURCE_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/ResourceManager/tests - -//Include compilation of Activer Harmony -USE_ACTIVE_HARMONY:BOOL=OFF - -//Include NVidia CUDA Runtime support -USE_CUDA:BOOL=OFF - -//Include support for Data Spaces in the Region Templates framework -USE_DATA_SPACES:BOOL=OFF - -//Enable use of fine grain segmentation tasks of NScale for tuning -// optimization -USE_FINE_GRAIN_SEG_TASKS:BOOL=ON - -//Compile HadoopGIS examples (Requires Hadoopgis) -USE_HADOOPGIS:BOOL=OFF - -//Include compilation of the Region Templates framework -USE_REGION_TEMPLATES:BOOL=ON - -//Value Computed by CMake -abc_BINARY_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/ResourceManager/examples/abc - -//Value Computed by CMake -abc_SOURCE_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/ResourceManager/examples/abc - -//Value Computed by CMake -abcde_BINARY_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/ResourceManager/examples/abcde - -//Value Computed by CMake -abcde_SOURCE_DIR:STATIC=/home/willian/mestrado/original/region-templates/runtime/ResourceManager/examples/abcde - -//Dependencies for the target -componentsPipeTasks_LIB_DEPENDS:STATIC=general;runtimesystem; - -//Dependencies for the target -components_LIB_DEPENDS:STATIC=general;runtimesystem; - -//Dependencies for the target -componentsrt_LIB_DEPENDS:STATIC=general;runtimesystem;general;regiontemplates;general;segment;general;featuresAll;general;opencv_videostab;general;opencv_video;general;opencv_ts;general;opencv_superres;general;opencv_stitching;general;opencv_photo;general;opencv_ocl;general;opencv_objdetect;general;opencv_nonfree;general;opencv_ml;general;opencv_legacy;general;opencv_imgproc;general;opencv_highgui;general;opencv_gpu;general;opencv_flann;general;opencv_features2d;general;opencv_core;general;opencv_contrib;general;opencv_calib3d;general;opencv_videostab;general;opencv_video;general;opencv_ts;general;opencv_superres;general;opencv_stitching;general;opencv_photo;general;opencv_ocl;general;opencv_objdetect;general;opencv_nonfree;general;opencv_ml;general;opencv_legacy;general;opencv_imgproc;general;opencv_highgui;general;opencv_gpu;general;opencv_flann;general;opencv_features2d;general;opencv_core;general;opencv_contrib;general;opencv_calib3d;general;opencv_videostab;general;opencv_video;general;opencv_ts;general;opencv_superres;general;opencv_stitching;general;opencv_photo;general;opencv_ocl;general;opencv_objdetect;general;opencv_nonfree;general;opencv_ml;general;opencv_legacy;general;opencv_imgproc;general;opencv_highgui;general;opencv_gpu;general;opencv_flann;general;opencv_features2d;general;opencv_core;general;opencv_contrib;general;opencv_calib3d; - -//Dependencies for the target -componentsrtfs_LIB_DEPENDS:STATIC=general;runtimesystem;general;regiontemplates;general;segment;general;featuresAll;general;opencv_videostab;general;opencv_video;general;opencv_ts;general;opencv_superres;general;opencv_stitching;general;opencv_photo;general;opencv_ocl;general;opencv_objdetect;general;opencv_nonfree;general;opencv_ml;general;opencv_legacy;general;opencv_imgproc;general;opencv_highgui;general;opencv_gpu;general;opencv_flann;general;opencv_features2d;general;opencv_core;general;opencv_contrib;general;opencv_calib3d;general;opencv_videostab;general;opencv_video;general;opencv_ts;general;opencv_superres;general;opencv_stitching;general;opencv_photo;general;opencv_ocl;general;opencv_objdetect;general;opencv_nonfree;general;opencv_ml;general;opencv_legacy;general;opencv_imgproc;general;opencv_highgui;general;opencv_gpu;general;opencv_flann;general;opencv_features2d;general;opencv_core;general;opencv_contrib;general;opencv_calib3d;general;opencv_videostab;general;opencv_video;general;opencv_ts;general;opencv_superres;general;opencv_stitching;general;opencv_photo;general;opencv_ocl;general;opencv_objdetect;general;opencv_nonfree;general;opencv_ml;general;opencv_legacy;general;opencv_imgproc;general;opencv_highgui;general;opencv_gpu;general;opencv_flann;general;opencv_features2d;general;opencv_core;general;opencv_contrib;general;opencv_calib3d; - -//Dependencies for the target -execengine_LIB_DEPENDS:STATIC=general;-lpthread;general;opencv_videostab;general;opencv_video;general;opencv_ts;general;opencv_superres;general;opencv_stitching;general;opencv_photo;general;opencv_ocl;general;opencv_objdetect;general;opencv_nonfree;general;opencv_ml;general;opencv_legacy;general;opencv_imgproc;general;opencv_highgui;general;opencv_gpu;general;opencv_flann;general;opencv_features2d;general;opencv_core;general;opencv_contrib;general;opencv_calib3d;general;opencv_videostab;general;opencv_video;general;opencv_ts;general;opencv_superres;general;opencv_stitching;general;opencv_photo;general;opencv_ocl;general;opencv_objdetect;general;opencv_nonfree;general;opencv_ml;general;opencv_legacy;general;opencv_imgproc;general;opencv_highgui;general;opencv_gpu;general;opencv_flann;general;opencv_features2d;general;opencv_core;general;opencv_contrib;general;opencv_calib3d; - -//Path to a program. -file_cmd:FILEPATH=/usr/bin/file - -//Dependencies for the target -regiontemplates_LIB_DEPENDS:STATIC=general;/usr/lib/openmpi/lib/libmpi_cxx.so;general;/usr/lib/openmpi/lib/libmpi.so;general;/usr/lib/openmpi/lib/libopen-rte.so;general;/usr/lib/openmpi/lib/libopen-pal.so;general;/usr/lib/x86_64-linux-gnu/libdl.so;general;/usr/lib/x86_64-linux-gnu/libnsl.so;general;/usr/lib/x86_64-linux-gnu/libutil.so;general;/usr/lib/x86_64-linux-gnu/libm.so;general;/usr/lib/x86_64-linux-gnu/libdl.so;general;opencv_videostab;general;opencv_video;general;opencv_ts;general;opencv_superres;general;opencv_stitching;general;opencv_photo;general;opencv_ocl;general;opencv_objdetect;general;opencv_nonfree;general;opencv_ml;general;opencv_legacy;general;opencv_imgproc;general;opencv_highgui;general;opencv_gpu;general;opencv_flann;general;opencv_features2d;general;opencv_core;general;opencv_contrib;general;opencv_calib3d;general;opencv_videostab;general;opencv_video;general;opencv_ts;general;opencv_superres;general;opencv_stitching;general;opencv_photo;general;opencv_ocl;general;opencv_objdetect;general;opencv_nonfree;general;opencv_ml;general;opencv_legacy;general;opencv_imgproc;general;opencv_highgui;general;opencv_gpu;general;opencv_flann;general;opencv_features2d;general;opencv_core;general;opencv_contrib;general;opencv_calib3d; - -//Dependencies for the target -runtimesystem_LIB_DEPENDS:STATIC=general;/usr/lib/openmpi/lib/libmpi_cxx.so;general;/usr/lib/openmpi/lib/libmpi.so;general;/usr/lib/openmpi/lib/libopen-rte.so;general;/usr/lib/openmpi/lib/libopen-pal.so;general;/usr/lib/x86_64-linux-gnu/libdl.so;general;/usr/lib/x86_64-linux-gnu/libnsl.so;general;/usr/lib/x86_64-linux-gnu/libutil.so;general;/usr/lib/x86_64-linux-gnu/libm.so;general;/usr/lib/x86_64-linux-gnu/libdl.so;general;execengine;general;regiontemplates; - - -######################## -# INTERNAL cache entries -######################## - -//ADVANCED property for variable: CMAKE_AR -CMAKE_AR-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_BUILD_TOOL -CMAKE_BUILD_TOOL-ADVANCED:INTERNAL=1 -//What is the target build tool cmake is generating for. -CMAKE_BUILD_TOOL:INTERNAL=/usr/bin/make -//This is the directory where this CMakeCache.txt was created -CMAKE_CACHEFILE_DIR:INTERNAL=/home/willian/mestrado/original/region-templates/runtime -//Major version of cmake used to create the current loaded cache -CMAKE_CACHE_MAJOR_VERSION:INTERNAL=2 -//Minor version of cmake used to create the current loaded cache -CMAKE_CACHE_MINOR_VERSION:INTERNAL=8 -//Patch version of cmake used to create the current loaded cache -CMAKE_CACHE_PATCH_VERSION:INTERNAL=7 -//ADVANCED property for variable: CMAKE_COLOR_MAKEFILE -CMAKE_COLOR_MAKEFILE-ADVANCED:INTERNAL=1 -//Path to CMake executable. -CMAKE_COMMAND:INTERNAL=/usr/bin/cmake -//Path to cpack program executable. -CMAKE_CPACK_COMMAND:INTERNAL=/usr/bin/cpack -//Path to ctest program executable. -CMAKE_CTEST_COMMAND:INTERNAL=/usr/bin/ctest -//ADVANCED property for variable: CMAKE_CXX_COMPILER -CMAKE_CXX_COMPILER-ADVANCED:INTERNAL=1 -CMAKE_CXX_COMPILER_WORKS:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS -CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG -CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL -CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE -CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO -CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_COMPILER -CMAKE_C_COMPILER-ADVANCED:INTERNAL=1 -CMAKE_C_COMPILER_WORKS:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS -CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 -//MODIFIED property for variable: CMAKE_C_FLAGS -CMAKE_C_FLAGS-MODIFIED:INTERNAL=ON -//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG -CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL -CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE -CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO -CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//Result of TRY_COMPILE -CMAKE_DETERMINE_CXX_ABI_COMPILED:INTERNAL=TRUE -//Result of TRY_COMPILE -CMAKE_DETERMINE_C_ABI_COMPILED:INTERNAL=TRUE -//Path to cache edit program executable. -CMAKE_EDIT_COMMAND:INTERNAL=/usr/bin/ccmake -//Executable file format -CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS -CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//MODIFIED property for variable: CMAKE_EXE_LINKER_FLAGS -CMAKE_EXE_LINKER_FLAGS-MODIFIED:INTERNAL=ON -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG -CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//MODIFIED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG -CMAKE_EXE_LINKER_FLAGS_DEBUG-MODIFIED:INTERNAL=ON -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL -CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//MODIFIED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL -CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-MODIFIED:INTERNAL=ON -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE -CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//MODIFIED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE -CMAKE_EXE_LINKER_FLAGS_RELEASE-MODIFIED:INTERNAL=ON -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//MODIFIED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-MODIFIED:INTERNAL=ON -//ADVANCED property for variable: CMAKE_EXPORT_COMPILE_COMMANDS -CMAKE_EXPORT_COMPILE_COMMANDS-ADVANCED:INTERNAL=1 -//Name of generator. -CMAKE_GENERATOR:INTERNAL=Unix Makefiles -//Have library pthreads -CMAKE_HAVE_PTHREADS_CREATE:INTERNAL= -//Have library pthread -CMAKE_HAVE_PTHREAD_CREATE:INTERNAL=1 -//Have include CMAKE_HAVE_PTHREAD_H -CMAKE_HAVE_PTHREAD_H:INTERNAL=1 -//Start directory with the top level CMakeLists.txt file for this -// project -CMAKE_HOME_DIRECTORY:INTERNAL=/home/willian/mestrado/original/region-templates/runtime -//Install .so files without execute permission. -CMAKE_INSTALL_SO_NO_EXE:INTERNAL=1 -//ADVANCED property for variable: CMAKE_LINKER -CMAKE_LINKER-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MAKE_PROGRAM -CMAKE_MAKE_PROGRAM-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS -CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//MODIFIED property for variable: CMAKE_MODULE_LINKER_FLAGS -CMAKE_MODULE_LINKER_FLAGS-MODIFIED:INTERNAL=ON -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG -CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//MODIFIED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG -CMAKE_MODULE_LINKER_FLAGS_DEBUG-MODIFIED:INTERNAL=ON -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL -CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//MODIFIED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL -CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-MODIFIED:INTERNAL=ON -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE -CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//MODIFIED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE -CMAKE_MODULE_LINKER_FLAGS_RELEASE-MODIFIED:INTERNAL=ON -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//MODIFIED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-MODIFIED:INTERNAL=ON -//ADVANCED property for variable: CMAKE_NM -CMAKE_NM-ADVANCED:INTERNAL=1 -//number of local generators -CMAKE_NUMBER_OF_LOCAL_GENERATORS:INTERNAL=15 -//ADVANCED property for variable: CMAKE_OBJCOPY -CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_OBJDUMP -CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_RANLIB -CMAKE_RANLIB-ADVANCED:INTERNAL=1 -//Path to CMake installation. -CMAKE_ROOT:INTERNAL=/usr/share/cmake-2.8 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS -CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//MODIFIED property for variable: CMAKE_SHARED_LINKER_FLAGS -CMAKE_SHARED_LINKER_FLAGS-MODIFIED:INTERNAL=ON -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG -CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//MODIFIED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG -CMAKE_SHARED_LINKER_FLAGS_DEBUG-MODIFIED:INTERNAL=ON -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL -CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//MODIFIED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL -CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-MODIFIED:INTERNAL=ON -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE -CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//MODIFIED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE -CMAKE_SHARED_LINKER_FLAGS_RELEASE-MODIFIED:INTERNAL=ON -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//MODIFIED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-MODIFIED:INTERNAL=ON -//ADVANCED property for variable: CMAKE_SKIP_RPATH -CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STRIP -CMAKE_STRIP-ADVANCED:INTERNAL=1 -//uname command -CMAKE_UNAME:INTERNAL=/bin/uname -//ADVANCED property for variable: CMAKE_USE_RELATIVE_PATHS -CMAKE_USE_RELATIVE_PATHS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE -CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 -//Details about finding MPI_C -FIND_PACKAGE_MESSAGE_DETAILS_MPI_C:INTERNAL=[/usr/lib/openmpi/lib/libmpi.so;/usr/lib/openmpi/lib/libopen-rte.so;/usr/lib/openmpi/lib/libopen-pal.so;/usr/lib/x86_64-linux-gnu/libdl.so;/usr/lib/x86_64-linux-gnu/libnsl.so;/usr/lib/x86_64-linux-gnu/libutil.so;/usr/lib/x86_64-linux-gnu/libm.so;/usr/lib/x86_64-linux-gnu/libdl.so][/usr/lib/openmpi/include;/usr/lib/openmpi/include/openmpi][v()] -//Details about finding MPI_CXX -FIND_PACKAGE_MESSAGE_DETAILS_MPI_CXX:INTERNAL=[/usr/lib/openmpi/lib/libmpi_cxx.so;/usr/lib/openmpi/lib/libmpi.so;/usr/lib/openmpi/lib/libopen-rte.so;/usr/lib/openmpi/lib/libopen-pal.so;/usr/lib/x86_64-linux-gnu/libdl.so;/usr/lib/x86_64-linux-gnu/libnsl.so;/usr/lib/x86_64-linux-gnu/libutil.so;/usr/lib/x86_64-linux-gnu/libm.so;/usr/lib/x86_64-linux-gnu/libdl.so][/usr/lib/openmpi/include;/usr/lib/openmpi/include/openmpi][v()] -//Details about finding Threads -FIND_PACKAGE_MESSAGE_DETAILS_Threads:INTERNAL=[TRUE][v()] -//ADVANCED property for variable: MPIEXEC -MPIEXEC-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: MPIEXEC_MAX_NUMPROCS -MPIEXEC_MAX_NUMPROCS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: MPIEXEC_NUMPROC_FLAG -MPIEXEC_NUMPROC_FLAG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: MPIEXEC_POSTFLAGS -MPIEXEC_POSTFLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: MPIEXEC_PREFLAGS -MPIEXEC_PREFLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: MPI_CXX_COMPILER -MPI_CXX_COMPILER-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: MPI_CXX_COMPILE_FLAGS -MPI_CXX_COMPILE_FLAGS-ADVANCED:INTERNAL=1 -//MODIFIED property for variable: MPI_CXX_COMPILE_FLAGS -MPI_CXX_COMPILE_FLAGS-MODIFIED:INTERNAL=ON -//ADVANCED property for variable: MPI_CXX_INCLUDE_PATH -MPI_CXX_INCLUDE_PATH-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: MPI_CXX_LIBRARIES -MPI_CXX_LIBRARIES-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: MPI_CXX_LINK_FLAGS -MPI_CXX_LINK_FLAGS-ADVANCED:INTERNAL=1 -//MODIFIED property for variable: MPI_CXX_LINK_FLAGS -MPI_CXX_LINK_FLAGS-MODIFIED:INTERNAL=ON -//ADVANCED property for variable: MPI_C_COMPILER -MPI_C_COMPILER-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: MPI_C_COMPILE_FLAGS -MPI_C_COMPILE_FLAGS-ADVANCED:INTERNAL=1 -//MODIFIED property for variable: MPI_C_COMPILE_FLAGS -MPI_C_COMPILE_FLAGS-MODIFIED:INTERNAL=ON -//ADVANCED property for variable: MPI_C_INCLUDE_PATH -MPI_C_INCLUDE_PATH-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: MPI_C_LIBRARIES -MPI_C_LIBRARIES-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: MPI_C_LINK_FLAGS -MPI_C_LINK_FLAGS-ADVANCED:INTERNAL=1 -//MODIFIED property for variable: MPI_C_LINK_FLAGS -MPI_C_LINK_FLAGS-MODIFIED:INTERNAL=ON -//Scratch variable for MPI header detection -MPI_HEADER_PATH:INTERNAL=MPI_HEADER_PATH-NOTFOUND -//Scratch variable for MPI lib detection -MPI_LIB:INTERNAL=MPI_LIB-NOTFOUND -//MODIFIED property for variable: NSCALE_BUILD_DIR -NSCALE_BUILD_DIR-MODIFIED:INTERNAL=ON -//MODIFIED property for variable: NSCALE_SRC_DIR -NSCALE_SRC_DIR-MODIFIED:INTERNAL=ON -//ADVANCED property for variable: OpenCV_3RDPARTY_LIB_DIR_DBG -OpenCV_3RDPARTY_LIB_DIR_DBG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: OpenCV_3RDPARTY_LIB_DIR_OPT -OpenCV_3RDPARTY_LIB_DIR_OPT-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: OpenCV_CONFIG_PATH -OpenCV_CONFIG_PATH-ADVANCED:INTERNAL=1 -//MODIFIED property for variable: OpenCV_DIR -OpenCV_DIR-MODIFIED:INTERNAL=ON -//ADVANCED property for variable: OpenCV_LIB_DIR_DBG -OpenCV_LIB_DIR_DBG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: OpenCV_LIB_DIR_OPT -OpenCV_LIB_DIR_OPT-ADVANCED:INTERNAL=1 -//MODIFIED property for variable: RTEMPLATES_EXAMPLES -RTEMPLATES_EXAMPLES-MODIFIED:INTERNAL=ON -//MODIFIED property for variable: USE_FINE_GRAIN_SEG_TASKS -USE_FINE_GRAIN_SEG_TASKS-MODIFIED:INTERNAL=ON - diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/CMakeLists.txt b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/CMakeLists.txt index cfd9934..a043bea 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/CMakeLists.txt +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 2.6) project(PipelineRTFS-NS-Diff-FGO) -add_definitions( -std=c++11 -ggdb -gdwarf-2 ) +add_definitions( -std=c++11 -ggdb -gdwarf-2 -fopenmp) #add_definitions( -std=c++11 ) find_package( OpenCV REQUIRED ) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index a77c94f..eca899f 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -12,6 +12,8 @@ #include #include +#include + #include "json/json.h" #include "SysEnv.h" @@ -131,7 +133,7 @@ int main(int argc, char* argv[]) { SysEnv sysEnv; // Tell the system which libraries should be used - sysEnv.startupSystem(argc, argv, "libcomponentnsdifffgo.so"); + // sysEnv.startupSystem(argc, argv, "libcomponentnsdifffgo.so"); // region template used by all stages RegionTemplate *rt = new RegionTemplate(); @@ -270,7 +272,7 @@ int main(int argc, char* argv[]) { add_arguments_to_stages(expanded_stages, expanded_args, rt); map merged_stages; - int size = 30; + int size = 60; // MPI_Comm_size(MPI_COMM_WORLD, &size); merge_stages_fine_grain(expanded_stages, base_stages, merged_stages, rt, expanded_args, size-1); @@ -365,10 +367,10 @@ int main(int argc, char* argv[]) { // workaround to make sure that the RTs, if any, won't leak on this part of the algorithm s.second->setLocation(PipelineComponentBase::MANAGER_SIDE); - sysEnv.executeComponent(s.second); + // sysEnv.executeComponent(s.second); } } - // return 0; + return 0; // execute workflows cout << endl << "startupExecution" << endl; @@ -1874,6 +1876,10 @@ void montecarlo_dep(int n, list c1, list> montecarlo_recursive_cut(list, list>>::iterator i=current_cuts.begin(); - i!=current_cuts.end(); i++) { - // WARNING: best cut is shared between all montecarlo_dep runs - montecarlo_dep(n, i->first, i->second, all_stages, args, ref, best_mksp, best_var, best_cut); } + } + + // cout << "---------------------------------------------------" << endl; + + // #pragma omp parallel + // { + // #pragma omp single + // { + // // runs all dependencies a la montecarlo + // for (list, list>>::iterator i=current_cuts.begin(); + // i!=current_cuts.end(); i++) { + // // WARNING: best cut is shared between all montecarlo_dep runs + // #pragma omp task + // montecarlo_dep(n, i->first, i->second, all_stages, args, ref, best_mksp, best_var, best_cut); + // } + // } cout << "[montecarlo_recursive_cut] n=" << n << " best cut of the stage with mksp=" << best_mksp << endl; cout << "\tc1:" << endl; From 1078ccb5a08ed2b5a908cabb25adecd1f71c2ee5 Mon Sep 17 00:00:00 2001 From: Willian Date: Tue, 27 Sep 2016 16:07:24 -0300 Subject: [PATCH 57/87] Fixed all (serious) memory leaks. --- runtime/PipelineComponentBase.cpp | 3 +- runtime/PipelineComponentBase.h | 3 ++ runtime/ReusableTask.hpp | 4 ++ .../PipelineManager.cpp | 47 ++++++++++++------- .../PipelineRTFS-NS-Diff-FGO/Segmentation.cpp | 30 ++++++++---- 5 files changed, 58 insertions(+), 29 deletions(-) diff --git a/runtime/PipelineComponentBase.cpp b/runtime/PipelineComponentBase.cpp index 14b2d0d..d3c8b4f 100644 --- a/runtime/PipelineComponentBase.cpp +++ b/runtime/PipelineComponentBase.cpp @@ -22,6 +22,7 @@ PipelineComponentBase::PipelineComponentBase(){ this->resultData = NULL; this->reused = NULL; + this->remove_outputs = false; // this->input_arguments = new std::list(); // this->output_arguments = new std::list(); } @@ -37,7 +38,7 @@ PipelineComponentBase::~PipelineComponentBase() { while(this->arguments.size()> 0){ ArgumentBase *aux = this->arguments.back(); this->arguments.pop_back(); - if (aux->getIo() == ArgumentBase::input) { + if (remove_outputs || aux->getIo() == ArgumentBase::input) { delete aux; } } diff --git a/runtime/PipelineComponentBase.h b/runtime/PipelineComponentBase.h index a443d65..2a41e8c 100644 --- a/runtime/PipelineComponentBase.h +++ b/runtime/PipelineComponentBase.h @@ -177,6 +177,9 @@ class PipelineComponentBase: public Task { PipelineComponentBase* reused; + // used to fix a memory leak when merging the PCBs + bool remove_outputs; + // needed for inter stage dependency verification on task merging std::vector getArguments() {return arguments;}; diff --git a/runtime/ReusableTask.hpp b/runtime/ReusableTask.hpp index 92b778e..969b6c3 100644 --- a/runtime/ReusableTask.hpp +++ b/runtime/ReusableTask.hpp @@ -28,6 +28,10 @@ class ReusableTask: public Task { // list of tasks' ids that are dependent on this task int parentTask; + // if the task isn't going to be executed then it's a mock + // used to enable corect arguments delete, preventing mem leaking + bool mock = true; + ReusableTask() {parentTask = -1;}; virtual ~ReusableTask() {}; diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index eca899f..fbbcc68 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -133,7 +133,7 @@ int main(int argc, char* argv[]) { SysEnv sysEnv; // Tell the system which libraries should be used - // sysEnv.startupSystem(argc, argv, "libcomponentnsdifffgo.so"); + sysEnv.startupSystem(argc, argv, "libcomponentnsdifffgo.so"); // region template used by all stages RegionTemplate *rt = new RegionTemplate(); @@ -273,7 +273,7 @@ int main(int argc, char* argv[]) { map merged_stages; int size = 60; - // MPI_Comm_size(MPI_COMM_WORLD, &size); + MPI_Comm_size(MPI_COMM_WORLD, &size); merge_stages_fine_grain(expanded_stages, base_stages, merged_stages, rt, expanded_args, size-1); cout << endl<< "merged-fine before deps resolution: " << endl; @@ -367,10 +367,10 @@ int main(int argc, char* argv[]) { // workaround to make sure that the RTs, if any, won't leak on this part of the algorithm s.second->setLocation(PipelineComponentBase::MANAGER_SIDE); - // sysEnv.executeComponent(s.second); + sysEnv.executeComponent(s.second); } } - return 0; + // return 0; // execute workflows cout << endl << "startupExecution" << endl; @@ -1292,18 +1292,18 @@ bool merging_condition(PipelineComponentBase* merged, PipelineComponentBase* to_ if (!exists_reusable_task(merged, to_merge, ref.begin()->first)) return false; - // verify if the stage dependecy is the same - for (ArgumentBase* a1 : merged->getArguments()) { - ArgumentBase* arg1 = args[a1->getId()]; - if (arg1->getParent() != 0) { - for (ArgumentBase* a2 : to_merge->getArguments()) { - ArgumentBase* arg2 = args[a2->getId()]; - if (arg1->getParent() == arg2->getParent()) { - return true; - } - } - } - } + // // verify if the stage dependecy is the same + // for (ArgumentBase* a1 : merged->getArguments()) { + // ArgumentBase* arg1 = args[a1->getId()]; + // if (arg1->getParent() != 0) { + // for (ArgumentBase* a2 : to_merge->getArguments()) { + // ArgumentBase* arg2 = args[a2->getId()]; + // if (arg1->getParent() == arg2->getParent()) { + // return true; + // } + // } + // } + // } return false; } @@ -1477,7 +1477,9 @@ mincut::weight_t get_reuse_factor(PipelineComponentBase* s1, PipelineComponentBa mincut::weight_t ret = s1->tasks.size() + s2->tasks.size() - s1_clone->tasks.size(); // clean memory + s1_clone->remove_outputs = true; delete s1_clone; + s2_clone->remove_outputs = true; delete s2_clone; return ret; @@ -1501,7 +1503,8 @@ mincut::weight_t get_reuse_factor(mincut::subgraph_t s1, mincut::subgraph_t s2, for (ReusableTask* t : clone1->tasks) { current1->tasks.emplace_back(t->clone()); } - } + } + clone1->remove_outputs = true; delete clone1; } @@ -1514,17 +1517,21 @@ mincut::weight_t get_reuse_factor(mincut::subgraph_t s1, mincut::subgraph_t s2, clone2->setLocation(PipelineComponentBase::WORKER_SIDE); if (merging_condition(current2, clone2, args, ref)) merge_stages(current2, clone2, ref); - else + else { for (ReusableTask* t : clone2->tasks) { current2->tasks.emplace_back(t->clone()); } + } + clone2->remove_outputs = true; delete clone2; } int ret = current1->tasks.size()>current2->tasks.size()?current1->tasks.size():current2->tasks.size(); // clear memory + current1->remove_outputs = true; delete current1; + current2->remove_outputs = true; delete current2; return ret; @@ -1542,6 +1549,7 @@ float calc_stage_proc(list s, map &a PipelineComponentBase* j_clone = (*j)->clone(); j_clone->setLocation(PipelineComponentBase::WORKER_SIDE); merge_stages(current, j_clone, ref); + j_clone->remove_outputs = true; delete j_clone; j = s.erase(j); } else @@ -1555,6 +1563,7 @@ float calc_stage_proc(list s, map &a for (ReusableTask* t : p->tasks) // proc_cost += t->getProcCost(); proc_cost++; + p->remove_outputs = true; delete p; } @@ -1580,6 +1589,7 @@ float calc_stage_mem(list s, map &ar j_clone->setLocation(PipelineComponentBase::WORKER_SIDE); merge_stages(current, j_clone, ref); j = s.erase(j); + j_clone->remove_outputs = true; delete j_clone; } else j++; @@ -1591,6 +1601,7 @@ float calc_stage_mem(list s, map &ar for (ReusableTask* t : p->tasks) // mem_cost += t->getMemCost(); mem_cost+=0; + p->remove_outputs = true; delete p; } diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp index 144a16f..444f514 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp @@ -137,6 +137,7 @@ int Segmentation::run() { // send all tasks to be executed for (ReusableTask* t : ordered_tasks) { cout << "\t\t\t[Segmentation] sending task " << t->getId() << endl; + t->mock = false; this->executeTask(t); } @@ -211,7 +212,10 @@ TaskSegmentation0::TaskSegmentation0(list args, RegionTemplate* i } -TaskSegmentation0::~TaskSegmentation0() {} +TaskSegmentation0::~TaskSegmentation0() { + if (normalized_rt_temp.unique() && mock) + delete *normalized_rt_temp; +} bool TaskSegmentation0::run(int procType, int tid) { cv::Mat normalized_rt = (*this->normalized_rt_temp)->getData(); @@ -401,7 +405,7 @@ ReusableTask* TaskSegmentation0::clone() { char *buff = new char[size]; this->serialize(buff); retValue->deserialize(buff); - delete buff; + delete[] buff; return retValue; } @@ -572,7 +576,7 @@ ReusableTask* TaskSegmentation1::clone() { char *buff = new char[size]; this->serialize(buff); retValue->deserialize(buff); - delete buff; + delete[] buff; return retValue; } @@ -755,7 +759,7 @@ ReusableTask* TaskSegmentation2::clone() { char *buff = new char[size]; this->serialize(buff); retValue->deserialize(buff); - delete buff; + delete[] buff; return retValue; } @@ -934,7 +938,7 @@ ReusableTask* TaskSegmentation3::clone() { char *buff = new char[size]; this->serialize(buff); retValue->deserialize(buff); - delete buff; + delete[] buff; return retValue; } @@ -1098,7 +1102,7 @@ ReusableTask* TaskSegmentation4::clone() { char *buff = new char[size]; this->serialize(buff); retValue->deserialize(buff); - delete buff; + delete[] buff; return retValue; } @@ -1160,7 +1164,10 @@ TaskSegmentation5::TaskSegmentation5(list args, RegionTemplate* i } -TaskSegmentation5::~TaskSegmentation5() {} +TaskSegmentation5::~TaskSegmentation5() { + if (normalized_rt_temp.unique() && mock) + delete *normalized_rt_temp; +} bool TaskSegmentation5::run(int procType, int tid) { cv::Mat normalized_rt = (*this->normalized_rt_temp)->getData(); @@ -1321,7 +1328,7 @@ ReusableTask* TaskSegmentation5::clone() { char *buff = new char[size]; this->serialize(buff); retValue->deserialize(buff); - delete buff; + delete[] buff; return retValue; } @@ -1387,7 +1394,10 @@ TaskSegmentation6::TaskSegmentation6(list args, RegionTemplate* i } -TaskSegmentation6::~TaskSegmentation6() {} +TaskSegmentation6::~TaskSegmentation6() { + if (segmented_rt_temp.unique() && mock) + delete *segmented_rt_temp; +} bool TaskSegmentation6::run(int procType, int tid) { @@ -1554,7 +1564,7 @@ ReusableTask* TaskSegmentation6::clone() { char *buff = new char[size]; this->serialize(buff); retValue->deserialize(buff); - delete buff; + delete[] buff; return retValue; } From b0ee75a6d76380ea5895712e803b9027ae8e15b6 Mon Sep 17 00:00:00 2001 From: Willian Date: Wed, 28 Sep 2016 22:55:13 -0300 Subject: [PATCH 58/87] Changed MPI_Init strategy MPI_Init is now called from PipelineManager in order to get the number of processes. Also, the manager process does the merging while the others wait in a non-busy-waiting manner. This was implemented to enable paralelism on the montecarlo recursive cut merging algorithm. --- runtime/SysEnv.cpp | 5 +- .../PipelineManager.cpp | 515 +++++++++--------- 2 files changed, 274 insertions(+), 246 deletions(-) diff --git a/runtime/SysEnv.cpp b/runtime/SysEnv.cpp index 25d080a..22f9124 100644 --- a/runtime/SysEnv.cpp +++ b/runtime/SysEnv.cpp @@ -33,7 +33,10 @@ SysEnv::~SysEnv() { // initialize MPI MPI::Intracomm init_mpi(int argc, char **argv, int &size, int &rank, std::string &hostname) { - MPI::Init(argc, argv); + int initialized; + MPI_Initialized(&initialized); + if (!initialized) + MPI::Init(argc, argv); char *temp = new char[256]; gethostname(temp, 255); diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index fbbcc68..2c4122c 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -129,266 +129,291 @@ parsing::port_type_t get_port_type(string s); int main(int argc, char* argv[]) { + int mpi_rank; + int mpi_size; + int mpi_val; + + MPI_Init(&argc, &argv); + + MPI_Comm_size(MPI_COMM_WORLD, &mpi_size); + MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank); + // Handler to the distributed execution system environment SysEnv sysEnv; - // Tell the system which libraries should be used - sysEnv.startupSystem(argc, argv, "libcomponentnsdifffgo.so"); + if (mpi_rank == mpi_size-1) { + // region template used by all stages + RegionTemplate *rt = new RegionTemplate(); + rt->setName("tile"); - // region template used by all stages - RegionTemplate *rt = new RegionTemplate(); - rt->setName("tile"); + // get arguments + if (argc != 1 && argc != 3) { + cout << "usage: ./PipelineRTFS-NS-Diff-FGO [-i DAKOTA_OUTPUT_FILE]" << endl; + return 0; + } - // get arguments - if (argc != 1 && argc != 3) { - cout << "usage: ./PipelineRTFS-NS-Diff-FGO [-i DAKOTA_OUTPUT_FILE]" << endl; - return 0; - } + // workflow file + FILE* workflow_descriptor = fopen("seg_example.t2flow", "r"); - // workflow file - FILE* workflow_descriptor = fopen("seg_example.t2flow", "r"); + //------------------------------------------------------------ + // Parse pipeline file + //------------------------------------------------------------ - //------------------------------------------------------------ - // Parse pipeline file - //------------------------------------------------------------ + // get all workflow inputs without their values, returning also the parameters + // values (i.e list values) on another map + map workflow_inputs; + map> parameters_values; + get_inputs_from_file(workflow_descriptor, workflow_inputs, parameters_values); - // get all workflow inputs without their values, returning also the parameters - // values (i.e list values) on another map - map workflow_inputs; - map> parameters_values; - get_inputs_from_file(workflow_descriptor, workflow_inputs, parameters_values); + // cout << "workflow_inputs:" << endl; + // for (pair p : workflow_inputs) + // cout << p.first << ":" << p.second->getName() << endl; - // cout << "workflow_inputs:" << endl; - // for (pair p : workflow_inputs) - // cout << p.first << ":" << p.second->getName() << endl; + // cout << endl << "parameters_values:" << endl; + // for (pair> p : parameters_values) { + // cout << "argument " << p.first << ":" << workflow_inputs[p.first]->getName() << ":" << endl; + // for (ArgumentBase* a : p.second) + // cout << "\t" << a->toString() << endl; + // } - // cout << endl << "parameters_values:" << endl; - // for (pair> p : parameters_values) { - // cout << "argument " << p.first << ":" << workflow_inputs[p.first]->getName() << ":" << endl; - // for (ArgumentBase* a : p.second) - // cout << "\t" << a->toString() << endl; - // } + // get all workflow outputs + map workflow_outputs; + get_outputs_from_file(workflow_descriptor, workflow_outputs); + // cout << endl << "workflow_outputs " << endl; + // mapprint(workflow_outputs); + // for (pair p : workflow_outputs) + // cout << p.second->getId() << ":" << p.second->getName() << endl; + + // get all stages, also setting the uid from this context to Task (i.e Task::setId()) + // also returns the list of arguments used + // the stages dependencies are also set here (i.e Task::addDependency()) + map base_stages; + map interstage_arguments; + get_stages_from_file(workflow_descriptor, base_stages, interstage_arguments); + // cout << endl << "base_stages:" << endl; + // for (pair p : base_stages) { + // cout << p.first << ":" << p.second->getName() << endl; + // cout << "\toutputs: " << p.second->getOutputs().size() << endl << endl; + // for (int i : p.second->getOutputs()) + // cout << "\t\t" << i << ":" << interstage_arguments[i]->getName() << endl; + // cout << "\t task descriptors:" << endl; + // for (pair> d : p.second->tasksDesc) { + // cout << "\t\ttask: " << d.first << endl; + // for (ArgumentBase* a : d.second) + // cout << "\t\t\t" << a->getName() << endl; + // } + // } - // get all workflow outputs - map workflow_outputs; - get_outputs_from_file(workflow_descriptor, workflow_outputs); - // cout << endl << "workflow_outputs " << endl; - // mapprint(workflow_outputs); - // for (pair p : workflow_outputs) - // cout << p.second->getId() << ":" << p.second->getName() << endl; - - // get all stages, also setting the uid from this context to Task (i.e Task::setId()) - // also returns the list of arguments used - // the stages dependencies are also set here (i.e Task::addDependency()) - map base_stages; - map interstage_arguments; - get_stages_from_file(workflow_descriptor, base_stages, interstage_arguments); - // cout << endl << "base_stages:" << endl; - // for (pair p : base_stages) { - // cout << p.first << ":" << p.second->getName() << endl; - // cout << "\toutputs: " << p.second->getOutputs().size() << endl << endl; - // for (int i : p.second->getOutputs()) - // cout << "\t\t" << i << ":" << interstage_arguments[i]->getName() << endl; - // cout << "\t task descriptors:" << endl; - // for (pair> d : p.second->tasksDesc) { - // cout << "\t\ttask: " << d.first << endl; - // for (ArgumentBase* a : d.second) - // cout << "\t\t\t" << a->getName() << endl; - // } - // } + // cout << endl << "interstage_arguments:" << endl; + // for (pair p : interstage_arguments) + // cout << p.first << ":" << p.second->getName() << endl; - // cout << endl << "interstage_arguments:" << endl; - // for (pair p : interstage_arguments) - // cout << p.first << ":" << p.second->getName() << endl; + // this map is a dependency structure: stage -> dependency_list + map> deps; + + // connect the stages inputs/outputs + connect_stages_from_file(workflow_descriptor, base_stages, + interstage_arguments, workflow_inputs, deps, workflow_outputs); + map all_argument(workflow_inputs); + for (pair a : interstage_arguments) + all_argument[a.first] = a.second; + + // mapprint(all_argument); + + // cout << endl << "all_arguments:" << endl; + // for (pair p : all_argument) { + // cout << p.second->getId() << ":" << p.second->getName() + // << " parent " << p.second->getParent() << endl; + // } - // this map is a dependency structure: stage -> dependency_list - map> deps; - - // connect the stages inputs/outputs - connect_stages_from_file(workflow_descriptor, base_stages, - interstage_arguments, workflow_inputs, deps, workflow_outputs); - map all_argument(workflow_inputs); - for (pair a : interstage_arguments) - all_argument[a.first] = a.second; - - // mapprint(all_argument); - - // cout << endl << "all_arguments:" << endl; - // for (pair p : all_argument) { - // cout << p.second->getId() << ":" << p.second->getName() - // << " parent " << p.second->getParent() << endl; - // } + // cout << endl << "connected base_stages:" << endl; + // for (pair p : base_stages) { + // cout << p.first << ":" << p.second->getName() << endl; + // cout << "\tinputs: " << p.second->getInputs().size() << endl; + // for (int i : p.second->getInputs()) + // cout << "\t\t" << i << ":" << all_argument[i]->getName() << endl; + // cout << "\toutputs: " << p.second->getOutputs().size() << endl; + // for (int i : p.second->getOutputs()) + // cout << "\t\t" << i << ":" << all_argument[i]->getName() << endl; + // } - // cout << endl << "connected base_stages:" << endl; - // for (pair p : base_stages) { - // cout << p.first << ":" << p.second->getName() << endl; - // cout << "\tinputs: " << p.second->getInputs().size() << endl; - // for (int i : p.second->getInputs()) - // cout << "\t\t" << i << ":" << all_argument[i]->getName() << endl; - // cout << "\toutputs: " << p.second->getOutputs().size() << endl; - // for (int i : p.second->getOutputs()) - // cout << "\t\t" << i << ":" << all_argument[i]->getName() << endl; - // } + //------------------------------------------------------------ + // Iterative merging of stages + //------------------------------------------------------------ - //------------------------------------------------------------ - // Iterative merging of stages - //------------------------------------------------------------ - - map args; - for (pair p : workflow_inputs) - args[p.first] = p.second; - for (pair p : interstage_arguments) - args[p.first] = p.second; - - map expanded_args; - map expanded_stages; - - // expand_stages(args, parameters_values, expanded_args, - // base_stages, expanded_stages, workflow_outputs); - FILE* parameters_values_file = fopen("dakota_nscale_ps_moat_600_32nodes.out", "r"); - generate_pre_defined_stages(parameters_values_file, args, base_stages, workflow_outputs, - expanded_args, expanded_stages); - - cout << endl<< "merged: " << endl; - for (pair p : expanded_stages) { - cout << "stage " << p.second->getId() << ":" << p.second->getName() << endl; - cout << "\tinputs: " << endl; - for (int i : p.second->getInputs()) - cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " - << expanded_args[i]->toString() << endl; - cout << "\toutputs: " << endl; - for (int i : p.second->getOutputs()) - cout << "\t\t" << i << ":" << expanded_args[i]->getName() << endl; - } + map args; + for (pair p : workflow_inputs) + args[p.first] = p.second; + for (pair p : interstage_arguments) + args[p.first] = p.second; - // cout << endl << "merged args" << endl; - // for (pair p : expanded_args) - // cout << "\t" << p.first << ":" << p.second->getName() << " = " - // << p.second->toString() << " sized: " << p.second->size() << endl; - - // add arguments to each stage - cout << endl << "add_arguments_to_stages" << endl; - add_arguments_to_stages(expanded_stages, expanded_args, rt); - - map merged_stages; - int size = 60; - MPI_Comm_size(MPI_COMM_WORLD, &size); - merge_stages_fine_grain(expanded_stages, base_stages, merged_stages, rt, expanded_args, size-1); - - cout << endl<< "merged-fine before deps resolution: " << endl; - for (pair p : merged_stages) { - string s = p.second->reused!=NULL?" - reused":""; - cout << "stage " << p.second->getId() << ":" << p.second->getName() << s << endl; - cout << "\ttasks: " << endl; - for (ReusableTask* t : p.second->tasks) { - cout << "\t\t" << t->getId() << ":" << t->getTaskName() << endl; - cout << "\t\t\tparent_task: " << t->parentTask << endl; + map expanded_args; + map expanded_stages; + + // expand_stages(args, parameters_values, expanded_args, + // base_stages, expanded_stages, workflow_outputs); + FILE* parameters_values_file = fopen("dakota_nscale_ps_moat_600_32nodes.out", "r"); + generate_pre_defined_stages(parameters_values_file, args, base_stages, workflow_outputs, + expanded_args, expanded_stages); + + cout << endl<< "merged: " << endl; + for (pair p : expanded_stages) { + cout << "stage " << p.second->getId() << ":" << p.second->getName() << endl; + cout << "\tinputs: " << endl; + for (int i : p.second->getInputs()) + cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " + << expanded_args[i]->toString() << endl; + cout << "\toutputs: " << endl; + for (int i : p.second->getOutputs()) + cout << "\t\t" << i << ":" << expanded_args[i]->getName() << endl; } - } - // resolve dependencies of reused stages - for (pair p : merged_stages) { - // add correct stage dependencies - list deps_tmp; - for (int i=0; igetNumberDependencies(); i++) { - if (merged_stages.find(p.second->getDependency(i)) != merged_stages.end() && - merged_stages[p.second->getDependency(i)]->reused != NULL) { - deps_tmp.emplace_back(merged_stages[p.second->getDependency(i)]->reused->getId()); + // cout << endl << "merged args" << endl; + // for (pair p : expanded_args) + // cout << "\t" << p.first << ":" << p.second->getName() << " = " + // << p.second->toString() << " sized: " << p.second->size() << endl; + + // add arguments to each stage + cout << endl << "add_arguments_to_stages" << endl; + add_arguments_to_stages(expanded_stages, expanded_args, rt); + + map merged_stages; + int size = 60; + MPI_Comm_size(MPI_COMM_WORLD, &size); + merge_stages_fine_grain(expanded_stages, base_stages, merged_stages, rt, expanded_args, size-1); + + cout << endl<< "merged-fine before deps resolution: " << endl; + for (pair p : merged_stages) { + string s = p.second->reused!=NULL?" - reused":""; + cout << "stage " << p.second->getId() << ":" << p.second->getName() << s << endl; + cout << "\ttasks: " << endl; + for (ReusableTask* t : p.second->tasks) { + cout << "\t\t" << t->getId() << ":" << t->getTaskName() << endl; + cout << "\t\t\tparent_task: " << t->parentTask << endl; } } - for (int d : deps_tmp) - p.second->addDependency(d); - - // connect correct output arguments - bool updated = true; - while (updated) { - updated = false; - for (ArgumentBase* a : p.second->getArguments()) { - if (a->getParent() != 0 && merged_stages[a->getParent()]->reused != NULL) { - updated = true; - p.second->replaceArgument(a->getId(), - merged_stages[a->getParent()]->reused->getArgumentByName(a->getName())); - break; + + // resolve dependencies of reused stages + for (pair p : merged_stages) { + // add correct stage dependencies + list deps_tmp; + for (int i=0; igetNumberDependencies(); i++) { + if (merged_stages.find(p.second->getDependency(i)) != merged_stages.end() && + merged_stages[p.second->getDependency(i)]->reused != NULL) { + deps_tmp.emplace_back(merged_stages[p.second->getDependency(i)]->reused->getId()); + } + } + for (int d : deps_tmp) + p.second->addDependency(d); + + // connect correct output arguments + bool updated = true; + while (updated) { + updated = false; + for (ArgumentBase* a : p.second->getArguments()) { + if (a->getParent() != 0 && merged_stages[a->getParent()]->reused != NULL) { + updated = true; + p.second->replaceArgument(a->getId(), + merged_stages[a->getParent()]->reused->getArgumentByName(a->getName())); + break; + } } } - } - - // replace arguments with clones to avoid double free when stages are finished - // map args_clones; - // for (ArgumentBase* a : p.second->getArguments()) { - // ArgumentBase* cpy = a->clone(); - // cpy->setId(new_uid()); - // args_clones[a->getId()] = cpy; - // } - // for (pair a : args_clones) - // p.second->replaceArgument(a.first, a.second); - } - cout << endl<< "merged-fine: " << endl; - for (pair p : merged_stages) { - string s = p.second->reused!=NULL?" - reused":""; - cout << "stage " << p.second->getId() << ":" << p.second->getName() << s << endl; - cout << "\ttasks: " << endl; - for (ReusableTask* t : p.second->tasks) { - cout << "\t\t" << t->getId() << ":" << t->getTaskName() << endl; - cout << "\t\t\tparent_task: " << t->parentTask << endl; + // replace arguments with clones to avoid double free when stages are finished + // map args_clones; + // for (ArgumentBase* a : p.second->getArguments()) { + // ArgumentBase* cpy = a->clone(); + // cpy->setId(new_uid()); + // args_clones[a->getId()] = cpy; + // } + // for (pair a : args_clones) + // p.second->replaceArgument(a.first, a.second); } - } - - //------------------------------------------------------------ - // Add workflows to Manager to be executed - //------------------------------------------------------------ - - string inputFolderPath = "~/Desktop/images15"; - cout << endl << "generate_drs" << endl; - generate_drs(rt, expanded_args); - - // add all stages to manager - cout << endl << "executeComponent" << endl; - for (pair s : merged_stages) { - if (s.second->reused == NULL) { - cout << "sent component " << s.second->getId() << ":" - << s.second->getName() << " sized " << s.second->size() << " to execute with args:" << endl; - cout << "\tall args: " << endl; - for (ArgumentBase* a : s.second->getArguments()) - cout << "\t\t" << a->getId() << ":" << a->getName() << " = " - << a->toString() << " parent " << a->getParent() << endl; - cout << "\tinputs: " << endl; - for (int i : s.second->getInputs()) - cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " - << expanded_args[i]->toString() << " parent " << expanded_args[i]->getParent() << endl; - cout << "\toutputs: " << endl; - for (int i : s.second->getOutputs()) - cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " - << expanded_args[i]->toString() << endl; - ((Task*)s.second)->setId(s.second->getId()); - // workaround to make sure that the RTs, if any, won't leak on this part of the algorithm - s.second->setLocation(PipelineComponentBase::MANAGER_SIDE); + cout << endl<< "merged-fine: " << endl; + for (pair p : merged_stages) { + string s = p.second->reused!=NULL?" - reused":""; + cout << "stage " << p.second->getId() << ":" << p.second->getName() << s << endl; + cout << "\ttasks: " << endl; + for (ReusableTask* t : p.second->tasks) { + cout << "\t\t" << t->getId() << ":" << t->getTaskName() << endl; + cout << "\t\t\tparent_task: " << t->parentTask << endl; + } + } - sysEnv.executeComponent(s.second); + //------------------------------------------------------------ + // Add workflows to Manager to be executed + //------------------------------------------------------------ + + string inputFolderPath = "~/Desktop/images15"; + cout << endl << "generate_drs" << endl; + generate_drs(rt, expanded_args); + + // unlock all other mpi workers + for (int i=0; i s : merged_stages) { + if (s.second->reused == NULL) { + cout << "sent component " << s.second->getId() << ":" + << s.second->getName() << " sized " << s.second->size() << " to execute with args:" << endl; + cout << "\tall args: " << endl; + for (ArgumentBase* a : s.second->getArguments()) + cout << "\t\t" << a->getId() << ":" << a->getName() << " = " + << a->toString() << " parent " << a->getParent() << endl; + cout << "\tinputs: " << endl; + for (int i : s.second->getInputs()) + cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " + << expanded_args[i]->toString() << " parent " << expanded_args[i]->getParent() << endl; + cout << "\toutputs: " << endl; + for (int i : s.second->getOutputs()) + cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " + << expanded_args[i]->toString() << endl; + ((Task*)s.second)->setId(s.second->getId()); + + // workaround to make sure that the RTs, if any, won't leak on this part of the algorithm + s.second->setLocation(PipelineComponentBase::MANAGER_SIDE); + + sysEnv.executeComponent(s.second); + } } - } - // return 0; - - // execute workflows - cout << endl << "startupExecution" << endl; - sysEnv.startupExecution(); - - // get results - cout << endl << "Results: " << endl; - for (pair output : workflow_outputs) { - // cout << "\t" << output.second->getName() << ":" << output.second->getId() << " = " << - // sysEnv.getComponentResultData(output.second->getId()) << endl; - char *resultData = sysEnv.getComponentResultData(output.second->getId()); - std::cout << "Diff Id: " << output.second->getId() << " resultData - "; - if(resultData != NULL){ - std::cout << "size: " << ((int *) resultData)[0] << " Diff: " << ((float *) resultData)[1] << - " Secondary Metric: " << ((float *) resultData)[2] << std::endl; - }else{ - std::cout << "NULL" << std::endl; + // return 0; + + // execute workflows + cout << endl << "startupExecution" << endl; + sysEnv.startupExecution(); + + // get results + cout << endl << "Results: " << endl; + for (pair output : workflow_outputs) { + // cout << "\t" << output.second->getName() << ":" << output.second->getId() << " = " << + // sysEnv.getComponentResultData(output.second->getId()) << endl; + char *resultData = sysEnv.getComponentResultData(output.second->getId()); + std::cout << "Diff Id: " << output.second->getId() << " resultData - "; + if(resultData != NULL){ + std::cout << "size: " << ((int *) resultData)[0] << " Diff: " << ((float *) resultData)[1] << + " Secondary Metric: " << ((float *) resultData)[2] << std::endl; + }else{ + std::cout << "NULL" << std::endl; + } } + } else { + int flag; + do { + MPI_Iprobe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + &flag, MPI_STATUS_IGNORE); + usleep(2000000); + } while (!flag); + MPI_Recv(&mpi_val, 1, MPI_INT, MPI_ANY_SOURCE, + MPI_ANY_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE); + sysEnv.startupSystem(argc, argv, "libcomponentnsdifffgo.so"); } sysEnv.finalizeSystem(); @@ -1292,18 +1317,18 @@ bool merging_condition(PipelineComponentBase* merged, PipelineComponentBase* to_ if (!exists_reusable_task(merged, to_merge, ref.begin()->first)) return false; - // // verify if the stage dependecy is the same - // for (ArgumentBase* a1 : merged->getArguments()) { - // ArgumentBase* arg1 = args[a1->getId()]; - // if (arg1->getParent() != 0) { - // for (ArgumentBase* a2 : to_merge->getArguments()) { - // ArgumentBase* arg2 = args[a2->getId()]; - // if (arg1->getParent() == arg2->getParent()) { - // return true; - // } - // } - // } - // } + // verify if the stage dependecy is the same + for (ArgumentBase* a1 : merged->getArguments()) { + ArgumentBase* arg1 = args[a1->getId()]; + if (arg1->getParent() != 0) { + for (ArgumentBase* a2 : to_merge->getArguments()) { + ArgumentBase* arg2 = args[a2->getId()]; + if (arg1->getParent() == arg2->getParent()) { + return true; + } + } + } + } return false; } @@ -1888,7 +1913,7 @@ void montecarlo_dep(int n, list c1, list [-i DAKOTA_OUTPUT_FILE]" << endl; return 0; } + int max_bucket_size = atoi(argv[1]); + // workflow file FILE* workflow_descriptor = fopen("seg_example.t2flow", "r"); @@ -279,9 +282,22 @@ int main(int argc, char* argv[]) { add_arguments_to_stages(expanded_stages, expanded_args, rt); map merged_stages; - int size = 60; - MPI_Comm_size(MPI_COMM_WORLD, &size); - merge_stages_fine_grain(expanded_stages, base_stages, merged_stages, rt, expanded_args, size-1); + // int max_bucket_size = 60; + // MPI_Comm_size(MPI_COMM_WORLD, &max_bucket_size); + cout << "breaking into " << floor(expanded_stages.size()/max_bucket_size) << " buckets sized " << max_bucket_size << endl; + + // mesure merging exec time + struct timeval start, end; + gettimeofday(&start, NULL); + + merge_stages_fine_grain(expanded_stages, base_stages, merged_stages, rt, expanded_args, + floor(expanded_stages.size()/max_bucket_size)); + + gettimeofday(&end, NULL); + + long merge_time = ((end.tv_sec * 1000000 + end.tv_usec) - (start.tv_sec * 1000000 + start.tv_usec)); + ofstream exec_time("exec_time.log", ios::app); + exec_time << "merge time: " << merge_time << endl; cout << endl<< "merged-fine before deps resolution: " << endl; for (pair p : merged_stages) { @@ -332,16 +348,21 @@ int main(int argc, char* argv[]) { // p.second->replaceArgument(a.first, a.second); } + ofstream solution_file; + solution_file.open("fine-grain-merging-solution", ios::app); cout << endl<< "merged-fine: " << endl; + solution_file << endl<< "merged-fine: " << endl; for (pair p : merged_stages) { - string s = p.second->reused!=NULL?" - reused":""; + string s = p.second->reused!=NULL ? " - reused" : (" with " + to_string(p.second->tasks.size()) + " tasks"); cout << "stage " << p.second->getId() << ":" << p.second->getName() << s << endl; + solution_file << "stage " << p.second->getId() << ":" << p.second->getName() << s << endl; cout << "\ttasks: " << endl; for (ReusableTask* t : p.second->tasks) { cout << "\t\t" << t->getId() << ":" << t->getTaskName() << endl; - cout << "\t\t\tparent_task: " << t->parentTask << endl; + cout << "\t\t" << t->getId() << ":" << t->getTaskName() << endl; } } + solution_file.close(); //------------------------------------------------------------ // Add workflows to Manager to be executed @@ -355,6 +376,7 @@ int main(int argc, char* argv[]) { for (int i=0; i output : workflow_outputs) { @@ -404,6 +433,7 @@ int main(int argc, char* argv[]) { std::cout << "NULL" << std::endl; } } + } else { int flag; do { @@ -413,6 +443,7 @@ int main(int argc, char* argv[]) { } while (!flag); MPI_Recv(&mpi_val, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE); + // return 0; sysEnv.startupSystem(argc, argv, "libcomponentnsdifffgo.so"); } @@ -1988,6 +2019,7 @@ list> montecarlo_recursive_cut(list &all_stages, // write merging solution ofstream solution_file; solution_file.open("fine-grain-merging-solution", ios::trunc); - cout << "solution:" << endl; + cout << endl << "solution:" << endl; + solution_file << endl << "solution:" << endl; for (list b : solution) { cout << "\tbucket with " << b.size() << " stages and cost " << calc_stage_proc(b, expanded_args, ref->second->tasksDesc) << ":" << endl; @@ -2079,7 +2112,7 @@ void merge_stages_fine_grain(const map &all_stages, << calc_stage_proc(b, expanded_args, ref->second->tasksDesc) << ":" << endl; for (PipelineComponentBase* s : b) { cout << "\t\tstage " << s->getId() << ":" << s->getName() << ":" << endl; - solution_file << "\t\tstage " << s->getId() << ":" << s->getName() << ":" << endl; + // solution_file << "\t\tstage " << s->getId() << ":" << s->getName() << ":" << endl; } } solution_file.close(); From 71f83414abbff068dc7c6561e820ef13bb9a2c67 Mon Sep 17 00:00:00 2001 From: Willian Date: Fri, 7 Oct 2016 22:20:01 -0300 Subject: [PATCH 60/87] Fixed the test output files naming. --- .../PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 40dc17d..6fd9adf 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -104,7 +104,7 @@ void expand_stages(const map &args, map &expanded_stages, map &workflow_outputs); void merge_stages_fine_grain(const map &all_stages, const map &stages_ref, map &merged_stages, - RegionTemplate* rt, map expanded_args, int n_workers); + RegionTemplate* rt, map expanded_args, int max_bucket_size); void generate_drs(RegionTemplate* rt, const map &expanded_args); void add_arguments_to_stages(map &merged_stages, map &merged_arguments, @@ -296,7 +296,7 @@ int main(int argc, char* argv[]) { gettimeofday(&end, NULL); long merge_time = ((end.tv_sec * 1000000 + end.tv_usec) - (start.tv_sec * 1000000 + start.tv_usec)); - ofstream exec_time("exec_time.log", ios::app); + ofstream exec_time("exec_time_b" + to_string((int)floor(expanded_stages.size()/max_bucket_size)), ios::app); exec_time << "merge time: " << merge_time << endl; cout << endl<< "merged-fine before deps resolution: " << endl; @@ -349,7 +349,7 @@ int main(int argc, char* argv[]) { } ofstream solution_file; - solution_file.open("fine-grain-merging-solution", ios::app); + solution_file.open("fine-grain-merging-solution-b" + to_string((int)floor(expanded_stages.size()/max_bucket_size)), ios::app); cout << endl<< "merged-fine: " << endl; solution_file << endl<< "merged-fine: " << endl; for (pair p : merged_stages) { @@ -2062,7 +2062,7 @@ list> montecarlo_recursive_cut(list &all_stages, const map &stages_ref, map &merged_stages, - RegionTemplate* rt, map expanded_args, int n_workers) { + RegionTemplate* rt, map expanded_args, int max_bucket_size) { // attempt merging for each stage type for (map::const_iterator ref=stages_ref.cbegin(); ref!=stages_ref.cend(); ref++) { @@ -2098,11 +2098,11 @@ void merge_stages_fine_grain(const map &all_stages, } list> solution = montecarlo_recursive_cut(current_stages, all_stages, - n_workers, expanded_args, ref->second->tasksDesc); + max_bucket_size, expanded_args, ref->second->tasksDesc); // write merging solution ofstream solution_file; - solution_file.open("fine-grain-merging-solution", ios::trunc); + solution_file.open("fine-grain-merging-solution-b" + to_string(max_bucket_size), ios::trunc); cout << endl << "solution:" << endl; solution_file << endl << "solution:" << endl; for (list b : solution) { From af4d732334f04a06af69a8368ef672d6e7848829 Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Mon, 10 Oct 2016 15:01:33 -0300 Subject: [PATCH 61/87] Most severe memory leaks fixed. --- .../examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp index 444f514..d3aa513 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp @@ -213,7 +213,7 @@ TaskSegmentation0::TaskSegmentation0(list args, RegionTemplate* i } TaskSegmentation0::~TaskSegmentation0() { - if (normalized_rt_temp.unique() && mock) + if (normalized_rt_temp.unique()) delete *normalized_rt_temp; } @@ -1165,7 +1165,7 @@ TaskSegmentation5::TaskSegmentation5(list args, RegionTemplate* i } TaskSegmentation5::~TaskSegmentation5() { - if (normalized_rt_temp.unique() && mock) + if (normalized_rt_temp.unique()) delete *normalized_rt_temp; } From 3dc14d44fab3cb9c86947572d10da4b6bf942f5a Mon Sep 17 00:00:00 2001 From: Willian Date: Tue, 11 Oct 2016 10:53:55 -0300 Subject: [PATCH 62/87] First implementation of reuse tree finished This implementation is extreamely naive, thus, returning a rather low reuse (~9%). --- runtime/PipelineComponentBase.h | 2 +- .../PipelineRTFS-NS-Diff-FGO/CMakeLists.txt | 3 +- .../PipelineManager.cpp | 861 +++++------------- .../graph/reuse_tree.cpp | 260 ++++++ .../graph/reuse_tree.hpp | 25 + .../PipelineRTFS-NS-Diff-FGO/merging.cpp | 319 +++++++ .../PipelineRTFS-NS-Diff-FGO/merging.hpp | 52 ++ 7 files changed, 912 insertions(+), 610 deletions(-) create mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.cpp create mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.hpp create mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/merging.cpp create mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/merging.hpp diff --git a/runtime/PipelineComponentBase.h b/runtime/PipelineComponentBase.h index 2a41e8c..d65e8b9 100644 --- a/runtime/PipelineComponentBase.h +++ b/runtime/PipelineComponentBase.h @@ -181,7 +181,7 @@ class PipelineComponentBase: public Task { bool remove_outputs; // needed for inter stage dependency verification on task merging - std::vector getArguments() {return arguments;}; + std::vector getArguments() const {return arguments;}; // needed to update an argument of a reused stage on fine-grain merging void replaceArgument(int old_id, ArgumentBase* new_a); diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/CMakeLists.txt b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/CMakeLists.txt index a043bea..2529b68 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/CMakeLists.txt +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/CMakeLists.txt @@ -38,7 +38,8 @@ set(libname componentnsdifffgo) # Source files used by the Runtime System set(libcomponentssrcs NormalizationComp.cpp Segmentation.cpp FeatureExtraction.cpp - TaskFeatures.cpp DiffMaskComp.cpp jsoncpp.cpp graph/min_cut.cpp) + TaskFeatures.cpp DiffMaskComp.cpp jsoncpp.cpp graph/min_cut.cpp graph/reuse_tree.cpp + merging.cpp) set(libcomparativeanalysis ../../comparativeanalysis/TaskDiffMask.cpp ../../comparativeanalysis/pixelcompare/PixelCompare.cpp) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 6fd9adf..322a0fc 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -23,7 +23,9 @@ #include "RTPipelineComponentBase.h" #include "RegionTemplateCollection.h" #include "ReusableTask.hpp" +#include "merging.hpp" #include "graph/min_cut.hpp" +#include "graph/reuse_tree.hpp" using namespace std; @@ -33,10 +35,6 @@ enum port_type_t { }; } -// global uid for any local(this file) entity -int uid=1; -int new_uid() {return uid++;} - // general xml field structure typedef struct { string type; @@ -130,321 +128,289 @@ parsing::port_type_t get_port_type(string s); int main(int argc, char* argv[]) { - int mpi_rank; - int mpi_size; - int mpi_val; + // Handler to the distributed execution system environment + SysEnv sysEnv; - MPI_Init(&argc, &argv); + // region template used by all stages + RegionTemplate *rt = new RegionTemplate(); + rt->setName("tile"); - MPI_Comm_size(MPI_COMM_WORLD, &mpi_size); - MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank); + // get arguments + if (argc != 2 && argc != 4) { + cout << "usage: ./PipelineRTFS-NS-Diff-FGO [-i DAKOTA_OUTPUT_FILE]" << endl; + return 0; + } - // Handler to the distributed execution system environment - SysEnv sysEnv; + int max_bucket_size = atoi(argv[1]); - if (mpi_rank == mpi_size-1) { - // region template used by all stages - RegionTemplate *rt = new RegionTemplate(); - rt->setName("tile"); + // workflow file + FILE* workflow_descriptor = fopen("seg_example.t2flow", "r"); - // get arguments - if (argc != 2 && argc != 4) { - cout << "usage: ./PipelineRTFS-NS-Diff-FGO [-i DAKOTA_OUTPUT_FILE]" << endl; - return 0; - } + //------------------------------------------------------------ + // Parse pipeline file + //------------------------------------------------------------ - int max_bucket_size = atoi(argv[1]); + // get all workflow inputs without their values, returning also the parameters + // values (i.e list values) on another map + map workflow_inputs; + map> parameters_values; + get_inputs_from_file(workflow_descriptor, workflow_inputs, parameters_values); - // workflow file - FILE* workflow_descriptor = fopen("seg_example.t2flow", "r"); + // cout << "workflow_inputs:" << endl; + // for (pair p : workflow_inputs) + // cout << p.first << ":" << p.second->getName() << endl; - //------------------------------------------------------------ - // Parse pipeline file - //------------------------------------------------------------ + // cout << endl << "parameters_values:" << endl; + // for (pair> p : parameters_values) { + // cout << "argument " << p.first << ":" << workflow_inputs[p.first]->getName() << ":" << endl; + // for (ArgumentBase* a : p.second) + // cout << "\t" << a->toString() << endl; + // } - // get all workflow inputs without their values, returning also the parameters - // values (i.e list values) on another map - map workflow_inputs; - map> parameters_values; - get_inputs_from_file(workflow_descriptor, workflow_inputs, parameters_values); + // get all workflow outputs + map workflow_outputs; + get_outputs_from_file(workflow_descriptor, workflow_outputs); + // cout << endl << "workflow_outputs " << endl; + // mapprint(workflow_outputs); + // for (pair p : workflow_outputs) + // cout << p.second->getId() << ":" << p.second->getName() << endl; + + // get all stages, also setting the uid from this context to Task (i.e Task::setId()) + // also returns the list of arguments used + // the stages dependencies are also set here (i.e Task::addDependency()) + map base_stages; + map interstage_arguments; + get_stages_from_file(workflow_descriptor, base_stages, interstage_arguments); + // cout << endl << "base_stages:" << endl; + // for (pair p : base_stages) { + // cout << p.first << ":" << p.second->getName() << endl; + // cout << "\toutputs: " << p.second->getOutputs().size() << endl << endl; + // for (int i : p.second->getOutputs()) + // cout << "\t\t" << i << ":" << interstage_arguments[i]->getName() << endl; + // cout << "\t task descriptors:" << endl; + // for (pair> d : p.second->tasksDesc) { + // cout << "\t\ttask: " << d.first << endl; + // for (ArgumentBase* a : d.second) + // cout << "\t\t\t" << a->getName() << endl; + // } + // } - // cout << "workflow_inputs:" << endl; - // for (pair p : workflow_inputs) - // cout << p.first << ":" << p.second->getName() << endl; - // cout << endl << "parameters_values:" << endl; - // for (pair> p : parameters_values) { - // cout << "argument " << p.first << ":" << workflow_inputs[p.first]->getName() << ":" << endl; - // for (ArgumentBase* a : p.second) - // cout << "\t" << a->toString() << endl; - // } + // cout << endl << "interstage_arguments:" << endl; + // for (pair p : interstage_arguments) + // cout << p.first << ":" << p.second->getName() << endl; - // get all workflow outputs - map workflow_outputs; - get_outputs_from_file(workflow_descriptor, workflow_outputs); - // cout << endl << "workflow_outputs " << endl; - // mapprint(workflow_outputs); - // for (pair p : workflow_outputs) - // cout << p.second->getId() << ":" << p.second->getName() << endl; - - // get all stages, also setting the uid from this context to Task (i.e Task::setId()) - // also returns the list of arguments used - // the stages dependencies are also set here (i.e Task::addDependency()) - map base_stages; - map interstage_arguments; - get_stages_from_file(workflow_descriptor, base_stages, interstage_arguments); - // cout << endl << "base_stages:" << endl; - // for (pair p : base_stages) { - // cout << p.first << ":" << p.second->getName() << endl; - // cout << "\toutputs: " << p.second->getOutputs().size() << endl << endl; - // for (int i : p.second->getOutputs()) - // cout << "\t\t" << i << ":" << interstage_arguments[i]->getName() << endl; - // cout << "\t task descriptors:" << endl; - // for (pair> d : p.second->tasksDesc) { - // cout << "\t\ttask: " << d.first << endl; - // for (ArgumentBase* a : d.second) - // cout << "\t\t\t" << a->getName() << endl; - // } - // } + // this map is a dependency structure: stage -> dependency_list + map> deps; + + // connect the stages inputs/outputs + connect_stages_from_file(workflow_descriptor, base_stages, + interstage_arguments, workflow_inputs, deps, workflow_outputs); + map all_argument(workflow_inputs); + for (pair a : interstage_arguments) + all_argument[a.first] = a.second; + + // mapprint(all_argument); + + // cout << endl << "all_arguments:" << endl; + // for (pair p : all_argument) { + // cout << p.second->getId() << ":" << p.second->getName() + // << " parent " << p.second->getParent() << endl; + // } + // cout << endl << "connected base_stages:" << endl; + // for (pair p : base_stages) { + // cout << p.first << ":" << p.second->getName() << endl; + // cout << "\tinputs: " << p.second->getInputs().size() << endl; + // for (int i : p.second->getInputs()) + // cout << "\t\t" << i << ":" << all_argument[i]->getName() << endl; + // cout << "\toutputs: " << p.second->getOutputs().size() << endl; + // for (int i : p.second->getOutputs()) + // cout << "\t\t" << i << ":" << all_argument[i]->getName() << endl; + // } - // cout << endl << "interstage_arguments:" << endl; - // for (pair p : interstage_arguments) - // cout << p.first << ":" << p.second->getName() << endl; + //------------------------------------------------------------ + // Iterative merging of stages + //------------------------------------------------------------ + + map args; + for (pair p : workflow_inputs) + args[p.first] = p.second; + for (pair p : interstage_arguments) + args[p.first] = p.second; + + map expanded_args; + map expanded_stages; + + // expand_stages(args, parameters_values, expanded_args, + // base_stages, expanded_stages, workflow_outputs); + FILE* parameters_values_file = fopen("dakota_nscale_ps_moat_600_32nodes.out", "r"); + generate_pre_defined_stages(parameters_values_file, args, base_stages, workflow_outputs, + expanded_args, expanded_stages); + + cout << endl<< "merged: " << endl; + for (pair p : expanded_stages) { + cout << "stage " << p.second->getId() << ":" << p.second->getName() << endl; + cout << "\tinputs: " << endl; + for (int i : p.second->getInputs()) + cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " + << expanded_args[i]->toString() << endl; + cout << "\toutputs: " << endl; + for (int i : p.second->getOutputs()) + cout << "\t\t" << i << ":" << expanded_args[i]->getName() << endl; + } - // this map is a dependency structure: stage -> dependency_list - map> deps; - - // connect the stages inputs/outputs - connect_stages_from_file(workflow_descriptor, base_stages, - interstage_arguments, workflow_inputs, deps, workflow_outputs); - map all_argument(workflow_inputs); - for (pair a : interstage_arguments) - all_argument[a.first] = a.second; - - // mapprint(all_argument); - - // cout << endl << "all_arguments:" << endl; - // for (pair p : all_argument) { - // cout << p.second->getId() << ":" << p.second->getName() - // << " parent " << p.second->getParent() << endl; - // } + // cout << endl << "merged args" << endl; + // for (pair p : expanded_args) + // cout << "\t" << p.first << ":" << p.second->getName() << " = " + // << p.second->toString() << " sized: " << p.second->size() << endl; - // cout << endl << "connected base_stages:" << endl; - // for (pair p : base_stages) { - // cout << p.first << ":" << p.second->getName() << endl; - // cout << "\tinputs: " << p.second->getInputs().size() << endl; - // for (int i : p.second->getInputs()) - // cout << "\t\t" << i << ":" << all_argument[i]->getName() << endl; - // cout << "\toutputs: " << p.second->getOutputs().size() << endl; - // for (int i : p.second->getOutputs()) - // cout << "\t\t" << i << ":" << all_argument[i]->getName() << endl; - // } + // add arguments to each stage + cout << endl << "add_arguments_to_stages" << endl; + add_arguments_to_stages(expanded_stages, expanded_args, rt); - //------------------------------------------------------------ - // Iterative merging of stages - //------------------------------------------------------------ + map merged_stages; - map args; - for (pair p : workflow_inputs) - args[p.first] = p.second; - for (pair p : interstage_arguments) - args[p.first] = p.second; + // mesure merging exec time + struct timeval start, end; + gettimeofday(&start, NULL); - map expanded_args; - map expanded_stages; + merge_stages_fine_grain(expanded_stages, base_stages, merged_stages, rt, expanded_args, max_bucket_size); - // expand_stages(args, parameters_values, expanded_args, - // base_stages, expanded_stages, workflow_outputs); - FILE* parameters_values_file = fopen("dakota_nscale_ps_moat_600_32nodes.out", "r"); - generate_pre_defined_stages(parameters_values_file, args, base_stages, workflow_outputs, - expanded_args, expanded_stages); + gettimeofday(&end, NULL); - cout << endl<< "merged: " << endl; - for (pair p : expanded_stages) { - cout << "stage " << p.second->getId() << ":" << p.second->getName() << endl; - cout << "\tinputs: " << endl; - for (int i : p.second->getInputs()) - cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " - << expanded_args[i]->toString() << endl; - cout << "\toutputs: " << endl; - for (int i : p.second->getOutputs()) - cout << "\t\t" << i << ":" << expanded_args[i]->getName() << endl; - } + long merge_time = ((end.tv_sec * 1000000 + end.tv_usec) - (start.tv_sec * 1000000 + start.tv_usec)); + ofstream exec_time("exec_time_b" + to_string((int)floor(expanded_stages.size()/max_bucket_size)), ios::app); + exec_time << "merge time: " << merge_time << endl; - // cout << endl << "merged args" << endl; - // for (pair p : expanded_args) - // cout << "\t" << p.first << ":" << p.second->getName() << " = " - // << p.second->toString() << " sized: " << p.second->size() << endl; - - // add arguments to each stage - cout << endl << "add_arguments_to_stages" << endl; - add_arguments_to_stages(expanded_stages, expanded_args, rt); - - map merged_stages; - // int max_bucket_size = 60; - // MPI_Comm_size(MPI_COMM_WORLD, &max_bucket_size); - cout << "breaking into " << floor(expanded_stages.size()/max_bucket_size) << " buckets sized " << max_bucket_size << endl; - - // mesure merging exec time - struct timeval start, end; - gettimeofday(&start, NULL); - - merge_stages_fine_grain(expanded_stages, base_stages, merged_stages, rt, expanded_args, - floor(expanded_stages.size()/max_bucket_size)); - - gettimeofday(&end, NULL); - - long merge_time = ((end.tv_sec * 1000000 + end.tv_usec) - (start.tv_sec * 1000000 + start.tv_usec)); - ofstream exec_time("exec_time_b" + to_string((int)floor(expanded_stages.size()/max_bucket_size)), ios::app); - exec_time << "merge time: " << merge_time << endl; - - cout << endl<< "merged-fine before deps resolution: " << endl; - for (pair p : merged_stages) { - string s = p.second->reused!=NULL?" - reused":""; - cout << "stage " << p.second->getId() << ":" << p.second->getName() << s << endl; - cout << "\ttasks: " << endl; - for (ReusableTask* t : p.second->tasks) { - cout << "\t\t" << t->getId() << ":" << t->getTaskName() << endl; - cout << "\t\t\tparent_task: " << t->parentTask << endl; - } + cout << endl<< "merged-fine before deps resolution: " << endl; + for (pair p : merged_stages) { + string s = p.second->reused!=NULL?" - reused":""; + cout << "stage " << p.second->getId() << ":" << p.second->getName() << s << endl; + cout << "\ttasks: " << endl; + for (ReusableTask* t : p.second->tasks) { + cout << "\t\t" << t->getId() << ":" << t->getTaskName() << endl; + cout << "\t\t\tparent_task: " << t->parentTask << endl; } + } - // resolve dependencies of reused stages - for (pair p : merged_stages) { - // add correct stage dependencies - list deps_tmp; - for (int i=0; igetNumberDependencies(); i++) { - if (merged_stages.find(p.second->getDependency(i)) != merged_stages.end() && - merged_stages[p.second->getDependency(i)]->reused != NULL) { - deps_tmp.emplace_back(merged_stages[p.second->getDependency(i)]->reused->getId()); - } + // resolve dependencies of reused stages + for (pair p : merged_stages) { + // add correct stage dependencies + list deps_tmp; + for (int i=0; igetNumberDependencies(); i++) { + if (merged_stages.find(p.second->getDependency(i)) != merged_stages.end() && + merged_stages[p.second->getDependency(i)]->reused != NULL) { + deps_tmp.emplace_back(merged_stages[p.second->getDependency(i)]->reused->getId()); } - for (int d : deps_tmp) - p.second->addDependency(d); - - // connect correct output arguments - bool updated = true; - while (updated) { - updated = false; - for (ArgumentBase* a : p.second->getArguments()) { - if (a->getParent() != 0 && merged_stages[a->getParent()]->reused != NULL) { - updated = true; - p.second->replaceArgument(a->getId(), - merged_stages[a->getParent()]->reused->getArgumentByName(a->getName())); - break; - } + } + for (int d : deps_tmp) + p.second->addDependency(d); + + // connect correct output arguments + bool updated = true; + while (updated) { + updated = false; + for (ArgumentBase* a : p.second->getArguments()) { + if (a->getParent() != 0 && merged_stages[a->getParent()]->reused != NULL) { + updated = true; + p.second->replaceArgument(a->getId(), + merged_stages[a->getParent()]->reused->getArgumentByName(a->getName())); + break; } } - - // replace arguments with clones to avoid double free when stages are finished - // map args_clones; - // for (ArgumentBase* a : p.second->getArguments()) { - // ArgumentBase* cpy = a->clone(); - // cpy->setId(new_uid()); - // args_clones[a->getId()] = cpy; - // } - // for (pair a : args_clones) - // p.second->replaceArgument(a.first, a.second); } - ofstream solution_file; - solution_file.open("fine-grain-merging-solution-b" + to_string((int)floor(expanded_stages.size()/max_bucket_size)), ios::app); - cout << endl<< "merged-fine: " << endl; - solution_file << endl<< "merged-fine: " << endl; - for (pair p : merged_stages) { - string s = p.second->reused!=NULL ? " - reused" : (" with " + to_string(p.second->tasks.size()) + " tasks"); - cout << "stage " << p.second->getId() << ":" << p.second->getName() << s << endl; - solution_file << "stage " << p.second->getId() << ":" << p.second->getName() << s << endl; - cout << "\ttasks: " << endl; - for (ReusableTask* t : p.second->tasks) { - cout << "\t\t" << t->getId() << ":" << t->getTaskName() << endl; - cout << "\t\t" << t->getId() << ":" << t->getTaskName() << endl; - } - } - solution_file.close(); + // replace arguments with clones to avoid double free when stages are finished + // map args_clones; + // for (ArgumentBase* a : p.second->getArguments()) { + // ArgumentBase* cpy = a->clone(); + // cpy->setId(new_uid()); + // args_clones[a->getId()] = cpy; + // } + // for (pair a : args_clones) + // p.second->replaceArgument(a.first, a.second); + } - //------------------------------------------------------------ - // Add workflows to Manager to be executed - //------------------------------------------------------------ - - string inputFolderPath = "~/Desktop/images15"; - cout << endl << "generate_drs" << endl; - generate_drs(rt, expanded_args); - - // unlock all other mpi workers - for (int i=0; i s : merged_stages) { - if (s.second->reused == NULL) { - cout << "sent component " << s.second->getId() << ":" - << s.second->getName() << " sized " << s.second->size() << " to execute with args:" << endl; - cout << "\tall args: " << endl; - for (ArgumentBase* a : s.second->getArguments()) - cout << "\t\t" << a->getId() << ":" << a->getName() << " = " - << a->toString() << " parent " << a->getParent() << endl; - cout << "\tinputs: " << endl; - for (int i : s.second->getInputs()) - cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " - << expanded_args[i]->toString() << " parent " << expanded_args[i]->getParent() << endl; - cout << "\toutputs: " << endl; - for (int i : s.second->getOutputs()) - cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " - << expanded_args[i]->toString() << endl; - ((Task*)s.second)->setId(s.second->getId()); - - // workaround to make sure that the RTs, if any, won't leak on this part of the algorithm - s.second->setLocation(PipelineComponentBase::MANAGER_SIDE); - - sysEnv.executeComponent(s.second); - } + ofstream solution_file; + solution_file.open("fine-grain-merging-solution-b" + to_string((int)floor(expanded_stages.size()/max_bucket_size)), ios::app); + cout << endl<< "merged-fine: " << endl; + solution_file << endl<< "merged-fine: " << endl; + for (pair p : merged_stages) { + string s = p.second->reused!=NULL ? " - reused" : (" with " + to_string(p.second->tasks.size()) + " tasks"); + cout << "stage " << p.second->getId() << ":" << p.second->getName() << s << endl; + solution_file << "stage " << p.second->getId() << ":" << p.second->getName() << s << endl; + cout << "\ttasks: " << endl; + for (ReusableTask* t : p.second->tasks) { + cout << "\t\t" << t->getId() << ":" << t->getTaskName() << endl; + cout << "\t\t" << t->getId() << ":" << t->getTaskName() << endl; } + } + solution_file.close(); + + //------------------------------------------------------------ + // Add workflows to Manager to be executed + //------------------------------------------------------------ + + string inputFolderPath = "~/Desktop/images15"; + cout << endl << "generate_drs" << endl; + generate_drs(rt, expanded_args); + + // Tell the system which libraries should be used + sysEnv.startupSystem(argc, argv, "libcomponentnsdifffgo.so"); + + // add all stages to manager + cout << endl << "executeComponent" << endl; + for (pair s : merged_stages) { + if (s.second->reused == NULL) { + cout << "sent component " << s.second->getId() << ":" + << s.second->getName() << " sized " << s.second->size() << " to execute with args:" << endl; + cout << "\tall args: " << endl; + for (ArgumentBase* a : s.second->getArguments()) + cout << "\t\t" << a->getId() << ":" << a->getName() << " = " + << a->toString() << " parent " << a->getParent() << endl; + cout << "\tinputs: " << endl; + for (int i : s.second->getInputs()) + cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " + << expanded_args[i]->toString() << " parent " << expanded_args[i]->getParent() << endl; + cout << "\toutputs: " << endl; + for (int i : s.second->getOutputs()) + cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " + << expanded_args[i]->toString() << endl; + ((Task*)s.second)->setId(s.second->getId()); - // execute workflows - cout << endl << "startupExecution" << endl; - gettimeofday(&start, NULL); - - sysEnv.startupExecution(); - - gettimeofday(&end, NULL); - - long run_time = ((end.tv_sec * 1000000 + end.tv_usec) - (start.tv_sec * 1000000 + start.tv_usec)); - exec_time << "run time: " << run_time << endl << endl; - exec_time.close(); - - // get results - cout << endl << "Results: " << endl; - for (pair output : workflow_outputs) { - // cout << "\t" << output.second->getName() << ":" << output.second->getId() << " = " << - // sysEnv.getComponentResultData(output.second->getId()) << endl; - char *resultData = sysEnv.getComponentResultData(output.second->getId()); - std::cout << "Diff Id: " << output.second->getId() << " resultData - "; - if(resultData != NULL){ - std::cout << "size: " << ((int *) resultData)[0] << " Diff: " << ((float *) resultData)[1] << - " Secondary Metric: " << ((float *) resultData)[2] << std::endl; - }else{ - std::cout << "NULL" << std::endl; - } + // workaround to make sure that the RTs, if any, won't leak on this part of the algorithm + s.second->setLocation(PipelineComponentBase::MANAGER_SIDE); + + sysEnv.executeComponent(s.second); } + } - } else { - int flag; - do { - MPI_Iprobe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, - &flag, MPI_STATUS_IGNORE); - usleep(2000000); - } while (!flag); - MPI_Recv(&mpi_val, 1, MPI_INT, MPI_ANY_SOURCE, - MPI_ANY_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE); - // return 0; - sysEnv.startupSystem(argc, argv, "libcomponentnsdifffgo.so"); + // execute workflows + cout << endl << "startupExecution" << endl; + gettimeofday(&start, NULL); + + sysEnv.startupExecution(); + + gettimeofday(&end, NULL); + + long run_time = ((end.tv_sec * 1000000 + end.tv_usec) - (start.tv_sec * 1000000 + start.tv_usec)); + exec_time << "run time: " << run_time << endl << endl; + exec_time.close(); + + // get results + cout << endl << "Results: " << endl; + for (pair output : workflow_outputs) { + // cout << "\t" << output.second->getName() << ":" << output.second->getId() << " = " << + // sysEnv.getComponentResultData(output.second->getId()) << endl; + char *resultData = sysEnv.getComponentResultData(output.second->getId()); + std::cout << "Diff Id: " << output.second->getId() << " resultData - "; + if(resultData != NULL){ + std::cout << "size: " << ((int *) resultData)[0] << " Diff: " << ((float *) resultData)[1] << + " Secondary Metric: " << ((float *) resultData)[2] << std::endl; + }else{ + std::cout << "NULL" << std::endl; + } } sysEnv.finalizeSystem(); @@ -1298,249 +1264,6 @@ void expand_stages(const map &args, } } -ArgumentBase* find_argument(PipelineComponentBase* p, string name, map expanded_args) { - for(int i : p->getInputs()){ - if (expanded_args[i]->getName().compare(name) == 0) { - return expanded_args[i]; - } - } - for(int i : p->getOutputs()){ - if (expanded_args[i]->getName().compare(name) == 0) { - return expanded_args[i]; - } - } - - return NULL; -} - -// This function assumes that the merged PCB has at least, but not limited to one ReusableTask on tasks -// of type task_name. Also, to_merge must have exactly one ReusableTask of type task_name. These -// conditions are not checked. -bool exists_reusable_task(PipelineComponentBase* merged, PipelineComponentBase* to_merge, string task_name) { - // get the only task of to_merge that has the type task_name - ReusableTask* to_merge_task = NULL; - for (ReusableTask* t : to_merge->tasks) - if (t->getTaskName().compare(task_name) == 0) - to_merge_task = t; - - // attempt to find the same task on merged - for (ReusableTask* t : merged->tasks) - if (t->getTaskName().compare(task_name) == 0 && - to_merge_task->reusable(t)) - return true; - - return false; -} - -// for the meantime the mearging will happen whenever at least the first task is reusable -bool merging_condition(PipelineComponentBase* merged, PipelineComponentBase* to_merge, - map &args, map> ref) { - - // compatibility with stages that dont implement task reuse - if (ref.size() == 0) - return false; - - // if any of the stages were already reused they can't be merged - if (to_merge->reused != NULL) - return false; - - // verify if the first task is reusable - if (!exists_reusable_task(merged, to_merge, ref.begin()->first)) - return false; - - // verify if the stage dependecy is the same - for (ArgumentBase* a1 : merged->getArguments()) { - ArgumentBase* arg1 = args[a1->getId()]; - if (arg1->getParent() != 0) { - for (ArgumentBase* a2 : to_merge->getArguments()) { - ArgumentBase* arg2 = args[a2->getId()]; - if (arg1->getParent() == arg2->getParent()) { - return true; - } - } - } - } - - return false; -} - -// filters all the stages from an input map by the stage's name -void filter_stages(const map &all_stages, - string stage_name, list &filtered_stages) { - - for (pair p : all_stages) - if (p.second->getName().compare(stage_name) == 0) - filtered_stages.emplace_back(p.second); -} - -list task_generator(map> &tasks_desc, PipelineComponentBase* p, - RegionTemplate* rt, map expanded_args) { - - list tasks; - ReusableTask* prev_task = NULL; - - // traverse the map on reverse order to set dependencies - for (map>::reverse_iterator t=tasks_desc.rbegin(); t!=tasks_desc.rend(); t++) { - // get task args - list args; - for (ArgumentBase* a : t->second) { - ArgumentBase* aa = find_argument(p, a->getName(), expanded_args); - if (aa != NULL) - args.emplace_back(aa); - } - - // call constructor - int uid = new_uid(); - ReusableTask* n_task = ReusableTask::ReusableTaskFactory::getTaskFromName(t->first, args, rt); - n_task->setId(uid); - n_task->setTaskName(t->first); - // set prevoius task dependency if this isn't the first task generated - if (t != tasks_desc.rbegin()) { - prev_task->parentTask = n_task->getId(); - } - prev_task = n_task; - tasks.emplace_back(n_task); - // cout << "[task_generator] new task " << uid << ":" << t->first << " from stage " << p->getId() << endl; - // cout << "[task_generator] \targs:" << endl; - // n_task->print(); - - } - - return tasks; -} - -ReusableTask* find_task(list l, string name) { - for (ReusableTask* t : l) - if (t->getTaskName().compare(name) == 0) - return t; - return NULL; -} - -list find_tasks(list l, string name) { - list tasks; - for (ReusableTask* t : l) - if (t->getTaskName().compare(name) == 0) - tasks.emplace_back(t); - return tasks; -} - -void merge_stages(PipelineComponentBase* current, PipelineComponentBase* s, map> ref) { - - s->reused = current; - - ReusableTask* current_frontier_reusable_tasks; - map>::iterator p=ref.begin(); - ReusableTask* prev_reusable_task = NULL; - for (; p!=ref.end(); p++) { - // verify if this is the first reusable task - ReusableTask* t_s = find_task(s->tasks, p->first); - list t_cur = find_tasks(current->tasks, p->first); - - // check all of the same tasks of current - bool reusable = false; - for (ReusableTask* t : t_cur) { - // verify if t_s is reusable by checking if it's compatible with a task t and - // if the prev_reusable_task is also the predecessor of t. - if (t->reusable(t_s) && (prev_reusable_task == NULL || - prev_reusable_task->getId() == t->parentTask)) { - reusable = true; - prev_reusable_task = t; - current_frontier_reusable_tasks = t; - break; - } - } - if (!reusable) { - break; - } - - // free t_s since it was reused - delete t_s; - } - - // updates the first non-reusable task dependency - ReusableTask* frontier = find_task(s->tasks, p->first); - frontier->parentTask = current_frontier_reusable_tasks->getId(); - current->tasks.emplace_front(frontier); - p++; - - // adds the remaining non-reusable tasks to current - for (; p!=ref.end(); p++) { - current->tasks.emplace_front(find_task(s->tasks, p->first)); - } - - // remove all tasks references since they were either deleted above or have been sent to current - s->tasks.clear(); -} - -// attempt to merge a list of PCB, returning the new list with only the merged PCBs -list merge_stages(list stages, - map &args, map> ref) { - - if (stages.size() == 1) - return stages; - - list::iterator i = stages.begin(); - - for (; i!=stages.end(); i++) { - for (list::iterator j = next(i); j!=stages.end();) { - if (merging_condition(*i, *j, args, ref)) { - merge_stages(*i, *j, ref); - j = stages.erase(j); - } else - j++; - } - } - - return stages; -} - -// Attempt to merge a list of PCB, returning a list of PCBs with the same size. -// The new list will have the merged PCBs without any tasks and with the reuse -// atribute set as true. -list merge_stages_full(list stages, - map &args, map> ref) { - - if (stages.size() == 1) - return stages; - - list::iterator i = stages.begin(); - - for (; i!=stages.end(); i++) { - for (list::iterator j = next(i); j!=stages.end(); j++) { - if (merging_condition(*i, *j, args, ref)) { - merge_stages(*i, *j, ref); - (*j)->reused = *i; - } - } - } - - return stages; -} - -mincut::weight_t get_reuse_factor(PipelineComponentBase* s1, PipelineComponentBase* s2, - map &args, map> ref) { - - if (!merging_condition(s1, s2, args, ref)) - return 0; - - PipelineComponentBase* s1_clone = s1->clone(); - s1_clone->setLocation(PipelineComponentBase::WORKER_SIDE); - PipelineComponentBase* s2_clone = s2->clone(); - s2_clone->setLocation(PipelineComponentBase::WORKER_SIDE); - - merge_stages(s1_clone, s2_clone, ref); - - mincut::weight_t ret = s1->tasks.size() + s2->tasks.size() - s1_clone->tasks.size(); - - // clean memory - s1_clone->remove_outputs = true; - delete s1_clone; - s2_clone->remove_outputs = true; - delete s2_clone; - - return ret; -} - mincut::weight_t get_reuse_factor(mincut::subgraph_t s1, mincut::subgraph_t s2, map id2task, map current_stages, map &args, map> ref) { @@ -1593,77 +1316,6 @@ mincut::weight_t get_reuse_factor(mincut::subgraph_t s1, mincut::subgraph_t s2, return ret; } -float calc_stage_proc(list s, map &args, map> ref) { - list::iterator i = s.begin(); - - - for (; i!=s.end(); i++) { - PipelineComponentBase* current = (*i)->clone(); - current->setLocation(PipelineComponentBase::WORKER_SIDE); - for (list::iterator j = next(i); j!=s.end();) { - if (merging_condition(*i, *j, args, ref)) { - PipelineComponentBase* j_clone = (*j)->clone(); - j_clone->setLocation(PipelineComponentBase::WORKER_SIDE); - merge_stages(current, j_clone, ref); - j_clone->remove_outputs = true; - delete j_clone; - j = s.erase(j); - } else - j++; - } - (*i) = current; - } - - float proc_cost = 0; - for (PipelineComponentBase* p : s) { - for (ReusableTask* t : p->tasks) - // proc_cost += t->getProcCost(); - proc_cost++; - p->remove_outputs = true; - delete p; - } - - return proc_cost; -} - -// just add PCB s symbolicaly and calc the cost with stages -float calc_stage_proc(list stages, PipelineComponentBase* s, map &args, - map> ref) { - stages.emplace_back(s); - return calc_stage_proc(stages, args, ref); -} - -float calc_stage_mem(list s, map &args, map> ref) { - list::iterator i = s.begin(); - - for (; i!=s.end(); i++) { - PipelineComponentBase* current = (*i)->clone(); - current->setLocation(PipelineComponentBase::WORKER_SIDE); - for (list::iterator j = next(i); j!=s.end();) { - if (merging_condition(*i, *j, args, ref)) { - PipelineComponentBase* j_clone = (*j)->clone(); - j_clone->setLocation(PipelineComponentBase::WORKER_SIDE); - merge_stages(current, j_clone, ref); - j = s.erase(j); - j_clone->remove_outputs = true; - delete j_clone; - } else - j++; - } - } - - float mem_cost = 0; - for (PipelineComponentBase* p : s) { - for (ReusableTask* t : p->tasks) - // mem_cost += t->getMemCost(); - mem_cost+=0; - p->remove_outputs = true; - delete p; - } - - return mem_cost; -} - bool cutting_condition(list current, float nrS_mksp, float max_mem, map &args, map> ref) { @@ -2070,20 +1722,13 @@ void merge_stages_fine_grain(const map &all_stages, list current_stages; filter_stages(all_stages, ref->second->getName(), current_stages); + cout << "[merge_stages_fine_grain] Generating tasks..." << endl; // generate all tasks - int nrS = 0; - double max_nrS_mksp = 0; for (list::iterator s=current_stages.begin(); s!=current_stages.end(); ) { // if the stage isn't composed of reusable tasks then (*s)->tasks = task_generator(ref->second->tasksDesc, *s, rt, expanded_args); if ((*s)->tasks.size() == 0) { merged_stages[(*s)->getId()] = *s; - - // makespan calculations - nrS++; - if ((*s)->getMksp() > max_nrS_mksp) - max_nrS_mksp = (*s)->getMksp(); - s = current_stages.erase(s); } else s++; @@ -2097,7 +1742,7 @@ void merge_stages_fine_grain(const map &all_stages, continue; } - list> solution = montecarlo_recursive_cut(current_stages, all_stages, + list> solution = reuse_tree_merging(current_stages, all_stages, max_bucket_size, expanded_args, ref->second->tasksDesc); // write merging solution diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.cpp new file mode 100644 index 0000000..6a44949 --- /dev/null +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.cpp @@ -0,0 +1,260 @@ +#include "reuse_tree.hpp" + +#include +#include + +void print_reuse_node(const reuse_node_t* n, int tt) { + for (int i=0; iparent==NULL ? " no parent" : to_string(n->parent->stage_ref->getId()); + std::cout << n->stage_ref->getId() << ", parent: " << p << std::endl; + for (reuse_node_t* nn : n->children) + print_reuse_node(nn, tt+1); +} + +void print_reuse_tree(const reuse_tree_t& t) { + std::cout << "tree of height " << t.height << ":" << std::endl; + for (reuse_node_t* n : t.parents) + print_reuse_node(n, 1); +} + +void print_leafs_parent_list(const list& l) { + for (reuse_node_t* n : l) + std::cout << n->stage_ref->getId() << std::endl; +} + +void recursive_insert_stage(list& node_list, PipelineComponentBase* s, + reuse_node_t* parent, int height, int curr_level, const map& args, + const map>& ref) { + + // stopping condition + if (curr_level >= height) { + // std::cout << "[recursive_insert_stage][" << curr_level << "] stop for " + // << s->getId() << std::endl; + return; + } + + // attempt to find if there is a reuse oportunity on this level + reuse_node_t* reusable_node = NULL; + for (reuse_node_t* n : node_list) { + // check if the reuse factor matches the minimum required for this level + // std::cout << "[recursive_insert_stage][" << curr_level << "] checking " + // << s->getId() << " with " << n->stage_ref->getId() << std::endl; + if (get_reuse_factor(s, n->stage_ref, args, ref) > curr_level) { + // std::cout << "[recursive_insert_stage][" << curr_level << "] " << s->getId() + // << " is reusable with " << n->stage_ref->getId() << std::endl; + reusable_node = n; + break; + } + } + + // if there isn't a reusable node then create a new node for s + if (reusable_node == NULL) { + // std::cout << "[recursive_insert_stage][" << curr_level + // << "] no reusable node for " << s->getId() << std::endl; + reuse_node_t* new_node = new reuse_node_t; + node_list.emplace_back(new_node); + new_node->parent = parent; + new_node->stage_ref = s; + recursive_insert_stage(new_node->children, s, + new_node, height, curr_level+1, args, ref); + } + // if there is a reusable stage then continue the recursive traverse on this node + else { + // std::cout << "[recursive_insert_stage][" << curr_level + // << "] recurring" << std::endl; + recursive_insert_stage(reusable_node->children, s, + reusable_node, height, curr_level+1, args, ref); + } +} + +// Generates the reuse tree based on the reuse level of the stages +reuse_tree_t generate_reuse_tree(const list& stages, + const map& args, const map>& ref) { + reuse_tree_t reuse_tree; + + // set the height based on the number of tasks every stage has + reuse_tree.height = ref.size(); + + // add every stage to the reuse tree + for (PipelineComponentBase* s : stages) { + // find the reuse level (i.e reuse tree height) node of the stage + recursive_insert_stage(reuse_tree.parents, s, NULL, + reuse_tree.height, 0, args, ref); + } + + return reuse_tree; +} + +// Traverse the tree, getting the leafs' parents' references +list generate_leafs_parent_list(reuse_node_t* reuse_node, int height) { + list leafs_parent_list; + + // check stoping condition: is a leaf node parent? + if (height == 1) { + // if it is a leaf node parent, add the reference to itself + leafs_parent_list.emplace_back(reuse_node); + } else { + // if it's another mid node, perform the recursive for all its children + for (reuse_node_t* n : reuse_node->children) { + list current_leafs_parent_list = generate_leafs_parent_list(n, height-1); + leafs_parent_list.insert(leafs_parent_list.begin(), + current_leafs_parent_list.begin(), current_leafs_parent_list.end()); + } + } + + return leafs_parent_list; +} + +// Generate the leafs' parents' references list from the root node +list generate_leafs_parent_list(reuse_tree_t& reuse_tree) { + list leafs_parent_list; + + for (reuse_node_t* n : reuse_tree.parents) { + list current_leafs_parent_list = generate_leafs_parent_list(n, reuse_tree.height-1); + leafs_parent_list.insert(leafs_parent_list.begin(), + current_leafs_parent_list.begin(), current_leafs_parent_list.end()); + } + + return leafs_parent_list; +} + +// Remove the node from its parent and keep recurring until there is +// a parent with at least one still usable node +void recursive_update_parent(reuse_tree_t& t, reuse_node_t* n) { + if (n->parent == NULL) { + t.parents.remove(n); + return; + } + + n->parent->children.remove(n); + + if (n->parent->children.size() == 0) + recursive_update_parent(t, n->parent); +} + +// Prunes the reuse tree based on the leafs_parent_list, returning a list of new buckets +// to be merged, and updates the tree internal structure +list> prune_leaf_level(reuse_tree_t& reuse_tree, + const list& leafs_parent_list, int max_bucket_size) { + + list> new_buckets; + + // attempt to make buckets of every children's leaf list + for (reuse_node_t* n : leafs_parent_list) { + std::cout << "[prune_leaf_level] parent " << n->stage_ref->getId() + << " has " << n->children.size() << " children and mbs " + << max_bucket_size << std::endl; + + // finishes the loop if we can't perform any more simple merging operations + if (n->children.size() < max_bucket_size) + continue; + + std::cout << "[prune_leaf_level] parent " << n->stage_ref->getId() + << " has reuse" << std::endl; + + // Keep making buckets until the remaining stages number + // is less than max_bucket_size + int count; + for (list::iterator c=n->children.begin(); + c!=n->children.end() && n->children.size() >= max_bucket_size;) { + + while (n->children.size() >= max_bucket_size) { + list new_bucket; + count = 0; + std::cout << "[prune_leaf_level] starting bucket of " + << n->stage_ref->getId() << " with size 0" << std::endl; + while (count < max_bucket_size) { + std::cout << "[prune_leaf_level]\tadding " + << (*c)->stage_ref->getId() << " to the bucket" << std::endl; + new_bucket.emplace_back((*c)->stage_ref); + c = n->children.erase(c); + count++; + } + new_buckets.emplace_back(new_bucket); + } + } + + // remove the parent node from its parent if there is no more leafs + // also, keep performing this recursively + if (n->children.size() == 0) { + std::cout << "[prune_leaf_level] performing recursive update on " + << n->stage_ref->getId() << std::endl; + recursive_update_parent(reuse_tree, n); + } + } + + // TODO: keep merging until each child has at most one leaf + // this merging must attempt to keep the leafs of the same child together + + return new_buckets; +} + +// Sends the leaf nodes of the reuse tree one level up, to their parents +void move_reuse_tree_up(reuse_tree_t& reuse_tree, + const list& leafs_parent_list) { + + // performs the move up operation for every leafs' parent node n + for (reuse_node_t* n : leafs_parent_list) { + // adds the node children to its parent + n->parent->children.insert(n->parent->children.begin(), + n->children.begin(), n->children.end()); + + // removes itself from the parent node + n->parent->children.remove(n); + } + + // update the tree height + reuse_tree.height--; +} + +// Performs the stage mearging using the reuse tree algorithm +list> reuse_tree_merging( + const list& stages_to_merge, + const map &all_stages, int max_bucket_size, + const map &args, const map>& ref) { + + list> solution; + + reuse_tree_t reuse_tree = generate_reuse_tree(stages_to_merge, args, ref); + + + // keep prunning and rising the tree until the root height + while (reuse_tree.height > 2) { + print_reuse_tree(reuse_tree); + // perform current height merging iteration + list leafs_parent_list = generate_leafs_parent_list(reuse_tree); + // print_leafs_parent_list(leafs_parent_list); + list> new_buckets = prune_leaf_level( + reuse_tree, leafs_parent_list, max_bucket_size); + move_reuse_tree_up(reuse_tree, leafs_parent_list); + + // add new_buckets to final solution + solution.insert(solution.begin(), new_buckets.begin(), new_buckets.end()); + } + + print_reuse_tree(reuse_tree); + + // add the remaining unmerged stages to the final solution as single stage buckets + if (reuse_tree.parents.size() > 0) { + for (reuse_node_t* n : reuse_tree.parents) { + for (reuse_node_t* nn : n->children) { + list single_stage; + single_stage.emplace_back(nn->stage_ref); + solution.emplace_back(single_stage); + } + } + } + + std::cout << "FINAL SOLUTION" << std::endl; + for (list b : solution) { + std::cout << "bucket of size " << b.size() << " with cost " + << calc_stage_proc(b, args, ref) << std::endl; + for (PipelineComponentBase* s : b) { + std::cout << "\t" << s->getId() << std::endl; + } + } + std::cout << std::endl << std::endl << std::endl; + + return solution; +} \ No newline at end of file diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.hpp new file mode 100644 index 0000000..eb89188 --- /dev/null +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.hpp @@ -0,0 +1,25 @@ +#ifndef REUSE_TREE_HPP +#define REUSE_TREE_HPP + +#include + +#include "../merging.hpp" + +typedef struct reuse_node_t { + reuse_node_t* parent; + std::list children; + PipelineComponentBase* stage_ref; +} reuse_node_t; + +typedef struct { + std::list parents; + int height; +} reuse_tree_t; + +// Performs the stage mearging using the reuse tree algorithm +list> reuse_tree_merging(const list& stages_to_merge, + const map &all_stages, int max_bucket_size, + const map &args, const map>& ref); + + +#endif \ No newline at end of file diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/merging.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/merging.cpp new file mode 100644 index 0000000..a1fd0cb --- /dev/null +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/merging.cpp @@ -0,0 +1,319 @@ +#include "merging.hpp" + +int new_uid() { + return uid++; +} + +ArgumentBase* find_argument(PipelineComponentBase* p, string name, map expanded_args) { + for(int i : p->getInputs()){ + if (expanded_args[i]->getName().compare(name) == 0) { + return expanded_args[i]; + } + } + for(int i : p->getOutputs()){ + if (expanded_args[i]->getName().compare(name) == 0) { + return expanded_args[i]; + } + } + + return NULL; +} + +// This function assumes that the merged PCB has at least, but not limited to one ReusableTask on tasks +// of type task_name. Also, to_merge must have exactly one ReusableTask of type task_name. These +// conditions are not checked. +bool exists_reusable_task(const PipelineComponentBase* merged, const PipelineComponentBase* to_merge, string task_name) { + // get the only task of to_merge that has the type task_name + ReusableTask* to_merge_task = NULL; + for (ReusableTask* t : to_merge->tasks) + if (t->getTaskName().compare(task_name) == 0) + to_merge_task = t; + + // attempt to find the same task on merged + for (ReusableTask* t : merged->tasks) + if (t->getTaskName().compare(task_name) == 0 && + to_merge_task->reusable(t)) + return true; + + return false; +} + +// for the meantime the mearging will happen whenever at least the first task is reusable +bool merging_condition(const PipelineComponentBase* merged, const PipelineComponentBase* to_merge, + const map &args, const map>& ref) { + + // compatibility with stages that dont implement task reuse + if (ref.size() == 0) + return false; + + // if any of the stages were already reused they can't be merged + if (to_merge->reused != NULL) + return false; + + // verify if the first task is reusable + if (!exists_reusable_task(merged, to_merge, ref.begin()->first)) + return false; + + // verify if the stage dependecy is the same + for (ArgumentBase* a1 : merged->getArguments()) { + ArgumentBase* arg1 = args.at(a1->getId()); + if (arg1->getParent() != 0) { + for (ArgumentBase* a2 : to_merge->getArguments()) { + ArgumentBase* arg2 = args.at(a2->getId()); + if (arg1->getParent() == arg2->getParent()) { + return true; + } + } + } + } + + return false; +} + +// filters all the stages from an input map by the stage's name +void filter_stages(const map &all_stages, + string stage_name, list &filtered_stages) { + + for (pair p : all_stages) + if (p.second->getName().compare(stage_name) == 0) + filtered_stages.emplace_back(p.second); +} + +list task_generator(map> &tasks_desc, PipelineComponentBase* p, + RegionTemplate* rt, map expanded_args) { + + list tasks; + ReusableTask* prev_task = NULL; + + // traverse the map on reverse order to set dependencies + for (map>::reverse_iterator t=tasks_desc.rbegin(); t!=tasks_desc.rend(); t++) { + // get task args + list args; + for (ArgumentBase* a : t->second) { + ArgumentBase* aa = find_argument(p, a->getName(), expanded_args); + if (aa != NULL) + args.emplace_back(aa); + } + + // call constructor + int uid = new_uid(); + ReusableTask* n_task = ReusableTask::ReusableTaskFactory::getTaskFromName(t->first, args, rt); + n_task->setId(uid); + n_task->setTaskName(t->first); + // set prevoius task dependency if this isn't the first task generated + if (t != tasks_desc.rbegin()) { + prev_task->parentTask = n_task->getId(); + } + prev_task = n_task; + tasks.emplace_back(n_task); + // cout << "[task_generator] new task " << uid << ":" << t->first << " from stage " << p->getId() << endl; + // cout << "[task_generator] \targs:" << endl; + // n_task->print(); + + } + + return tasks; +} + +ReusableTask* find_task(list l, string name) { + for (ReusableTask* t : l) + if (t->getTaskName().compare(name) == 0) + return t; + return NULL; +} + +list find_tasks(list l, string name) { + list tasks; + for (ReusableTask* t : l) + if (t->getTaskName().compare(name) == 0) + tasks.emplace_back(t); + return tasks; +} + +void merge_stages(PipelineComponentBase* current, PipelineComponentBase* s, map> ref) { + + s->reused = current; + + ReusableTask* current_frontier_reusable_tasks; + map>::iterator p=ref.begin(); + ReusableTask* prev_reusable_task = NULL; + for (; p!=ref.end(); p++) { + // verify if this is the first reusable task + ReusableTask* t_s = find_task(s->tasks, p->first); + list t_cur = find_tasks(current->tasks, p->first); + + // check all of the same tasks of current + bool reusable = false; + for (ReusableTask* t : t_cur) { + // verify if t_s is reusable by checking if it's compatible with a task t and + // if the prev_reusable_task is also the predecessor of t. + if (t->reusable(t_s) && (prev_reusable_task == NULL || + prev_reusable_task->getId() == t->parentTask)) { + reusable = true; + prev_reusable_task = t; + current_frontier_reusable_tasks = t; + break; + } + } + if (!reusable) { + break; + } + + // free t_s since it was reused + delete t_s; + } + + // updates the first non-reusable task dependency + ReusableTask* frontier = find_task(s->tasks, p->first); + frontier->parentTask = current_frontier_reusable_tasks->getId(); + current->tasks.emplace_front(frontier); + p++; + + // adds the remaining non-reusable tasks to current + for (; p!=ref.end(); p++) { + current->tasks.emplace_front(find_task(s->tasks, p->first)); + } + + // remove all tasks references since they were either deleted above or have been sent to current + s->tasks.clear(); +} + +// attempt to merge a list of PCB, returning the new list with only the merged PCBs +list merge_stages(list stages, + map &args, map> ref) { + + if (stages.size() == 1) + return stages; + + list::iterator i = stages.begin(); + + for (; i!=stages.end(); i++) { + for (list::iterator j = next(i); j!=stages.end();) { + if (merging_condition(*i, *j, args, ref)) { + merge_stages(*i, *j, ref); + j = stages.erase(j); + } else + j++; + } + } + + return stages; +} + +// Attempt to merge a list of PCB, returning a list of PCBs with the same size. +// The new list will have the merged PCBs without any tasks and with the reuse +// atribute set as true. +list merge_stages_full(list stages, + map &args, map> ref) { + + if (stages.size() == 1) + return stages; + + list::iterator i = stages.begin(); + + for (; i!=stages.end(); i++) { + for (list::iterator j = next(i); j!=stages.end(); j++) { + if (merging_condition(*i, *j, args, ref)) { + merge_stages(*i, *j, ref); + (*j)->reused = *i; + } + } + } + + return stages; +} + +int get_reuse_factor(PipelineComponentBase* s1, PipelineComponentBase* s2, + const map &args, const map>& ref) { + + if (!merging_condition(s1, s2, args, ref)) + return 0; + + PipelineComponentBase* s1_clone = s1->clone(); + s1_clone->setLocation(PipelineComponentBase::WORKER_SIDE); + PipelineComponentBase* s2_clone = s2->clone(); + s2_clone->setLocation(PipelineComponentBase::WORKER_SIDE); + + merge_stages(s1_clone, s2_clone, ref); + + int ret = s1->tasks.size() + s2->tasks.size() - s1_clone->tasks.size(); + + // clean memory + s1_clone->remove_outputs = true; + delete s1_clone; + s2_clone->remove_outputs = true; + delete s2_clone; + + return ret; +} + +float calc_stage_proc(list s, const map &args, const map>& ref) { + list::iterator i = s.begin(); + + + for (; i!=s.end(); i++) { + PipelineComponentBase* current = (*i)->clone(); + current->setLocation(PipelineComponentBase::WORKER_SIDE); + for (list::iterator j = next(i); j!=s.end();) { + if (merging_condition(*i, *j, args, ref)) { + PipelineComponentBase* j_clone = (*j)->clone(); + j_clone->setLocation(PipelineComponentBase::WORKER_SIDE); + merge_stages(current, j_clone, ref); + j_clone->remove_outputs = true; + delete j_clone; + j = s.erase(j); + } else + j++; + } + (*i) = current; + } + + float proc_cost = 0; + for (PipelineComponentBase* p : s) { + for (ReusableTask* t : p->tasks) + // proc_cost += t->getProcCost(); + proc_cost++; + p->remove_outputs = true; + delete p; + } + + return proc_cost; +} + +// just add PCB s symbolicaly and calc the cost with stages +float calc_stage_proc(list stages, PipelineComponentBase* s, map &args, + map> ref) { + stages.emplace_back(s); + return calc_stage_proc(stages, args, ref); +} + +float calc_stage_mem(list s, map &args, map> ref) { + list::iterator i = s.begin(); + + for (; i!=s.end(); i++) { + PipelineComponentBase* current = (*i)->clone(); + current->setLocation(PipelineComponentBase::WORKER_SIDE); + for (list::iterator j = next(i); j!=s.end();) { + if (merging_condition(*i, *j, args, ref)) { + PipelineComponentBase* j_clone = (*j)->clone(); + j_clone->setLocation(PipelineComponentBase::WORKER_SIDE); + merge_stages(current, j_clone, ref); + j = s.erase(j); + j_clone->remove_outputs = true; + delete j_clone; + } else + j++; + } + } + + float mem_cost = 0; + for (PipelineComponentBase* p : s) { + for (ReusableTask* t : p->tasks) + // mem_cost += t->getMemCost(); + mem_cost+=0; + p->remove_outputs = true; + delete p; + } + + return mem_cost; +} \ No newline at end of file diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/merging.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/merging.hpp new file mode 100644 index 0000000..c335c88 --- /dev/null +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/merging.hpp @@ -0,0 +1,52 @@ +#ifndef MERGING_HPP +#define MERGING_HPP + +#include "Argument.h" +#include "PipelineComponentBase.h" + +// global uid for any local(this file and PipelineManager) entity +static int uid=1; +int new_uid(); + +ArgumentBase* find_argument(PipelineComponentBase* p, string name, map expanded_args); + +// This function assumes that the merged PCB has at least, but not limited to one ReusableTask on tasks +// of type task_name. Also, to_merge must have exactly one ReusableTask of type task_name. These +// conditions are not checked. +bool exists_reusable_task(const PipelineComponentBase* merged, const PipelineComponentBase* to_merge, string task_name); + +// for the meantime the mearging will happen whenever at least the first task is reusable +bool merging_condition(const PipelineComponentBase* merged, const PipelineComponentBase* to_merge, + const map &args, const map>& ref); + +// filters all the stages from an input map by the stage's name +void filter_stages(const map &all_stages, + string stage_name, list &filtered_stages); + +list task_generator(map> &tasks_desc, PipelineComponentBase* p, + RegionTemplate* rt, map expanded_args); + +ReusableTask* find_task(list l, string name); + +list find_tasks(list l, string name); + +void merge_stages(PipelineComponentBase* current, PipelineComponentBase* s, map> ref); + +// Attempt to merge a list of PCB, returning a list of PCBs with the same size. +// The new list will have the merged PCBs without any tasks and with the reuse +// atribute set as true. +list merge_stages_full(list stages, + map &args, map> ref); + +int get_reuse_factor(PipelineComponentBase* s1, PipelineComponentBase* s2, + const map &args, const map>& ref); + +float calc_stage_proc(list s, const map &args, const map>& ref); + +// just add PCB s symbolicaly and calc the cost with stages +float calc_stage_proc(list stages, PipelineComponentBase* s, map &args, + map> ref); + +float calc_stage_mem(list s, map &args, map> ref); + +#endif From e8dd98d3724544859c204cf1c1f9ab49d225945f Mon Sep 17 00:00:00 2001 From: Willian Date: Tue, 11 Oct 2016 11:20:58 -0300 Subject: [PATCH 63/87] First reuse tree optimization (now ~30% reuse). --- .../graph/reuse_tree.cpp | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.cpp index 6a44949..4833885 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.cpp @@ -237,11 +237,31 @@ list> reuse_tree_merging( // add the remaining unmerged stages to the final solution as single stage buckets if (reuse_tree.parents.size() > 0) { + // go through all parent nodes for (reuse_node_t* n : reuse_tree.parents) { - for (reuse_node_t* nn : n->children) { - list single_stage; - single_stage.emplace_back(nn->stage_ref); - solution.emplace_back(single_stage); + // go though all parent child nodes + for (list::iterator nn=n->children.begin(); + nn!=n->children.end() && n->children.size() >= max_bucket_size;) { + + // keep creating buckets if possible + while (n->children.size() >= max_bucket_size) { + list new_bucket; + int count = 0; + while (count < max_bucket_size) { + new_bucket.emplace_back((*nn)->stage_ref); + nn = n->children.erase(nn); + count++; + } + solution.emplace_back(new_bucket); + } + } + + // create a final bucket with all remaining stages, if there are any + if (n->children.size() > 0) { + list final_stage; + for (reuse_node_t* nn : n->children) + final_stage.emplace_back(nn->stage_ref); + solution.emplace_back(final_stage); } } } From 368d60a7eb02d72bbb58f348650771a64b4602b0 Mon Sep 17 00:00:00 2001 From: Willian Date: Tue, 11 Oct 2016 20:19:39 -0300 Subject: [PATCH 64/87] Removed cout's form merging algorithm --- .../graph/reuse_tree.cpp | 65 +++++++++---------- 1 file changed, 32 insertions(+), 33 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.cpp index 4833885..f2d3726 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.cpp @@ -97,7 +97,8 @@ list generate_leafs_parent_list(reuse_node_t* reuse_node, int hei } else { // if it's another mid node, perform the recursive for all its children for (reuse_node_t* n : reuse_node->children) { - list current_leafs_parent_list = generate_leafs_parent_list(n, height-1); + list current_leafs_parent_list = + generate_leafs_parent_list(n, height-1); leafs_parent_list.insert(leafs_parent_list.begin(), current_leafs_parent_list.begin(), current_leafs_parent_list.end()); } @@ -121,16 +122,15 @@ list generate_leafs_parent_list(reuse_tree_t& reuse_tree) { // Remove the node from its parent and keep recurring until there is // a parent with at least one still usable node -void recursive_update_parent(reuse_tree_t& t, reuse_node_t* n) { +void recursive_remove_parent(reuse_tree_t& t, reuse_node_t* n) { if (n->parent == NULL) { t.parents.remove(n); - return; - } - - n->parent->children.remove(n); + } else { + n->parent->children.remove(n); - if (n->parent->children.size() == 0) - recursive_update_parent(t, n->parent); + if (n->parent->children.size() == 0) + recursive_remove_parent(t, n->parent); + } } // Prunes the reuse tree based on the leafs_parent_list, returning a list of new buckets @@ -142,31 +142,30 @@ list> prune_leaf_level(reuse_tree_t& reuse_tree, // attempt to make buckets of every children's leaf list for (reuse_node_t* n : leafs_parent_list) { - std::cout << "[prune_leaf_level] parent " << n->stage_ref->getId() - << " has " << n->children.size() << " children and mbs " - << max_bucket_size << std::endl; + // std::cout << "[prune_leaf_level] parent " << n->stage_ref->getId() + // << " has " << n->children.size() << " children and mbs " + // << max_bucket_size << std::endl; // finishes the loop if we can't perform any more simple merging operations if (n->children.size() < max_bucket_size) continue; - std::cout << "[prune_leaf_level] parent " << n->stage_ref->getId() - << " has reuse" << std::endl; + // std::cout << "[prune_leaf_level] parent " << n->stage_ref->getId() + // << " has reuse" << std::endl; // Keep making buckets until the remaining stages number // is less than max_bucket_size - int count; for (list::iterator c=n->children.begin(); c!=n->children.end() && n->children.size() >= max_bucket_size;) { while (n->children.size() >= max_bucket_size) { list new_bucket; - count = 0; - std::cout << "[prune_leaf_level] starting bucket of " - << n->stage_ref->getId() << " with size 0" << std::endl; + int count = 0; + // std::cout << "[prune_leaf_level] starting bucket of " + // << n->stage_ref->getId() << " with size 0" << std::endl; while (count < max_bucket_size) { - std::cout << "[prune_leaf_level]\tadding " - << (*c)->stage_ref->getId() << " to the bucket" << std::endl; + // std::cout << "[prune_leaf_level]\tadding " + // << (*c)->stage_ref->getId() << " to the bucket" << std::endl; new_bucket.emplace_back((*c)->stage_ref); c = n->children.erase(c); count++; @@ -178,9 +177,9 @@ list> prune_leaf_level(reuse_tree_t& reuse_tree, // remove the parent node from its parent if there is no more leafs // also, keep performing this recursively if (n->children.size() == 0) { - std::cout << "[prune_leaf_level] performing recursive update on " - << n->stage_ref->getId() << std::endl; - recursive_update_parent(reuse_tree, n); + // std::cout << "[prune_leaf_level] performing recursive update on " + // << n->stage_ref->getId() << std::endl; + recursive_remove_parent(reuse_tree, n); } } @@ -221,7 +220,7 @@ list> reuse_tree_merging( // keep prunning and rising the tree until the root height while (reuse_tree.height > 2) { - print_reuse_tree(reuse_tree); + // print_reuse_tree(reuse_tree); // perform current height merging iteration list leafs_parent_list = generate_leafs_parent_list(reuse_tree); // print_leafs_parent_list(leafs_parent_list); @@ -233,7 +232,7 @@ list> reuse_tree_merging( solution.insert(solution.begin(), new_buckets.begin(), new_buckets.end()); } - print_reuse_tree(reuse_tree); + // print_reuse_tree(reuse_tree); // add the remaining unmerged stages to the final solution as single stage buckets if (reuse_tree.parents.size() > 0) { @@ -266,15 +265,15 @@ list> reuse_tree_merging( } } - std::cout << "FINAL SOLUTION" << std::endl; - for (list b : solution) { - std::cout << "bucket of size " << b.size() << " with cost " - << calc_stage_proc(b, args, ref) << std::endl; - for (PipelineComponentBase* s : b) { - std::cout << "\t" << s->getId() << std::endl; - } - } - std::cout << std::endl << std::endl << std::endl; + // std::cout << "FINAL SOLUTION" << std::endl; + // for (list b : solution) { + // std::cout << "bucket of size " << b.size() << " with cost " + // << calc_stage_proc(b, args, ref) << std::endl; + // for (PipelineComponentBase* s : b) { + // std::cout << "\t" << s->getId() << std::endl; + // } + // } + // std::cout << std::endl << std::endl << std::endl; return solution; } \ No newline at end of file From e7bb37c734c98001339da5fe378e3c796b052cda Mon Sep 17 00:00:00 2001 From: Willian Date: Wed, 12 Oct 2016 20:17:06 -0300 Subject: [PATCH 65/87] Implemented and tested the second pass of pruning operation. --- .../graph/reuse_tree.cpp | 270 +++++++++++++++--- .../graph/reuse_tree.hpp | 4 + .../PipelineRTFS-NS-Diff-FGO/merging.cpp | 5 + 3 files changed, 243 insertions(+), 36 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.cpp index f2d3726..7385d7c 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.cpp @@ -133,56 +133,242 @@ void recursive_remove_parent(reuse_tree_t& t, reuse_node_t* n) { } } +void cluster_merging(reuse_tree_t& reuse_tree, + list& leafs_parent_list, + list>& new_buckets, + int max_bucket_size) { + + std::cout << "starting merging with " << leafs_parent_list.size() + << " parents" << std::endl; + // cluster the parents nodes of leafs_parent_list by their parents + multimap parents_clusters; + set parents_clusters_keys; + for (reuse_node_t* n : leafs_parent_list) { + parents_clusters.emplace(n->parent, n); + parents_clusters_keys.emplace(n->parent); + } + + // performs the merging for each one of the clusters + for (set::iterator p=parents_clusters_keys.begin(); + p!=parents_clusters_keys.end(); p++) { + + std::cout << "\titerating on cluster of parent node " + << (*p)->stage_ref->getId() << std::endl; + + multimap::iterator c_it = + parents_clusters.lower_bound(*p); + multimap::iterator c_end = + parents_clusters.upper_bound(*p); + + // makes the parents multimap, grouped by number of children + multimap parents_by_children_count; + set parents_by_children_count_ids; + for (; c_it!=c_end; c_it++) { + parents_by_children_count.emplace(c_it->second->children.size(), c_it->second); + parents_by_children_count_ids.emplace(c_it->second->children.size()); + } + + // keeps attempting to merge the yet unmerged parents' children + for (set::reverse_iterator c_count=parents_by_children_count_ids.rbegin(); + c_count!=parents_by_children_count_ids.rend(); c_count++) { + + std::cout << "\t\ttrying to merge the parents of c_count " << + *c_count << std::endl; + + multimap::iterator n_it = + parents_by_children_count.lower_bound(*c_count); + multimap::iterator n_end = + parents_by_children_count.upper_bound(*c_count); + + // Attempts to find a matching parent to make a perfect merge + // with each current cluster parent + for (; n_it!=n_end; n_it++) { + int current_bucket_size = n_it->first; + + //the new bucket search stack + stack bucket_stack; + bucket_stack.push(n_it->second); + + std::cout << "\t\t\tstarting a stack with parent " << + n_it->second->stage_ref->getId() << " and b_size " + << current_bucket_size << std::endl; + + // starts the merge attempts with the nodes on the current cluster + multimap::iterator n_it2 = next(n_it, 1); + for (; n_it2!=n_end; n_it2++) { + if (current_bucket_size + n_it->first <= max_bucket_size) { + bucket_stack.push(n_it2->second); + current_bucket_size += n_it2->first; + std::cout << "\t\t\t\tfrom the same " << n_it2->first + << " c_count, added " << n_it2->second->stage_ref->getId() + << " to the stack" << std::endl; + } else + break; + } + + // keeps attempting the merging process with other clusters + set::reverse_iterator c_count2 = next(c_count, 1); + + // A new parent will be added to the stack if possible. If the perfect + // match isn't found at the end of an insert iteration then the stack + // is popped and the search continues from the stages with children_count + // next to the popped parent. If any merging is impossible than the + // stack will become empty, with current_bucket_size=0. + while (current_bucket_size != max_bucket_size + && current_bucket_size != 0) { + + std::cout << "\t\t\t\tsearching other c_counts with b_size " + << current_bucket_size << std::endl; + + // starts the search on the current c_count2 + for (; c_count2!=parents_by_children_count_ids.rend(); c_count2++) { + n_it2 = parents_by_children_count.lower_bound(*c_count2); + multimap::iterator n_end2 = + parents_by_children_count.upper_bound(*c_count2); + + std::cout << "\t\t\t\t\tsearching c_count " + << *c_count2 << std::endl; + + // goes through current c_count2 cluster + for (; n_it2!=n_end2; n_it2++) { + if (current_bucket_size + n_it2->first <= max_bucket_size) { + bucket_stack.push(n_it2->second); + current_bucket_size += n_it2->first; + std::cout << "\t\t\t\t\t\tadded " + << n_it2->second->stage_ref->getId() + << " to the stack with size " + << n_it2->first << std::endl; + } else + break; + } + } + + // if it isn't a perfect sized bucket then pop the last added parent + if (current_bucket_size != max_bucket_size) { + std::cout << "\t\t\t\tbad bucket size: " + << current_bucket_size << std::endl; + c_count2 = find(parents_by_children_count_ids.rbegin(), + parents_by_children_count_ids.rend(), + bucket_stack.top()->children.size()); + current_bucket_size -= *c_count2; + c_count2 = next(c_count2, 1); + bucket_stack.pop(); + std::cout << "\t\t\t\tremoving " << *c_count2 + << " from the stack" << std::endl; + } + } + + // checks if a viable bucket was found + if (current_bucket_size == max_bucket_size) { + + std::cout << "\t\t\tnew solution found:" << std::endl; + + // adds the new bucket to the solution + list new_bucket; + while (!bucket_stack.empty()) { + reuse_node_t* n = bucket_stack.top(); + bucket_stack.pop(); + // adds all of the parent's children + for (list::iterator nn=n->children.begin(); + nn!=n->children.end(); ) { + + std::cout << "\t\t\t\t" << (*nn)->stage_ref->getId() << std::endl; + new_bucket.emplace_back((*nn)->stage_ref); + nn = n->children.erase(nn); + } + + // performs the recursive parent removal if necessary + if (n->children.size() == 0) + recursive_remove_parent(reuse_tree, n); + + // removes the merged nodes from the leafs_parent_list + leafs_parent_list.remove(n); + } + new_buckets.emplace_back(new_bucket); + + // breaks the search since the nodes removal messes the iterators up + return; + } + } + } + + std::cout << "\tcluster of parent node " << (*p)->stage_ref->getId() + << " don't have any more reuse oportunities" << std::endl; + + // If this point was reached it means that the current cluster don't have any more + // reuse oportunities to be taken, so we remove the cluster's parents from the + // leafs_parent_list + c_it = parents_clusters.lower_bound(*p); + c_end = parents_clusters.upper_bound(*p); + for (; c_it!=c_end; c_it++) { + leafs_parent_list.remove(c_it->second); + } + } +} + // Prunes the reuse tree based on the leafs_parent_list, returning a list of new buckets // to be merged, and updates the tree internal structure list> prune_leaf_level(reuse_tree_t& reuse_tree, - const list& leafs_parent_list, int max_bucket_size) { + list leafs_parent_list, int max_bucket_size) { list> new_buckets; + // pruning first pass ------------------- // attempt to make buckets of every children's leaf list - for (reuse_node_t* n : leafs_parent_list) { - // std::cout << "[prune_leaf_level] parent " << n->stage_ref->getId() - // << " has " << n->children.size() << " children and mbs " + for (list::iterator n=leafs_parent_list.begin(); + n!=leafs_parent_list.end(); ) { + // std::cout << "[prune_leaf_level] parent " << (*n)->stage_ref->getId() + // << " has " << (*n)->children.size() << " children and mbs " // << max_bucket_size << std::endl; // finishes the loop if we can't perform any more simple merging operations - if (n->children.size() < max_bucket_size) + if ((*n)->children.size() < max_bucket_size) { + n++; continue; + } - // std::cout << "[prune_leaf_level] parent " << n->stage_ref->getId() + // std::cout << "[prune_leaf_level] parent " << (*n)->stage_ref->getId() // << " has reuse" << std::endl; - // Keep making buckets until the remaining stages number + // Keeps making buckets until the remaining stages number // is less than max_bucket_size - for (list::iterator c=n->children.begin(); - c!=n->children.end() && n->children.size() >= max_bucket_size;) { + for (list::iterator c=(*n)->children.begin(); + c!=(*n)->children.end() && (*n)->children.size() >= max_bucket_size;) { - while (n->children.size() >= max_bucket_size) { + while ((*n)->children.size() >= max_bucket_size) { list new_bucket; int count = 0; - // std::cout << "[prune_leaf_level] starting bucket of " - // << n->stage_ref->getId() << " with size 0" << std::endl; + std::cout << "[prune_leaf_level] starting bucket of " + << (*n)->stage_ref->getId() << " with size 0" << std::endl; while (count < max_bucket_size) { - // std::cout << "[prune_leaf_level]\tadding " - // << (*c)->stage_ref->getId() << " to the bucket" << std::endl; + std::cout << "[prune_leaf_level]\tadding " + << (*c)->stage_ref->getId() << " to the bucket" << std::endl; new_bucket.emplace_back((*c)->stage_ref); - c = n->children.erase(c); + c = (*n)->children.erase(c); count++; } new_buckets.emplace_back(new_bucket); } } - // remove the parent node from its parent if there is no more leafs - // also, keep performing this recursively - if (n->children.size() == 0) { + // removes the parent node from its parent if there is no more leafs + // also, keeps performing this recursively + if ((*n)->children.size() == 0) { // std::cout << "[prune_leaf_level] performing recursive update on " - // << n->stage_ref->getId() << std::endl; - recursive_remove_parent(reuse_tree, n); - } + // << (*n)->stage_ref->getId() << std::endl; + recursive_remove_parent(reuse_tree, *n); + + // removes the parent from the list if there are no more children to merge + n = leafs_parent_list.erase(n); + } else + n++; } + // pruning second pass ------------------- + while (leafs_parent_list.size() > 0) + cluster_merging(reuse_tree, leafs_parent_list, new_buckets, max_bucket_size); + + // TODO: keep merging until each child has at most one leaf // this merging must attempt to keep the leafs of the same child together @@ -196,9 +382,11 @@ void move_reuse_tree_up(reuse_tree_t& reuse_tree, // performs the move up operation for every leafs' parent node n for (reuse_node_t* n : leafs_parent_list) { // adds the node children to its parent - n->parent->children.insert(n->parent->children.begin(), - n->children.begin(), n->children.end()); - + for (reuse_node_t* nn : n->children) { + nn->parent = n->parent; + n->parent->children.emplace_back(nn); + } + // removes itself from the parent node n->parent->children.remove(n); } @@ -220,19 +408,22 @@ list> reuse_tree_merging( // keep prunning and rising the tree until the root height while (reuse_tree.height > 2) { - // print_reuse_tree(reuse_tree); + std::cout << "before:" << std::endl; + print_reuse_tree(reuse_tree); // perform current height merging iteration list leafs_parent_list = generate_leafs_parent_list(reuse_tree); // print_leafs_parent_list(leafs_parent_list); list> new_buckets = prune_leaf_level( reuse_tree, leafs_parent_list, max_bucket_size); + std::cout << "after:" << std::endl; + print_reuse_tree(reuse_tree); move_reuse_tree_up(reuse_tree, leafs_parent_list); // add new_buckets to final solution solution.insert(solution.begin(), new_buckets.begin(), new_buckets.end()); } - // print_reuse_tree(reuse_tree); + print_reuse_tree(reuse_tree); // add the remaining unmerged stages to the final solution as single stage buckets if (reuse_tree.parents.size() > 0) { @@ -246,7 +437,10 @@ list> reuse_tree_merging( while (n->children.size() >= max_bucket_size) { list new_bucket; int count = 0; + std::cout << "starting empty bucket:" << std::endl; while (count < max_bucket_size) { + std::cout << "adding to bucket " + << (*nn)->stage_ref->getId() << std::endl; new_bucket.emplace_back((*nn)->stage_ref); nn = n->children.erase(nn); count++; @@ -258,22 +452,26 @@ list> reuse_tree_merging( // create a final bucket with all remaining stages, if there are any if (n->children.size() > 0) { list final_stage; - for (reuse_node_t* nn : n->children) + std::cout << "starting final empty bucket:" << std::endl; + for (reuse_node_t* nn : n->children) { final_stage.emplace_back(nn->stage_ref); + std::cout << "adding to bucket " + << nn->stage_ref->getId() << std::endl; + } solution.emplace_back(final_stage); } } } - // std::cout << "FINAL SOLUTION" << std::endl; - // for (list b : solution) { - // std::cout << "bucket of size " << b.size() << " with cost " - // << calc_stage_proc(b, args, ref) << std::endl; - // for (PipelineComponentBase* s : b) { - // std::cout << "\t" << s->getId() << std::endl; - // } - // } - // std::cout << std::endl << std::endl << std::endl; + std::cout << "FINAL SOLUTION" << std::endl; + for (list b : solution) { + for (PipelineComponentBase* s : b) { + std::cout << "\t" << s->getId() << std::endl; + } + std::cout << "bucket of size " << b.size() << " with cost " + << calc_stage_proc(b, args, ref) << std::endl; + } + std::cout << std::endl << std::endl << std::endl; return solution; } \ No newline at end of file diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.hpp index eb89188..d198467 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.hpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.hpp @@ -2,6 +2,10 @@ #define REUSE_TREE_HPP #include +#include +#include +#include +#include #include "../merging.hpp" diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/merging.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/merging.cpp index a1fd0cb..1884984 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/merging.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/merging.cpp @@ -134,6 +134,11 @@ void merge_stages(PipelineComponentBase* current, PipelineComponentBase* s, map< s->reused = current; + if (s->tasks.size() != ref.size()) { + (s+134)->tasks.size(); + // exit(-10); + } + ReusableTask* current_frontier_reusable_tasks; map>::iterator p=ref.begin(); ReusableTask* prev_reusable_task = NULL; From fd946576ac1e153d787d1cec32c449c84d21db5c Mon Sep 17 00:00:00 2001 From: Willian Date: Thu, 13 Oct 2016 16:08:59 -0300 Subject: [PATCH 66/87] Fixed the application args input. --- .../PipelineManager.cpp | 519 +++++++++--------- 1 file changed, 272 insertions(+), 247 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 322a0fc..f6d80fe 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -128,289 +128,314 @@ parsing::port_type_t get_port_type(string s); int main(int argc, char* argv[]) { + int mpi_rank; + int mpi_size; + int mpi_val; + + MPI_Init(&argc, &argv); + + MPI_Comm_size(MPI_COMM_WORLD, &mpi_size); + MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank); + // Handler to the distributed execution system environment SysEnv sysEnv; - // region template used by all stages - RegionTemplate *rt = new RegionTemplate(); - rt->setName("tile"); + if (mpi_rank == mpi_size-1) { + // region template used by all stages + RegionTemplate *rt = new RegionTemplate(); + rt->setName("tile"); - // get arguments - if (argc != 2 && argc != 4) { - cout << "usage: ./PipelineRTFS-NS-Diff-FGO [-i DAKOTA_OUTPUT_FILE]" << endl; - return 0; - } + // get arguments + if (argc != 3) { + cout << "usage: ./PipelineRTFS-NS-Diff-FGO " << endl; + return 0; + } - int max_bucket_size = atoi(argv[1]); + int max_bucket_size = atoi(argv[1]); + string dakota_file = argv[2]; - // workflow file - FILE* workflow_descriptor = fopen("seg_example.t2flow", "r"); + // workflow file + FILE* workflow_descriptor = fopen("seg_example.t2flow", "r"); - //------------------------------------------------------------ - // Parse pipeline file - //------------------------------------------------------------ + //------------------------------------------------------------ + // Parse pipeline file + //------------------------------------------------------------ - // get all workflow inputs without their values, returning also the parameters - // values (i.e list values) on another map - map workflow_inputs; - map> parameters_values; - get_inputs_from_file(workflow_descriptor, workflow_inputs, parameters_values); + // get all workflow inputs without their values, returning also the parameters + // values (i.e list values) on another map + map workflow_inputs; + map> parameters_values; + get_inputs_from_file(workflow_descriptor, workflow_inputs, parameters_values); - // cout << "workflow_inputs:" << endl; - // for (pair p : workflow_inputs) - // cout << p.first << ":" << p.second->getName() << endl; + // cout << "workflow_inputs:" << endl; + // for (pair p : workflow_inputs) + // cout << p.first << ":" << p.second->getName() << endl; - // cout << endl << "parameters_values:" << endl; - // for (pair> p : parameters_values) { - // cout << "argument " << p.first << ":" << workflow_inputs[p.first]->getName() << ":" << endl; - // for (ArgumentBase* a : p.second) - // cout << "\t" << a->toString() << endl; - // } + // cout << endl << "parameters_values:" << endl; + // for (pair> p : parameters_values) { + // cout << "argument " << p.first << ":" << workflow_inputs[p.first]->getName() << ":" << endl; + // for (ArgumentBase* a : p.second) + // cout << "\t" << a->toString() << endl; + // } - // get all workflow outputs - map workflow_outputs; - get_outputs_from_file(workflow_descriptor, workflow_outputs); - // cout << endl << "workflow_outputs " << endl; - // mapprint(workflow_outputs); - // for (pair p : workflow_outputs) - // cout << p.second->getId() << ":" << p.second->getName() << endl; - - // get all stages, also setting the uid from this context to Task (i.e Task::setId()) - // also returns the list of arguments used - // the stages dependencies are also set here (i.e Task::addDependency()) - map base_stages; - map interstage_arguments; - get_stages_from_file(workflow_descriptor, base_stages, interstage_arguments); - // cout << endl << "base_stages:" << endl; - // for (pair p : base_stages) { - // cout << p.first << ":" << p.second->getName() << endl; - // cout << "\toutputs: " << p.second->getOutputs().size() << endl << endl; - // for (int i : p.second->getOutputs()) - // cout << "\t\t" << i << ":" << interstage_arguments[i]->getName() << endl; - // cout << "\t task descriptors:" << endl; - // for (pair> d : p.second->tasksDesc) { - // cout << "\t\ttask: " << d.first << endl; - // for (ArgumentBase* a : d.second) - // cout << "\t\t\t" << a->getName() << endl; - // } - // } + // get all workflow outputs + map workflow_outputs; + get_outputs_from_file(workflow_descriptor, workflow_outputs); + // cout << endl << "workflow_outputs " << endl; + // mapprint(workflow_outputs); + // for (pair p : workflow_outputs) + // cout << p.second->getId() << ":" << p.second->getName() << endl; + + // get all stages, also setting the uid from this context to Task (i.e Task::setId()) + // also returns the list of arguments used + // the stages dependencies are also set here (i.e Task::addDependency()) + map base_stages; + map interstage_arguments; + get_stages_from_file(workflow_descriptor, base_stages, interstage_arguments); + // cout << endl << "base_stages:" << endl; + // for (pair p : base_stages) { + // cout << p.first << ":" << p.second->getName() << endl; + // cout << "\toutputs: " << p.second->getOutputs().size() << endl << endl; + // for (int i : p.second->getOutputs()) + // cout << "\t\t" << i << ":" << interstage_arguments[i]->getName() << endl; + // cout << "\t task descriptors:" << endl; + // for (pair> d : p.second->tasksDesc) { + // cout << "\t\ttask: " << d.first << endl; + // for (ArgumentBase* a : d.second) + // cout << "\t\t\t" << a->getName() << endl; + // } + // } - // cout << endl << "interstage_arguments:" << endl; - // for (pair p : interstage_arguments) - // cout << p.first << ":" << p.second->getName() << endl; + // cout << endl << "interstage_arguments:" << endl; + // for (pair p : interstage_arguments) + // cout << p.first << ":" << p.second->getName() << endl; - // this map is a dependency structure: stage -> dependency_list - map> deps; - - // connect the stages inputs/outputs - connect_stages_from_file(workflow_descriptor, base_stages, - interstage_arguments, workflow_inputs, deps, workflow_outputs); - map all_argument(workflow_inputs); - for (pair a : interstage_arguments) - all_argument[a.first] = a.second; - - // mapprint(all_argument); - - // cout << endl << "all_arguments:" << endl; - // for (pair p : all_argument) { - // cout << p.second->getId() << ":" << p.second->getName() - // << " parent " << p.second->getParent() << endl; - // } + // this map is a dependency structure: stage -> dependency_list + map> deps; + + // connect the stages inputs/outputs + connect_stages_from_file(workflow_descriptor, base_stages, + interstage_arguments, workflow_inputs, deps, workflow_outputs); + map all_argument(workflow_inputs); + for (pair a : interstage_arguments) + all_argument[a.first] = a.second; + + // mapprint(all_argument); + + // cout << endl << "all_arguments:" << endl; + // for (pair p : all_argument) { + // cout << p.second->getId() << ":" << p.second->getName() + // << " parent " << p.second->getParent() << endl; + // } - // cout << endl << "connected base_stages:" << endl; - // for (pair p : base_stages) { - // cout << p.first << ":" << p.second->getName() << endl; - // cout << "\tinputs: " << p.second->getInputs().size() << endl; - // for (int i : p.second->getInputs()) - // cout << "\t\t" << i << ":" << all_argument[i]->getName() << endl; - // cout << "\toutputs: " << p.second->getOutputs().size() << endl; - // for (int i : p.second->getOutputs()) - // cout << "\t\t" << i << ":" << all_argument[i]->getName() << endl; - // } + // cout << endl << "connected base_stages:" << endl; + // for (pair p : base_stages) { + // cout << p.first << ":" << p.second->getName() << endl; + // cout << "\tinputs: " << p.second->getInputs().size() << endl; + // for (int i : p.second->getInputs()) + // cout << "\t\t" << i << ":" << all_argument[i]->getName() << endl; + // cout << "\toutputs: " << p.second->getOutputs().size() << endl; + // for (int i : p.second->getOutputs()) + // cout << "\t\t" << i << ":" << all_argument[i]->getName() << endl; + // } - //------------------------------------------------------------ - // Iterative merging of stages - //------------------------------------------------------------ - - map args; - for (pair p : workflow_inputs) - args[p.first] = p.second; - for (pair p : interstage_arguments) - args[p.first] = p.second; - - map expanded_args; - map expanded_stages; - - // expand_stages(args, parameters_values, expanded_args, - // base_stages, expanded_stages, workflow_outputs); - FILE* parameters_values_file = fopen("dakota_nscale_ps_moat_600_32nodes.out", "r"); - generate_pre_defined_stages(parameters_values_file, args, base_stages, workflow_outputs, - expanded_args, expanded_stages); - - cout << endl<< "merged: " << endl; - for (pair p : expanded_stages) { - cout << "stage " << p.second->getId() << ":" << p.second->getName() << endl; - cout << "\tinputs: " << endl; - for (int i : p.second->getInputs()) - cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " - << expanded_args[i]->toString() << endl; - cout << "\toutputs: " << endl; - for (int i : p.second->getOutputs()) - cout << "\t\t" << i << ":" << expanded_args[i]->getName() << endl; - } + //------------------------------------------------------------ + // Iterative merging of stages + //------------------------------------------------------------ - // cout << endl << "merged args" << endl; - // for (pair p : expanded_args) - // cout << "\t" << p.first << ":" << p.second->getName() << " = " - // << p.second->toString() << " sized: " << p.second->size() << endl; + map args; + for (pair p : workflow_inputs) + args[p.first] = p.second; + for (pair p : interstage_arguments) + args[p.first] = p.second; - // add arguments to each stage - cout << endl << "add_arguments_to_stages" << endl; - add_arguments_to_stages(expanded_stages, expanded_args, rt); + map expanded_args; + map expanded_stages; - map merged_stages; + // expand_stages(args, parameters_values, expanded_args, + // base_stages, expanded_stages, workflow_outputs); + FILE* parameters_values_file = fopen(dakota_file.c_str(), "r"); + generate_pre_defined_stages(parameters_values_file, args, base_stages, workflow_outputs, + expanded_args, expanded_stages); - // mesure merging exec time - struct timeval start, end; - gettimeofday(&start, NULL); + cout << endl<< "merged: " << endl; + for (pair p : expanded_stages) { + cout << "stage " << p.second->getId() << ":" << p.second->getName() << endl; + cout << "\tinputs: " << endl; + for (int i : p.second->getInputs()) + cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " + << expanded_args[i]->toString() << endl; + cout << "\toutputs: " << endl; + for (int i : p.second->getOutputs()) + cout << "\t\t" << i << ":" << expanded_args[i]->getName() << endl; + } - merge_stages_fine_grain(expanded_stages, base_stages, merged_stages, rt, expanded_args, max_bucket_size); + // cout << endl << "merged args" << endl; + // for (pair p : expanded_args) + // cout << "\t" << p.first << ":" << p.second->getName() << " = " + // << p.second->toString() << " sized: " << p.second->size() << endl; - gettimeofday(&end, NULL); + // add arguments to each stage + cout << endl << "add_arguments_to_stages" << endl; + add_arguments_to_stages(expanded_stages, expanded_args, rt); - long merge_time = ((end.tv_sec * 1000000 + end.tv_usec) - (start.tv_sec * 1000000 + start.tv_usec)); - ofstream exec_time("exec_time_b" + to_string((int)floor(expanded_stages.size()/max_bucket_size)), ios::app); - exec_time << "merge time: " << merge_time << endl; + map merged_stages; - cout << endl<< "merged-fine before deps resolution: " << endl; - for (pair p : merged_stages) { - string s = p.second->reused!=NULL?" - reused":""; - cout << "stage " << p.second->getId() << ":" << p.second->getName() << s << endl; - cout << "\ttasks: " << endl; - for (ReusableTask* t : p.second->tasks) { - cout << "\t\t" << t->getId() << ":" << t->getTaskName() << endl; - cout << "\t\t\tparent_task: " << t->parentTask << endl; - } - } + // mesure merging exec time + struct timeval start, end; + gettimeofday(&start, NULL); + + merge_stages_fine_grain(expanded_stages, base_stages, merged_stages, rt, expanded_args, max_bucket_size); - // resolve dependencies of reused stages - for (pair p : merged_stages) { - // add correct stage dependencies - list deps_tmp; - for (int i=0; igetNumberDependencies(); i++) { - if (merged_stages.find(p.second->getDependency(i)) != merged_stages.end() && - merged_stages[p.second->getDependency(i)]->reused != NULL) { - deps_tmp.emplace_back(merged_stages[p.second->getDependency(i)]->reused->getId()); + gettimeofday(&end, NULL); + + long merge_time = ((end.tv_sec * 1000000 + end.tv_usec) - (start.tv_sec * 1000000 + start.tv_usec)); + ofstream exec_time("exec_time_b" + to_string(max_bucket_size), ios::app); + exec_time << "merge time: " << merge_time << endl; + + cout << endl<< "merged-fine before deps resolution: " << endl; + for (pair p : merged_stages) { + string s = p.second->reused!=NULL?" - reused":""; + cout << "stage " << p.second->getId() << ":" << p.second->getName() << s << endl; + cout << "\ttasks: " << endl; + for (ReusableTask* t : p.second->tasks) { + cout << "\t\t" << t->getId() << ":" << t->getTaskName() << endl; + cout << "\t\t\tparent_task: " << t->parentTask << endl; } } - for (int d : deps_tmp) - p.second->addDependency(d); - - // connect correct output arguments - bool updated = true; - while (updated) { - updated = false; - for (ArgumentBase* a : p.second->getArguments()) { - if (a->getParent() != 0 && merged_stages[a->getParent()]->reused != NULL) { - updated = true; - p.second->replaceArgument(a->getId(), - merged_stages[a->getParent()]->reused->getArgumentByName(a->getName())); - break; + + // resolve dependencies of reused stages + for (pair p : merged_stages) { + // add correct stage dependencies + list deps_tmp; + for (int i=0; igetNumberDependencies(); i++) { + if (merged_stages.find(p.second->getDependency(i)) != merged_stages.end() && + merged_stages[p.second->getDependency(i)]->reused != NULL) { + deps_tmp.emplace_back(merged_stages[p.second->getDependency(i)]->reused->getId()); + } + } + for (int d : deps_tmp) + p.second->addDependency(d); + + // connect correct output arguments + bool updated = true; + while (updated) { + updated = false; + for (ArgumentBase* a : p.second->getArguments()) { + if (a->getParent() != 0 && merged_stages[a->getParent()]->reused != NULL) { + updated = true; + p.second->replaceArgument(a->getId(), + merged_stages[a->getParent()]->reused->getArgumentByName(a->getName())); + break; + } } } - } - - // replace arguments with clones to avoid double free when stages are finished - // map args_clones; - // for (ArgumentBase* a : p.second->getArguments()) { - // ArgumentBase* cpy = a->clone(); - // cpy->setId(new_uid()); - // args_clones[a->getId()] = cpy; - // } - // for (pair a : args_clones) - // p.second->replaceArgument(a.first, a.second); - } - ofstream solution_file; - solution_file.open("fine-grain-merging-solution-b" + to_string((int)floor(expanded_stages.size()/max_bucket_size)), ios::app); - cout << endl<< "merged-fine: " << endl; - solution_file << endl<< "merged-fine: " << endl; - for (pair p : merged_stages) { - string s = p.second->reused!=NULL ? " - reused" : (" with " + to_string(p.second->tasks.size()) + " tasks"); - cout << "stage " << p.second->getId() << ":" << p.second->getName() << s << endl; - solution_file << "stage " << p.second->getId() << ":" << p.second->getName() << s << endl; - cout << "\ttasks: " << endl; - for (ReusableTask* t : p.second->tasks) { - cout << "\t\t" << t->getId() << ":" << t->getTaskName() << endl; - cout << "\t\t" << t->getId() << ":" << t->getTaskName() << endl; + // replace arguments with clones to avoid double free when stages are finished + // map args_clones; + // for (ArgumentBase* a : p.second->getArguments()) { + // ArgumentBase* cpy = a->clone(); + // cpy->setId(new_uid()); + // args_clones[a->getId()] = cpy; + // } + // for (pair a : args_clones) + // p.second->replaceArgument(a.first, a.second); } - } - solution_file.close(); - - //------------------------------------------------------------ - // Add workflows to Manager to be executed - //------------------------------------------------------------ - - string inputFolderPath = "~/Desktop/images15"; - cout << endl << "generate_drs" << endl; - generate_drs(rt, expanded_args); - - // Tell the system which libraries should be used - sysEnv.startupSystem(argc, argv, "libcomponentnsdifffgo.so"); - - // add all stages to manager - cout << endl << "executeComponent" << endl; - for (pair s : merged_stages) { - if (s.second->reused == NULL) { - cout << "sent component " << s.second->getId() << ":" - << s.second->getName() << " sized " << s.second->size() << " to execute with args:" << endl; - cout << "\tall args: " << endl; - for (ArgumentBase* a : s.second->getArguments()) - cout << "\t\t" << a->getId() << ":" << a->getName() << " = " - << a->toString() << " parent " << a->getParent() << endl; - cout << "\tinputs: " << endl; - for (int i : s.second->getInputs()) - cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " - << expanded_args[i]->toString() << " parent " << expanded_args[i]->getParent() << endl; - cout << "\toutputs: " << endl; - for (int i : s.second->getOutputs()) - cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " - << expanded_args[i]->toString() << endl; - ((Task*)s.second)->setId(s.second->getId()); - // workaround to make sure that the RTs, if any, won't leak on this part of the algorithm - s.second->setLocation(PipelineComponentBase::MANAGER_SIDE); + ofstream solution_file; + solution_file.open("fine-grain-merging-solution-b" + to_string(max_bucket_size), ios::app); + cout << endl<< "merged-fine: " << endl; + solution_file << endl<< "merged-fine: " << endl; + for (pair p : merged_stages) { + string s = p.second->reused!=NULL ? " - reused" : (" with " + to_string(p.second->tasks.size()) + " tasks"); + cout << "stage " << p.second->getId() << ":" << p.second->getName() << s << endl; + solution_file << "stage " << p.second->getId() << ":" << p.second->getName() << s << endl; + cout << "\ttasks: " << endl; + for (ReusableTask* t : p.second->tasks) { + cout << "\t\t" << t->getId() << ":" << t->getTaskName() << endl; + cout << "\t\t" << t->getId() << ":" << t->getTaskName() << endl; + } + } + solution_file.close(); - sysEnv.executeComponent(s.second); + //------------------------------------------------------------ + // Add workflows to Manager to be executed + //------------------------------------------------------------ + + string inputFolderPath = "~/Desktop/images15"; + cout << endl << "generate_drs" << endl; + generate_drs(rt, expanded_args); + + for (int i=0; i s : merged_stages) { + if (s.second->reused == NULL) { + cout << "sent component " << s.second->getId() << ":" + << s.second->getName() << " sized " << s.second->size() << " to execute with args:" << endl; + cout << "\tall args: " << endl; + for (ArgumentBase* a : s.second->getArguments()) + cout << "\t\t" << a->getId() << ":" << a->getName() << " = " + << a->toString() << " parent " << a->getParent() << endl; + cout << "\tinputs: " << endl; + for (int i : s.second->getInputs()) + cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " + << expanded_args[i]->toString() << " parent " << expanded_args[i]->getParent() << endl; + cout << "\toutputs: " << endl; + for (int i : s.second->getOutputs()) + cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " + << expanded_args[i]->toString() << endl; + ((Task*)s.second)->setId(s.second->getId()); + + // workaround to make sure that the RTs, if any, won't leak on this part of the algorithm + s.second->setLocation(PipelineComponentBase::MANAGER_SIDE); + + sysEnv.executeComponent(s.second); + } } - } - // execute workflows - cout << endl << "startupExecution" << endl; - gettimeofday(&start, NULL); - - sysEnv.startupExecution(); - - gettimeofday(&end, NULL); - - long run_time = ((end.tv_sec * 1000000 + end.tv_usec) - (start.tv_sec * 1000000 + start.tv_usec)); - exec_time << "run time: " << run_time << endl << endl; - exec_time.close(); - - // get results - cout << endl << "Results: " << endl; - for (pair output : workflow_outputs) { - // cout << "\t" << output.second->getName() << ":" << output.second->getId() << " = " << - // sysEnv.getComponentResultData(output.second->getId()) << endl; - char *resultData = sysEnv.getComponentResultData(output.second->getId()); - std::cout << "Diff Id: " << output.second->getId() << " resultData - "; - if(resultData != NULL){ - std::cout << "size: " << ((int *) resultData)[0] << " Diff: " << ((float *) resultData)[1] << - " Secondary Metric: " << ((float *) resultData)[2] << std::endl; - }else{ - std::cout << "NULL" << std::endl; + // execute workflows + cout << endl << "startupExecution" << endl; + gettimeofday(&start, NULL); + + sysEnv.startupExecution(); + + gettimeofday(&end, NULL); + + long run_time = ((end.tv_sec * 1000000 + end.tv_usec) - (start.tv_sec * 1000000 + start.tv_usec)); + exec_time << "run time: " << run_time << endl << endl; + exec_time.close(); + + // get results + cout << endl << "Results: " << endl; + for (pair output : workflow_outputs) { + // cout << "\t" << output.second->getName() << ":" << output.second->getId() << " = " << + // sysEnv.getComponentResultData(output.second->getId()) << endl; + char *resultData = sysEnv.getComponentResultData(output.second->getId()); + std::cout << "Diff Id: " << output.second->getId() << " resultData - "; + if(resultData != NULL){ + std::cout << "size: " << ((int *) resultData)[0] << " Diff: " << ((float *) resultData)[1] << + " Secondary Metric: " << ((float *) resultData)[2] << std::endl; + }else{ + std::cout << "NULL" << std::endl; + } } + } else { + int flag; + do { + MPI_Iprobe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + &flag, MPI_STATUS_IGNORE); + usleep(200000); + } while (!flag); + MPI_Recv(&mpi_val, 1, MPI_INT, MPI_ANY_SOURCE, + MPI_ANY_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE); + sysEnv.startupSystem(argc, argv, "libcomponentnsdifffgo.so"); } sysEnv.finalizeSystem(); From 82b6558900af2e10427503e7f5ddbb7b7aec2ba8 Mon Sep 17 00:00:00 2001 From: Willian Date: Thu, 13 Oct 2016 16:46:07 -0300 Subject: [PATCH 67/87] Fixed application file outputs to ease testing. --- .../PipelineManager.cpp | 65 ++++++++++++------- 1 file changed, 41 insertions(+), 24 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index f6d80fe..ea3d526 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -102,7 +102,7 @@ void expand_stages(const map &args, map &expanded_stages, map &workflow_outputs); void merge_stages_fine_grain(const map &all_stages, const map &stages_ref, map &merged_stages, - RegionTemplate* rt, map expanded_args, int max_bucket_size); + RegionTemplate* rt, map expanded_args, int max_bucket_size, string dakota_filename); void generate_drs(RegionTemplate* rt, const map &expanded_args); void add_arguments_to_stages(map &merged_stages, map &merged_arguments, @@ -286,13 +286,14 @@ int main(int argc, char* argv[]) { struct timeval start, end; gettimeofday(&start, NULL); - merge_stages_fine_grain(expanded_stages, base_stages, merged_stages, rt, expanded_args, max_bucket_size); + merge_stages_fine_grain(expanded_stages, base_stages, merged_stages, rt, expanded_args, max_bucket_size, dakota_file); gettimeofday(&end, NULL); long merge_time = ((end.tv_sec * 1000000 + end.tv_usec) - (start.tv_sec * 1000000 + start.tv_usec)); - ofstream exec_time("exec_time_b" + to_string(max_bucket_size), ios::app); - exec_time << "merge time: " << merge_time << endl; + ofstream merge_time_f(dakota_file + "-b" + to_string(max_bucket_size) + "merge_time.log", ios::app); + merge_time_f << merge_time << "\t"; + merge_time_f.close(); cout << endl<< "merged-fine before deps resolution: " << endl; for (pair p : merged_stages) { @@ -343,21 +344,21 @@ int main(int argc, char* argv[]) { // p.second->replaceArgument(a.first, a.second); } - ofstream solution_file; - solution_file.open("fine-grain-merging-solution-b" + to_string(max_bucket_size), ios::app); - cout << endl<< "merged-fine: " << endl; - solution_file << endl<< "merged-fine: " << endl; - for (pair p : merged_stages) { - string s = p.second->reused!=NULL ? " - reused" : (" with " + to_string(p.second->tasks.size()) + " tasks"); - cout << "stage " << p.second->getId() << ":" << p.second->getName() << s << endl; - solution_file << "stage " << p.second->getId() << ":" << p.second->getName() << s << endl; - cout << "\ttasks: " << endl; - for (ReusableTask* t : p.second->tasks) { - cout << "\t\t" << t->getId() << ":" << t->getTaskName() << endl; - cout << "\t\t" << t->getId() << ":" << t->getTaskName() << endl; - } - } - solution_file.close(); + // ofstream solution_file; + // solution_file.open("fine-grain-merging-solution-b" + to_string(max_bucket_size), ios::app); + // cout << endl<< "merged-fine: " << endl; + // solution_file << endl<< "merged-fine: " << endl; + // for (pair p : merged_stages) { + // string s = p.second->reused!=NULL ? " - reused" : (" with " + to_string(p.second->tasks.size()) + " tasks"); + // cout << "stage " << p.second->getId() << ":" << p.second->getName() << s << endl; + // solution_file << "stage " << p.second->getId() << ":" << p.second->getName() << s << endl; + // cout << "\ttasks: " << endl; + // for (ReusableTask* t : p.second->tasks) { + // cout << "\t\t" << t->getId() << ":" << t->getTaskName() << endl; + // cout << "\t\t" << t->getId() << ":" << t->getTaskName() << endl; + // } + // } + // solution_file.close(); //------------------------------------------------------------ // Add workflows to Manager to be executed @@ -409,8 +410,9 @@ int main(int argc, char* argv[]) { gettimeofday(&end, NULL); long run_time = ((end.tv_sec * 1000000 + end.tv_usec) - (start.tv_sec * 1000000 + start.tv_usec)); - exec_time << "run time: " << run_time << endl << endl; - exec_time.close(); + ofstream run_time_f(dakota_file + "-b" + to_string(max_bucket_size) + "run_time.log", ios::app); + run_time_f << run_time << "\t"; + run_time_f.close(); // get results cout << endl << "Results: " << endl; @@ -1739,7 +1741,7 @@ list> montecarlo_recursive_cut(list &all_stages, const map &stages_ref, map &merged_stages, - RegionTemplate* rt, map expanded_args, int max_bucket_size) { + RegionTemplate* rt, map expanded_args, int max_bucket_size, string dakota_filename) { // attempt merging for each stage type for (map::const_iterator ref=stages_ref.cbegin(); ref!=stages_ref.cend(); ref++) { @@ -1772,14 +1774,17 @@ void merge_stages_fine_grain(const map &all_stages, // write merging solution ofstream solution_file; - solution_file.open("fine-grain-merging-solution-b" + to_string(max_bucket_size), ios::trunc); + solution_file.open(dakota_filename + "-b" + to_string(max_bucket_size) + "merging_solution.log", ios::trunc); + cout << endl << "solution:" << endl; - solution_file << endl << "solution:" << endl; + solution_file << "solution:" << endl; + int total_tasks=0; for (list b : solution) { cout << "\tbucket with " << b.size() << " stages and cost " << calc_stage_proc(b, expanded_args, ref->second->tasksDesc) << ":" << endl; solution_file << "\tbucket with " << b.size() << " stages and cost " << calc_stage_proc(b, expanded_args, ref->second->tasksDesc) << ":" << endl; + total_tasks += calc_stage_proc(b, expanded_args, ref->second->tasksDesc); for (PipelineComponentBase* s : b) { cout << "\t\tstage " << s->getId() << ":" << s->getName() << ":" << endl; // solution_file << "\t\tstage " << s->getId() << ":" << s->getName() << ":" << endl; @@ -1787,6 +1792,18 @@ void merge_stages_fine_grain(const map &all_stages, } solution_file.close(); + // write some statistics abou the solution + ofstream statistics_file; + statistics_file.open(dakota_filename + "-b" + to_string(max_bucket_size) + "merging_statistics.log", ios::trunc); + + statistics_file << current_stages.size() << "\t"; + statistics_file << current_stages.size()*ref->second->tasksDesc.size() << "\t"; + statistics_file << total_tasks << "\t"; + statistics_file << solution.size() << "\t"; + statistics_file << total_tasks/solution.size() << "\t"; + + statistics_file.close(); + // merge all stages in each bucket, given that they are mergable for (list bucket : solution) { // cout << "bucket merging" << endl; From 44a05314c2bda770e9c373cb0262faf93502f9f7 Mon Sep 17 00:00:00 2001 From: Willian Date: Thu, 13 Oct 2016 17:53:54 -0300 Subject: [PATCH 68/87] A new interface to access all FGO merging algorithms was created A new argument needs to be sent to the application in order to select the eanted algorithm. The added/tested algorithms were: - no FGO merging - naive - smart recursive cut - reuse-tree The reuse-tree algorithm will have a separated optimized and non-optimized versions. --- .../PipelineRTFS-NS-Diff-FGO/CMakeLists.txt | 2 +- .../PipelineManager.cpp | 634 +----------------- .../cutting_algorithms.cpp | 457 +++++++++++++ .../cutting_algorithms.hpp | 15 + .../examples/PipelineRTFS-NS-Diff-FGO/fgm.cpp | 216 ++++++ .../examples/PipelineRTFS-NS-Diff-FGO/fgm.hpp | 24 + 6 files changed, 734 insertions(+), 614 deletions(-) create mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/cutting_algorithms.cpp create mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/cutting_algorithms.hpp create mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fgm.cpp create mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fgm.hpp diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/CMakeLists.txt b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/CMakeLists.txt index 2529b68..6f12c80 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/CMakeLists.txt +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/CMakeLists.txt @@ -39,7 +39,7 @@ set(libname componentnsdifffgo) # Source files used by the Runtime System set(libcomponentssrcs NormalizationComp.cpp Segmentation.cpp FeatureExtraction.cpp TaskFeatures.cpp DiffMaskComp.cpp jsoncpp.cpp graph/min_cut.cpp graph/reuse_tree.cpp - merging.cpp) + merging.cpp fgm.cpp cutting_algorithms.cpp) set(libcomparativeanalysis ../../comparativeanalysis/TaskDiffMask.cpp ../../comparativeanalysis/pixelcompare/PixelCompare.cpp) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index ea3d526..1b2a79f 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -23,10 +23,12 @@ #include "RTPipelineComponentBase.h" #include "RegionTemplateCollection.h" #include "ReusableTask.hpp" -#include "merging.hpp" #include "graph/min_cut.hpp" #include "graph/reuse_tree.hpp" +#include "merging.hpp" +#include "fgm.hpp" + using namespace std; namespace parsing { @@ -100,9 +102,6 @@ void connect_stages_from_file(FILE* workflow_descriptor, map &args, map> args_values, map &expanded_args,map stages, map &expanded_stages, map &workflow_outputs); -void merge_stages_fine_grain(const map &all_stages, - const map &stages_ref, map &merged_stages, - RegionTemplate* rt, map expanded_args, int max_bucket_size, string dakota_filename); void generate_drs(RegionTemplate* rt, const map &expanded_args); void add_arguments_to_stages(map &merged_stages, map &merged_arguments, @@ -128,6 +127,22 @@ parsing::port_type_t get_port_type(string s); int main(int argc, char* argv[]) { + // verify arguments + if (argc > 1 && string(argv[1]).compare("-h") == 0) { + cout << "usage: ./PipelineRTFS-NS-Diff-FGO " << endl; + cout << "avaiable algorithms:" << endl; + cout << "0 - No fine grain merging algorithm" << endl; + cout << "1 - naive fine grain merging algorithm" << endl; + cout << "2 - Smart recursive cut fine grain merging algorithm" << endl; + cout << "3 - Reuse-Tree fine grain merging algorithm" << endl; + cout << "4 - Double-prunning reuse-tree fine grain merging algorithm" << endl; + return 0; + } + if (argc != 4) { + cout << "usage: ./PipelineRTFS-NS-Diff-FGO " << endl; + return 0; + } + int mpi_rank; int mpi_size; int mpi_val; @@ -146,13 +161,9 @@ int main(int argc, char* argv[]) { rt->setName("tile"); // get arguments - if (argc != 3) { - cout << "usage: ./PipelineRTFS-NS-Diff-FGO " << endl; - return 0; - } - int max_bucket_size = atoi(argv[1]); string dakota_file = argv[2]; + int merging_algorithm = atoi(argv[3]); // workflow file FILE* workflow_descriptor = fopen("seg_example.t2flow", "r"); @@ -286,7 +297,7 @@ int main(int argc, char* argv[]) { struct timeval start, end; gettimeofday(&start, NULL); - merge_stages_fine_grain(expanded_stages, base_stages, merged_stages, rt, expanded_args, max_bucket_size, dakota_file); + fgm::merge_stages_fine_grain(merging_algorithm, expanded_stages, base_stages, merged_stages, rt, expanded_args, max_bucket_size, dakota_file); gettimeofday(&end, NULL); @@ -1291,609 +1302,6 @@ void expand_stages(const map &args, } } -mincut::weight_t get_reuse_factor(mincut::subgraph_t s1, mincut::subgraph_t s2, map id2task, - map current_stages, map &args, - map> ref) { - - // get the first stage as a base stage - mincut::subgraph_t::iterator s1_it = s1.begin(); - PipelineComponentBase* current1 = current_stages[id2task[*s1_it]]->clone(); - current1->setLocation(PipelineComponentBase::WORKER_SIDE); - s1_it++; - for (; s1_it!=s1.end(); s1_it++) { - PipelineComponentBase* clone1 = current_stages[id2task[*s1_it]]->clone(); - clone1->setLocation(PipelineComponentBase::WORKER_SIDE); - if (merging_condition(current1, clone1, args, ref)) - merge_stages(current1, clone1, ref); - else { - for (ReusableTask* t : clone1->tasks) { - current1->tasks.emplace_back(t->clone()); - } - } - clone1->remove_outputs = true; - delete clone1; - } - - // get the first stage as a base stage - mincut::subgraph_t::iterator s2_it = s2.begin(); - PipelineComponentBase* current2 = current_stages[id2task[(*s2_it)]]->clone(); - current2->setLocation(PipelineComponentBase::WORKER_SIDE); - for (s2_it++; s2_it!=s2.end(); s2_it++) { - PipelineComponentBase* clone2 = current_stages[id2task[*s2_it]]->clone(); - clone2->setLocation(PipelineComponentBase::WORKER_SIDE); - if (merging_condition(current2, clone2, args, ref)) - merge_stages(current2, clone2, ref); - else { - for (ReusableTask* t : clone2->tasks) { - current2->tasks.emplace_back(t->clone()); - } - } - clone2->remove_outputs = true; - delete clone2; - } - - int ret = current1->tasks.size()>current2->tasks.size()?current1->tasks.size():current2->tasks.size(); - - // clear memory - current1->remove_outputs = true; - delete current1; - current2->remove_outputs = true; - delete current2; - - return ret; -} - -bool cutting_condition(list current, float nrS_mksp, float max_mem, - map &args, map> ref) { - - if (calc_stage_proc(current, args, ref) > nrS_mksp || calc_stage_mem(current, args, ref) > max_mem) - return true; - else - return false; -} - -pair, list> get_cut(list current_stages, - const map &all_stages, map &args, map> ref) { - - // generate the reuse matrix and the map real-task to min-cut id - size_t id = 0; - size_t n = current_stages.size(); - - // dynamic allocation of adjMat is needed because if n is waaay too big the stack will overflow - mincut::weight_t** adjMat = new mincut::weight_t *[n]; - for (size_t i=0; i id2task; - for (list::iterator s1=current_stages.begin(); s1!= current_stages.end(); s1++, id++) { - id2task[id] = (*s1)->getId(); - // cout << "map: " << id << ":" << (*s1)->getId() << endl; - size_t id_j = id; - for (list::iterator s2=s1; s2!= current_stages.end(); s2++, id_j++) { - if (id == id_j) - adjMat[id][id] = 0; - else { - adjMat[id][id_j] = get_reuse_factor(*s1, *s2, args, ref); - adjMat[id_j][id] = adjMat[id][id_j]; - } - } - } - - // cout << endl; - // adj_mat_print(adjMat, id2task, n); - // cout << endl; - - // send adjMat to mincut algorithm - list cuts = mincut::min_cut(n, adjMat); - - // get the cut with the minimal weight, using the number of merged tasks as a tiebreaker - mincut::cut_t best_cut = cuts.front(); - mincut::weight_t best_weight = mincut::_cut_w(best_cut); - int best_num_tasks = get_reuse_factor(mincut::_cut_s1(best_cut), mincut::_cut_s2(best_cut), - id2task, all_stages, args, ref); - mincut::weight_t r; - - for (mincut::cut_t c : cuts) { - // cout << "cut: " << mincut::_cut_w(c) << ":" << endl; - // cout << "\tS1:" << endl; - // for (mincut::_id_t id : mincut::_cut_s1(c)) - // cout << "\t\t" << id2task[id] << endl; - // cout << "\tS2:" << endl; - // for (mincut::_id_t id : mincut::_cut_s2(c)) - // cout << "\t\t" << id2task[id] << endl; - // cout << endl; - - // updates min cut if the weight is less that the best so far - if (mincut::_cut_w(c) < best_weight) { - best_cut = c; - best_weight = mincut::_cut_w(c); - best_num_tasks = get_reuse_factor(mincut::_cut_s1(c), mincut::_cut_s2(c), - id2task, all_stages, args, ref); - } - // updates min cut if the weight are the same but this cut is more balanced - else if (mincut::_cut_w(c) == best_weight && (r = get_reuse_factor(mincut::_cut_s1(c), - mincut::_cut_s2(c), id2task, all_stages, args, ref)) < best_num_tasks) { - best_cut = c; - best_num_tasks = r; - } - } - - // convert cut to PCB lists for return - pair, list> best_cut_pcb; - for (mincut::_id_t i : mincut::_cut_s1(best_cut)) - best_cut_pcb.first.emplace_back(all_stages.at(id2task[i])); - for (mincut::_id_t i : mincut::_cut_s2(best_cut)) - best_cut_pcb.second.emplace_back(all_stages.at(id2task[i])); - - // clean adjMat - for (size_t i=0; i> recursive_cut(list rem, const map &all_stages, - int n, map &args, map> ref) { - - list> last_solution; - - // finishes if there is no more need for a cut (i.e n=1) or if we can't make any more cuts (i.e size=1) - if (n == 1 || rem.size() == 1) { - last_solution.emplace_back(rem); - // cout << "retuned n=" << n << ", size=" << rem.size() << endl; - return last_solution; - } - - float last_mksp = FLT_MAX; - float current_mksp = FLT_MAX/10; - list rest; - list> buckets; - - // execute while there is improvement - while(current_mksp < last_mksp) { - last_mksp = current_mksp; - - // make a copy of this solution in case the next isn't better - last_solution = buckets; - - if (rem.size() == 1) { - // cout << "retuned state for size=1, n=" << n << ":" << endl; - // for (list b : last_solution) { - // cout << "\tbucket with cost " << calc_stage_proc(b, ref) << ":" << endl; - // for (PipelineComponentBase* s : b) { - // cout << "\t\tstage " << s->getId() << ":" << s->getName() << ":" << endl; - // } - // } - return last_solution; - } - - // cout << "rem:" << endl; - // for (PipelineComponentBase* s : rem) { - // cout << "\tstage " << s->getId() << ":" << s->getName() << ":" << endl; - // } - // cout << "rest:" << endl; - // for (PipelineComponentBase* s : rest) { - // cout << "\tstage " << s->getId() << ":" << s->getName() << ":" << endl; - // } - - // cut the current bucket - pair, list> c; - c = get_cut(rem, all_stages, args, ref); - - float w1 = calc_stage_proc(c.first, args, ref); - float w2 = calc_stage_proc(c.second, args, ref); - - list c1 = w1>=w2?c.first:c.second; - list c2 = w1>=w2?c.second:c.first; - - // cout << "cut: " << endl; - // cout << "\tc1" << endl; - // for (PipelineComponentBase* s : c1) - // cout << "\t\tstage " << s->getId() << ":" << s->getName() << ":" << endl; - // cout << "\tc2" << endl; - // for (PipelineComponentBase* s : c2) - // cout << "\t\tstage " << s->getId() << ":" << s->getName() << ":" << endl; - - // join c2 with the remaining of rem - c2.insert(c2.begin(), rest.begin(), rest.end()); - - buckets = recursive_cut(c2, all_stages, n-1, args, ref); - buckets.emplace_back(c1); - - // recalculate current max makespan and set rem backup on last_rem - float mksp; - current_mksp = 0; - for (list b : buckets) { - mksp = calc_stage_proc(b, args, ref); - if (mksp > current_mksp) - current_mksp = mksp; - } - - for (int i=0; i b : buckets) { - // cout << "\tbucket with cost " << calc_stage_proc(b, args, ref) << ":" << endl; - // for (PipelineComponentBase* s : b) { - // cout << "\t\tstage " << s->getId() << ":" << s->getName() << ":" << endl; - // } - // } - - // set next iteration PCB lists - rem = c1; - rest = c2; - } - - return last_solution; -} - -list> montecarlo_cut(list rem, const map &all_stages, - int n, map &args, map> ref) { - - list> ret; - - cout << "[montecarlo_cut] n=" << n << endl; - - if (n == 1 || rem.size() == 1) { - ret.emplace_back(rem); - cout << "[montecarlo_cut] n=" << n << endl; - return ret; - } - - // perform cuts until there is no more tasks to cut, or, there is no more need for another cut - for (int i=0; i, list> c; - c = get_cut(rem, all_stages, args, ref); - - float w1 = calc_stage_proc(c.first, args, ref); - float w2 = calc_stage_proc(c.second, args, ref); - - list c1 = w1>=w2?c.first:c.second; - list c2 = w1>=w2?c.second:c.first; - - rem = c1; - ret.emplace_back(c2); - - if (rem.size() == 1) { - break; - } - } - - // add last bucket - ret.emplace_back(rem); - - // cout << "[montecarlo_cut] n=" << n << "ret:" << endl; - // int i=0; - // for (list bucket : ret) { - // cout << "\tb:" << i++ << endl; - // for (PipelineComponentBase* s : bucket) - // cout << "\t\t" << s->getId() << ":" << s->getName() << endl; - // } - - return ret; -} - -void montecarlo_dep(int n, list c1, list c2, - const map &all_stages, map &args, - map> ref, float &best_mksp, float &best_var, - pair, list> &best_cut) { - - cout << "[montecarlo_recursive_cut] n=" << n << " running cut" << endl; - cout << "\tc1 - cost=" << calc_stage_proc(c1, args, ref) << ":" << endl; - for (PipelineComponentBase* s : c1) - cout << "\t\t" << s->getId() << ":" << s->getName() << endl; - cout << "\tc2 - cost=" << calc_stage_proc(c2, args, ref) << ":" << endl; - for (PipelineComponentBase* s : c2) - cout << "\t\t" << s->getId() << ":" << s->getName() << endl; - - list> c = montecarlo_cut(c2, all_stages, n-1, args, ref); - - // calculates i cut cost with rest c - cout << "[montecarlo_cut] n=" << n << "ret:" << endl; - int ii=0; - // mksp selection metric - float mksp; - float max_mksp = calc_stage_proc(c1, args, ref); - float avg = calc_stage_proc(c1, args, ref); - for (list bucket : c) { - mksp = calc_stage_proc(bucket, args, ref); - avg += mksp; - if (mksp > max_mksp) - max_mksp = mksp; - cout << "\tb" << ii++ << " - mksp=" << mksp<< endl; - for (PipelineComponentBase* s : bucket) - cout << "\t\t" << s->getId() << ":" << s->getName() << endl; - } - - // standard deviation selection metric - avg /= (c.size()+1); - float var = (calc_stage_proc(c1, args, ref)-avg)*(calc_stage_proc(c1, args, ref)-avg); - for (list bucket : c) { - mksp = calc_stage_proc(bucket, args, ref); - var += (mksp-avg)*(mksp-avg); - } - var /= (c.size()+1); - - cout << "with mksp=" << max_mksp << endl; - cout << "with var=" << var << endl; - - // // maybe double if? - if (max_mksp < best_mksp || (max_mksp == best_mksp && var < best_var)) { - #pragma omp critical - { - // updates best cut, if this is the case - if (max_mksp < best_mksp || (max_mksp == best_mksp && var < best_var)) { - best_mksp = max_mksp; - best_var = var; - list flat_c; - for (list bucket : c) - flat_c.insert(flat_c.begin(), bucket.begin(), bucket.end()); - best_cut = pair, list>(c1, flat_c); - } - } - } -} - -list> montecarlo_recursive_cut(list rem, - const map &all_stages, int n, map &args, map> ref) { - - // list, list>> current_cuts; - pair, list> best_cut; - list> final_cut; - float best_mksp = FLT_MAX; - float best_var = FLT_MAX; - int r_size = rem.size(); - - cout << "[montecarlo_recursive_cut] n=" << n << endl; - - // stoping condition - if (n == 1 || rem.size() == 1) { - final_cut.emplace_back(rem); - cout << "[montecarlo_recursive_cut] n=" << n << " retuned1" << endl; - cout << "\tb0" << endl; - for (PipelineComponentBase* s : rem) - cout << "\t\t" << s->getId() << ":" << s->getName() << endl; - return final_cut; - } - - #pragma omp parallel - { - #pragma omp single - { - // attempt all possible cuts on this level - list rest; - while (rem.size() > 1) { - // attempt a cut - pair, list> c; - c = get_cut(rem, all_stages, args, ref); - - // store the cut for the rest to be calculated later - float w1 = calc_stage_proc(c.first, args, ref); - float w2 = calc_stage_proc(c.second, args, ref); - - list c1 = w1>=w2?c.first:c.second; - list c2 = w1>=w2?c.second:c.first; - - // add rest to c2 - c2.insert(c2.begin(), rest.begin(), rest.end()); - - #pragma omp task - montecarlo_dep(n, c1, c2, all_stages, args, ref, best_mksp, best_var, best_cut); - - cout << "[montecarlo_recursive_cut] n=" << n << " adding cut" << endl; - cout << "\tc1:" << endl; - for (PipelineComponentBase* s : c1) - cout << "\t\t" << s->getId() << ":" << s->getName() << endl; - cout << "\tc2:" << endl; - for (PipelineComponentBase* s : c2) - cout << "\t\t" << s->getId() << ":" << s->getName() << endl; - - // update rem to get a new cut - rem = c1; - rest = c2; - } - } - #pragma barrier - } - - // cout << "---------------------------------------------------" << endl; - - // #pragma omp parallel - // { - // #pragma omp single - // { - // // runs all dependencies a la montecarlo - // for (list, list>>::iterator i=current_cuts.begin(); - // i!=current_cuts.end(); i++) { - // // WARNING: best cut is shared between all montecarlo_dep runs - // #pragma omp task - // montecarlo_dep(n, i->first, i->second, all_stages, args, ref, best_mksp, best_var, best_cut); - // } - // } - - cout << "[montecarlo_recursive_cut] n=" << n << " best cut of the stage with mksp=" << best_mksp << endl; - cout << "\tc1:" << endl; - for (PipelineComponentBase* s : best_cut.first) - cout << "\t\t" << s->getId() << ":" << s->getName() << endl; - cout << "\tc2:" << endl; - for (PipelineComponentBase* s : best_cut.second) - cout << "\t\t" << s->getId() << ":" << s->getName() << endl; - - // recursive call on the best rest - final_cut = montecarlo_recursive_cut(best_cut.second, all_stages, n-1, args, ref); - final_cut.emplace_back(best_cut.first); - - cout << "[montecarlo_recursive_cut] n=" << n << " final cut:" << endl; - int i=0; - for (list bucket : final_cut) { - cout << "\tb:" << i++ << endl; - for (PipelineComponentBase* s : bucket) - cout << "\t\t" << s->getId() << ":" << s->getName() << endl; - } - - return final_cut; -} - -void merge_stages_fine_grain(const map &all_stages, - const map &stages_ref, map &merged_stages, - RegionTemplate* rt, map expanded_args, int max_bucket_size, string dakota_filename) { - - // attempt merging for each stage type - for (map::const_iterator ref=stages_ref.cbegin(); ref!=stages_ref.cend(); ref++) { - // get only the stages from the current stage_ref - list current_stages; - filter_stages(all_stages, ref->second->getName(), current_stages); - - cout << "[merge_stages_fine_grain] Generating tasks..." << endl; - // generate all tasks - for (list::iterator s=current_stages.begin(); s!=current_stages.end(); ) { - // if the stage isn't composed of reusable tasks then - (*s)->tasks = task_generator(ref->second->tasksDesc, *s, rt, expanded_args); - if ((*s)->tasks.size() == 0) { - merged_stages[(*s)->getId()] = *s; - s = current_stages.erase(s); - } else - s++; - } - - // if there are no stages left to attempt to merge, or only one stage, don't perform any merging - if (current_stages.size() == 1) { - merged_stages[(*current_stages.begin())->getId()] = *current_stages.begin(); - continue; - } else if (current_stages.size() == 0) { - continue; - } - - list> solution = reuse_tree_merging(current_stages, all_stages, - max_bucket_size, expanded_args, ref->second->tasksDesc); - - // write merging solution - ofstream solution_file; - solution_file.open(dakota_filename + "-b" + to_string(max_bucket_size) + "merging_solution.log", ios::trunc); - - cout << endl << "solution:" << endl; - solution_file << "solution:" << endl; - int total_tasks=0; - for (list b : solution) { - cout << "\tbucket with " << b.size() << " stages and cost " - << calc_stage_proc(b, expanded_args, ref->second->tasksDesc) << ":" << endl; - solution_file << "\tbucket with " << b.size() << " stages and cost " - << calc_stage_proc(b, expanded_args, ref->second->tasksDesc) << ":" << endl; - total_tasks += calc_stage_proc(b, expanded_args, ref->second->tasksDesc); - for (PipelineComponentBase* s : b) { - cout << "\t\tstage " << s->getId() << ":" << s->getName() << ":" << endl; - // solution_file << "\t\tstage " << s->getId() << ":" << s->getName() << ":" << endl; - } - } - solution_file.close(); - - // write some statistics abou the solution - ofstream statistics_file; - statistics_file.open(dakota_filename + "-b" + to_string(max_bucket_size) + "merging_statistics.log", ios::trunc); - - statistics_file << current_stages.size() << "\t"; - statistics_file << current_stages.size()*ref->second->tasksDesc.size() << "\t"; - statistics_file << total_tasks << "\t"; - statistics_file << solution.size() << "\t"; - statistics_file << total_tasks/solution.size() << "\t"; - - statistics_file.close(); - - // merge all stages in each bucket, given that they are mergable - for (list bucket : solution) { - // cout << "bucket merging" << endl; - list curr = merge_stages_full(bucket, expanded_args, ref->second->tasksDesc); - // send rem stages to merged_stages - for (PipelineComponentBase* s : curr) { - // cout << "\tadding stage " << s->getId() << endl; - merged_stages[s->getId()] = s; - } - } - } -} - -void generate_drs(RegionTemplate* rt, - const map &expanded_args) { - - // verify every argument - for (pair p : expanded_args) { - // if an argument is a region template data region - if (p.second->getType() == ArgumentBase::RT) { - if (((ArgumentRT*)p.second)->isFileInput) { - // create the data region and add it to the input region template - DenseDataRegion2D *ddr2d = new DenseDataRegion2D(); - ddr2d->setName(p.second->getName()); - std::ostringstream oss; - oss << p.first; - ddr2d->setId(oss.str()); - ddr2d->setVersion(p.first); - ddr2d->setIsAppInput(true); - ddr2d->setInputType(DataSourceType::FILE_SYSTEM); - ddr2d->setOutputType(DataSourceType::FILE_SYSTEM); - ddr2d->setInputFileName(p.second->toString()); - rt->insertDataRegion(ddr2d); - } - } - } -} - -void add_arguments_to_stages(map &merged_stages, - map &merged_arguments, - RegionTemplate *rt) { - - int i=0; - for (pair stage : merged_stages) { - // add input arguments to stage, adding them as RT as needed - for (int arg_id : stage.second->getInputs()) { - ArgumentBase* new_arg = merged_arguments[arg_id]->clone(); - new_arg->setParent(merged_arguments[arg_id]->getParent()); - stage.second->addArgument(new_arg); - if (new_arg->getType() == ArgumentBase::RT) { - cout << "input RT : " << merged_arguments[arg_id]->getName() << endl; - // insert the region template on the parent stage if the argument is a DR and if the RT wasn't already added - if (((RTPipelineComponentBase*)stage.second)-> - getRegionTemplateInstance(rt->getName()) == NULL) { - ((RTPipelineComponentBase*)stage.second)->addRegionTemplateInstance(rt, rt->getName()); - } - ((RTPipelineComponentBase*)stage.second)->addInputOutputDataRegion( - rt->getName(), new_arg->getName(), RTPipelineComponentBase::INPUT); - } - if (merged_arguments[arg_id]->getParent() != 0) { - // verify if the dependency stage was reused - int parent = merged_arguments[arg_id]->getParent(); - cout << "[before]Dependency: " << stage.second->getId() << ":" << stage.second->getName() - << " ->addDependency( " << parent << " )" << endl; - if (merged_stages[merged_arguments[arg_id]->getParent()]->reused != NULL) - parent = merged_stages[merged_arguments[arg_id]->getParent()]->reused->getId(); - cout << "Dependency: " << stage.second->getId() << ":" << stage.second->getName() - << " ->addDependency( " << parent << " )" << endl; - ((RTPipelineComponentBase*)stage.second)->addDependency(parent); - } - } - - // add output arguments to stage, adding them as RT as needed - for (int arg_id : stage.second->getOutputs()) { - ArgumentBase* new_arg = merged_arguments[arg_id]->clone(); - new_arg->setParent(merged_arguments[arg_id]->getParent()); - new_arg->setIo(ArgumentBase::output); - stage.second->addArgument(new_arg); - if (merged_arguments[arg_id]->getType() == ArgumentBase::RT) { - cout << "output RT : " << merged_arguments[arg_id]->getName() << endl; - // insert the region template on the parent stage if the argument is a DR and if the RT wasn't already added - if (((RTPipelineComponentBase*)stage.second)->getRegionTemplateInstance(rt->getName()) == NULL) - ((RTPipelineComponentBase*)stage.second)->addRegionTemplateInstance(rt, rt->getName()); - ((RTPipelineComponentBase*)stage.second)->addInputOutputDataRegion(rt->getName(), - merged_arguments[arg_id]->getName(), RTPipelineComponentBase::OUTPUT); - } - } - } -} - /***************************************************************/ /************* Workflow parsing helper functions ***************/ /***************************************************************/ diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/cutting_algorithms.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/cutting_algorithms.cpp new file mode 100644 index 0000000..c55c49c --- /dev/null +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/cutting_algorithms.cpp @@ -0,0 +1,457 @@ +#include "cutting_algorithms.hpp" + +mincut::weight_t get_reuse_factor(mincut::subgraph_t s1, mincut::subgraph_t s2, std::map id2task, + std::map current_stages, std::map &args, + std::map> ref) { + + // get the first stage as a base stage + mincut::subgraph_t::iterator s1_it = s1.begin(); + PipelineComponentBase* current1 = current_stages[id2task[*s1_it]]->clone(); + current1->setLocation(PipelineComponentBase::WORKER_SIDE); + s1_it++; + for (; s1_it!=s1.end(); s1_it++) { + PipelineComponentBase* clone1 = current_stages[id2task[*s1_it]]->clone(); + clone1->setLocation(PipelineComponentBase::WORKER_SIDE); + if (merging_condition(current1, clone1, args, ref)) + merge_stages(current1, clone1, ref); + else { + for (ReusableTask* t : clone1->tasks) { + current1->tasks.emplace_back(t->clone()); + } + } + clone1->remove_outputs = true; + delete clone1; + } + + // get the first stage as a base stage + mincut::subgraph_t::iterator s2_it = s2.begin(); + PipelineComponentBase* current2 = current_stages[id2task[(*s2_it)]]->clone(); + current2->setLocation(PipelineComponentBase::WORKER_SIDE); + for (s2_it++; s2_it!=s2.end(); s2_it++) { + PipelineComponentBase* clone2 = current_stages[id2task[*s2_it]]->clone(); + clone2->setLocation(PipelineComponentBase::WORKER_SIDE); + if (merging_condition(current2, clone2, args, ref)) + merge_stages(current2, clone2, ref); + else { + for (ReusableTask* t : clone2->tasks) { + current2->tasks.emplace_back(t->clone()); + } + } + clone2->remove_outputs = true; + delete clone2; + } + + int ret = current1->tasks.size()>current2->tasks.size()?current1->tasks.size():current2->tasks.size(); + + // clear memory + current1->remove_outputs = true; + delete current1; + current2->remove_outputs = true; + delete current2; + + return ret; +} + +bool cutting_condition(std::list current, float nrS_mksp, float max_mem, + std::map &args, std::map> ref) { + + if (calc_stage_proc(current, args, ref) > nrS_mksp || calc_stage_mem(current, args, ref) > max_mem) + return true; + else + return false; +} + +pair, std::list> get_cut(std::list current_stages, + const std::map &all_stages, std::map &args, std::map> ref) { + + // generate the reuse matrix and the std::map real-task to min-cut id + size_t id = 0; + size_t n = current_stages.size(); + + // dynamic allocation of adjMat is needed because if n is waaay too big the stack will overflow + mincut::weight_t** adjMat = new mincut::weight_t *[n]; + for (size_t i=0; i id2task; + for (std::list::iterator s1=current_stages.begin(); s1!= current_stages.end(); s1++, id++) { + id2task[id] = (*s1)->getId(); + // std::cout << "std::map: " << id << ":" << (*s1)->getId() << std::endl; + size_t id_j = id; + for (std::list::iterator s2=s1; s2!= current_stages.end(); s2++, id_j++) { + if (id == id_j) + adjMat[id][id] = 0; + else { + adjMat[id][id_j] = get_reuse_factor(*s1, *s2, args, ref); + adjMat[id_j][id] = adjMat[id][id_j]; + } + } + } + + // std::cout << std::endl; + // adj_mat_print(adjMat, id2task, n); + // std::cout << std::endl; + + // send adjMat to mincut algorithm + std::list cuts = mincut::min_cut(n, adjMat); + + // get the cut with the minimal weight, using the number of merged tasks as a tiebreaker + mincut::cut_t best_cut = cuts.front(); + mincut::weight_t best_weight = mincut::_cut_w(best_cut); + int best_num_tasks = get_reuse_factor(mincut::_cut_s1(best_cut), mincut::_cut_s2(best_cut), + id2task, all_stages, args, ref); + mincut::weight_t r; + + for (mincut::cut_t c : cuts) { + // std::cout << "cut: " << mincut::_cut_w(c) << ":" << std::endl; + // std::cout << "\tS1:" << std::endl; + // for (mincut::_id_t id : mincut::_cut_s1(c)) + // std::cout << "\t\t" << id2task[id] << std::endl; + // std::cout << "\tS2:" << std::endl; + // for (mincut::_id_t id : mincut::_cut_s2(c)) + // std::cout << "\t\t" << id2task[id] << std::endl; + // std::cout << std::endl; + + // updates min cut if the weight is less that the best so far + if (mincut::_cut_w(c) < best_weight) { + best_cut = c; + best_weight = mincut::_cut_w(c); + best_num_tasks = get_reuse_factor(mincut::_cut_s1(c), mincut::_cut_s2(c), + id2task, all_stages, args, ref); + } + // updates min cut if the weight are the same but this cut is more balanced + else if (mincut::_cut_w(c) == best_weight && (r = get_reuse_factor(mincut::_cut_s1(c), + mincut::_cut_s2(c), id2task, all_stages, args, ref)) < best_num_tasks) { + best_cut = c; + best_num_tasks = r; + } + } + + // convert cut to PCB std::lists for return + pair, std::list> best_cut_pcb; + for (mincut::_id_t i : mincut::_cut_s1(best_cut)) + best_cut_pcb.first.emplace_back(all_stages.at(id2task[i])); + for (mincut::_id_t i : mincut::_cut_s2(best_cut)) + best_cut_pcb.second.emplace_back(all_stages.at(id2task[i])); + + // clean adjMat + for (size_t i=0; i> recursive_cut(std::list rem, const std::map &all_stages, + int max_bucket_size, int max_cuts, std::map &args, std::map> ref) { + + std::list> last_solution; + + // finishes if we can't make any more cuts (i.e size=1) or if we shouldn't (i.e max_cuts == 1) + if (rem.size() == 1) { + last_solution.emplace_back(rem); + // std::cout << "retuned n=" << n << ", size=" << rem.size() << std::endl; + return last_solution; + } + + float last_mksp = FLT_MAX; + float current_mksp = FLT_MAX/10; + std::list rest; + std::list> buckets; + bool not_evaluated = true; + + // execute while there is improvement + while(current_mksp < last_mksp || not_evaluated) { + last_mksp = current_mksp; + not_evaluated = true; + + // make a copy of this solution in case the next isn't better + last_solution = buckets; + + if (rem.size() == 1) { + // std::cout << "retuned state for size=1, n=" << n << ":" << std::endl; + // for (std::list b : last_solution) { + // std::cout << "\tbucket with cost " << calc_stage_proc(b, ref) << ":" << std::endl; + // for (PipelineComponentBase* s : b) { + // std::cout << "\t\tstage " << s->getId() << ":" << s->getName() << ":" << std::endl; + // } + // } + return last_solution; + } + + // std::cout << "rem:" << std::endl; + // for (PipelineComponentBase* s : rem) { + // std::cout << "\tstage " << s->getId() << ":" << s->getName() << ":" << std::endl; + // } + // std::cout << "rest:" << std::endl; + // for (PipelineComponentBase* s : rest) { + // std::cout << "\tstage " << s->getId() << ":" << s->getName() << ":" << std::endl; + // } + + // cut the current bucket + pair, std::list> c; + c = get_cut(rem, all_stages, args, ref); + + float w1 = calc_stage_proc(c.first, args, ref); + float w2 = calc_stage_proc(c.second, args, ref); + + std::list c1 = w1>=w2?c.first:c.second; + std::list c2 = w1>=w2?c.second:c.first; + + // std::cout << "cut: " << std::endl; + // std::cout << "\tc1" << std::endl; + // for (PipelineComponentBase* s : c1) + // std::cout << "\t\tstage " << s->getId() << ":" << s->getName() << ":" << std::endl; + // std::cout << "\tc2" << std::endl; + // for (PipelineComponentBase* s : c2) + // std::cout << "\t\tstage " << s->getId() << ":" << s->getName() << ":" << std::endl; + + // join c2 with the remaining of rem + c2.insert(c2.begin(), rest.begin(), rest.end()); + + // verify if the max_bucket_size constraint was satisfied + std::cout << "[" << max_cuts << "]" << "c1.size=" << c1.size() << std::endl; + if (c1.size() <= max_bucket_size) { + buckets = recursive_cut(c2, all_stages, max_bucket_size, max_cuts-1, args, ref); + buckets.emplace_back(c1); + + // recalculate current max makespan and set rem backup on last_rem + float mksp; + current_mksp = 0; + for (std::list b : buckets) { + mksp = calc_stage_proc(b, args, ref); + if (mksp > current_mksp) { + current_mksp = mksp; + } + } + std::cout << "mksp: " << current_mksp << std::endl; + + not_evaluated = false; + + return buckets; + + // std::cout << "merged state n=" << n << ":" << std::endl; + // for (std::list b : buckets) { + // std::cout << "\tbucket with cost " << calc_stage_proc(b, args, ref) << ":" << std::endl; + // for (PipelineComponentBase* s : b) { + // std::cout << "\t\tstage " << s->getId() << ":" << s->getName() << ":" << std::endl; + // } + // } + } + + // set next iteration PCB lists + rem = c1; + rest = c2; + } + + return last_solution; +} + +std::list> montecarlo_cut(std::list rem, const std::map &all_stages, + int n, std::map &args, std::map> ref) { + + std::list> ret; + + std::cout << "[montecarlo_cut] n=" << n << std::endl; + + if (n == 1 || rem.size() == 1) { + ret.emplace_back(rem); + std::cout << "[montecarlo_cut] n=" << n << std::endl; + return ret; + } + + // perform cuts until there is no more tasks to cut, or, there is no more need for another cut + for (int i=0; i, std::list> c; + c = get_cut(rem, all_stages, args, ref); + + float w1 = calc_stage_proc(c.first, args, ref); + float w2 = calc_stage_proc(c.second, args, ref); + + std::list c1 = w1>=w2?c.first:c.second; + std::list c2 = w1>=w2?c.second:c.first; + + rem = c1; + ret.emplace_back(c2); + + if (rem.size() == 1) { + break; + } + } + + // add last bucket + ret.emplace_back(rem); + + // std::cout << "[montecarlo_cut] n=" << n << "ret:" << std::endl; + // int i=0; + // for (std::list bucket : ret) { + // std::cout << "\tb:" << i++ << std::endl; + // for (PipelineComponentBase* s : bucket) + // std::cout << "\t\t" << s->getId() << ":" << s->getName() << std::endl; + // } + + return ret; +} + +void montecarlo_dep(int n, std::list c1, std::list c2, + const std::map &all_stages, std::map &args, + std::map> ref, float &best_mksp, float &best_var, + pair, std::list> &best_cut) { + + std::cout << "[montecarlo_recursive_cut] n=" << n << " running cut" << std::endl; + std::cout << "\tc1 - cost=" << calc_stage_proc(c1, args, ref) << ":" << std::endl; + for (PipelineComponentBase* s : c1) + std::cout << "\t\t" << s->getId() << ":" << s->getName() << std::endl; + std::cout << "\tc2 - cost=" << calc_stage_proc(c2, args, ref) << ":" << std::endl; + for (PipelineComponentBase* s : c2) + std::cout << "\t\t" << s->getId() << ":" << s->getName() << std::endl; + + std::list> c = montecarlo_cut(c2, all_stages, n-1, args, ref); + + // calculates i cut cost with rest c + std::cout << "[montecarlo_cut] n=" << n << "ret:" << std::endl; + int ii=0; + // mksp selection metric + float mksp; + float max_mksp = calc_stage_proc(c1, args, ref); + float avg = calc_stage_proc(c1, args, ref); + for (std::list bucket : c) { + mksp = calc_stage_proc(bucket, args, ref); + avg += mksp; + if (mksp > max_mksp) + max_mksp = mksp; + std::cout << "\tb" << ii++ << " - mksp=" << mksp<< std::endl; + for (PipelineComponentBase* s : bucket) + std::cout << "\t\t" << s->getId() << ":" << s->getName() << std::endl; + } + + // standard deviation selection metric + avg /= (c.size()+1); + float var = (calc_stage_proc(c1, args, ref)-avg)*(calc_stage_proc(c1, args, ref)-avg); + for (std::list bucket : c) { + mksp = calc_stage_proc(bucket, args, ref); + var += (mksp-avg)*(mksp-avg); + } + var /= (c.size()+1); + + std::cout << "with mksp=" << max_mksp << std::endl; + std::cout << "with var=" << var << std::endl; + + // // maybe double if? + if (max_mksp < best_mksp || (max_mksp == best_mksp && var < best_var)) { + #pragma omp critical + { + // updates best cut, if this is the case + if (max_mksp < best_mksp || (max_mksp == best_mksp && var < best_var)) { + best_mksp = max_mksp; + best_var = var; + std::list flat_c; + for (std::list bucket : c) + flat_c.insert(flat_c.begin(), bucket.begin(), bucket.end()); + best_cut = pair, std::list>(c1, flat_c); + } + } + } +} + +std::list> montecarlo_recursive_cut(std::list rem, + const std::map &all_stages, int n, std::map &args, std::map> ref) { + + // std::list, std::list>> current_cuts; + pair, std::list> best_cut; + std::list> final_cut; + float best_mksp = FLT_MAX; + float best_var = FLT_MAX; + int r_size = rem.size(); + + std::cout << "[montecarlo_recursive_cut] n=" << n << std::endl; + + // stoping condition + if (n == 1 || rem.size() == 1) { + final_cut.emplace_back(rem); + std::cout << "[montecarlo_recursive_cut] n=" << n << " retuned1" << std::endl; + std::cout << "\tb0" << std::endl; + for (PipelineComponentBase* s : rem) + std::cout << "\t\t" << s->getId() << ":" << s->getName() << std::endl; + return final_cut; + } + + #pragma omp parallel + { + #pragma omp single + { + // attempt all possible cuts on this level + std::list rest; + while (rem.size() > 1) { + // attempt a cut + pair, std::list> c; + c = get_cut(rem, all_stages, args, ref); + + // store the cut for the rest to be calculated later + float w1 = calc_stage_proc(c.first, args, ref); + float w2 = calc_stage_proc(c.second, args, ref); + + std::list c1 = w1>=w2?c.first:c.second; + std::list c2 = w1>=w2?c.second:c.first; + + // add rest to c2 + c2.insert(c2.begin(), rest.begin(), rest.end()); + + #pragma omp task + montecarlo_dep(n, c1, c2, all_stages, args, ref, best_mksp, best_var, best_cut); + + std::cout << "[montecarlo_recursive_cut] n=" << n << " adding cut" << std::endl; + std::cout << "\tc1:" << std::endl; + for (PipelineComponentBase* s : c1) + std::cout << "\t\t" << s->getId() << ":" << s->getName() << std::endl; + std::cout << "\tc2:" << std::endl; + for (PipelineComponentBase* s : c2) + std::cout << "\t\t" << s->getId() << ":" << s->getName() << std::endl; + + // update rem to get a new cut + rem = c1; + rest = c2; + } + } + #pragma barrier + } + + // std::cout << "---------------------------------------------------" << std::endl; + + // #pragma omp parallel + // { + // #pragma omp single + // { + // // runs all dependencies a la montecarlo + // for (std::list, std::list>>::iterator i=current_cuts.begin(); + // i!=current_cuts.end(); i++) { + // // WARNING: best cut is shared between all montecarlo_dep runs + // #pragma omp task + // montecarlo_dep(n, i->first, i->second, all_stages, args, ref, best_mksp, best_var, best_cut); + // } + // } + + std::cout << "[montecarlo_recursive_cut] n=" << n << " best cut of the stage with mksp=" << best_mksp << std::endl; + std::cout << "\tc1:" << std::endl; + for (PipelineComponentBase* s : best_cut.first) + std::cout << "\t\t" << s->getId() << ":" << s->getName() << std::endl; + std::cout << "\tc2:" << std::endl; + for (PipelineComponentBase* s : best_cut.second) + std::cout << "\t\t" << s->getId() << ":" << s->getName() << std::endl; + + // recursive call on the best rest + final_cut = montecarlo_recursive_cut(best_cut.second, all_stages, n-1, args, ref); + final_cut.emplace_back(best_cut.first); + + std::cout << "[montecarlo_recursive_cut] n=" << n << " final cut:" << std::endl; + int i=0; + for (std::list bucket : final_cut) { + std::cout << "\tb:" << i++ << std::endl; + for (PipelineComponentBase* s : bucket) + std::cout << "\t\t" << s->getId() << ":" << s->getName() << std::endl; + } + + return final_cut; +} \ No newline at end of file diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/cutting_algorithms.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/cutting_algorithms.hpp new file mode 100644 index 0000000..acd60a4 --- /dev/null +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/cutting_algorithms.hpp @@ -0,0 +1,15 @@ +#ifndef CUTTING_ALGORITHMS_HPP +#define CUTTING_ALGORITHMS_HPP + +#include +#include + +#include "PipelineComponentBase.h" + +#include "merging.hpp" +#include "graph/min_cut.hpp" + +std::list> recursive_cut(std::list rem, const std::map &all_stages, + int max_bucket_size, int max_cuts, std::map &args, std::map> ref); + +#endif \ No newline at end of file diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fgm.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fgm.cpp new file mode 100644 index 0000000..33cfc43 --- /dev/null +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fgm.cpp @@ -0,0 +1,216 @@ +#include "fgm.hpp" + +void generate_drs(RegionTemplate* rt, + const std::map &expanded_args) { + + // verify every argument + for (pair p : expanded_args) { + // if an argument is a region template data region + if (p.second->getType() == ArgumentBase::RT) { + if (((ArgumentRT*)p.second)->isFileInput) { + // create the data region and add it to the input region template + DenseDataRegion2D *ddr2d = new DenseDataRegion2D(); + ddr2d->setName(p.second->getName()); + std::ostringstream oss; + oss << p.first; + ddr2d->setId(oss.str()); + ddr2d->setVersion(p.first); + ddr2d->setIsAppInput(true); + ddr2d->setInputType(DataSourceType::FILE_SYSTEM); + ddr2d->setOutputType(DataSourceType::FILE_SYSTEM); + ddr2d->setInputFileName(p.second->toString()); + rt->insertDataRegion(ddr2d); + } + } + } +} + +void add_arguments_to_stages(std::map &merged_stages, + std::map &merged_arguments, + RegionTemplate *rt) { + + int i=0; + for (pair stage : merged_stages) { + // add input arguments to stage, adding them as RT as needed + for (int arg_id : stage.second->getInputs()) { + ArgumentBase* new_arg = merged_arguments[arg_id]->clone(); + new_arg->setParent(merged_arguments[arg_id]->getParent()); + stage.second->addArgument(new_arg); + if (new_arg->getType() == ArgumentBase::RT) { + std::cout << "input RT : " << merged_arguments[arg_id]->getName() << std::endl; + // insert the region template on the parent stage if the argument is a DR and if the RT wasn't already added + if (((RTPipelineComponentBase*)stage.second)-> + getRegionTemplateInstance(rt->getName()) == NULL) { + ((RTPipelineComponentBase*)stage.second)->addRegionTemplateInstance(rt, rt->getName()); + } + ((RTPipelineComponentBase*)stage.second)->addInputOutputDataRegion( + rt->getName(), new_arg->getName(), RTPipelineComponentBase::INPUT); + } + if (merged_arguments[arg_id]->getParent() != 0) { + // verify if the dependency stage was reused + int parent = merged_arguments[arg_id]->getParent(); + std::cout << "[before]Dependency: " << stage.second->getId() << ":" << stage.second->getName() + << " ->addDependency( " << parent << " )" << std::endl; + if (merged_stages[merged_arguments[arg_id]->getParent()]->reused != NULL) + parent = merged_stages[merged_arguments[arg_id]->getParent()]->reused->getId(); + std::cout << "Dependency: " << stage.second->getId() << ":" << stage.second->getName() + << " ->addDependency( " << parent << " )" << std::endl; + ((RTPipelineComponentBase*)stage.second)->addDependency(parent); + } + } + + // add output arguments to stage, adding them as RT as needed + for (int arg_id : stage.second->getOutputs()) { + ArgumentBase* new_arg = merged_arguments[arg_id]->clone(); + new_arg->setParent(merged_arguments[arg_id]->getParent()); + new_arg->setIo(ArgumentBase::output); + stage.second->addArgument(new_arg); + if (merged_arguments[arg_id]->getType() == ArgumentBase::RT) { + std::cout << "output RT : " << merged_arguments[arg_id]->getName() << std::endl; + // insert the region template on the parent stage if the argument is a DR and if the RT wasn't already added + if (((RTPipelineComponentBase*)stage.second)->getRegionTemplateInstance(rt->getName()) == NULL) + ((RTPipelineComponentBase*)stage.second)->addRegionTemplateInstance(rt, rt->getName()); + ((RTPipelineComponentBase*)stage.second)->addInputOutputDataRegion(rt->getName(), + merged_arguments[arg_id]->getName(), RTPipelineComponentBase::OUTPUT); + } + } + } +} + +void fgm::merge_stages_fine_grain(int algorithm, const std::map &all_stages, + const std::map &stages_ref, std::map &merged_stages, + RegionTemplate* rt, std::map expanded_args, int max_bucket_size, string dakota_filename) { + + // attempt merging for each stage type + for (std::map::const_iterator ref=stages_ref.cbegin(); ref!=stages_ref.cend(); ref++) { + // get only the stages from the current stage_ref + std::list current_stages; + filter_stages(all_stages, ref->second->getName(), current_stages); + + std::cout << "[merge_stages_fine_grain] Generating tasks..." << std::endl; + + // generate all tasks + int nrS = 0; + double max_nrS_mksp = 0; + for (list::iterator s=current_stages.begin(); s!=current_stages.end(); ) { + // if the stage isn't composed of reusable tasks then + (*s)->tasks = task_generator(ref->second->tasksDesc, *s, rt, expanded_args); + if ((*s)->tasks.size() == 0) { + merged_stages[(*s)->getId()] = *s; + + // makespan calculations + nrS++; + if ((*s)->getMksp() > max_nrS_mksp) + max_nrS_mksp = (*s)->getMksp(); + + s = current_stages.erase(s); + } else + s++; + } + + // if there are no stages left to attempt to merge, or only one stage, don't perform any merging + if (current_stages.size() == 1) { + merged_stages[(*current_stages.begin())->getId()] = *current_stages.begin(); + continue; + } else if (current_stages.size() == 0) { + continue; + } + + std::list> solution; + int max_cuts = ceil(current_stages.size()/max_bucket_size); + + switch (algorithm) { + case 0: + // no fine grain merging - ok + for (PipelineComponentBase* p : current_stages) { + std::list single_stage_bucket; + single_stage_bucket.emplace_back(p); + solution.emplace_back(single_stage_bucket); + } + break; + + case 1: + // naive merging - ok + for (std::list::iterator s=current_stages.begin(); s!=current_stages.end(); s++) { + // PipelineComponentBase* current = *s; + int i; + std::list bucket; + bucket.emplace_back(*s); + for (i=1; isecond->tasksDesc); + // merged_stages[(*s)->getId()] = *s; + bucket.emplace_back(*s); + std::cout << "\tadded " << (*s)->getId() << " to the bucket" << std::endl; + } + // merged_stages[current->getId()] = current; + solution.emplace_back(bucket); + if (s==current_stages.end()) + break; + } + break; + + case 2: + // smart recursive cut - ok + solution = recursive_cut(current_stages, all_stages, + max_bucket_size, max_cuts, expanded_args, ref->second->tasksDesc); + break; + + case 3: + // reuse-tree merging - ok + solution = reuse_tree_merging(current_stages, all_stages, + max_bucket_size, expanded_args, ref->second->tasksDesc); + break; + + case 4: + // reuse-tree merging - ok + solution = reuse_tree_merging(current_stages, all_stages, + max_bucket_size, expanded_args, ref->second->tasksDesc); + break; + } + + // write merging solution + ofstream solution_file; + solution_file.open(dakota_filename + "-b" + std::to_string(max_bucket_size) + "merging_solution.log", ios::trunc); + + std::cout << std::endl << "solution:" << std::endl; + solution_file << "solution:" << std::endl; + int total_tasks=0; + for (std::list b : solution) { + std::cout << "\tbucket with " << b.size() << " stages and cost " + << calc_stage_proc(b, expanded_args, ref->second->tasksDesc) << ":" << std::endl; + solution_file << "\tbucket with " << b.size() << " stages and cost " + << calc_stage_proc(b, expanded_args, ref->second->tasksDesc) << ":" << std::endl; + total_tasks += calc_stage_proc(b, expanded_args, ref->second->tasksDesc); + for (PipelineComponentBase* s : b) { + std::cout << "\t\tstage " << s->getId() << ":" << s->getName() << ":" << std::endl; + // solution_file << "\t\tstage " << s->getId() << ":" << s->getName() << ":" << std::endl; + } + } + solution_file.close(); + + // write some statistics abou the solution + ofstream statistics_file; + statistics_file.open(dakota_filename + "-b" + std::to_string(max_bucket_size) + "merging_statistics.log", ios::trunc); + + statistics_file << current_stages.size() << "\t"; + statistics_file << current_stages.size()*ref->second->tasksDesc.size() << "\t"; + statistics_file << total_tasks << "\t"; + statistics_file << solution.size() << "\t"; + statistics_file << total_tasks/solution.size() << "\t"; + + statistics_file.close(); + + // merge all stages in each bucket, given that they are mergable + for (std::list bucket : solution) { + // std::cout << "bucket merging" << std::endl; + std::list curr = merge_stages_full(bucket, expanded_args, ref->second->tasksDesc); + // send rem stages to merged_stages + for (PipelineComponentBase* s : curr) { + // std::cout << "\tadding stage " << s->getId() << std::endl; + merged_stages[s->getId()] = s; + } + } + } +} diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fgm.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fgm.hpp new file mode 100644 index 0000000..f6ff4a3 --- /dev/null +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fgm.hpp @@ -0,0 +1,24 @@ +#ifndef FGM_HPP_ +#define FGM_HPP_ + +#include +#include +#include +#include + +#include "PipelineComponentBase.h" +#include "RTPipelineComponentBase.h" + +#include "merging.hpp" +#include "cutting_algorithms.hpp" +#include "graph/min_cut.hpp" +#include "graph/reuse_tree.hpp" + +namespace fgm { + + void merge_stages_fine_grain(int merging_algorithm, const std::map &all_stages, + const std::map &stages_ref, std::map &merged_stages, + RegionTemplate* rt, std::map expanded_args, int max_bucket_size, string dakota_filename); +} + +#endif \ No newline at end of file From 7587c884f5c954b21ec88f03723c1200a5451cb4 Mon Sep 17 00:00:00 2001 From: Willian Date: Thu, 13 Oct 2016 18:07:10 -0300 Subject: [PATCH 69/87] Reuse-tree merging now has the option to turn the double-prune optimization on and off. --- .../examples/PipelineRTFS-NS-Diff-FGO/fgm.cpp | 10 +++------- .../graph/reuse_tree.cpp | 16 +++++++--------- .../graph/reuse_tree.hpp | 3 ++- 3 files changed, 12 insertions(+), 17 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fgm.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fgm.cpp index 33cfc43..1a3c52c 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fgm.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fgm.cpp @@ -132,19 +132,15 @@ void fgm::merge_stages_fine_grain(int algorithm, const std::map::iterator s=current_stages.begin(); s!=current_stages.end(); s++) { - // PipelineComponentBase* current = *s; int i; std::list bucket; bucket.emplace_back(*s); for (i=1; isecond->tasksDesc); - // merged_stages[(*s)->getId()] = *s; bucket.emplace_back(*s); std::cout << "\tadded " << (*s)->getId() << " to the bucket" << std::endl; } - // merged_stages[current->getId()] = current; solution.emplace_back(bucket); if (s==current_stages.end()) break; @@ -160,13 +156,13 @@ void fgm::merge_stages_fine_grain(int algorithm, const std::mapsecond->tasksDesc); + max_bucket_size, expanded_args, ref->second->tasksDesc, false); break; case 4: - // reuse-tree merging - ok + // reuse-tree merging with double prunning solution = reuse_tree_merging(current_stages, all_stages, - max_bucket_size, expanded_args, ref->second->tasksDesc); + max_bucket_size, expanded_args, ref->second->tasksDesc, true); break; } diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.cpp index 7385d7c..29dea9f 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.cpp @@ -309,7 +309,7 @@ void cluster_merging(reuse_tree_t& reuse_tree, // Prunes the reuse tree based on the leafs_parent_list, returning a list of new buckets // to be merged, and updates the tree internal structure list> prune_leaf_level(reuse_tree_t& reuse_tree, - list leafs_parent_list, int max_bucket_size) { + list leafs_parent_list, int max_bucket_size, bool double_prunning) { list> new_buckets; @@ -365,12 +365,9 @@ list> prune_leaf_level(reuse_tree_t& reuse_tree, } // pruning second pass ------------------- - while (leafs_parent_list.size() > 0) - cluster_merging(reuse_tree, leafs_parent_list, new_buckets, max_bucket_size); - - - // TODO: keep merging until each child has at most one leaf - // this merging must attempt to keep the leafs of the same child together + if (double_prunning) + while (leafs_parent_list.size() > 0) + cluster_merging(reuse_tree, leafs_parent_list, new_buckets, max_bucket_size); return new_buckets; } @@ -399,7 +396,8 @@ void move_reuse_tree_up(reuse_tree_t& reuse_tree, list> reuse_tree_merging( const list& stages_to_merge, const map &all_stages, int max_bucket_size, - const map &args, const map>& ref) { + const map &args, const map>& ref, + bool double_prunning) { list> solution; @@ -414,7 +412,7 @@ list> reuse_tree_merging( list leafs_parent_list = generate_leafs_parent_list(reuse_tree); // print_leafs_parent_list(leafs_parent_list); list> new_buckets = prune_leaf_level( - reuse_tree, leafs_parent_list, max_bucket_size); + reuse_tree, leafs_parent_list, max_bucket_size, double_prunning); std::cout << "after:" << std::endl; print_reuse_tree(reuse_tree); move_reuse_tree_up(reuse_tree, leafs_parent_list); diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.hpp index d198467..464b70d 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.hpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.hpp @@ -23,7 +23,8 @@ typedef struct { // Performs the stage mearging using the reuse tree algorithm list> reuse_tree_merging(const list& stages_to_merge, const map &all_stages, int max_bucket_size, - const map &args, const map>& ref); + const map &args, const map>& ref, + bool double_prunning); #endif \ No newline at end of file From 420d0b56326229c54e4e313ce61b6081440e921b Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Tue, 18 Oct 2016 15:26:29 -0200 Subject: [PATCH 70/87] Added stage shuffling option. --- .../PipelineManager.cpp | 9 +++++++-- .../examples/PipelineRTFS-NS-Diff-FGO/fgm.cpp | 4 ++-- .../examples/PipelineRTFS-NS-Diff-FGO/fgm.hpp | 2 +- .../PipelineRTFS-NS-Diff-FGO/merging.cpp | 19 +++++++++++++++++-- .../PipelineRTFS-NS-Diff-FGO/merging.hpp | 4 +++- 5 files changed, 30 insertions(+), 8 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 1b2a79f..252f72d 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -138,7 +138,7 @@ int main(int argc, char* argv[]) { cout << "4 - Double-prunning reuse-tree fine grain merging algorithm" << endl; return 0; } - if (argc != 4) { + if (argc < 4) { cout << "usage: ./PipelineRTFS-NS-Diff-FGO " << endl; return 0; } @@ -164,6 +164,10 @@ int main(int argc, char* argv[]) { int max_bucket_size = atoi(argv[1]); string dakota_file = argv[2]; int merging_algorithm = atoi(argv[3]); + bool shuffle = false; + for (int i=1; i &merged_stage void fgm::merge_stages_fine_grain(int algorithm, const std::map &all_stages, const std::map &stages_ref, std::map &merged_stages, - RegionTemplate* rt, std::map expanded_args, int max_bucket_size, string dakota_filename) { + RegionTemplate* rt, std::map expanded_args, int max_bucket_size, bool shuffle, string dakota_filename) { // attempt merging for each stage type for (std::map::const_iterator ref=stages_ref.cbegin(); ref!=stages_ref.cend(); ref++) { // get only the stages from the current stage_ref std::list current_stages; - filter_stages(all_stages, ref->second->getName(), current_stages); + filter_stages(all_stages, ref->second->getName(), current_stages, shuffle); std::cout << "[merge_stages_fine_grain] Generating tasks..." << std::endl; diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fgm.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fgm.hpp index f6ff4a3..b223a2c 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fgm.hpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fgm.hpp @@ -18,7 +18,7 @@ namespace fgm { void merge_stages_fine_grain(int merging_algorithm, const std::map &all_stages, const std::map &stages_ref, std::map &merged_stages, - RegionTemplate* rt, std::map expanded_args, int max_bucket_size, string dakota_filename); + RegionTemplate* rt, std::map expanded_args, int max_bucket_size, bool shuffle, string dakota_filename); } #endif \ No newline at end of file diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/merging.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/merging.cpp index 1884984..8bf0518 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/merging.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/merging.cpp @@ -72,11 +72,26 @@ bool merging_condition(const PipelineComponentBase* merged, const PipelineCompon // filters all the stages from an input map by the stage's name void filter_stages(const map &all_stages, - string stage_name, list &filtered_stages) { + string stage_name, list &filtered_stages, bool shuffle) { + + vector temp; for (pair p : all_stages) if (p.second->getName().compare(stage_name) == 0) - filtered_stages.emplace_back(p.second); + temp.emplace_back(p.second); + + if (shuffle) { + srand(945); + while (temp.size() > 1) { + int r = rand()%(temp.size()-1); + filtered_stages.emplace_back(temp[r]); + temp.erase(find(temp.begin(), temp.end(), temp[r])); + } + filtered_stages.emplace_back(temp.front()); + } else { + for (PipelineComponentBase* s : temp) + filtered_stages.emplace_back(s); + } } list task_generator(map> &tasks_desc, PipelineComponentBase* p, diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/merging.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/merging.hpp index c335c88..13af9ff 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/merging.hpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/merging.hpp @@ -1,6 +1,8 @@ #ifndef MERGING_HPP #define MERGING_HPP +#include + #include "Argument.h" #include "PipelineComponentBase.h" @@ -21,7 +23,7 @@ bool merging_condition(const PipelineComponentBase* merged, const PipelineCompon // filters all the stages from an input map by the stage's name void filter_stages(const map &all_stages, - string stage_name, list &filtered_stages); + string stage_name, list &filtered_stages, bool shuffle); list task_generator(map> &tasks_desc, PipelineComponentBase* p, RegionTemplate* rt, map expanded_args); From 20350c6008eeba05b29405f4d55f4fff2bdb266f Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Tue, 18 Oct 2016 17:19:13 -0200 Subject: [PATCH 71/87] Added a 'no coarse grain merging' option. --- .../PipelineManager.cpp | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 252f72d..76255d9 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -108,7 +108,8 @@ void add_arguments_to_stages(map &merged_stages, RegionTemplate *rt); void generate_pre_defined_stages(FILE* parameters_values_file, map args, map base_stages, map& workflow_outputs, - map& expanded_args, map& expanded_stages); + map& expanded_args, map& expanded_stages, + bool use_coarse_grain=true); // Workflow parsing helper functions list line_buffer; @@ -129,7 +130,9 @@ int main(int argc, char* argv[]) { // verify arguments if (argc > 1 && string(argv[1]).compare("-h") == 0) { - cout << "usage: ./PipelineRTFS-NS-Diff-FGO " << endl; + cout << "usage: ./PipelineRTFS-NS-Diff-FGO [s] [ncg]" << endl; + cout << " s - shuffle" << endl; + cout << " ncg - don't do coarse grain merging" << endl; cout << "avaiable algorithms:" << endl; cout << "0 - No fine grain merging algorithm" << endl; cout << "1 - naive fine grain merging algorithm" << endl; @@ -139,7 +142,7 @@ int main(int argc, char* argv[]) { return 0; } if (argc < 4) { - cout << "usage: ./PipelineRTFS-NS-Diff-FGO " << endl; + cout << "usage: ./PipelineRTFS-NS-Diff-FGO [s] [ncg]" << endl; return 0; } @@ -169,6 +172,11 @@ int main(int argc, char* argv[]) { if (string(argv[i]).compare("s")==0) shuffle = true; + bool use_coarse_grain=true; + for (int i=1; i p : expanded_stages) { @@ -912,7 +920,8 @@ bool all_inps_in(const list& inps, const map& args, void generate_pre_defined_stages(FILE* parameters_values_file, map args, map base_stages, map& workflow_outputs, - map& expanded_args, map& expanded_stages) { + map& expanded_args, map& expanded_stages, + bool use_coarse_grain) { cout << "[generate_pre_defined_stages]" << endl; @@ -1044,7 +1053,7 @@ void generate_pre_defined_stages(FILE* parameters_values_file, map::iterator it = arg_values_list.find(arg_values); // verify if there is no other stage with the same values - if (it == arg_values_list.end()) { + if (it == arg_values_list.end() || !use_coarse_grain) { // add current stage and args values to be compared later arg_values_list[arg_values] = tmp; From 981bc3690d0149fcc825ff884650f914c9eb8d92 Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Tue, 7 Feb 2017 08:31:56 -0200 Subject: [PATCH 72/87] Added profiling cout's. --- .../examples/PipelineRTFS-NS-Diff-FGO/DiffMaskComp.cpp | 7 +++++++ .../examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp | 3 +++ 2 files changed, 10 insertions(+) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/DiffMaskComp.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/DiffMaskComp.cpp index 8f16807..c35d5e0 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/DiffMaskComp.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/DiffMaskComp.cpp @@ -94,6 +94,13 @@ int DiffMaskComp::run() { std::cout << "\tTASK diff mask: Did not find RT named tile"<< std::endl; } + // delete computed_mask_name; + // delete reference_mask_name; + // delete diffPixels; + + long long t = Util::ClockGetTime(); + cout << "[PROFILER] Diff (id | time in ms): " << this->getId() << " " << t << endl; + return 0; } diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp index d3aa513..ba2e998 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp @@ -141,6 +141,9 @@ int Segmentation::run() { this->executeTask(t); } + long long t = Util::ClockGetTime(); + cout << "[PROFILER] Seg (id | time in ms): " << this->getId() << " " << t << endl; + return 0; } From 1858dad3c0bee3fc5d630a8d64500e11473e5266 Mon Sep 17 00:00:00 2001 From: Willian Date: Tue, 21 Feb 2017 00:27:26 -0300 Subject: [PATCH 73/87] Worker time profiler added to stdout. --- runtime/Worker.cpp | 33 ++++++++++++++++++++++++++++++++- runtime/Worker.h | 2 ++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/runtime/Worker.cpp b/runtime/Worker.cpp index 6e952a5..3907dde 100644 --- a/runtime/Worker.cpp +++ b/runtime/Worker.cpp @@ -241,7 +241,7 @@ int Worker::getRank() const void Worker::workerProcess() { - // Init data spaces + // Init data spaces1 // Number of DataSpaces clients equals to number of workers // Load Components implemented by the current application, and // check if all workers were correctly initialized. @@ -268,12 +268,16 @@ void Worker::workerProcess() char flag = MessageTag::MANAGER_READY; while (flag != MessageTag::MANAGER_FINISHED && flag != MessageTag::MANAGER_ERROR) { + long long t0 = Util::ClockGetTime(); + // tell the manager - ready this->comm_world.Send(&MessageTag::WORKER_READY, 1, MPI::CHAR, this->getManagerRank(), MessageTag::TAG_CONTROL); // get the manager status this->comm_world.Recv(&flag, 1, MPI::CHAR, this->getManagerRank(), MessageTag::TAG_CONTROL); + long long t_recv = Util::ClockGetTime(); + // std::cout << "Worker: "<< this->getRank()<<" flag: " <<(int)flag<getMaxActiveComponentInstances() << " activeComps: "<< this->getActiveComponentInstances() <<" #resTasks:"<< std::endl; #endif + long long t_isnull = Util::ClockGetTime(); if(pc != NULL){ // One more component instance was received and is being dispatched for execution @@ -302,6 +307,7 @@ void Worker::workerProcess() // subtasks have finished the call back is executed, destroyed and the component is destroyed int ioTaskId = pc->createIOTask(); + long long t_cache = Util::ClockGetTime(); CallBackComponentExecution *callBackTask = new CallBackComponentExecution(pc, this); if(ioTaskId != -1){ @@ -314,15 +320,40 @@ void Worker::workerProcess() // Start transaction. All tasks created within the execution engine will be associated to this one this->getResourceManager()->startTransaction(callBackTask); + long long t_callback = Util::ClockGetTime(); + // Execute component function that instantiates tasks within the execution engine pc->run(); + long long t_run = Util::ClockGetTime(); + // Stop transaction: defines the end of the transaction associated to the current component this->getResourceManager()->endTransaction(); // Dispatch transaction task for execution this->getResourceManager()->insertTask(callBackTask); + long long t_end = Util::ClockGetTime(); + + std::stringstream t0_ss; + t0_ss << t0; + std::stringstream t_recv_ss; + t_recv_ss << t_recv; + std::stringstream t_isnull_ss; + t_isnull_ss << t_isnull; + std::stringstream t_cache_ss; + t_cache_ss << t_cache; + std::stringstream t_callback_ss; + t_callback_ss << t_callback; + std::stringstream t_run_ss; + t_run_ss << t_run; + std::stringstream t_end_ss; + t_end_ss << t_end; + + std::cout << "[WORKER_PROFILER] " << t0_ss.str() << " " << t_recv_ss.str() << " " + << t_isnull_ss.str() << " " << t_cache_ss.str() << " " + << t_callback_ss.str() << " " << t_run_ss.str() << " " + << t_end_ss.str() << std::endl; }else{ std::cout << "Error: Failed to load PipelineComponent!"< #include +#include #include #include #include "MessageTag.h" #include "PipelineComponentBase.h" #include "CallBackComponentExecution.h" #include "DataPack.h" +#include "Util.h" #ifdef WITH_DATA_SPACES extern "C" { From 9258b867a1c0dd577a1becb8e020584e37917d88 Mon Sep 17 00:00:00 2001 From: Willian Date: Tue, 21 Feb 2017 09:39:11 -0300 Subject: [PATCH 74/87] Dependency test. --- runtime/Manager.cpp | 26 +++++++++++++++++++ runtime/Manager.h | 4 +++ runtime/ResourceManager/TrackDependencies.cpp | 2 ++ .../PipelineManager.cpp | 4 +++ 4 files changed, 36 insertions(+) diff --git a/runtime/Manager.cpp b/runtime/Manager.cpp index 02d4baa..29710be 100644 --- a/runtime/Manager.cpp +++ b/runtime/Manager.cpp @@ -242,11 +242,15 @@ void Manager::manager_process() char *msg = new char[input_message_size]; + long long t_0 = Util::ClockGetTime(); + // Read the comm_world.Recv(msg, input_message_size, MPI::CHAR, worker_id, MessageTag::TAG_CONTROL); // printf("manager received request from worker %d\n",worker_id); msg_type = msg[0]; + long long t_recv = Util::ClockGetTime(); + switch(msg_type){ case MessageTag::WORKER_READY: { @@ -266,11 +270,17 @@ void Manager::manager_process() } } } + + long long t_data_aware = Util::ClockGetTime(); + // if data reuse is not enabled or did not find a component to reuse data, try to get any. if(compToExecute == NULL){ // select next component instantiation should be dispatched for execution compToExecute = (PipelineComponentBase*)componentsToExecute->getTask(); } + + long long t_get_task = Util::ClockGetTime(); + // tell worker that manager is ready comm_world.Send(&MessageTag::MANAGER_READY, 1, MPI::CHAR, worker_id, MessageTag::TAG_CONTROL); @@ -279,6 +289,22 @@ void Manager::manager_process() this->insertActiveComponent(compToExecute); + long long t_end = Util::ClockGetTime(); + + std::stringstream t_0_ss; + t_0_ss << t_0; + std::stringstream t_recv_ss; + t_recv_ss << t_recv; + std::stringstream t_data_aware_ss; + t_data_aware_ss << t_data_aware; + std::stringstream t_get_task_ss; + t_get_task_ss << t_get_task; + std::stringstream t_end_ss; + t_end_ss << t_end; + + std::cout << "[MANAGER_PROFILER] " << t_0_ss.str() << " " << t_recv_ss.str() << " " + << t_data_aware_ss.str() << " " << t_get_task_ss.str() << " " << t_end_ss.str() << std::endl; + }else{ // tell worker that manager queue is empty. Nothing else to do at this moment. Should ask again. comm_world.Send(&MessageTag::MANAGER_WORK_QUEUE_EMPTY, 1, MPI::CHAR, worker_id, MessageTag::TAG_CONTROL); diff --git a/runtime/Manager.h b/runtime/Manager.h index 6cdf723..5a3a8e1 100644 --- a/runtime/Manager.h +++ b/runtime/Manager.h @@ -14,10 +14,14 @@ #include #include +#include +#include + #include "MessageTag.h" #include "DataPack.h" #include "PipelineComponentBase.h" #include "./regiontemplates/RTPipelineComponentBase.h" +#include "Util.h" //class RTPipelineComponentBase; class PipelineComponentBase; diff --git a/runtime/ResourceManager/TrackDependencies.cpp b/runtime/ResourceManager/TrackDependencies.cpp index 3e9ee92..2bb2c0a 100644 --- a/runtime/ResourceManager/TrackDependencies.cpp +++ b/runtime/ResourceManager/TrackDependencies.cpp @@ -61,8 +61,10 @@ void TrackDependencies::checkDependencies(Task* task, TasksQueue* tq) { if(task->getNumberDependencies() == task->getNumberDependenciesSolved()){ // It always starts empty, and tasks are added as they are dispatched for execution tq->insertTask(task); + // std::cout << "[dependency_test] stage " << task->getId() << " is solved." << std::endl; }else{ this->incrementCountTasksPending(); + // std::cout << "[dependency_test] stage " << task->getId() << " is pending." << std::endl; } // Unlock dependency map diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 76255d9..fbee5a3 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -421,6 +421,10 @@ int main(int argc, char* argv[]) { // workaround to make sure that the RTs, if any, won't leak on this part of the algorithm s.second->setLocation(PipelineComponentBase::MANAGER_SIDE); + cout << "[dependency_test] stage " << s.second->getId() << " with " + << s.second->getNumberDependencies() << " dependencies and " + << s.second->getNumberDependenciesSolved() << " solved." << endl; + sysEnv.executeComponent(s.second); } } From 30b704a721966534dd18729e9b0abc85716a4723 Mon Sep 17 00:00:00 2001 From: Willian Date: Tue, 21 Feb 2017 21:02:23 -0300 Subject: [PATCH 75/87] More manager profiling. --- runtime/Manager.cpp | 50 +++++++++++++++++-- runtime/ResourceManager/TrackDependencies.cpp | 4 +- .../PipelineManager.cpp | 6 +-- 3 files changed, 50 insertions(+), 10 deletions(-) diff --git a/runtime/Manager.cpp b/runtime/Manager.cpp index 29710be..d8e32cf 100644 --- a/runtime/Manager.cpp +++ b/runtime/Manager.cpp @@ -228,7 +228,13 @@ void Manager::manager_process() std::cout << __FILE__ << ":" << __LINE__ << ". TasksToExecute="<getSize() != 0 || this->componentDependencies->getCountTasksPending() != 0 || this->getActiveComponentsSize()) { + while (true) { + + long long t_0 = Util::ClockGetTime(); + + if (componentsToExecute->getSize() != 0 || this->componentDependencies->getCountTasksPending() != 0 || this->getActiveComponentsSize()){} + else + break; if (comm_world.Iprobe(MPI_ANY_SOURCE, MessageTag::TAG_CONTROL, status)) { @@ -242,7 +248,7 @@ void Manager::manager_process() char *msg = new char[input_message_size]; - long long t_0 = Util::ClockGetTime(); + long long t_probe = Util::ClockGetTime(); // Read the comm_world.Recv(msg, input_message_size, MPI::CHAR, worker_id, MessageTag::TAG_CONTROL); @@ -293,6 +299,8 @@ void Manager::manager_process() std::stringstream t_0_ss; t_0_ss << t_0; + std::stringstream t_probe_ss; + t_probe_ss << t_probe; std::stringstream t_recv_ss; t_recv_ss << t_recv; std::stringstream t_data_aware_ss; @@ -302,8 +310,8 @@ void Manager::manager_process() std::stringstream t_end_ss; t_end_ss << t_end; - std::cout << "[MANAGER_PROFILER] " << t_0_ss.str() << " " << t_recv_ss.str() << " " - << t_data_aware_ss.str() << " " << t_get_task_ss.str() << " " << t_end_ss.str() << std::endl; + // std::cout << "[MANAGER_PROFILER] " << t_0_ss.str() << " " << t_probe_ss.str() << " " << t_recv_ss.str() << " " + // << t_data_aware_ss.str() << " " << t_get_task_ss.str() << " " << t_end_ss.str() << std::endl; }else{ // tell worker that manager queue is empty. Nothing else to do at this moment. Should ask again. @@ -312,7 +320,10 @@ void Manager::manager_process() break; } case MessageTag::WORKER_TASKS_COMPLETED: - { + { + + long long t_switch = Util::ClockGetTime(); + std::vector components; // Pointer to the message area where the information about the tasks is stored @@ -343,6 +354,8 @@ void Manager::manager_process() #endif extracted_size_bytes += sizeof(int); + long long t_extract = Util::ClockGetTime(); + //int extracted_size_bytes = sizeof(char) + sizeof(int) + number_components_completed * sizeof(int) + sizeof(int); //#ifdef WITH_RT @@ -365,6 +378,8 @@ void Manager::manager_process() components.push_back(rtComp); } + long long t_rt = Util::ClockGetTime(); + // Do the magic and update the region templates // for each component received for(int i = 0; i < components.size(); i++){ @@ -384,6 +399,8 @@ void Manager::manager_process() delete rtComp; } // END RT components only code section + + long long t_delete = Util::ClockGetTime(); //#endif extracted_size_bytes = sizeof(char) + sizeof(int); @@ -454,6 +471,29 @@ void Manager::manager_process() } } + long long t_end = Util::ClockGetTime(); + + std::stringstream t_0_ss; + t_0_ss << t_0; + std::stringstream t_probe_ss; + t_probe_ss << t_probe; + std::stringstream t_recv_ss; + t_recv_ss << t_recv; + std::stringstream t_switch_ss; + t_switch_ss << t_switch; + std::stringstream t_extract_ss; + t_extract_ss << t_extract; + std::stringstream t_rt_ss; + t_rt_ss << t_rt; + std::stringstream t_delete_ss; + t_delete_ss << t_delete; + std::stringstream t_end_ss; + t_end_ss << t_end; + + std::cout << "[MANAGER_PROFILER] " << t_0_ss.str() << " " << t_probe_ss.str() << " " << t_recv_ss.str() << " " + << t_switch_ss.str() << " " << t_extract_ss.str() << " " << t_rt_ss.str() << " " << t_delete_ss.str() << " " + << t_end_ss.str() << std::endl; + break; } default: diff --git a/runtime/ResourceManager/TrackDependencies.cpp b/runtime/ResourceManager/TrackDependencies.cpp index 2bb2c0a..ecaa7a6 100644 --- a/runtime/ResourceManager/TrackDependencies.cpp +++ b/runtime/ResourceManager/TrackDependencies.cpp @@ -61,10 +61,10 @@ void TrackDependencies::checkDependencies(Task* task, TasksQueue* tq) { if(task->getNumberDependencies() == task->getNumberDependenciesSolved()){ // It always starts empty, and tasks are added as they are dispatched for execution tq->insertTask(task); - // std::cout << "[dependency_test] stage " << task->getId() << " is solved." << std::endl; + std::cout << "[dependency_test] stage " << task->getId() << " is solved." << std::endl; }else{ this->incrementCountTasksPending(); - // std::cout << "[dependency_test] stage " << task->getId() << " is pending." << std::endl; + std::cout << "[dependency_test] stage " << task->getId() << " is pending." << std::endl; } // Unlock dependency map diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index fbee5a3..7d85c00 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -421,9 +421,9 @@ int main(int argc, char* argv[]) { // workaround to make sure that the RTs, if any, won't leak on this part of the algorithm s.second->setLocation(PipelineComponentBase::MANAGER_SIDE); - cout << "[dependency_test] stage " << s.second->getId() << " with " - << s.second->getNumberDependencies() << " dependencies and " - << s.second->getNumberDependenciesSolved() << " solved." << endl; + // cout << "[dependency_test] stage " << s.second->getId() << " with " + // << s.second->getNumberDependencies() << " dependencies and " + // << s.second->getNumberDependenciesSolved() << " solved." << endl; sysEnv.executeComponent(s.second); } From 257d676b4b0fd4d3d5acdb1e6defb5090de989d2 Mon Sep 17 00:00:00 2001 From: Willian Junior Date: Fri, 7 Apr 2017 15:31:10 -0300 Subject: [PATCH 76/87] Removed unused cout's and started workflow-clustered stages generation algorithm, against the stage-clustered generation model. --- .../PipelineManager.cpp | 38 ++++--- .../examples/PipelineRTFS-NS-Diff-FGO/fgm.cpp | 12 +- .../graph/reuse_tree.cpp | 104 +++++++++--------- 3 files changed, 83 insertions(+), 71 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 7d85c00..9cc27b7 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -433,7 +433,7 @@ int main(int argc, char* argv[]) { cout << endl << "startupExecution" << endl; gettimeofday(&start, NULL); - sysEnv.startupExecution(); + // sysEnv.startupExecution(); gettimeofday(&end, NULL); @@ -1012,19 +1012,31 @@ void generate_pre_defined_stages(FILE* parameters_values_file, map> p : input_arguments) { - cout << "Argument " << p.first << " with values:" << endl; + // for (pair> p : input_arguments) { + // cout << "Argument " << p.first << " with values:" << endl; + // for (ArgumentBase* a : p.second) { + // cout << "\t" << a->getId() << ": " << a->toString() << endl; + // } + // } + + for (pair> p : stages_arguments) { + cout << "Argument set " << p.first << " with parameters:" << endl; for (ArgumentBase* a : p.second) { - cout << "\t" << a->getId() << ": " << a->toString() << endl; + cout << "\t" << a->getId() << ":" << a->getName() << " = " << a->toString() << endl; } } - // for (list s : stages_arguments) { - // cout << "got stage:" << endl; - // for (ArgumentBase* a : s) { - // cout << "\t" << a->getId() << ":" << a->getName() << " = " << a->toString() << endl; - // } - // } + // iterate through each parameter set, creating a workflow for each set + for (pair> p : stages_arguments) { + // iterate through all stages of the workflow model, generating the stages + for (pair p : base_stages) { + + } + + + for (ArgumentBase* a : p.second) { + } + } // keep expanding stages until there is no stage left while (base_stages.size() != 0) { @@ -1125,11 +1137,11 @@ void generate_pre_defined_stages(FILE* parameters_values_file, mapgetId()); // add a copy of the old arg with the correct id to the final map for each repeated output - cout << "checking output " << old_arg->getId() << ":" << old_arg->getName() << endl; + // cout << "checking output " << old_arg->getId() << ":" << old_arg->getName() << endl; for (ArgumentBase* a : args_values) { - cout << "comparing with output " << a->getId() << ":" << a->getName() << endl; + // cout << "comparing with output " << a->getId() << ":" << a->getName() << endl; if (a->getName().compare(old_arg->getName()) == 0) { - cout << "output found" << endl; + // cout << "output found" << endl; ArgumentBase* temp = old_arg->clone(); temp->setParent(old_arg->getParent()); temp->setId(a->getId()); diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fgm.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fgm.cpp index 4a323ce..1eedc97 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fgm.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fgm.cpp @@ -37,7 +37,7 @@ void add_arguments_to_stages(std::map &merged_stage new_arg->setParent(merged_arguments[arg_id]->getParent()); stage.second->addArgument(new_arg); if (new_arg->getType() == ArgumentBase::RT) { - std::cout << "input RT : " << merged_arguments[arg_id]->getName() << std::endl; + // std::cout << "input RT : " << merged_arguments[arg_id]->getName() << std::endl; // insert the region template on the parent stage if the argument is a DR and if the RT wasn't already added if (((RTPipelineComponentBase*)stage.second)-> getRegionTemplateInstance(rt->getName()) == NULL) { @@ -49,12 +49,12 @@ void add_arguments_to_stages(std::map &merged_stage if (merged_arguments[arg_id]->getParent() != 0) { // verify if the dependency stage was reused int parent = merged_arguments[arg_id]->getParent(); - std::cout << "[before]Dependency: " << stage.second->getId() << ":" << stage.second->getName() - << " ->addDependency( " << parent << " )" << std::endl; + // std::cout << "[before]Dependency: " << stage.second->getId() << ":" << stage.second->getName() + // << " ->addDependency( " << parent << " )" << std::endl; if (merged_stages[merged_arguments[arg_id]->getParent()]->reused != NULL) parent = merged_stages[merged_arguments[arg_id]->getParent()]->reused->getId(); - std::cout << "Dependency: " << stage.second->getId() << ":" << stage.second->getName() - << " ->addDependency( " << parent << " )" << std::endl; + // std::cout << "Dependency: " << stage.second->getId() << ":" << stage.second->getName() + // << " ->addDependency( " << parent << " )" << std::endl; ((RTPipelineComponentBase*)stage.second)->addDependency(parent); } } @@ -66,7 +66,7 @@ void add_arguments_to_stages(std::map &merged_stage new_arg->setIo(ArgumentBase::output); stage.second->addArgument(new_arg); if (merged_arguments[arg_id]->getType() == ArgumentBase::RT) { - std::cout << "output RT : " << merged_arguments[arg_id]->getName() << std::endl; + // std::cout << "output RT : " << merged_arguments[arg_id]->getName() << std::endl; // insert the region template on the parent stage if the argument is a DR and if the RT wasn't already added if (((RTPipelineComponentBase*)stage.second)->getRegionTemplateInstance(rt->getName()) == NULL) ((RTPipelineComponentBase*)stage.second)->addRegionTemplateInstance(rt, rt->getName()); diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.cpp index 29dea9f..e41bf13 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.cpp @@ -138,8 +138,8 @@ void cluster_merging(reuse_tree_t& reuse_tree, list>& new_buckets, int max_bucket_size) { - std::cout << "starting merging with " << leafs_parent_list.size() - << " parents" << std::endl; + // std::cout << "starting merging with " << leafs_parent_list.size() + // << " parents" << std::endl; // cluster the parents nodes of leafs_parent_list by their parents multimap parents_clusters; set parents_clusters_keys; @@ -152,8 +152,8 @@ void cluster_merging(reuse_tree_t& reuse_tree, for (set::iterator p=parents_clusters_keys.begin(); p!=parents_clusters_keys.end(); p++) { - std::cout << "\titerating on cluster of parent node " - << (*p)->stage_ref->getId() << std::endl; + // std::cout << "\titerating on cluster of parent node " + // << (*p)->stage_ref->getId() << std::endl; multimap::iterator c_it = parents_clusters.lower_bound(*p); @@ -172,8 +172,8 @@ void cluster_merging(reuse_tree_t& reuse_tree, for (set::reverse_iterator c_count=parents_by_children_count_ids.rbegin(); c_count!=parents_by_children_count_ids.rend(); c_count++) { - std::cout << "\t\ttrying to merge the parents of c_count " << - *c_count << std::endl; + // std::cout << "\t\ttrying to merge the parents of c_count " << + // *c_count << std::endl; multimap::iterator n_it = parents_by_children_count.lower_bound(*c_count); @@ -189,9 +189,9 @@ void cluster_merging(reuse_tree_t& reuse_tree, stack bucket_stack; bucket_stack.push(n_it->second); - std::cout << "\t\t\tstarting a stack with parent " << - n_it->second->stage_ref->getId() << " and b_size " - << current_bucket_size << std::endl; + // std::cout << "\t\t\tstarting a stack with parent " << + // n_it->second->stage_ref->getId() << " and b_size " + // << current_bucket_size << std::endl; // starts the merge attempts with the nodes on the current cluster multimap::iterator n_it2 = next(n_it, 1); @@ -199,9 +199,9 @@ void cluster_merging(reuse_tree_t& reuse_tree, if (current_bucket_size + n_it->first <= max_bucket_size) { bucket_stack.push(n_it2->second); current_bucket_size += n_it2->first; - std::cout << "\t\t\t\tfrom the same " << n_it2->first - << " c_count, added " << n_it2->second->stage_ref->getId() - << " to the stack" << std::endl; + // std::cout << "\t\t\t\tfrom the same " << n_it2->first + // << " c_count, added " << n_it2->second->stage_ref->getId() + // << " to the stack" << std::endl; } else break; } @@ -217,8 +217,8 @@ void cluster_merging(reuse_tree_t& reuse_tree, while (current_bucket_size != max_bucket_size && current_bucket_size != 0) { - std::cout << "\t\t\t\tsearching other c_counts with b_size " - << current_bucket_size << std::endl; + // std::cout << "\t\t\t\tsearching other c_counts with b_size " + // << current_bucket_size << std::endl; // starts the search on the current c_count2 for (; c_count2!=parents_by_children_count_ids.rend(); c_count2++) { @@ -226,18 +226,18 @@ void cluster_merging(reuse_tree_t& reuse_tree, multimap::iterator n_end2 = parents_by_children_count.upper_bound(*c_count2); - std::cout << "\t\t\t\t\tsearching c_count " - << *c_count2 << std::endl; + // std::cout << "\t\t\t\t\tsearching c_count " + // << *c_count2 << std::endl; // goes through current c_count2 cluster for (; n_it2!=n_end2; n_it2++) { if (current_bucket_size + n_it2->first <= max_bucket_size) { bucket_stack.push(n_it2->second); current_bucket_size += n_it2->first; - std::cout << "\t\t\t\t\t\tadded " - << n_it2->second->stage_ref->getId() - << " to the stack with size " - << n_it2->first << std::endl; + // std::cout << "\t\t\t\t\t\tadded " + // << n_it2->second->stage_ref->getId() + // << " to the stack with size " + // << n_it2->first << std::endl; } else break; } @@ -245,23 +245,23 @@ void cluster_merging(reuse_tree_t& reuse_tree, // if it isn't a perfect sized bucket then pop the last added parent if (current_bucket_size != max_bucket_size) { - std::cout << "\t\t\t\tbad bucket size: " - << current_bucket_size << std::endl; + // std::cout << "\t\t\t\tbad bucket size: " + // << current_bucket_size << std::endl; c_count2 = find(parents_by_children_count_ids.rbegin(), parents_by_children_count_ids.rend(), bucket_stack.top()->children.size()); current_bucket_size -= *c_count2; c_count2 = next(c_count2, 1); bucket_stack.pop(); - std::cout << "\t\t\t\tremoving " << *c_count2 - << " from the stack" << std::endl; + // std::cout << "\t\t\t\tremoving " << *c_count2 + // << " from the stack" << std::endl; } } // checks if a viable bucket was found if (current_bucket_size == max_bucket_size) { - std::cout << "\t\t\tnew solution found:" << std::endl; + // std::cout << "\t\t\tnew solution found:" << std::endl; // adds the new bucket to the solution list new_bucket; @@ -272,7 +272,7 @@ void cluster_merging(reuse_tree_t& reuse_tree, for (list::iterator nn=n->children.begin(); nn!=n->children.end(); ) { - std::cout << "\t\t\t\t" << (*nn)->stage_ref->getId() << std::endl; + // std::cout << "\t\t\t\t" << (*nn)->stage_ref->getId() << std::endl; new_bucket.emplace_back((*nn)->stage_ref); nn = n->children.erase(nn); } @@ -292,8 +292,8 @@ void cluster_merging(reuse_tree_t& reuse_tree, } } - std::cout << "\tcluster of parent node " << (*p)->stage_ref->getId() - << " don't have any more reuse oportunities" << std::endl; + // std::cout << "\tcluster of parent node " << (*p)->stage_ref->getId() + // << " don't have any more reuse oportunities" << std::endl; // If this point was reached it means that the current cluster don't have any more // reuse oportunities to be taken, so we remove the cluster's parents from the @@ -338,11 +338,11 @@ list> prune_leaf_level(reuse_tree_t& reuse_tree, while ((*n)->children.size() >= max_bucket_size) { list new_bucket; int count = 0; - std::cout << "[prune_leaf_level] starting bucket of " - << (*n)->stage_ref->getId() << " with size 0" << std::endl; + // std::cout << "[prune_leaf_level] starting bucket of " + // << (*n)->stage_ref->getId() << " with size 0" << std::endl; while (count < max_bucket_size) { - std::cout << "[prune_leaf_level]\tadding " - << (*c)->stage_ref->getId() << " to the bucket" << std::endl; + // std::cout << "[prune_leaf_level]\tadding " + // << (*c)->stage_ref->getId() << " to the bucket" << std::endl; new_bucket.emplace_back((*c)->stage_ref); c = (*n)->children.erase(c); count++; @@ -406,22 +406,22 @@ list> reuse_tree_merging( // keep prunning and rising the tree until the root height while (reuse_tree.height > 2) { - std::cout << "before:" << std::endl; - print_reuse_tree(reuse_tree); + // std::cout << "before:" << std::endl; + // print_reuse_tree(reuse_tree); // perform current height merging iteration list leafs_parent_list = generate_leafs_parent_list(reuse_tree); // print_leafs_parent_list(leafs_parent_list); list> new_buckets = prune_leaf_level( reuse_tree, leafs_parent_list, max_bucket_size, double_prunning); - std::cout << "after:" << std::endl; - print_reuse_tree(reuse_tree); + // std::cout << "after:" << std::endl; + // print_reuse_tree(reuse_tree); move_reuse_tree_up(reuse_tree, leafs_parent_list); // add new_buckets to final solution solution.insert(solution.begin(), new_buckets.begin(), new_buckets.end()); } - print_reuse_tree(reuse_tree); + // print_reuse_tree(reuse_tree); // add the remaining unmerged stages to the final solution as single stage buckets if (reuse_tree.parents.size() > 0) { @@ -435,10 +435,10 @@ list> reuse_tree_merging( while (n->children.size() >= max_bucket_size) { list new_bucket; int count = 0; - std::cout << "starting empty bucket:" << std::endl; + // std::cout << "starting empty bucket:" << std::endl; while (count < max_bucket_size) { - std::cout << "adding to bucket " - << (*nn)->stage_ref->getId() << std::endl; + // std::cout << "adding to bucket " + // << (*nn)->stage_ref->getId() << std::endl; new_bucket.emplace_back((*nn)->stage_ref); nn = n->children.erase(nn); count++; @@ -450,26 +450,26 @@ list> reuse_tree_merging( // create a final bucket with all remaining stages, if there are any if (n->children.size() > 0) { list final_stage; - std::cout << "starting final empty bucket:" << std::endl; + // std::cout << "starting final empty bucket:" << std::endl; for (reuse_node_t* nn : n->children) { final_stage.emplace_back(nn->stage_ref); - std::cout << "adding to bucket " - << nn->stage_ref->getId() << std::endl; + // std::cout << "adding to bucket " + // << nn->stage_ref->getId() << std::endl; } solution.emplace_back(final_stage); } } } - std::cout << "FINAL SOLUTION" << std::endl; - for (list b : solution) { - for (PipelineComponentBase* s : b) { - std::cout << "\t" << s->getId() << std::endl; - } - std::cout << "bucket of size " << b.size() << " with cost " - << calc_stage_proc(b, args, ref) << std::endl; - } - std::cout << std::endl << std::endl << std::endl; + // std::cout << "FINAL SOLUTION" << std::endl; + // for (list b : solution) { + // for (PipelineComponentBase* s : b) { + // std::cout << "\t" << s->getId() << std::endl; + // } + // std::cout << "bucket of size " << b.size() << " with cost " + // << calc_stage_proc(b, args, ref) << std::endl; + // } + // std::cout << std::endl << std::endl << std::endl; return solution; } \ No newline at end of file From 9162d656d9b3db72f4d5749a1576ac57b31f5e62 Mon Sep 17 00:00:00 2001 From: Willian Date: Mon, 10 Apr 2017 19:32:32 -0300 Subject: [PATCH 77/87] Solved the '1 RT per pipeline' problem. Found out that the dependencies between stages aren't being enforced. Reproductible by profiling WORKER_PROFILER with clustered stage generation. --- .../RTPipelineComponentBase.cpp | 20 ++ .../PipelineManager.cpp | 277 +++++++++++++----- .../examples/PipelineRTFS-NS-Diff-FGO/fgm.cpp | 38 ++- .../examples/PipelineRTFS-NS-Diff-FGO/fgm.hpp | 2 +- .../PipelineRTFS-NS-Diff-FGO/merging.cpp | 4 +- .../PipelineRTFS-NS-Diff-FGO/merging.hpp | 2 +- 6 files changed, 255 insertions(+), 88 deletions(-) diff --git a/runtime/regiontemplates/RTPipelineComponentBase.cpp b/runtime/regiontemplates/RTPipelineComponentBase.cpp index fafbe33..08118bd 100644 --- a/runtime/regiontemplates/RTPipelineComponentBase.cpp +++ b/runtime/regiontemplates/RTPipelineComponentBase.cpp @@ -7,6 +7,8 @@ #include "RTPipelineComponentBase.h" +#include + void RTPipelineComponentBase::getRT() { for (std::map::iterator i = regionTemplates.begin(); i!=regionTemplates.end();i++) { i->second->printRT(); @@ -313,6 +315,9 @@ RegionTemplate* RTPipelineComponentBase::getRegionTemplateInstance(int index) { } void RTPipelineComponentBase::updateRegionTemplateInfo(RegionTemplate* rt) { + + long long t_0 = Util::ClockGetTime(); + // there are two cases: // 1) the data regions exist or not RegionTemplate* curRt = this->getRegionTemplateInstance(rt->getName()); @@ -321,6 +326,8 @@ void RTPipelineComponentBase::updateRegionTemplateInfo(RegionTemplate* rt) { if(curRt != NULL) curRt->print(); #endif + long long t_get_inst = Util::ClockGetTime(); + if(curRt != NULL){ #ifdef DEBUG std::cout << "NUMDR: " << rt->getNumDataRegions() << std::endl; @@ -366,6 +373,19 @@ void RTPipelineComponentBase::updateRegionTemplateInfo(RegionTemplate* rt) { std::cout << "#########" << std::endl; #endif + long long t_end = Util::ClockGetTime(); + long long n_data_regs = rt->getNumDataRegions(); + + std::stringstream t_0_ss; + t_0_ss << t_0; + std::stringstream t_get_inst_ss; + t_get_inst_ss << t_get_inst; + std::stringstream t_end_ss; + t_end_ss << t_end; + + std::cout << "[RTPCB_PROFILER] " << t_0_ss.str() << " " << t_get_inst << " " << t_end_ss.str() << " " + << n_data_regs << std::endl; + } // every time you change location, make sure region templates are updated diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 9cc27b7..45aca1b 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -102,14 +102,20 @@ void connect_stages_from_file(FILE* workflow_descriptor, map &args, map> args_values, map &expanded_args,map stages, map &expanded_stages, map &workflow_outputs); + + +// TODO: place these two on a cgm namespace. currently on fgm.cpp void generate_drs(RegionTemplate* rt, const map &expanded_args); +void generate_drs(RegionTemplate* rt, PipelineComponentBase* stage, + const std::map &expanded_args); void add_arguments_to_stages(map &merged_stages, - map &merged_arguments, - RegionTemplate *rt); + map &merged_arguments, string name="tile"); + + void generate_pre_defined_stages(FILE* parameters_values_file, map args, map base_stages, map& workflow_outputs, map& expanded_args, map& expanded_stages, - bool use_coarse_grain=true); + bool use_coarse_grain=true, bool clustered_generation=true); // Workflow parsing helper functions list line_buffer; @@ -159,10 +165,6 @@ int main(int argc, char* argv[]) { SysEnv sysEnv; if (mpi_rank == mpi_size-1) { - // region template used by all stages - RegionTemplate *rt = new RegionTemplate(); - rt->setName("tile"); - // get arguments int max_bucket_size = atoi(argv[1]); string dakota_file = argv[2]; @@ -301,7 +303,7 @@ int main(int argc, char* argv[]) { // add arguments to each stage cout << endl << "add_arguments_to_stages" << endl; - add_arguments_to_stages(expanded_stages, expanded_args, rt); + add_arguments_to_stages(expanded_stages, expanded_args); map merged_stages; @@ -310,7 +312,7 @@ int main(int argc, char* argv[]) { gettimeofday(&start, NULL); fgm::merge_stages_fine_grain(merging_algorithm, expanded_stages, base_stages, merged_stages, - rt, expanded_args, max_bucket_size, shuffle, dakota_file); + expanded_args, max_bucket_size, shuffle, dakota_file); gettimeofday(&end, NULL); @@ -319,16 +321,16 @@ int main(int argc, char* argv[]) { merge_time_f << merge_time << "\t"; merge_time_f.close(); - cout << endl<< "merged-fine before deps resolution: " << endl; - for (pair p : merged_stages) { - string s = p.second->reused!=NULL?" - reused":""; - cout << "stage " << p.second->getId() << ":" << p.second->getName() << s << endl; - cout << "\ttasks: " << endl; - for (ReusableTask* t : p.second->tasks) { - cout << "\t\t" << t->getId() << ":" << t->getTaskName() << endl; - cout << "\t\t\tparent_task: " << t->parentTask << endl; - } - } + // cout << endl<< "merged-fine before deps resolution: " << endl; + // for (pair p : merged_stages) { + // string s = p.second->reused!=NULL?" - reused":""; + // cout << "stage " << p.second->getId() << ":" << p.second->getName() << s << endl; + // cout << "\ttasks: " << endl; + // for (ReusableTask* t : p.second->tasks) { + // cout << "\t\t" << t->getId() << ":" << t->getTaskName() << endl; + // cout << "\t\t\tparent_task: " << t->parentTask << endl; + // } + // } // resolve dependencies of reused stages for (pair p : merged_stages) { @@ -389,8 +391,6 @@ int main(int argc, char* argv[]) { //------------------------------------------------------------ string inputFolderPath = "~/Desktop/images15"; - cout << endl << "generate_drs" << endl; - generate_drs(rt, expanded_args); for (int i=0; i s : merged_stages) { if (s.second->reused == NULL) { + + // generate the data regions for each stage + cout << endl << "generate_drs" << endl; + generate_drs(((RTPipelineComponentBase*)s.second)-> + getRegionTemplateInstance("tile"), s.second, expanded_args); + cout << "sent component " << s.second->getId() << ":" << s.second->getName() << " sized " << s.second->size() << " to execute with args:" << endl; cout << "\tall args: " << endl; @@ -433,7 +439,7 @@ int main(int argc, char* argv[]) { cout << endl << "startupExecution" << endl; gettimeofday(&start, NULL); - // sysEnv.startupExecution(); + sysEnv.startupExecution(); gettimeofday(&end, NULL); @@ -922,10 +928,19 @@ bool all_inps_in(const list& inps, const map& args, return true; } +bool all_inps_in(list inps, map> ref) { + for (int i : inps) { + if (ref.find(i) == ref.end()) + return false; + } + return true; +} + + void generate_pre_defined_stages(FILE* parameters_values_file, map args, map base_stages, map& workflow_outputs, map& expanded_args, map& expanded_stages, - bool use_coarse_grain) { + bool use_coarse_grain, bool clustered_generation) { cout << "[generate_pre_defined_stages]" << endl; @@ -1019,68 +1034,69 @@ void generate_pre_defined_stages(FILE* parameters_values_file, map> p : stages_arguments) { - cout << "Argument set " << p.first << " with parameters:" << endl; - for (ArgumentBase* a : p.second) { - cout << "\t" << a->getId() << ":" << a->getName() << " = " << a->toString() << endl; - } - } + // for (pair> p : stages_arguments) { + // cout << "Argument set " << p.first << " with parameters:" << endl; + // for (ArgumentBase* a : p.second) { + // cout << "\t" << a->getId() << ":" << a->getName() << " = " << a->toString() << endl; + // } + // } - // iterate through each parameter set, creating a workflow for each set - for (pair> p : stages_arguments) { - // iterate through all stages of the workflow model, generating the stages - for (pair p : base_stages) { - + + if (clustered_generation) { + // convert base_stages to a list for the necessity of the emplace_back operation + list base_stages_l; + // also create an empty list of arguments of each stage in order to perform coarse-grain merging + map> arg_values_list; + for (pair&& p : base_stages) { + base_stages_l.emplace_back(p.second); + arg_values_list[p.second->getId()].size(); } + // iterate through each parameter set, creating a workflow for each set + for (pair>&& par_set : stages_arguments) { + // iterate through all stages of the workflow model, generating the stages + for (list::iterator p = base_stages_l.begin(); + p != base_stages_l.end();) { - for (ArgumentBase* a : p.second) { - } - } + // attempt to find a stage witch has all inputs expanded either on the workflow inputs or interstage ones + // cout << "checking stage " << (*p)->getName() << " with a parameter_set of size " << par_set.second.size() << endl; + if (all_inps_in((*p)->getInputs(), args, input_arguments, args_values)) { + // cout << "stage " << (*p)->getName() << " has all inputs" << endl; - // keep expanding stages until there is no stage left - while (base_stages.size() != 0) { - // cout << "base_stages size: " << base_stages.size() << endl; - for (pair p : base_stages) { - // attempt to find a stage witch has all inputs expanded either on the workflow inputs or interstage ones - cout << "checking stage " << p.second->getName() << endl; - if (all_inps_in(p.second->getInputs(), args, input_arguments, args_values)) { - cout << "stage " << p.second->getName() << " has all inputs" << endl; - - // A list of concatenated arg values, used as a quick way to verify if a stage with - // the same args was already created. - map arg_values_list; - - // expands all input values of stage p - for (pair> as : stages_arguments) { - PipelineComponentBase* tmp = p.second->clone(); + // A list of concatenated arg values, used as a quick way to verify if a stage with + // the same args was already created. + // map arg_values_list; + + PipelineComponentBase* tmp = (*p)->clone(); string arg_values = ""; - // add all arguments from stages_arguments that belong to stage p.second - for (int inp_id : p.second->getInputs()) { - // cout << "checking input " << args[inp_id]->getName() << " of " << p.second->getName() << endl; - for (ArgumentBase* a : as.second) { + // add all arguments from stages_arguments that belong to stage (*p) + for (int inp_id : (*p)->getInputs()) { + // cout << "checking input " << args[inp_id]->getName() << " of " << (*p)->getName() << endl; + for (ArgumentBase* a : par_set.second) { + // cout << "checking arg " << a->getName() << ":" << a->getId() << endl; if (args.at(inp_id)->getName().compare(a->getName())==0) { arg_values += to_string(a->getId()); tmp->addInput(a->getId()); - // tmp->addArgument(a->clone()); + // cout << "added arg " << a->getName() << ":" << a->getId() << " = " << a->toString() << endl; break; } } } - map::iterator it = arg_values_list.find(arg_values); + // cout << "[arg_values] " << arg_values << endl; + + map::iterator it = arg_values_list[tmp->getId()].find(arg_values); // verify if there is no other stage with the same values - if (it == arg_values_list.end() || !use_coarse_grain) { + if (it == arg_values_list[tmp->getId()].end() || !use_coarse_grain) { // add current stage and args values to be compared later - arg_values_list[arg_values] = tmp; + arg_values_list[tmp->getId()][arg_values] = tmp; // finishes to generate the stage - int id = new_uid(); - tmp->setId(id); - tmp->setName(p.second->getName()); + tmp->setId(new_uid()); + tmp->setName((*p)->getName()); tmp->setLocation(PipelineComponentBase::WORKER_SIDE); // generate outputs - for (int out_id : p.second->getOutputs()) { + for (int out_id : (*p)->getOutputs()) { int new_id = new_uid(); ArgumentBase* ab_cpy = args.at(out_id)->clone(); ab_cpy->setName(args.at(out_id)->getName()); @@ -1089,7 +1105,31 @@ void generate_pre_defined_stages(FILE* parameters_values_file, mapreplaceOutput(out_id, new_id); // add stage's output arguments to current workflow's argument list - stages_arguments[as.first].emplace_back(ab_cpy); + + // cout << "[]" << endl; + // for (ArgumentBase* sss : stages_arguments[par_set.first]) + // cout << "\t" << sss->getId() << ":" << sss->getName() << " = " << sss->toString() << endl; + // cout << "second" << endl; + // for (ArgumentBase* sss : par_set.second) + // cout << "\t" << sss->getId() << ":" << sss->getName() << " = " << sss->toString() << endl; + + stages_arguments[par_set.first].push_back(ab_cpy); + + // cout << "[]" << endl; + // for (ArgumentBase* sss : stages_arguments[par_set.first]) + // cout << "\t" << sss->getId() << ":" << sss->getName() << " = " << sss->toString() << endl; + // cout << "second" << endl; + // for (ArgumentBase* sss : par_set.second) + // cout << "\t" << sss->getId() << ":" << sss->getName() << " = " << sss->toString() << endl; + + par_set.second.push_back(ab_cpy); + + // cout << "[]" << endl; + // for (ArgumentBase* sss : stages_arguments[par_set.first]) + // cout << "\t" << sss->getId() << ":" << sss->getName() << " = " << sss->toString() << endl; + // cout << "second" << endl; + // for (ArgumentBase* sss : par_set.second) + // cout << "\t" << sss->getId() << ":" << sss->getName() << " = " << sss->toString() << endl; // add output to interstage args map args_values.emplace_back(ab_cpy); @@ -1103,20 +1143,106 @@ void generate_pre_defined_stages(FILE* parameters_values_file, mapsecond->getId() << endl; - stages_arguments[as.first].emplace_back(find_argument(args_values, out_id)); + stages_arguments[par_set.first].emplace_back(find_argument(args_values, out_id)); + par_set.second.emplace_back(find_argument(args_values, out_id)); } // TODO: solve mem leaking // delete tmp; } + p++; + } else { + // since the stage isn't yet ready, replace it in the last position of the stage list + // cout << "stage " << (*p)->getName() << " doesen't have all inputs - being placed last now" << endl; + base_stages_l.emplace_back(*p); + p = base_stages_l.erase(p); } + } + } + } else { + // keep expanding stages until there is no stage left + while (base_stages.size() != 0) { + // cout << "base_stages size: " << base_stages.size() << endl; + for (pair p : base_stages) { + // attempt to find a stage witch has all inputs expanded either on the workflow inputs or interstage ones + // cout << "checking stage " << p.second->getName() << endl; + if (all_inps_in(p.second->getInputs(), args, input_arguments, args_values)) { + // cout << "stage " << p.second->getName() << " has all inputs" << endl; + + // A list of concatenated arg values, used as a quick way to verify if a stage with + // the same args was already created. + map arg_values_list; + + // expands all input values of stage p + for (pair> as : stages_arguments) { + PipelineComponentBase* tmp = p.second->clone(); + string arg_values = ""; + // add all arguments from stages_arguments that belong to stage p.second + for (int inp_id : p.second->getInputs()) { + // cout << "checking input " << args[inp_id]->getName() << " of " << p.second->getName() << " with " << as.second.size() << " parameters" << endl; + for (ArgumentBase* a : as.second) { + // cout << "checking arg " << a->getName() << ":" << a->getId() << endl; + if (args.at(inp_id)->getName().compare(a->getName())==0) { + arg_values += to_string(a->getId()); + tmp->addInput(a->getId()); + // tmp->addArgument(a->clone()); + // cout << "added arg " << a->getName() << ":" << a->getId() << " = " << a->toString() << endl; + break; + } + } + } - // remove stage descriptor since it was already solved and break the loop - base_stages.erase(p.first); - break; + // cout << "[arg_values] " << arg_values << endl; + map::iterator it = arg_values_list.find(arg_values); + // verify if there is no other stage with the same values + if (it == arg_values_list.end() || !use_coarse_grain) { + // add current stage and args values to be compared later + arg_values_list[arg_values] = tmp; + + // finishes to generate the stage + int id = new_uid(); + tmp->setId(id); + tmp->setName(p.second->getName()); + tmp->setLocation(PipelineComponentBase::WORKER_SIDE); + + // generate outputs + for (int out_id : p.second->getOutputs()) { + int new_id = new_uid(); + ArgumentBase* ab_cpy = args.at(out_id)->clone(); + ab_cpy->setName(args.at(out_id)->getName()); + ab_cpy->setId(new_id); + ab_cpy->setParent(tmp->getId()); + tmp->replaceOutput(out_id, new_id); + + // add stage's output arguments to current workflow's argument list + stages_arguments[as.first].emplace_back(ab_cpy); + + // add output to interstage args map + args_values.emplace_back(ab_cpy); + } + + // add stage to final stages list + expanded_stages[tmp->getId()] = tmp; + } else { + // if the stage already exists, reuse it + for (int out_id : it->second->getOutputs()) { + // add reused stage's output arguments to current workflow's argument list + // cout << "reusing stage " << out_id << " from workflow " + // << it->second->getId() << endl; + stages_arguments[as.first].emplace_back(find_argument(args_values, out_id)); + } + + // TODO: solve mem leaking + // delete tmp; + } + } + + // remove stage descriptor since it was already solved and break the loop + base_stages.erase(p.first); + break; + } } } - } // add stages_arguments inputs to expanded_args @@ -1151,13 +1277,6 @@ void generate_pre_defined_stages(FILE* parameters_values_file, map inps, map> ref) { - for (int i : inps) { - if (ref.find(i) == ref.end()) - return false; - } - return true; -} // map args: all args, i.e inputs and interstate arguments. // map> args_values: the list of values for each argument. diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fgm.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fgm.cpp index 1eedc97..21be110 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fgm.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fgm.cpp @@ -25,12 +25,40 @@ void generate_drs(RegionTemplate* rt, } } +void generate_drs(RegionTemplate* rt, PipelineComponentBase* stage, + const std::map &expanded_args) { + + // verify every argument + for (int inp : stage->getInputs()) { + // if an argument is a region template data region + if (expanded_args.at(inp)->getType() == ArgumentBase::RT) { + // if (((ArgumentRT*)expanded_args.at(inp))->isFileInput) { + // create the data region and add it to the input region template + DenseDataRegion2D *ddr2d = new DenseDataRegion2D(); + ddr2d->setName(expanded_args.at(inp)->getName()); + std::ostringstream oss; + oss << inp; + ddr2d->setId(oss.str()); + ddr2d->setVersion(inp); + ddr2d->setIsAppInput(true); + ddr2d->setInputType(DataSourceType::FILE_SYSTEM); + ddr2d->setOutputType(DataSourceType::FILE_SYSTEM); + ddr2d->setInputFileName(expanded_args.at(inp)->toString()); + rt->insertDataRegion(ddr2d); + // } + } + } +} + void add_arguments_to_stages(std::map &merged_stages, - std::map &merged_arguments, - RegionTemplate *rt) { + std::map &merged_arguments, string name) { int i=0; - for (pair stage : merged_stages) { + for (pair&& stage : merged_stages) { + // create the RT isntance + RegionTemplate *rt = new RegionTemplate(); + rt->setName(name); + // add input arguments to stage, adding them as RT as needed for (int arg_id : stage.second->getInputs()) { ArgumentBase* new_arg = merged_arguments[arg_id]->clone(); @@ -79,7 +107,7 @@ void add_arguments_to_stages(std::map &merged_stage void fgm::merge_stages_fine_grain(int algorithm, const std::map &all_stages, const std::map &stages_ref, std::map &merged_stages, - RegionTemplate* rt, std::map expanded_args, int max_bucket_size, bool shuffle, string dakota_filename) { + std::map expanded_args, int max_bucket_size, bool shuffle, string dakota_filename) { // attempt merging for each stage type for (std::map::const_iterator ref=stages_ref.cbegin(); ref!=stages_ref.cend(); ref++) { @@ -94,7 +122,7 @@ void fgm::merge_stages_fine_grain(int algorithm, const std::map::iterator s=current_stages.begin(); s!=current_stages.end(); ) { // if the stage isn't composed of reusable tasks then - (*s)->tasks = task_generator(ref->second->tasksDesc, *s, rt, expanded_args); + (*s)->tasks = task_generator(ref->second->tasksDesc, *s, expanded_args); if ((*s)->tasks.size() == 0) { merged_stages[(*s)->getId()] = *s; diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fgm.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fgm.hpp index b223a2c..544622e 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fgm.hpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fgm.hpp @@ -18,7 +18,7 @@ namespace fgm { void merge_stages_fine_grain(int merging_algorithm, const std::map &all_stages, const std::map &stages_ref, std::map &merged_stages, - RegionTemplate* rt, std::map expanded_args, int max_bucket_size, bool shuffle, string dakota_filename); + std::map expanded_args, int max_bucket_size, bool shuffle, string dakota_filename); } #endif \ No newline at end of file diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/merging.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/merging.cpp index 8bf0518..7b7fdfe 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/merging.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/merging.cpp @@ -95,7 +95,7 @@ void filter_stages(const map &all_stages, } list task_generator(map> &tasks_desc, PipelineComponentBase* p, - RegionTemplate* rt, map expanded_args) { + map expanded_args) { list tasks; ReusableTask* prev_task = NULL; @@ -112,7 +112,7 @@ list task_generator(map> &tasks_desc, // call constructor int uid = new_uid(); - ReusableTask* n_task = ReusableTask::ReusableTaskFactory::getTaskFromName(t->first, args, rt); + ReusableTask* n_task = ReusableTask::ReusableTaskFactory::getTaskFromName(t->first, args, NULL); n_task->setId(uid); n_task->setTaskName(t->first); // set prevoius task dependency if this isn't the first task generated diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/merging.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/merging.hpp index 13af9ff..d5724c3 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/merging.hpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/merging.hpp @@ -26,7 +26,7 @@ void filter_stages(const map &all_stages, string stage_name, list &filtered_stages, bool shuffle); list task_generator(map> &tasks_desc, PipelineComponentBase* p, - RegionTemplate* rt, map expanded_args); + map expanded_args); ReusableTask* find_task(list l, string name); From d108998967b0e246ed0eba169c785d624c85581e Mon Sep 17 00:00:00 2001 From: Willian Date: Tue, 11 Apr 2017 00:11:47 -0300 Subject: [PATCH 78/87] The dependency problem isn't really a problem. Just don't use clustered stage generation. Explanation on PipelineManager.cpp:947 --- runtime/ResourceManager/TrackDependencies.cpp | 8 ++++++-- .../PipelineRTFS-NS-Diff-FGO/DiffMaskComp.cpp | 3 ++- .../PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp | 16 ++++++++++++++-- .../PipelineRTFS-NS-Diff-FGO/Segmentation.cpp | 3 ++- 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/runtime/ResourceManager/TrackDependencies.cpp b/runtime/ResourceManager/TrackDependencies.cpp index ecaa7a6..a37b7aa 100644 --- a/runtime/ResourceManager/TrackDependencies.cpp +++ b/runtime/ResourceManager/TrackDependencies.cpp @@ -61,10 +61,14 @@ void TrackDependencies::checkDependencies(Task* task, TasksQueue* tq) { if(task->getNumberDependencies() == task->getNumberDependenciesSolved()){ // It always starts empty, and tasks are added as they are dispatched for execution tq->insertTask(task); - std::cout << "[dependency_test] stage " << task->getId() << " is solved." << std::endl; + std::cout << "[dependency_test] stage " << task->getId() << " is solved: " + << task->getNumberDependenciesSolved() << " out of " + << task->getNumberDependencies() << std::endl; }else{ this->incrementCountTasksPending(); - std::cout << "[dependency_test] stage " << task->getId() << " is pending." << std::endl; + std::cout << "[dependency_test] stage " << task->getId() << " is pending with " + << task->getNumberDependenciesSolved() << " out of " + << task->getNumberDependencies() << " deps solved" << std::endl; } // Unlock dependency map diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/DiffMaskComp.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/DiffMaskComp.cpp index c35d5e0..2398d25 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/DiffMaskComp.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/DiffMaskComp.cpp @@ -99,7 +99,8 @@ int DiffMaskComp::run() { // delete diffPixels; long long t = Util::ClockGetTime(); - cout << "[PROFILER] Diff (id | time in ms): " << this->getId() << " " << t << endl; + // cout << "[PROFILER] Diff (id | time in ms): " << this->getId() << " " << t << endl; + cout << "[EXEC_ORDER] diff " << this->getId() << endl; return 0; } diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 45aca1b..f3d418d 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -115,7 +115,7 @@ void add_arguments_to_stages(map &merged_stages, void generate_pre_defined_stages(FILE* parameters_values_file, map args, map base_stages, map& workflow_outputs, map& expanded_args, map& expanded_stages, - bool use_coarse_grain=true, bool clustered_generation=true); + bool use_coarse_grain=true, bool clustered_generation=false); // Workflow parsing helper functions list line_buffer; @@ -337,8 +337,10 @@ int main(int argc, char* argv[]) { // add correct stage dependencies list deps_tmp; for (int i=0; igetNumberDependencies(); i++) { + if (merged_stages.find(p.second->getDependency(i)) != merged_stages.end() && merged_stages[p.second->getDependency(i)]->reused != NULL) { + deps_tmp.emplace_back(merged_stages[p.second->getDependency(i)]->reused->getId()); } } @@ -422,6 +424,12 @@ int main(int argc, char* argv[]) { for (int i : s.second->getOutputs()) cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " << expanded_args[i]->toString() << endl; + cout << "\tdependencies:" << endl; + for (int i=0; igetNumberDependencies(); i++) + cout << "\t\t" << merged_stages[s.second->getDependency(i)]->getId() << ":" + << merged_stages[s.second->getDependency(i)]->getName() << endl; + + // set task ID to enable dependency enforcement ((Task*)s.second)->setId(s.second->getId()); // workaround to make sure that the RTs, if any, won't leak on this part of the algorithm @@ -936,7 +944,11 @@ bool all_inps_in(list inps, map> ref) { return true; } - +// WARNING: When using fine-grain reuse with clustered stage generation the merging of stages +// can make diff stages be added to be executed (executeComponent) before its dependency, +// thus causing the diff stage to have all dependencies solved. Thereby, unless the order +// of 'expanded_stages' is fixed before sending the stages to be executed, clustered generation +// shouldn't be used with fine-grain reuse. void generate_pre_defined_stages(FILE* parameters_values_file, map args, map base_stages, map& workflow_outputs, map& expanded_args, map& expanded_stages, diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp index ba2e998..1363893 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp @@ -142,7 +142,8 @@ int Segmentation::run() { } long long t = Util::ClockGetTime(); - cout << "[PROFILER] Seg (id | time in ms): " << this->getId() << " " << t << endl; + // cout << "[PROFILER] Seg (id | time in ms): " << this->getId() << " " << t << endl; + cout << "[EXEC_ORDER] segmentation " << this->getId() << endl; return 0; } From 0e54b3a0dc9c96eae1267a99e1f0ff8efa6ecbb5 Mon Sep 17 00:00:00 2001 From: Pedro H Date: Mon, 17 Apr 2017 16:27:13 -0300 Subject: [PATCH 79/87] Update BULDING.md for the yi-src-multi Updates to the new options required and dependencies. Change all "make" to "make -j$(nproc)" for a faster compile time while still keeping generic. --- BUILDING.md | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/BUILDING.md b/BUILDING.md index 341b8fa..11ebda4 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -4,6 +4,8 @@ Assuming: - You have no previous dependency installed + +This guide will go through each of these dependencies: - ActiveHarmony [4.6.0](http://www.dyninst.org/sites/default/files/downloads/harmony/ah-4.6.0.tar.gz) - OpenCV [2.4.9](http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.9/opencv-2.4.9.zip/download) - InsightToolkit [4.11.0](https://sourceforge.net/projects/itk/files/itk/4.11/InsightToolkit-4.11.0.tar.gz/download) @@ -67,7 +69,7 @@ inside `/opencv` folder unzip opencv-2.4.9.zip cd build cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ../opencv-2.4.9/ -make +make -j$(nproc) sudo make install ``` @@ -89,12 +91,13 @@ on the interface - press `t` to toggle advanced mode - turn on `BUILD_SHARED_LIBS` - turn on `MODULE_ITKVideoBridgeOpenCV` +- turn on `Module_ITKReview` - press `c` to configure - press `g` to generate then build ``` -make +make -j$(nproc) ``` ## Installing Nscale @@ -121,13 +124,18 @@ on the interface then build ``` -make +make -j$(nproc) ``` NOTE: it may give errors of vars `NSCALE_VERSION_MAJOR` and `NSCALE_VERSION_MINOR`, press `e` to continue and ignore. ## Installing Yi's library +prerequisite +``` +sudo apt install libopenslide-dev +sudo ln -s /usr/lib/x86_64-linux-gnu/libopenslide.so /usr/lib/libopenslide.so +``` inside `/workspace` folder ``` cp project/region-templates/runtime/regiontemplates/external-src/yi-src-multi.tar.gz ./libs/yi/ @@ -147,15 +155,16 @@ on the interface - press `c` to configure - press `e` to ignore errors and continue - fill `ITK_DIR` to your `ITK` installation -- turn off `build_mainTileAndSegmentWSINuclei` +- turn on `build_mainTileAndSegmentWSINuclei` - press `c` to configure +- fill `OpenSlide_INSTALLATION_PATH` with only `/usr` - turn on `build_mainSegmentSmallImage` - press `c` to configure - press `g` to generate then build ``` -make +make -j$(nproc) ``` ## Installing Active Harmony @@ -232,5 +241,5 @@ on the interface then build ``` -make +make -j$(nproc) ``` From 4c9b25d719f23f83ef212ac337ed55c488293760 Mon Sep 17 00:00:00 2001 From: Willian Date: Wed, 19 Apr 2017 19:53:38 -0300 Subject: [PATCH 80/87] TaskSegmentation5 memory leak fixed. --- .../examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp index 1363893..63f2f0b 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp @@ -241,6 +241,8 @@ bool TaskSegmentation0::run(int procType, int tid) { } void TaskSegmentation0::updateDR(RegionTemplate* rt) { + // if (normalized_rt_temp != NULL) + // delete *normalized_rt_temp; normalized_rt_temp = std::make_shared(dynamic_cast(rt->getDataRegion((*this->normalized_rt_temp)->getName(), (*this->normalized_rt_temp)->getId(), 0, stoi((*this->normalized_rt_temp)->getId())))); @@ -1192,6 +1194,8 @@ bool TaskSegmentation5::run(int procType, int tid) { } void TaskSegmentation5::updateDR(RegionTemplate* rt) { + if (normalized_rt_temp != NULL) + delete *normalized_rt_temp; normalized_rt_temp = std::make_shared(dynamic_cast(rt->getDataRegion((*this->normalized_rt_temp)->getName(), (*this->normalized_rt_temp)->getId(), 0, stoi((*this->normalized_rt_temp)->getId())))); From acef0dfafac0b5476b3c86d657191c29a0ae73d7 Mon Sep 17 00:00:00 2001 From: Willian Date: Wed, 19 Apr 2017 23:51:48 -0300 Subject: [PATCH 81/87] Fixed the Diff memory leak Leak was due to the non deletion of the DDR2Ds of DiffMaskComp.cpp:run() whenever one of the two DDR2D was NULL. This was due to some bad stage merging, which caused the input arguments to have the wrong (reused stage) dependency ID, thus making such arguments unavailable. The arguments' IDs were fixed. --- runtime/PipelineComponentBase.cpp | 13 ++++++++++++- runtime/PipelineComponentBase.h | 1 + .../PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp | 4 ++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/runtime/PipelineComponentBase.cpp b/runtime/PipelineComponentBase.cpp index d3c8b4f..2ea689c 100644 --- a/runtime/PipelineComponentBase.cpp +++ b/runtime/PipelineComponentBase.cpp @@ -394,9 +394,20 @@ void PipelineComponentBase::replaceArgument(int old_id, ArgumentBase* new_a) { if ((*i)->getId() == old_id) { arguments.erase(i); arguments.push_back(new_a); - return; + break; } } + if (std::find(input_arguments.begin(), input_arguments.end(), old_id) + != input_arguments.end()) { + input_arguments.remove(old_id); + input_arguments.push_back(new_a->getId()); + } + + if (std::find(output_arguments.begin(), output_arguments.end(), old_id) + != output_arguments.end()) { + output_arguments.remove(old_id); + output_arguments.push_back(new_a->getId()); + } } void PipelineComponentBase::printTasks() { diff --git a/runtime/PipelineComponentBase.h b/runtime/PipelineComponentBase.h index d65e8b9..51d8f0b 100644 --- a/runtime/PipelineComponentBase.h +++ b/runtime/PipelineComponentBase.h @@ -12,6 +12,7 @@ #include #include #include +#include #include "Argument.h" #include "Task.h" diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index f3d418d..940bfeb 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -338,6 +338,8 @@ int main(int argc, char* argv[]) { list deps_tmp; for (int i=0; igetNumberDependencies(); i++) { + // if the i-th dependency of p still exists and is reused, add the dependency of the + // reused stage to p if (merged_stages.find(p.second->getDependency(i)) != merged_stages.end() && merged_stages[p.second->getDependency(i)]->reused != NULL) { @@ -349,10 +351,12 @@ int main(int argc, char* argv[]) { // connect correct output arguments bool updated = true; + // cout << "Updating arguments of " << p.second->getId() << ":" << p.second->getName() << endl; while (updated) { updated = false; for (ArgumentBase* a : p.second->getArguments()) { if (a->getParent() != 0 && merged_stages[a->getParent()]->reused != NULL) { + // cout << "Replacing argument " << endl; updated = true; p.second->replaceArgument(a->getId(), merged_stages[a->getParent()]->reused->getArgumentByName(a->getName())); From 672ad2bc102c9f8e06ca5157d8576e622ac40341 Mon Sep 17 00:00:00 2001 From: Willian Date: Thu, 20 Apr 2017 22:38:41 -0300 Subject: [PATCH 82/87] Fixed Segmentation DDR2D memory leaks (updateDR would make new DDR2Ds without deleting the old ones). --- .../PipelineRTFS-NS-Diff-FGO/Segmentation.cpp | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp index 63f2f0b..c81048c 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp @@ -241,10 +241,14 @@ bool TaskSegmentation0::run(int procType, int tid) { } void TaskSegmentation0::updateDR(RegionTemplate* rt) { - // if (normalized_rt_temp != NULL) - // delete *normalized_rt_temp; - normalized_rt_temp = std::make_shared(dynamic_cast(rt->getDataRegion((*this->normalized_rt_temp)->getName(), - (*this->normalized_rt_temp)->getId(), 0, stoi((*this->normalized_rt_temp)->getId())))); + string name = (*this->normalized_rt_temp)->getName(); + string sid = (*this->normalized_rt_temp)->getId(); + int id = stoi((*this->normalized_rt_temp)->getId()); + if (normalized_rt_temp != NULL) + delete *normalized_rt_temp; + + normalized_rt_temp = std::make_shared( + dynamic_cast(rt->getDataRegion(name,sid, 0, id))); } @@ -1194,10 +1198,14 @@ bool TaskSegmentation5::run(int procType, int tid) { } void TaskSegmentation5::updateDR(RegionTemplate* rt) { + string name = (*this->normalized_rt_temp)->getName(); + string sid = (*this->normalized_rt_temp)->getId(); + int id = stoi((*this->normalized_rt_temp)->getId()); if (normalized_rt_temp != NULL) delete *normalized_rt_temp; - normalized_rt_temp = std::make_shared(dynamic_cast(rt->getDataRegion((*this->normalized_rt_temp)->getName(), - (*this->normalized_rt_temp)->getId(), 0, stoi((*this->normalized_rt_temp)->getId())))); + + normalized_rt_temp = std::make_shared( + dynamic_cast(rt->getDataRegion(name,sid, 0, id))); } From 050e76b1952333dd395f247cdc62e369530a2c73 Mon Sep 17 00:00:00 2001 From: Willian Date: Thu, 20 Apr 2017 23:53:37 -0300 Subject: [PATCH 83/87] Some further memory leaks fixed on workflow generation. --- .../PipelineManager.cpp | 90 +++++++++++++++---- 1 file changed, 74 insertions(+), 16 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 940bfeb..2fe6a1f 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -515,13 +515,20 @@ void get_inputs_from_file(FILE* workflow_descriptor, string name; // go to the initial ports beginning - while (get_line(&line, workflow_descriptor) != -1 && string(line).find(ip) == string::npos); + while (get_line(&line, workflow_descriptor) != -1 && string(line).find(ip) == string::npos) + delete line; // cout << "port init begin: " << line << endl; // keep getting ports until it reaches the end of initial ports while (get_line(&line, workflow_descriptor) != -1 && string(line).find(ipe) == string::npos) { // consumes the port beginning - while (string(line).find(p) == string::npos && get_line(&line, workflow_descriptor) != -1); + while (string(line).find(p) == string::npos && get_line(&line, workflow_descriptor) != -1) { + delete line; + line = NULL; + } + + if (line != NULL) + delete line; // cout << "port begin: " << line << endl; // finds the name field @@ -632,7 +639,8 @@ void get_inputs_from_file(FILE* workflow_descriptor, parameters_values[arg_id] = inp_values; // consumes the port ending - while (get_line(&line, workflow_descriptor) != -1 && string(line).find(pe) == string::npos); + while (get_line(&line, workflow_descriptor) != -1 && string(line).find(pe) == string::npos) + delete line; // cout << "not port end: " << line << endl; // cout << "port end: " << line << endl; } @@ -653,13 +661,19 @@ void get_outputs_from_file(FILE* workflow_descriptor, map &w string pe(""); // go to the initial ports beginning - while (get_line(&line, workflow_descriptor) != -1 && string(line).find(ip) == string::npos); + while (get_line(&line, workflow_descriptor) != -1 && string(line).find(ip) == string::npos) + delete line; // cout << "port init begin: " << line << endl; // keep getting ports until it reaches the end of initial ports while (get_line(&line, workflow_descriptor) != -1 && string(line).find(ipe) == string::npos) { // consumes the port beginning - while (string(line).find(p) == string::npos && get_line(&line, workflow_descriptor) != -1); + while (string(line).find(p) == string::npos && get_line(&line, workflow_descriptor) != -1) { + delete line; + line = NULL; + } + if (line != NULL) + delete line; // cout << "port begin: " << line << endl; // finds the name field @@ -721,7 +735,8 @@ void get_outputs_from_file(FILE* workflow_descriptor, map &w workflow_outputs[new_id] = out_arg; // consumes the port ending - while (get_line(&line, workflow_descriptor) != -1 && string(line).find(pe) == string::npos); + while (get_line(&line, workflow_descriptor) != -1 && string(line).find(pe) == string::npos) + delete line; // get_line << "not port end: " << line << endl; // cout << "port end: " << line << endl; } @@ -744,14 +759,22 @@ void get_stages_from_file(FILE* workflow_descriptor, string pe(""); // go to the processors beginning - while (get_line(&line, workflow_descriptor) != -1 && string(line).find(ps) == string::npos); + while (get_line(&line, workflow_descriptor) != -1 && string(line).find(ps) == string::npos) + delete line; // cout << "not processor init begin: " << line << endl; // cout << "processor init begin: " << line << endl; // keep getting single processors until it reaches the end of all processors while (get_line(&line, workflow_descriptor) != -1 && string(line).find(pse) == string::npos) { // consumes the processor beginning - while (string(line).find(p) == string::npos && get_line(&line, workflow_descriptor) != -1); + while (string(line).find(p) == string::npos && get_line(&line, workflow_descriptor) != -1) { + delete line; + line = NULL; + } + + if (line != NULL) + delete line; + // cout << "processor begin: " << line << endl; // get stage fields @@ -786,7 +809,8 @@ void get_stages_from_file(FILE* workflow_descriptor, base_stages[stg_id] = stage; // consumes the processor ending - while (get_line(&line, workflow_descriptor) != -1 && string(line).find(pe) == string::npos); + while (get_line(&line, workflow_descriptor) != -1 && string(line).find(pe) == string::npos) + delete line; // cout << "not processor end: " << line << endl; // cout << "processor end: " << line << endl; } @@ -817,14 +841,22 @@ void connect_stages_from_file(FILE* workflow_descriptor, string sourcee(""); // go to the datalinks beginning - while (get_line(&line, workflow_descriptor) != -1 && string(line).find(ds) == string::npos); + while (get_line(&line, workflow_descriptor) != -1 && string(line).find(ds) == string::npos) + delete line; // cout << "not datalink init begin" << line << endl; // cout << "datalink init begin" << line << endl; // keep getting single datalinks until it reaches the end of all datalinks while (get_line(&line, workflow_descriptor) != -1 && string(line).find(dse) == string::npos) { // consumes the datalink beginning - while (string(line).find(d) == string::npos && get_line(&line, workflow_descriptor) != -1); + while (string(line).find(d) == string::npos && get_line(&line, workflow_descriptor) != -1) { + delete line; + line = NULL; + } + + if (line != NULL) + delete line; + // cout << "datalink begin" << line << endl; // get sink and source fields @@ -877,7 +909,11 @@ void connect_stages_from_file(FILE* workflow_descriptor, } // consumes the datalink ending - while (string(line).find(de) == string::npos && get_line(&line, workflow_descriptor) != -1); + bool cond = string(line).find(de) == string::npos; + while (cond && get_line(&line, workflow_descriptor) != -1) { + cond = string(line).find(de) == string::npos; + delete line; + } // cout << "datalink end" << line << endl; } } @@ -1017,8 +1053,10 @@ void generate_pre_defined_stages(FILE* parameters_values_file, mapgetName().compare(name)==0 && a->toString().compare(aa->toString())==0) { found = true; arg = a; + delete aa; break; } + delete aa; } char* token2; @@ -1518,6 +1556,7 @@ string get_workflow_field(FILE* workflow, string field) { return s.substr(s.find("<" + field + ">")+field.length()+2, s.find("")-s.find("<" + field + ">")-field.length()-2); } + delete line; } return nullptr; @@ -1538,13 +1577,17 @@ void get_workflow_arguments(FILE* workflow, string ee(""); // go to the initial entries beginning - while (get_line(&line, workflow) != -1 && string(line).find(ie) == string::npos); + while (get_line(&line, workflow) != -1 && string(line).find(ie) == string::npos) { + delete line; + line = NULL; + } // cout << "port init begin: " << line << endl; // keep getting ports until it reaches the end of initial ports while (get_line(&line, workflow) != -1 && string(line).find(iee) == string::npos) { // consumes the port beginning - while (string(line).find(e) == string::npos && get_line(&line, workflow) != -1); + while (string(line).find(e) == string::npos && get_line(&line, workflow) != -1) + delete line; // cout << "port begin: " << line << endl; // finds the name and field @@ -1558,10 +1601,23 @@ void get_workflow_arguments(FILE* workflow, output_arguments.emplace_back(arg); // consumes the port ending - while (get_line(&line, workflow) != -1 && string(line).find(ee) == string::npos); + while (get_line(&line, workflow) != -1 && string(line).find(ee) == string::npos) { + delete line; + // some c++ implementations may not set line to null after delete + line = NULL; + } // cout << "not port end: " << line << endl; // cout << "port end: " << line << endl; + + if (line != NULL) { + delete line; + line = NULL; + } + } + + if (line != NULL) + delete line; // cout << "port init end: " << line << endl; } @@ -1574,7 +1630,8 @@ vector get_all_fields(FILE* workflow, string start, string end) general_field_t general_field; // consumes the beginning - while (get_line(&line, workflow) != -1 && string(line).find(start) == string::npos); + while (get_line(&line, workflow) != -1 && string(line).find(start) == string::npos) + delete line; // create general field regex regex r ("<[\\w]+>[\\w ]+<\\/[\\w]+>"); @@ -1595,6 +1652,7 @@ vector get_all_fields(FILE* workflow, string start, string end) general_field.data = field; fields.push_back(general_field); } + delete line; } return fields; } From eb6a7bfe30aff22c39e49089d78a84057d294a0c Mon Sep 17 00:00:00 2001 From: Willian Date: Wed, 26 Apr 2017 20:13:56 -0300 Subject: [PATCH 84/87] Reworked the input agruments to something somewhat more professional. --- .../PipelineManager.cpp | 59 +++++++++++++------ 1 file changed, 42 insertions(+), 17 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 2fe6a1f..45c5fb7 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -90,6 +90,8 @@ void adj_mat_print(mincut::weight_t** adjMat, map id2task, size_t n } } +int find_arg_pos(string s, int argc, char** argv); + // Workflow parsing functions void get_inputs_from_file(FILE* workflow_descriptor, map &workflow_inputs, map> ¶meters_values); @@ -136,9 +138,9 @@ int main(int argc, char* argv[]) { // verify arguments if (argc > 1 && string(argv[1]).compare("-h") == 0) { - cout << "usage: ./PipelineRTFS-NS-Diff-FGO [s] [ncg]" << endl; - cout << " s - shuffle" << endl; - cout << " ncg - don't do coarse grain merging" << endl; + cout << "usage: ./PipelineRTFS-NS-Diff-FGO -b -dkt -ma [-s] [-ncg]" << endl; + cout << " -s - shuffle" << endl; + cout << " -ncg - don't do coarse grain merging" << endl; cout << "avaiable algorithms:" << endl; cout << "0 - No fine grain merging algorithm" << endl; cout << "1 - naive fine grain merging algorithm" << endl; @@ -147,8 +149,8 @@ int main(int argc, char* argv[]) { cout << "4 - Double-prunning reuse-tree fine grain merging algorithm" << endl; return 0; } - if (argc < 4) { - cout << "usage: ./PipelineRTFS-NS-Diff-FGO [s] [ncg]" << endl; + if (argc < 7) { + cout << "usage: ./PipelineRTFS-NS-Diff-FGO -b -dkt -ma [-s] [-ncg]" << endl; return 0; } @@ -166,18 +168,30 @@ int main(int argc, char* argv[]) { if (mpi_rank == mpi_size-1) { // get arguments - int max_bucket_size = atoi(argv[1]); - string dakota_file = argv[2]; - int merging_algorithm = atoi(argv[3]); - bool shuffle = false; - for (int i=1; i Date: Thu, 27 Apr 2017 00:45:50 -0300 Subject: [PATCH 85/87] Reworked the directory structure of FGO and cleaned some PipelineManager code. --- runtime/ResourceManager/TrackDependencies.cpp | 12 +- .../PipelineRTFS-NS-Diff-FGO/CMakeLists.txt | 19 +- .../PipelineManager.cpp | 1143 ++--------------- .../PipelineRTFS-NS-Diff-FGO/debug_funs.hpp | 65 + .../{ => fg_reuse}/cutting_algorithms.cpp | 0 .../{ => fg_reuse}/cutting_algorithms.hpp | 0 .../{ => fg_reuse}/fgm.cpp | 105 -- .../PipelineRTFS-NS-Diff-FGO/fg_reuse/fgm.hpp | 24 + .../{ => fg_reuse}/graph/min_cut.cpp | 0 .../{ => fg_reuse}/graph/min_cut.hpp | 0 .../{ => fg_reuse}/graph/reuse_tree.cpp | 0 .../{ => fg_reuse}/graph/reuse_tree.hpp | 0 .../{ => fg_reuse}/merging.cpp | 0 .../{ => fg_reuse}/merging.hpp | 0 .../examples/PipelineRTFS-NS-Diff-FGO/fgm.hpp | 24 - .../examples/PipelineRTFS-NS-Diff-FGO/gen.cpp | 354 ----- .../{ => json}/jsoncpp | Bin .../{ => json}/jsoncpp.cpp | 2 +- .../old/GeneralPipelineComponent.cpp | 95 -- .../old/GeneralPipelineComponent.hpp | 33 - .../old/GeneralTask.cpp | 45 - .../old/GeneralTask.hpp | 38 - .../old/NormalizationComp.cpp | 64 - .../old/NormalizationComp.h | 28 - .../old/PipelineManager.cpp | 630 --------- .../old/Segmentation.cpp | 115 -- .../old/Segmentation.h | 58 - .../old/TaskNormalization.cpp | 31 - .../old/TaskNormalization.h | 32 - .../old/TaskSegmentation.cpp | 45 - .../old/TaskSegmentation.h | 38 - .../old/TaskSegmentationStg1.cpp | 37 - .../old/TaskSegmentationStg1.hpp | 44 - .../old/TaskSegmentationStg2.cpp | 24 - .../old/TaskSegmentationStg2.hpp | 34 - .../old/TaskSegmentationStg3.cpp | 23 - .../old/TaskSegmentationStg3.hpp | 33 - .../old/TaskSegmentationStg4.cpp | 29 - .../old/TaskSegmentationStg4.hpp | 37 - .../old/TaskSegmentationStg5.cpp | 27 - .../old/TaskSegmentationStg5.hpp | 35 - .../old/TaskSegmentationStg6.cpp | 27 - .../old/TaskSegmentationStg6.hpp | 33 - .../PipelineRTFS-NS-Diff-FGO/parsing.cpp | 440 +++++++ .../PipelineRTFS-NS-Diff-FGO/parsing.hpp | 61 + .../parsing_helper.cpp | 227 ++++ .../stages/CMakeLists.txt | 52 + .../{ => stages}/DiffMaskComp.cpp | 0 .../{ => stages}/DiffMaskComp.h | 0 .../{ => stages}/FeatureExtraction.cpp | 0 .../{ => stages}/FeatureExtraction.h | 0 .../{ => stages}/NormalizationComp.cpp | 0 .../{ => stages}/NormalizationComp.hpp | 0 .../{ => stages}/Segmentation.cpp | 0 .../{ => stages}/Segmentation.hpp | 0 .../{ => stages}/TaskFeatures.cpp | 0 .../{ => stages}/TaskFeatures.h | 0 57 files changed, 1022 insertions(+), 3141 deletions(-) create mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/debug_funs.hpp rename runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/{ => fg_reuse}/cutting_algorithms.cpp (100%) rename runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/{ => fg_reuse}/cutting_algorithms.hpp (100%) rename runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/{ => fg_reuse}/fgm.cpp (52%) create mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fg_reuse/fgm.hpp rename runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/{ => fg_reuse}/graph/min_cut.cpp (100%) rename runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/{ => fg_reuse}/graph/min_cut.hpp (100%) rename runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/{ => fg_reuse}/graph/reuse_tree.cpp (100%) rename runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/{ => fg_reuse}/graph/reuse_tree.hpp (100%) rename runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/{ => fg_reuse}/merging.cpp (100%) rename runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/{ => fg_reuse}/merging.hpp (100%) delete mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fgm.hpp delete mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen.cpp rename runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/{ => json}/jsoncpp (100%) rename runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/{ => json}/jsoncpp.cpp (99%) delete mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/GeneralPipelineComponent.cpp delete mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/GeneralPipelineComponent.hpp delete mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/GeneralTask.cpp delete mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/GeneralTask.hpp delete mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/NormalizationComp.cpp delete mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/NormalizationComp.h delete mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/PipelineManager.cpp delete mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/Segmentation.cpp delete mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/Segmentation.h delete mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskNormalization.cpp delete mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskNormalization.h delete mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentation.cpp delete mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentation.h delete mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg1.cpp delete mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg1.hpp delete mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg2.cpp delete mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg2.hpp delete mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg3.cpp delete mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg3.hpp delete mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg4.cpp delete mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg4.hpp delete mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg5.cpp delete mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg5.hpp delete mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg6.cpp delete mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg6.hpp create mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/parsing.cpp create mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/parsing.hpp create mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/parsing_helper.cpp create mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/stages/CMakeLists.txt rename runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/{ => stages}/DiffMaskComp.cpp (100%) rename runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/{ => stages}/DiffMaskComp.h (100%) rename runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/{ => stages}/FeatureExtraction.cpp (100%) rename runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/{ => stages}/FeatureExtraction.h (100%) rename runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/{ => stages}/NormalizationComp.cpp (100%) rename runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/{ => stages}/NormalizationComp.hpp (100%) rename runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/{ => stages}/Segmentation.cpp (100%) rename runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/{ => stages}/Segmentation.hpp (100%) rename runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/{ => stages}/TaskFeatures.cpp (100%) rename runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/{ => stages}/TaskFeatures.h (100%) diff --git a/runtime/ResourceManager/TrackDependencies.cpp b/runtime/ResourceManager/TrackDependencies.cpp index a37b7aa..abab72e 100644 --- a/runtime/ResourceManager/TrackDependencies.cpp +++ b/runtime/ResourceManager/TrackDependencies.cpp @@ -61,14 +61,14 @@ void TrackDependencies::checkDependencies(Task* task, TasksQueue* tq) { if(task->getNumberDependencies() == task->getNumberDependenciesSolved()){ // It always starts empty, and tasks are added as they are dispatched for execution tq->insertTask(task); - std::cout << "[dependency_test] stage " << task->getId() << " is solved: " - << task->getNumberDependenciesSolved() << " out of " - << task->getNumberDependencies() << std::endl; + // std::cout << "[dependency_test] stage " << task->getId() << " is solved: " + // << task->getNumberDependenciesSolved() << " out of " + // << task->getNumberDependencies() << std::endl; }else{ this->incrementCountTasksPending(); - std::cout << "[dependency_test] stage " << task->getId() << " is pending with " - << task->getNumberDependenciesSolved() << " out of " - << task->getNumberDependencies() << " deps solved" << std::endl; + // std::cout << "[dependency_test] stage " << task->getId() << " is pending with " + // << task->getNumberDependenciesSolved() << " out of " + // << task->getNumberDependencies() << " deps solved" << std::endl; } // Unlock dependency map diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/CMakeLists.txt b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/CMakeLists.txt index 6f12c80..dc5299b 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/CMakeLists.txt +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/CMakeLists.txt @@ -20,6 +20,8 @@ find_path(NSCALE_BUILD_DIR REQUIRED) set(nscalesrcdir ${NSCALE_SRC_DIR}) set(nscalebuilddir ${NSCALE_BUILD_DIR}) +# dependencies for FGO +#add_subdirectory("fg_reuse") #includes include_directories(${nscalesrcdir}/segment) @@ -36,10 +38,17 @@ link_directories(${nscalebuilddir}/lib) # Create library with components implementation set(libname componentnsdifffgo) +# Json lib +set(libjson json/jsoncpp.cpp) + +# Stages lib - For some reason the subdirectory doesn't work (on PipelineManager.cpp:813 the ComponentFactory appear not to be linked with the stages lib) +#include_directories(${CMAKE_CURRENT_LIST_DIR}/stages) +#link_directories(${CMAKE_CURRENT_LIST_DIR}/stages) +#add_subdirectory("stages") +set(libstages stages/NormalizationComp.cpp stages/Segmentation.cpp stages/FeatureExtraction.cpp stages/TaskFeatures.cpp stages/DiffMaskComp.cpp) + # Source files used by the Runtime System -set(libcomponentssrcs NormalizationComp.cpp Segmentation.cpp FeatureExtraction.cpp - TaskFeatures.cpp DiffMaskComp.cpp jsoncpp.cpp graph/min_cut.cpp graph/reuse_tree.cpp - merging.cpp fgm.cpp cutting_algorithms.cpp) +set(libcomponentssrcs fg_reuse/graph/min_cut.cpp fg_reuse/graph/reuse_tree.cpp fg_reuse/merging.cpp fg_reuse/fgm.cpp fg_reuse/cutting_algorithms.cpp parsing.cpp parsing_helper.cpp) set(libcomparativeanalysis ../../comparativeanalysis/TaskDiffMask.cpp ../../comparativeanalysis/pixelcompare/PixelCompare.cpp) @@ -48,11 +57,12 @@ set(libcomparativeanalysis ../../comparativeanalysis/TaskDiffMask.cpp add_custom_target(copyCacheConfToPipelineRTFS-NS-Diff-FGO COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/cache-conf/rtconf.xml ${CMAKE_CURRENT_BINARY_DIR}) # Add rule to generate the Runtime System, as a shared library (.so) -add_library("${libname}" SHARED ${libcomponentssrcs} ${libcomparativeanalysis}) +add_library("${libname}" SHARED ${libcomponentssrcs} ${libcomparativeanalysis} ${libjson} ${libstages}) #set_target_properties("${libname}" PROPERTIES LINK_FLAGS "${MPI_LINK_FLAGS}") target_link_libraries("${libname}" runtimesystem) target_link_libraries(${libname} regiontemplates) +#target_link_libraries(${libname} componentnsdifffgostages) # nscale libs target_link_libraries("${libname}" segment normalization featuresAll ${OpenCV_LIBS}) @@ -64,3 +74,4 @@ add_dependencies(PipelineRTFS-NS-Diff-FGO copyCacheConfToPipelineRTFS-NS-Diff-FG # Link the executable to the runtime system library target_link_libraries(PipelineRTFS-NS-Diff-FGO runtimesystem "${libname}") target_link_libraries(PipelineRTFS-NS-Diff-FGO regiontemplates) +#target_link_libraries(PipelineRTFS-NS-Diff-FGO componentnsdifffgostages) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp index 45c5fb7..8bde382 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/PipelineManager.cpp @@ -9,131 +9,38 @@ #include #include #include -#include #include #include #include -#include "json/json.h" - #include "SysEnv.h" #include "Argument.h" #include "PipelineComponentBase.h" #include "RTPipelineComponentBase.h" #include "RegionTemplateCollection.h" #include "ReusableTask.hpp" -#include "graph/min_cut.hpp" -#include "graph/reuse_tree.hpp" - -#include "merging.hpp" -#include "fgm.hpp" - -using namespace std; - -namespace parsing { -enum port_type_t { - int_t, string_t, float_t, float_array_t, rt_t, error -}; -} - -// general xml field structure -typedef struct { - string type; - string data; -} general_field_t; - -void mapprint(map mapp) { - for (pair p : mapp) - cout << p.first << ":" << p.second->getName() << endl; -} - -void mapprint(map> mapp) { - for (pair> p : mapp) { - // for (map::iterator i=map.begin(); i!=map.end();i++) - cout << p.first << ":" << endl; - for (ArgumentBase* a : p.second) - cout << "\t" << a->getName() << ":" << a->toString() << endl; - } -} -void mapprint(map mapp) { - for (map::iterator i=mapp.begin(); i!=mapp.end();i++) - cout << i->first << ":" << i->second->getName() << endl; -} - -void listprint(list mapp) { - for (list::iterator i=mapp.begin(); i!=mapp.end();i++) - cout << (*i)->getId() << ":" << (*i)->getName() << endl; -} - -void adj_mat_print(mincut::weight_t** adjMat, size_t n) { - for (int i=0; i id2task, size_t n) { - cout << "x\t"; - for (int i=0; i &workflow_inputs, - map> ¶meters_values); -void get_outputs_from_file(FILE* workflow_descriptor, map &workflow_outputs); -void get_stages_from_file(FILE* workflow_descriptor, map &base_stages, - map &interstage_arguments); -void connect_stages_from_file(FILE* workflow_descriptor, map &base_stages, - map &interstage_arguments, map &input_arguments, - map> &deps, map &workflow_outputs); -void expand_stages(const map &args, map> args_values, - map &expanded_args,map stages, - map &expanded_stages, map &workflow_outputs); +#include "debug_funs.hpp" +using namespace std; -// TODO: place these two on a cgm namespace. currently on fgm.cpp +// Workflow generation functions void generate_drs(RegionTemplate* rt, const map &expanded_args); void generate_drs(RegionTemplate* rt, PipelineComponentBase* stage, const std::map &expanded_args); void add_arguments_to_stages(map &merged_stages, map &merged_arguments, string name="tile"); - - void generate_pre_defined_stages(FILE* parameters_values_file, map args, map base_stages, map& workflow_outputs, map& expanded_args, map& expanded_stages, bool use_coarse_grain=true, bool clustered_generation=false); -// Workflow parsing helper functions -list line_buffer; -int get_line(char** line, FILE* f); -string get_workflow_name(FILE* workflow); -string get_workflow_field(FILE* workflow, string field); -void get_workflow_arguments(FILE* workflow, list &output_arguments); -vector get_all_fields(FILE* workflow, string start, string end); -PipelineComponentBase* find_stage(map stages, string name); -int find_stage_id(map stages, string name); -ArgumentBase* find_argument(const map& arguments, string name); -ArgumentBase* find_argument(const list& arguments, int id); -ArgumentBase* find_argument(const list& arguments, string name); -ArgumentBase* new_typed_arg_base(string type); -parsing::port_type_t get_port_type(string s); - int main(int argc, char* argv[]) { // verify arguments @@ -206,24 +113,9 @@ int main(int argc, char* argv[]) { map> parameters_values; get_inputs_from_file(workflow_descriptor, workflow_inputs, parameters_values); - // cout << "workflow_inputs:" << endl; - // for (pair p : workflow_inputs) - // cout << p.first << ":" << p.second->getName() << endl; - - // cout << endl << "parameters_values:" << endl; - // for (pair> p : parameters_values) { - // cout << "argument " << p.first << ":" << workflow_inputs[p.first]->getName() << ":" << endl; - // for (ArgumentBase* a : p.second) - // cout << "\t" << a->toString() << endl; - // } - // get all workflow outputs map workflow_outputs; get_outputs_from_file(workflow_descriptor, workflow_outputs); - // cout << endl << "workflow_outputs " << endl; - // mapprint(workflow_outputs); - // for (pair p : workflow_outputs) - // cout << p.second->getId() << ":" << p.second->getName() << endl; // get all stages, also setting the uid from this context to Task (i.e Task::setId()) // also returns the list of arguments used @@ -231,24 +123,6 @@ int main(int argc, char* argv[]) { map base_stages; map interstage_arguments; get_stages_from_file(workflow_descriptor, base_stages, interstage_arguments); - // cout << endl << "base_stages:" << endl; - // for (pair p : base_stages) { - // cout << p.first << ":" << p.second->getName() << endl; - // cout << "\toutputs: " << p.second->getOutputs().size() << endl << endl; - // for (int i : p.second->getOutputs()) - // cout << "\t\t" << i << ":" << interstage_arguments[i]->getName() << endl; - // cout << "\t task descriptors:" << endl; - // for (pair> d : p.second->tasksDesc) { - // cout << "\t\ttask: " << d.first << endl; - // for (ArgumentBase* a : d.second) - // cout << "\t\t\t" << a->getName() << endl; - // } - // } - - - // cout << endl << "interstage_arguments:" << endl; - // for (pair p : interstage_arguments) - // cout << p.first << ":" << p.second->getName() << endl; // this map is a dependency structure: stage -> dependency_list map> deps; @@ -260,25 +134,6 @@ int main(int argc, char* argv[]) { for (pair a : interstage_arguments) all_argument[a.first] = a.second; - // mapprint(all_argument); - - // cout << endl << "all_arguments:" << endl; - // for (pair p : all_argument) { - // cout << p.second->getId() << ":" << p.second->getName() - // << " parent " << p.second->getParent() << endl; - // } - - // cout << endl << "connected base_stages:" << endl; - // for (pair p : base_stages) { - // cout << p.first << ":" << p.second->getName() << endl; - // cout << "\tinputs: " << p.second->getInputs().size() << endl; - // for (int i : p.second->getInputs()) - // cout << "\t\t" << i << ":" << all_argument[i]->getName() << endl; - // cout << "\toutputs: " << p.second->getOutputs().size() << endl; - // for (int i : p.second->getOutputs()) - // cout << "\t\t" << i << ":" << all_argument[i]->getName() << endl; - // } - //------------------------------------------------------------ // Iterative merging of stages //------------------------------------------------------------ @@ -298,25 +153,10 @@ int main(int argc, char* argv[]) { generate_pre_defined_stages(parameters_values_file, args, base_stages, workflow_outputs, expanded_args, expanded_stages, use_coarse_grain); - cout << endl<< "merged: " << endl; - for (pair p : expanded_stages) { - cout << "stage " << p.second->getId() << ":" << p.second->getName() << endl; - cout << "\tinputs: " << endl; - for (int i : p.second->getInputs()) - cout << "\t\t" << i << ":" << expanded_args[i]->getName() << " = " - << expanded_args[i]->toString() << endl; - cout << "\toutputs: " << endl; - for (int i : p.second->getOutputs()) - cout << "\t\t" << i << ":" << expanded_args[i]->getName() << endl; - } - - // cout << endl << "merged args" << endl; - // for (pair p : expanded_args) - // cout << "\t" << p.first << ":" << p.second->getName() << " = " - // << p.second->toString() << " sized: " << p.second->size() << endl; + // mapprint(expanded_stages, expanded_args); + // mapprint(expanded_args); // add arguments to each stage - cout << endl << "add_arguments_to_stages" << endl; add_arguments_to_stages(expanded_stages, expanded_args); map merged_stages; @@ -335,17 +175,6 @@ int main(int argc, char* argv[]) { merge_time_f << merge_time << "\t"; merge_time_f.close(); - // cout << endl<< "merged-fine before deps resolution: " << endl; - // for (pair p : merged_stages) { - // string s = p.second->reused!=NULL?" - reused":""; - // cout << "stage " << p.second->getId() << ":" << p.second->getName() << s << endl; - // cout << "\ttasks: " << endl; - // for (ReusableTask* t : p.second->tasks) { - // cout << "\t\t" << t->getId() << ":" << t->getTaskName() << endl; - // cout << "\t\t\tparent_task: " << t->parentTask << endl; - // } - // } - // resolve dependencies of reused stages for (pair p : merged_stages) { // add correct stage dependencies @@ -378,34 +207,8 @@ int main(int argc, char* argv[]) { } } } - - // replace arguments with clones to avoid double free when stages are finished - // map args_clones; - // for (ArgumentBase* a : p.second->getArguments()) { - // ArgumentBase* cpy = a->clone(); - // cpy->setId(new_uid()); - // args_clones[a->getId()] = cpy; - // } - // for (pair a : args_clones) - // p.second->replaceArgument(a.first, a.second); } - // ofstream solution_file; - // solution_file.open("fine-grain-merging-solution-b" + to_string(max_bucket_size), ios::app); - // cout << endl<< "merged-fine: " << endl; - // solution_file << endl<< "merged-fine: " << endl; - // for (pair p : merged_stages) { - // string s = p.second->reused!=NULL ? " - reused" : (" with " + to_string(p.second->tasks.size()) + " tasks"); - // cout << "stage " << p.second->getId() << ":" << p.second->getName() << s << endl; - // solution_file << "stage " << p.second->getId() << ":" << p.second->getName() << s << endl; - // cout << "\ttasks: " << endl; - // for (ReusableTask* t : p.second->tasks) { - // cout << "\t\t" << t->getId() << ":" << t->getTaskName() << endl; - // cout << "\t\t" << t->getId() << ":" << t->getTaskName() << endl; - // } - // } - // solution_file.close(); - //------------------------------------------------------------ // Add workflows to Manager to be executed //------------------------------------------------------------ @@ -424,7 +227,6 @@ int main(int argc, char* argv[]) { if (s.second->reused == NULL) { // generate the data regions for each stage - cout << endl << "generate_drs" << endl; generate_drs(((RTPipelineComponentBase*)s.second)-> getRegionTemplateInstance("tile"), s.second, expanded_args); @@ -452,11 +254,6 @@ int main(int argc, char* argv[]) { // workaround to make sure that the RTs, if any, won't leak on this part of the algorithm s.second->setLocation(PipelineComponentBase::MANAGER_SIDE); - - // cout << "[dependency_test] stage " << s.second->getId() << " with " - // << s.second->getNumberDependencies() << " dependencies and " - // << s.second->getNumberDependenciesSolved() << " solved." << endl; - sysEnv.executeComponent(s.second); } } @@ -505,441 +302,112 @@ int main(int argc, char* argv[]) { } /***************************************************************/ -/***************** Arguments parsing functions *****************/ -/***************************************************************/ - -int find_arg_pos(string s, int argc, char** argv) { - for (int i=1; i &workflow_inputs, - map> ¶meters_values) { - - char *line = NULL; - size_t len = 0; - - // initial ports section beginning and end - string ip(""); - string ipe(""); - - // ports section beginning and end - string p(""); - string pe(""); - - // argument name, stored before to be consumed when the ArgumentBase type can be set - string name; - - // go to the initial ports beginning - while (get_line(&line, workflow_descriptor) != -1 && string(line).find(ip) == string::npos) - delete line; - // cout << "port init begin: " << line << endl; - - // keep getting ports until it reaches the end of initial ports - while (get_line(&line, workflow_descriptor) != -1 && string(line).find(ipe) == string::npos) { - // consumes the port beginning - while (string(line).find(p) == string::npos && get_line(&line, workflow_descriptor) != -1) { - delete line; - line = NULL; - } - - if (line != NULL) - delete line; - // cout << "port begin: " << line << endl; - - // finds the name field - name = get_workflow_name(workflow_descriptor); - // cout << "name: " << name << endl; - - // finds the description field - string description = get_workflow_field(workflow_descriptor, "text"); - // cout << "description: " << description << endl; - - // parse the description to get the input value(s) - Json::Reader reader; - bool wellFormed; - Json::Value data; - wellFormed = reader.parse(description, data, false); - if(!wellFormed) { - cout << "Failed to parse JSON: " << description << endl << reader.getFormattedErrorMessages() << endl; - exit(-3); - } - - // create the propper Argument object for each type case also getting - // the parameters' values - ArgumentBase* inp_arg; - list inp_values; - switch (get_port_type(data["type"].asString())) { - case parsing::int_t: - // create the argument - inp_arg = new ArgumentInt(); - // cout << "int argument: " << name << ", values: " << endl; - // get all possible values for the argument - for (int i=0; itoString() << endl; - inp_values.emplace_back(val); - } - // cout << endl; - break; - case parsing::string_t: - // create the argument - inp_arg = new ArgumentString(); - // cout << "string argument: " << name << ", values: " << endl; - // get all possible values for the argument - for (int i=0; itoString() << endl; - inp_values.emplace_back(val); - } - // cout << endl; - break; - case parsing::float_t: - // create the argument - inp_arg = new ArgumentFloat(); - // cout << "float argument: " << name << ", values: " << endl; - // get all possible values for the argument - for (int i=0; itoString() << endl; - inp_values.emplace_back(val); - } - // cout << endl; - break; - case parsing::float_array_t: - // create the argument - inp_arg = new ArgumentFloatArray(); - // cout << "floatarray argument: " << name << ", values: " << endl; - // get all possible values for the argument - for (int i=0; iaddArgValue(temp); - // cout << temp.toString() << endl; - } - // cout << "]"; - inp_values.emplace_back(val); - } - // cout << endl; - break; - case parsing::rt_t: - // create the argument - inp_arg = new ArgumentRT(); - // cout << "string argument: " << name << ", values: " << endl; - // get all possible values for the argument - for (int i=0; iisFileInput = true; - // cout << ((ArgumentString*)val)->toString() << endl; - inp_values.emplace_back(val); - } - // cout << endl; - break; - default: - exit(-4); - } - - // set inp_arg name, id and input type - inp_arg->setName(name); - int arg_id = new_uid(); - inp_arg->setId(arg_id); - inp_arg->setIo(ArgumentBase::input); - - // add input argument to map - workflow_inputs[arg_id] = inp_arg; - - // add list of argument values to map - parameters_values[arg_id] = inp_values; - - // consumes the port ending - while (get_line(&line, workflow_descriptor) != -1 && string(line).find(pe) == string::npos) - delete line; - // cout << "not port end: " << line << endl; - // cout << "port end: " << line << endl; - } -} - -// returns by reference a map of output arguments, mapped by an uid, 'workflow_outputs' -void get_outputs_from_file(FILE* workflow_descriptor, map &workflow_outputs) { - - char *line = NULL; - size_t len = 0; - - // initial ports section beginning and end - string ip(""); - string ipe(""); - - // ports section beginning and end - string p(""); - string pe(""); - - // go to the initial ports beginning - while (get_line(&line, workflow_descriptor) != -1 && string(line).find(ip) == string::npos) - delete line; - // cout << "port init begin: " << line << endl; - - // keep getting ports until it reaches the end of initial ports - while (get_line(&line, workflow_descriptor) != -1 && string(line).find(ipe) == string::npos) { - // consumes the port beginning - while (string(line).find(p) == string::npos && get_line(&line, workflow_descriptor) != -1) { - delete line; - line = NULL; - } - if (line != NULL) - delete line; - // cout << "port begin: " << line << endl; - - // finds the name field - string name = get_workflow_name(workflow_descriptor); - // cout << "name: " << name << endl; - - // finds the description field - string description = get_workflow_field(workflow_descriptor, "text"); - // cout << "description: " << description << endl; - - // parse the description to get the input value(s) - Json::Reader reader; - bool wellFormed; - Json::Value data; - - wellFormed = reader.parse(description, data, false); - if(!wellFormed) { - cout << "Failed to parse JSON: " << description << endl << reader.getFormattedErrorMessages() << endl; - exit(-3); - } - - // create the propper Argument object for each type case also getting - // the parameters' values - ArgumentBase* out_arg; - switch (get_port_type(data["type"].asString())) { - case parsing::int_t: - // create the argument - out_arg = new ArgumentInt(); - // cout << "int output: " << name << endl; - break; - case parsing::string_t: - // create the argument - out_arg = new ArgumentString(); - // cout << "string output: " << name << endl; - break; - case parsing::float_t: - // create the argument - out_arg = new ArgumentFloat(); - // cout << "float output: " << name << endl; - break; - case parsing::float_array_t: - // create the argument - out_arg = new ArgumentFloatArray(); - // cout << "floatarray output: " << name << endl; - break; - case parsing::rt_t: - // create the argument - out_arg = new ArgumentRT(); - // cout << "string output: " << name << endl; - break; - default: - exit(-4); +void generate_drs(RegionTemplate* rt, + const std::map &expanded_args) { + + // verify every argument + for (pair p : expanded_args) { + // if an argument is a region template data region + if (p.second->getType() == ArgumentBase::RT) { + if (((ArgumentRT*)p.second)->isFileInput) { + // create the data region and add it to the input region template + DenseDataRegion2D *ddr2d = new DenseDataRegion2D(); + ddr2d->setName(p.second->getName()); + std::ostringstream oss; + oss << p.first; + ddr2d->setId(oss.str()); + ddr2d->setVersion(p.first); + ddr2d->setIsAppInput(true); + ddr2d->setInputType(DataSourceType::FILE_SYSTEM); + ddr2d->setOutputType(DataSourceType::FILE_SYSTEM); + ddr2d->setInputFileName(p.second->toString()); + rt->insertDataRegion(ddr2d); + } } - - out_arg->setName(name); - out_arg->setIo(ArgumentBase::output); - int new_id = new_uid(); - out_arg->setId(new_id); - workflow_outputs[new_id] = out_arg; - - // consumes the port ending - while (get_line(&line, workflow_descriptor) != -1 && string(line).find(pe) == string::npos) - delete line; - // get_line << "not port end: " << line << endl; - // cout << "port end: " << line << endl; } - // cout << "port init end: " << line << endl; } -// returns by reference the map of stages on its uid, 'base_stages', and also a map -// of all output arguments of all stages on its uid, 'interstage_arguments'. -void get_stages_from_file(FILE* workflow_descriptor, - map &base_stages, - map &interstage_arguments) { - - char *line = NULL; - size_t len = 0; - - string ps(""); - string pse(""); - - string p(""); - string pe(""); - - // go to the processors beginning - while (get_line(&line, workflow_descriptor) != -1 && string(line).find(ps) == string::npos) - delete line; - // cout << "not processor init begin: " << line << endl; - // cout << "processor init begin: " << line << endl; - - // keep getting single processors until it reaches the end of all processors - while (get_line(&line, workflow_descriptor) != -1 && string(line).find(pse) == string::npos) { - // consumes the processor beginning - while (string(line).find(p) == string::npos && get_line(&line, workflow_descriptor) != -1) { - delete line; - line = NULL; - } - - if (line != NULL) - delete line; - - // cout << "processor begin: " << line << endl; - - // get stage fields - string name = get_workflow_name(workflow_descriptor); - // cout << "name: " << name << endl; - - // get stage command - string command = get_workflow_field(workflow_descriptor, "command"); - // cout << "command: " << command << endl; - - PipelineComponentBase* stage = PipelineComponentBase::ComponentFactory::getComponentFactory(command)(); - stage->setName(name); - - // workaround to make sure that the RTs, if any, won't leak on the mearging part of the algorithm - stage->setLocation(PipelineComponentBase::WORKER_SIDE); - - // get outputs and add them to the map of arguments - // list inputs = get_workflow_ports(workflow_descriptor, "inputPorts"); - // cout << "outputs:" << endl; - list outputs; - get_workflow_arguments(workflow_descriptor, outputs); - for(list::iterator i=outputs.begin(); i!=outputs.end(); i++) { - // cout << "\t" << (*i)->getId() << ":" << (*i)->getName() << endl; - interstage_arguments[(*i)->getId()] = *i; - stage->addOutput((*i)->getId()); +void generate_drs(RegionTemplate* rt, PipelineComponentBase* stage, + const std::map &expanded_args) { + + // verify every argument + for (int inp : stage->getInputs()) { + // if an argument is a region template data region + if (expanded_args.at(inp)->getType() == ArgumentBase::RT) { + // if (((ArgumentRT*)expanded_args.at(inp))->isFileInput) { + // create the data region and add it to the input region template + DenseDataRegion2D *ddr2d = new DenseDataRegion2D(); + ddr2d->setName(expanded_args.at(inp)->getName()); + std::ostringstream oss; + oss << inp; + ddr2d->setId(oss.str()); + ddr2d->setVersion(inp); + ddr2d->setIsAppInput(true); + ddr2d->setInputType(DataSourceType::FILE_SYSTEM); + ddr2d->setOutputType(DataSourceType::FILE_SYSTEM); + ddr2d->setInputFileName(expanded_args.at(inp)->toString()); + rt->insertDataRegion(ddr2d); + // } } - - int stg_id = new_uid(); - // cout << "uid: " << stg_id << endl; - // setting task id - stage->setId(stg_id); - base_stages[stg_id] = stage; - - // consumes the processor ending - while (get_line(&line, workflow_descriptor) != -1 && string(line).find(pe) == string::npos) - delete line; - // cout << "not processor end: " << line << endl; - // cout << "processor end: " << line << endl; } } -// returns by reference the map of stages to its ids updated. each stage now has -// the list of input ids -void connect_stages_from_file(FILE* workflow_descriptor, - map &base_stages, - map &interstage_arguments, - map &input_arguments, - map> &deps, - map &workflow_outputs) { - - char *line = NULL; - size_t len = 0; - - string ds(""); - string dse(""); - - string d(""); - string de(""); - - string sink(""); - - string source(""); - - // go to the datalinks beginning - while (get_line(&line, workflow_descriptor) != -1 && string(line).find(ds) == string::npos) - delete line; - // cout << "not datalink init begin" << line << endl; - // cout << "datalink init begin" << line << endl; - - // keep getting single datalinks until it reaches the end of all datalinks - while (get_line(&line, workflow_descriptor) != -1 && string(line).find(dse) == string::npos) { - // consumes the datalink beginning - while (string(line).find(d) == string::npos && get_line(&line, workflow_descriptor) != -1) { - delete line; - line = NULL; - } - - if (line != NULL) - delete line; - - // cout << "datalink begin" << line << endl; - - // get sink and source fields - vector all_sink_fields = get_all_fields(workflow_descriptor, sink, sinke); - vector all_source_fields = get_all_fields(workflow_descriptor, source, sourcee); - - // verify if it's a task sink instead of a workflow sink - if (all_sink_fields.size() != 1) { - // get the sink stage - PipelineComponentBase* sink_stg = find_stage(base_stages, all_sink_fields[0].data); - // cout << "stage " << sink_stg->getId() << ":" << sink_stg->getName() << " sink" << endl; - - ArgumentBase* arg; - // check whether the source is from the workflow arguments or another stage - if (all_source_fields.size() == 1) { - // if source is workflow argument: - arg = find_argument(input_arguments, all_source_fields[0].data); - // cout << "source from workflow is " << arg->getId() << ":" << arg->getName() << endl; - } else { - // if the source is another stage - deps[sink_stg->getId()].emplace_back(find_stage(base_stages, all_source_fields[0].data)->getId()); - arg = find_argument(interstage_arguments, all_source_fields[1].data); - arg->setParent(find_stage(base_stages, all_source_fields[0].data)->getId()); - // cout << "source from stage " << all_source_fields[0].data << " is " << arg->getId() << ":" - // << arg->getName() << " parent " << arg->getParent() << endl; +void add_arguments_to_stages(std::map &merged_stages, + std::map &merged_arguments, string name) { + + int i=0; + for (pair&& stage : merged_stages) { + // create the RT isntance + RegionTemplate *rt = new RegionTemplate(); + rt->setName(name); + + // add input arguments to stage, adding them as RT as needed + for (int arg_id : stage.second->getInputs()) { + ArgumentBase* new_arg = merged_arguments[arg_id]->clone(); + new_arg->setParent(merged_arguments[arg_id]->getParent()); + stage.second->addArgument(new_arg); + if (new_arg->getType() == ArgumentBase::RT) { + // std::cout << "input RT : " << merged_arguments[arg_id]->getName() << std::endl; + // insert the region template on the parent stage if the argument is a DR and if the RT wasn't already added + if (((RTPipelineComponentBase*)stage.second)-> + getRegionTemplateInstance(rt->getName()) == NULL) { + ((RTPipelineComponentBase*)stage.second)->addRegionTemplateInstance(rt, rt->getName()); + } + ((RTPipelineComponentBase*)stage.second)->addInputOutputDataRegion( + rt->getName(), new_arg->getName(), RTPipelineComponentBase::INPUT); + } + if (merged_arguments[arg_id]->getParent() != 0) { + // verify if the dependency stage was reused + int parent = merged_arguments[arg_id]->getParent(); + // std::cout << "[before]Dependency: " << stage.second->getId() << ":" << stage.second->getName() + // << " ->addDependency( " << parent << " )" << std::endl; + if (merged_stages[merged_arguments[arg_id]->getParent()]->reused != NULL) + parent = merged_stages[merged_arguments[arg_id]->getParent()]->reused->getId(); + // std::cout << "Dependency: " << stage.second->getId() << ":" << stage.second->getName() + // << " ->addDependency( " << parent << " )" << std::endl; + ((RTPipelineComponentBase*)stage.second)->addDependency(parent); } - - // add the link to the sink stage - sink_stg->addInput(arg->getId()); - } - else { - // cout << "workflow argument sink: " << all_sink_fields[0].data << endl; - // update workflow output id in order to access it later to retreive the output - - ArgumentBase* itstg_argument = find_argument(interstage_arguments, all_source_fields[1].data); - // cout << "Output " << all_sink_fields[0].data << " connects to argument " << itstg_argument->getId() << - // ":" << itstg_argument->getName() << endl; - ArgumentBase* output = find_argument(workflow_outputs, all_sink_fields[0].data); - // cout << "Output " << all_sink_fields[0].data << " had id " << output->getId() << endl; - - // remove reference of old id from map - workflow_outputs.erase(output->getId()); - - // update the output id - output->setId(itstg_argument->getId()); - // cout << "Output " << all_sink_fields[0].data << " now has id " << output->getId() << endl; - - // re-insert the output with the new id - workflow_outputs[output->getId()] = output; } - // consumes the datalink ending - bool cond = string(line).find(de) == string::npos; - while (cond && get_line(&line, workflow_descriptor) != -1) { - cond = string(line).find(de) == string::npos; - delete line; + // add output arguments to stage, adding them as RT as needed + for (int arg_id : stage.second->getOutputs()) { + ArgumentBase* new_arg = merged_arguments[arg_id]->clone(); + new_arg->setParent(merged_arguments[arg_id]->getParent()); + new_arg->setIo(ArgumentBase::output); + stage.second->addArgument(new_arg); + if (merged_arguments[arg_id]->getType() == ArgumentBase::RT) { + // std::cout << "output RT : " << merged_arguments[arg_id]->getName() << std::endl; + // insert the region template on the parent stage if the argument is a DR and if the RT wasn't already added + if (((RTPipelineComponentBase*)stage.second)->getRegionTemplateInstance(rt->getName()) == NULL) + ((RTPipelineComponentBase*)stage.second)->addRegionTemplateInstance(rt, rt->getName()); + ((RTPipelineComponentBase*)stage.second)->addInputOutputDataRegion(rt->getName(), + merged_arguments[arg_id]->getName(), RTPipelineComponentBase::OUTPUT); + } } - // cout << "datalink end" << line << endl; } } @@ -1009,11 +477,6 @@ bool all_inps_in(list inps, map> ref) { return true; } -// WARNING: When using fine-grain reuse with clustered stage generation the merging of stages -// can make diff stages be added to be executed (executeComponent) before its dependency, -// thus causing the diff stage to have all dependencies solved. Thereby, unless the order -// of 'expanded_stages' is fixed before sending the stages to be executed, clustered generation -// shouldn't be used with fine-grain reuse. void generate_pre_defined_stages(FILE* parameters_values_file, map args, map base_stages, map& workflow_outputs, map& expanded_args, map& expanded_stages, @@ -1121,61 +584,53 @@ void generate_pre_defined_stages(FILE* parameters_values_file, map base_stages_l; - // also create an empty list of arguments of each stage in order to perform coarse-grain merging - map> arg_values_list; - for (pair&& p : base_stages) { - base_stages_l.emplace_back(p.second); - arg_values_list[p.second->getId()].size(); - } - - // iterate through each parameter set, creating a workflow for each set - for (pair>&& par_set : stages_arguments) { - // iterate through all stages of the workflow model, generating the stages - for (list::iterator p = base_stages_l.begin(); - p != base_stages_l.end();) { - - // attempt to find a stage witch has all inputs expanded either on the workflow inputs or interstage ones - // cout << "checking stage " << (*p)->getName() << " with a parameter_set of size " << par_set.second.size() << endl; - if (all_inps_in((*p)->getInputs(), args, input_arguments, args_values)) { - // cout << "stage " << (*p)->getName() << " has all inputs" << endl; + // keep expanding stages until there is no stage left + while (base_stages.size() != 0) { + // cout << "base_stages size: " << base_stages.size() << endl; + for (pair p : base_stages) { + // attempt to find a stage witch has all inputs expanded either on the workflow inputs or interstage ones + // cout << "checking stage " << p.second->getName() << endl; + if (all_inps_in(p.second->getInputs(), args, input_arguments, args_values)) { + // cout << "stage " << p.second->getName() << " has all inputs" << endl; - // A list of concatenated arg values, used as a quick way to verify if a stage with - // the same args was already created. - // map arg_values_list; + // A list of concatenated arg values, used as a quick way to verify if a stage with + // the same args was already created. + map arg_values_list; - PipelineComponentBase* tmp = (*p)->clone(); + // expands all input values of stage p + for (pair> as : stages_arguments) { + PipelineComponentBase* tmp = p.second->clone(); string arg_values = ""; - // add all arguments from stages_arguments that belong to stage (*p) - for (int inp_id : (*p)->getInputs()) { - // cout << "checking input " << args[inp_id]->getName() << " of " << (*p)->getName() << endl; - for (ArgumentBase* a : par_set.second) { + // add all arguments from stages_arguments that belong to stage p.second + for (int inp_id : p.second->getInputs()) { + // cout << "checking input " << args[inp_id]->getName() << " of " << p.second->getName() << " with " << as.second.size() << " parameters" << endl; + for (ArgumentBase* a : as.second) { // cout << "checking arg " << a->getName() << ":" << a->getId() << endl; if (args.at(inp_id)->getName().compare(a->getName())==0) { arg_values += to_string(a->getId()); tmp->addInput(a->getId()); + // tmp->addArgument(a->clone()); // cout << "added arg " << a->getName() << ":" << a->getId() << " = " << a->toString() << endl; break; } } } - // cout << "[arg_values] " << arg_values << endl; - map::iterator it = arg_values_list[tmp->getId()].find(arg_values); + // cout << "[arg_values] " << arg_values << endl; + map::iterator it = arg_values_list.find(arg_values); // verify if there is no other stage with the same values - if (it == arg_values_list[tmp->getId()].end() || !use_coarse_grain) { + if (it == arg_values_list.end() || !use_coarse_grain) { // add current stage and args values to be compared later - arg_values_list[tmp->getId()][arg_values] = tmp; + arg_values_list[arg_values] = tmp; // finishes to generate the stage - tmp->setId(new_uid()); - tmp->setName((*p)->getName()); + int id = new_uid(); + tmp->setId(id); + tmp->setName(p.second->getName()); tmp->setLocation(PipelineComponentBase::WORKER_SIDE); // generate outputs - for (int out_id : (*p)->getOutputs()) { + for (int out_id : p.second->getOutputs()) { int new_id = new_uid(); ArgumentBase* ab_cpy = args.at(out_id)->clone(); ab_cpy->setName(args.at(out_id)->getName()); @@ -1184,31 +639,7 @@ void generate_pre_defined_stages(FILE* parameters_values_file, mapreplaceOutput(out_id, new_id); // add stage's output arguments to current workflow's argument list - - // cout << "[]" << endl; - // for (ArgumentBase* sss : stages_arguments[par_set.first]) - // cout << "\t" << sss->getId() << ":" << sss->getName() << " = " << sss->toString() << endl; - // cout << "second" << endl; - // for (ArgumentBase* sss : par_set.second) - // cout << "\t" << sss->getId() << ":" << sss->getName() << " = " << sss->toString() << endl; - - stages_arguments[par_set.first].push_back(ab_cpy); - - // cout << "[]" << endl; - // for (ArgumentBase* sss : stages_arguments[par_set.first]) - // cout << "\t" << sss->getId() << ":" << sss->getName() << " = " << sss->toString() << endl; - // cout << "second" << endl; - // for (ArgumentBase* sss : par_set.second) - // cout << "\t" << sss->getId() << ":" << sss->getName() << " = " << sss->toString() << endl; - - par_set.second.push_back(ab_cpy); - - // cout << "[]" << endl; - // for (ArgumentBase* sss : stages_arguments[par_set.first]) - // cout << "\t" << sss->getId() << ":" << sss->getName() << " = " << sss->toString() << endl; - // cout << "second" << endl; - // for (ArgumentBase* sss : par_set.second) - // cout << "\t" << sss->getId() << ":" << sss->getName() << " = " << sss->toString() << endl; + stages_arguments[as.first].emplace_back(ab_cpy); // add output to interstage args map args_values.emplace_back(ab_cpy); @@ -1222,104 +653,17 @@ void generate_pre_defined_stages(FILE* parameters_values_file, mapsecond->getId() << endl; - stages_arguments[par_set.first].emplace_back(find_argument(args_values, out_id)); - par_set.second.emplace_back(find_argument(args_values, out_id)); + stages_arguments[as.first].emplace_back(find_argument(args_values, out_id)); } // TODO: solve mem leaking // delete tmp; } - p++; - } else { - // since the stage isn't yet ready, replace it in the last position of the stage list - // cout << "stage " << (*p)->getName() << " doesen't have all inputs - being placed last now" << endl; - base_stages_l.emplace_back(*p); - p = base_stages_l.erase(p); } - } - } - } else { - // keep expanding stages until there is no stage left - while (base_stages.size() != 0) { - // cout << "base_stages size: " << base_stages.size() << endl; - for (pair p : base_stages) { - // attempt to find a stage witch has all inputs expanded either on the workflow inputs or interstage ones - // cout << "checking stage " << p.second->getName() << endl; - if (all_inps_in(p.second->getInputs(), args, input_arguments, args_values)) { - // cout << "stage " << p.second->getName() << " has all inputs" << endl; - - // A list of concatenated arg values, used as a quick way to verify if a stage with - // the same args was already created. - map arg_values_list; - - // expands all input values of stage p - for (pair> as : stages_arguments) { - PipelineComponentBase* tmp = p.second->clone(); - string arg_values = ""; - // add all arguments from stages_arguments that belong to stage p.second - for (int inp_id : p.second->getInputs()) { - // cout << "checking input " << args[inp_id]->getName() << " of " << p.second->getName() << " with " << as.second.size() << " parameters" << endl; - for (ArgumentBase* a : as.second) { - // cout << "checking arg " << a->getName() << ":" << a->getId() << endl; - if (args.at(inp_id)->getName().compare(a->getName())==0) { - arg_values += to_string(a->getId()); - tmp->addInput(a->getId()); - // tmp->addArgument(a->clone()); - // cout << "added arg " << a->getName() << ":" << a->getId() << " = " << a->toString() << endl; - break; - } - } - } - - // cout << "[arg_values] " << arg_values << endl; - map::iterator it = arg_values_list.find(arg_values); - // verify if there is no other stage with the same values - if (it == arg_values_list.end() || !use_coarse_grain) { - // add current stage and args values to be compared later - arg_values_list[arg_values] = tmp; - - // finishes to generate the stage - int id = new_uid(); - tmp->setId(id); - tmp->setName(p.second->getName()); - tmp->setLocation(PipelineComponentBase::WORKER_SIDE); - - // generate outputs - for (int out_id : p.second->getOutputs()) { - int new_id = new_uid(); - ArgumentBase* ab_cpy = args.at(out_id)->clone(); - ab_cpy->setName(args.at(out_id)->getName()); - ab_cpy->setId(new_id); - ab_cpy->setParent(tmp->getId()); - tmp->replaceOutput(out_id, new_id); - - // add stage's output arguments to current workflow's argument list - stages_arguments[as.first].emplace_back(ab_cpy); - - // add output to interstage args map - args_values.emplace_back(ab_cpy); - } - - // add stage to final stages list - expanded_stages[tmp->getId()] = tmp; - } else { - // if the stage already exists, reuse it - for (int out_id : it->second->getOutputs()) { - // add reused stage's output arguments to current workflow's argument list - // cout << "reusing stage " << out_id << " from workflow " - // << it->second->getId() << endl; - stages_arguments[as.first].emplace_back(find_argument(args_values, out_id)); - } - - // TODO: solve mem leaking - // delete tmp; - } - } - // remove stage descriptor since it was already solved and break the loop - base_stages.erase(p.first); - break; - } + // remove stage descriptor since it was already solved and break the loop + base_stages.erase(p.first); + break; } } } @@ -1530,228 +874,3 @@ void expand_stages(const map &args, } } -/***************************************************************/ -/************* Workflow parsing helper functions ***************/ -/***************************************************************/ - -int get_line(char** line, FILE* f) { - char* nline; - size_t length=0; - if (line_buffer.empty()) { - if (getline(&nline, &length, f) == -1) - return -1; - string sline(nline); - size_t pos=string::npos; - while ((pos = sline.find("><")) != string::npos) { - line_buffer.emplace_back(sline.substr(0,pos+1)); - sline = sline.substr(pos+1); - } - line_buffer.emplace_back(sline); - } - - char* cline = (char*)malloc((line_buffer.front().length()+1)*sizeof(char*)); - memcpy(cline, line_buffer.front().c_str(), line_buffer.front().length()+1); - *line = cline; - line_buffer.pop_front(); - return strlen(*line); -} - -string get_workflow_name(FILE* workflow) { - return get_workflow_field(workflow, "name"); -} - -string get_workflow_field(FILE* workflow, string field) { - char *line = NULL; - size_t len = 0; - - // create field regex - regex r ("<" + field + ">[\"\\:\\w {},.~\\/\\[\\]-]+<\\/" + field + ">"); - - // get a new line until name is found - while (get_line(&line, workflow) != -1) { - smatch match; - string s(line); - regex_search(s, match, r); - - // cout << "line: " << s << endl; - - // if got a name match - if (match.size() == 1) { - // cout << "field match: " << line << endl; - return s.substr(s.find("<" + field + ">")+field.length()+2, - s.find("")-s.find("<" + field + ">")-field.length()-2); - } - delete line; - } - - return nullptr; -} - -void get_workflow_arguments(FILE* workflow, - list &output_arguments) { - - char *line = NULL; - size_t len = 0; - - // initial ports section beginning and end - string ie(""); - string iee(""); - - // ports section beginning and end - string e(""); - string ee(""); - - // go to the initial entries beginning - while (get_line(&line, workflow) != -1 && string(line).find(ie) == string::npos) { - delete line; - line = NULL; - } - // cout << "port init begin: " << line << endl; - - // keep getting ports until it reaches the end of initial ports - while (get_line(&line, workflow) != -1 && string(line).find(iee) == string::npos) { - // consumes the port beginning - while (string(line).find(e) == string::npos && get_line(&line, workflow) != -1) - delete line; - // cout << "port begin: " << line << endl; - - // finds the name and field - string name = get_workflow_field(workflow, "string"); - - // generate an argument - string type = get_workflow_field(workflow, "path"); - ArgumentBase* arg = new_typed_arg_base(type); - arg->setName(name); - arg->setId(new_uid()); - output_arguments.emplace_back(arg); - - // consumes the port ending - while (get_line(&line, workflow) != -1 && string(line).find(ee) == string::npos) { - delete line; - // some c++ implementations may not set line to null after delete - line = NULL; - } - // cout << "not port end: " << line << endl; - // cout << "port end: " << line << endl; - - if (line != NULL) { - delete line; - line = NULL; - } - - } - - if (line != NULL) - delete line; - // cout << "port init end: " << line << endl; -} - -vector get_all_fields(FILE* workflow, string start, string end) { - char *line = NULL; - size_t len = 0; - string type; - string field; - vector fields; - general_field_t general_field; - - // consumes the beginning - while (get_line(&line, workflow) != -1 && string(line).find(start) == string::npos) - delete line; - - // create general field regex - regex r ("<[\\w]+>[\\w ]+<\\/[\\w]+>"); - - // keep fiding fields until the end - while (get_line(&line, workflow) != -1 && string(line).find(end) == string::npos) { - smatch match; - string s(line); - regex_search(s, match, r); - - // if got a general field match - if (match.size() == 1) { - // cout << "general field match: " << line << endl; - type = s.substr(s.find("<")+1, s.find(">")-s.find("<")-1); - field = s.substr(s.find("<" + type + ">")+type.length()+2, s.find("")-s.find("<" + type + ">")-type.length()-2); - // cout << "type: " << type << ", field: " << field << endl; - general_field.type = type; - general_field.data = field; - fields.push_back(general_field); - } - delete line; - } - return fields; -} - -PipelineComponentBase* find_stage(map stages, string name) { - for (pair p : stages) - if (p.second->getName().compare(name) == 0) - return p.second; - return NULL; -} - -int find_stage_id(map stages, string name) { - for (pair p : stages) - if (p.second->getName().compare(name) == 0) - return p.first; - return -1; -} - -ArgumentBase* find_argument(const map& arguments, string name) { - for (pair p : arguments) - if (p.second->getName().compare(name) == 0) - return p.second; - return NULL; -} - -ArgumentBase* find_argument(const list& arguments, int id) { - for (ArgumentBase* a : arguments) - if (a->getId() == id) - return a; - return NULL; -} - -ArgumentBase* find_argument(const list& arguments, string name) { - for (ArgumentBase* a : arguments) - if (a->getName().compare(name) == 0) - return a; - return NULL; -} - -// taken from: http://stackoverflow.com/questions/16388510/evaluate-a-string-with-a-switch-in-c -constexpr unsigned int str2int(const char* str, int h = 0) { - return !str[h] ? 5381 : (str2int(str, h+1) * 33) ^ str[h]; -} - -ArgumentBase* new_typed_arg_base(string type) { - switch (str2int(type.c_str())) { - case str2int("integer"): - return new ArgumentInt(); - case str2int("float"): - return new ArgumentFloat(); - case str2int("string"): - return new ArgumentString(); - case str2int("floatarray"): - return new ArgumentFloatArray(); - case str2int("rt"): - return new ArgumentRT(); - default: - return NULL; - } -} - -parsing::port_type_t get_port_type(string s) { - switch (str2int(s.c_str())) { - case str2int("integer"): - return parsing::int_t; - case str2int("float"): - return parsing::float_t; - case str2int("string"): - return parsing::string_t; - case str2int("floatarray"): - return parsing::float_array_t; - case str2int("rt"): - return parsing::rt_t; - default: - return parsing::error; - } -} diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/debug_funs.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/debug_funs.hpp new file mode 100644 index 0000000..f82f3ae --- /dev/null +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/debug_funs.hpp @@ -0,0 +1,65 @@ +#ifndef DEBUGF_HPP_ +#define DEBUGF_HPP_ + +void mapprint(map mapp) { + for (pair p : mapp) + cout << p.first << ":" << p.second->getName() << endl; +} + +void mapprint(map> mapp) { + for (pair> p : mapp) { + // for (map::iterator i=map.begin(); i!=map.end();i++) + cout << p.first << ":" << endl; + for (ArgumentBase* a : p.second) + cout << "\t" << a->getName() << ":" << a->toString() << endl; + } +} + +void mapprint(map mapp) { + for (map::iterator i=mapp.begin(); i!=mapp.end();i++) + cout << i->first << ":" << i->second->getName() << endl; +} + +void mapprint(map mapp, map args) { + cout << endl<< "merged: " << endl; + for (pair p : mapp) { + cout << "stage " << p.second->getId() << ":" << p.second->getName() << endl; + cout << "\tinputs: " << endl; + for (int i : p.second->getInputs()) + cout << "\t\t" << i << ":" << args[i]->getName() << " = " + << args[i]->toString() << endl; + cout << "\toutputs: " << endl; + for (int i : p.second->getOutputs()) + cout << "\t\t" << i << ":" << args[i]->getName() << endl; + } +} + +void listprint(list mapp) { + for (list::iterator i=mapp.begin(); i!=mapp.end();i++) + cout << (*i)->getId() << ":" << (*i)->getName() << endl; +} + +void adj_mat_print(mincut::weight_t** adjMat, size_t n) { + for (int i=0; i id2task, size_t n) { + cout << "x\t"; + for (int i=0; i &expanded_args) { - - // verify every argument - for (pair p : expanded_args) { - // if an argument is a region template data region - if (p.second->getType() == ArgumentBase::RT) { - if (((ArgumentRT*)p.second)->isFileInput) { - // create the data region and add it to the input region template - DenseDataRegion2D *ddr2d = new DenseDataRegion2D(); - ddr2d->setName(p.second->getName()); - std::ostringstream oss; - oss << p.first; - ddr2d->setId(oss.str()); - ddr2d->setVersion(p.first); - ddr2d->setIsAppInput(true); - ddr2d->setInputType(DataSourceType::FILE_SYSTEM); - ddr2d->setOutputType(DataSourceType::FILE_SYSTEM); - ddr2d->setInputFileName(p.second->toString()); - rt->insertDataRegion(ddr2d); - } - } - } -} - -void generate_drs(RegionTemplate* rt, PipelineComponentBase* stage, - const std::map &expanded_args) { - - // verify every argument - for (int inp : stage->getInputs()) { - // if an argument is a region template data region - if (expanded_args.at(inp)->getType() == ArgumentBase::RT) { - // if (((ArgumentRT*)expanded_args.at(inp))->isFileInput) { - // create the data region and add it to the input region template - DenseDataRegion2D *ddr2d = new DenseDataRegion2D(); - ddr2d->setName(expanded_args.at(inp)->getName()); - std::ostringstream oss; - oss << inp; - ddr2d->setId(oss.str()); - ddr2d->setVersion(inp); - ddr2d->setIsAppInput(true); - ddr2d->setInputType(DataSourceType::FILE_SYSTEM); - ddr2d->setOutputType(DataSourceType::FILE_SYSTEM); - ddr2d->setInputFileName(expanded_args.at(inp)->toString()); - rt->insertDataRegion(ddr2d); - // } - } - } -} - -void add_arguments_to_stages(std::map &merged_stages, - std::map &merged_arguments, string name) { - - int i=0; - for (pair&& stage : merged_stages) { - // create the RT isntance - RegionTemplate *rt = new RegionTemplate(); - rt->setName(name); - - // add input arguments to stage, adding them as RT as needed - for (int arg_id : stage.second->getInputs()) { - ArgumentBase* new_arg = merged_arguments[arg_id]->clone(); - new_arg->setParent(merged_arguments[arg_id]->getParent()); - stage.second->addArgument(new_arg); - if (new_arg->getType() == ArgumentBase::RT) { - // std::cout << "input RT : " << merged_arguments[arg_id]->getName() << std::endl; - // insert the region template on the parent stage if the argument is a DR and if the RT wasn't already added - if (((RTPipelineComponentBase*)stage.second)-> - getRegionTemplateInstance(rt->getName()) == NULL) { - ((RTPipelineComponentBase*)stage.second)->addRegionTemplateInstance(rt, rt->getName()); - } - ((RTPipelineComponentBase*)stage.second)->addInputOutputDataRegion( - rt->getName(), new_arg->getName(), RTPipelineComponentBase::INPUT); - } - if (merged_arguments[arg_id]->getParent() != 0) { - // verify if the dependency stage was reused - int parent = merged_arguments[arg_id]->getParent(); - // std::cout << "[before]Dependency: " << stage.second->getId() << ":" << stage.second->getName() - // << " ->addDependency( " << parent << " )" << std::endl; - if (merged_stages[merged_arguments[arg_id]->getParent()]->reused != NULL) - parent = merged_stages[merged_arguments[arg_id]->getParent()]->reused->getId(); - // std::cout << "Dependency: " << stage.second->getId() << ":" << stage.second->getName() - // << " ->addDependency( " << parent << " )" << std::endl; - ((RTPipelineComponentBase*)stage.second)->addDependency(parent); - } - } - - // add output arguments to stage, adding them as RT as needed - for (int arg_id : stage.second->getOutputs()) { - ArgumentBase* new_arg = merged_arguments[arg_id]->clone(); - new_arg->setParent(merged_arguments[arg_id]->getParent()); - new_arg->setIo(ArgumentBase::output); - stage.second->addArgument(new_arg); - if (merged_arguments[arg_id]->getType() == ArgumentBase::RT) { - // std::cout << "output RT : " << merged_arguments[arg_id]->getName() << std::endl; - // insert the region template on the parent stage if the argument is a DR and if the RT wasn't already added - if (((RTPipelineComponentBase*)stage.second)->getRegionTemplateInstance(rt->getName()) == NULL) - ((RTPipelineComponentBase*)stage.second)->addRegionTemplateInstance(rt, rt->getName()); - ((RTPipelineComponentBase*)stage.second)->addInputOutputDataRegion(rt->getName(), - merged_arguments[arg_id]->getName(), RTPipelineComponentBase::OUTPUT); - } - } - } -} - void fgm::merge_stages_fine_grain(int algorithm, const std::map &all_stages, const std::map &stages_ref, std::map &merged_stages, std::map expanded_args, int max_bucket_size, bool shuffle, string dakota_filename) { diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fg_reuse/fgm.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fg_reuse/fgm.hpp new file mode 100644 index 0000000..86a7cdb --- /dev/null +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fg_reuse/fgm.hpp @@ -0,0 +1,24 @@ +#ifndef FGM_HPP_ +#define FGM_HPP_ + +#include +#include +#include +#include + +#include "PipelineComponentBase.h" +#include "RTPipelineComponentBase.h" + +#include "merging.hpp" +#include "cutting_algorithms.hpp" +#include "graph/reuse_tree.hpp" + +namespace fgm { + +void merge_stages_fine_grain(int merging_algorithm, const std::map &all_stages, + const std::map &stages_ref, std::map &merged_stages, + std::map expanded_args, int max_bucket_size, bool shuffle, string dakota_filename); + +} + +#endif \ No newline at end of file diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/min_cut.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fg_reuse/graph/min_cut.cpp similarity index 100% rename from runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/min_cut.cpp rename to runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fg_reuse/graph/min_cut.cpp diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/min_cut.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fg_reuse/graph/min_cut.hpp similarity index 100% rename from runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/min_cut.hpp rename to runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fg_reuse/graph/min_cut.hpp diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fg_reuse/graph/reuse_tree.cpp similarity index 100% rename from runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.cpp rename to runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fg_reuse/graph/reuse_tree.cpp diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fg_reuse/graph/reuse_tree.hpp similarity index 100% rename from runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/graph/reuse_tree.hpp rename to runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fg_reuse/graph/reuse_tree.hpp diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/merging.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fg_reuse/merging.cpp similarity index 100% rename from runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/merging.cpp rename to runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fg_reuse/merging.cpp diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/merging.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fg_reuse/merging.hpp similarity index 100% rename from runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/merging.hpp rename to runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fg_reuse/merging.hpp diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fgm.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fgm.hpp deleted file mode 100644 index 544622e..0000000 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/fgm.hpp +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef FGM_HPP_ -#define FGM_HPP_ - -#include -#include -#include -#include - -#include "PipelineComponentBase.h" -#include "RTPipelineComponentBase.h" - -#include "merging.hpp" -#include "cutting_algorithms.hpp" -#include "graph/min_cut.hpp" -#include "graph/reuse_tree.hpp" - -namespace fgm { - - void merge_stages_fine_grain(int merging_algorithm, const std::map &all_stages, - const std::map &stages_ref, std::map &merged_stages, - std::map expanded_args, int max_bucket_size, bool shuffle, string dakota_filename); -} - -#endif \ No newline at end of file diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen.cpp deleted file mode 100644 index aade618..0000000 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen.cpp +++ /dev/null @@ -1,354 +0,0 @@ -#include -#include -#include -#include - -#include "json/json.h" - -using namespace std; - -string generate_header(Json::Value data); -string generate_source(Json::Value data); -string getTypeCast(string type); -string getArgumentTypeCast(string type); -void replace_multiple_string(string& str, string to_find, string to_replace); -string uppercase(string s); - -int main(int argc, char** argv) { - - if (argc != 3) { - cout << "usage: gen -d " << endl; - return 0; - } - - string filename = ""; - for (int i = 0; i < argc-1; i++) { - if (argv[i][0] == '-' && argv[i][1] == 'd') { - filename = argv[i+1]; - } - } - if (filename.length() == 0) { - cout << "usage: gen -d " << endl; - return 0; - } - - // open descriptor - FILE* desc_file = fopen(filename.c_str(), "r"); - - // concat all descriptors lines - string description; - char* line; - size_t length=0; - while(getline(&line, &length, desc_file) != -1) - description += " " + string(line); - - Json::Reader reader; - bool wellFormed; - Json::Value data; - - wellFormed = reader.parse(description, data, false); - if(!wellFormed) { - cout << "Failed to parse JSON: " << description << endl << reader.getFormattedErrorMessages() << endl; - exit(-3); - } - - fclose(desc_file); - - string name = data["name"].asString(); - - string header = generate_header(data); - std::ofstream header_file(string(name + ".hpp")); - header_file << header; - header_file.close(); - - string source = generate_source(data); - std::ofstream source_file(string(name + ".cpp")); - source_file << source; - source_file.close(); - - // TODO: get descriptor from argv - - // cout << source << endl; -} - -string generate_header(Json::Value data) { - // get name - string name = data["name"].asString(); - - // get includes string - string includes = data["includes"].asString(); - - // generate DataRegion variables string - string dataRegionVariables; - string dataRegionVariablesNames; - for (int i=0; igetArgumentsSize(); i++){\n"; - string pcb_task_params; // $PCB_TASK_PARAMS$ - string task_params; // $TASK_PARAMS$ - string task_args; // $TASK_ARGS$ - string dr_delete; // $INPUT_DR_DELETE$ - string input_mat_dr; // $INPUT_MAT_DR$ - string output_mat_dr; // $OUTPUT_MAT_DR$ - string output_assign; // $OUTPUT_DR_ASSIGN$ - - // generate DataRegion strings - for (int i=0; i(inputRt->getDataRegion(\"" + - dr_name + "\", \"\", 0, dr_id));\n"; - - // generate DR cleaning for the destructor - $INPUT_DR_DELETE$ - dr_delete += "\tif(" + dr_name + "_temp != NULL) delete " + dr_name + "_temp;\n"; - - // generate cv::Mat variables to hold input DR - $INPUT_MAT_DR$ - input_mat_dr += "\tcv::Mat " + dr_name + " = this->" + - dr_name + "_temp->getData();"; - } - // generate output string - else if (data["args"][i]["io"].asString().compare("output") == 0) { - // generate DataRegion output - $OUTPUT_DR$ - dataRegionOutput += "DenseDataRegion2D *" + dr_name + " = new " + - "DenseDataRegion2D();\n\t\t" + dr_name + "->setName(\"" + dr_name + - "\");\n\t\t" + dr_name + "->setId(dr_id_c);\n\t\t" + dr_name + - "->setVersion(0);\n\t\tinputRt->insertDataRegion(" + dr_name + ");"; - - // generate cv::Mat variables to hold input DR - $OUTPUT_MAT_DR$ - output_mat_dr += "\tcv::Mat " + dr_name + " = this->" + - dr_name + "_temp->getData();"; - - // generate mat assignment to output DR string - $OUTPUT_DR_ASSIGN$ - output_assign += "\tthis->" + dr_name + "_temp->setData(" + dr_name + ");"; - - } else { - cout << "Malformed descriptor." << endl; - exit(-1); - } - - // generate DR args $PCB_TASK_PARAMS$ - pcb_task_params += dr_name + ", "; - - // generate DR args $TASK_PARAMS$ - task_params += "DenseDataRegion2D* " + dr_name + "_temp, "; - - // generate DR args $TASK_ARGS$ - task_args += "\tthis->" + dr_name + "_temp = " + dr_name + "_temp;\n"; - } - } - - // generate all common args string - for (int i=0; igetArgument(i))->getArgValue();\n" + - "\t\t\tset_cout++;\n\t\t}\n\n"; - - // generate common args $PCB_TASK_PARAMS$ - pcb_task_params += arg_name + ", "; - - // generate common args $TASK_PARAMS$ - task_params += getTypeCast(arg_type) + " " + arg_name + ", "; - - // generate DR args $TASK_ARGS$ - task_args += "\tthis->" + arg_name + " = " + arg_name + ";\n"; - } - } - - // finish generating $PCB_ARGS$ - string commonArgs = commonArgsDec + "\n" + commonArgsLoop + "\t}\n\n" + - "\tif (set_cout < this->getArgumentsSize())\n\t\tstd::cout " + - "<< __FILE__ << \":\" << __LINE__ <<\" Missing common arguments on " + - name + "\" << std::endl;"; - - // remove final comma from pcb_task_params - pcb_task_params.erase(pcb_task_params.length()-2, 2); - - // remove final comma from task_params - task_params.erase(task_params.length()-2, 2); - - // generate the command invocation string - string cmd = data["call"].asString(); - - /*******************************************************/ - /*******************************************************/ - /*******************************************************/ - - // open source_template file - char* line; - size_t length=0; - FILE* source_template = fopen("source_template", "r"); - - // concat all source_template lines - string source; - while(getline(&line, &length, source_template) != -1) - source += string(line); - - size_t pos; - - - // $NAME$ - replace_multiple_string(source, "$NAME$", name); - - // $IO_DR$ - replace_multiple_string(source, "$IO_DR$", dataRegionIOs); - - // $PCB_ARGS$ - replace_multiple_string(source, "$PCB_ARGS$", commonArgs); - - // $INPUT_CAST_DR$ - replace_multiple_string(source, "$INPUT_CAST_DR$", dataRegionInputCast); - - // $INPUT_DECL_DR$ - replace_multiple_string(source, "$INPUT_DECL_DR$", dataRegionInputDecl); - - // $OUTPUT_DR$ - replace_multiple_string(source, "$OUTPUT_DR$", dataRegionOutput); - - // $PCB_TASK_PARAMS$ - replace_multiple_string(source, "$PCB_TASK_PARAMS$", pcb_task_params); - - // $TASK_PARAMS$ - replace_multiple_string(source, "$TASK_PARAMS$", task_params); - - // $TASK_ARGS$ - replace_multiple_string(source, "$TASK_ARGS$", task_args); - - // $INPUT_DR_DELETE$ - replace_multiple_string(source, "$INPUT_DR_DELETE$", dr_delete); - - // $INPUT_MAT_DR$ - replace_multiple_string(source, "$INPUT_MAT_DR$", input_mat_dr); - - // $OUTPUT_MAT_DR$ - replace_multiple_string(source, "$OUTPUT_MAT_DR$", output_mat_dr); - - // $CMD$ - replace_multiple_string(source, "$CMD$", cmd); - - // $OUTPUT_DR_ASSIGN$ - replace_multiple_string(source, "$OUTPUT_DR_ASSIGN$", output_assign); - - return source; -} - -string getTypeCast(string type) { - if (type.compare("uchar") == 0) - return "unsigned char"; - else if (type.compare("int") == 0) - return "int"; - else if (type.compare("double") == 0) - return "double"; - else - return nullptr; -} - -string getArgumentTypeCast(string type) { - if (type.compare("uchar") == 0) - return "(ArgumentInt*)"; - else if (type.compare("int") == 0) - return "(ArgumentInt*)"; - else if (type.compare("double") == 0) - return "(ArgumentFloat*)"; - else - return nullptr; -} - -void replace_multiple_string(string& str, string to_find, string to_replace) { - size_t pos; - while ((pos = str.find(to_find)) != string::npos) { - str.erase(pos, to_find.length()); - str.insert(pos, to_replace); - } -} - -string uppercase(string s) { - for(int i=0;s[i]!='\0';i++){ - s[i]=toupper(s[i]); - } - return s; -} \ No newline at end of file diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/jsoncpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/json/jsoncpp similarity index 100% rename from runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/jsoncpp rename to runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/json/jsoncpp diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/jsoncpp.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/json/jsoncpp.cpp similarity index 99% rename from runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/jsoncpp.cpp rename to runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/json/jsoncpp.cpp index c8c948f..61ce71c 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/jsoncpp.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/json/jsoncpp.cpp @@ -73,7 +73,7 @@ license you like. -#include "json/json.h" +#include "json.h" #ifndef JSON_IS_AMALGAMATION #error "Compile with -I PATH_TO_JSON_DIRECTORY" diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/GeneralPipelineComponent.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/GeneralPipelineComponent.cpp deleted file mode 100644 index 27e00a6..0000000 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/GeneralPipelineComponent.cpp +++ /dev/null @@ -1,95 +0,0 @@ -/* - * GeneralPipelineComponent.cpp - * - * Created on: May 23, 2016 - * Author: willian - */ - -#include "GeneralPipelineComponent.hpp" - - -GeneralPipelineComponent::GeneralPipelineComponent(std::string name) { - this->setComponentName(name); -} - -void GeneralPipelineComponent::addRtInput(std::string rtName, std::string regionName) { - this->addInputOutputDataRegion(rtName, regionName, RTPipelineComponentBase::INPUT);//_INPUT -} - -void GeneralPipelineComponent::addRtOutput(std::string rtName, std::string regionName) { - this->addInputOutputDataRegion(rtName, regionName, RTPipelineComponentBase::OUTPUT);//_INPUT -} - -GeneralPipelineComponent::~GeneralPipelineComponent() {} - -int GeneralPipelineComponent::run() -{ - - // Print name and id of the component instance - std::cout << "Executing component: " << this->getComponentName() << " instance id: " << this->getId() <getRegionTemplateInstance("tile"); - - int parameterId = ((ArgumentInt*)this->getArgument(0))->getArgValue(); - int parameterSegId = ((ArgumentInt*)this->getArgument(1))->getArgValue(); - unsigned char blue = (unsigned char)((ArgumentInt*)this->getArgument(2))->getArgValue(); - unsigned char green = (unsigned char)((ArgumentInt*)this->getArgument(3))->getArgValue(); - unsigned char red = (unsigned char)((ArgumentInt*)this->getArgument(4))->getArgValue(); - double T1 = (double)((ArgumentFloat*)this->getArgument(5))->getArgValue(); - double T2 = (double)((ArgumentFloat*)this->getArgument(6))->getArgValue(); - unsigned char G1 = (unsigned char)((ArgumentInt*)this->getArgument(7))->getArgValue(); - unsigned char G2 = (unsigned char)((ArgumentInt*)this->getArgument(8))->getArgValue(); - int minSize = ((ArgumentInt*)this->getArgument(9))->getArgValue(); - int maxSize = ((ArgumentInt*)this->getArgument(10))->getArgValue(); - int minSizePl = ((ArgumentInt*)this->getArgument(11))->getArgValue(); - int minSizeSeg = ((ArgumentInt*)this->getArgument(12))->getArgValue(); - int maxSizeSeg= ((ArgumentInt*)this->getArgument(13))->getArgValue(); - int fillHolesConnectivity= ((ArgumentInt*)this->getArgument(14))->getArgValue(); - int reconConnectivity= ((ArgumentInt*)this->getArgument(15))->getArgValue(); - int watershedConnectivity= ((ArgumentInt*)this->getArgument(16))->getArgValue(); - - if(inputRt != NULL){ - DenseDataRegion2D *bgr = NULL; - try{ - bgr = dynamic_cast(inputRt->getDataRegion("BGR", "", 0, parameterId)); - std::cout << "GeneralPipelineComponent. paramenterId: "<< parameterId<getId() << " paramenterId: "<< parameterId<setName("MASK"); - mask->setId(bgr->getId()); - mask->setVersion(parameterSegId); - - inputRt->insertDataRegion(mask); - std::cout << "nDataRegions: after:" << inputRt->getNumDataRegions() << std::endl; - - - // Create processing task - TaskGeneralPipelineComponent * segTask = new TaskGeneralPipelineComponent(bgr, mask, blue, green, red, T1, T2, G1, G2, minSize, maxSize, minSizePl, minSizeSeg, maxSizeSeg, fillHolesConnectivity, reconConnectivity, watershedConnectivity); - - this->executeTask(segTask); - - }else{ - std::cout << __FILE__ << ":" << __LINE__ <<" DR == NULL" << std::endl; - } - - }else{ - std::cout << __FILE__ << ":" << __LINE__ <<" RT == NULL" << std::endl; - } - - return 0; -} - -// Create the component factory -PipelineComponentBase* componentFactorySeg() { - return new GeneralPipelineComponent(); -} - -// register factory with the runtime system -bool registered = PipelineComponentBase::ComponentFactory::componentRegister("GeneralPipelineComponent", &componentFactorySeg); - - diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/GeneralPipelineComponent.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/GeneralPipelineComponent.hpp deleted file mode 100644 index 5a1045e..0000000 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/GeneralPipelineComponent.hpp +++ /dev/null @@ -1,33 +0,0 @@ -/* - * GeneralPipelineComponent.hpp - * - * Created on: May 23, 2016 - * Author: willian - */ - -#ifndef GENETAL_TASK_H_ -#define GENETAL_TASK_H_ - -#include "RTPipelineComponentBase.h" - -#include "opencv2/opencv.hpp" -#include "opencv2/gpu/gpu.hpp" -#include "HistologicalEntities.h" -#include "PixelOperations.h" -#include "MorphologicOperations.h" -#include "Util.h" -#include "FileUtils.h" - -class GeneralPipelineComponent : public RTPipelineComponentBase { - -public: - GeneralPipelineComponent(std::string name); - virtual ~GeneralPipelineComponent(); - - void GeneralPipelineComponent::addRtInput(std::string rtName, std::string regionName); - void GeneralPipelineComponent::addRtOutput(std::string rtName, std::string regionName); - - int run(); -}; - -#endif /* GENETAL_TASK_H_ */ diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/GeneralTask.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/GeneralTask.cpp deleted file mode 100644 index 59bdc07..0000000 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/GeneralTask.cpp +++ /dev/null @@ -1,45 +0,0 @@ -#include "GeneralTask.hpp" - -GeneralTask::GeneralTask(DenseDataRegion2D* bgr, DenseDataRegion2D* mask, unsigned char blue, unsigned char green, unsigned char red, double T1, double T2, unsigned char G1, unsigned char G2, int minSize, int maxSize, int minSizePl, int minSizeSeg, int maxSizeSeg, int fillHolesConnectivity, int reconConnectivity, int watershedConnectivity) { - this->bgr = bgr; - this->mask = mask; - - this->blue = blue; - this->green = green; - this->red = red; - - this->T1 = T1; - this->T2 = T2; - this->G1 = G1; - this->G2 = G2; - this->minSize = minSize; - this->maxSize = maxSize; - this->minSizePl = minSizePl; - this->minSizeSeg = minSizeSeg; - this->maxSizeSeg = maxSizeSeg; - this->fillHolesConnectivity=fillHolesConnectivity; - this->reconConnectivity=reconConnectivity; - this->watershedConnectivity=watershedConnectivity; -} - -GeneralTask::~GeneralTask() { - if(bgr != NULL) delete bgr; -} - -bool GeneralTask::run(int procType, int tid) { - cv::Mat inputImage = this->bgr->getData(); - cv::Mat outMask; - - uint64_t t1 = Util::ClockGetTimeProfile(); - - std::cout << "GeneralTask: " << (int)blue << ":"<< (int)green << ":"<< (int)red << ":"<< T1<< ":"<< T2<< ":"<< (int)G1<< ":"<< minSize<< ":"<< maxSize<< ":"<< (int)G2<< ":"<< minSizePl<< ":"<< minSizeSeg<< ":"<< maxSizeSeg << ":" << fillHolesConnectivity << ":" << reconConnectivity << ":" << watershedConnectivity << std::endl; - if(inputImage.rows > 0) - int segmentationExecCode = ::nscale::HistologicalEntities::segmentNuclei(inputImage, outMask, blue, green, red, T1, T2, G1, minSize, maxSize, G2, minSizePl, minSizeSeg, maxSizeSeg, fillHolesConnectivity, reconConnectivity, watershedConnectivity); - else - std::cout <<"Segmentation: input data NULL"<< std::endl; - this->mask->setData(outMask); - - uint64_t t2 = Util::ClockGetTimeProfile(); - - std::cout << "Task Segmentation time elapsed: "<< t2-t1 << std::endl; -} diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/GeneralTask.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/GeneralTask.hpp deleted file mode 100644 index 463810f..0000000 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/GeneralTask.hpp +++ /dev/null @@ -1,38 +0,0 @@ - - -#ifndef GENERAL_TASK_H_ -#define GENERAL_TASK_H_ - -#include "Task.h" -#include "DenseDataRegion2D.h" - -#include "opencv2/opencv.hpp" -#include "opencv2/gpu/gpu.hpp" -#include "HistologicalEntities.h" -#include "PixelOperations.h" -#include "MorphologicOperations.h" -#include "Util.h" -#include "FileUtils.h" - - - -class GeneralTask: public Task { -private: - DenseDataRegion2D* bgr; - DenseDataRegion2D* mask; - - unsigned char blue, green, red; - double T1, T2; - unsigned char G1, G2; - int minSize, maxSize, minSizePl, minSizeSeg, maxSizeSeg; - int fillHolesConnectivity, reconConnectivity, watershedConnectivity; - -public: - GeneralTask(DenseDataRegion2D* bgr, DenseDataRegion2D* mask, unsigned char blue, unsigned char green, unsigned char red, double T1, double T2, unsigned char G1, unsigned char G2, int minSize, int maxSize, int minSizePl, int minSizeSeg, int maxSizeSeg, int fillHolesConnectivity, int reconConnectivity, int watershedConnectivity); - - virtual ~GeneralTask(); - - bool run(int procType=ExecEngineConstants::CPU, int tid=0); -}; - -#endif /* GENERAL_TASK_H_ */ diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/NormalizationComp.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/NormalizationComp.cpp deleted file mode 100644 index ecfbfee..0000000 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/NormalizationComp.cpp +++ /dev/null @@ -1,64 +0,0 @@ - -#include "NormalizationComp.h" - - -NormalizationComp::NormalizationComp() { - this->setComponentName("NormalizationComp"); - this->addInputOutputDataRegion("tile", "RAW", RTPipelineComponentBase::INPUT); - this->addInputOutputDataRegion("tile", "BGR", RTPipelineComponentBase::OUTPUT); -} - -NormalizationComp::~NormalizationComp() { - -} - -int NormalizationComp::run() -{ - - // Print name and id of the component instance - RegionTemplate * inputRt = this->getRegionTemplateInstance("tile"); - int parameterId = ((ArgumentInt*)this->getArgument(0))->getArgValue(); - ArgumentFloatArray* args = ((ArgumentFloatArray*)this->getArgument(1)); - - - std::cout << "Executing component: " << this->getComponentName() << " instance id: " << this->getId() <(inputRt->getDataRegion("RAW")); - if(raw != NULL){ - // Create output data region - DenseDataRegion2D *bgr = new DenseDataRegion2D(); - // set outpu data region identifier - bgr->setName("BGR"); - bgr->setId(raw->getId()); - bgr->setVersion(parameterId); - - // insert data region into region template - inputRt->insertDataRegion(bgr); - - float targetMean[3]; - for(int i = 0; i < 3; i++) targetMean[i] = args->getArgValue(i).getArgValue(); - - // Create processing task - TaskNormalization * normTask = new TaskNormalization(raw, bgr, targetMean); - - this->executeTask(normTask); - - }else{ - std::cout << __FILE__ << ":" << __LINE__ <<" Data Region is == NULL" << std::endl; - } - - }else{ - std::cout << __FILE__ << ":" << __LINE__ <<" RT == NULL" << std::endl; - } - - return 0; -} - -// Create the component factory -PipelineComponentBase* componentFactoryNorm() { - return new NormalizationComp(); -} - -// register factory with the runtime system -bool registeredN = PipelineComponentBase::ComponentFactory::componentRegister("NormalizationComp", &componentFactoryNorm); diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/NormalizationComp.h b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/NormalizationComp.h deleted file mode 100644 index b650536..0000000 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/NormalizationComp.h +++ /dev/null @@ -1,28 +0,0 @@ - -#ifndef NORMALIZATION_COMP_H_ -#define NORMALIZATION_COMP_H_ - -#include "RTPipelineComponentBase.h" - -#include "opencv2/opencv.hpp" -#include "opencv2/gpu/gpu.hpp" -#include "Util.h" -#include "FileUtils.h" - - -#include "TaskNormalization.h" - -class NormalizationComp : public RTPipelineComponentBase { -private: - cv::Mat inputImage; - cv::Mat bgr; - -public: - NormalizationComp(); - virtual ~NormalizationComp(); - - int run(); - -}; - -#endif /* NORMALIZATION_COMP_H_ */ diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/PipelineManager.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/PipelineManager.cpp deleted file mode 100644 index c6c4ab8..0000000 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/PipelineManager.cpp +++ /dev/null @@ -1,630 +0,0 @@ - -#include -#include -#include -#include - -#include "SysEnv.h" -#include "FileUtils.h" -#include "RegionTemplate.h" -#include "RegionTemplateCollection.h" - -#include "NormalizationComp.hpp" -#include "Segmentation.hpp" -#include "FeatureExtraction.h" -#include "DiffMaskComp.h" -#include "ParameterSet.h" - -#include -#include -#include -#include - -#include -#include - -#include "json/json.h" - -using namespace std; - -// make two of these -typedef struct port_t { - string uid; - string name; - string type; - string pipeline_port; - list interfaces; -} port_t; - -// global id counter for port_t -int uid=0; -int new_uid() {return uid++;}; - -typedef struct task_t { - string name; - // TODO: input can only be connected to 1 output - list inputs; - // TODO: output can be connected to 1 or more inputs - list outputs; - string command; -} task_t; - -typedef struct { - string type; - string data; -} general_field_t; - -namespace parsing { - -enum port_type_t { - int_t, string_t, float_t, array_t, error -}; - -} - -string tasks2string(list tasks); -string ports2string(list ports); -string get_workflow_field(FILE* workflow, string field); -string get_workflow_name(FILE* workflow); -list get_workflow_ports(FILE* workflow, string port_t); -map get_workflow_inputs(FILE* workflow); -list get_workflow_outputs(FILE* workflow); -list get_workflow_tasks(FILE* workflow); -void update_tasks_dependencies(FILE* workflow, list* tasks); -vector get_all_fields(FILE* workflow, string start, string end); -task_t* find_task(list* tasks, string name); -port_t* find_port(list* ports, string name); -parsing::port_type_t get_port_type(string s); - -void add_parameters(PipelineComponentBase* executable, list arguments, list workflow, int parameterId, int parameterSegId); -void add_parameters(PipelineComponentBase* executable, list arguments, list workflow, int parameterId); -void add_parameters(PipelineComponentBase* executable, list arguments, list workflow); - -int get_line(char** line, FILE* f); -list line_buffer; - -int main() { - - FILE* workflow = fopen("seg_example.t2flow", "r"); - - //------------------------------------------------------------ - // Parse pipeline file - //------------------------------------------------------------ - - string name = get_workflow_name(workflow); - // cout << "name: " << name << endl << endl; - map workflow_inputs = get_workflow_inputs(workflow); - cout << "inputs:" << endl; - for(map::iterator i=workflow_inputs.begin(); i!=workflow_inputs.end(); i++) - cout << i->first << ":" << (i->second)->getName() << ": " << (i->second)->toString() << endl; - cout << endl; - list workflow_outputs = get_workflow_outputs(workflow); - // cout << "outputs:" << endl; - // for(list::iterator i=workflow_outputs.begin(); i!=workflow_outputs.end(); i++) - // cout << *i << endl; - // cout << endl; - list all_tasks = get_workflow_tasks(workflow); - // cout << "get wf" << endl << tasks2string(all_tasks) << endl << endl; - update_tasks_dependencies(workflow, &all_tasks); - // cout << "update wf" << endl << tasks2string(all_tasks) << endl << endl; - - fclose(workflow); - - // print all tasks - cout << tasks2string(all_tasks); - - //------------------------------------------------------------ - // Add tasks to Manager to be executed - //------------------------------------------------------------ - - // Handler to the distributed execution system environment - // SysEnv sysEnv; - - // // Tell the system which libraries should be used - // sysEnv.startupSystem(argc, argv, "libcomponentnsdifffgo.so"); - - // // generate each stage and the corresponding output arguments - // map stages; - // // this id will be used later to diferentiate equal workflows with different parameters - // int workflow_id = 0; - // generate_workflow_stages(stages, workflow_inputs, all_tasks); - - // // link the stages inputs to the correct outputs - - - - // // get the stage wrapper to be executed - // PipelineComponentBase* executable = PipelineComponentBase::ComponentFactory::getComponentFactory("NormalizationComp"); - - // add all parameters on the received order - // TODO: what to do to dependencies? - //add_parameters(executable, workflow_inputs); - - // set dependencies between executables - - - //------------------------------------------------------------ - // Run pipeline - //------------------------------------------------------------ - - return 0; -} - -void generate_workflow_stages(map &stages, map &arguments, list tasks) { - - for (list::iterator i=tasks.begin(); i!=tasks.end(); i++) { - // check if the stage wasn't already created - if (stages.find(i->name) != stages.end()) { - // create stage - PipelineComponentBase* executable = PipelineComponentBase::ComponentFactory::getComponentFactory(i->name)(); - - // create output arguments - for (list::iterator j=i->outputs.begin(); j!=i->outputs.end(); j++) { - // arguments[j->] = generate_argument() - } - - // create input arguments - } - - } -} - - - -void add_parameters(PipelineComponentBase* executable, list arguments, list workflow, int parameterId, int parameterSegId) { - ArgumentInt* arg1 = new ArgumentInt(parameterId); - ArgumentInt* arg2 = new ArgumentInt(parameterSegId); - executable->addArgument(arg1); - executable->addArgument(arg2); - add_parameters(executable, arguments, workflow); -} - -void add_parameters(PipelineComponentBase* executable, list arguments, list workflow, int parameterId) { - ArgumentInt* arg1 = new ArgumentInt(parameterId); - executable->addArgument(arg1); - add_parameters(executable, arguments, workflow); -} - -void add_parameters(PipelineComponentBase* executable, list arguments, list workflow) { - // get executable dependencies -// list deps = find_task(workflow, executable->getComponentName())->inputs; - -// for (list::iterator i=arguments.begin(); i!=arguments.end(); i++) { -// // add parameter if necessary to the current executable -// if (find_port(deps, (*i)->getName()) != NULL) -// executable->addArgument(*i); -// } -} - -//------------------------------------------------------------------------------- - -string tasks2string(list tasks) { - string out = ""; - for(list::iterator i = tasks.begin(); i != tasks.end(); i++) { - out += "Task " + i->name + "\n"; - out += "\tcmd: " + i->command + "\n"; - out += "\tinputs:\n" + ports2string(i->inputs) + "\n"; - out += "\toutputs:\n" + ports2string(i->outputs) + "\n"; - } - return out; -} - -string ports2string(list ports) { - string out = ""; - for(list::iterator i = ports.begin(); i != ports.end(); i++) { - if (i->pipeline_port.length() > 0) - out += "\t\t" + i->name + " connected to pipeline port " + i->pipeline_port + "\n"; - else { - out += "\t\t" + i->name + " connected to: \n"; - for(list::iterator j = i->interfaces.begin(); j != i->interfaces.end(); j++) { - out += "\t\t\t" + (*j)->name + "\n"; - } - } - } - return out; -} - -string get_workflow_name(FILE* workflow) { - return get_workflow_field(workflow, "name"); -} - -string get_workflow_field(FILE* workflow, string field) { - char *line = NULL; - size_t len = 0; - - // create field regex - regex r ("<" + field + ">[\"\\:\\w {},.\\[\\]-]+<\\/" + field + ">"); - - // get a new line until name is found - while (get_line(&line, workflow) != -1) { - smatch match; - string s(line); - regex_search(s, match, r); - - // cout << "line: " << s << endl; - - // if got a name match - if (match.size() == 1) { - // cout << "field match: " << line << endl; - return s.substr(s.find("<" + field + ">")+field.length()+2, s.find("")-s.find("<" + field + ">")-field.length()-2); - } - } - - return nullptr; -} - -map get_workflow_inputs(FILE* workflow) { - map ports; - - char *line = NULL; - size_t len = 0; - string port = "inputPorts"; - - // initial ports section beginning and end - string ip("<" + port + ">"); - string ipe(""); - - // ports section beginning and end - string p(""); - string pe(""); - - // argument name, stored before to be consumed when the ArgumentBase type can be set - string name; - - // go to the initial ports beginning - while (get_line(&line, workflow) != -1 && string(line).find(ip) == string::npos); - // cout << "port init begin: " << line << endl; - - // keep getting ports until it reaches the end of initial ports - while (get_line(&line, workflow) != -1 && string(line).find(ipe) == string::npos) { - // consumes the port beginning - while (string(line).find(p) == string::npos && get_line(&line, workflow) != -1); - // cout << "port begin: " << line << endl; - - // finds the name field - name = get_workflow_name(workflow); - // cout << "name: " << name << endl; - - // finds the description field - string description = get_workflow_field(workflow, "text"); - // cout << "description: " << description << endl; - - // parse the description to get the input value(s) - Json::Reader reader; - bool wellFormed; - Json::Value data; - - wellFormed = reader.parse(description, data, false); - if(!wellFormed) { - cout << "Failed to parse JSON: " << description << endl << reader.getFormattedErrorMessages() << endl; - exit(-3); - } - - // create the propper Argument object for each type case - ArgumentBase* inp_val; - switch (get_port_type(data["type"].asString())) { - case parsing::int_t: - inp_val = new ArgumentInt(data["value"].asInt()); - break; - case parsing::string_t: - inp_val = new ArgumentString(data["value"].asString()); - break; - case parsing::float_t: - inp_val = new ArgumentFloat(data["value"].asFloat()); - break; - case parsing::array_t: - inp_val = new ArgumentFloatArray(); - for (int i=0; iaddArgValue(float_val); - } - break; - default: - exit(-4); - } - - // set inp_val name - inp_val->setName(name); - - // add input to list - ports[new_uid()] = inp_val; - - // consumes the port ending - while (get_line(&line, workflow) != -1 && string(line).find(pe) == string::npos); - // cout << "not port end: " << line << endl; - // cout << "port end: " << line << endl; - } - return ports; -} - -list get_workflow_outputs(FILE* workflow) { - return get_workflow_ports(workflow, "outputPorts"); -} - -list get_workflow_ports(FILE* workflow, string port) { - list ports; - - char *line = NULL; - size_t len = 0; - - // initial ports section beginning and end - string ip("<" + port + ">"); - string ipe(""); - - // ports section beginning and end - string p(""); - string pe(""); - - // go to the initial ports beginning - while (get_line(&line, workflow) != -1 && string(line).find(ip) == string::npos); - // cout << "port init begin: " << line << endl; - - // keep getting ports until it reaches the end of initial ports - while (get_line(&line, workflow) != -1 && string(line).find(ipe) == string::npos) { - // consumes the port beginning - while (string(line).find(p) == string::npos && get_line(&line, workflow) != -1); - // cout << "port begin: " << line << endl; - - // finds the name field - ports.push_back(get_workflow_name(workflow)); - - // consumes the port ending - while (get_line(&line, workflow) != -1 && string(line).find(pe) == string::npos); - // get_line << "not port end: " << line << endl; - // cout << "port end: " << line << endl; - } - // cout << "port init end: " << line << endl; - return ports; -} - -list get_task_ports(FILE* workflow, string port_type) { - list ports_names = get_workflow_ports(workflow, port_type); - list ports; - port_t port; - - // convert the list of port names to a list of port_t - for (list::iterator i = ports_names.begin(); i != ports_names.end(); i++) { - port.name = *i; - ports.push_back(port); - } - return ports; -} - -list get_workflow_tasks(FILE* workflow) { - list tasks; - - char *line = NULL; - size_t len = 0; - - string ps(""); - string pse(""); - - string p(""); - string pe(""); - - // go to the processors beginning - while (get_line(&line, workflow) != -1 && string(line).find(ps) == string::npos); - // cout << "not processor init begin: " << line << endl; - // cout << "processor init begin: " << line << endl; - - // keep getting single processors until it reaches the end of all processors - while (get_line(&line, workflow) != -1 && string(line).find(pse) == string::npos) { - // consumes the processor beginning - while (string(line).find(p) == string::npos && get_line(&line, workflow) != -1); - // cout << "processor begin: " << line << endl; - - task_t new_task; - new_task.name = get_workflow_name(workflow); - new_task.inputs = get_task_ports(workflow, "inputPorts"); - new_task.outputs = get_task_ports(workflow, "outputPorts"); - - // get task command - new_task.command = get_workflow_field(workflow, "command"); - - tasks.push_back(new_task); - - // consumes the processor ending - while (get_line(&line, workflow) != -1 && string(line).find(pe) == string::npos); - // cout << "not processor end: " << line << endl; - // cout << "processor end: " << line << endl; - } - - return tasks; -} - -void update_tasks_dependencies(FILE* workflow, list* tasks) { - char *line = NULL; - size_t len = 0; - - string ds(""); - string dse(""); - - string d(""); - string de(""); - - string sink(""); - - string source(""); - - // go to the datalinks beginning - while (get_line(&line, workflow) != -1 && string(line).find(ds) == string::npos); - // cout << "not datalink init begin" << line << endl; - // cout << "datalink init begin" << line << endl; - - // keep getting single datalinks until it reaches the end of all datalinks - while (get_line(&line, workflow) != -1 && string(line).find(dse) == string::npos) { - // consumes the datalink beginning - while (string(line).find(d) == string::npos && get_line(&line, workflow) != -1); - // cout << "datalink begin" << line << endl; - - // get sink field - vector all_sink_fields = get_all_fields(workflow, sink, sinke); - - // check if it's a pipeine sink instead of a task sink - bool pipeline_sink = false; - task_t* sink_task; - string sink_name; - string sink_port_name; - if (all_sink_fields.size() == 1) { - // cout << "pipeline sink" << endl; - pipeline_sink = true; - sink_name = all_sink_fields[0].data; - } else { - // cout << "task sink" << endl; - sink_name = all_sink_fields[0].data; - sink_port_name = all_sink_fields[1].data; - sink_task = find_task(tasks, sink_name); - } - - // get source field - vector all_source_fields = get_all_fields(workflow, source, sourcee); - - // check if it's a pipeine source instead of a task source - bool pipeline_source = false; - task_t* source_task; - string source_name; - string source_port_name; - if (all_source_fields.size() == 1) { - // cout << "pipeline source" << endl; - source_name = all_source_fields[0].data; - pipeline_source = true; - } else { - // cout << "task source" << endl; - source_name = all_source_fields[0].data; - source_port_name = all_source_fields[1].data; - source_task = find_task(tasks, source_name); - } - - // update source reference if there is one - port_t* source_port; - if (!pipeline_source) { - source_port = find_port(&(source_task->outputs), source_port_name); - if (pipeline_sink) - source_port->pipeline_port = sink_name; - else { - source_port->pipeline_port = ""; - source_port->interfaces.push_back(sink_task); - } - } - - // update input reference if there is one - port_t* sink_port; - if (!pipeline_sink) { - sink_port = find_port(&(sink_task->inputs), sink_port_name); - if (pipeline_source) - sink_port->pipeline_port = source_name; - else { - sink_port->pipeline_port = ""; - sink_port->interfaces.push_back(source_task); - } - } - - // consumes the datalink ending - while (string(line).find(de) == string::npos && get_line(&line, workflow) != -1); - // cout << "datalink end" << line << endl; - - } - -} - -vector get_all_fields(FILE* workflow, string start, string end) { - char *line = NULL; - size_t len = 0; - string type; - string field; - vector fields; - general_field_t general_field; - - // consumes the beginning - while (get_line(&line, workflow) != -1 && string(line).find(start) == string::npos); - - // create general field regex - regex r ("<[\\w]+>[\\w ]+<\\/[\\w]+>"); - - // keep fiding fields until the end - while (get_line(&line, workflow) != -1 && string(line).find(end) == string::npos) { - smatch match; - string s(line); - regex_search(s, match, r); - - // if got a general field match - if (match.size() == 1) { - // cout << "general field match: " << line << endl; - type = s.substr(s.find("<")+1, s.find(">")-s.find("<")-1); - field = s.substr(s.find("<" + type + ">")+type.length()+2, s.find("")-s.find("<" + type + ">")-type.length()-2); - // cout << "type: " << type << ", field: " << field << endl; - general_field.type = type; - general_field.data = field; - fields.push_back(general_field); - } - } - return fields; -} - -task_t* find_task(list* tasks, string name) { - for (list::iterator i = tasks->begin(); i != tasks->end(); i++) - if (i->name.compare(name) == 0) - return &(*i); - - return NULL; -} - -port_t* find_port(list* ports, string name) { - for (list::iterator i = ports->begin(); i != ports->end(); i++) - if (i->name.compare(name) == 0) - return &(*i); - - return NULL; -} - -int get_line(char** line, FILE* f) { - char* nline; - size_t length=0; - if (line_buffer.empty()) { - if (getline(&nline, &length, f) == -1) - return -1; - string sline(nline); - size_t pos=string::npos; - while ((pos = sline.find("><")) != string::npos) { - line_buffer.push_back(sline.substr(0,pos+1)); - sline = sline.substr(pos+1); - } - line_buffer.push_back(sline); - } - - char* cline = (char*)malloc((line_buffer.front().length()+1)*sizeof(char*)); - memcpy(cline, line_buffer.front().c_str(), line_buffer.front().length()+1); - *line = cline; - line_buffer.pop_front(); - return strlen(*line); -} - -size_t size(list s) {return s.size();} - -void print(list s) { - for(list::iterator i=s.begin();i!=s.end();i++) - cout << *i << endl; -} - -// taken from: http://stackoverflow.com/questions/16388510/evaluate-a-string-with-a-switch-in-c -constexpr unsigned int str2int(const char* str, int h = 0) { - return !str[h] ? 5381 : (str2int(str, h+1) * 33) ^ str[h]; -} - -parsing::port_type_t get_port_type(string s) { - switch (str2int(s.c_str())) { - case str2int("integer"): - return parsing::int_t; - case str2int("float"): - return parsing::float_t; - case str2int("string"): - return parsing::string_t; - case str2int("array"): - return parsing::array_t; - default: - return parsing::error; - } -} diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/Segmentation.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/Segmentation.cpp deleted file mode 100644 index 96db77b..0000000 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/Segmentation.cpp +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Segmentation.cpp - * - * Created on: Feb 15, 2013 - * Author: george - */ - -#include "Segmentation.h" - - -Segmentation::Segmentation() { - this->setComponentName("Segmentation"); - this->addInputOutputDataRegion("tile", "BGR", RTPipelineComponentBase::INPUT);//_OUTPUT - this->addInputOutputDataRegion("tile", "MASK", RTPipelineComponentBase::OUTPUT);//_OUTPUT -} - -Segmentation::~Segmentation() { - -} - -int Segmentation::run() -{ - - // Print name and id of the component instance - std::cout << "Executing component: " << this->getComponentName() << " instance id: " << this->getId() <getRegionTemplateInstance("tile"); - - int parameterId = ((ArgumentInt*)this->getArgument(0))->getArgValue(); - int parameterSegId = ((ArgumentInt*)this->getArgument(1))->getArgValue(); - unsigned char blue = (unsigned char)((ArgumentInt*)this->getArgument(2))->getArgValue(); - unsigned char green = (unsigned char)((ArgumentInt*)this->getArgument(3))->getArgValue(); - unsigned char red = (unsigned char)((ArgumentInt*)this->getArgument(4))->getArgValue(); - double T1 = (double)((ArgumentFloat*)this->getArgument(5))->getArgValue(); - double T2 = (double)((ArgumentFloat*)this->getArgument(6))->getArgValue(); - unsigned char G1 = (unsigned char)((ArgumentInt*)this->getArgument(7))->getArgValue(); - unsigned char G2 = (unsigned char)((ArgumentInt*)this->getArgument(8))->getArgValue(); - int minSize = ((ArgumentInt*)this->getArgument(9))->getArgValue(); - int maxSize = ((ArgumentInt*)this->getArgument(10))->getArgValue(); - int minSizePl = ((ArgumentInt*)this->getArgument(11))->getArgValue(); - int minSizeSeg = ((ArgumentInt*)this->getArgument(12))->getArgValue(); - int maxSizeSeg= ((ArgumentInt*)this->getArgument(13))->getArgValue(); - int fillHolesConnectivity= ((ArgumentInt*)this->getArgument(14))->getArgValue(); - int reconConnectivity= ((ArgumentInt*)this->getArgument(15))->getArgValue(); - int watershedConnectivity= ((ArgumentInt*)this->getArgument(16))->getArgValue(); - - if(inputRt != NULL){ - DenseDataRegion2D *bgr = NULL; - try{ - bgr = dynamic_cast(inputRt->getDataRegion("BGR", "", 0, parameterId)); - std::cout << "Segmentation. paramenterId: "<< parameterId<getId() << " paramenterId: "<< parameterId<setName("MASK"); - mask->setId(bgr->getId()); - mask->setVersion(parameterSegId); - - inputRt->insertDataRegion(mask); - std::cout << "nDataRegions: after:" << inputRt->getNumDataRegions() << std::endl; - - // Create processing tasks - TaskSegmentationStg1 * segTask1 = new TaskSegmentationStg1(bgr, blue, - green, red, T1, T2, G1, minSize, maxSize, G2, fillHolesConnectivity, - reconConnectivity, &findCandidateResult, &seg_norbc, NULL, NULL); - - TaskSegmentationStg2 * segTask2 = new TaskSegmentationStg2(&findCandidateResult, - &seg_norbc, &seg_nohole,NULL, NULL); - TaskSegmentationStg3 * segTask3 = new TaskSegmentationStg3(&seg_nohole, - &seg_open, NULL, NULL); - img = bgr->getData(); - TaskSegmentationStg4 * segTask4 = new TaskSegmentationStg4(&img, minSizePl, - watershedConnectivity, &seg_open, &seg_nonoverlap, NULL, NULL); - TaskSegmentationStg5 * segTask5 = new TaskSegmentationStg5(minSizeSeg, - maxSizeSeg, &seg_nonoverlap, &seg, NULL, NULL); - TaskSegmentationStg6 * segTask6 = new TaskSegmentationStg6(&seg, mask, fillHolesConnectivity, NULL, NULL); - - // set dependencies - segTask2->addDependency(segTask1); - segTask3->addDependency(segTask2); - segTask4->addDependency(segTask3); - segTask5->addDependency(segTask4); - segTask6->addDependency(segTask5); - - this->executeTask(segTask1); - this->executeTask(segTask2); - this->executeTask(segTask3); - this->executeTask(segTask4); - this->executeTask(segTask5); - this->executeTask(segTask6); - - }else{ - std::cout << __FILE__ << ":" << __LINE__ <<" DR == NULL" << std::endl; - } - - }else{ - std::cout << __FILE__ << ":" << __LINE__ <<" RT == NULL" << std::endl; - } - - return 0; -} - -// Create the component factory -PipelineComponentBase* componentFactorySeg() { - return new Segmentation(); -} - -// register factory with the runtime system -bool registered = PipelineComponentBase::ComponentFactory::componentRegister("Segmentation", &componentFactorySeg); - - diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/Segmentation.h b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/Segmentation.h deleted file mode 100644 index ad64282..0000000 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/Segmentation.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Segmentation.h - * - * Created on: Feb 12, 2013 - * Author: george - */ - -#ifndef SEGMENTATION_H_ -#define SEGMENTATION_H_ - -#include "RTPipelineComponentBase.h" - -#include "opencv2/opencv.hpp" -#include "opencv2/gpu/gpu.hpp" -#include "HistologicalEntities.h" -#include "PixelOperations.h" -#include "MorphologicOperations.h" -#include "Util.h" -#include "FileUtils.h" - -#include "TaskSegmentationStg1.hpp" -#include "TaskSegmentationStg2.hpp" -#include "TaskSegmentationStg3.hpp" -#include "TaskSegmentationStg4.hpp" -#include "TaskSegmentationStg5.hpp" -#include "TaskSegmentationStg6.hpp" - -class Segmentation : public RTPipelineComponentBase { -private: - cv::Mat inputImage; - cv::Mat outLabeledMask; - - // stg1-2 intertask variables - int findCandidateResult; - Mat seg_norbc; - - // stg2-3 intertask variables - Mat seg_nohole; - - // stg3-4 intertask variables - Mat seg_open; - - // stg4-5 intertask variables - Mat img; - Mat seg_nonoverlap; - - // stg5-6 intertask variables - Mat seg; - -public: - Segmentation(); - virtual ~Segmentation(); - - int run(); - -}; - -#endif /* SEGMENTATION_H_ */ diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskNormalization.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskNormalization.cpp deleted file mode 100644 index 6e91050..0000000 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskNormalization.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#include "TaskNormalization.h" - -TaskNormalization::TaskNormalization(DenseDataRegion2D* raw, DenseDataRegion2D* bgr, float targetMean[3]) { - this->bgr = bgr; - this->raw = raw; - for(int i = 0; i < 3; i++) this->targetMean[i] = targetMean[i]; -} - -TaskNormalization::~TaskNormalization() { - if(raw != NULL) delete raw; -} - -bool TaskNormalization::run(int procType, int tid) { - cv::Mat inputImage = this->raw->getData(); - // target values computed from the reference image - - float targetStd[3] = {0.26235, 0.0514831, 0.0114217}; - - cv::Mat NormalizedImg; - std::cout << "Normalization:: "<< " targetMean: "<< targetMean[0]<<":"<< targetMean[1]<<":"<< targetMean[2]< 0) - NormalizedImg = ::nscale::Normalization::normalization(inputImage, targetMean, targetStd); - else - std::cout <<"Normalization: input data NULL" << std::endl; - uint64_t t2 = Util::ClockGetTimeProfile(); - - this->bgr->setData(NormalizedImg); - - std::cout << "Task Normalization time elapsed: "<< t2-t1 << std::endl; -} diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskNormalization.h b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskNormalization.h deleted file mode 100644 index 38c65de..0000000 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskNormalization.h +++ /dev/null @@ -1,32 +0,0 @@ - - -#ifndef TASK_NORMALIZATION_H_ -#define TASK_NORMALIZATION_H_ - -#include "Task.h" -#include "DenseDataRegion2D.h" - -#include "opencv2/opencv.hpp" -#include "opencv2/gpu/gpu.hpp" -#include "Normalization.h" -#include "Util.h" -#include "FileUtils.h" - - - -class TaskNormalization: public Task { -private: - DenseDataRegion2D* raw; - DenseDataRegion2D* bgr; - - float targetMean[3]; - -public: - TaskNormalization(DenseDataRegion2D* raw, DenseDataRegion2D* bgr, float targetMean[3]); - - virtual ~TaskNormalization(); - - bool run(int procType=ExecEngineConstants::CPU, int tid=0); -}; - -#endif /* TASK_NORMALIZATION_H_ */ diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentation.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentation.cpp deleted file mode 100644 index 808f0fa..0000000 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentation.cpp +++ /dev/null @@ -1,45 +0,0 @@ -#include "TaskSegmentation.h" - -TaskSegmentation::TaskSegmentation(DenseDataRegion2D* bgr, DenseDataRegion2D* mask, unsigned char blue, unsigned char green, unsigned char red, double T1, double T2, unsigned char G1, unsigned char G2, int minSize, int maxSize, int minSizePl, int minSizeSeg, int maxSizeSeg, int fillHolesConnectivity, int reconConnectivity, int watershedConnectivity) { - this->bgr = bgr; - this->mask = mask; - - this->blue = blue; - this->green = green; - this->red = red; - - this->T1 = T1; - this->T2 = T2; - this->G1 = G1; - this->G2 = G2; - this->minSize = minSize; - this->maxSize = maxSize; - this->minSizePl = minSizePl; - this->minSizeSeg = minSizeSeg; - this->maxSizeSeg = maxSizeSeg; - this->fillHolesConnectivity=fillHolesConnectivity; - this->reconConnectivity=reconConnectivity; - this->watershedConnectivity=watershedConnectivity; -} - -TaskSegmentation::~TaskSegmentation() { - if(bgr != NULL) delete bgr; -} - -bool TaskSegmentation::run(int procType, int tid) { - cv::Mat inputImage = this->bgr->getData(); - cv::Mat outMask; - - uint64_t t1 = Util::ClockGetTimeProfile(); - - std::cout << "TaskSegmentation: " << (int)blue << ":"<< (int)green << ":"<< (int)red << ":"<< T1<< ":"<< T2<< ":"<< (int)G1<< ":"<< minSize<< ":"<< maxSize<< ":"<< (int)G2<< ":"<< minSizePl<< ":"<< minSizeSeg<< ":"<< maxSizeSeg << ":" << fillHolesConnectivity << ":" << reconConnectivity << ":" << watershedConnectivity << std::endl; - if(inputImage.rows > 0) - int segmentationExecCode = ::nscale::HistologicalEntities::segmentNuclei(inputImage, outMask, blue, green, red, T1, T2, G1, minSize, maxSize, G2, minSizePl, minSizeSeg, maxSizeSeg, fillHolesConnectivity, reconConnectivity, watershedConnectivity); - else - std::cout <<"Segmentation: input data NULL"<< std::endl; - this->mask->setData(outMask); - - uint64_t t2 = Util::ClockGetTimeProfile(); - - std::cout << "Task Segmentation time elapsed: "<< t2-t1 << std::endl; -} diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentation.h b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentation.h deleted file mode 100644 index 6d45c9e..0000000 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentation.h +++ /dev/null @@ -1,38 +0,0 @@ - - -#ifndef TASK_SEGMENTATION_H_ -#define TASK_SEGMENTATION_H_ - -#include "Task.h" -#include "DenseDataRegion2D.h" - -#include "opencv2/opencv.hpp" -#include "opencv2/gpu/gpu.hpp" -#include "HistologicalEntities.h" -#include "PixelOperations.h" -#include "MorphologicOperations.h" -#include "Util.h" -#include "FileUtils.h" - - - -class TaskSegmentation: public Task { -private: - DenseDataRegion2D* bgr; - DenseDataRegion2D* mask; - - unsigned char blue, green, red; - double T1, T2; - unsigned char G1, G2; - int minSize, maxSize, minSizePl, minSizeSeg, maxSizeSeg; - int fillHolesConnectivity, reconConnectivity, watershedConnectivity; - -public: - TaskSegmentation(DenseDataRegion2D* bgr, DenseDataRegion2D* mask, unsigned char blue, unsigned char green, unsigned char red, double T1, double T2, unsigned char G1, unsigned char G2, int minSize, int maxSize, int minSizePl, int minSizeSeg, int maxSizeSeg, int fillHolesConnectivity, int reconConnectivity, int watershedConnectivity); - - virtual ~TaskSegmentation(); - - bool run(int procType=ExecEngineConstants::CPU, int tid=0); -}; - -#endif /* TASK_SEGMENTATION_H_ */ diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg1.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg1.cpp deleted file mode 100644 index 0d3dc2f..0000000 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg1.cpp +++ /dev/null @@ -1,37 +0,0 @@ -#include "TaskSegmentationStg1.hpp" - -TaskSegmentationStg1::TaskSegmentationStg1(DenseDataRegion2D* bgr, unsigned char blue, unsigned char green, unsigned char red, double T1, double T2, unsigned char G1, int minSize, int maxSize, unsigned char G2, int fillHolesConnectivity, int reconConnectivity, int* findCandidateResult, cv::Mat* seg_norbc, ::cciutils::SimpleCSVLogger *logger, ::cciutils::cv::IntermediateResultHandler *iresHandler) { - - this->img = bgr->getData(); - - this->blue = blue; - this->green = green; - this->red = red; - - this->T1 = T1; - this->T2 = T2; - this->G1 = G1; - this->G2 = G2; - this->minSize = minSize; - this->maxSize = maxSize; - this->fillHolesConnectivity=fillHolesConnectivity; - this->reconConnectivity=reconConnectivity; - - this->seg_norbc = seg_norbc; - this->findCandidateResult = findCandidateResult; - this->logger = logger; - this->iresHandler = iresHandler; -} - -TaskSegmentationStg1::~TaskSegmentationStg1() {}; - -bool TaskSegmentationStg1::run(int procType, int tid) { - uint64_t t1 = Util::ClockGetTimeProfile(); - - std::cout << "TaskSegmentationStg1" << std::endl; - int segmentationExecCode = ::nscale::HistologicalEntities::segmentNucleiStg1(img, blue, green, red, T1, T2, G1, minSize, maxSize, G2, fillHolesConnectivity, reconConnectivity, findCandidateResult, seg_norbc, logger, iresHandler); - - uint64_t t2 = Util::ClockGetTimeProfile(); - - std::cout << "Task Segmentation Stg1 time elapsed: "<< t2-t1 << std::endl; -} diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg1.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg1.hpp deleted file mode 100644 index 5229577..0000000 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg1.hpp +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef TASK_SEGMENTATION_STG1_H_ -#define TASK_SEGMENTATION_STG1_H_ - -#include "Task.h" -#include "DenseDataRegion2D.h" - -#include "opencv2/opencv.hpp" -#include "opencv2/gpu/gpu.hpp" -#include "HistologicalEntities.h" -#include "PixelOperations.h" -#include "MorphologicOperations.h" -#include "Util.h" -#include "FileUtils.h" - - - -class TaskSegmentationStg1: public Task { -private: - cv::Mat img; - - unsigned char blue, green, red; - double T1, T2; - unsigned char G1, G2; - int minSize, maxSize; - - int fillHolesConnectivity, reconConnectivity; - int* findCandidateResult; - cv::Mat* seg_norbc; - - ::cciutils::SimpleCSVLogger *logger; - ::cciutils::cv::IntermediateResultHandler *iresHandler; - -public: - TaskSegmentationStg1(DenseDataRegion2D* bgr, unsigned char blue, unsigned char green, unsigned char red, - double T1, double T2, unsigned char G1, int minSize, int maxSize, unsigned char G2, - int fillHolesConnectivity, int reconConnectivity, int* findCandidateResult, - cv::Mat* seg_norbc, ::cciutils::SimpleCSVLogger *logger, ::cciutils::cv::IntermediateResultHandler *iresHandler); - - virtual ~TaskSegmentationStg1(); - - bool run(int procType=ExecEngineConstants::CPU, int tid=0); -}; - -#endif /* TASK_SEGMENTATION_STG1_H_ */ diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg2.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg2.cpp deleted file mode 100644 index 786a48d..0000000 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg2.cpp +++ /dev/null @@ -1,24 +0,0 @@ -#include "TaskSegmentationStg2.hpp" - -TaskSegmentationStg2::TaskSegmentationStg2(int* findCandidateResult, cv::Mat* seg_norbc, cv::Mat* seg_nohole, - ::cciutils::SimpleCSVLogger *logger, ::cciutils::cv::IntermediateResultHandler *iresHandler){ - - this->findCandidateResult = findCandidateResult; - this->seg_norbc = seg_norbc; - this->seg_nohole = seg_nohole; - this->logger = logger; - this->iresHandler = iresHandler; -} - -TaskSegmentationStg2::~TaskSegmentationStg2() {} - -bool TaskSegmentationStg2::run(int procType, int tid) { - uint64_t t1 = Util::ClockGetTimeProfile(); - - std::cout << "TaskSegmentationStg2:" << std::endl; - int segmentationExecCode = ::nscale::HistologicalEntities::segmentNucleiStg2(findCandidateResult, seg_norbc, seg_nohole, logger, iresHandler); - - uint64_t t2 = Util::ClockGetTimeProfile(); - - std::cout << "Task Segmentation time elapsed: "<< t2-t1 << std::endl; -} diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg2.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg2.hpp deleted file mode 100644 index 0d02c15..0000000 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg2.hpp +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef TASK_SEGMENTATION_STG2_H_ -#define TASK_SEGMENTATION_STG2_H_ - -#include "Task.h" -#include "DenseDataRegion2D.h" - -#include "opencv2/opencv.hpp" -#include "opencv2/gpu/gpu.hpp" -#include "HistologicalEntities.h" -#include "PixelOperations.h" -#include "MorphologicOperations.h" -#include "Util.h" -#include "FileUtils.h" - - - -class TaskSegmentationStg2: public Task { -private: - int* findCandidateResult; - cv::Mat* seg_norbc; - cv::Mat* seg_nohole; - ::cciutils::SimpleCSVLogger *logger; - ::cciutils::cv::IntermediateResultHandler *iresHandler; - -public: - TaskSegmentationStg2(int* findCandidateResult, cv::Mat* seg_norbc, cv::Mat* seg_nohole, - ::cciutils::SimpleCSVLogger *logger, ::cciutils::cv::IntermediateResultHandler *iresHandler); - - virtual ~TaskSegmentationStg2(); - - bool run(int procType=ExecEngineConstants::CPU, int tid=0); -}; - -#endif /* TASK_SEGMENTATION_STG2_H_ */ diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg3.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg3.cpp deleted file mode 100644 index 81cb31b..0000000 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg3.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#include "TaskSegmentationStg3.hpp" - -TaskSegmentationStg3::TaskSegmentationStg3(cv::Mat* seg_nohole, cv::Mat* seg_open, - ::cciutils::SimpleCSVLogger *logger, ::cciutils::cv::IntermediateResultHandler *iresHandler){ - - this->seg_open = seg_open; - this->seg_nohole = seg_nohole; - this->logger = logger; - this->iresHandler = iresHandler; -} - -TaskSegmentationStg3::~TaskSegmentationStg3() {} - -bool TaskSegmentationStg3::run(int procType, int tid) { - uint64_t t1 = Util::ClockGetTimeProfile(); - - std::cout << "TaskSegmentationStg3:" << std::endl; - int segmentationExecCode = ::nscale::HistologicalEntities::segmentNucleiStg3(seg_nohole, seg_open, logger, iresHandler); - - uint64_t t2 = Util::ClockGetTimeProfile(); - - std::cout << "Task Segmentation time elapsed: "<< t2-t1 << std::endl; -} diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg3.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg3.hpp deleted file mode 100644 index f38e201..0000000 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg3.hpp +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef TASK_SEGMENTATION_STG3_H_ -#define TASK_SEGMENTATION_STG3_H_ - -#include "Task.h" -#include "DenseDataRegion2D.h" - -#include "opencv2/opencv.hpp" -#include "opencv2/gpu/gpu.hpp" -#include "HistologicalEntities.h" -#include "PixelOperations.h" -#include "MorphologicOperations.h" -#include "Util.h" -#include "FileUtils.h" - - - -class TaskSegmentationStg3: public Task { -private: - cv::Mat* seg_open; - cv::Mat* seg_nohole; - ::cciutils::SimpleCSVLogger *logger; - ::cciutils::cv::IntermediateResultHandler *iresHandler; - -public: - TaskSegmentationStg3(cv::Mat* seg_nohole, cv::Mat* seg_open, - ::cciutils::SimpleCSVLogger *logger, ::cciutils::cv::IntermediateResultHandler *iresHandler); - - virtual ~TaskSegmentationStg3(); - - bool run(int procType=ExecEngineConstants::CPU, int tid=0); -}; - -#endif /* TASK_SEGMENTATION_STG3_H_ */ diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg4.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg4.cpp deleted file mode 100644 index 543ccaa..0000000 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg4.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include "TaskSegmentationStg4.hpp" - -TaskSegmentationStg4::TaskSegmentationStg4(const cv::Mat* img, int minSizePl, int watershedConnectivity, - cv::Mat* seg_open, cv::Mat* seg_nonoverlap, ::cciutils::SimpleCSVLogger *logger, - ::cciutils::cv::IntermediateResultHandler *iresHandler){ - - this->img = img; - this->minSizePl = minSizePl; - this->watershedConnectivity = watershedConnectivity; - this->seg_open = seg_open; - this->seg_nonoverlap = seg_nonoverlap; - - this->logger = logger; - this->iresHandler = iresHandler; -} - -TaskSegmentationStg4::~TaskSegmentationStg4() {} - -bool TaskSegmentationStg4::run(int procType, int tid) { - uint64_t t1 = Util::ClockGetTimeProfile(); - - std::cout << "TaskSegmentationStg4:" << std::endl; - int segmentationExecCode = ::nscale::HistologicalEntities::segmentNucleiStg4(img, minSizePl, - watershedConnectivity, seg_open, seg_nonoverlap, logger, iresHandler); - - uint64_t t2 = Util::ClockGetTimeProfile(); - - std::cout << "Task Segmentation time elapsed: "<< t2-t1 << std::endl; -} diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg4.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg4.hpp deleted file mode 100644 index 8569964..0000000 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg4.hpp +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef TASK_SEGMENTATION_STG4_H_ -#define TASK_SEGMENTATION_STG4_H_ - -#include "Task.h" -#include "DenseDataRegion2D.h" - -#include "opencv2/opencv.hpp" -#include "opencv2/gpu/gpu.hpp" -#include "HistologicalEntities.h" -#include "PixelOperations.h" -#include "MorphologicOperations.h" -#include "Util.h" -#include "FileUtils.h" - - - -class TaskSegmentationStg4: public Task { -private: - const cv::Mat* img; - int minSizePl; - int watershedConnectivity; - cv::Mat* seg_open; - cv::Mat* seg_nonoverlap; - ::cciutils::SimpleCSVLogger *logger; - ::cciutils::cv::IntermediateResultHandler *iresHandler; - -public: - TaskSegmentationStg4(const cv::Mat* img, int minSizePl, int watershedConnectivity, - cv::Mat* seg_open, cv::Mat* seg_nonoverlap, ::cciutils::SimpleCSVLogger *logger, - ::cciutils::cv::IntermediateResultHandler *iresHandler); - - virtual ~TaskSegmentationStg4(); - - bool run(int procType=ExecEngineConstants::CPU, int tid=0); -}; - -#endif /* TASK_SEGMENTATION_STG4_H_ */ diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg5.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg5.cpp deleted file mode 100644 index 123195f..0000000 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg5.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include "TaskSegmentationStg5.hpp" - -TaskSegmentationStg5::TaskSegmentationStg5(int minSizeSeg, int maxSizeSeg, cv::Mat* seg_nonoverlap, cv::Mat* seg, - ::cciutils::SimpleCSVLogger *logger, ::cciutils::cv::IntermediateResultHandler *iresHandler){ - - this->minSizeSeg = minSizeSeg; - this->maxSizeSeg = maxSizeSeg; - this->seg_nonoverlap = seg_nonoverlap; - this->seg = seg; - - this->logger = logger; - this->iresHandler = iresHandler; -} - -TaskSegmentationStg5::~TaskSegmentationStg5() {} - -bool TaskSegmentationStg5::run(int procType, int tid) { - uint64_t t1 = Util::ClockGetTimeProfile(); - - std::cout << "TaskSegmentationStg5:" << std::endl; - int segmentationExecCode = ::nscale::HistologicalEntities::segmentNucleiStg5(minSizeSeg, maxSizeSeg, seg_nonoverlap, - seg, logger, iresHandler); - - uint64_t t2 = Util::ClockGetTimeProfile(); - - std::cout << "Task Segmentation time elapsed: "<< t2-t1 << std::endl; -} diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg5.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg5.hpp deleted file mode 100644 index a272649..0000000 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg5.hpp +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef TASK_SEGMENTATION_STG5_H_ -#define TASK_SEGMENTATION_STG5_H_ - -#include "Task.h" -#include "DenseDataRegion2D.h" - -#include "opencv2/opencv.hpp" -#include "opencv2/gpu/gpu.hpp" -#include "HistologicalEntities.h" -#include "PixelOperations.h" -#include "MorphologicOperations.h" -#include "Util.h" -#include "FileUtils.h" - - - -class TaskSegmentationStg5: public Task { -private: - int minSizeSeg; - int maxSizeSeg; - cv::Mat* seg_nonoverlap; - cv::Mat* seg; - ::cciutils::SimpleCSVLogger *logger; - ::cciutils::cv::IntermediateResultHandler *iresHandler; - -public: - TaskSegmentationStg5(int minSizeSeg, int maxSizeSeg, cv::Mat* seg_nonoverlap, cv::Mat* seg, - ::cciutils::SimpleCSVLogger *logger, ::cciutils::cv::IntermediateResultHandler *iresHandler); - - virtual ~TaskSegmentationStg5(); - - bool run(int procType=ExecEngineConstants::CPU, int tid=0); -}; - -#endif /* TASK_SEGMENTATION_STG5_H_ */ diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg6.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg6.cpp deleted file mode 100644 index 6def671..0000000 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg6.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include "TaskSegmentationStg6.hpp" - -TaskSegmentationStg6::TaskSegmentationStg6(cv::Mat* seg, DenseDataRegion2D* output, int fillHolesConnectivity, ::cciutils::SimpleCSVLogger *logger, ::cciutils::cv::IntermediateResultHandler *iresHandler){ - - this->seg = seg; - this->output = output; - this->fillHolesConnectivity = fillHolesConnectivity; - - this->logger = logger; - this->iresHandler = iresHandler; -} - -TaskSegmentationStg6::~TaskSegmentationStg6() {} - -bool TaskSegmentationStg6::run(int procType, int tid) { - uint64_t t1 = Util::ClockGetTimeProfile(); - cv::Mat outMask; - - std::cout << "TaskSegmentationStg6:" << std::endl; - int segmentationExecCode = ::nscale::HistologicalEntities::segmentNucleiStg6(&outMask, fillHolesConnectivity, seg, logger, iresHandler); - - this->output->setData(outMask); - - uint64_t t2 = Util::ClockGetTimeProfile(); - - std::cout << "Task Segmentation time elapsed: "<< t2-t1 << std::endl; -} diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg6.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg6.hpp deleted file mode 100644 index 2cd073c..0000000 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/old/TaskSegmentationStg6.hpp +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef TASK_SEGMENTATION_STG6_H_ -#define TASK_SEGMENTATION_STG6_H_ - -#include "Task.h" -#include "DenseDataRegion2D.h" - -#include "opencv2/opencv.hpp" -#include "opencv2/gpu/gpu.hpp" -#include "HistologicalEntities.h" -#include "PixelOperations.h" -#include "MorphologicOperations.h" -#include "Util.h" -#include "FileUtils.h" - - - -class TaskSegmentationStg6: public Task { -private: - DenseDataRegion2D* output; - cv::Mat* seg; - int fillHolesConnectivity; - ::cciutils::SimpleCSVLogger *logger; - ::cciutils::cv::IntermediateResultHandler *iresHandler; - -public: - TaskSegmentationStg6(cv::Mat* seg, DenseDataRegion2D* output, int fillHolesConnectivity, ::cciutils::SimpleCSVLogger *logger, ::cciutils::cv::IntermediateResultHandler *iresHandler); - - virtual ~TaskSegmentationStg6(); - - bool run(int procType=ExecEngineConstants::CPU, int tid=0); -}; - -#endif /* TASK_SEGMENTATION_STG6_H_ */ diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/parsing.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/parsing.cpp new file mode 100644 index 0000000..50a5422 --- /dev/null +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/parsing.cpp @@ -0,0 +1,440 @@ +#include "parsing.hpp" + +/***************************************************************/ +/***************** Arguments parsing functions *****************/ +/***************************************************************/ + +int find_arg_pos(string s, int argc, char** argv) { + for (int i=1; i &workflow_inputs, + map> ¶meters_values) { + + char *line = NULL; + size_t len = 0; + + // initial ports section beginning and end + string ip(""); + string ipe(""); + + // ports section beginning and end + string p(""); + string pe(""); + + // argument name, stored before to be consumed when the ArgumentBase type can be set + string name; + + // go to the initial ports beginning + while (get_line(&line, workflow_descriptor) != -1 && string(line).find(ip) == string::npos) + delete line; + // cout << "port init begin: " << line << endl; + + // keep getting ports until it reaches the end of initial ports + while (get_line(&line, workflow_descriptor) != -1 && string(line).find(ipe) == string::npos) { + // consumes the port beginning + while (string(line).find(p) == string::npos && get_line(&line, workflow_descriptor) != -1) { + delete line; + line = NULL; + } + + if (line != NULL) + delete line; + // cout << "port begin: " << line << endl; + + // finds the name field + name = get_workflow_name(workflow_descriptor); + // cout << "name: " << name << endl; + + // finds the description field + string description = get_workflow_field(workflow_descriptor, "text"); + // cout << "description: " << description << endl; + + // parse the description to get the input value(s) + Json::Reader reader; + bool wellFormed; + Json::Value data; + + wellFormed = reader.parse(description, data, false); + if(!wellFormed) { + cout << "Failed to parse JSON: " << description << endl << reader.getFormattedErrorMessages() << endl; + exit(-3); + } + + // create the propper Argument object for each type case also getting + // the parameters' values + ArgumentBase* inp_arg; + list inp_values; + switch (get_port_type(data["type"].asString())) { + case parsing::int_t: + // create the argument + inp_arg = new ArgumentInt(); + // cout << "int argument: " << name << ", values: " << endl; + // get all possible values for the argument + for (int i=0; itoString() << endl; + inp_values.emplace_back(val); + } + // cout << endl; + break; + case parsing::string_t: + // create the argument + inp_arg = new ArgumentString(); + // cout << "string argument: " << name << ", values: " << endl; + // get all possible values for the argument + for (int i=0; itoString() << endl; + inp_values.emplace_back(val); + } + // cout << endl; + break; + case parsing::float_t: + // create the argument + inp_arg = new ArgumentFloat(); + // cout << "float argument: " << name << ", values: " << endl; + // get all possible values for the argument + for (int i=0; itoString() << endl; + inp_values.emplace_back(val); + } + // cout << endl; + break; + case parsing::float_array_t: + // create the argument + inp_arg = new ArgumentFloatArray(); + // cout << "floatarray argument: " << name << ", values: " << endl; + // get all possible values for the argument + for (int i=0; iaddArgValue(temp); + // cout << temp.toString() << endl; + } + // cout << "]"; + inp_values.emplace_back(val); + } + // cout << endl; + break; + case parsing::rt_t: + // create the argument + inp_arg = new ArgumentRT(); + // cout << "string argument: " << name << ", values: " << endl; + // get all possible values for the argument + for (int i=0; iisFileInput = true; + // cout << ((ArgumentString*)val)->toString() << endl; + inp_values.emplace_back(val); + } + // cout << endl; + break; + default: + exit(-4); + } + + // set inp_arg name, id and input type + inp_arg->setName(name); + int arg_id = new_uid(); + inp_arg->setId(arg_id); + inp_arg->setIo(ArgumentBase::input); + + // add input argument to map + workflow_inputs[arg_id] = inp_arg; + + // add list of argument values to map + parameters_values[arg_id] = inp_values; + + // consumes the port ending + while (get_line(&line, workflow_descriptor) != -1 && string(line).find(pe) == string::npos) + delete line; + // cout << "not port end: " << line << endl; + // cout << "port end: " << line << endl; + } +} + +// returns by reference a map of output arguments, mapped by an uid, 'workflow_outputs' +void get_outputs_from_file(FILE* workflow_descriptor, map &workflow_outputs) { + + char *line = NULL; + size_t len = 0; + + // initial ports section beginning and end + string ip(""); + string ipe(""); + + // ports section beginning and end + string p(""); + string pe(""); + + // go to the initial ports beginning + while (get_line(&line, workflow_descriptor) != -1 && string(line).find(ip) == string::npos) + delete line; + // cout << "port init begin: " << line << endl; + + // keep getting ports until it reaches the end of initial ports + while (get_line(&line, workflow_descriptor) != -1 && string(line).find(ipe) == string::npos) { + // consumes the port beginning + while (string(line).find(p) == string::npos && get_line(&line, workflow_descriptor) != -1) { + delete line; + line = NULL; + } + if (line != NULL) + delete line; + // cout << "port begin: " << line << endl; + + // finds the name field + string name = get_workflow_name(workflow_descriptor); + // cout << "name: " << name << endl; + + // finds the description field + string description = get_workflow_field(workflow_descriptor, "text"); + // cout << "description: " << description << endl; + + // parse the description to get the input value(s) + Json::Reader reader; + bool wellFormed; + Json::Value data; + + wellFormed = reader.parse(description, data, false); + if(!wellFormed) { + cout << "Failed to parse JSON: " << description << endl << reader.getFormattedErrorMessages() << endl; + exit(-3); + } + + // create the propper Argument object for each type case also getting + // the parameters' values + ArgumentBase* out_arg; + switch (get_port_type(data["type"].asString())) { + case parsing::int_t: + // create the argument + out_arg = new ArgumentInt(); + // cout << "int output: " << name << endl; + break; + case parsing::string_t: + // create the argument + out_arg = new ArgumentString(); + // cout << "string output: " << name << endl; + break; + case parsing::float_t: + // create the argument + out_arg = new ArgumentFloat(); + // cout << "float output: " << name << endl; + break; + case parsing::float_array_t: + // create the argument + out_arg = new ArgumentFloatArray(); + // cout << "floatarray output: " << name << endl; + break; + case parsing::rt_t: + // create the argument + out_arg = new ArgumentRT(); + // cout << "string output: " << name << endl; + break; + default: + exit(-4); + } + + out_arg->setName(name); + out_arg->setIo(ArgumentBase::output); + int new_id = new_uid(); + out_arg->setId(new_id); + workflow_outputs[new_id] = out_arg; + + // consumes the port ending + while (get_line(&line, workflow_descriptor) != -1 && string(line).find(pe) == string::npos) + delete line; + // get_line << "not port end: " << line << endl; + // cout << "port end: " << line << endl; + } + // cout << "port init end: " << line << endl; +} + +// returns by reference the map of stages on its uid, 'base_stages', and also a map +// of all output arguments of all stages on its uid, 'interstage_arguments'. +void get_stages_from_file(FILE* workflow_descriptor, + map &base_stages, + map &interstage_arguments) { + + char *line = NULL; + size_t len = 0; + + string ps(""); + string pse(""); + + string p(""); + string pe(""); + + // go to the processors beginning + while (get_line(&line, workflow_descriptor) != -1 && string(line).find(ps) == string::npos) + delete line; + // cout << "not processor init begin: " << line << endl; + // cout << "processor init begin: " << line << endl; + + // keep getting single processors until it reaches the end of all processors + while (get_line(&line, workflow_descriptor) != -1 && string(line).find(pse) == string::npos) { + // consumes the processor beginning + while (string(line).find(p) == string::npos && get_line(&line, workflow_descriptor) != -1) { + delete line; + line = NULL; + } + + if (line != NULL) + delete line; + + // cout << "processor begin: " << line << endl; + + // get stage fields + string name = get_workflow_name(workflow_descriptor); + // cout << "name: " << name << endl; + + // get stage command + string command = get_workflow_field(workflow_descriptor, "command"); + // cout << "command: " << command << endl; + + PipelineComponentBase* stage = PipelineComponentBase::ComponentFactory::getComponentFactory(command)(); + stage->setName(name); + + // workaround to make sure that the RTs, if any, won't leak on the mearging part of the algorithm + stage->setLocation(PipelineComponentBase::WORKER_SIDE); + + // get outputs and add them to the map of arguments + // list inputs = get_workflow_ports(workflow_descriptor, "inputPorts"); + // cout << "outputs:" << endl; + list outputs; + get_workflow_arguments(workflow_descriptor, outputs); + for(list::iterator i=outputs.begin(); i!=outputs.end(); i++) { + // cout << "\t" << (*i)->getId() << ":" << (*i)->getName() << endl; + interstage_arguments[(*i)->getId()] = *i; + stage->addOutput((*i)->getId()); + } + + int stg_id = new_uid(); + // cout << "uid: " << stg_id << endl; + // setting task id + stage->setId(stg_id); + base_stages[stg_id] = stage; + + // consumes the processor ending + while (get_line(&line, workflow_descriptor) != -1 && string(line).find(pe) == string::npos) + delete line; + // cout << "not processor end: " << line << endl; + // cout << "processor end: " << line << endl; + } +} + +// returns by reference the map of stages to its ids updated. each stage now has +// the list of input ids +void connect_stages_from_file(FILE* workflow_descriptor, + map &base_stages, + map &interstage_arguments, + map &input_arguments, + map> &deps, + map &workflow_outputs) { + + char *line = NULL; + size_t len = 0; + + string ds(""); + string dse(""); + + string d(""); + string de(""); + + string sink(""); + + string source(""); + + // go to the datalinks beginning + while (get_line(&line, workflow_descriptor) != -1 && string(line).find(ds) == string::npos) + delete line; + // cout << "not datalink init begin" << line << endl; + // cout << "datalink init begin" << line << endl; + + // keep getting single datalinks until it reaches the end of all datalinks + while (get_line(&line, workflow_descriptor) != -1 && string(line).find(dse) == string::npos) { + // consumes the datalink beginning + while (string(line).find(d) == string::npos && get_line(&line, workflow_descriptor) != -1) { + delete line; + line = NULL; + } + + if (line != NULL) + delete line; + + // cout << "datalink begin" << line << endl; + + // get sink and source fields + vector all_sink_fields = get_all_fields(workflow_descriptor, sink, sinke); + vector all_source_fields = get_all_fields(workflow_descriptor, source, sourcee); + + // verify if it's a task sink instead of a workflow sink + if (all_sink_fields.size() != 1) { + // get the sink stage + PipelineComponentBase* sink_stg = find_stage(base_stages, all_sink_fields[0].data); + // cout << "stage " << sink_stg->getId() << ":" << sink_stg->getName() << " sink" << endl; + + ArgumentBase* arg; + // check whether the source is from the workflow arguments or another stage + if (all_source_fields.size() == 1) { + // if source is workflow argument: + arg = find_argument(input_arguments, all_source_fields[0].data); + // cout << "source from workflow is " << arg->getId() << ":" << arg->getName() << endl; + } else { + // if the source is another stage + deps[sink_stg->getId()].emplace_back(find_stage(base_stages, all_source_fields[0].data)->getId()); + arg = find_argument(interstage_arguments, all_source_fields[1].data); + arg->setParent(find_stage(base_stages, all_source_fields[0].data)->getId()); + // cout << "source from stage " << all_source_fields[0].data << " is " << arg->getId() << ":" + // << arg->getName() << " parent " << arg->getParent() << endl; + } + + // add the link to the sink stage + sink_stg->addInput(arg->getId()); + } + else { + // cout << "workflow argument sink: " << all_sink_fields[0].data << endl; + // update workflow output id in order to access it later to retreive the output + + ArgumentBase* itstg_argument = find_argument(interstage_arguments, all_source_fields[1].data); + // cout << "Output " << all_sink_fields[0].data << " connects to argument " << itstg_argument->getId() << + // ":" << itstg_argument->getName() << endl; + ArgumentBase* output = find_argument(workflow_outputs, all_sink_fields[0].data); + // cout << "Output " << all_sink_fields[0].data << " had id " << output->getId() << endl; + + // remove reference of old id from map + workflow_outputs.erase(output->getId()); + + // update the output id + output->setId(itstg_argument->getId()); + // cout << "Output " << all_sink_fields[0].data << " now has id " << output->getId() << endl; + + // re-insert the output with the new id + workflow_outputs[output->getId()] = output; + } + + // consumes the datalink ending + bool cond = string(line).find(de) == string::npos; + while (cond && get_line(&line, workflow_descriptor) != -1) { + cond = string(line).find(de) == string::npos; + delete line; + } + // cout << "datalink end" << line << endl; + } +} \ No newline at end of file diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/parsing.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/parsing.hpp new file mode 100644 index 0000000..7dedd54 --- /dev/null +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/parsing.hpp @@ -0,0 +1,61 @@ +#ifndef PARSING_HPP_ +#define PARSING_HPP_ + +#include +#include +#include +#include + +#include +#include "json/json.h" + +#include "Argument.h" +#include "PipelineComponentBase.h" +#include "fg_reuse/merging.hpp" + +using namespace std; + +namespace parsing { +enum port_type_t { + int_t, string_t, float_t, float_array_t, rt_t, error +}; +} + +// general xml field structure +typedef struct { + string type; + string data; +} general_field_t; + +// Argument parsing functions +int find_arg_pos(string s, int argc, char** argv); + +// Workflow parsing functions +void get_inputs_from_file(FILE* workflow_descriptor, map &workflow_inputs, + map> ¶meters_values); +void get_outputs_from_file(FILE* workflow_descriptor, map &workflow_outputs); +void get_stages_from_file(FILE* workflow_descriptor, map &base_stages, + map &interstage_arguments); +void connect_stages_from_file(FILE* workflow_descriptor, map &base_stages, + map &interstage_arguments, map &input_arguments, + map> &deps, map &workflow_outputs); +void expand_stages(const map &args, map> args_values, + map &expanded_args,map stages, + map &expanded_stages, map &workflow_outputs); + +// Workflow parsing helper functions +static list line_buffer; +int get_line(char** line, FILE* f); +string get_workflow_name(FILE* workflow); +string get_workflow_field(FILE* workflow, string field); +void get_workflow_arguments(FILE* workflow, list &output_arguments); +vector get_all_fields(FILE* workflow, string start, string end); +PipelineComponentBase* find_stage(map stages, string name); +int find_stage_id(map stages, string name); +ArgumentBase* find_argument(const map& arguments, string name); +ArgumentBase* find_argument(const list& arguments, int id); +ArgumentBase* find_argument(const list& arguments, string name); +ArgumentBase* new_typed_arg_base(string type); +parsing::port_type_t get_port_type(string s); + +#endif \ No newline at end of file diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/parsing_helper.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/parsing_helper.cpp new file mode 100644 index 0000000..845cca4 --- /dev/null +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/parsing_helper.cpp @@ -0,0 +1,227 @@ +#include "parsing.hpp" + +/***************************************************************/ +/************* Workflow parsing helper functions ***************/ +/***************************************************************/ + +int get_line(char** line, FILE* f) { + char* nline; + size_t length=0; + if (line_buffer.empty()) { + if (getline(&nline, &length, f) == -1) + return -1; + string sline(nline); + size_t pos=string::npos; + while ((pos = sline.find("><")) != string::npos) { + line_buffer.emplace_back(sline.substr(0,pos+1)); + sline = sline.substr(pos+1); + } + line_buffer.emplace_back(sline); + } + + char* cline = (char*)malloc((line_buffer.front().length()+1)*sizeof(char*)); + memcpy(cline, line_buffer.front().c_str(), line_buffer.front().length()+1); + *line = cline; + line_buffer.pop_front(); + return strlen(*line); +} + +string get_workflow_name(FILE* workflow) { + return get_workflow_field(workflow, "name"); +} + +string get_workflow_field(FILE* workflow, string field) { + char *line = NULL; + size_t len = 0; + + // create field regex + regex r ("<" + field + ">[\"\\:\\w {},.~\\/\\[\\]-]+<\\/" + field + ">"); + + // get a new line until name is found + while (get_line(&line, workflow) != -1) { + smatch match; + string s(line); + regex_search(s, match, r); + + // cout << "line: " << s << endl; + + // if got a name match + if (match.size() == 1) { + // cout << "field match: " << line << endl; + return s.substr(s.find("<" + field + ">")+field.length()+2, + s.find("")-s.find("<" + field + ">")-field.length()-2); + } + delete line; + } + + return nullptr; +} + +void get_workflow_arguments(FILE* workflow, + list &output_arguments) { + + char *line = NULL; + size_t len = 0; + + // initial ports section beginning and end + string ie(""); + string iee(""); + + // ports section beginning and end + string e(""); + string ee(""); + + // go to the initial entries beginning + while (get_line(&line, workflow) != -1 && string(line).find(ie) == string::npos) { + delete line; + line = NULL; + } + // cout << "port init begin: " << line << endl; + + // keep getting ports until it reaches the end of initial ports + while (get_line(&line, workflow) != -1 && string(line).find(iee) == string::npos) { + // consumes the port beginning + while (string(line).find(e) == string::npos && get_line(&line, workflow) != -1) + delete line; + // cout << "port begin: " << line << endl; + + // finds the name and field + string name = get_workflow_field(workflow, "string"); + + // generate an argument + string type = get_workflow_field(workflow, "path"); + ArgumentBase* arg = new_typed_arg_base(type); + arg->setName(name); + arg->setId(new_uid()); + output_arguments.emplace_back(arg); + + // consumes the port ending + while (get_line(&line, workflow) != -1 && string(line).find(ee) == string::npos) { + delete line; + // some c++ implementations may not set line to null after delete + line = NULL; + } + // cout << "not port end: " << line << endl; + // cout << "port end: " << line << endl; + + if (line != NULL) { + delete line; + line = NULL; + } + + } + + if (line != NULL) + delete line; + // cout << "port init end: " << line << endl; +} + +vector get_all_fields(FILE* workflow, string start, string end) { + char *line = NULL; + size_t len = 0; + string type; + string field; + vector fields; + general_field_t general_field; + + // consumes the beginning + while (get_line(&line, workflow) != -1 && string(line).find(start) == string::npos) + delete line; + + // create general field regex + regex r ("<[\\w]+>[\\w ]+<\\/[\\w]+>"); + + // keep fiding fields until the end + while (get_line(&line, workflow) != -1 && string(line).find(end) == string::npos) { + smatch match; + string s(line); + regex_search(s, match, r); + + // if got a general field match + if (match.size() == 1) { + // cout << "general field match: " << line << endl; + type = s.substr(s.find("<")+1, s.find(">")-s.find("<")-1); + field = s.substr(s.find("<" + type + ">")+type.length()+2, s.find("")-s.find("<" + type + ">")-type.length()-2); + // cout << "type: " << type << ", field: " << field << endl; + general_field.type = type; + general_field.data = field; + fields.push_back(general_field); + } + delete line; + } + return fields; +} + +PipelineComponentBase* find_stage(map stages, string name) { + for (pair p : stages) + if (p.second->getName().compare(name) == 0) + return p.second; + return NULL; +} + +int find_stage_id(map stages, string name) { + for (pair p : stages) + if (p.second->getName().compare(name) == 0) + return p.first; + return -1; +} + +ArgumentBase* find_argument(const map& arguments, string name) { + for (pair p : arguments) + if (p.second->getName().compare(name) == 0) + return p.second; + return NULL; +} + +ArgumentBase* find_argument(const list& arguments, int id) { + for (ArgumentBase* a : arguments) + if (a->getId() == id) + return a; + return NULL; +} + +ArgumentBase* find_argument(const list& arguments, string name) { + for (ArgumentBase* a : arguments) + if (a->getName().compare(name) == 0) + return a; + return NULL; +} + +// taken from: http://stackoverflow.com/questions/16388510/evaluate-a-string-with-a-switch-in-c +constexpr unsigned int str2int(const char* str, int h = 0) { + return !str[h] ? 5381 : (str2int(str, h+1) * 33) ^ str[h]; +} + +ArgumentBase* new_typed_arg_base(string type) { + switch (str2int(type.c_str())) { + case str2int("integer"): + return new ArgumentInt(); + case str2int("float"): + return new ArgumentFloat(); + case str2int("string"): + return new ArgumentString(); + case str2int("floatarray"): + return new ArgumentFloatArray(); + case str2int("rt"): + return new ArgumentRT(); + default: + return NULL; + } +} + +parsing::port_type_t get_port_type(string s) { + switch (str2int(s.c_str())) { + case str2int("integer"): + return parsing::int_t; + case str2int("float"): + return parsing::float_t; + case str2int("string"): + return parsing::string_t; + case str2int("floatarray"): + return parsing::float_array_t; + case str2int("rt"): + return parsing::rt_t; + default: + return parsing::error; + } +} diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/stages/CMakeLists.txt b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/stages/CMakeLists.txt new file mode 100644 index 0000000..875c77c --- /dev/null +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/stages/CMakeLists.txt @@ -0,0 +1,52 @@ +cmake_minimum_required(VERSION 2.6) +project(PipelineRTFS-NS-Diff-FGO-Stages) + +add_definitions( -std=c++11 -ggdb -gdwarf-2 -fopenmp) +#add_definitions( -std=c++11 ) + +#find_package( OpenCV REQUIRED ) + +# Make sure the compiler can find the includes of the runtime system +#include_directories(${Runtime_SOURCE_DIR}) +#include_directories(${Runtime_SOURCE_DIR}/ResourceManager) +#include_directories(${Runtime_SOURCE_DIR}/util) +#include_directories(${RegionTemplate_SOURCE_DIR}) +#include_directories(${RegionTemplate_SOURCE_DIR}/Utils) +#include_directories(${RegionTemplate_SOURCE_DIR}/comparativeanalysis) + +# nscale dirs +#find_path(NSCALE_SRC_DIR REQUIRED) +#find_path(NSCALE_BUILD_DIR REQUIRED) +#set(nscalesrcdir ${NSCALE_SRC_DIR}) +#set(nscalebuilddir ${NSCALE_BUILD_DIR}) + +#includes +#include_directories(${nscalesrcdir}/segment) +#include_directories(${nscalesrcdir}/segment/cuda) +#include_directories(${nscalesrcdir}/common) +#include_directories(${nscalesrcdir}/features) +#include_directories(${nscalesrcdir}/normalization) + +# Make sure the compiler can find the library in runtime system directory +#link_directories(${Runtime_SOURCE_DIR}) +# nscale lib dir +#link_directories(/Users/george/Documents/emory/nscale-sc13/nscale/lib) +#link_directories(${nscalebuilddir}/lib) +# Create library with components implementation + +set(libname componentnsdifffgostages) + +# Source files used by the Runtime System +set(libstages NormalizationComp.cpp Segmentation.cpp FeatureExtraction.cpp TaskFeatures.cpp DiffMaskComp.cpp) + +#set(libcomparativeanalysis ../../comparativeanalysis/TaskDiffMask.cpp ../../comparativeanalysis/pixelcompare/PixelCompare.cpp) + +# Add rule to generate the Runtime System, as a shared library (.so) +add_library("${libname}" SHARED ${libstages}) + +#set_target_properties("${libname}" PROPERTIES LINK_FLAGS "${MPI_LINK_FLAGS}") +#target_link_libraries("${libname}" runtimesystem) +#target_link_libraries(${libname} regiontemplates) + +# nscale libs +#target_link_libraries("${libname}" segment normalization featuresAll ${OpenCV_LIBS}) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/DiffMaskComp.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/stages/DiffMaskComp.cpp similarity index 100% rename from runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/DiffMaskComp.cpp rename to runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/stages/DiffMaskComp.cpp diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/DiffMaskComp.h b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/stages/DiffMaskComp.h similarity index 100% rename from runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/DiffMaskComp.h rename to runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/stages/DiffMaskComp.h diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/FeatureExtraction.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/stages/FeatureExtraction.cpp similarity index 100% rename from runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/FeatureExtraction.cpp rename to runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/stages/FeatureExtraction.cpp diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/FeatureExtraction.h b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/stages/FeatureExtraction.h similarity index 100% rename from runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/FeatureExtraction.h rename to runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/stages/FeatureExtraction.h diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/NormalizationComp.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/stages/NormalizationComp.cpp similarity index 100% rename from runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/NormalizationComp.cpp rename to runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/stages/NormalizationComp.cpp diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/NormalizationComp.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/stages/NormalizationComp.hpp similarity index 100% rename from runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/NormalizationComp.hpp rename to runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/stages/NormalizationComp.hpp diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/stages/Segmentation.cpp similarity index 100% rename from runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.cpp rename to runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/stages/Segmentation.cpp diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/stages/Segmentation.hpp similarity index 100% rename from runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/Segmentation.hpp rename to runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/stages/Segmentation.hpp diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/TaskFeatures.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/stages/TaskFeatures.cpp similarity index 100% rename from runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/TaskFeatures.cpp rename to runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/stages/TaskFeatures.cpp diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/TaskFeatures.h b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/stages/TaskFeatures.h similarity index 100% rename from runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/TaskFeatures.h rename to runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/stages/TaskFeatures.h From 29f8eb7052c4420a10b9e57c21370d2c36315d05 Mon Sep 17 00:00:00 2001 From: Willian Date: Thu, 27 Apr 2017 02:10:03 -0300 Subject: [PATCH 86/87] Updated the stage generator to match the current needs and fixed a minor bug of non-matching of tasks. --- .../PipelineRTFS-NS-Diff-FGO/gen/Makefile | 4 +- .../PipelineRTFS-NS-Diff-FGO/gen/gen.cpp | 202 +++++++++--------- .../PipelineRTFS-NS-Diff-FGO/gen/jsoncpp | Bin 896384 -> 934120 bytes .../gen/source_task_template | 10 +- .../gen/source_template | 6 +- .../stages/Segmentation.cpp | 111 +++++----- 6 files changed, 173 insertions(+), 160 deletions(-) diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/Makefile b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/Makefile index 80290ae..132c370 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/Makefile +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/Makefile @@ -1,8 +1,10 @@ all: + @cd json + @g++ -c json/jsoncpp.cpp -std=c++11 -o jsoncpp @g++ gen.cpp jsoncpp -std=c++11 -o gen.out @./gen.out -d segmentation_desc # @./gen.out -d normalization_desc - @mv Segmentation.* .. + # @mv Segmentation.* .. # @mv NormalizationComp.* .. debug: g++ -g -ggdb -gdwarf-2 gen.cpp jsoncpp -std=c++11 -o gen.out diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/gen.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/gen.cpp index 9db6a6c..24d7566 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/gen.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/gen.cpp @@ -239,140 +239,139 @@ string generate_tasks(Json::Value data, string &desc_decl, string &desc_def) { string task_size = "\t\tsizeof(int) + sizeof(int) +\n"; string task_serialize; string task_deserialize; + string task_destr; string task_print; - if (i != data["tasks"].size()-1) { - type_check = "\tif (typeid(t) != typeid(Task" + data["name"].asString() + to_string(i+1) + - ")) {\n\t\tstd::cout << \"[Task" + data["name"].asString() + to_string(i+1) + - "] \" << __FILE__ << \":\" << __LINE__ <<\" incompatible tasks.\" << std::endl;\n\t}\n"; + if (i != 0) { + type_check = "\tif (dynamic_cast(t) == NULL) {\n\t\tstd::cout << \"[Task" + + data["name"].asString() + to_string(i) + + "] \" << __FILE__ << \":\" << __LINE__ <<\" incompatible tasks: " + + "needed \" << typeid(this).name() << \" and got \" << " + + "typeid(t).name() << std::endl;\n\t\treturn;\n\t}\n"; } desc_decl += "\tlist task_" + name + "_args;\n"; // go through all args for (int j=0; jsetName(\"" + - data["tasks"][i]["args"][j]["name"].asString() + "\");\n\ttask_" + + string arg = data["tasks"][i]["args"][j]["name"].asString(); + string arg_t = data["tasks"][i]["args"][j]["type"].asString(); + desc_def += "\t" + getArgumentTypeCast(arg_t) + "* " + + arg + to_string(i) + " = new " + + getArgumentTypeCast(arg_t) + "();\n\t" + + arg + to_string(i) + "->setName(\"" + + arg + "\");\n\ttask_" + name + "_args.emplace_back(" + - data["tasks"][i]["args"][j]["name"].asString() + to_string(i) + ");\n"; - - if (data["tasks"][i]["args"][j]["type"].asString().compare("dr") == 0) { - task_args += "\t\tif (a->getName().compare(\"" + - data["tasks"][i]["args"][j]["name"].asString() + "\") == 0) {\n\t\t\tArgumentRT* " + - data["tasks"][i]["args"][j]["name"].asString() + "_arg;\n\t\t\t" + - data["tasks"][i]["args"][j]["name"].asString() + "_arg = (ArgumentRT*)a;\n\t\t\tthis->" + - data["tasks"][i]["args"][j]["name"].asString() + - "_temp = std::make_shared(new DenseDataRegion2D());\n\t\t\t(*this->" + - data["tasks"][i]["args"][j]["name"].asString() + "_temp)->setName(" + - data["tasks"][i]["args"][j]["name"].asString() + "_arg->getName());\n\t\t\t(*this->" + - data["tasks"][i]["args"][j]["name"].asString() + "_temp)->setId(std::to_string(" + - data["tasks"][i]["args"][j]["name"].asString() + "_arg->getId()));\n\t\t\t(*this->" + - data["tasks"][i]["args"][j]["name"].asString() + "_temp)->setVersion(" + - data["tasks"][i]["args"][j]["name"].asString() + "_arg->getId());\n\t\t\tset_cout++;\n\t\t}\n\n"; - - reusable_cond += "\t\t(*this->" + data["tasks"][i]["args"][j]["name"].asString() + "_temp)->getName() == (*t->" + - data["tasks"][i]["args"][j]["name"].asString() + "_temp)->getName() &&\n"; - - task_size += "\t\tsizeof(int) + (*this->" + data["tasks"][i]["args"][j]["name"].asString() + + arg + to_string(i) + ");\n"; + + if (arg_t.compare("dr") == 0) { + task_args += "\t\tif (a->getName().compare(\"" + arg + + "\") == 0) {\n\t\t\tArgumentRT* " + arg + "_arg;\n\t\t\t" + + arg + "_arg = (ArgumentRT*)a;\n\t\t\tthis->" + arg + + "_temp = std::make_shared" + + "(new DenseDataRegion2D());\n\t\t\t(*this->" + arg + + "_temp)->setName(" + arg + "_arg->getName());\n\t\t\t(*this->" + + arg + "_temp)->setId(std::to_string(" + arg + + "_arg->getId()));\n\t\t\t(*this->" + arg + "_temp)->setVersion(" + + arg + "_arg->getId());\n\t\t\tset_cout++;\n\t\t}\n\n"; + + reusable_cond += "\t\t(*this->" + arg + "_temp)->getName() == (*t->" + + arg + "_temp)->getName() &&\n"; + + task_size += "\t\tsizeof(int) + (*this->" + arg + "_temp)->getName().length()*sizeof(char) + sizeof(int) +\n"; - task_serialize += "\t// copy " + data["tasks"][i]["args"][j]["name"].asString() + " id\n\tint " + - data["tasks"][i]["args"][j]["name"].asString() + "_id = stoi((*" + - data["tasks"][i]["args"][j]["name"].asString() + "_temp)->getId());\n\tmemcpy(buff+serialized_bytes, &" + - data["tasks"][i]["args"][j]["name"].asString() + - "_id, sizeof(int));\n\tserialized_bytes+=sizeof(int);\n\n\t// copy " + - data["tasks"][i]["args"][j]["name"].asString() + " name size\n\tint " + - data["tasks"][i]["args"][j]["name"].asString() + "_name_size = (*" + - data["tasks"][i]["args"][j]["name"].asString() + + task_serialize += "\t// copy " + arg + " id\n\tint " + arg + + "_id = stoi((*" + arg + "_temp)->getId());\n\tmemcpy(" + + "buff+serialized_bytes, &" + arg + "_id, sizeof(int));" + + "\n\tserialized_bytes+=sizeof(int);\n\n\t// copy " + arg + + " name size\n\tint " + arg + "_name_size = (*" + arg + "_temp)->getName().length();\n\tmemcpy(buff+serialized_bytes, &" + - data["tasks"][i]["args"][j]["name"].asString() + - "_name_size, sizeof(int));\n\tserialized_bytes+=sizeof(int);\n\n\t// copy " + - data["tasks"][i]["args"][j]["name"].asString() + " name\n\tmemcpy(buff+serialized_bytes, (*" + - data["tasks"][i]["args"][j]["name"].asString() + "_temp)->getName().c_str(), " + - data["tasks"][i]["args"][j]["name"].asString() + "_name_size*sizeof(char));\n\tserialized_bytes+=" + - data["tasks"][i]["args"][j]["name"].asString() + "_name_size*sizeof(char);\n\n"; - - task_deserialize += "\t// create the " + data["tasks"][i]["args"][j]["name"].asString() + "\n\tthis->" + - data["tasks"][i]["args"][j]["name"].asString() + - "_temp = std::make_shared(new DenseDataRegion2D());\n\n\t// extract " + - data["tasks"][i]["args"][j]["name"].asString() + " id\n\tint " + - data["tasks"][i]["args"][j]["name"].asString() + "_id = ((int*)(buff+deserialized_bytes))[0];\n\t(*this->" + - data["tasks"][i]["args"][j]["name"].asString() + "_temp)->setId(to_string(" + - data["tasks"][i]["args"][j]["name"].asString() + "_id));\n\t(*this->" + - data["tasks"][i]["args"][j]["name"].asString() + "_temp)->setVersion(" + - data["tasks"][i]["args"][j]["name"].asString() + - "_id);\n\tdeserialized_bytes += sizeof(int);\n\n\t// extract " + - data["tasks"][i]["args"][j]["name"].asString() + " name size\n\tint " + - data["tasks"][i]["args"][j]["name"].asString() + - "_name_size = ((int*)(buff+deserialized_bytes))[0];" + - "\n\tdeserialized_bytes += sizeof(int);\n\n\t// copy " + - data["tasks"][i]["args"][j]["name"].asString() + " name\n\tchar " + - data["tasks"][i]["args"][j]["name"].asString() + "_name[" + - data["tasks"][i]["args"][j]["name"].asString() + "_name_size+1];\n\t" + - data["tasks"][i]["args"][j]["name"].asString() + "_name[" + - data["tasks"][i]["args"][j]["name"].asString() + "_name_size] = \'\\0\';\n\tmemcpy(" + - data["tasks"][i]["args"][j]["name"].asString() + "_name, buff+deserialized_bytes, sizeof(char)*" + - data["tasks"][i]["args"][j]["name"].asString() + "_name_size);\n\tdeserialized_bytes += sizeof(char)*" + - data["tasks"][i]["args"][j]["name"].asString() + "_name_size;\n\t(*this->" + - data["tasks"][i]["args"][j]["name"].asString() + "_temp)->setName(" + - data["tasks"][i]["args"][j]["name"].asString() + "_name);\n\n"; + arg + "_name_size, sizeof(int));\n\tserialized_bytes+=sizeof(int);" + + "\n\n\t// copy " + arg + " name\n\tmemcpy(buff+serialized_bytes, (*" + + arg + "_temp)->getName().c_str(), " + arg + + "_name_size*sizeof(char));\n\tserialized_bytes+=" + arg + + "_name_size*sizeof(char);\n\n"; + + task_deserialize += "\t// create the " + arg + "\n\tthis->" + + arg + + "_temp = std::make_shared" + + "(new DenseDataRegion2D());\n\n\t// extract " + arg + " id\n\tint " + + arg + "_id = ((int*)(buff+deserialized_bytes))[0];\n\t(*this->" + + arg + "_temp)->setId(to_string(" + arg + "_id));\n\t(*this->" + + arg + "_temp)->setVersion(" + arg + "_id);\n\t" + + "deserialized_bytes += sizeof(int);\n\n\t// extract " + arg + + " name size\n\tint " + arg + "_name_size = ((int*)" + + "(buff+deserialized_bytes))[0];\n\tdeserialized_bytes" + + " += sizeof(int);\n\n\t// copy " + arg + " name\n\tchar " + + arg + "_name[" + arg + "_name_size+1];\n\t" + arg + "_name[" + + arg + "_name_size] = \'\\0\';\n\tmemcpy(" + arg + + "_name, buff+deserialized_bytes, sizeof(char)*" + arg + + "_name_size);\n\tdeserialized_bytes += sizeof(char)*" + + arg + "_name_size;\n\t(*this->" + arg + "_temp)->setName(" + + arg + "_name);\n\n"; + + task_destr += "\tif (" + arg + "_temp.unique() && mock)\n\t\tdelete *" + + arg + "_temp;"; if (data["tasks"][i]["args"][j]["io"].asString().compare("input") == 0) { - call_args += data["tasks"][i]["args"][j]["name"].asString() + ", "; + call_args += arg + ", "; - input_mat_dr += "\tcv::Mat " + data["tasks"][i]["args"][j]["name"].asString() + " = (*this->" + - data["tasks"][i]["args"][j]["name"].asString() + "_temp)->getData();\n"; + input_mat_dr += "\tcv::Mat " + arg + " = (*this->" + + arg + "_temp)->getData();\n"; + + update_mat_dr += "\tstring name_" + arg + "_temp = (*this->" + arg + + "_temp)->getName();\n\tstring sid_" + arg + "_temp = (*this->" + + arg + "_temp)->getId();\n\tint id_" + arg + "_temp = " + + "stoi((*this->" + arg + "_temp)->getId());\n\tif (" + arg + + "_temp != NULL)\n\t\tdelete *" + arg + "_temp;\n\t" + arg + + "_temp = std::make_shared(" + + "dynamic_cast(rt->getDataRegion(name_" + + arg + "_temp, sid_" + arg + "_temp, 0, id_" + arg + + "_temp)));"; - update_mat_dr += "\t" + data["tasks"][i]["args"][j]["name"].asString() + - "_temp = std::make_shared(dynamic_cast" + - "(rt->getDataRegion((*this->" + - data["tasks"][i]["args"][j]["name"].asString() + "_temp)->getName(),\n\t\t(*this->" + - data["tasks"][i]["args"][j]["name"].asString() + "_temp)->getId(), 0, stoi((*this->" + - data["tasks"][i]["args"][j]["name"].asString() + "_temp)->getId()))));\n"; } else { - call_args += "&" + data["tasks"][i]["args"][j]["name"].asString() + ", "; + call_args += "&" + arg + ", "; - output_mat_dr += "\tcv::Mat " + data["tasks"][i]["args"][j]["name"].asString() + ";\n"; + output_mat_dr += "\tcv::Mat " + arg + ";\n"; - output_dr_return += "\t(*this->" + data["tasks"][i]["args"][j]["name"].asString() + - "_temp)->setData(" + data["tasks"][i]["args"][j]["name"].asString() + ");\n"; + output_dr_return += "\t(*this->" + arg + + "_temp)->setData(" + arg + ");\n"; update_mat_dr += "rt->insertDataRegion(*this->" + - data["tasks"][i]["args"][j]["name"].asString() + "_temp);\n"; + arg + "_temp);\n"; } } else { - call_args += data["tasks"][i]["args"][j]["name"].asString() + ", "; + call_args += arg + ", "; task_args += "\t\tif (a->getName().compare(\"" + - data["tasks"][i]["args"][j]["name"].asString() + "\") == 0) {\n\t\t\tthis->" + - data["tasks"][i]["args"][j]["name"].asString() + " = (" + - getTypeCast(data["tasks"][i]["args"][j]["type"].asString()) + ")((" + - getArgumentTypeCast(data["tasks"][i]["args"][j]["type"].asString()) + + arg + "\") == 0) {\n\t\t\tthis->" + + arg + " = (" + + getTypeCast(arg_t) + ")((" + + getArgumentTypeCast(arg_t) + "*)a)->getArgValue();\n\t\t\tset_cout++;\n\t\t}\n\n"; - reusable_cond += "\t\tthis->" + data["tasks"][i]["args"][j]["name"].asString() + " == t->" + - data["tasks"][i]["args"][j]["name"].asString() + " &&\n"; + reusable_cond += "\t\tthis->" + arg + " == t->" + + arg + " &&\n"; - task_size += "\t\tsizeof(" + getTypeCast(data["tasks"][i]["args"][j]["type"].asString()) + + task_size += "\t\tsizeof(" + getTypeCast(arg_t) + ") +\n"; - task_serialize += "\t// copy field " + data["tasks"][i]["args"][j]["name"].asString() + + task_serialize += "\t// copy field " + arg + "\n\tmemcpy(buff+serialized_bytes, &" + - data["tasks"][i]["args"][j]["name"].asString() + ", sizeof(" + - getTypeCast(data["tasks"][i]["args"][j]["type"].asString()) + "));\n\tserialized_bytes+=sizeof(" + - getTypeCast(data["tasks"][i]["args"][j]["type"].asString()) + ");\n\n"; + arg + ", sizeof(" + + getTypeCast(arg_t) + "));\n\tserialized_bytes+=sizeof(" + + getTypeCast(arg_t) + ");\n\n"; - task_deserialize += "\t// extract field " + data["tasks"][i]["args"][j]["name"].asString() + - "\n\tthis->" + data["tasks"][i]["args"][j]["name"].asString() + " = ((" + - getTypeCast(data["tasks"][i]["args"][j]["type"].asString()) + + task_deserialize += "\t// extract field " + arg + + "\n\tthis->" + arg + " = ((" + + getTypeCast(arg_t) + "*)(buff+deserialized_bytes))[0];\n\tdeserialized_bytes += sizeof(" + - getTypeCast(data["tasks"][i]["args"][j]["type"].asString()) + ");\n\n"; + getTypeCast(arg_t) + ");\n\n"; - task_print += "\tcout << \"" + data["tasks"][i]["args"][j]["name"].asString() + ": \" << " + - data["tasks"][i]["args"][j]["name"].asString() + " << endl;\n"; + task_print += "\tcout << \"" + arg + ": \" << " + + arg + " << endl;\n"; } } @@ -477,6 +476,9 @@ string generate_tasks(Json::Value data, string &desc_decl, string &desc_def) { // $TASK_DESERIALIZE$ replace_multiple_string(source, "$TASK_DESERIALIZE$", task_deserialize); + // $TASK_DESTR$ + replace_multiple_string(source, "$TASK_DESTR$", task_destr); + // $TASK_PRINT$ replace_multiple_string(source, "$TASK_PRINT$", task_print); diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/jsoncpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/jsoncpp index e9f209dad4daebd2ef8d9c370fec21edf1efd0da..166b201cf52a33c229cfe7784c8865f87702c10e 100644 GIT binary patch literal 934120 zcmeEv51f@%ng1OWLB#H4R#aM7(**zGYApiRuzKrSV5Ci2Vu~;bi9pP~iq**2WpduV z-EFp$^RCR!eCw!&hLru+ka}|}e6nv-sf8as!aX$Uucp+W$2~nx z;x-(L|AC{3hZ08<4@rT4m zh&zZsAwEj{8L^-E81cV|za;*eSRwv~SS9|J_&eet@ejl&iBA##n>a-LGw~VXUx>Si zsnOIs#6yUqiDQU|6OSMsNlX)8N<4~qH1QS03B*?uk0BmQd>!#P;_<{2h$j+HB2FTn zLOhLl2JuYdUlGqHzKJ-6IF&e^_-5i;h%<=i5zi;Sm6#*Go%jyoEaE$f?;>7Id^fR~ z_#Wb=#P<>B5HBabpLiwlD&lRduHSsgV&k?^s>>>U?;;qCl6Td=SL;O1N zcH%dPYl;6typy<&co*?siQgt}B;HHxCEiE8pZEZ=kN6<*A>wz4-z9#J_%QK5h(9Dg zLi{oDr^H8z|4IBg@fXC$h>sJ0MI0dhhPadXTjKACgTyC@PZ9r{_%!iP#6J_CAwEk? z9cJ`V1924b5aMX!7~)vsIO2HXONeP=Bk?HW(Zp8}UrBrw@ioL_iLWDOh{q9MPdt%$ z5^)mo6yj;bGl*vr&mx{pd?WF%iRTcf5~ma2Ol%_l4e@;9TZuX1+le!Y7ZTq|oK1We z@nT{#@e<;t#P<>B5Z_O{l6VzyK5+qYA#oA$8sfFYrNj>smlN~E0`Yp{3gQjK4--E^ zY$L8D-bDN;u}EA+>>%Du42UISnfQ0aF5)MNpCaBu>?VGi_>aWT5{9}#yDe?oke_%mWZ@iF4##9tDBO{@^B#NQHsPy7S%N#Y-gPZNiTe~(6Pt)Li02W{CuWInCFY24C(b0!BEFOOF5*SRcN5=3 zyoC5(;$_6kiSH*~L7Ypxia3urpV&gYnz)eo0pc~pYl%yUONq;f%ZYj7b;K3K4-r31 zY$M)CTuHo%SR{53ZzgsU|Cac1;@=TJLHv8-r-Fh5x+zHcj9*9!^H0s ze?a^ZaR>1y#GexXllXIDKk*mD$B2&;e?=T1{)V`d_&eet@ejl&iGL*iH}PrWpNRiM z{0ngxv0<#yQ-=^o6UPw862}q86JJ7XBpyXPn)nLh1mdfRuOS{wd>!#P;_Hbg5>Fyd zBA!eW@146TjIxwe@FZT@$ZSBBz}t6P5d-*HSsgV&k?^s>>+-M_)o+y6TeFQ8u2#b z?Zj^o*AoAQcqefkaXoPZ@owTh#EryziT4rjCq6*zBR)v{H{y4R-y=Ru{66sq#2*qL zA^w>7Q{sOTe@5&l{(|^l#9tDBO&lQphFB&3miRm3An^&}lf*v~pCzI5O)z9 z4yWEBjwT*P97{Z$cm(lC;!B8)#Fr9ZMm(DM3gRn?uOhyhcntBi#0>Fx;t9kz5GN8( zCZ0k(jd(h7GV!m7XA$2>d=qgBaVl{-@m%7YiA}`6A)Zgn65mG55icOVgE*5oi+CY% zHt{0j#l&XfCB*j zh_@2ILR>@qI`KB*?Zj^o?;w7Ycqj2&#P!4t#Jh?25H}Lb)Gd^>R_aTf7H;%wr(h!+!^iI))HOT3JDIq?eOT;e=p3-M~=BH}f~Yl%yV zA0#d(=84x4uP5F>{4lYNcq4Hov7Pu);ws|Dh@Hg0C6`F&DJ$2ns)#pDP`D;zTU|=Ys6OnZ3DEc1JGg8;~6W#kL=; zy#5S%vq^Rb*w^|(!rhBtb1D0S&QX;wA=*uCKalC*^_OV0QGT?Vj5J-b|1HIB?VY3Q zWP9JhVa5K}6}R;w{~64G7xKSB;~x^wKT=?A{*iiUu;#xT3dR@v)5UH5px|DVCpFyF zm`dOLFH*Qv3d@-xGvq~ttXe8+iHuW`L?@`&4V_07`^OZw4R(&IzB(7&FQkP{7Pvy$9cj?cdk#Dvta}vWQ=Ss7Na(93CJLX?5*p_?xvD|&XIV2Zs&)wHQ zD%Y?**U+1rbYCubDA-=?o!ogCGWAm+xW*O*`bE&e-)DxmSO}*7*M4VPMABA+ZxE&C&R|<-c2z9{ z?{IBU@{KREZ&idJ{&Xv1*AQ&cMD9oko>X^U= z*|jL3=Iv&@Tq}wx$ZkllZ(9WwCS2T*D-|^Ui~#D;jGHQHAcs#o5YeA-Ikhm<)c(+L7Z1mp^;Obg%b&YWK)>^KHxs_-2N-gf*g@3u=-z|mbr`NaKY8Yck zj#B}aD}Qb1R#bcqa@vp$`lDPQzUs%BaVe6Q>xQ<1voD)5hg$jK+)X=IOQS(aNteq7 z-7A#z@-o2rL2qZrV*H3#8EPQCzFkDSIM}eNH$P^pMl;$5f}abzdL>s;Rwd@xwT*Am z>$@e-&Mwg-CQ2AP=n_?>Z~NMJtEM&~E@&s$q_nuIWSAlIC7Lf^RezoSQ*j-LJH#D@}?~!rf!tD zY3CZHVB@8=(pl1mJNMTx5pO&VnTDE7hS}O`h18pr#oh+l#)Jx%yH!3)9a4%X8e2P- z;sxv&4M6j-;a|@;xe>Je+icwOYU!8uiF~|U%MX6$_(~cy<4Cg@VJHrbOW*tkSjhp} z=g2Fz-JUC7ipgE9eO*_xA@#D@O-~i2=agXOK~qbk_v1pkzd5fnomv%a^sEjp z%7e)G618~zx>RA8*hZuZp6+->L&7$m*b+7@u*%F;Kj`X5IQ9Pk^?!Q(=S9zBDDsD| z^eQoADkAE2Mlr{0&$u*EpRW)%9@~L6sbHhyZrZX2HNn7YX6cwe>rCDF9WbR=E6*4; z&4bVsu)%%Xez24(4vjCoyxN~D)r5CF=yJ^<*8y0Vh?WIfjfUSPYw`8xg4tvJ;Lhx> zt=VTA(wnloibHMboBs;^G%~)Gvi*H}tfq2|c4&DN`>ArIdxRoQRi2f$(#YaRs{GzP z$}k@-@!875E_8fC=$$U~uvlnC3=~reymOlE-BNl)Cw69^t+tv-V{Ig%sV35eCK8q_ zhRJD?i3FcxstN;8sxL>7sxLLa@e>{;urSpHBkWmYD2_8>v;t%7Z&U--wwknfdFWuS9?6~ zkV;3;{3xSKC(}Vx2rw4PBsf7I&8@%h8Gf>n)^D`a2>F!<#>zO7K zEd+r`)380gzEOV8+lH|IT*EdHJ!Nx#i^&L#Mla$g(CdgcS!G z)JvubjA(aepA;ukd)t#I7o<6y%y(v=sJDW0*&#nWdh-)CH$In|Z8tsZx4U*FPd?tPv>j)X**<8KJ+rf3vN0$gy^F;g z4$pcDbMzsp3eTbUZ$t0z#Uy$|?PL-`Rw2lA9|pOML)%UBBhXhk$O6qLO*k#P zA+LQ&r7CFdS26r~d)v>CES%NnGynlTy7ZVL;l zeqIzdUfD>VD(}+w{*Vy5cXMurQrx)^m0p8N_n^|NgITxK)_aX>*}|)I$h-S|s4vw8 z;s#F{4K0)TQuAsILdZ!chF^Xb(-ComdTnlROUNyZSZcln zd2aCB6mT9$aJfqg#!rNW#;}%Wnn^g|`Tj=abXZ8vz@?JWu|WDnqGmZ+a<_apdgbK8 zc716Sfwbls@J8RGbl8~F&q&|W>%73bDdT;$WsJ+u5Uo{s$dqJz1c-Dxk6Oa&Jcv}J zYgZ5Hsy1|aq94}N=m~hzw`QN7+}`%|88^NIf6rM-Eh^pBE71FC%WjpDhA8RcY3EWw zXZGpp9mwkRbjK~G(LnHX%5Hy9*ODKHY_sW(|Jr9Xo+87`)29{AGtG5iRXJSAP&wS1 z-R0{`L$Phy{Hgj(4QS+jPC;B%t`k%@Lo$zt#NXW|Kb)M4hw`SK%f#3THg<|q2-dX& z;+m%1(WDLxD%o;JKO${XE5#|^4wIfy0?gGkmahRy9g=yj)HK%2ZZ!p+1(P;k5c~l4 zwV%t(;8(VDVuIeIX&J$3beVU_;oYqr-3V_ebx1U^D9=c**H=1t6^^T$L8r#5ZuO(5 zJD!E*W%C+Ucr_~Ha{v}X+%q=r+cKzCP6a8995KmkUZV?d1tpqSxg4pH^VliD=~XAI z398lIBsQt#L~ws)n@8MX>5hx=NX}tAI0ET}DbwX`xuX#c7oh~j%e&mL#phqk3}Z#l z5R)QRy&f6&N^{uOH|4m;;69Y15y~A`s^qxZAwb_)hPsACmL{qbGQWfw_XvAgA6w3h z;xi5Dj(-JrFhe!vSpjm{n&v;Er1Tbtj;Lw4g|SQ>f3odyzL^@q$!$uJg1u(RmBnl0 zs8=TQvGQ_6Whxg%yNF7HH%JB@tBsf|1loKyAsa3FoHlN$d9^h_$>mCfsY7 zBG#&v>qXX>eH{)SS5jJvL!J@OpHsWtu;u zI>lth3vnp-b<9T$l$R=fUVfF&YY6le`h!_GFdXu{`9a4*lc_>rmZ2D%1xD0_pG{}S zRX#x`Z>R}*8>$IO5!p3^ap$E*O(fUHWLr{FY%g?K>i9ccI_ZTHj&%r8D(2^*QKiz^ zF%L0(N(+a#ZP>k1h(rVCLM8YqhxrlLUEtiWI=QpHJWGjXh&GO<6Y>q z+JrgJHyZ1%`L|ZzQm2Rbw6ZsZE>>@@XuHB15NUmEvZ|cJ)Bv-q!rIyn5U+4^FJ@_L zb2=My!?0=Sao-lHs|3OU4YyrUdI@@UIC+zmb!)d_TIY;5T^Epfo=xfboHYr&f#L{p zN$6@$Ok(-z^hunbBbq466qfEVm|S14JYgCw{9Wtqm-2T%ZOHXyrTv7*QdA>64?XFR z{mi`S;hang?#zC+z3sDS+=!XUXV1Cub$02yGz-bFHXZH2uU_l}E;_oh(>J8F> zE8)(YmR+;_ueAy)=zEgK8}}-i&gyfe%f;<+jM;a#w7M{+9lVaeZ$qpak?!Dmm=0wgyJ=nPVFVff7bt!ar0%E#kLHhT-Po!Vku|{H)JJxDM7E$WZbfwvi zkaY8N*;vfNG!l$JKW;2(xvZfu_b}+lNi-1SG&x2(7AK(*UuR>k_?rp2(oxzc4H+^s z{E=i3E5edghq_eMM9s)!xm(`GM%Rue4Ju0v?m-ACEp=a_^NuQ}mUNg) zWt}a=C*?L+Gq)87jxP>foWA+Bh!I<;?c8*{>OIpal?5h`&P`|dZ)e-LbNshc?OUTc znZpV8t*+8ijw&y)Z~X#gq|~FKlX0CabXX_D9oHkHt#X*QMaF+{y-M$u8|8 z@vd-vby>_zv0Wh)nNY#RqI#Vq7BXBW_4?BqyH1u1W_8UBvbFsR`%_D^&=Rr`Ca$LJ zntCl#q70N$=k9t0X7|029w#d%>1tzfX!OeWn^zOiP42N>0gZW2 zQn%@0w*l?-yN%1GB8#@Rz;X`Dkf=#8PNpk!3Yp}9f<0Vdj)lN&eGx?So?#e)C=-!a zXDM~!E;x|y>mMgp{XP27u)W+RryeCdXslkPlgH|nrs(}pCE1BU(1F= z+uQCs<3{Wqxa*viX{g(~FnMgqZm5)y3@@*|5qmH0TCj4w3AzM9)mFS|()Vw*@Bdof zV`vb`mqvGFLCp6-<*KhNX76dJoPv3pZrvAA+e0x3DXOb{tcppB>We}0*$C*E1Z$|r zwX!JgQX@v$o?Hn#lCbaJ4CxqGWq6l;(8bLYqVAP;4BtDHtL53V!B*tvyf50(%)4Zp z#Q8-+8p5jA)CcaPCiq0Q1%)lX^&!WkWW$2L172t$#9L9q{lg#*E?$D#5Dpu7i>;ZS7WP-;e4 zb||FK?m)7;(RACH;T`m~4VCj*65@6d;HO_31kCGWA#=*pE)*yDVK&KvuO|rY&JpY)tQCAn76d&MA=C!1>Pe@p zo39WnVAyqYOfkI)SdQ!8+QD_5I#Qfj95;czn(Rj*Z|rJnPc%TL^M5aveVO@D#-q!K zqJ+52R4TV?4jz9yQsQIP+4Ns%;wA88fxq45!;~wG>B2MBoC_+SqTD9 zbfvRA8)JzseZ@(*(vZ-UOoE0ck)Qz~36k8Az%olsQ?S=5y{c0?Bo|(1Pl3?3=Mwmo zg}v6?9wQHvzVfV|THdH9(loxu7;lQG8lJ5cT{t#PY=SDkR2PN#5;9&5IDADIYu`yT z+L~71ua;8cGNI3r>YM6VR6Q;yvx*1Kkf)|N%Xuqy(1PY?7aCTppR~>GrY+KSoF8%| z>w3|ZFl0Vk#X^Qkv-stATrW^GlGgw*)N0~OAF7H7*brM8v&IG$W-Ena&9a-_z@kKW zYa!ds9NflgG}~N~Vr{T_soV70F-wi>Ovmb$-&IgA7v@$+j=sZuTOxtkv=|o=pR)E=HM+qr+{iD2)U8KtHDt=ky#7p2eWk z({3V8V6a_jtu^HOvO7?`l&|bcu;n265Vf!nj8~CXa6?*1Mtn$fTkd1);Bu&)G(o;v;kG#EenTlK-tN#R}I)}m>eNtpERHo5tb0CjFy1*dR`hgdY(coHs3PG zz~y$U_Tg3n{OijO3BZmSRD1Vf^uS=7*>!I1ILL95Cl_MP4kx010N*B%?d;P7C8nZ6 zt33tWo-1LhH4YBb;BUrCkKNinLHZg-B7d*3JKG&rIqY6C3Tj`k(U`_u_5HZd;oP$v zH8OLky*u|T^-?-Z2jaPBp)A%&6s}>Ej%z$}c$K+;_){ zD;e?-J0^vlC^@4n9l^=l<27P=1gEa$7?GG4cWAeyp<-mqwExIYT{mhLVt-+&-!7G7 zDB3^lNji01-|rSSP_!%g9&6f}KBG%3cHT+S0C^RURJx!zwxrVYzx9)p?@f_g(B^Eb~-tlT-nYQQrodip3zaEf( zm4mhQhzYEe6w_yi{9F$EhNMC}30il!d0Ooh}fWNE?%Q*fk>5Q&t8JDnJs>W_< zj$MhCk=pJ_uVr7=9BcZa2-o)9!2|wqQpz?1Wp>2<53AiXHSpWn_SNN#ADVg7`Nnzu zZR5$r-G+G@z%_1v7+#{aV4L1p3-ylszXH-z5u3k`lg&|Evuyd|4C%F!PnTra99{*j z(I-Y8eN9-GYQ(zKkgoV(28%Z1r3^65n+GvSAt-c_Vf{ny4oE*gcL&UbLW`JISl;5@ z0dEoqyguSbs&bNhgw9S?Cb&o0XkIzoJto~9P!%b`d=*u1RGlLSv814+$Z~eTgrz&%U}yZak>Ylls-9l7Fx7j=_=^=?(*EDsA$ z_6To3F10v#s{&YdAl|BAW_^2ctHOWYX3yG0Itx0_u(v9FrEao4x>dpLYFG$$y9VmE z2P?bvZx}GOw08m=3eBKhX4o4B&fA2^hYrfa-!L#HAvZb9V6GxKc*6h<5p$}0Kix18 z40dK^{{*y-yJn!h?eSE8Dqn6x_rvCdp}c4|xjSI`1%=n@b+smfJ3Fr{`xP0)4qj7W z2IS{_mBImiO~D4VwA%y2-4*-mt^#}S$3DsbBzqUaNp2Oz+=Z}KOqF0`P8ZSjoI-q& zvt~Pktk=iyLNMv+wF%&+;r0x-NeUB)-H*!(9kd@W`03 z-O^}HVaoCHw%oBDEQnA7uc5rl4O_h4g&<84E1Gv9ybT#=gdfZ+Y!19J0o|`uScee|b6q2w2)10{5K!S@yFNs>-XowH8(zdNEjfp#LOd&X& zqkcn`t(ueUk;Cb+%qz!(SiI8)Wi4{&BD1%oKivyr&WXhjiMcW^A&4pO9NDJkXwajy zLG$?H0cGFsVy0l%#S#Q_Nlv!f;NVhifx3~Wy>=r{xZ?%sR7i~zLIk3QJ>mWyd*g%O zg{7lg_BbkYLC2-0aTNj;Qd_-Rk&4#4v*Qw9Fbp%$*X6BQV3Hdj5@grj_@EMJ^K|k_ zHBnMpc;kb_EDjwhhqKMkbd9tvMD5-!^w`EPck3fIJ0$ly*qx^AT1LVmWz$CUU*&(sythq^v8z1iYbL7Scc^?){?GQilvL}KN6MA#wLruiD*Vk*J?`QT^VQ6t%k4_^#S5Z@9B8 z6!>br3nP4qsC!|APnIp;XOewqy14E1Zay_;OzOI$-dcw>Z)A!d`1S&OD` z^MJT9!dNMLb7O=mC0T?l4jsHPf~#6?i)YbVgf%dv=GVGGh3)}BtcTls9L8c$>FYQYe={n;9h#)ngk>t3 zv-8QG(B^Gz#f^M2yL~Co8dxWG|$S(x}3y| z$~qwGT_M(kY<4|(cLgLdRXJequ9#7hVM96; zq&IX_qTjgwcJS_s_+2n->Q#G=&jU%LYu}C=Rni0@HpJHxq z+P!QYyt~2-?g#I#kfFtx9gWxz(sS_cii3Ao9K5^Y0J*#3;C&O;eNu{l0U{Tj=;Bcv z0&YrGj!u^k-ZufKjlZZJxj5wDeG@oeX|6KRBN=vze(=5tbSvM3^MCrj3A0Pv-X+ni zW>a*-%E9|44%IuZU2j?_D!H`x7lZ8E`zH3h0qZt09K+cjH`wg?g&{A(`zGWri3#wm zV!v>Bd1>9jV8CO$nH>cZC=9X2RBH$(aN&m&g}Qh%sjYH zK1VofySe0VxCGl#_;BG5?qI2K704%q*uw_{>nFW z!939m847vmg{-CBSDJ@(Y*%vJ_0*!)_yt}9sY^WTihA|TxcF5IUvVYew&5cSPnx z{(rEqK8L>YLh~=)SLHsP%Axr4zpY2^O?~`c zY%g>jP~L2us9XBhWfZz6D3lukHDhVVGQ8cSel0f~m``VwuoZM*f_$YUkUguKSHpHU zXy7G0yP9)o)4<-7H#irP9AJwG__;3=-My7^nk1!^V-D)Ul9CrfOmCwAj5E#qkzI%* zG)%53%DmxdkMAiIH#g2KjmwobHfmO7#mC)$BW!^h)Sh1FqG$&nGvXIxQqtwO~Y80;%w|Y%`hWjU_@4D71 z&*}x|Bt@>YPSblkVLP**fV<=qX6NGBk#yj2Nv@DFH#Z==a7S$CC;bQ zs&9x(yhl$0Bc$drA0Es$=ckk3Tbsr5)=)Cye>}U&JsqkuPGPt}GTkLcR>qG`0$2 zYOYDz9Vd|zGc@GZIeRP^Y822g-qdk1hzj{Z0nbazkCmd^j2r0&`0bOBn@AN zne_<1`_b>m^5axrZInZp2&CHDOU{w6p+?BIcVB0~#KK|y)HN3 zh3DAJ$2SK`vP(~xE~?TUU4Wcz&?3xX9tn)-GWP{b^m;>pbq0k+hpe>bsW=p^dAiM* zr&Ca^VBOjH8(TsC~+JI#gOljL`7ZYvD{G4co!UpyPa$ zSJJ<>PS)})>SZpef?Pjw9%8xha<@JvlMylK%sm37ZmCqzXfVgi1IY%;YY6)Rj)F}<{lW9CV@|+_3=fj7;nX!wn)o`23SVENePvM z&ud|EvcEI?3=GI;i~%Y4`ys^BfCFlJLEWPx;6qcmS^_sPHsY@d7=#ZHyig5kbz8D_ zRJF&TpzsvZfDBWRwZ6hN=9m(BidYS}p+&A1cM<2!8r7#3v_*^V!&pKX>P zLbAlTvcFc5ou-bJ;>IndN1H@qD5KrD?2{SiZ?fi3NMY8orI>+xC!*__-pz%0VWC-M z)s%F`nm5TytkRPEAxj+-g#%`2rd=B09t>+N=pU`^RdUmsfiKC&N;%reRBK15sc`?p zWbLLp^NeXM+lNiIxF*tcX)ouu$(NY;+K`1KmXe`SE$`H{^7~wA+9|gwga+SR{v?V^w3Ja{ja}fVC?~UjC-0O~lCFu=In*_Ktj&xN z-n2y;%PJ>~-BvY_+mMG+^HYINQzGMg(7ZF4B~~JPOe1Pg>_0?mg>M2rT>Ql$GRG-C z_RQfAVUmL>)`_s7-(rHxq&+T zrNgLPr|N7Ec0FF(ASnlH*~)ma5NcyJlxJ5>-!@ zHTAt|Moe(=Awx1a`z_2x@xRP^9eJp$*i<%G-B#3P1VSyiJKShfZoUI)>sxTfQbStd z!fN#vI5RHD-h!eN z9=l{z?3Ise3?F+8A8+Zc++z5+CS)D#T>G#AG6C&T3svE1>rehz1 zTjZ8rYfp1GT~K(uB;Pp2wZy`ruqLJKqGw#7=> zr*iYQBU{lk@m?HBB{wg-RL!&jC5dkwT1%+5AT7ceqQj=~i>aUHiS$cFL1u?cL0D9E zw8>kXxz7$FPAXm_N1yOu6D}F_lMUMHnSsHmkGr4XcpK+XMkT}=<3dV8p7Qxy5IRXd z2;k>BKQY%D8#*aVG1qD1%Wll@Ne`tT;W8F`J5d%K4^aF1JWv}WUT3v-<@Q-^e#3k5 zQd^3I_v!V`Pjyvwzj!VEnHwF{EI1MG!nQ`+RnTMYQf94@qN;_O5dECQ=b>h|1bMCB8MR#Z^cMxjjW@=ycn(gk;@ zRzctU!CKX7tlw)?u+`c3lACCNSDB9gCR}SC>-Z-7rbcn&u9EuQo53HaN%{`aPEtN^ z?2LP)k6jQva6$2zUHPMC2EW%x7Ze{DdqHt$LvJHvJ1=T1%|hx2bNBrMsUH@vnbgwk zx-Dk6G*my8Jag$nHakK)*YiHkm^0&YtJ|YCAk~A^AQaIWtAzR}?0rzOp)6hh_Lv+= z7zO1Wpb0%(GvA2Tukr%s3Av7+=FhZqGmF*NnZ}z_+jw2oL%ZarLCsFvFfU(hN8aYa zj1eWdrG+nx18AcZoQ;R%%EySAYT}-AfBq%8Vs)%5^Or72QrJe3=$xu?xTw|QHGD!& z)_Q~SmO+<>jxiovvderjyPrLJK#ljIK+O7n?cL4&N=;~($s^f`&J|>zk*Iv3=>}vv z03WLA1ep%tE9K9imzqp#0+aQ9Qcc8?6>f_20BX&dig+bKqG%*<!-f8VLdeTq;*C zEeY}?Q7UVwfyNoLK^6&Qd`}LQp~bn(buJ~+x&lqmi6*G|wmmL$FcfSDt?eXc(q@c7 z_*P$APbz-|jIjF#URQa&-bQ3&8`b&WD9jgmwf`!A!dqn4X=WwuB6~1qKi6C7PYi&S z-p2q8#t_wPI}jffI{iLeE?c>cVVF6m*ON&6>NQ!GU6!hyryp+t#FRVBO@(CV95gi0g3O zLMi(>okmm_AuZa&sWx>ADRV$M5~e2IAM6OSw-?)PPvys!vbUqft7jt-;xxLnPKNE+ za!0Lt8mU1Z*1pytUtwn~u{q)pD1qhW$bd65$)>F77xm)B^K-tXVf%~iB<7>R>^;5H zvTGn^!pcf2p{M)@O)zcPZ3aw{UvK}0NWl(M&; zv)Qst@ApdTBwzG8$rp$3B-x$-!$(3lQK<%3<#w7#FA!%I+0Jf|JLmqw3Fe*f!E_lX zZ>oL4k5o0IEp5BOV@ciMa`ChsqbKF^^;c!W`XzUR5sbA?y2U5zt=_;=jUChzH=t4)wQ52W>~%2c1809bf@3*pgUHS$x|Ek5OLS>!<@yye#-MF}e@Q>$l<*!Ngzn2mp#Q<>4}n|}`B^tDW`Y&dD9 zyUYz$+7w&@ux{;0%*x-Y4l{eCOx54K_nDpRXC{(Bx+8om$0Xs6zm)MbvaDy8-hw{t zkD}D*ikS6pV}|hOP+de)R%Ch{uYjdP{PSbf-mZ>T$VK?%4Y{!#Dn^@VImx#96^^cpxe#PIyPVBk5D}zLEQEGY`N8RDrKjYl28+kAh6Dw|>)y0edKbU*QQKvtrqaK4_Kz;}HAIed87dz#!>pIi z-sfDmDlS#I!AOAL0{g#E-Jk1d*n|niO7RP}V_{u3cZ%c*4xI807?p$K=-6K@5JTpP z^r^koyctrjrS><=X7rC=YQo;tweQ=(Tdhy8`gbwk#EUWFp(Yeo>`{wsmEE04%Z8Wz zn!t{I(jB<+CKkdT^^UK<(7oeBFGTMc?G=huVwrEN*F4@kF1+n|=^eR)-2+{6U-ze2 z_t?A9ia5Y2dof>KO~@Y0dKX$K$#yTndHnlcwB*U~ zq#+JXN;8LF@scpGM*@S*xrcv)b%NaCn{CMEC(@VpRz4ag6)Uw`kYIc*$=J=tKplq= zm8a?@8oEDBRDaLblq%MW_Rw;Ssg=DO>0|>)eO^DQyuL4Fn9pkycxwW$C1mrH!fQQ8 zVi;>?1n=uj=J%8TC-{ARK7rSexXRbTMdM}ei8C835|vWI%jyl3SYa%L^g;Czf2LP= z47lg)=IZ{CU2l4o-&eA0_6f|EeF8z@Td^rVwj$}O{%_%P@_A^!=$O;BapUsBr1k{= z*|Oq8q96>DR;keH>O8!rqxDP)R_e`^INf1{R@Uytr&>5YC;Rth={ocP+3!Eb_KB_P zEzFd%HRWN2qm>RAY}AypRwO$SP579^a9QfoaO5>czW{;rLumd~cGctQRbx=(iclg@UmFCe=HB9mP+aN-x_Q=7Um%uqC1_jTFQ`AN`j z6rcoDN+U1IPONNE|AT>U_eGuTipta$HNn*?k<8zLMTX4BwX?`(2`do0tKz@7w6L1v z+*D!G1|6LbX*e{(DmK)$N9hQH6apPD7#}f{kP0%na5Yiodbp0^~@T5DESX!|WsYH#@hlo$X=v z5Si)7K7+zH9VX1PsvlpH!aEWYk$ZE#-^Mdp*!Va6(WqD zCw7V~iv=6E;qXbYZVUd_%BF;QvS}aplWf}TDVvRG=eTUjJ2acbjLN14kawkSsSR2$ zh1i}LFrA8s1o=7O3GtNWOB*X4B7UWps~#(tHJfsWsiWJ(4|0@_a>t-h6_VrCqTFpbRyI+> zw5+eKiXG1`Z3HzwFI^>UwPJ($2eGSRPo;g;PchKnUwx%X=$B>%+wd(cl8s?!k|Mcw zk4|iS3f9R=eoT^!8|7u{hJCJ3OS*3W{1$hU-vIk#-XS$TkjE3u2#ytjt;lYgQnzS( zNKaFYGiG4WJ}5!H*al{yy4*e4BsG!|T3#Gf!l4@rA{mWp#;k;kUg~6pZil^aN-b`- zh)cY70z+IVf)Nwe-h;R23uy6dW0Fl3o#Z3=Uo6?M>g7aUu)Pzf&$3TJb;1nAHe8$- z9<)1X^|W1Nd#yzBHr>l_+JX8$BeH1kagn~`jdwV&*$bT+QxnviNdw;gv0jq~yfL8K zvpBR5>~6pV;Zhx&O!%kugJh@BKg^~QN?K%akkDuk)Dh)C83lEn3b(?j^kZ`p0 zd4;%!;J{u-I~)*WVlK4qDDAnRd&B=Kq1WnI*`H(&E=43CObB~ZDAwifgOX3%QNikl z7p3Hjq+4r{J|aEs5i~z4*W#A|II7`UXL|NSS50!~WQPiJ%g^@ep*ozD#1Bi2`lcLC@xT(q}eV~Ye#&UN%@bsvCMxAL4MA;ii@ztrL%ScC#yK3b)I|!H2&8SWqy1MIvO7rmThEo{F)zIyUwf6uiB`ZI6uI6jzXVO;7 z8~~b_s#1>VqF5Zqz=f4gNg@N>-4Iic=B9-*3Pm6he z6LlR2>x^TeTShX!3z$O<66j3bKmvQrnarhaBx7Ti!?}z}>TaTY9SIwxO z-Q2dL1GF&Sy7JeVA)9_ZzXeQA3Dr;<>b0#fY*@@>Bcv z9J*`L+MlJ-46G0}jH;fN+?|HPNf%}4#wpkth8ySb7ZWAs`6a(phxSF%voB<~#hw&C2>)-r%aaY5JJ{n5?McQe?b@uIUQP zg8vim^tv9cP#7YO5>s4ZorS`LsNv}953SzizeO#sp)$wODC`n66;vhuhCPi2Zj|VI+=4Nb+82MWPzf#$H`ky8QaJGq>OF$P{y)^X(%&| zQ#n*-cGknp1}mAB7vCW*t3H!e>4kkRAzI9DZ6=C)l0wD}PiCQF^o?C|a#_h*=GR2Q zMb|*_Xv(yrXHb=VQh-c~Ih>f~&)9Iw>)dPWZez2YVX3IRNi~b{*<1FznmERqtg6@T z<&d<@8)Bn(`w?)bQMsk&c&SjUs zN#fwmSp2VVWGmqEj7^E#%!M0+0~^sqVhV4-NM|pTaQ9Xu(|?}Of00kW?9R10cl551 zD@C;~!R8Ghe;4kAxSj7;zo`1kJUFb$FH3;RLC}Skng87Q+GD z-e_oldVB7^fwzp5v)9#fcHW*-b$l&VF>;y>m2&e7+j}@(B~bO=+Xtba8f_9c6mu-2UWIzZKgfY+-65IGc zum*;XS&(}j&Q7@30iEi_OSxzh)UwcD%lG~$-_Hg=z!T;BDfV~B_d#^ILBle~_iCfN z)XYY#>o~B+-2p~VqxM4SX<-e9++Nr$ex3j!uDNH@>P0V+UWKf-1JZ~I7T3y9R?!dF zi08~xT3{|b$D-F}K~`Otj7JHH+kt{Gzrv9La6P;^&$-W&)R~zhNBn%=>WD8SwbX$s zYuKBm5h3>ZAXH?>`k*&}i)-Q3S_2<+4;=lgX9lx`0cgl6g1{WsRVW z5n10mkw#8E^@CQ|59+EP)LAbGpV3BRuSJ=tmEYiw(pb~F&pWvYCarB2h?x0lo7sAu zWvo~OQHhQfaM@j&Fl3aBv&S{I+^7_LC4TBob2%hP?2ue+(Wq>@hEB_NrB{7X8~}O+ zRciWW=?=Y^s+jE*6RA^7rV|UN;>t}VP)e`^N8L(h(3znYvdymSvyy`eWyicw;EQ!l>-#j{?T?8qe^by;ORKgdSx*_yRL*zRV`L~nHp2D7j?gV$aMPL-NY z2sW3p-@z?%vW;FZbN9j<5gkLg%R%TBTZJD4F!WllCD)xXcL=}HAe3)|+KenB8fw8# zS*C<4bZiA_(dT~D0{;uijs}rvJ!a=?RsF7-+=MT)@j}j!ZCXnY3l(0CSGedtBOzg4 z8kQI$#8uDGAjxx-o_7N)C;{d!O`kPd8;_*QnIf>lzC>3LZIaoRKWJGf;#rYPjA^5i zPvDmoKjoAET#rxVb>+cp@hG2`D}Bt?@adRDZkPjCky#d|OA}zqu0?#bplhAV?M6Y? z@>)5H+j`haqY86tO3%MMA;;?FI(vx}zR9+cKg2(G8J7DueF9OXLC2kj!bv`N^nF}-m7&i`L@yeNh>k_|hd=;aGAT6r z3G$Nzj=U1B-8XREAD%Iy_Z^&sH@V_0x(^EJF z&4A9gHN5m>;K8S!mCm~XpG(Ea3dHZNsne=Ccwl-`H=K^=p4`(r%xamY4IUY|rA{Il zqkEvq5KsHbVvUDK8K=(K+{%l$C*n5p_$fpG3t)0prF;cUElA&FyUS??35tA3&l%)l zoN)B9mYV&Zf!Mj1j)Z+u6*X41I-h@1cvVxK$uD$uP#Y_GzAT{U;v)*?%LD_S=0c5z z*VXkhqg01FaQK|;Y+|*nHFO2=wRLu8KkicqY3jsr#cUdAibK$b$gWVlsza!E*ZXoo#ef>Qia=xbFcwnE90Y# zq3QRfKR_(Y+1p&_C^z2*3$_=nv)VIqBT;k{j(-uW>px*Owf)D=bRck(Mb$~eCOADr zy87>aDY(b>oV7!^zQYly0@y6})zML3ke!51MD9D}8wo#%i3=*>X58&JVV|&qgyYcU-B4 zL$}bLE0>#;@KF77b+KHQXr{A-^J(-(libzRd<#2#^!ZTvD88fMRYE#iu0ckvLvV1) zJ4Ndl7dcz&>$2pnM_PrzY%3}$=$M{fb(~I>?Hdf~#i8-(RjW`weylvEICOY=)qVOj z&V0hRI5al@&Wc>~UmQ9<|FYuHocu|}p(E3)K8jbBJMafJmqpqLGb^{NJ(>{ksd@o= zpI=f|bL*wZ)eAVIUcf6P!12QvG+*8+22Fa^Pfb;%aidqLdhvJM3#l|JaYnEu{L0RZ z-~qOOgbVc_&JTWPoA&(RSN3P1Utd89!c!H$a<|YEY42_mV74iELlIMi0%uYho4AS{ zY+<8sXOo4gu_U9x4VCYz@Ygn6&Td)b-U~MmU|zNkm9Gl8yAFrtwg#IGC(y44cKQBW__me5Yq0TUA}VktgWhi5B)pmAJwl<1?$=t&hnH+mBiK z9J)qHGpAy6(!WVEgxWqa5^RL;{wH^*zWqWVg!=dbsBfQ)%37%JQim|Ip%*$Ew+T_# z#x~KE?A9M6fbl-#I3!&@!W2Bv9PdevKuI+tCfMmYA9I)A91M*U{J zfYtQ^R@MtxP%mIsy#U@I7}g%T<43;|buJ$<=eZqBW#bdeVU@kh?ZvI^T{V)Gy#zN@ z{(0Xid%u6|wXz>Jll`jfb$3{Fk3=K1z4`VN)bWtq%`e>)3&uE2FVAK;u|836?~@IR zM&lTwx%wf-k~Agg``CAgw>C|L&5|A3+BAuHvRm~N3QgF=hWM&J;wQX2Iecd(&8P@A zd)PAqC_AE*Fl=EmBl|-_-GxUi>Yi+jZn)zRTANJV()`G0B&q%O)5!J}L|26L_O_=n z%=ovrp`VM-9~4beiqfl&K@7gFA*`~?7~W=Iu{8+%$)vQgO)WLhX=dWS=gQstFs~&E zd1=w4(bQ6TIt)byG*r@0wSXUFy6RQpExn@X?xvyL6v9U(ivn}Q{`Q@z|u-4X$zLbgX|faNliB79lYtQ)GIvq6&Crq=9T_mh0sOOo@Kq-0q$`i!=~UVQAJ_qw1=R~k)0cx|N^&W@2JtnJK#a^V z$4zZ@SX>>`Rk;&kU6p^<7&WH^9Y0@?keYQxZ!ATZ_P1cTHN@4Zh_{Bg$0H21WX85T zijdFJHTlndO;^5Mc!i+8ruk4Y`g3d3!f+f)9!oN@u_QYviI9(s7)`Ojgn?#cuQa#X zqM$1?TAQ%@%A-5khEopGg@TPkA~`ta0Pv?pvXTJXTLVoO)A8qLxRNb0{$MU5`ooG% zxmzF6TcY*TLxCNptWc~~&$0tYGpamchB2Rjgd;n<&9?IOeU#5t3He0Ghg%lYMCDgv z1uGfJ!Sbh^F-v$&>M@7(wYSKwM>A zD5ClZhb5R0lTx!~v!+aBA(2BVkK|Z+lc6ZFlx%yfi01Z0IdQ5yPOc>;v75-mTL{B7 zFg|^_uSyaTX!$iTr{JI z`s}LQs7g69_F7k9Q>00DIAIjuVR*vN8!%&gcJ^(Er79|SBc&?RoorS07g*K-bXynzgsxmdc+jtC?c#7B?d|*O|?1 z%#U4tU6g>D?26gj8<5$w?6+`I1q=}PPd{8VozmXu{>*c0o%tS-u;9NeSSdS!dtuTzEh8DEfh zkOtzd?kC$B;Aw3{PD9~y{+0f7{QM3IF3QfH)woUY*Yw`}NcvIsDKr)ciuMf9i1`CV z{VCk!jor4{oqgFs)Bb}(X2I;$ix8+4^^^*_$Dv!Zzit>oRGFqEP(e-Gklm?^FGXRU zOly=!;u;jbPRs7JM;Oh0vZ$(5GVU!jxA$OoRntOHCg0f|qTdWIH>VSDAFBz-0Q~^F z``>PWK`?F!3TJc5)4ZJii@Zh=7~kzXC-+!E=*;eFZ`+m0Pr=`D+Lbinrg19vP6ZAi zho*!aaA9|y8d{M+BB^0QMeNpxOEIpjiH|Ae?7dzNYf4S?<iDvW;Hq`$huS?4axM_ z)z?osNpms5uH7up_3IZ~+A*b7k5;g58FX`;lO;WR6&ZU?&+GU{)y(SQ5*dm_$r-1b zqe)m>(sNz$jSz;-W*?o4Zg%T$@Sf|rwSFKC>G^fcsuoODtx|DwChQg8M${BP-VsfK zGm^69)Gx1xS4Zfcaj?iS58dvKQs5@k9-5sZ9%R?L?{loRZ$ZoSGoour_*8=46rHYR z5DGDwRT^Z7Bm-+0>shYV*TjYkPtamgO5aa$XS@3b!|rUdNCi>rIjD7y>?6~!y+rp( z^`dX}!~_6?s`T4oJ5`UZGq~Ti31*t(sJJY-VHg%qT)I@8K#57=oB_yXw}mDR_SI~R zk+gzQU)R7p!k-a?dG|c`$63?Yc?VmBVHgYLBNKx$w#)uyyo|CYdXU3;sERu$Ko<^R z81F|Spr?Ps3w5KK9r5~_n&_?*HJwA!es3(1oYL!OFDyRxZ0GES)sux&lDRi(L<;k4 z8FSSe*Re9X_7tui!4NPfPmvnqnJqw`YTMgJd1w@9Ktfq#8uB`&$)joE_5s{6YzDE& zqMIwDeg=to;*{@%NGoZ%_Y77a6+g;u-IE7BgE{Q+(&^km z&tN@w8piQ`Ify^=1c?QhTEvAX}9$w&i592Y- z>Bpo-K}@fy)N^=;vO1o{|1!^EQ^a$~naK<1HT(&tn(%Fc^E66Sh29fu;MIy-X#ZmwhJ zm@)+{Un*`n%*8NCia7kja|v>F(}Wsdm*>TdDWoA!JA$|xI)r93Srj!ys^HBGeQ0I| zt8+-NWfST5r?75Tn{yPLbH6=*xj9imMCZT>8DRUceR53`!lCIva={&EDOB&WBi0idzfzUon>B8!Qz(Fl z(QD=9xqIUvdTkrvy@?$4H+In4m|H0S4lNq@wA6UxO7LS!kIZ=9G`A5b*}IL!uDFNk zZID~gLJyMhx2;X^w`o~A8i%dyb49WV`4#g@PP2EMIVO7Ew3tiI3$adg@3#H@>{pv& z{c8LWiQMInD}HcXxUo}?NTQ3ARd#naUNo}ngEr3*SL~hWKle4|Jm=eNB#ArUa3fwY zdzt1{p1lINJ?5RumAhm|A40a(hR7atgn+?e(}Udf`mP-a5vQL1knG*NzxeN(cN8CM zD39+(?39b~KZidQ#wj&V2)Z6caP`C1IXGGgVztfm#;Cy+w(kDR*-0-WT!Ke1%0?)_pdobYv9Y4@p|r8mGSbW`ar>;#0Ca z=YZOsc#)yV-(BTAomlvju4Wqma?(x_^LwUe4WVk0jB2*YHHin+>9glyccNITF{h;L z*6(q<^{Wr4?DZs8tjE!6m4ggQMo8oO>4o!8#!n^Hp``LjW7U~m$ky12HkkEsCvHF+ zu5-p)KI)b2s?1guU2ie5zWK8cLjKQr9A!8h@yfTA@cpwJQO*KmG+$k6T87)hWW!U9 z{}HqE$kj$}r{bd`GW*jX>DgI(@00X)D#B_D?M{s7>i=|>0rsq_TQSLeT5VgwM2TBx zHEuya8hn%{{{GtN2t^ki25L7@np?&8z)h(KpoKqP8`Nxc{M^gxxhmrXX-3YnHf!Q$ zt7Dw_s9V$D6d8{hZi-B5*QoZ7Y>FHa9V#60A`f^ssNKai88eO@yWc^HO{6mQ{Z!yIzCoQ+2(f*CcpFP1W|q7wYy1iWbEO7N>xF|F=}^J%KUxM(_hXxI=0q1s!||3swSwXz)W^$+qN~mZzA#&r>Q{^ z^xZg3xpM}baNljjJT*yKVn#~i#ZD8W?pu`XX1G>4!X;{D*OVYh%d^D=p)+64o~`3O z4X5bN`RS^h3%#emNYq*46dg7L-+PLPZqTqU(7B>wEGhxwwl6^5wnoT!Hqg_xR1T=!qlV z=_r<%h{gnMd+b95x(Ob1*IsOVl%Y_D{;-)M^hb_;C2V~Bgb<*nlAV%Z$}c-FllD6f zUsm<4G3L?q&xZ3j&xcl@&!W3(nXFqItrkH$o7*KKrV;lw4#l{t`x=MhUgwC_YxPs? zRt?opbbGlwEVu$>y|2)R`|$RSeVc1^l%U?WMGS;);~IlbG$wd#L;^PuJEa@G)Pq_w z%Glw+Yum_fOx5_dP~jG}zROCVnTt9XpVK`i#wRIfFW{4u6F{}Q%=KIlDi{$SbtZB; z?gjv8mSG|rcghGN8$Nb+yj=V*b+fdwUNNFruN*-v+}DR#eI3W(ul8r-7l_mwT4#J1 z1NR&c8wYGnRnI}3qosJ;^yO}SOgyz4IZaqEVU4RRl7IU~VO$E=%tNI|h_B*y<%kOf zwRvexth%Mf_K`~@(y*aH~b-oi0d!PGa2Lj z&)cL|{SstVek#=xEgfk=>(24pzw%KR)qh=GVvV;?vg=cjR<|Q5H1>sj$&NnjBtK^RQ$|$kQqIQXuw6M`a3Ho0e)oK=ZZcNtrc7Gp< z`LuAfFW|0SIK5N2@y>pD*er$F6){zxP+)7l?xnx4eMSdL^_A;QS6oE!`c!OL!HfcZ zx~2hbBoi;)<2p?P(#4bUxW*op2;}%ie zrkZYS@Yo#r4s=Za=bQQA?(hmDt4sY1ZP%!mt2cErB6ZUi9@Dp0e53DefIk4vj))h; zJ8hIh)D3Y<4tg~zZ`c45eGzbB*XLlbCu|4PtMOt-$35d;T!(%IU99ps>1RIuRN zA7Zte-OwY-ZG-CljhD&-U9fJpLU#^OBXAwd@HT!0vnD8|)R_(_b(*|puwDa@_E zVSk4~rA4q`mKt%G9FwAPSooFf@eL>`8&bOKVf1UIiXov*fitSnT%uo0M$?#tzFn7} zQaw`}Ad=E{Z7tdgLO96Tt}8s^o|j=ybNVXO|E)c-Cu$Ypv4#hF#af|@wZ9x^EVE&> zNQP0PHSZ2byXdtFDqgMdUIMu-e<)~sDku!fw*;O@pPYRP_u|hQ!dC^hEq|qbhrrXb zL(3z+19JiW@EJ@M#fHxbAE6oL(kJ&;@ePp8xrcuPKXC5w&Gz-?C(@VdhYaeM0Yx|n z-~WJ3qF+BIofF(k1n-7Wmq)a!^2N!4=T2(S_DoP1Dz-h-P7&EXprzS)Q4@Br|vU^0_x;mg?`NSAC#mUS1LwT25z1*%k9z zTIRRR&$Q;}&bwyjqH7oBGmDmFmbc8E{~n1qagvF7@eNDzb5~?qmM>qre5%Rf)C@C} z+_jjN70XaS%Y2);C3YX;@1TUV3IVN|B}?;}xtS#ep-r`E_S$9n8!|1e^X4vV$+Wh7u+Xw(UW<^{nqQ83 zrT%8_{9!^ZwFmJa2M$aQ%$+}fk@Ty%i!-f@R%GTaL_dQmvAi{7jfzZuX=d5n<*hB5 z!jeVvmd-~vD8L%IdTzc2?-!YFk}|QSr_V(n5+i6%0V%I(St9ALYPlL+2CvbD<}F<^ zKeKS|;su$d3((h+Gu3`&gX;FashI^!3(GU}7hSz59}=wnR{G@#(l2aTF&AoJ(Y2_* zX5*@TdTQpPB`ui~=bxH6Z|UN~wM+0bb#f*(E|tloE^cYbq)<4@ZpqJGwD@${`=I}_ zEAq>sK$b2!?fQj_@-3~)=0aT<#iu4?#0a#Bo(EjAV9}CA`5RJmFMJ*fJ6Oa)4jkmb z0mXr9T5ed}vgGRg!pxh`&HUB-&zhV%zp!laqIsgl5jHh*QmT2$+^ZJ1gzDaCZ?xQ4ssyQf!K5ezKX?5ueXzvlo;#t@)s>#nl}OGFJHQBS@wGfP^o zgE0l)lGfwJj5tEri{f;aGPp+Z8psu?q5GCr)#RfPo$T9&6$b@Q9CWd7{sEejT{h-FMImR}01 za?#algDul|G8@~A{6|?4Vce!!jBmV z`dEGuM?WK{dr8;Kxy!F^L63%0cxeIuFUZKx<#U%@-I8Khb7J89r3ER!CK2gS+UpRE z{B+K;(uN!_g~I_m<#f9=_>pvN%c;%5fnh)rz%)G@dbC*YS z%)F)7E?eBP!i;Y<;~KQkq7PwJ$5Tq`gj7C)ta$!Qml>1bvdbsVkTsqQmdtNiQ8)Fl z=@&r(En;%T%)Gfv#L)?(Vo3}9IE$`p8DaU*l&$%CRZ!**Q;(324D+c=O>KR^zom<> zYq_WeR)e@;Bb+qeU(3owI%?8m(sOF2WyyS>rz6M*Zj|{GZQ4`C|5P^%@k=j(g}EEL zu3dUv%Pe(<4_Bu+U$1V-n?x7Ff!;cC(y6qo>`J6xmCH^~&4bHM7Ai6MqvdttiKm}9 z|LW9*a0m&Jsnag7E~3-UY&qo|{7bnv_62M&$zgKp_&H<8k2~`4)bXh~_-{^X&Q+;7 z3sQ5Iq~?c6jBpgGava#=C~!3GH-Z8X70RsEz9z$shQN&z3+k1lpk(OeK?gt zj`F3meemzH%Tt%7E>F!{xM;CifNj0vbkk!q=bj7K=!aTTmt|6?!s{m=yc7AH4}Ka` z!^H$|_#W}ENFn}nrfm3fbVt&W&pwVP)=i)qE2dNhI4!n29teG%smm$Jc zix!JRaXzL}HS?%KYscBr#7)9iF-l zlPfHMPenIwSq^n&pRbs8MGMp}rf^qWg?ZT(a|6*&0??VzMOd@PbZ#nK>0phd zn-~q4Df1uH{nS{3_^U7Kz&s%Kg_d_O zHM)yrgyt)mx_9Ztur(QsIK44KPt6F!PQ{W<>!Pcdz;OU$VYueS@-r+EU9LKr)j}PY zEW2v?HEbPO$vXK|!&DRRR8`|wn0&qdqxxqLU5{ z6Ne?gHa(i-|Fic!@L5)6|L6I0Zv%!*rCdt*WTZ36rjnwr8p`rfp_W3?+bmElOiEHP zEc7M8+8WcTSj$kSVJ$^nMLKomNW`V~y82noq+Gsev(ej1dY#3azwdR~W*R?#;O_&xo;Cb#Ay(qQ{u$ULL=Vb6Jwu2A zDv!VPGw`7LJA5+Tm#dE7(Me+W9y2~r<{U5{wgqwYZP+b9cOgH#iCDs!JU*oMi$C3& zZ|cpz*q2{5m~yI8+2+~`oRC|J_qg*HylZIaS^8E`u+lA9NiQWTCB9tXVZz z#yM9|;Ke@f3g7M6w2U5LI?_x}GHv=fH;)61xTbFCQx62wkH;K+@f=h%*tBdLC=E8_ z`Hgiu=@SlvS2ovevnSud(vOTBbe*QT1GXBTX6Ld+cQ86ngKVBVK=eYKM~hGsQAz(m z)Y5roeN2_!(HbpsA3ap>2W9vbE*H|8Yn#%-3h!|Yl_$Zv z^n+Wh)jj6#(79EDdw1&Y<47PbrN+JUE1BPB#Li40zwZBL{5>}KQ%al>tVxS6rVmz^ z55wgXf)`Wb1Hsj4v4$^KTokNLi~mUlcc#U+_}bXh>hXS`zLcVOz@w>O!XIzT1}%Yj zFdOX5idzB&z4!FshVkNq!J6^nKOfBq@kI8Ld&Y}D6S}(OlAnwhx0d4L#?niM#*5}L z_;~%8D^pkOBYr>j1R?%wT+oS+HZ&;IHGvUrX*x z;nJ!x!MDrBEn|ZAa`As-sL+FBgP)g+XT}B(m5VQrSHur`2ma1%%M1kKp=|J2Ahuv^`-e;FGUPeLgL|%_iNq6E6(z%Zi&)!Q+AGN*#z+Thqa{fw(;#yqpz3N(Vz(F_aE|krjOz z;^}$W;!m^Jqjh5KU59T-i%(tnwY1p8tR4AYwEL4(@N6IkQ^6B~*phx0h40M7Xwo9?d9t?1CxZN{Jt^0gYRk3h*NL`}ylBy{X`fCE~wR zL0cd`pAJ?B;`(%eXBF>Y=8 zpvTkV1@7^{>H)Vrwl#2VZ!8N7gXW8IyC1OW5_Av6aOz0w3dlA2)1RU-uuf$e>Qlr42BUrS0>g6 z!7XFNJwb5w7%?0KKOQ4il?2^m#M32>a6WYKKzhXL#fRLG6<4O`Hf6<&=>tYGViOq{ z&~vNs_xJ<;oQ2B@amfK!1)_sGcW>%|Z^@u2#7n6I9>i4&Aor#Z_!X|w$CuIvyojsR z$$K*gTwQ`YHt1^RfZIz%2NAzFd%!~_;!DBLl(8*Q4Sg@*h7iMbL(kiWR-rOCbOT6o zL-*h+H}n(R(2#BDic&F1ZN8K};HFaXNbm>M=7AKf7a#MTjCdiHzA+;nN@u>55swfl zbbX&{{QZwpFgE>})j8pKTv?m?7)FRrY8r*cABn%`2bYO!b(sr-t5f20!OE2QhQ4%O zfY*F13pS?2FZojL6jb~0CdEs8#3aLsh}x?=zXjtU3Ow{66`{KJ~Viz zn0`>f=QpF-r_-*k} z0V*Z#NCnTQ#8vv@a4IiEZ#uX)E3U{;>_I2@Mf|}y3Uj+W5I@N_sEgmq1i#CQ?`47~ zv!X4FJ5W$^Vr_6$TFjX|k`gO|Z7FdLlRfg&!5^|Tnym?FaE0l7B@=83#KRfX`(bu6 zOa<}xzXS2bphdNr{{%X7+2p6QB*sUx;%VyK3+P-RzJ|_a#qWvq=QEQx1p=Jh5r{vL z-oB8X{HH+NnGJp&h!?YMAzA~H)?=2|)soi#Sz14owC)VV3qi6lI?d#E7PK z+$BI-Qj=Gs>#1NkBd#VsZcR`AURL}#9o(Fyo(XY#X7Y1ca?PJ+#kwp`K|naisxEy? zvT4!_ivozw8%07a>7f!x1 zEv}dL@C`0CbuO--H~E^ZxH=X5Eh9Fjz6fbHW`eu2;&+(RYF!yow&t~ZJ&Dr4IKy2Vj2dYY&GgJvr z-+Vbm`P^1!ZyyrOX#p}MppxNnORr3QBTWHaemz)K{}nWt3Vwv_Gc_4$emeLI6qi3x5y9e`RRC@!L%BQWnEJ zCafq~@rhuAo=yHMl$_zM>ibSYrzFp*xuI!+uED z5iA~-c_u708z4d>QHKwLwci9{YcNxF`Gr*Q)wH;iYmP(MbJJVon@*ZJW_ECqXyi7J zZ3ylx6EO1^%EbR6+Le+2KUyZP&HOgqHAZxn%v(Q3tSb##$B18+9)>Gh%C1swf9%=8 za2W;F?~NfZy?KndD;>0q5jSRT%=~4H_*2Qe=f;R%mj*vY{j$SwrEv_`oO|&Rf}&;f z81eJe0YY4!4sIPIZb{>|Y4rAiF=7LG>K25)F%a+Tg}5dgyf8-GpT)#WG?jcmb>mp^ zRB6yMRa3s1qbwTi*ag-(8JPsZK(irC-A18Lw$Mxyp`Eg=1wSqi;Rk`>X zwK4=ZDHmVQ2EFAp@wlg4JfB62twHc?xwtQQvk=#n1lNuica{V%my3~-pliIivNZVS zc+pkboVt7;@kCkh*myBg)=gi2J~sHD@nZYf;8)|tBjbLi^5g0653Vf{3xmr`FuI{h zs1*-t|5+-yqXeTn4FXSRg6B)b|7I!$nSOr>;`B}>k_iQg6gv$q(d&nd?Z2xIMs7DE)3xjw1MXQ<&o+hRADgkU}{C zl3Yjfcr+D!ISoryPC4mw!5`BAf~|7kemG6537u*24X%7e>JuF2aV4u1qpJASeFTq5MrR& zSt7P)j`&?Ec~EPqcqSV>St`~A!TM71y&&i<6+=PLRVuz&rW7-4W^jELxfjx5SmZ-l z%E>oo$yYJ=0w>5yI?}<{0t(@nf*~hIE`yvL*(;KyKL#}LV*%u@EIm#c)?b)o2TqP% zU4>SU55AXCsc-Oj2I+P1dPBaALE;jGD;w-C0sIh$JOR3b_G!3ZVB)uD1 zy&<(P>HodKhf)`fy%dcZP|AsHK+EdN)N%ipM$Ce&zMrYP9EKj1l`Z@E)Nwycr=Cq= zeWfu|_hXLgR<4;hrCyIAO?v)NI)%B|9T{;y#VK1xwmr&nFQ>{*3EnHt1_9>VejjaH z#c06h&wR&MNa*J)8)N(VZYn6=PcDa4_7~~Yb0m-EOdSIHufu)SGR87Mf{bmy!u*!a z2+k9iQU5cqOChtKnK~y}Bv%o%u9ZKRovh2DeqtTs>&$bYaPXA^|DeAnJr-jQG7nc* z@Qv4fxB)YcJb{roSd?n{kV;)W1StP)}FbZd&j zHVi7U4Idri+lL``9}D8ndQZ1H<3+)}6bbg8jw9 zT`BCV>Ajd&h*u=kPr_gO_6v8H3*{2fqjGf5q!fep=#^DH^`R2Hr={gcPu8iD8=}|> zp4;D8C$~j)jr%|ij~AjxuHtb)^b)PP+ZyFVvuMARF7-Rl3L83*p7kS3^TwHd`VC$R zScQlA$Uab;%h4vDSh%bmt+wTxX1C&{V~x>=AK@v8c<*1?gu7|Gx+CAR94*dn#q-JA z@V$LT6Ik9NpBB_u_dtHtrHx|gv8o_g!;`u~kN%O*{A&zdvQM#`a5o4vpGD6Ap7fR~ z^m*xC1ct+njwDHa4clbX>^|bhFxs?9er=xH7m_Gh z?`(PG!nr((I1@TCA&)ep9saL?_vNmmuRx+>P@6zEkM*17br|1ue z88t$6s3b!QE<0uj{|%Sau>-|4P5Y6Gh8|xi6D&MtaWlPqGprL55|eNuNrjA=4yH^F zV%^md!+M^QJDmV@ypAu%d0iQFRgG?gzxuLKdtIb2=821LSX8QN)BVR#RB`nBIBB=(Y89Jy&vqadCN%kh(Ee8us zB%R19y&L00j~j5*sNNGM>*ilL-b@2ZzZ|dSW4kd3w9tIV83brRp^3n3vf^?zzf+Mt zlI=Kg+u^JrrWeC>ym!Z@&`1%MYuK8!7kQ;1kRyw z6W4@HzcxJ+skdkpb#x_BYEf{B8!s#Ssm$9M^_sx;5lO-7L$Ra>T z&>Q5|_Bi~bUhFrWF-Bx&B;>)hv~0f;Yj8${gYq_midw$0?LzvpV~H9y>oCr&-6ke- zSp`O|y-Q7&%qwka#eiNMW>#2`ZxM&!YS}=cW-;HN`yyWU;d)7HksxpUK9pw`DpZSn zl!&ws-EUYMWpuiO2o@ADU=KL8K3RRP3>W#eDNQ9GCK(tZBrvMIhbystx$M)#Uh!ge zZsUMOjk?Kx3-WdnL{eGeCDseBbG;z8gz*y}=iykxLMdt(S^>m0`6ESA)`@fjSQO2T zhQn7;sA5+PXf!M|i>5ld0mLw%+Lz7m(9O$h1IdkZkWil7ERO%-MI|6TJd`D^?Mh}Z z3B@fX_$KTv^z%aS_wnbT}(ed>~5FMAoDl zQ3}3NraK`ors$$#Y7=FBHt*EIx_LGlGx=delD@VS-=g46Bf~k1mdP&Ap}w2D z@QT;hL19#-X3V8G)2-UR2m)!uAhXg<1^Q{h4DXX^t^;HwkEq{%KaHg7x*3i;XLQr% zFA|4Ng#UJ@2Ht>pg1V#%pW5`0TbB-{f!OSoD0Abirr$Y&$BS!1Z#7u`RNd-rxHwz# z)e_ymX$OTqr(xMj%j}!L6MC|&?^N77+4K{&3&Z9{y>WTNk|K0=R=?fmdEL-Hve{N0 zb@kTHBD|w(##u3$LBx`6{z6MzZVq!|T_1LE(4VmnkU$mTxB?SaKQCnz%6|qVEqeQ< z=?iVGAx#qY3Wg8es9o}JlDU(UOVJ>MdU63u)i<`!jZ`Slkl^8Z4q>j9$x_x~R3*3; z#$pC91v=ll{@_X(lhyJ|KNDEESq@5px9@ znes~bo3`xe2wZHuE{2)dva9QS#C^o3;&xJYnLf!6v?CV0EB&vgxuF{})NEXt5CUHd z;+C9h+vq{&5IYx)kJPX`ll_iPCw`vDQ(gg6<*S9BLg)6apY39g!afv=;<77_Bnu+$tMe-sSn*wvUF?ldKQM=7q%BXoaCAl`U zC%;6DTL!xES$f2u5?d#|RgtsHNUqMkI5th$(}3;6-W9Zb)2moPbG?=|;UrbbOvZl0{XC%&b{yJ5PpU5tu+=4;jVvKcTPLl?=nZ;8@qcM*uAL(4)Piaoi|j)ex4G=T$O zThTw*sJ+xeU544loU60mjqcXsgp8c}fuLoVY7tSqX|pL`oo_y^41cHNZw3C==9|x` zgrDR|T1Zik$+}yU=;|Up&(MBPex)tUcRC7`)yxl`h!#?V)m2zyxBgIYnJtdofQOP3U%JTTK`wuq-FpGVnBI zBnlWAss*2>2l;QmspU){wPGPqF2-Xe%t@YzghcT1@J;k!uuUTwdNNpk!d-pf1u7J( z3~9K`lqpe*FjNuBqBI8|G4wJCz4*OHHDnuug!t02LB0cKTFGIRf| zy?Q)zWhU21=2B1k99saNUC~Qq@u9P%@@wqsiT1u)YBky#wG=(4N{zD`BqRJembh_L z?bWYlypIrrX;x?pR8p~qX+63Umy;2iq}@a_ zA8-DeP>+PbdL?$^f~S%7bYreCIk`k04xu#TCu5XaFcAz>Qt(IZ&_vbVEurr6=yjXN zv6EB}&0;qVNO4iEmh!YD8ak$sf4Ht6o+K2a`KK_2)|Zs2zd&huS)*uuRb4-vpWH=X zBn_a79CPtkgtdSxdgdX)!+GZ6(idQ7t4-Q#4Yp1C>R9{9TKh9JexEDo}z3*f3w}ozVL>$VpL~Y?U*Z@W5)40 zbRWgu84|QHoPRYDQ^)otaM6yxM?OxPUWCTm{{B&>b`LCLLk~i(m4^2*iymoJXh!lsSA7vwZ^TU6a{7_GQ>^cW50I@+Oh`eBf z@e&>qT1<}lrZbAK0`)pGZ+oDAvRJwEAbUtIhsu~Pt}W2 zVSTzX-Dx;rv!S`0vkzfSM{}r0 zBGbIf28cRs_-5CX^-hN}sj|tz%8F2eQ0=gc@A7Ax4&B19OcH$A_=OvBU|hf2o#X(4sa&GIjIy)TYg3 za2BOSn*Lc$&$x}qHFi@)EezSO(2k)^%XSu#H?-KV(SqoZJne%L^;JXD)QzU-oo3Y5 zj1aOLw5@25{3N=mlEcByxP4outu=!1AU#J;`~D6Q4>7Px#XxNgl@*c+56W&kBd*fyfYHG54=y_ye3%QWVN}x^B2zM7!>vZo z{nDnMREk+VrpST*VN+@N2by`N3hQC77vgy&_*M^501BjLjI zo_140&zm}7=on2ThJLHYs|D77}v=*d*5(`Zcd|Tbm3Gmf>zo!9s_QGlfW3 zDnJf8s`N<`2Ay}#bA>J11VfD z2(vzV3(+xOPRA+~)8;ld!>rDXl*Q~eZmU##yT&c#>RDF^`@1vLsR4miV$`ZVA+(AB zj`q~v`lf-j+FX~uL+tJ5&2wQ0K zL-+mYSgqp)XEG)ykwe|EGp@q|Fapw2kbJ6)5vq0hg6Bfo`Ki~*iOin&apwlg-R#yh z>c48Y=DRz0#fvcsaXRJrZgYX}9uZZvX2V{I7>O32UAhtJAWylPq&ZP=mcj^s2K z>7x0j8(J~Pe1IC!69=@_sctfV@dYeFrx0-aaIFuY)A-zr18zN39<%RW=oDE>7z4-I%zFZ@5Ck1q$#V9Pd2>E&OBxKh zAmfg=U6=(By?*D3&G<@dO^BRmt>D-*aabuKb#n*4&ztTFgI0vKF#edAgKmaTXrl4@ z>Q>;+8f?Q5;;GVzq^c%0pi0?60k=lYUHONVnzah}FFK-#sqbn6Cj-A4Au;X4GLqWW z!(SR7@c+cR{)^ryKS}ALkd^+bx{

C#|*6IBTf5MnU6kOWlidHt5uss{*)nfgnfr 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

vVJl=F`kcXCczIsXZI%DLw^e0?eB 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 literal 896384 zcmeEP3w&Hf)xT+*HhsVb6sdeD3ktMQN)g1;7D$?hS(XX`@TGCRRfFR)^L_r9Ml4U`{&%%mXU?2?+@Q_W_TP z-$w#JAis|W9xK0(6FgpUoZxuD34$LIJVo$S!HI&C1g8joRIp6&V}fT1o-G&?JWp_% z;Q4}|5d5Uzg@P9eUMx6M@Y8~`1V1Ae3I0s*7lLaA?-2Zz;5xxy3;ss%PQkkbHw)e^*dn-9aGT(71-A>f z3bqN}CwRZ$?*-ch9~OL6@DGBI3;t2?3Bf-LJ}uZO_^jY_f`1cyUa(8>1;MP~OM-tF z>=t}Q@HN5z5qv}NpMw7q+#&d;;7&oOShepU!6AY}1xo}+2#yjwP%t8Rkl?!n4-q_6 z@V$bE2_7!^e!(LIj}$yg@B@NJ3mz*tR`7Vi69i8boFMoi!BYfJ6`UwINpOnb>4Ikn zP8Ix^;8}ua3&sS`6+BOHn&A0@GXyUXyio8W!E(V%1V1Hsso*TZ*@ANfD+K2WRtnA+ zTp(C2c!l6X!7Bw92`(0_6^sjBCAdWJ^Mcn3)(b8bTqc+lY!qA}=n38+c%$H#1e*oF zDtMFN*9E^JxJvMwf;S6(Tkt!A-xd76;130VB=}>&p9tP2_%p#@2;L$1E5ZL3Trapm zaHHT|f|~_f1h)#_Be+d)yI`B(eS-H3J|Os@;6s9s2>wCvaltVaH8NO!6|~L3!Wi3Rq#wfSMVIca|J&xI9>1)f}a$;K=4Ariv%wgoGJKe z!Ak{a3(gU&5S%AiC3v}Dwcr(k3k4SmE*7j6j0+|NuNGV)_<6x=1-~G8o#0ZzWr9h; z<${fZ*9)!?^aN9aX~8cGens$Wf;S1S6#Tm2D#33F-XeIb;CBR93w}@V2ZBEmTqF2X z!P^CYF1S|kmxBK-xL)wrg1-^GQ*e{u-GW;L?-Bg1V5?x8;Jt#s6TDyW_k!($4+}mj z_?Tda;GYDa6nsjsQ}7wVzX<+S@Oi%Y!IuSJ5qwqfb-{lK_6YtQ)PDp)4?F~PG0&lZdco+tQm!D)i$3(gR{ zK=4Ariv%wgyhQL*f}a+=RB)EyX9VX6RtR1uI8U%ruuAZ9!D_)P1g{jV5nL=-D_AF( z5WHIO8o_G?>jjqzE))Es;Bvw11)Bst!IWTH@XLZ<5&W9qO@b>0zajWd!J7rYE%+V5 z?+Sij@P~pw7W|3eZGt}&{Dt5hg1-`6C-`f@-w56*xJhucV2j{Z!FvR^32ql`6TDCG ze!&L>9~68@@L|D61RoWAOt3@nPl8VhJ|);G_^jY_f`1i!Ua(8>1;MP~OM)*8b_>2D z_?qDV2)-fsPr-i+zA3mX2M+zPw7!f>3@L<7r3%*BiwBTWahYP-6 zFe-SI;0Fbd5j<9KjNoyC;{?YGP7wT%;3jWDFzbKd#Y!qA}=n38+c%$H#1e*oFBKS4Im4e?8{HEZy1aA?% zRdBW7_XK|+_#?qJf=68;;1hyR3O*&+Dfq15bAo>rd|t3i@CCuF;7fvk7wi^% zMesGj*9HGa@D0I#3jSO0O~JPWo#A392@V!4791*AA~-^Dq~HO92MU%79xV7S!9xV! zBRE>{y@LNG_&&iS1fzmS34T!UXu)Fz#|R!LI8N{c!4m~12!2TL6v0ykCkjpyoGf^{ z;2DBb1wSTumY^$mj$lmiT)~eEP8a-y;0(bF1TPZ2Sa7D`rv+yTenxPvV1?jif|Y{v z1s4cb3tl0(P;il8jo{}5>jV>mR|{Svc&%W);8MY5f=R*Ug4YYK5cC97f@#4o2{sFU zMewVFUlY7Z@aux#5L_krEx}s^ZxviE_&vcN2>wv;M}lhve=2yp;LikqA-GoX4#8gu zt`q#V;BN%)6x<}ZS@3SbErRz5{#J0iV4L85g7*tPAo!r*LxPV8{z33@!9NNB?m*Bev4-q_6aJ1lIf`<#fU+@UQBLzPoc(mX#f@1`a z6FgpUoZxuD69rEaJX!F=f*%o_C^$)Qvf$~0X9!LeJX6pWJX1#cGow%~UJzbp8C!5;#D zEWdvuc$?tQ1b+d%Lw^5Ca2@d1^7}V}cM9GmxJmGC!7YMY1-A+QR-Dfld~Jm&rN!dUXf(J`;S%S${LOSxS! zueFPo{FC+1Exr0gdb639OZ97hLE+|ww>9NH*EA^8h-k~|pQHKO)t7LzL3Xs9j5uAg z^NeI$L(`xF*>33?n(RCx+17&mkCyy*BL8bRK6W7ZWKjNr0(0{Z)PsXL|2`-fmF$cp z+d4tP_fa0zaA&C#S@Cr$oC?LdV~~mfS-Di?5*el}J{b`DFnbvF&l9v1WN zA=3ON>M%d)b#mM2OK0Chjqmj|xjP!_cR1G_fWJp99kzkW&K7ULUq?lOX!OLqL^m?T z|4uADV<-RgO6ARV=0o1F39;1lp4i3*?pOa}UR&&qXJcDl7##E3V_P~0#fsWvMJ=(h zTVmdQUVE}-Leo%WYNtSSirR$~c%Q8AaS~q*(v>}wl0?=!Q^qBR(a-J9_*l~IDdL8~E&$1^K*(xM2r|HPIi4RgufoB} zmKi3Dq8G15TL#{=Hmt!b`p5aTHmp@o`jM&dLtBEOZT4evJH-<=#Zt3ZvF`Aa9rPNd zZ*O>#qG#ulNZOQozDTmLhUmTM3kqF>?uk({pwj_6^tCSLXz8NLg1KVQ!gT(O#sgz)d^%>-bOsz zhT3%Ma$@P}L`eI_o%k2?ey`u36ujL1d$>A+As8!$9g-iDkyTn~|Ko(2Q{sMRWWaR^I2X?lY1iyS`%5{KmwWUE?V9aAF|!O zk-9c<7jc_OmB=HKHIph)Y07VGYNpPw0{wViGwBz8+uG2ApY%^2E#0yv#=2!Qhiam! zSX&{C;&gVX{AOAc&mg!N64B1l(&cCwBU-IkmskJnJeu6QA+IXFAD3c)2~- znoqGNFnS{55vtfG){&rOqZ;~6(@VC0zYC6$Eg!~2>IDTxm#rkb>p_X&9Cq>q~cV~}Ry~e~- z+Sx8L&{>vP+L>gnDa8$N`tvZCt~&vwfpif~8sKtC^(j&*lPyKG=LSSm{FK{dHSTuz zJ2b{O1sknNiIgrUf1`brvr4a$MnkTOs*PNf_mqC-Xt^Sqa#tsNMnqQJf@*nS?2zA5 zx}9i?93q?C?{Frm2JR3Zsj#M4iU;SI_eg9kX;M>u%r83g8ZzIj8Gf%|hM5(GgBEfS zWGY~=258<&4H<*Z@*Zc)05yV=>32;LeeJG9=fYHbWqyy|mMccPO5ND4)D(eKwg~Jt zbrbe$>b{B=rAnj!{0ZW_yd|>ycR=QYh^v|hKs=Q?&*`rLmgNxxlJq=sPyB{Xnn{z4 ze6nwo(0@51Gteli%zvw@gavW$HubGWQKZXn&6Pveajbcp0-Be{a6>B6nS8PrNQ=lY zgvk}D3q6`rOSI@V@$#Vl#;Qp0Lpj;^sox{%_d)76e!>$07COzaH{MdC^#~Ov z)=r51rR=@XGj+6B_Dn=aBvv$V5uiyL>UT!t2jlPX_$d56AU+g-MZ_q45v?-@@7%Z69}q~yX8xbNx0V`JeZdos2vcG}kZVakeHgcqK>BYToc z#AT)29f(uZ9$8;XKj*a}46~Xx&^~c%ToQg5LD0Tl`Hsex$jX-GEs0HmEU1_w8e(+~ zm@Pu9mSvwWv1C^fti>LcK#6vf`x<#P8tPv=EF3jCX=Wlhxox6lfd{JOP2Wb@nubcemxrW{XF(fr*S?!tOxbTVo8io%r_&g zNo^mqTwQCe#j~V#EO{o4a9rZu{L(0jDJLcdW&caP)51kvS@-^!EN7`drMYaQud z*_n0>rFTXk&sn5%5|az&9DlzG(i#imKyzF}Z*N4UEwSbCiqdH#3w}=bjR{&IQU|l@ zW&PAutfOw1k%w4B@PSK4OV5?6*J;a8eNzSi5#$vbY8`Yvq2p5DUG4rqS2^7 zCLyx?{cH;|4+6_u-aVNu7I8x(jpyT0stQg11jwLi+eCVsGdW9_x5RoanDkJ-LZ{NG z?quVrTp5wAO<`+#74x>BZXB9!T+ES7r4Ybxw2YV*L4GQ#mYP8JQ}5z2+bU#gaz|05 z@oo$$nA)j4b6S}>m>8MjoRd8xa~f*_F~+X~@uYDA2o5xv&OW`4f`lu-Av;~Cq!|&X z(=Y67GyjFClFEd`P|zIkhcvG-rV3#2K$+Bt8p|H?1O2C|@d%$RT>zw*-YO}^FqW?+ zGhZahqPz<*Zgk3RN%jniAIdl)9$_4n!^K58wO`4cQW6s4CGmJ2%Z4g7mytoS3h*`a zAh^E0@%^Y;QTFisv^R0EB9;0zMRpR8sJbMid#<3?E2JFIYZ`y^@0~ldMG&o!REqTG zxKWj!VNWXaI;UE;oQ3lA9lk~=R42gXoLs{^IS-_f$#9^H=n1ls=WIeHFFH+4&r%7`bKNTQG7iNbL#N^)=_2^F;sujHj|F~K*>@`f62q9?+2YLC)$GHFJyyM@C|NZb zXsI^@=@%wZP$)?TwLghg#$qt0H}G00i6R0Gp-Kf!UyDXW1T)I11{rZDMa_5=pTi5w zE1cX~SdmdsQYmMh(h^fnQmUq$CW&4&$d`l}2ELj~`|E?|mCc9bwwReO>V8?@1U59p zyp^g)xebbJ7t-slrpfCGun(KuZ#C3^%Zbx8c6AZ|ERAh|WYWK-SiURD4vV$6&=WcU z@oufPMa16lu_4y#u3;v!9z+>3AEC0E+?yNfZ{~@}&8J;=L@XslO$SlrIX1148H*7Z zUbvf+T@yU_7KEj9w=%n7IKR_5 zzc)HaW>^e%A(!km)PPIjSeopvsr?AoXP5JUj}2_t)nq)W%`OOyKenXqU61s#Z3F$E zR93M6myi{Uc^+w7Z=J)ivggg6JK5J4gYC+CxUqplL|u)uqwZkcAPZ;<^MvKr!KTE_5p6nW=%o5ON^-PXlLc>2s{Z5ly zEk1N*Ch|0y_N-v>#VhaR5&pi0`umPb6!QpKz~ZUq@!Z#`uic}U65ilMFP#|ZaCN9As3MLI}ksm_^R4-`$Oo&c{WM$);(1S zxxe>C(`1k3Rgn9L0|DV;frvD2gnHvH08wA8Oa{}$q8}`2u|z#24FyAb%_L8MX@h=g zfjq+^pT2gQNBthV?8v%I;av)0DYvZ<=Tjm9Dd+T^kHdz&K4HCpgD!wGeJ&otiaQA3I_n;mLVuRhI(@*K=lA-lGU0^zfg(|Au2r~a? zVR9^#1OpO!!?W614#(*Q5J8k#kP(P726?SXIY;k=3v)~72r`*F`Jt#i-Asp>DBLT} zUd9tGY%%7d_d$)b#agB=Rx)MyqQ${yaaeNt7qx$qliSXN?RNH+ZMyui-EL=-OXd}{ zbF15dzknwRGTZSdZwoiMk8i2!7}8Mx_=(qHefaUymPVj2AIFrd$nD6akPI*9UWbME z$LB8{rGhR&P__Xkh_={{MMtbcNFE*7Lfpr7M&>1Q>;}hd9Vwce8?0=?MN^pRbfz&oHL5sv~_V!zp*8x&G`Ms}> z)#yRTGTN9DTE+FfbLhmA-EHyVK&<-@%5E+Yk0%zvRn;CS({Avh%bWfjv`!cFXE##! z1Ptm_Il|l?pBz6A@DpcQcngqbv!g?Gh}qABhuETdWtCp2a;}}M`%C2 z@@8!UN3){+crl!9Mvsor(6JKUZPC_BxjI==)!kzEbhF*_azp*g2P9~rnx17#KsRj( zFlkec+NIJ41^7NhACVx2=L_c7lihY+(S@k1TH#tL*>I$mQIsnKDY4lhFG4Gk-#sO5}HR=a%EBM5s55sBqsBV8Bs8-IhKbj z?rMle*o_R0n4Z2m4>6GJTsF{t99?N-=l^cDexn8RH7t@^45gj(nA7;LXx-=_%sn$? zFsmsmH-_Y;r>8dK^}8~QD;W9M7&Tnek!;pwPc2~Fnks3_#MDc@&@7Sq`CUXaYuPpu zcWais03Aj3dG3yyF=(MY;{H9VdRW}8d4X!-G7M<6KMjrSFUo+sJh-82=vie>IJB1* zO~g&Mlv?bEXrRSOV_1z8Xl^uC4)rM2ik`Pk$Dwibycy9|7Q#&`E)Og5S{+A|^HhcW z=TMYN8#6oTX$>)OEY_${5~(<=^GtSEEj>8==DOSs2*|-<8Ekb|%RWiuyoz(S^DF8= z5#Tm$B3`wY%FPK~i?(brH6;H#FH0kphq0YJ0NiHE|D4ArX>~h^8ZIM`O#aJ?#UFIl}WF55XgKyAa&~+nHWhLInN+@W1Ll?z*+t0%;ffh%v zg|9Q;={}m=DXV>#PWMq&P$}q;{qA%hkrikZR9-3SUQhTvgBro}a0T}5CVNWb^MIJ7 z%z~2ItkXjf_trtW%tChG@YzD*B}$GmKlk3*!asAidw906RJAi{e;R=?=8>OvpRgo5 z3tI{9&R(p{8#6L!YsPN{%W`3Jsee(`6u_Kvre1;3&uvQS6W2|thUZY*)3$zL*N!A| zCaeV1EUHP)aP!6sT8=hWhIKU2YV)`4XyO5p71!h3NWgiWOXTh!O{D9%Sy%HSys7o> zXLw`53^SiA9CR@U?XO1@H(<9589u?O6?05mlX;eppu*mkgOi8t73#)fVBZ%9C%*u1 zFpr_cK%TK#8p(t_+lN7(VU2!P87u8OwB@uoJ;BmT^Xba?Tf- zt|U;Qkvv(gHle(+7zG7J;!J}SMY%v8)tHO|>C7Vvq(qrnCJ%kk7KHsp5q2cezL8G7 z1oA}=0e216>JXC+Mdx(Hnm{^=_mT=l=_NWI@hm6aZ%sU2^d~y<=J##M#V7h`RXIL# zNXgI`IoW5c={#K9N((nP2it=`+6v((itp`IT8nm#=L)apZd7 z%rDrdju!7(dp#lh-}lgp4d%>PDC_Nn?65q!4V;iw1A$qL-J2(5z3wKLR*Rui z;@HW7)} z%+}Mk_I}2AzdmLwS1RZ`N1{*`UHk5=tv4&m$r$lAb@2|`b)5uh zbr@G{AZW3i)4VFS?YC&QwtK`C{6mdB@`syrXPjXwe}qn*WZbw>gd@T6ycW zU_Q-DS%nIf)4XS)a=gq%8Tp<{>_1R%MFb4Pb#xJmLZ@>dgyD%*VtqO{)N0HT|8(ww zLDLw_UqBVr#y94#sAFR(+AGimI{WlG3KE9poWA6AepY_And3pDG_46g9XXv5`9=$9 zI5`gu(OepWC*Dn~J2>UAgb==iS^J+nb8kMv!QSQDsL>6H{YRBu!w%^OE@ zw>|_8%_8*-&Lq)Nh&>iRn(cfPa>0A+ZBh64H+6^W-1-eUiOgNz&HL=;CNx(p- zDz9^*eyZQuKBr~dXlNZc>5LiBYIN`=#HP@Ke(;d=+kVnH5;*D1`eWdvGj&rL1W2v( zZhbnB95icSCZVGaoOGr`&yg6<1i_Am*c%;h^Fe1ixAe{(be_tdOxnx7iwB+mqYoyZ z9~v%ft-m{K5N4B`J|_^v)Dm3|XSDL#{r@leWCt4pfgRZ1$}t#3LVM7;@4+-(fS}gK zY4{tZlqogB>wTsANgr7Bl(~}JL_@rD4dxwckF`;KYEyOEZ3vp+DY@qcHzKHQwSjX8 z-1rT?{tV=qIg*z;#7^Szu+?3A^uqZ#cg(&*ki_O{k%C;EAarU;CuWr;VYQ z**q97J7&dCZi*rEqR8?G6g}rqQJUq2=;25?o7WYUJk1HV5EZ8?kuyo!gT@2%X4u50 z8*SRN=c2WQ4PXvm@PBp2#aED**5Ca*k*40?K7e0Fm?=_#zrSW z_tA52EJ4W6JZA*exIpK}XfL+bZ~Rj$w}I2x)Mx$=pT?ee6VIjEAp+<=wlZngqBC$B z8xC~RFKy5-Em+S(zZp1qFjg15E1E;aaz~0)m)7S%NtaH}(Xxd8Nh@5F_df<%pz!_`u-`I0R82$ritn;4+ z=H2PLb_{q|&sfX8)TY?L8SB0euXTU|86uahk$K_4lF#x$ps zy!x7z9ohGs>uuA|)97Qg##0&mwCqH7y-V$=t9*Un{^Dmu4(6>yQs-VN1}$;32g`RvTYzPCAs!Eyr_*AkQ{+=dx^!Q2H!CJ#zuh@te*HI8|)8|jh!KRSIE?d{e= zup9N?Q~vE~`aR%(<^^s$`i_b(6X9{?|4@kfSb~qvE`Lw^ z;5$wK9+aOM0^w1k%m1OC#`f4Q)+hKW5jr{t6KW=oI^a_x>Z=aw8x~%=j9#W2n*p2I z%VX5H`gTVO`{TMs(@p0X{%~4~q8DLCuXoGP!5T^&*a*=$mvdcNAiyM6pR<6$#u@lo zrc?lx)7V5|sYWKAh-oP$Vp1zrZ64o=I7GwZ92(Rc$&@}*vbA(tYD6rxiL0DS$2jAa zD*ts2cv82*Pu=+tv0QSL^dTB`omD7|8kfZ`kj9uSOqq(Q-zmmO-qt9wY#X&z-n&5U zamDsU^R>M&7gGt`g6EGtP3|w?LimL`;&Tc@*4k~RK1{F88}jkdk4q)0qb;d_GdaT&fMnd0Em=YqLFHVXT)`Vle# zhF}LDK*t&I$ojGpSlswXy^D{7^KZG7`lGGxi>#&iq&PZ;+np^q4)(X$fr7W*xsd}J*akLa?3ShBv0Cb5?5E;|ibK5b}A;r93R z^rz9^l|xn2Y{k*__Y+wvCRl%v6h-wZt1eT7&XO)oPuBN1@u3Lrk-bZ%AE|U6f5)P5 z+5|1`bc$=56%EdNThsDXBak~cSko1Q`ugf>G(DX7O=ndb#>70>A{)8Qwl zm_sA$uPTXouf`%j*g6s4h?^LT+}@5K|3dQ=Mb=L(Np?EJ+nc89K4d7!U(Q~nH7Fyg z>1`kwy|&*32Sg>mZ`K#jP&d>HJfGOG&NZCgJABO1Zi3_fmesdl3|)#QYjyb- zB4Ym!eb-2J{ge0J|bo^Nx#3%pTBf~BGev#NUI*~AepMf-gt#RKhX@~ z%U)citgi*Ag14>`e^ZV0cO(2xOJk?CUo|6^&-{{i0c$ud_EH|Zip&>H+eRE&$H8_g zq^KQS@*2OurP5y=M;lhjO=SN#iPJ!Yod*s!@MC^50_IDKO|;ZXD$grb7*j9t$%Y~L zNmW;#-wC7nA$ys!rEGHgvYXgov#HVv>`ZKXWZ5=q7HK6?g7hgS zs0MuMf>x`V+#Rrk0p0L7q2AQd`fZSS ziPw<=L@4=E`psWo469kvpw=3r@^7I$}2r z{nF>mAVuWv#aFABG-Pz$O_LqH*hVeKyi+S}yaz~(WA!HgvKujQA7sfR8u3R}Re$9~ z`!p#8Ga#(uzMC16^6w104Iksul4BIl67GHL)O2Vi_eGrirI#uf+(M=w^@O17GWuwt zycVgzDJi7cLrpC*%;rID@YZ+2@ z49_!=Cz@j%3W8z8Vil#|xIJb|*C5W0-z!UdZV&D~7^dU$WlV$g69ke!h(nVX&NQ;J zg$d3cKvCp%0s2El_T<(;dc3hgh+I;+P?-eX^m!LNp|14QXWu!2A`4AZig3jg9#x&y zb<)(wRGlxzK&>sw0RQsYFQodJ4yD}8{3oBj%9q~%3Xc61Z2mA8wM_z^7ROO{ z+SbTdTQa1^_`PZ~{-_6qQUkh=VlfH-2PSB!8s96vL0X))gRE7*6J$X>XaU=5ieBgl>Qi1wOO@vAd^5^(pTsx6oNMG#IhP*rEeFaXI}y|4l=~>tU(mSn$*}sL z?b@>EQ#7w(`DGrpDIT>b9^KTE*+zsTj?Wg@koutmq)c`@;v<;2%qod%ai_)N&Lg_= z;OrxPaOY8!iL}HWCNGCOxDcvf{r!Rh_1DIw9w$%>Jw{OPpe~WJzKz9iR81`n<4Zs8 zGr6fng;;}`mv}Bk-~7V0l+<88-6{9EWY4gxXJOKw8bZe-ot>Q&O?q6m4pvbY^D*WP z%2wGyGw+^&=w{H>`&xML9i8PH;Bcn4IXi)m^=|CI#h5I3{#AeZ$KhsJ+@*ZgM_^Bs z=vg(I!`gFnyQSRMWAoaXQDFlukcRH#G-=AkK7&OUC`HdbbBo~uct+ZL8oQXnXnU)#Mg6vurYu ziHJNoa!9xOmX4k0Yp>?!nPb`J%g|Rd72NTXC_eG7VBWCd+C2=%-TXnv$2A1Pme zq_X6Zypnz+`S4_C5eE5k6*M967NayWhfAp)>a5Lc?Ro)xP0`m6-F77tC%>ZG4*&rZ%qk=IZ+J?Hk%D$|WzghMW zs(*JBe~c1o9n3u;eP+qjyQm|b>-{!cI?a2TBb=N3ZOOUG7mLnK?%0`lA(p<7TY~Pe zZFTQQWQX+=m{(Rx-`kz{aBR!7gL!#_hsO>X0H%Nj{tfO>DxzQB@Hb^IC{0aA>U(2b zoI=@* z=Y@oZ!bB?Qie>a^mhKs7>g+`IVsxzW3HUg5LkVUNQ!O7;{?el2l-mEK{ z@T03jZz%7jFiL$S5+B0m9^1ucbq{N@PVU6~-AyDiRvi&1j6@&u+#Ps<|X=+uLeD9RFUoYxmrpeyVYyQ z4R^`<7AHOu7SxumBQh891s*!KQinT`yDizuemhQLstE#$aAGhtZ)wRKls5ntbPw_& zN^ori`5I9bWJz;@u+^jfZ&;SZhfFj6 zDjKhsTw|#TRImsQY%#5l;pH#i0D-^sC1_vHlp+#?RKGP5yAbg%MEnp%#7|hH(9@=M z$=2V7l%3=;ps}Zm<`HD&|JwAYbosCG9Qug6b-*Q6jvRP0+G)8-@kP31eVcQQ)a}1f zL3+MUtmq%$8R{|R-lb+KH{lt@Gp9f^)wG=iU!}>BLJ??)_+Y9$*ls z)TA|4%bull(Jyj!k#cRf>l$iztzYGUMNNl~1Ku#6A8Vt^lm~ZUzj|n)cs-~>x79Ra zNs`XC`-AQT>WhEUJ6a~YZF+t(K2J}04DuA{2`q0z@(MhrLvpo08iV-CO@LNHz{4V! z)B`AldIa}`n_Jir;@|Gp%ugj=WIbnq&M}eG%O^zg^@sPW77P_wAsO}B5n3Q07rfAq zj<5|8$08ye`zd$ZX!K>jqbZ3v z38FAqWIT4-J&6yhcX?#m*O?z@MWJQ<*?!BoU!(rWcsD4qb+(aRIwRUdZR2fH&O&yY zk$#>sWMBB}v=5TBlQ;=#V%jq~L4M_EzchQ@)M5qrJHCr#gg2yQPulfm1Y8A%8bcXq zdt!pI5J_1cOkrr#Q0WX+*O7ek`~>C6-nTMrt7@ghDUkSNd)SI!_IjVJ)letg{zFK5>y9#|uiIgntY=%v~l>BB5Sm|Ai&O}m0*mdW3 z^_NHYAqz~QGK*Y z#&h`f|3YmW;p?9kURpr*#Jbz}*2uGd(_y-ic_i={Yu!$gmsdkx`>lN~bL3=zLxI*- zoVpR%jybL+b28||d-`4-aMl)n8)M%C-ZaEcYR?Rar3jC0c^k3Rb5}TqWi?o0hkRE& z?^mO;Ki|whs znkZmK@40uOZ~N^hy>k0C<~A|=;Q)`|KUs1xF`FWE%qL#ok%!k5x)rQ`jaW^bzR}Nx zy5*~pPj}*dXZC7!RwS#PF^cCU^7d1Ld!ON6V;s|!*D!4%-1q#x`tx}t86&RK-=PWG8yQ%$#p(xba#Q6F%NtIM zHyn<Yb^rMcNKqW(yqx(%fh4tCGOKOB)}?Zs4JO(EG|e8N{8l)b&iTvW?~J?7wbqB zOIEsH8I`jqp&7^DJ^&XQd#b!hwp$)2H0N8q?s z)0e@4>qvep zHfKMy%L^CHxZU4gxggtO6?J286RjMmV<#wz9*6+&hM1urrwrXE%+T4R{inple?62K zBXSY;w_6e$_SjQaI+;4olH5e+O&rqW;(k}cmia8|tq#9T=5r=j9ig7mGiYUqGV;4d z=5!O;W6{W-i|>9=S&CdgrY;5TB&#V_SkSYPtSK65f1=Y%)hF}m9GDMS8(L0% z4+YwzH45QJ;Tp@2;aZS6yX-vS1id=FoQKJBk_5lmXVJRxC+)BKk2k3Qi0X2l}v{| z@$Pp+yP_-;sq|u|*gq*J_0?4oqER%c;Uv2LA^FAt`q^DpbIYH=;CfH?P?gZmzHccd zvCO}MTCLOAN4hzJ^C7~=l7AIW$5!lsg+EQ;+tPqc}{&}yx38!(~*F9{Oap@ugoTTj5dmj1ZQeZ@@bmC<9b!^WzduYwfgAI(}HCM{&$Y&Mpn<0WoP^Bg0 zOTB+(rKm35N-4YF?;kUKZ57t~T$#L+&bQTC8m2sA@0hJ*S?{5<8=Yp@B~=5*R}ldF zENNq=e`pb|F`Rn9RW=FOeZ1VLWX?!W^2IUa?Z%0Oc9KXxQ`)`jKjNAq`w<`DBp0t| zUsHslR>YtLKYgffnx@%>;X7HHX^>%~p8!OwwbwR97enbPu6b z$bM&nt=lKT%QC|b+NBG%GmW>-()lYQm%R!J1 zeAI+ei{S{ys6jxewt9#j9fVADtJ~zXF2liYHEUCnh754@NXSJ>kgYSMR`ega75zur z1&iY7aij>W|Y5$uh6(30iX75^Jw_G|Xqp!Xk*p3 zsBTZpvv(d_y>m=J9PKWN8KM0c?xEX}J;^JC16iY^O8J)NuspjjR_j=Go*c#{b z<35@S>FhBT!UYP-y;b}ZaYM_DlgZ9v(Z37R#RXPOsuS1s=Epa7H zSi&D-=8oHJ7eQB-r*f_vw=Wmh_m)c^<*$aP8mTh!z3dyniqy&&QHpea)i7PaJHDTT z?^O3g%z$F(w(3X}<%#N#J+@-82u*TvaOBfx&2e4TWPXmUsKBFoNoxxD;7&Bd6c#W<@9mEkO+kMVO;0T)sUP=|lGNElNz!7Kn((WZ$ng2Rke@=_ zLiXALuA>x_M-?M`#SRlkd2pK$vJ5M zY+!6NF52c`*(kQbE~j@Yj0aeeV7P?kwZ_TR@APOQ>^Bh%W2OIG#r-ExwC+NRz}zmx zRkvx?32e6McZD($xd`0lTR-T4FUAfs3m%90+DSV|I@zu?yK2ngOtY^@_e<+k zH<&>ey{OU3dOxMudav&uz}Q4xg!d>6icd}U433|V73=uOW?HUvWV;wyyiV+NylD8s zdqARk1jCmul@+SXIeK<(ATaXv77WUWt~N)h4WPBB%9|3rPa}YAK*v)!;G}qf`fn z>Yy0k?>Zd5>vec9)!~CwhZ5BW*(${WT&1RHf1^FNrR$9Ta`viR&R&me-*%C+N99r# zBBxwYX|;E6yvjpW_m2Kir3XPM+ES)LbW^xSL9Y_UWaDZuF1sK`_B)jyvtQ-eJ#L8A zr27Hn@|5%_a8cbJV_ky6b5eE1iR|Ywvn||nhitkvGl403 zgXuOJBQ(X*b6PXQA~&NwqY6#1yzR;XiEB6t%%^D1r~Qg@SqW`AgDRjaVQ@{9xe^9? z4qFHVN=I}lo!_6RTf-~ApRSStuYAi60_eg{eA(2IIGJimY42l&=Wf;*h8n zqIhV>Rc|Ct@XiDKmU+G*0@HfB*WTv?`yw>|dY#l$di6PZk+d18LmSxIrpGh0^-A9u z7oSMMLH9*F8Uz26@5nb6Skxe^JQm|d>?3HqpS2?t0f_HMV7^ejNðY4b;^{gW!{ zl`u2-R-Dctzi4#sBp#s`jM2YES8|DFG7`y?3vlgS#8h9C3!v(u)nm3)A zAMb?@>q;5CM?4x?Fjxd{r$o@|!a=JF2Q?QCDlHU5y*vd~!(`fO*KjX;jMAg#MW9NS zPW8WWLE3EzI09PXMJ2y0c~&(S)V(g&Gr1Sr)U{(E#%;1?rASeZ;!81CQEiRo)_PSR0c9QPw(W&y=z4k4ggNoXV_%0LDiB4p5 z3$6+8n&7#&n~Yqjxk+s>!tltUj%@G)@VHqB%dew(s;66o;OLWXjJ z2Y5ri>t5IuNNtrs%tNz88vhO}J$tbdN@T42c!&R!26q!8Q%|2J{lX_cAjGy$yv&RT zvQ%*vZf61mt+FuMDb0`mVKhHX@Q)%IUI}%$=cH_uw-r}9;hG`Z_R2TzTH&RL-eu*W zM@q3jU?u9At6J}AL)U6SnijNLHxSR75pKI`Qd`@otKD$J?560~!^TPNU?CyB%H zsz+TK+wIpwozCPzEH{u!#>bl}9c4R+4}6$xAq}vLs2IZ)Ce@}YNOmVnMNk)#1LI_N z9J<|Rbee%yQT6xAH$d60ML9s`1NdR_VFdeZt#%0V0q5v;g%1Ja7rk{f>PTgS7E?$0 z7-k+`GP@Qdx@K2pPU-n`OmhFs&rP$HpgVC$9%{1Zp(nH(maw=O_7vjx@5t|@ZdkNy zMitdk*$)}aUKc1j$oOOJsxwRY%0Wx=-Y(&~BrIGd5U!rAngl6bjp;EB5|FFO!|j=P zDG`n^bmoWHM`8ptN@{~{5H5cXak|vd){~t=4<@s}mr!O28d~Tjeum{sp5G0X+(mQE z9_YWW#73*Ez%&B#H00%4&jK}lp*c%;cp@GwSk9VD4AQ6pptI?Ygk2}UO91oAA z+fUnCC%2uB!4O83-%*#Ejug0>k4+^r?ggXJeR{LIDq|-f&Q*^esVzr88(+Jt zvCE$w^_zWE6}HN_I+qON4ic`;gm=0+dJzJKyM4v8(M_m=EV$V*^~KJ4q8U4m+_24F zH!Qg(_r{Q%!MZ{p!i{rHXqmNoI?h6>_|4{w+d$6C27Uw8iD3f!izXgGEK-`zp)g z3q;`^0C^=ppIxI`LM`~)9w>9GHrk_m<3V7TG~o0uVsn=@beOeTnQ_qt(R8uCnW8n+ zKZ>^C4HM=@vECgzvN^%zkn4w`kB1Sx%IjzDgR^&yCi#Pg4h*jFl8HJ)q?Q)6Tq;Hc zV`kZT=<0CHIZ)POR7VYT$(~V><;%ew{8)N;vS)Z?`4)Z}p}wq_>?w(V zB14xMCwq>Hzbn}@D}HRU=YYuaFXC0^7x*Jw4V0R>oeeu?cQD{E4u{%3iA(?31FHy$MrPg!De4{#Mao264|s)G`k#r7A!(c7iTe5)8=DBxgN zF*+Jq_7Br%cJi=3mR3DSdV!yhMAj9`{FoUTKI?C*k%Fs}c8}4klY!prn+x0?)13V|K^gf=+4U~u--uCokI zt%qrZ#_3v14|^-85Ht3IHogU&Af<8(>Es8f1nA_W1Hno>mc9O;sGHY9H>Vnjb44vs z$hclYpXmw?B`JNxs~;*kz#NtfITj-4ZFrAaW|Gp>w7YDdYU=w6Da$(w1*|F*Kvzk{ z@~Df<{6YcK3k94)0c!u9sy+1D?0>&S6S4#S_qlVjUiG-)<$tywH`U0m$0?ZfIALru zi&muZm;Wy{IcdSXU#_6Jy81u^>rQw}M?t;z=%K-@E-ZxRCd11#JBX0KofK0N-pxbv)CJ(tDiq(0JeoD5 z`QDyuF`n4>_8`J4tnD4-m$@pZ%*;7RWap$DAML^NF_i;Z>|wKaQzDkK?J`AsC6_zd zfcI;qO4Q~fdDDBR;#x}2%eg$I1b2)xrOEwqL;a7P__?Sn$flK;7JmyoqVv);M}PAT z^mq2%b7^bs(+k!Dc5`M_h+O(=1b7r^xjt!b<>3i+BWbvl%{)_KR6za4tiIJH_kffA zSh9YN6DI*uNyb@8Qsra zXd+*0MGiEO=dR8ClL9R!!4|_xkmZ>*`;Te!zR4VplKeG7scnV{w5i@a#c<9AjsPttys=|&MmhnD849)>Iq1v`EEL&6=7-Fw1B+)-a6TW&LFMLBgDsX zEl*&Cu)C^qQieYcL(ArkDqGWC12So4k$Dl@IT771H_v#&OYyzsnfbw9%4b%deC+yaz5uVpt^&=KFgzMK3%PE1P`N{k&GH>ww$A1ByQJ&4=Je%|8X|dYMLYFSu(y9SQ zHEIz*8I5ZEiFskL-&529MT{dk@*Y^DBquqV-%rq#$Pl+oc1EQf#Ad^kuf$% z>UJxC2+y72rtgIML=IM0@VB_w=`(M#<%}h!VEiWc;fDH$oyhWUE1j^{3RL9?@l+-( zc3l}vv6|dRTHQy%4Seb6QN(SrssKkN`Un0G)U2WY5hs2eZe8WRliZ5jOczwch|P!W z5kUfSvP-&;!nDWtji1COa&+M{^ArjFXPMA_wMLdco=x@4>FVLCWU%l}16#ivuZ;at zK_;TkDfdaNo5#fsyawxZEFRW|EKLwGT64eE?V!i($H}A2GYLhs9f$nIq#EhhXlcBYb4dmbyBT69(6E-Xdr9{-uY2ydRl z`{z*@?d*Ulj=MbSM&h2R=h-KbSZRJnmOloT(rP~W`9qBaLSbwp{p+~H6gwK-7hBzK zYL9H4+P)K@mFsCK5Ojqh+ui4j`Vp0^`8?%|#wv1Or1b+tLN#g|iGMT)XsCbQp-a)2 zxs%-&^?9OVc8Q_xRLPJhO!m`bCOQ%1(FgN-#Pic_DFNJorvjotJHX@?HB&5>V5OXt zzh?&0bWz{ct%L$--YM^lu){6fTXthQ9yDRic={An5`u(N(+G)N2_3m}HWe6?xqheVLc zui&TGO$=*TlVcIOU#U7#9Wc=|1j1;-E27cf>66K;u?nXg%eknGO^YaQs=K-8f}yLl zw=XbMs#Y$}tWcVC6*YAr0_a0ZJ=kJI$4->+3OjhTnwHVHO?6yyQ&&|4OK8eHp4(N+@z&>+8vGx zVh{|A3S~-^s1#;?%aQviG+%yMx4_`&(`Rvw4bDzOxfNoaPtxZ-mFDaYNIJ$Ny3x8j z#9`VgikCqy1h=AFe)Z9;O65b*h8WU${zZjBeTuNwvN75vg~pkH@=y<78zBb12|bZN z2R{*8h*49@&{E3EYM_^S#fd(3uk}#W=vKAvfb|r0P78Trd!{aio^l&lN4alM(~OBo zNIkyCl7E#)*~IoP+~BBGOJF6(luA1@yl_Fw&$4Ew%ZG`rw)L63z$N!ru;jnRHLeOJdQ zPnYeb%Hy~C1Qkp(-H>e&AcpN1+qMW~${CP>^Cqm9edg!NqY}tWvMI^%;_WW@xhAUF znP1nik1Kg_ejitu813Ua$MSK7rp5@=VgDV)$=s(%NH74NS5_x}z zeOrHmbxXHQkjKqx96TzyFM?R-@ov@h!(|0)q~G2xKDZyCK-d%XY>>-0cKuc?;%Lfj3N(oNK7aKZYgWGcVHF2)XbN7@{^-~ zdMsrK(sHOEiWL_~>j+KyKoM6*&G>k>Wi@MF>a8iCKMR~-C^+pNeO7F1UVRXlGv>GHM=8*mMD1AvhN_lklDnl{3M0UlYL>_vKW@fNwhZ5W$@YsO$ey7-< z97=R3oHlTg;4zt2E8BHpzUz^-&<>|a>u05ywhjIBuOUf;6 zBFru;;68H55G@BQ{|(*8I?Ho zY@As$bWMC`RTJg}jIdvp>X<~H`JLk$?9DfZWZ1x|l(=74Qt5M(WNA`e zNq6UL-s3D2!FZ{^t~<&jQ+i1~HsdvnnGy_C-)l@HbN ztkhhb!expv8qIC#8U%A9vL0P6u$75uJ}vhpJLDNF+dDhE{>ih^ zLOZ*jc*k~jm10;y^R6|W?LTT~7wbsqUeWZtXL+^Rv;4Jt`y(?V|Iijt`>OMX6~^1; zGRryU(55N!6-DN*w|UFg8Dy^V8WQxCW^{-Dvv+q?;WVrLEJC@N5beThE*Q0N_6<6X z&Sb55F;i8?#PwmfWl2U)-9$V=RRvNtZg+YGEzD*7Gv$dNn3-)$CXQ04r> z906Xrxp};D)p@*fs!qG&i!(dT0%Z$xg8sNKLn>&VERz`9A2(r_{c&@ZKTdBsD@ESj zmPRr@xsv|)t~xz`0~7rFXUWp%9EF zI+|7Ue9zLA1$=d5w3PajTvO4Q@2h(zuO+JM8LlQKS}<*VV3Vs23AZ; zeDkY6o5GCm4w7K@$dk>(tvXt@YD?Icw;Q{}XejFS-pO_&3Hf%3eTiHQG)QV=S~(N* zZw~9dtnAs!PVLlrX-n3pz;fxZ4R4}a?oT>dIMLb(Rl?c=y*aS6NOpnsggD5%zz)EcSEl$?XBWwy~`NuCXP&i?fjdwFy?yBezzwt#k2>CrXe% zCOWvUoeRcP>}qncBfL;%I?DBZM_JKV6whsHb#G*EJ5*4helS3WOIVf`0rG~TdpkJU zVY|~wTR}d+fd)=#PJ15Y(S-=bRO9w@d~UrrqV$V4tylAGn}D`aQ6bF;3E)FT9NgM71Pqw zJExHs6gSkR%5Oww&8hmPOD<+}>1h=+xvkVDipbGb#P1gC_iF36VFQ$0<{oAec_|Dj zT1^^mWUmP;(goocqH6s-K6tLTE#@gYr+I(L%`<$mOUE!&>lcP}{lcc-uU1ue9tT2j zAn~``%f9|lYxH%1$V%^T?uV%G8G(VkSmKS)K%({uzcPc2$IX2jRSR4h<@}d=3y4%j6~sa&Y^S3dKEG95isx^9Mt( zv6SD^(RB6G55y=m-=iw1L?s(wheUa>>B?vx1jx$ zWcWM{>$-O|M13<^eXs)uD_B==%JUJ~G=FL^-yNOw^%wHM0^~kE@9~}Ow3krdhUqH; z{YH9JsubtLka9#!e~C|h*VSv?`4D=fx`lORGx>#mg+V&RzF`uNDu&85dlK_I5JmSh zJD%Ooq$u<0R{i~wndn1nuy1BH^#jvE?cdyc)>_mdCLVL@$CoW3A62v2YXZ>%8FuK? zhbEgGwPBO)U)xQW7Wa7duVX(8UFrO4*5Nh%WR&_FzV%MIN>ecV?5xKVKjb2r;u(~pO-i4nyKU!HcFL7nnqImSmL|r_3Syi;EI=-N) zHd?VLT2WhDaZR*_f7e|0*{XSQN|>k`FIl@w=2cZyR#isp;uZ6*m{xsdbv#yMVMSe>wbq>I zk*7x|Pz9$~*VR=ox;%R9q+_EM^W#v8qO`88y7DqSEvmS(DiCknv7{}Jtv{C3pv0}L znzyi`wjy3#vq&?|0_viRYU0s~=%NJC##+?9a&i2c zXjR?3ip5pYx~k75sus3zqD%krbMd#NfYNM6amsiJq zg1O&PzwAf)1yxHbpa!b1MEyA%Q|Reb= z6?ITJ%C3r6R4*J)tKa<3T@tT_0;ySa!qp3^<5hKwE1)iv;$u@WVEpMsZv!rxU%jY0 zevMOc{@YO4KoJ8R7~sHu#eplTu31>M=<@i2=tobFe&{nNPjJpkEM8bWkF+?#CPj~R z$`@5!wy?@q_ey)KRQpw328bEpK$ruexd?m|3u~^{GZTl5^?C6NYHH#t;H=u3#fz&d z&xaFZ#zKtH3u+ct!sbzd=fjtS=pV1TMqXS9vu0t{ClfUo&ykh((>U`n@}E1OM|`KY zihMihQ&uuKW2!3_p1rW9B3|dX~;(6Po zNtIeFT*&hq@j*?Bo{hS~O9cXn4ptj#2BdsZ(aRF^=U3G_PQm=9E~=bSTQ$FWNho8{ zO7R+4iPe|0O|_Wg(d=qB^6Mv|6?Ju0wecuTXQR}PRh5cEVfyQ;^!#?r*h#Pi)l^qG z`XCC(;%fN%q9;Na$SXGRZx1;T=6^-qnMz=Y{k52XSJzh6$>f`b(}|Ny(z)mw%+F;4 zj~NE~OuSk~GbN|HN!PTB+RLlZL*d-5N#OtaQTkb1vFP$DN5abU23FQ2sQjEnLI=}c zfMDdubC}&BIhS50uOPuzXpmwnfavIrUW&TA1n1}Bsiz2wgEXNW6Vg9Eo_fk|5|*Ej zrt~0P!~hed2zy5<3-{k02|Yf6Zbw#9uml%v4&dId@TI)slj# zdre;r1yn7`8Kd(m7Lnr;M#7>h_+_fEs_JL?(3ExYLRDbq_EHa@j;Q2Qkeb~3fPXa$ zud2GB3RVNTR0Et;-dxSfymaKG$0TN4v}#eM&C`D51Gh-!7@c+;`I8D}L4M{%uo(NG z>&lv|s;0AZySF-p`FeR(TqQam4)MA%W51^jxXSOqMLG?nlkXkoqyy~&h(@%%1^Yc~CrBP=bym<6cB$Cfc@Kc!@CMI|z z?-75FgZO()S?}fW5{E8+kIVAwrIt>h(P*LO!Z=(3P8HAgKQ(pwG#Isu5#h4xh2$Wt z#MCHfUX-Y-x-c-Cfr&n^x{lUkrb5=vuUVu`U%L#m9DXb!sbw9Cd8{+sxeAjdEM!kY zH?FFMy3)^crq8K@+QpP?&SjWq&8bK%QEa%ZqON-09A(N)nl$IaIjnMO6If3tap#4b zt7t`DxK>F^HHbKU&Z4TT=Tt4MQcF}7an2WO{Db!fd%Mr1?b*BX@2VQwG{7^i3$VtI zY2YNd;L!v`-!?7SvT(j)hjF?kA7BcGK^;q<4U z-k%I|(^uD>>Ca~_s>xwjkOWm<-^2*kMKmB+#3I`ISr@OIG)Z+cNs3;TsJf^|sYWT? zw~oWS+@+_$6SAsEkw_(K6O?LO&|AXz^vWR|xkx zXq;jiFLxa`j)#LeDgu%4{Eq!!CK=%rT^GGCPtRte+0x+i%ktcLrh4CS zhQiJ*j?;o9PfvB6PTaatd|+$~QHEW6vW@NW zSAQP!+G20C$C6$8lchM;mQ|N|r^-rkdoC^8)&|lF{dXyM#~bpbkDz%8x_GfCMK>^dj|m0X=7@J59e>8hRhe?3vmen_ zP1ToRySxN_b-ar%v2%COFKpr-opPV^w_k&%dxblG8jp{A~TL$f3oKGyWTcI|e&14aQHrdjGqD#}+?Qt6#rzD zbN0Umts3QY434fG>8u)Z*rZ!-xoDQI3Xqu8|EzHYn(j)E$DcgAO|KxJ`xeno&?*!C=_MF2-m~ zfKp*$VNOOlb;+hK)!d>Sm2~owPDM2(-KHY%DEw=>acwHf|M$1nZ$0)td!0QXSog+! zK64)XyVh_0*6+1`>#_Iwb|Ai+3OWMuh4imb;l6C}%Ru}f8{APM4rhZu2VzICSrNM6 zQq=e?>?tEUQ^5he5~+`8h`TRkg7;^|`?5IYN5Xn*ustJ|2k*~-YVb%#Jem%^lo6lL zD0p}d^=6LQloG8htJBw~g3qMH*ZJ!eV^E+e=nll4so-E%d_EO)XT_tbU{6-unWpQX zOOsT=z(7`fAVXK~%>)ky;;Wh9fk1pG6WkMsKGscHUC^2q|C%blGcCT%y)OeX0acCp zVw#wfT$lZVu5C-d@#(bq6JHyx9Ok#=FkdByxlcOGrnI;{tz4?&{?x6I&o7{cfT}@~ zM@ZTKlMRjp;*NmC`JaL6`0^>i10%$Y;GPlU-Q*j8$=uL2LTn{IcLX>5VuW~reB)~+ zHyj-y_K|P&47uSWW#UJntJG z+`0(H_WukBRLl{<}i5OQ|qg>@%!^u^44~MH%|9qI(1#=!owumcV4T6?4#E*mE ze};*#mjqutLp)v*+;fIFR5Bgt<3oan&kzGcf*+nCK34ka6fS*uXz-^q#FvH!|8<6V zZs=QZ<=NAN*5RUMSa9cX@zdd8^tfE;)!#_{2(tZjCg{kD?~_!Y$pqhn#>sD5v%%pk zoO_b$XrTjMwmlVmu0(t_72I7SHfMszO2oa{;GQAmd@V!B#{Z{89LWX;OT_m{13#T{FThMF*pd?Wv40Pn5X=|Tf-A)uRif;?|A4vv zF##9gFjSj)PJ!Tlv7AAF=l+?oo$S0c8hf`>}PcT&NhOGIxfI9wv`P6us6#IAJk z(IMhj>EQcA#6UWDc!>C7Ciu$`u{RU^zaiq!nc%afG(>GL72nPV`%A@vZ16~_xGM;r zFBNS;@at0X^C0-#Y2ru_+V0KKASqLH6TWDHGS6CaFsqjn?7ql zu2N4wmpSX#xJnhP+yOQ;kcC^31oH0yp%tT_$dXi%j&&2IgQ?NaqpfssC@cPx`t{%G z(d~f%BRc}|2U6vh?C75d;>!sBfp|JgcMV!vPfA)}x3ty=Lh|u(gR#vqIz_PJR@ki>>9qG{zW?_rLzh=e1Q_b&WM)zmM|73y#5G~hyIl_a0 z&PG3)rX=Z0X~i&TzWkSj{600hD=qF#2fNdvm(~69c0%^1M&Fhehf@It{CgM~`j&Tn zwnRKu0vHrVUXAxfqmff@N(DboiQBl;xXW?bil;Kc zce8Ns;2T--@vO@8hFysAH9@Udpy-ZQ^&ge>zm!FNTwk9KpueZn!7sC7cZNRqXQVE( zZ<5Tg_1sI=gKVlfRV6Q+RX#&Op2`Pz;Q}3WXMqehx!&D)@y=)R01^gD*&f{cs?Dn4!-f z$_5{&Tu4cNod=Sa1=opx#ybRldgC3bjcKEe^HgO722@65 z_)=;#9_a=Pr@){(IO_VvaGuWeS>McxL+Rl2S@H8s1&n!s!}bNLr|?De^xu&?gNs0X z3WG*g?8yX>z^}5HAfxTFcLbR9prNnQ)JIK*hEYcN`e3T4SNxT}KB$NIWqE|8MPe=U zef7o^66)L8K3=^!b)8fwBEpBra9gs$P9)da08;uwHh5ovInor>E@U`?!cA&j%MsRPbcmgSNsrWTg=2CLkJ*6ZBA(}HkNq_b< zv8|;3uG7T&A;GPuiEj>>fGb}uy;HgUWwU~xmr{`Z%xUDNA39C6rh~tfBCMhMotZl` zhfWjwOX`1gn&=!7JaU@&%aBWO|j^xg>b5R2(k337=a^Ih+jt$Dk!8 zt`3^S11yg_Q*RGGJyfg=wha|KsI9%J;K88?efWs(|9B`81T_0ZI{4jC@c>B;iNTiB z#qW?*VkVdk?mrzd3oQIJ8+`9{@%|tuC>{Ls>68y1J{>dF;ND^48zsRV!^FXo)xR7j z`i2DU!^Gy&`&0PxNMoRssy7GCC76HzF2G=j7XK|3e4&Kq zFP|tuM({ZL*qsS}f&o5LF335)T>|4gs=4-1chY@F^~!VSR(GsLQqKCpDDpaX+R08>`HWcXX^8*of$P0K=5Zvxt#UWl-NQd zK{oMw8dR0%{zHAxmlp2{zMmEt@bPFctY&;RExw%!wxz`umh5e*`qyF-m2&d@ENtkpfR+`0 z8U#~;<%x6%}zOi_jl_e6$!d-{(M0)hwf+ z8DM-{6C9y(pb9rVCog$Nr^wO z`@DqW{+M8EO3Y3FiyEF$nrgWJ!^ff2HLpj4tCL$7jr%MY*P3#8ve$1@aP$a0_j~E9 zf^lLB=%Y;N^IL*C(SYkfGUuj7o(sjk6B%{tK4Km6MNmcG41OW5-V%I0m6AE^)2X1% z;?$eWt5WBjkEDG|>e4$hso&DVU<=v&cQQ49N^44fE?#6FNE*Yd!QQ%8d@)6neaYEK z(!*48?6y?!Kw5m3O+2nN$&Bn{$+TamQqK^9mUQrxl}YC8)S0iw)vJP~sq686dur(0 zSPVv6T4uMVF6~QW+{a0nU(yiw@l4GR!ZNe+eP8O*XVa;tsVt0LAQP_nky{pgz3e7j zhvWY&o%#tC*^vqM=^|)*=+pp@J;dZl>sFV4I-UACl}A#8Xs47s z8rmaII6bue(sR(@^}%ha6c$YdEupT`?AvIOTrR|;;TLi_p~?$J*Ow6Vz=&=zLx%c%bcE# zHF6WzDewMz(}=IkIk-_inTs}eY0tRFdAgSR;V$nZQ7iDUFWQ-<7VFVs7oKs`i8ed( zEi>Bj15#}uM?a5QI^rw+^fA9>En1k-j^}T8;Cts3;_y-Vw8@Qlp5KOB+CebyE@s*mN>7N-h7vmp26xsKU(?Lj{@<~JT*+h6DrxVwWnEenw zpP@cq*fruqop?w!pEPhSIz&geYh@<21et;1IX&pN!?^mvJNq0dpvS48!u@Xd7YJxy zIm9InBw$mY`x0-h@mFK|O;22+1~%pC(QkMc;U8>snl9ur#Fe%%vM87U@B8yFqtN53 z97)kLt)iFabmzCM!DXuaV^iOyWgkry)|1&0=OZhoGWX3k920l`dVNr*F(BYI6a@O< zki8HJ{%7<-3b^)!?Z`t)IY8~zNM~f{3x52|6sm;GdZfeB@3dNx;PItsGW5%!rcRlb zvt}d_VY`d?*_!Q(fNkV5=311Dl85RI zT&1p3X{EXv$DJzjlOApwuP)>nfHthUxNIe2c!m7jQdfECrOc;n^Ox21+%yWUbmm`6il#oIuxap6mBdhL^@ZT4Q^H&F z9Nw)J7XFlq5wPVn)BnuY^5y3u6mBX76e;GBM z$0Gyf8_uImdU(xi_)9rI3lrXH#H1iO5aY6}#{JjPb`zf%qfl5S{f&MivxR;i%Xu(! z3x)~laOP+fl%c~V>83BAqBm&DX`6m%XGXWWY*n&J(soPgd;r%pP5Y6E+ULd^?T`TC z_2wYQFj7eU7-x>tEqPBVI)is9c;h*IG0t;J>1dm*gI`u0wC9BS^`eeZ8xF%)k2B_; ziZRCYBQeIt2IaV}kNn??Bw@dCJTW2>2l>C?qjJngpThaA$tWU2Ips+@&c%$~$f^`N z;w#czFpo0QQ{KrxVyw$43AzClGw5EKpV4H8o{)^^@*|HzyG|I!*G+Q@#xX}Trqwdt zKi#4q(b^1~c%+^QvxS3VG1+jdX5^|a)vaL$F!temOLzXEfsCUA6On{WSswaDCZDoL zon2Y>pg^}fc98(pZ#+O~#;*~{`~7`)_%kh&1|esGfqKNYPKP(2wV-##Zj{`0^aza# zW*pQlX^WCsxX-#GyhkYOyrQMdl#5!fu}v-cuxzxR3sFUp#gt}9~5LdJ%>7$yoyw)2c%nl|I+)gp+;ngKzvHwsOuW<81%`le{gOp?n zrVDY}im&e&v{ASl(~NYEUF6WVBk~qC71;C=C3S>O?GOZD&Q8FwH*(VSDwmFq)ofm< z)(Qu`7}XA<&~5mAhR%qkIGRpGtmi_B(x;&u;|DerT8}iwBTL8GpDi1Q##^U}4K#r= zW*M#TD-}O)BQI8QsYU+UE5d+li7==cXv`!-5n1`#QkvJ4N!C(s5MOwF*YPZoj*}0B z%0dlcE7Pd%g>3t{+oWTX(Ph-dZa)2ufb=d0L0VQugi5Sd0mUIrhUpD z+7v~0)Q-T~>eRr`$-O~cQiZ3td`r<(U%xJ^ZJMzjWj;~c@~k6&{QgPkS^UjU)ifW( z#Tk;XEm#C{_}Vh36%@MNOT^)p8TW#x&itk|-P3VDU(0vZopD-X=#9%8R;9`g4VUd~ zHMX%~?_&HO)0AtY(l78TJL;=cyvLBZtfm{w_F#SJgCsk-2>~G#78ud|EJ@LYDCeZ_ z^b3K8?MKulVXq*RVueOlv}?{SGUKq#v{1kWDY-?gfcg@&3DOhN1Z`I+j_{iOg5o? zOL{<9Dm2Q+MkYnEKO{mbY-~N^{{{Ls*|vk|VEDp!AzmQ$_z0*ZJoujHWG+qGBwK-W zw#>mlO~;Ispldz*VeLgmi{omIj6I<_a<_8HA59yGN9`UmsqVF35r-easK~#oXydiA z7AM@|Le$HR-5u8|pESID@+#l4$(iqdm3@|B;lxVnE}x{ZXuutkZ(+f~LezzpfsHjs zu|=x)^$fQN6LF@a$22Pgxi;Z3vSZYGvA(DkS`{2(`l9)&gpDD5Ini2&WNmLP;I(jB zK!uNE}ZtYgo(tP0KhEry|i`#{sSLQ!6Sq3n*%cQWq-Mi->fPh}19{TSbf` zVqj8()5%y-(Uwu1QTZ?k%4pzh&WfYS1lX6{oC(&cB@(h|1tJFXK6WTMF{Q)ViIy+>sCB1WKp4;hOk{Q5^PS^%&8y_&rtpr*48Lx0}I1J;Wb69j#rlxO7ol^yQDldnT z=Ic=pY~UC2+!I9dG*Y|d%o-BD7EFTWgj~)HLB!4siPk3Lyr5l;g936|h+>9$*(4Fg z?+~`+EAyMKD8+jf-plY_o!>OG9La4S4A=ANywI#gd#~@T2Z-=|&z?Z3qSGg@L&J!s z)s=8*ywhl|kEj&5I6rB}1k{);s9%R$9h0rdiVj_R%$M;O5`fC20PsE&ymLIzd-?Lr zs2is!ROFcZ9LFrZ#!`W<_n4sJ9Cg9+NbRP^?%I~8AH*GB=6AI7w>{N#Ms3Tl^$$@W zdc~o$sc6g7`bup}pXnyes@0N3Y@&uE?wF(Ncq9is~Qymu}1yb*d{j{~Rc#fau7N%Hi|yK-r51|V0C_^PFi-`JhA z6(zf!{)5?#a*&h1q-n&0MXqj?Y>#Y;QQ=LXAzf$AcDzFe@a2{|I4(uDy8NN3#dU$O zCkH_gBK^wv;Igb0vetTkb=a`6;!_YgyP}s`csy(WY=2SY5 zkft<{mvaJWQg#YoZlXjpzI&OqVX=G#4TBtBShE{j&7;UC6bKpBNRp`xYOP1}y zS?WuTxzhG@Z<=N~5A|lSenw8$hl;c`Rz8SbKb>XBAgKiqat>wTu-*6^wc}qur~Y8; zSnuOP@IH#Vu5sdPh<-Sqik<0-jq-)__gk_E^6m_^zWOfmwIg~F| z^j*#2D)B*fOCNib;ggKI^99|NC-xwey0T|JDu)Swu-k63eQv_Hj&8l4$GK37S9H5?tZ2>IykCaMmfp34!OEUTM#nY(Y(rFip}7(mVhTCJ)j% zExSj;HI+J0=|IZVj)bTkc@n7DUQ0Oub*|7{nrCBJ-LHML=E)QqYqxE~jtO6bbetAA zHA`5a*fQryUV=a)ZuX9VIA`F{C7?w!A)F2guVxgl=d8>X%;L>HNtu+DOj{L0X4Sxt zkbI%EHNA(XqbumP?g~j4fE7vzCBdT)1w{t1J=u%ZonEn~-Qig(s#>3%3#(ku*>%4R z2QDX|>u^FjBPHkNl5bXQyAzq*J_`0bL8J?ZpyW!CZVXD1SIzfcbtX&gXm>kp;waYz zD2q$FEKf{lbUKR1F{j}!MR~5ZyZNa@r#C;f)l^kCZ)s~)Iw9E>+xyqbenIMwF$~Q` z3=~>PA$@JQrC&6ih5kVyLM>C0arft2e)K%A`<*N{L%cXP4@TG;LaXo2W3!XILY?~~ zCG@~C$R4_lqFNq?-~Pt20!+uL1eWCH;Ij31S&9wAC4dvDcj4^Yh~}TD^%69p&4*0X ze4XC1H{39doISNIzi=CoG1gSU>ZMCTE}v-HnGljt5FL{DvVwA5#i0pA*X@qGP#td3 zK{o8oVbR^5X7F2+vi8491j2e!g>oOg6Hy+gb#+M77=coaPwcfV&qyuVdlzWvv-=Oq zx=0){>_RVi*J>hh_L{Gg9$7Qhy`UP76gOYPtwxWF(l(k@i1Ztdz|?$k?rJ z@25Bb3N{9W2&(aPtg{Dz-m=gEm)Th_Y30D-Ta##fh&zX zW$cDeI$J6T^+@x=Iiy6v}r}Cn9{DlsxhR)eubK9x@uc~9!`>aT$7M1@<@6j z)=!C`lSH4RIz`ql*S3u*9GVA&2;z$AE-n>h$WXryF$3f#4EP>yuCI#nacJ-l2_Jg zX9s5;CZkXNrcV^LXr>|egTRp+T5%a0)oMo;5DsV3J%j~ytsvvF!mxJrOvKTDOs;75 zpumCEeRhzWg=$1Ht{T4yhyW{jFz#@2dC#0=-rbZVni2l>>_FSNoV=7Nfe&VedID^g zTN}L1CfJLcFVH~G=40H&Gd7>_J>!RZ*$t39o!EV1l9(AW%ogx5?h`X}UB|F3j4{mV zl(QSWX)wFNuMKe>L&!Mz3Ecr6yk!r*q&qX9z+3Eo6rFWDV}dAJfdYh`Gek4u;y18x z1XUxqjwX6g3=JR{8;nOtcb5wl&XXg;R6)o_n?>>su-w?9ZU z)uckMp|#5)H2?eGp@|eiTo1Uw#I7@q&)xaQYPzUA&lfR#nSLnq0ZEztc5oJq@3w?= zMqD8~Ljit6y(ASdqzqQwC$Kbm_@`6i)0&ejPA88`BEAZ;dkz0UJS@fCx% zJYU>_4ph3VNCxELJ>r--sjqT{L93Hm7{ATSV|@Dj9@VKl1PAgTol*@@FhWn&TZCbw z*bc2&rG*W9Y2w0T0GQ?l74uNfnt?;F0NDX0z&^KE8)^oqsR4S7-m0gp9fYZDsd-)s z($S1QsZNl?ru?dn%ESvap!kc9ZxBAu+|0XLB63@boXrBeP$%7SGNO4sSr&a)x}<}~ zh%(lG6jX^Kg=diUf>N|J$%9H`csI~-od?rhBJmp4oh+ZMfFw@&B)JZJ(h)|CPezW` zz6h?VbHT7z$=LJP^i8!oMojha`b!sVzZ+``<;woCnsNoM099V9*WNdkv#H5#eD|>O zu#EJcO(L>Mv!SMs{0j6z`?8w8cekmQWI$C{vG6h5ZA?vYzzrVODY-)W>;`bdm6-|Y z7T~$2;Gv2_nrM%Tf^>-FhP{<`b3i@d5U~<#breVkcXy6iGcwV(pBjli(+jzYiPwl% z=8l&ta5dnB9r<-rb)Lthfxho z!}5+7^$e^YxZ=P~Sd@l~zm}Ay>f3P-9q*AOx8zCVa0la9^wlg3&W90qP;LlcX+x#< z=++B8aeYh7&2gbiHrK2$F^O0sHzm&S38`O^p2<=;z}}6_Qysuq`w|tYF01K%Z}`bE zolRpEN!Tl`HAil`AQS9C;`z*WN-^jx$9rGOL63%%-u&J9-~ZuIPJaA7s_VQC*4e}P z@N@KA@huRV;v80rm1Fl|Cnmj6CG;&IBfda&U~#Ia=v0(B3bMqUeDgdnh394@vBVc3a0KnbP7i5ye*|?D{@Cc_kb`fGbmUO;e9@WhSDvaB@c!JsHqr)nyQH>}dtA zZHz1@=~9$vfgsJ?4$S&jbIKehEX`bJr7*jgg+$p?iV{`EPSt~up%h({ zb};SNv5(N+5sf(*3*>WuhT&V6Dejhy984fnR-0|TA*G3Y3iR2$bh9+Hz9iH#uB@iR zH-;B^_y+RZTX?qw$w|ufWvD=Mg{Y00917&`Yv`D2MlBdv3wftBnz71QIqbOi5!nd< zId`8KSX*XvqcXbY3J$RT`WV=t65tcJI$Wx;(jAn&t3s#pMT{jhZvFk{i!pX` zOk?D!+>KIKm7C~vC7kx1%H2*#?xu51EXwi>*j}+u+(810Bov8TL780m3V$oO7s)v| z!?Pzj8?wo$zG}8hnGL(15}isQfo99lbtxCZ^p4&Ju%>`V_Ulot4ta5hoJ3Q$r0c2u z6!&{C-HCDN8fACLoSocWMKq*ZI7MZr>KkjGTz|`xLY~3z(S+qgQp`6@B#@cl|F+IG zpFx^JDN47K{LA{ZJm)fkp%*iRa6ufo{Rdn|eH?I;C!pLFgMN@6IP@M>M+=4;((XfZ zYp{<61k3(lNWL2TOln@R1(QMb^oxFn2FS{`wX{iboIfaQP#IS>RL}*W6H`p|bVj>+ zunlqpaG0Iy{x9AsoIqX)<*fkwQ}_XC!fvCiSPIdFNsFaCgT_A=w^t}4K_49 zp-G33obGkeb2sQ0=O8EuYfYbKN-eNfVCqiG7pO@m*hwBVzp_*?-HP6MQSF=!w6YmM zZAcLgrERnf0>V`?U8BAMcbAdJ1X<*<>T(W{wCj;`KGU3t0;eJ4=q2o{v|wCtg*`mF zPKQovJEAb$XTREW=w#Xwvf@xjP{TdcxuqefX1F0C9_yM${PYyuz=wFLGra4>kO~!Y zLTZ@S@`^4~V>W$g7V0^oAeW-`q;AI@@C#C~KU(-hLFxHU1y~0)8M-1@z+_}#uQr^Z zBu;ZWD=BEp6+PW6f-OQ*-g2IkwnS2Cp#>cJrwHsRsmQ9M=x!<1zS3UEa;Xpfp4E3i zgRpJWt+JD5^(;5lfHFE}%!q+_Wlq@l!v4VD3P&@?{^P9o#ColgsJ^=`W^GI-0=8e2 z9FdvPNquz&pqsp%4&l?&zPhdZ!i1&U_BbZ2hB_E2FUz+e-i0dFbU$;ej52X8lQp3{ zY)+}8B`^Vmd(ZzY`GCYhiGBPPAtWmoHT1jZTM zuqDu@UBMMy#(%C?)5Fusj4c&deAoifl9N+K+I+DiHpLOr3;v;nVyCWcNnacxf7G`@ zS)p;aL*+5z(i7xmi?hjLD$!mq z+Cw#Ye~zK1h#P8(I7({bzrdoX{)Tm3wTl@O5tGL9u#Sx_3H9Z7R15?8#FfD4o6I*ubx|ApcR))BXa_RjcHyAwGQD4NkN=jazKQ=~1}^FV8+ zmv#iNM9n_v6A&2sYvmp~b94Ja>cZe(hPMH=rv*OQ-t<-1G7IZQOB1OgG{}MLA&w4+ z14_UysC@jMF>&brTKqfnC;0$+x(W7^%GywqOJe}63Khj}oW|tCBRZfZ7?v@T=v)Hd z=^0#>V#~vrAE~F4sd*VRW@@7(slD%+&!oxeXakq3ni1%kJLGleHXD$mBAaG}nHbT0 zrgGa(I0_6r(qZ(1``q-#Fn1Iz9cCX=))soWn&vT0yvQl1)@HJ7t^@gQBSCqqCnPk^ ziUb)#5wYA!ol@Qj4<$b+6y1%o#vDMh#$K6zu5t2g&* z*{r|c9Zsv^ja~3YbON*Fzq`5o@y^KlWIU%>rzWM)u89P2>j9_@{}c-CWtn^7F6u3H zl;Q%atFXBQ>*SwwT1A6KNH3^@@7h1)2-|}LKM&T!YE|~@EQ(B*CxJ|`P-z%ctg5R_ z3AHsfiY$isjF$ewObpp}QcB*Vh?xHBl$;W+Dc4SUXDCymkp~jc3=~d(Nij59%j;0B?VmhpnKa4QC0g5N+p&Klt!vU6-WTEh?QM)D~XF^hYDMd@J8c`w= z(mh4s&`IMmbbw4@z%WCflg@dtU7E_F=Pp{SA-XJA>)&L2{W0rNl$$1>TW~xAL}bze zMa>|hP?~(|Hm;l49-AMbpe&5sg8H3UIBW`qc@^hUdcF)rB3?lu@(9t1e3Gd>8V|=l zvA3m_62ry@T4+4!I(7dHdzX$CG<}bnzLD8r{6=TF#&L9QkDZ=~^HJV5rS&Iyy0`X8 z#FijKK7aXSl z@83OqLLx{HVox{b9T*2`F<0kml#SZ2e{W|(vuXq+AF4p=*vB~-1cF&&Xcdj*1Xzph z1RMcXW0B1yk-w2Y49H|ss+@CKGfL-Vc6$s%2vO1T0e$-4tAE{*7hOqO4@L(n*MSZW zovoB*EP~T2d-r1hnxEQrNnehn=PSiC7ugi=UF)51)MT!#4PoLyHUv|mJA7h(v0GcZ zvIcs39Ie~B^Jcj`@|);wC^W|lKWk3ie;B@I{6n3DmKGjoe~3f4kBe>qMcZ0{l%&JM z%JB08^2V$_%rv`JJ(ckA969yrR+P-tCz|0B59P+csTo>Q*4uPaWN5jLW(|P!O%L%u zbs;T6?_9wS+`Db53s6DK{W4&{SPlyHhr2xx(tz1p)pcZ0P-61rsSZU`;uzZV&5-2= zKkJ8>2;HBpU4!~;+@lgwhE5S_BDyV@xp#*}&=Y;y{1xDzZnKj=-b8z7P?&2fXd(P~ z`fvpnLtF@jsxi}c!#TV~-F;-+&_+>)mZ2Uk1TaL5l$~_)Ni&rb5I6olW5J8qpYV&0-#p8Zqa;rtHB2BsN5lHD6ZKxuz1v`7>>t=C{phWv#=BD75w_&w(8Z zO&K6%p_TivS7Pc`vPX>91vd|Efd7eM1o-E8Fd&Lh7UF87JMoaW(L@HVV>!*fC_ zYcvSpBHU5?H65yuYfbV22v4do9&g!>U;S~-6L-QoYFR~Q+!kKYcV$CaTZ&K$=^y}f6Fe> zG!$SvJ>Y`xyUM4!6wxlORY61cO%?nNLdv5VNe|cPFpC+XpE*tKEp2n@^|1myVx&X0}}dO!$@p##;(h1 z`qgcIf%dEZeE2R-_Cu3FL}{VC@>ErV?6C^=2$t0fv4+)#04}p%)2x#2>+MwS4}B0y zRNE+ulNOS({6VWN_0RJq{BWJVX%){cp+G^I9<3HwJz`@HRwU&8^j)y&ytHY$opsA7 zlCR|e4`jxVTG3tt@zHnF6NlajCb_8|!>DHXv6@~<_%)J-(|%;@&A54=BswoLIw5&0BaJ)l z#R8*3a3W-%El|iH_IZqAU^L)?yxExli!!%7l_N^q)`3ArDpv`l6JrBDzbstYg%P-x zcKkWwshmJOb1El5igPL_P=ms$oFEigC{s9<6HxjvnBSl_BmV#1oWRL6C|^dFp;Mc} zV?TP0iE|f9vJ+0L+YyeI%q(RoFPY$l)-H&!%IDm9xS94pYR5gW+N}wy6H^Z7p*^bb z&uLH>lg>(!9KeN1oOFV&eh4L$%Q||uIW?+#?zzR@K}E5m}{ z=P>psGtR_}PnM#bP%8rKCpG4(&ku*Q&_QtSuiruqFV+7TXNHB?KC1)*+!P%hIGFpUvo5%Dj!=Nb+ zF1o2P%%BboLMU=p*h!~mAFX*FYoNFEo7?aHi3!(z;!KJbg8uJA6IJyXYEc| zv&h^IV7&v-B6EjaG*QoF!Xk6?Q#H-c)inPBbI3L9KQ!FIHGHy!0K;~klUK-sTjb&r-dT>IB8LKcvjdU7>fWVM z2O1qvOFK&9-RPkw^8M5u@@DN9lIe%h56GkSYA_zu9r9{Fgp}4Jqk$)%5HAg^wARdI~pnP?f%^5wV85lB^XaKCqh~I3rbs2Sa$ zi|fXcOa(FuG+5}#-V)ZUTObd`PaI`mU(uc!D>Ul*L9 z=Mj&Lym|*f`QxdxWf)$ZgR4rodIdG)vdWINL!S7vW$eNc!yKem6Ebh`-p{N1ytu!q zj-DJj&{8){&;I79SY2UawXzK-M49z`N?z3g*?&iK zcj;5dvKLZ%qGcz8GxBm7XG|u>L6l+!024D}LZiyZio_&4EYMz3cs~+Z0d02jIAtQY zY{uELm$#e7JSUlK-WJod@5HrtJ(fkfrN-yzAm;W=b>Ank6EBH)@xM?$Wuzd|ASCm5 zmIGbdaLa%&zd@?wn2PmVoRfQ$hpA_gch7Q?btLK-$gagySjj@q{T0X95j=s<# z{AXiiE`(igIXTk(i@dwornrgJLxRv2aAb9{Yk0om@ll|5H5RQArq*jFc*ccj>hTE>8WrMuYmQ&6%CY}aPkfat&+Kg~2zCE|5{9%Q`m_+udl#U`T^7eFnh<-(l_8;@>1 z+$oLz8+m$sRLfoS<=d9Uc&lx>ZKZtMvKDVx_sfkKTeE(|*cn?#jGfauV(hi;BgQs% zju^YFd&Jl^y(7lbVVEyhQ~gbMskhq{QImS+H_0n*T(=yD;@bbx)u9uqP0HI@n-rMq zF}!p`!JSy%Y{wFIE04{GOR?b5ij<-q3qe>Cuc5S!t<>afJcBGY1VFzRP>Y_kUC|X` zHNX&KRn9=!d8ih723XW?Lid^U+OOs*QtJ7DL*zEgp$VZvZvDcaCBUNbJuui)3+QUoERwzHBxL9O}RrQ^${ijfzoY0GrCX8TA_^%)TIviGyR=s;!3ou=r#+uAp3$G zLrIrT?5og`ZnotvXrqhHgyPm9_X#psKakqe$}^@DDkbkOD%>4`m3)b+4`wqNjhg_a z^Icp zQoxB8hj9i~LdL>kMs0kL4g-6)dDJKj@tmA*z2}1+pgI}$8v~A;NoGlcfCndf(UPkoMOYT}+ zYp(a0e)#VNtss{S9h^)+(5YQtW8O6p|MH6uiPWJTf^i4D|aBy3ygp-}k9=U{ku z9*>}n{<>JHDrUxP`PJN@K*^mxuR|`Ws5>D57t}YsG+z$K?7{sAJvdb89AQ)Y7nP4? zFg+6a$EMQiJiV*qIgd@HI~VACPQDLvi=*6mCMyJ0r(=Rl-=jCx;wC$p3)`M1-9=Kc zS8L{@`Hs)2zoDx06p^aXdN(3cC(_9moQ0LE2N;Id7*ALh21W}rQ5$;o=n0EEme{SU zNvm^*$CKq6CyVZ2Tu#rEY?L|WbC@!p@;M$U+?mg@%}rr_Iq9Gj@LS~3D>MGcTUld{ zW7xQ4!g1J$3v$K6M$nk+w5EQ6J0A~&g(5gEj;bLT@F}M*-I%dseTM$$bn~Gd(+5m| zdk@W32(|QRe#qupl!wz zkj5|Q(mBdV*bX25!y|-mTZkn9MEG7sJxn2P`W>cVM*L$o6xKtu9?}HvRl%AA&1UF6 zTlpj0F&jUUB4-A1X@N9lvLXEoq(uzNkO@aunfX|IF}%|1n&#WQ)1nl*V?=6XRc4$@ z={#IWwy0B>dKB%Txdr^Mjn)RSFtiM@_*wWY+PJfE^(B_FOWR)Xw@+Y%A z)}A|zV@%^7D=|`c1TXwPj2Y`+Ps!7<=#Aj(-Mok zJN)w~2Fo;I4|9cw1{L~bUM z>mY9?n+bQrQ?rAKKs1$90k&|7FfIc5crWN?xQ~&aa{4mA&Lqu%vT2$VGxQYAwnVIQNCs( zl-ja9wmnj*i>Um%Luom3s`xEZBvg9mC=x`FhRg77Si@Ij=5-XL@Vo1sh+PI!5B8JA zwOp<4)Z>UqqB@f#Jp-4k|GXxosyWZ>h~|UGea4sKbH~^E?%QfS=iZTah$x>(#pfWT&we3dY5LMGbCDGXi&G6rcRBQ$tIZOOkiNrdK zmqEgHKbW)iepa@1{fe-qyC;3LUGSM36L_StVTcONq7w!w8V0Srh{uApnPZD`F{=oJ zpDRS2z{Wgzgo0ej-nc-&HOY@8)UhsFfACJ^=P{(2Xb3tK*Ckx&k;#`pfdwfEQWeR2CarSD?$`CG96zg7OOnsCMH70WNW_|0pUENz#8M9jjL*+maoc>zxe7ktEMhquxe)Gf`*t<(OQH5&h#%*taz9xLXPWK zUcO*;(_m_=@|O&zsBD$#PjZDsvhzv7_NRzYo&Lm?zx472i<(xfy176ZPCfmR>tAY> z6XuTbN{bh#T3Eg~H@bZ7itCpws#&#aMWG34R%73}{zWs_EN@z}tnoM~#F8}^75zyy zYZo=HY+ABnc|q^rGIi=3austHqWv|w2^UVf@S@jMu94ryzjypa7gkOftFAJ|k^G)| z&rFe8Tb6poupy;e@of6coT$!Y0#o{Jo4`G+t-%xpWlm+a@kJKj!T5zPzQp2t z7{9>97g+p2Lj9u&^+(C$g+g56(ofgO2B?3N8TYk6m+>1y^&3t7bqV#UTIxM@wbC<( z$if-zpJRa0KmGj~dd$)Xt)rR^nauA}rk#V_&MVzAjvlhIvJl%{JpEx)e+=W}U3{s8 zWgM8sxX+Io67XimeSWetq5j^4`Ue@G;_|=F@}CU|5F*Zx$Kd*A_LDcn$+=R=nab_v za{m}tZlW!x{c?Otk(3V}$`hCmh%!X`wH}!zp9mnOC;yqN3>|kM9c9hD^ z=5p5}pcj;zRU*rgU5}IjALa4c*i>2tCc-B${$=W~<|)%I87F);<377@Vtg0Mn)>Pc zP5avzC;1pWGfvW{erUh^K0ZhLk^Z(MBjqxU?f$vAa)(tp;x{`4FZgSu7u}!qe8bNe z#y5uW4F;da`12ut|7hgV!1#ht{kgI}_2)42ITQU3_2&xGb7m@OhRThUpb#I9>NyWR z-){9hnagFtPlz7uA^k_$tdvg!m-|y3yj6RmzxxAm&(1~wmX~49gJ)DC#qd(|EH0ngcwaPy3MyKxk>vk zf{#I!J=_l2ca-n+eU{ETrnA9qC;eVofZEx?_*55Hu#CHV7(ds=>n;5Qj8Av*^fW{N zDC0dL{QDB8el)Wm?!)JTemrd3nKqON#OGN=XCKq~OH@B(x4%{Tq5f`WIzGAYDuPox z6WGsc;`Do&wX3;YZcelu@sqdZnz`Hu;>z7(?Pc2OXdHjUgRz%+Rz3|yaH?~d+o_MX zL-u=>t^`e(j;aemY=sw~8l(3_!=d0Z-t z^fj4rU!0%I_%0%%d2r(VI>vo*KFju*6u4%EnB!_85aMJHS?#FWIIiwF2-{%d1MyT8oE|(PFN3kCy#dqzOTjTt0gYr9S zcj+MMZR2vkjM^Xh%@3{p?cs7s@%^AK7o``8@59(mlj8dXE|(PFkH`s=KfaF~0iob8 zE)J2rc5pjn*CBm^Z#TZrWjY&(n6Voh-`6od)y19ozJqaJeBZ$!y=Z#?g7V zrE`?&T!C_yZ#%yoB^PdlxWL61SbleMJD-Y+;R(Ld4Hp?RRl;XOfL$&0OxDxN;x1<#us7dXjUf ze-sxVu;cfBF84$55GqG;W1rQ_wwDs)LYz-8I&P?C6`A+#W}NzBa3|l`&v;z?BKaI) zJWkGpkK{!`A3lNc6>j@!wXj6>XET18i{E7X*Tnd1UHm$QQ=g9NI1!a6jSC}{JaZ_w zhw0qt(ji$oHkxM}--a>;GXH?(sZ=_*5LGU%)fTT{Jk(ZNF-?8WGwzewV#Z(P(pM>p z)agdXr?|MYM$yK2oJ~{vT?y^?CA7bieP#z}Mdd{FD_%~F!QA8vuLV2&_B4_Pg*o+J5?*);7x7c0Uuf4f3_Sm2D8eJ>1?xw>@WVa)5E4zRJ&{ibBMV zy~J-T^Fj0r_;u!B^O=q>#;#{PF2+(nS{e8Gawp@JC~IQDjn-~^i{Lp_S;)`l+^c_XV|$!lH(9;5GaX-S>}Gr}F{AlNzf}r^ z`0Qu=;Sl}}gO|xgOd%$^_)06!O2*&f;^{Y=`gM#~yZArb`YRca^AobG0rt}|Q8`fT zJ4eZZ%H`O8MNGN$bGE%+Zcm0mEe~f8LoIsx_c(IWK`-BjU4*`TQ0> z7ur|)--%Pw%SNU%!EI-S?MEBq<6YcYgYIJdVi$MzD*6)e(pOMLtRc{gmXp(d1>;w_ zcv|In(*7Br9m18Ma=5mb@sM58ST)o3aWj{BlS|`fi|=AQu8$R{Gl6Y;Mmi$v>02_J zvm1iUKiV8=fN5Rkw&je`<~S&ejQ9$M`2) z8tJyvFZuy1@UDlhW2tyWfJMWmW9(@*@7>AeO5@7?N%2ke_Hnt>;>sPh<&JQJI8&z3vN<>o}?rRG)BNdv_H zp7Zd6zwgtF_QCWMQqhDTVEnoezQEu|8JA+$_1VW||Ji?D7RPU?<#!jCTN|g38?8Q; z=7^E_{eEii2-8`H&si#{d7`-D_}lIrfkM27UUV6?tt!`GC$oKjCXS!GtsQBSBxHYvFRU(aUtf@i{?N54yhNC!%?R5cpU%Vu>6l< z`~6{Dxo=y!ALRDxL+#Bnc91=v03lvUFPfisN?6KsGq>|>T>pQn`cM6;Wjb;3HV1qu z6UdzG`4b?%kbIo!sAj7m)aSBtBVs2=UmBtE)$m%lYHm0-M=57LwYAVx2S#- zFQcSDgt*piE3J}y!Y4Cc7s9WU1ai1Gm+|E;PHi}A5q-?d*r;q#F2gZ_+G=B3ad{`T z)y4R{Xj_gy&!&R-yF1zz#n;VNk0VJ)_?t{G+8%h_h@c%g0)%*fIwC)!^B!w=bD7R0 zDy-==S^2JG+^6dujQey=a0T0TXB;p8W_jsjT2ozKoVC_cIXDX;r%RewCpW7|!1Ihh z=+aMrO?H;_x0vxqLb#gP626h~yF&O@Q@+RaG5w;AYRt7 zFCD<=Y?RLTES<@(CeWW>%uT@8F)o)rw9PqjY)28C_#8to_*;zs0zNr@lWiSjIzHRV z%EVR(A3lchrPP?_Gp!Ed5&dZicmv~c@tEp2Gk%dvf0>dqb#WNm?#=jI&`+MDQMn0R zt~svUdn~=VT<#^&I7l(q$!nUq+_$2!h01;1#+GSvf+NHRv}@&~f(!MpfpOm)yqR&D z%iH>Yk_=P*otnOjXWlCVHsO02|1mz>`uk1&gN)1V6|KLwD0xu*tW2b!N4NgJSbPlQ zar!5@?_z&SI`_1n%RNbLx^0nve#^GEjoXXM?}*>sj7ziD{aL8$6F=H7e-fwPZadB$ zWjb*&kLWbB-_ZQCfL~sFAk*E&<(@*JP`O&3cRz0TI9AFUV11x|=#gZgsg>4*v0T zDQd5u=@iUOh|ZmsPCL_i+T}g{bEC^Dw)Le^-&AL9uGMEL=X1I9U^r3R$-KzrJ0 z#{3KYGqTEjN-{*Uu4eq25I<^xJ%?-a84t~gN!DuVSo&2nm+|RyC*wYS?q&RgE)NlX z*0B%#D5@u=&;Otfksj7^xhc_dq=!qb9;#%rCdAv^Hq*1E9!M_rjQ@j+t0Pmg&ubZ% z&1oCu{XnX}opImT)saxYC!ziTH z<%p==(3qH39U#7XnBEuhxj?S>tN4=xCfKH@M$0*K_C0d5CVu`!ZB1huOQST%H#lD; zTg%FUF@9Z=@G*=_*0rrVd#uwKKL=$^jBwUn_6?Gc%}nPlE*)oYaTnuqTB7;jGXy!* znZPzpVhPFC*~jWH!YlQ)OfC?_%arg+#)spx>8lgV>KOOQYGp$Gt&C51={slI+8OuB zsGIQ>q5Af0NsF0O_n89(aTXYL0cvJvu$d#wMhcYG^Uj_o>!`a8KyF&~{@ zMU41;YdzyPQX$=6=Uh!I<8ksHgDMql&&7N^hjMjXu9$BOlM9tX_-tn!<38J|Wqdu_ zvwczfYNY$6jQeb3a{|7Lai4AMW87yOhZ&EvjU4!EV&5QH`*gmY%M{c3>^Fb_{(Lc_ ziE*FKw=qt97&)@tksNm?(BGecA7T6om%ejf-$=P2EyO!Q_&=H4W&-0r{$>}!bD(*E zeUwZ)BxmQm*>%cwF8=G8|x>_%Sk8TTn7TE1ygN@(6m-eyL1Z;#G|M zWKhre`EGp`rd0mNxUYZP6Yvhkhr0A@RQwu+Ydwt1tt-v{+bll7xO~&Nlh>8MkqG1D_&6bCCT*enqb};Uf(H_QqIyjJkA1#7YA4a{2n2+T6 z)CYB}Me4Dd%lLSh&-lxTkd_m#F_E6uGk&g%JLl(G8JAOUU7yd2QvJ>Zyq9sG9g2UX zhW%%4bBz1=t7hD%qxpq7Vf zgJ<7NK>T?MqCbXlZ~qhU2F8h&;s32R4mLCH^YNXG`+RV3Li-09_vt4~$qfE{_!!20 z_BV}jnW}32IAeK30{v#j&nG5yeP^uPnNWW(E(FAUtE6)uVCCqKc7&4G2`Q@kr*4>$oOOzhtBnycN^np zx;W2kW&auX@z=-rjc$Eso>?jv6pHkpaUcJA#(n%RW<2M%@8sJX8Ta+Cjqwp~{VS}G zb}=63qa>d`#(lYFX`Tp2&ipv?uV6e!g|z-0{_~9c_+QMpG_bj1`~nRB{;~4|PTG9BB8jA6|{mp)nz?oSEdXjcNGgu$yt89QPODf&6DK`@)PU z4>Y%P&Pk1u$`s;ylruKV3+Ke=WX65#S#uNcb&UJ^xr1@}rhO)@4z5u9dl-MY%ilFN zCLUniH>MqBJWiJ+r)Kt+kmI~kYDx4IqY9PM7lz4~W7E*H)bZ*_RV-?j9j=@XCYh`7{m z1(%8Q72+{p1kVBQW?!3+&mmdxxp$(mnQ8cRyo+(4jqPJRZXQPZn9Y80b~?fX`kEP` z_A-f&k=Nh_e{p>!Iy;ySy@mQhGIQeRT&ClT3+otv9W|!q?(7xqNWk|n?vvL6#(j2i zl<~N@kONDjq(KT%%v@X$T>w%tr5a zJ#7Nxk5eIos{^d0li7^ZXM;QIT}_Ppbh<48-_3Y~OW#=!+|T$+T--TVeuQzKzDNEO zRTM%FU#5R*&6)JHgZ=9fd@j%v-#0~lpUZT7cC(IgA0Imy_sMBb0)8L?KbnA#l7Z2` zCNPebPWD9|CZ@iWy^TO2%IQVZ za`K=`#(g$j$9SB~iPs+Xy`&hoo#||I`AFX>gJ2HVIv5X)JrpOM{lx=ZW^;&!I^;>b zG_d_A`SF;y69MGV^rB^wR`}EO> z+%nD?ulm$hy9GwtWZCkHIB7R!>9A@jQje~ zQG|z4Xt$>bPCU+M-zdi8D4Ce~^Puh$ z{Za3vhU1@!ME0uv^1q^f1$)gn_XRgF9bZ418TZ-3&V>4V6Y3vid^~kV$1i7pD?5(> z|2RK}@yS$3*GC^|i6ngF*JCOkYw4VTN$sUX0)uGv$pMw`})_-_&IKU=j>R2 z0$#R&Di-NKY?18f z6V{Ffn2v9bQ@)Toh_RDi3?FvwwTkgLJrEzA%*W60Im$=+2X-u5&vbnKZDl-8pVUqT z+w&LV`ul0y-#(_}>u>2I5W`S(pd;ZiN*a#+zg?9N?BT*+lFa%u3rzSPE6#>-q>rJ8abvYqieT|E5((}!-xX7>^r^a==GkM-_$mHofTnkscqkep|(5E_TZ} z&)ceJJkA$#sI!)FImL9_aQ3u!a2a1e_Au^?9S0bXlj9ih(7^tX6g$Sq1zi7n&@{$< zv7>?UVzFZ*m+|>t8{tei^?;YkcKHnR*n3Rb*FuiDeCbWXP4&$!Qb%9c>){b#`{8Ta{49plA(r-{q>d}kZuKHu5RcroAU z;W9qo8DQME=29*fQ~dXIS0&)}3HVyZePi8r#;1}pv@JUKesv_&?_vBhx4v^8V}Nmb zwwIxwSu7IBQWoO@>xKB@iQA~^M9G5Z6>&`>`p-m7#^?f)$$285VJFS@V%EIn!`&$yh%7~I}7 zv6yjM_pZ9`?s1f7{MseBX}sOm?_}I( zTfL0?Y*(x%!v5bl%rQQm3TfRsYlqd0zs|*-GaU07kINTH?|tm2N$Y-XOvfjuF2;R6 z*vGgp?=5Yj4*2ul3dViy=Nb34znJj})QFa&vuCl9abLdL#<)+8m2B5Za_mo_vzF;3 zt!Y=Sp^n6_jpuN^p7C!}A>CiHeP<56j>}x^mT~6LI~c#f#TO{s&*9o0#%H@Ywc*U6 zd%28HuHq)DjI%!UqWN_87;=pJ{HvPrIKAXRaz5ieIZ&BqE>o-@ZCu9Jk1odJ;u`g> zkMX!U72&1t#tZ&@_FKWYZ;Z(^?rVQB&(xf1lEd3JnuGUGm(&1Kw|bFX7u zPNg(`=X~)F#(lQ8hw%@&{P9L9>GVKC{iBRu6RNKk@~Hl(n+Yhg|Hrtm{#?d=@>$3D zBx*$W-^p8cFdk=9WD8^1rju-@mdh2h8S3w__Yfm~eUD?@*PmL(efnO?co{XK`|GSP zZDu?!=gpzYF2*l%^FXx*e*qeXk^Om8PO^(Q|r=k&ZgIE8ZORj{iM5I_Ptlf&9~0A^Q~5|+$RvThkY7vUI4yliG# zKKt3l_-kA`&T|O&G42~94l_R9t?%S=!)_tKp976!+$ZZ=#(n<0l<_!SkWCz6e^2t~ zQEbD_s1uSY#djV9Mgcp(?fK&O(S-htdM}9J&!>;cjQjj~F5^CbUZ?37@v~Mg&W#a3IF}z6V^-Ed%yH-#(jR)lu&;g<8kv!lI3p3q1%E!BPiA}y71Fln+|xLhabNzjj`7iMednIN9gN4tvmEM-VcVaG z&!K+svpuN~y+vpcF5X8k{v0RA_%&2W_t80zP|dhcM)MheiCf<}i@ct38Y>L_MQV;i z{IxRflVN8<`@M`$ap^lcQV(q|GXLK|75!sEHRE%skdcp?KoS4*8Ta--0dHm8+keJ= zHj-aYjH%zV^4UnXS(Q1P-gFqk82814X2yMe+{yR{T>9zT zq>+rlwY`kLGUf1Z)~hlv)w$teF6XngVYg8OeqR{J_*5#S<>c&1)iNHpr$l`2XJ32( zpR+EFNZi@RbbRvO&A88|_A~x!w~d9$r*gPlr_n zh-g_k=cLv$?#t!2Gw!pQ4#v-S={sj>dKj;Aap##F1C0A*T>gHlD7^asRgC+_^Loa8 z~eeG{gXul(&{T{}BJ~hC2oP2WVclk!@eep9Olevs<{c0}b7Z4$B1J3%@I>u+a zIOVX;`c*5Jd6iqnIm^C$k<=`P0O;y>xTj_v*P_#DzV$?8*ToX!C&y9+P)^Tlb>$pkLr<8?OUzS!8rxX&iG zG46{UyA#^qpV0mh#-~w7wZ0$++B%^Ajr<4!{&~&>#^dx&^=C8gi!DuzkEcd-`%Y}# zmQa5;<8gDk97yhGyqFFLxQuUnDgP)j=g)_#7>~0zl0iM=zVT%(<31T|XWSP*I}-37 z#(n-Wz_^e9^6j$w{_&r2pAFYD?rVQ-0{!ibUrKCf8*%m>I}+;mFiyHK_4!;&4wnWP zFSf@!>TaqWzXq1W^~sFaQz6Zxifi%^0hO7bP=@$x<}x&gH*}me@STh=baCf?q`i!v z>Ee zP3?3Pp+k5NwGj2F}W+=Md3=Xx&V(|s%BKHYaR z?$doQ<38OlW3%oU@r^(G8LuK{weFm? z-y@92$z&9&jJ$^``sacZ7(bs1Y5LCE^K8cBY=`JKG4A7UTSEK06WZU;cv;HfFC!mw zA=hS(B(y*B6Vx&PbFU^a?vvl_1iXoHpUrM#+$X=?3H0|f9vc6hvpGi?kIPTU57)8J z?7`<)pLp+uWwgagx~#qzFZlEM?|jB{R7l&3^W4|4T_~fy*2p?3xopGPMyA$w!#(lA? z>^?MtzghI6_3hl}Rmr%|-s>38x%C};U&*+)|BU~CD zl7A)RKK|aS$nr@yTUcst|g6O&p$&e+qHj{Yhc_x7K0 zpZ-=R)ZfauPk-%<`}Eh%c*svV_UF*A{y5z6W76@+PvZrDzCKQ1+&6yDW;`yI5d9{` zUqy{*9XflO+ZbQ&;%W8cm{fl^<8O9x^no5BFb3BqvyCsr=WL`*n#UH>e*>3mik8!P zzjHRT;xk0ZzfY29+-KK|8J|Q%bf3X99Ve$gZDibMH*H1Qr#@G*T_=qL{Y=Me|MwGv zMeLt(AD?xM`|NWi<8ii;L%UlUuO}w7oFa3|-3et#o;_Tq(WR4CMn?Dm<7-2>N|FgL zZzDhmpT4RX_tCFs+(&=Um*0y}KCq#if0W`)uIoR>20ixHa>@Li1ic5ZvIL3W8U(2}9 z=9ebW-^}>Ohz)H&>ARpEwT`ok@e5p>&(o0p_A!2ii>KA03&Ia4)E~BsDhlxideQCE zhCIGf{c()@+OJKhzciu#X2vJF?K@{#cQO7l7w6xS6Bn+&d0Eqfg?MjTrQR3oPpcZ2 zF1WC%acz^huwg;d0&(HO)vLvY^6IJ;>I$J3&U^b+ljhC4e)*bti`K54IB(vHm8-{J zGH>3Jrp8tCmNu?lEkD)V#8q{bSxu7~*Dh*Y*|cQE@~IaQ%*gV0FRQcP8kW}GG;5v# zubR~~e*B`v3s%i*TD4$F)9UGqYA#vYxcvI2#Wi(TE(#T^nm2PHN;NjlTfU;9ao)lO zs~g8x&YLxF*^=c;maSP(==Bk=rjb{(D<%3=*ODt=B-}xp2lUSvtVL5 zN?bf|`ij-_E??Gk-O>fuuXZ{&t7*lm;`pK!1$bCnATe`hK^bbp7zxY(j9ism3M#Bx z0!~RG6IM4iT~|{;I81gB6=qcyurg`Q%9V|)7NHTaWEu=pp4D{m;>NXp{3@lG%Be88 znT-n?8doW`xSftEQ|VE#L+8@V7c7EWZXOIhQ`SrO@&&7#-nxn$&QH%Nuv#4p!s>TLMJb`dQc^~~rSFd49 zOlCT+Y%<*fR(z~m@Vt&Dd(AepR}%Eb_Zbx9CfIP=P@X3ZNv9@j5#TtHG^T@&_n z_R?_8i7OYZTHQ!d8)i}m3T#7lv-CKp2djcOpnWo?7YHhdYSU+}p4BvghCh6&Axm5x zXNMG;R!e7SY>03SI?EQUobFn8)l|e-8f$81jh|=8!^DYx(}a}^maLk7B^myBYxUfP zSxuK-w_?@17p!WSJ~N(V&DFE#%_KLxWL4v`6*o1`Th(}73P+jmDECKBkVJJ`*h6R3qtMiAx3jWXAn8lqHy+(5Uh5B@r^pPgU%S(TdU_V%Mt1 z1aqB^|frbY_Tq(-0aAS;eFkr2dTCx(lJ8qt1|8X!G?GZ&MduZ~yRY^}4aXH^x- zeDJ{&-MD(z#25-H&MK`H1W0L;6nu+GA*pUm1empY>P6Gxu{AZb=fSLIUJ3OqikKy= za`n66I!Mf-$)YS>bJNUO3#ZSXH@kA)Y*^^5OOLyA6BjLQTu_+LT?v&9dT^T9xNM~w z3PWkdv5>fU<%*TgSc?8D%L&`%APgl=&4cd9gq3SnFNUpL1aVqlWgA{Sh}Nm1D}z~0 zE0_9}=&G>p%2^lByL#3o$4!9hN+Mwntcxd^>Lltsa@s{V*1#sCJ-Lc3VsQR4fs*@z zEM(Bt5xgYp0H zYox^MU;>m0!09K>n#D~AmdF@MiN3!Y+V}-PGr?w#Gmck1P9)ls16hDg5I1wSF7=6nBDUnU^oFdac>$WB>vJnzP$E9Ya(hOKM zTP!jk!$_y+V=*Kb7ORScS62;4OmUZS`#i{aVRDWRo$;_AuMPp1z7{tt!Sd&a9GYQGe*Gy)F zQlXaA)=(vu5~{==s>ISZouZ+ZR4pl5scIXlgsR3;{?EDR-0%0?b3f1b+$YKC|NH9i zm&knI=kuKBJZC@W-ewwY(imdSf?_mNr|Kb1+=*&4D9?1z>A7Wsu`w8#hrM7rnP8@- z=GP`B)VL(}rF5emehGZ1v9&Bdeq>8;I;~$URHI(E@JOD8!Ui|Ag1(zI?&?ob3M!~T zz?*rFy}XpQ`dG^u@zf}`r!TBuRJ)?7g_hi#>RZBbXEgb2bu6B~8fF$(&tH*hs;>?L zZBFylvI=H)OxqOYwAvi3kXOuUE>;WVNlXeNm#QZPv95)&8tB?kTt@3giPBc4s)Q@b zbkeg^u!=jT7nPx+nX{lMNG`K3+o={;2CHOY)u2p910su8XI39p-9WKZHkZn3!o6yx z?zTr{H3p~sP!?gnF%{&A$JCj#kiFkCsL6;}Vc@^mNI!-ZG1KD%-*Ezqhq$W8jB z1PQzAXJNu8>13@jj@l(@TvBlo`8Ze*jxW8bZ;Wdn1r9XFpC$#x-j4sMT4u(WOdSlX zC}mVNo2o&mo<~hoT}$zD+I6Bulk_OpYz)z#%3|Z(y%UXdC)5T!9JVEji-S$v@}*6* z)t+QyBi;+?mH#Y>263qZ*Nw}_VtH}#flHf%R-bl-lUU+b$uMHGr5c!`vf!H1G>$6L zl&K<-mXMl=amH+V=3u8gucfJF9D9_(%1K~XxI{Z&MeV^(#hBMpf6AAn!fqNVQ>|Si zv|BKKAG4c5<19OOx|Mad6*e(;EsBo<$Q`)br}ic`^2{=~OQ5FvVms{A)OLJn!UeE# zdO5Su6R~yNHE%E4#-M`=bJ1%5I881tZd!UO9n@Q}bcLG4+v61b$N)8G`gB2-n8>nT zH8UK`#{y%V=9`rxT9KNm=3-1ll6=;1p?@diC)zf%E@HcM{9(%s04FHKX6;2sIE#Y? z2Q;83Kczb>HHC=G%G5$ddPT$ZXzEMu+?CGi1cx!)*@amZD5F_*tR!3|S`Ofn3D#6l z8sWrE430BIX)z5}+}O$-9B0P9HIp`Y>zA#pM=NyW8|P;BQNq$2cO#pb`#25a_}Xs0 z3F0If^OUt@>dd7n? z^Nhm}&1fM+DDJEvWVW_&kSAO?kN74ND@n_TMyJ^dC~GpAfQuMmm2XzuQ@V7H#b378 z;pGHnJKHK-U(sUIGf`zJJA2I&n6eu(>KZ^}6CL)Vaasv2XXyV@>#eau%!ERE--{_P z@XZ88qjn9$#vrYbq=KoH->~EKxC(2?+>O)Fj^)BOogZeJnK4^6L0BO{ID$3sm`5{H zrS#&5)o{>WZI;;ttq?F<*fANa#ika)-Js0mH>i|#YS-Q0lB(0RVL^LaQk5nul#DcP zffbi(Dr?F}B_ix&Y4-dr+=iQKAAnvRd!&v)wqm57iz!BD&X8>b)X|&ZEl?-*VApaS zo1oF;#C;F!@n&c=#lXAPhGlF38lS&f zo6OO)Snpct$CskBY=}ma|6gp0MlE17NTYpfcfvhcHJx9Lo1)2V0uw75nW1gbWa;58 z$f?yw1s6c{A&hj#No8vOu1;|PQ^=C^SJVwhbqFLWqVaLILuXu0T!&e*W^HbHe zO-)Pd)X}T>ap;oj+4aj?mMuLk=%|;Mt)%U*;_A61ruL=L3W`1x9T*kal}I0MrBxPl zZko+o_>C;7z{zVm=`0}hX4V@v?7%N86%GQeqDYV}wpgrWVh72iepcsQD%Dv+auJP2 zteqdKSXoV`)8&WJVWgnEtJT$OwbB_=qomUkbmxa8K%+5yDIB~;{z1K@%vqw+LFk~VDqH9wxwEKEAiDEr{ScYC2NIYCQ=@% zgzjtUyF%`5V-ILeXPkRh*5rwEO17~$ch^GSssz`hsbFGLb8Ch&ZAty9ncj=NxKp-w zrr6cEI%u-W%F0$&&ZpB|@Pwf$4la}F@SH&{X8KN6b?u7Q3YEHQp2}9Lq-hdo2mZX4 z=0?`cbfr-PpjfjT?p&7@@3pXTk-0Nl9bA_s#l5TNfjdV@bD;*9;bGKTdY}PCuzNCB z4Sr%aaqdayM9(d44`gapwATtfIz71DmU%J<^aZP{Tp!%f((MkN%(ObI^d#5X=Z|+U zLGgX5x4ft$JFJ@4rh+GklvS#}I~q002hrhP!~y)hi44W}kz-02_myKxO81%8@McV@ zu)UWZdur7$J)HHqkm|4+>`u=z*qxCcIET-Pp(ysGOUwIKV?|vFHhAqrQ2OK>Ryymy9B}6Tit-6o7dqQmB*a0+6DfjE5c2+b?PBDbtn7VG8L6z zfR(xA0xq_t0X`n3N#anHrs5yDWzAQz!CTfOl8xW8Cc#z$t9CJMI7~O)j3*n#!8FnV zHemy~aHyms+b=2{m>FN$%bI3~2}+H5xPwyDein~-P*Tx$W(82wM zcK72R`asQeUdA{2foZ4n6J1>A$51#G@o>hIOmGe|K8#EI7mXp~U(ZtUGJ~fv4{9=5 znD}u`lC*Juf(9i?QcEA?Y!wCn9|^_{n1!8?I1!8ANG2Fh|OY`Ix9<=h;bmq{~$S{GW+ zqz#Ys4Po^hNoy(JalBNpL`8dWuD24Zq@#=qbu4M8pTd$3t?&Y}-jDEK?*XgFnR#n; zbA!BhM0`O=Zg{r4#8M}KaeMSEYPNl4>q&KGWx=kpwbuvEk5R80x!o(dS(_zgiVXK! zWn!!8FfN6TwSDKkQb|*gtXC>2Q{h1Z+dpI^-h7VA(|@hb-NPgn6&I_GHGQi)*i#GJ z9<_+(=0T69B6oJn>Y9@8N81KDyU}oG#tk8BJK9bPSV}dImK`!-r1zHW_K6@jj>d33 zmn;nSg6rHHy2^c#3b5L)=tfN#V@Mr3FLp#p1l55A z282bs`kc+~C1yM`q46A!kL-Rz#Zqj<8x|^~uJ+Xa7Y$ctCKt)UYO4(CTXQ>N9m;Nd19XtB>*rqG>lB>ya;oZA0&tW<`JQwJKP9hSm zRNuyVzpUis`qSw2M05P%7nHVs-W9I6YA_ot3)&}>;YVd69z&SIgp>=G%9)fSCYr>eQW*~4pS zT+$LQlc+sL&c~LkXs?s%-NDrrG^L}@*lQp-_@G9r(KXcciA69nBy+?4%k4{+UBxrh$vol1XT*c(47Evjfjp6$0+9eAqqEqx-IO_1CiIS4?^7QIv+GYm#-#C9! z$Ei+hgc3AUT<#v$SZyK3?sLZ6P&_q^M75h-5iDrIBQf#F(CrAgw5aBv8L#kL$k9N{ znj8qeSfpl6AkhLpmlyFFTx<&YMIBY3B}7`}#^-XQF5zy5(F93dsg(QJlVB1rdy??@ z*+a{BPq+lhKg!p8S-y^U5e%HIx8Sd-gjI`4RPAf%LUSsd`eVArh4TvQ@Eo|sDZG+N z#Y#PkYP#YsfRUQb0ep8EIshiAvaj0(C;RG;vFv*wY z%fTS0DTwZq6$i(G0?Ws69Egs-1?L&jn+B5kklh-C&h*6+F0YIytvjGPlGHFd3{-DP z2~tm&Q<%8Na<#!1IxIc@Fgru)a7LJn&qkb1+8TRoqGrS~Np9*K`y$gVXR;aG^~UBT zxQZBGNsHS`#{|qqQ+NiN#wD@sGF&s%K*&B7w_FWa)!=9hm7plB1nx~KG*;tJy(#tZ z0B=~_8F%uRDRm&L1Dqk{3le%Q(DJf$OoS8-LXz(yMQt78&a9#OVDEiW4g6|F7<%jb%S6np@G1QWPEMo>DY1*6U;5Rf?vc z^^Rk7Q^(q-q_%gQ`$|zO*j%c)PGoaS{b3AO9h2`YB{K}~Ez!toIoSG8lgsoeYWjx0 z5*Td;bVg-Y0jcSX4W(+sonXBJ&pa`meCn6dD~*jUjkQhm>Kj@HNX70r1f}CoNu5Ip zZ^@~{8q4*WeK?0tYFTDJA6OP#0-#yF=?-XxO+Si;M!V5#6JvR3WWvIs@|fsbdbo)7 zNG^U81H@j;bdFWi0<~j6J+)e378ScU%`pdnH)Ull6AF>hV)_D?H$^q14}(=*=~Us4I74{ve*tk>PFsOZYtE#DnoR(72)vH)l@moua1nL#abW1P2WIe`$QY}JQ zQ05Ww%em5`MSglQHl2-3w|5IEi~1cC)EB;s4{bf8UrrV6J04Fsk zw%0JV+G!#p!$D87K`6OXMpbpQESQ;b0m!FXr?$Ez)#0aa(@~;(*Dq0TiKcCyimK(y zXnBQZb+j8(QE@o69>pcq)=r~&nZ*3+3iG}N-Ai9ZR)Rau&r;G|CQ z^n$GGGimPiJz?bjHkx5qNu}6WYn0(I@wYl%Wx-adjG$Vc(NI9mHpTT zJ&6)eJnl)7+5`-JvdT=%=qH;5?bW1LL81eoa6o7u6`~Eo1XmkX-(+5$J@!O`Zm6k# zQA_jE<<2X^GG{fD*%P$qOP7u_6>5@bqTRT-!L`U*>Y0nL&}BQ-z#r?-Hz-w#=?n)w zeeftiwH2jaE{Fy7TPSFyNk6*Cl!9w0NH&|L{OVL9OUYvWXin-u!0^DH%hwqMgHlY_%+R8Z(ZGA;fyMR))e zkF{>e^3?s|Vvfy$#CgbEDpmcgS_m~yuC>ol@(ZeDawY}mT59NjdHX?6-qsb3^IWEI z<%!Rv#8tDxr|qmdiG6B6$HXieA~(efFEi$e-f7MJ-He5f2;M*In3?%jHacj;mY+)N zxxv#L)c`tXhd9HkCfaZB!NIDZ1Q|c^A(d0R40P1Ij9z>NTSg~8^sV&Emi0mN8h!5@sfIaTW_$cOpCeM-;_kHd70{{ zztlT^R%@Z#8}s@aq@}t%Pv)uAixE#O-Zdc@|ZXCfV)a@RZz1$j3`L3L2zeIytmDOa3T9Aod;9PBLo*BV} z*0L|ZP}TM3YI^%?WAln;epnHyjgIS&Auo+Q19 zd(&XGRnajGgD1E$jd`>@p>_mEEy7bO?4TN6Yg|pG!H)- zUA(L|)zDZ+Z`@K>Fl(351A?-RGCg6gMiR7!P_}?J_Dia1=PmY%XgXh1f69tlnletL zOs3PPs)>fv9=p{F7BgE0v0*g~;~qb!2XNLc(6Qto7{g^bB2>a25z6|&t?CNqZI?6` zqN1J=EGDVV)fw5|pR$^&QgLw*O4ZA1mn>Fqmj(O(t4Z0tES+UuM)4C2&Ftz&Gr84d z811e2=hVuiGCFnx{3TeC3zp-8g(xR$Nz)*Gy|4$LlfIf9G&Q^#X_o)2+sxH!4KQo7 zM2^#53&&(?_8xggO@ekNSVjbQNLEvZBg>7xCm?Vuj^%pA(JAQFWU+9eX7$yj;MTi( z!kszVn!T21`k>X6~H4T1d5KU&+P>Vz-!e;I)V=FrYE z+3IzvX@AmV(sZ7!y_(r{CJe4}#4Js=iVK#@D1CVTN!^mmJQ#u6`l9Gk7b_UHukPEQ z!X{H?DE_ztvP`r%?e50fEfY22bW%KeSXHf^RO>aPxHxSqQFiq?F**=JkwME#bW{wy zg^Kl6aZ%>TFLe@hSr9!uf%kRvmZI|hxb7%|M_pP0!Bp^6_;gD(R*nx}U1cytV#DX&xz>k@H1sf*Zy>9Y?8k1+f&3l1K zB9R{$R(T?jk9lHRR!=a=1-<}d797u9B9W`O^x*iw!m)(;^zbU~%=j);80L%-X~(E` z%D&hi+&eKQanTQJKdc1NYsYl^KBy97$!q%VJ#c@RS7<`IGB7!f+`M<|xg@6);*rDB z*0Tnv$;fh8dfJ!|ORH092Ly+uV|x-b_)6v$HM$$i5oxEHNW0nXlEMxzsX-HPCdf5S zKL#Ys-`*DTX=4YM)W&1RjRwAApi|C zL>Js~Lg_2-iGo^byAhmzOhESdEgp0Hs^J0Mb*01pY6mf5rxh+~-;jOTW0f92mFUzw zrAX6N?Qk6ubW)72=Oqsb<*v-hFZvHE{@}?7u=w3|b9C!h4=ZMymqV%-odp-eDTu-Y zX2J8U^mB+DXHiz77jje-WiHdHq?6v@iGo%LJ9%*QB5V4=v+!CgnkkTJ0hDSVI3*Fi z5D-mGm5f?f3s$Yur?kg$p;#R$vF2{s?h_~VllYi7lf{H5yQw-P@mTO|G_^$@Tsh?4 zI(xW^m#95xkd>wI9XK-TucXG+xx%CZFmm@I%BRaa{7(9yjv9BSmxjYD+6jW$T&^qg zKOEm}c<2a$I^UzV)xDt*s;rzFtnpA1rxlcmR3%R z7A;+NYVERx)!}n1t6ORpJH4*gUEwn|>_v_Ae9!-GRHl&(PMxh--eA2&Fz7AEd1IY+ z+tfwqXbo79ILmB+l!Pg&>zD53VBUpndQQN_=JC|mBn&uO$3CoDz2G*%weM-}N}9R$ z4f_es_VoRvAVl4kUiHcm5?sg`Q$q>T(ZjXKfScOOEVEtqhAEBGqDy|NQ;gkVPB6Ij zWj*j&>?yAHi;ZLXByR<~b7KqQSaQ+Dj3jUTvnDZ~?1hbBX06$+Dq}96Oa)Z&=Zwsf zJ+jwld~7W{Skek+R#D%})}%eM>e0SRNYCKtVEPQ{inULGVw?J;aQ+pvvJ}Z#mU8Ic zI~|2EKy~`oySd%YTz7YepqYjsbMt5{11?C9am)qNLSqO#?1Fe0^YUq)E;oOo;~0Ep zO8O1eDc12LSQcPtj|sc|CVTEIjMPoP3srhy#8 z2n8qUlt--Dbq6Uhm9RWk^Ed@+CmpI}V9;I4Mk`s95)W9irZ%x-mh4h$HiCyOS-3Hd zT(YD%0fU!psfV#T*6~ZWv}p%EJ%lDRu}$H?4arN7$`c8qQ(NVA{i>XzeJ%N%tkNbQNKjoX#n z+w}0H6}u|7V`Db#922CO3$_AMD_Zn(WN?v2r$K6jPZ`s#JXqpZJ3aoTV)sx+xQMIh zU>Vn4<)u-FG;iuIG5LN4J-Sb=Ql|0D>8$jsw|c^Q{HAztm)v&nyq2bxiaJWGxUQjg zS$HS0u8dq#SEinoK5s!q_~y8>;5nJ$4ze{i9@}|yHH4(+PJ@>+!pfE45Nnp&r{^dW zboJ4y6_Jadppx3YR?9AMQ3uoyPi}*Q^<~p$+Lu3tY(N!@YZ^1mWY8%khllXd>70navZQ3tvTDn9Z^<*y_Wc%v)Ku1 z8g)qU>U1-)I1(j;QeqO>juQ91tTvI=KcqYa9)n&!gGP^JIsN=HODG^#u zq)vgk!4;fjqi-IB zuSlg-fGl0HWMOczH&YaPY)5g$-N0F06-suQA%10vTEMYKRB)(8jjMGe*40KH&E!5` z$n{o&aLxAop#wZu-_*c0?e)y~PMz4~o|MF2i&KpyJ;C*VaIs0n9rIix+Ana&;j1|;U)Nx=k6m3eTBBWTG^Xktrymu)Wcc`P16<=BqJ8|N+N3l^sW?GxL4AiMpx^_b6)%3eZE7T1e zYBiea7*b=bvNDqyO2l3vEQ)V(7MH~D!347rcnik91LN3W%|V?5ku>RcR{gNYI<|Oq7#|!+yCElis0vu!PZ{gZTr`u^CD~nV z?4XzAJdu;K8jnT0$f71rv$fMp|jO#IQztqa=bS>WhaKz zov+y1D&HB?D8i1Y^pzeqp14Y>h9l9;(I2wsjfN+(ys7&@kt6MDc}1<**DqhbbdlOJ zshm$|yxcmb7Cyt1!So&dCaSOxaH%>D-5E7+Vb?j*>O#`E*qCuFImylM9;Ko zTtbW06^E)lMruT&oitgouyJ`y?UK5B8t>Nyi_v>!)}EKuHnuER;a9xZ!bbJZv3mMq z@bo6!2S+F46iinwEFRAu*IZl;Q-1v_)sd=gCwDJ z%#EQM@FNXsE+WSeL5@sg$frT;uk1V6iuIjI)$8c_e)x7aHP?@|oLrcymAXp$KN{<( zz_TB2o6sBVS-41hH}=G`G|54OZ1tIuOai-t4%LldyH@%V(7kOWV`M{?alI*YV2d?I zrN-E<)T*CBuN`623hP?%a1XUK=st%fV({2Yf@`bEUS}{HZQVfbY5ox8*|v<5Nw{+5 zE2d0S5ge3{HWhZG=`3sc(#`CT1{1xYX$>0>pIbBM)#At7Z7*ao&v+H5#1&3#)S@#9 z6OjcHeLJf~IlOU3atE5_YP#r`;|Gie^G7m^Vd3Nd-Rcb&{nO#*V$`2}2Sl zXSE>i613a*Kt3$(FR%N7W{jf;%A|*z7}qVy>nKQ1+z(~7E@4-cH4SlZlr=RgoDz0O z*^&!`YhwDOY)aM|jh>E%wTkVQvZgi>JyTYJOp7v>&M9lssDH9sJQ}R0H@y=cAogsF zO~4Ulnp5jd?D1}Bsx74G@{d}^8Ta#-!f@gn4;5(Da~II@&U*8_L?x{EOd{^Lk^o0r zmS=g#1|DN#Vd=^htr^Q!uHdR1*#gJGtc{Up=cy!v{jCJv4$l(D9^9aYI`M*to~TZc zemoJ+VHBE}!r~UV#G_y~<7t&kA4#R1;}W%VtQH6ltUets2si@?;2V!KoGosx!@$9Xj3EdR9~2xQ;QZ$f3GHt8BD%azOCxd-vIN!SWsVJayVJQFj1Llmr(6;^#i8q-bqV zKR`do^#nXjKW=#3eVLY2c$8FC`c$ecexhYHRchIT*<%@<*lJ)8K-7UL+Tt187$kiJ z>cDttPprwAl>>F)+j(Zf#J3a9lOxA^s?6I)mQ?GLr|OzU=II0#vs1JUTE;)5Ks8)* zg2O_Gk>kVG%Nn`4{c12Ap_yj*)hv^F8W!@C?W_`+GJ;!fbVnaN{MalIryu7M++E>L zf~mg9+8}nSNmk?Rm|w0oE@>^9=C`Wvw4Wf&r=k0Jch@@m0NN=AoP;xH4|ecPIZ=NU z*>A-O1k-f)YMH(2gt5fCvdoDjQP#P0DNg3&531t}giF#c>FM-<+hB-jmvv;iLp@t~ zT7yYYtrDof<7)*sOkom?p4f_J%A5@xXb)jt=!PCeYxiZ?7Q3ASB z(mb4Q?2^9(r#85Roe82Ufb6X)9Z{3b5cSEls8di)p*ROGDCOf4r4gO<(SWBsEQC3U%h$f#1gHdpT-h$7jEOd4+%#2{ z9!pn(OCYnTr3RK@&65uo>WVTnbxYA^IZH?F9?js}Ctlp_N0@^zY)NHFz)3-O3gIv# z3#a`U3KK?=t8RmYXts=NHojMF)dOp+<23>#q_bhin;K&#I>!uBOFtEjG_ z^a_*3OPA5Pf@~)pX2!m+TxRXbl7TeB8rQK2>Jw(rORE+xZLY4ZtD`es86)FQTTCAv zh=xFVQ9Z%)fdZe>nJYiZo0joE7 ziW_O2z#d)fe$6!Neocbr&zC;m4^Z_U-yF;*9V{g1UUhHvqD4t_p4l|ALn4xy&^g`~ z9j7&pMja=ZZr7vHM*Re8({LKAqgjJW6VtMdDd}|M2I}vv(EwITYBs}Fq4Xugfu;8c`9BS_A~`% zEqFM13wXj&@?uQ1L1(Xe>E-HiFY3>B7xhKn^H?3M%4Ld+-pwqWHplBu5=Ey#V_ONd z_(nq{W=pPGKk8{5&zn%oSTvHf&QHpER(_mjBC{=&y``Xi-f`?<92D$f9K71&%-xv?+a>ZA&GlBKn(B4Y&S@?xtC-8| zgwh>KIs`;d*lMEpD5{s9nN(A3UJPlZ09Fv8+Uq(dRUON(kir#2Jc4%UUxFM zSBok>_3~Fe5OEJ-1czP#IpJ-Y-2l%_{1l4du`KDQP;k2x^IB*Kt)3#NmjIjS7H#JnKx)%XFxYbYE=c4%KQ|H8!`*^3IHrr3B<5LQ*{CS^02iAKd3$(T4UGAl& zoXqNRX1Q0KY`QO{i;`SHk8dF)`{o3BUa*QAyKWb4vs7mk$po15vpto)DyTv-`h)>* zx{;-u^w7&^jsMxbvA5Ww&e12Md(L!Or^ih`F3alJ=9lkYt{N6?0Dbi_r@wmWf; zO?ro#>*C|>R%U&~UcS{$m!}zl=vZ44nAqxQOrVf=ku^zsk}&0Tn5CN(2>x$c6~>gr z4NHcf@U|su(%G7qtl)&UFjc=5)I~MiJF=$iIin;ZL*AIRSy!s*5c0h z?e0sQm_4z}a&pif4Z@W`c9E0v0Eg8eZ)0A|IaHtVU7d?L2M3Ee<(Y*M5~H=Drn+i+ zT!T8oK4U@S!p3Fvj4pa0d2LhVXaPMzMjiN4FaK+zXRsEJ>%@C7r>2Li(#?~3v(*1+ zNK7|SqP?NeI4aS)B@5}<8{=5~3l?O9WBBeyeeei=W&uMT%t~+o-wHowNwKbJ+}6|m zfnZ^h92)ax_DeRD32G_K?0)Rk(G&l{qOx6I)j|xdx6&eBbLwHIkLR&1=`tW zrwJTH%UJ4Mnp!lZKr2o)*4Nda+PJ))<{;)-{?#pX?8Yp4(J67t8Evyyga^i>g%Vur z@U9v~3WIBkxFv(w9DllOj?bl=&5z^U&f_G5Fwv9e1N1XSY|rQwI6Y=|R|wdtjyf_D z#+nK!IMs1eOSn#lP0?e6sNrDL?`Z17pLPv#Qg9D6M3)WB=z5}#Wa^-+XIgB}gw&otJ<6YMgHd$F9v4Rf z)cd7{gEt8WPY6=epad4sAjqc2YKLwyJTpUn5gKG`V*HsII{wdHItEj0uV(PE&TC|y z79A+&+tM##4rrh=M=%UfCemO) z4F@QT(QaQ2Yl41XWst0+I|WM?*0)xhu|d^xeTA%S-of-W^y7gufw7f;TMAL(- zs?O57?)vGb2I zL+QQe(X&x%n~z?mt{BW((b%-Gep%Rc#J@e&{`Sm+YSoj+PfPf9_G?q8DP5Z4oz_&p z&=v@ZFyF!IKl|8Ik3Nz&HSlzS1f61Y_88D7x@Y+82uKKG+Uu;T&faF*VB2PAVyzy ziY<(QOrpku#NVT8AFT|odBw4B)Hl^yxd;WF>Jm%F`FEIzRh?Yk`X`7MbFH155c@@( zY@}I)B@+8af`sfE5;HK8p#4ppFm69$sV4kd*1Dc9>r7pTF0m5v+s}MCmI14}^I`9N zDV9j23iHV%`&zVhceSGbs>-gBUT0WcyKGtQX*qk;Ep2YDU(%AZ$C9Nj^?MwA__uba zr$g7BY55d&_&=u}utv_tAemD0w_Nk{?e%kV^481AnPmPu z{K@gp>ZhsCC_%9#uvjltr z;13koUkLcw0=@|FWdgng@COO_QotW9;L8DDF5oKxUm@VD0Dp*puL1m_0=@z8a|C<} z@P`TbR=^)F;M)Md4z)p)MDPiJa^t6Vz#k#d?*M$IfbRtSLV^8VfIm{8-wpU-fqoC* z-xBb>fS)U{zYp;H|6lU*?+5%mf&KvC=L`5jz<*1?4*~ut0Y41*qXqm3;2#nAe-!Xl z0{xsdbv?KH-(v)PF5r(9@OgkgPQd2_zDm;n1HMMU7Xp5PfG+}kt$;59{4;|1DFu9; zK))RD&k6J^0e_`HzY6eI3HTbo-z4B00RLkFp91{N0=^aSKN0Y4fWK3~w*$UMz;^)t zUIE_;_?t8O2Dr{i%H~y;1mAj=ATu7UsJ%>0DghM z{|$iOT#)}1;OhkXt$<%B;M)LSFW}n&zmdTI9e`gX(C-BNR|Wp>0{pfDz8mlb0=@_E z+X?tyz<*7^_W^!WLHYFqelr0-0Qkj%@*f0zgMc3be4~IL2K-3^egyC*3;0pMHwpN# zp|$7#%>q7`zNfzL-^`!WKe_&^2=IFf>Te0) zmkRVt0sjqwzFO;d%YQ!suhx29{+j|`t#!Hl0Rp}T@COQb)z-NB2MPET;P(;4Un}6R z5$Lx8{u=`QcEDdN(C+~J^#Z;V@XDv=&*`6B{p$k!DFVJ5@XG{z58#&z_+G#tBq+Z= zz&|YTe?Q<47U&NE{tc$_+JV55x}n!@S}i#Lcr&&9dEy05%9Ty ze^tQe0sb`spAYyJ@`-Uv`X^Wa3jqHofqo(2Ul;I2fPYiKmjM3n0=^XR?+EyEz<*0n z|0)6hPl0|F;NKJQHGm%x@C|_fuYgYheuW@@TLHgPz_$VZQ~}=(_*Mbm0r<59>sOtC zKTV+D1^9IZ`rUxf74SWP|33lW3;6W~d>`P~6Y%|jKV9Je0l zBEat@&@Tb}OaWgC_2A>PZ02}fIm*a zw*mfm0pAYzV+DK%;1>$`PQWh~@LhmES-^J#{&GS6?*V+XK))C8%LIHM;8Oy=AMncs z`~cuv1pFZ2uM+rw2=JW(ei-oI5sV*30DqQ%9|e4yfX`Vs-v6I1;Bx_gj)2bt{C5R> zKHzT`lwSeh?-1~XfWJ$?7Xkhr0bc_6a|Qk@1^k_Y`d1G4^91^pfInZrR{_39V1EtZ z?-lS3fWJUse+uwwO`ZN1e8QjH`c*67zbD|^0N*Rfe>>nG6!0B@e?Y)@0{%il{<{GG zkU+m1@D~a6djNm2fbRwTB?7(=@Rthse!%});J*RDuM+Tsfd7?%9|HXM1^FKa{9^+B z5y1aOz>fm{DFGjD+}r#2zZLMg2DJI71$-XhpB3==fFBg}p9O&L5R`u*;GY-RUj+Ey z3-}VizaZdC0so?aF9-Zf0=^RPFAMl8z+WaPzZ$^*L7?9N_*Vpc3h~9794+MN0 z;I9zy?SLN=f%c^{f|H|9t_ko>k)V9|(B$tPYp|mw;E#dT{w`1pY4q{J#bIC4m1(z?TC4T7muL zfWJ<_R|5V=0$$zqbp8K{Aph#Fr^|mT;2Qw{xqwdr{tE%$3iuqs__q!4Ul+7L?SS7+ zz;^(CcLCoC`0EAn(*^i-1pey={0##A9>8}A_+G%@DB$}5zo8)i{ea&a45F-y&!~^8nu@(9Z|_5&>TT_@x3~oz-;npAzszfImgRtFvyd{xShy3iuWQ zUk>m%{|i3hPp<31bijn ze=gwFT*39<#10soLdzYFm93G}-G|5E|q1NdJE?C%A9pMY22b>rt(0=^&c zFA3sj0Pyz<{5J^rp9%OOz&{}1hXMav`Wqz?e8Qhx{Eh(r838{E_-6%t4waSq*!|D* z0$!a}aQWX0_&mVBAmH->|Du2|0Q^e=z7X(l(ci*y4}WsyUj+D<1^Oj`e@(!b0{)Kz zz8vs>67XuT!;POm3-~I)zbW8r0RLA3-vIc(3HTJ?|1RKL0k7JmFz&*iT>P~G{w)FD z4)}iv_zu87NJfWthd(*{I|1J-;JX0-zQF!&!2e6Y_W=Gw0pAPwj|6-l;Qu4w`vI@| zq_Et=pIrG30RCeEKM43w1pE--9}>jRFyJ2+@FRfFp}&QG3x9I{8wLED0zPNMc>BAS zfX@Z|x&l5A@RJ36KHxVH@CAV1P{0=gej@>21o({wd z{Eh;?8}Nk!z6bC-3;15Z?;_y)0Kcn%?+5%>>2G1b75?Ph9u z;EMpiN|65&!0#{6F9m$5fG-F9fdak~@UsPc72ppL@HK#+CEyzX|7$_{r2s!)px+Ak z#{~LqfImi{-wyaH0p9`m{isc&ECiqMC)a;;0{(G9{<{Ewyuki$z}E=)9>7-%_+G%D zDB$}5e}aJT2mAs7KLGez0Y3=%g#vyE@O1)y81PRB;%@}-iv;?kfL|=&bMoT-e}jO} z1^h_@J`eDX0zMz`Ckyxjz&8o_LcsqY3j3zeMeCIpCKH z?5_lTO2AhE{uBXU1NbKe`ELOHQvyB(_~iooTLHgJz_$UuMZmWMeuaSV0Q^b;-wF6r z1$-Ca&lK?8fd7tw?*aT-0=^gUzZJw^AK=dw==THuy8?ay@J|cu9|ZjQ0{tPtUm)Oz z0pBj*M*#ml0Y3`(3k7`6#_|6D8G-+E0spLk&jb8r0{im;{{sPE0Qlzw_7?(Pz0-pJ zm#F_N0{qni`%3_St$;5D{Eq~DIpD7s@RfkSNx)YD{>K8o2Jk--@C|^!RluhJ-!0%< z0e_o-Zv*`80=^yacL?|n!2eEAe>wr*Bhc>x{JjFc8}L6B@I8RPU%>YQ{$~Qd5Ae?m z{NE4weu4e~;D0aB9|Zgh0)7baFADf!z&|U<{|Mlp6Y!&e9}w_4o5cJ7-wF6!z&|hG z^8o*Q0iO@}mjvZk0QeUK`h|dhS)gA8_#X-8?1@bzbeRoC*a={ z=yw7BZvws>@P8NZJ%Aq;@V$V4Tfp}L{vQIqAMpPa@B@Hcn1 z@I`?COu&}_{=Wjg6!4!5_;SF%E-1fBzz+%dD!~6)z}EnNl3@JN0Qj{9d4dO zzahwf8{pR!=(huYJptbV`1J*RC*c22z;^+DvViXf{00KP2k;vT_+G$oB;fl1{})00 z^aK7)0Y3ovO$GK30)8_AKLq%{3hW;S{N@7v5y0mQ_))-bDd2N9jrads3HV&VZ!O^S z0KbiZ&j4FGmk9VSz^iw<)Bh69 zAG!hm4S{|S;P(~qy?}p9V1FOrO9lGYym$6_%Z=M4ETct{0QLR z7L?y8;L8R2Ih)1%{|W)03;06>d>-KE2>5)!R|@z7z#l2#3jse@z!w32T{_d5wEZao z{67ToQwsQ_1@@N%zDmGX0{$2QUj_JM1$+(Qj~DO_fImUNrvP6q;9CLzj-dS80KY(> z-wybN0=@(A^#Z;V@QVa|7vL8Q_-?@eQ{ev|z`rZtdjY>hV1FOrmkRiPz`rN3e*o|! z0)7ziEdu+80KY=O4+DOsfFA*TtAHN`{AmI{XY+Xff4YFr1^l-Kd>-J>5b*hc|Biq! z0Q~!c_$vhb*#i9{z<*c3mjM1;0bdIE^8|c3;LjKEm4LrMz*hnOdjh@&@D~aA2Ebn; z;8TFVRKT|a{sTe$wgLVJ0{wQtUm@T-0RKY)-wF6D1$-CauM+Uxfd7}k|2=^JP{8*B z{@((=5AYue_bbt@I`=sM8KB-{$oM>mID5l0{wEpt7nRk z3Bf1)$=%* zfLG6i3F9XG$;D46;D0CJy8!>0!2WK)|5w2G0RBaR{k?#HNx=63{$&B*5BNa=KLGeY z2>3z3zarp=0ROq5{DuMlCxQM5;9nQ;qkvb>Gz#lY_>-$YIr;Ja|E~f*7w~Ti_&mV> zO~B^^{tH3*6#!m6(<$^@_>=QrA>iK<@I`?Chk!2u{5t}^6!8BP@a2HdSv$G^Dgpn# zK)(v`9|-sw!2e6YHvoPOLH<*K|Bpbw74T~c^xFXcsX)IS@M{V5I{?2zu>aKw_|FCQ zcLDwj0pAVy9D)5kfL~L<_X2(`0pADsGX#7;;3o<;0FP}j({Hm{Q3fZ81Rz? z{0QJT5b&dbpCqV%Ia|j2|BVIuxq#n9z~=$}D*`?r@S6(w0>G~=@LwU|w-o3X0e&k1 zUjq281$-&s*Ae8u9Prx-^eX{hAmFP2KSjXT0DgM`-vIa>1bhncI|}$#!0#mB+W^0= zp#0kbzq3HU1Ms^G_)fs@Cg8gOzlVVD27Io-e?5RN66p5=zF5Hb0e-rG?+5%$0Y3ov z5&=I5`1J(-9|HXP0)80q-xSzC0{H(E=#K*aK!JYFR`LFSwt&wCe3^jH1N=b(J|FN0 z3-|)Smkanpz*h+PBETOm;7b61n1C+@{2>Cq9Poz<_)5Uf5%5)jKSIFQ0RBh;-vIcz z0zL)!`2xNb@J9*wHo#97v_I{DKUSdM0r=wtd?(m{0QJ11^g)BPZIDsTgUtVW&xiI z_$2~95AZ1gpAYzD0=@w7D+PQZ;9CWJ5#Uc3@Fjr%wtz1M{Fws29Pnoe_)5S(Cg7_8 z|Ac_A0la#qdARQr{^a(58UX*KfKLJbw*tNu@EZvF?>4}1DB#-x-zKoX1Muey_)fr| zC*ZpP|6Kv!4ft~fd=KC+7Vy1*zevFM0sayJ-w*hW1o1Nf`0oq!2Laz9;D-SJLjgYw z_$vkc2;e&f{3zhB7VtUS#QXmr3HV&VUoYVE0Dpsk&j);$fG+_2jRL+9@HYwgBEbJx zz?T62W&vLc_*(>gIpA*>@RfkSO~6+H{%-=l2Jp8E_y)lLUBIURpC@QPTLIrK&~F3$ zodUic@OKIL4#3|n;5z|-kAUw2e2;+d2K>DOz6bC>74W@)e^9{p0sa92-w*hA1^fWu z?-%fcfPYWG4*`B-LH!#B{LcjXBY^J}@S}i#NWkZOHQxU}BH(iY|EPe^1N<)pd_Lg& z1bhMD|0CcF0sl(@Uj+C~1o2k__+JV1O9B6D0bdUIuL$g~1pG?^{VKo@3iukp|3Sbv z0RB}0p91{r0=^aSe-iL*fPYQEw*&r<0=@(ALjt}N@P8KYU4VZ>z;^@wF9N;?@NWwE zUcmoV!1n?E9|FD~@b3ut0l@!Lzz+icUjlvz@c$O@!+_t2-pLcL8-_o*^}`XsZ!F+P z0l%rB{mt1n-v56g$bT;2CkgD&1N>S7J|FOF2>1fP=Lq;hz^^IbivYj2fG+|3x&pow z@VNrM9PsN2_)5U9FW{>HKUu)n0Dc1j-vIc{1$+wd`2xNb@LLM_Ho$Ks;M)PewSeyc z{Eh#Yy#4G1{IvqU3-DJ8_-?>oAmDopKUp`!Id89@le3wi{eBeam#mlEe~$rvnt*>A z@P`TV{{rAoB_D+SX84oqKVJj<`U3tGPz6bDy0=^gU`w93y!0#{M`vJeZfFA(-HwFA4;P(*lLx3+8@WX(=NYH%{qPSn=oh85X84EjXRFpPQU+R|QtNm1Ycc(wYm@qWRiPgF4DY4>D<>Gge+u%y zKmD6hTE{V<=z6X1mW%$YN>P7Kp&y8!VR-Wx$nfj2d^XX)Ap1*C)b@wvq{{DeVE;vo z{-H+SyoM^R@7jMg!=GSyx^f-)xO_LmpKN#)ANI%PpQC?7{=3TXyV$V#uKlMk7``td zzbA`^p922h0QkR*(f>t4{ZdB19q4Za^iO8=-!=Nvocz<*BcDZ#eizW+80cTe=uhd= zo?Z}9i}w>(G5WnmzsB&Y{rn2hA7J#)HTv5-`fmCEmeJ3zjx2+G_N#a0WoG*3pJ{`_IX0U_c)S z5Atdodp5)Gn2^7h;rBPZZ~Sy8@$|pgr^@)x9)IsfUv$S$>Y4bc{Hlz;Sw>E$@A}z( zCrJ8B^h*lp?*a6;q%~EfzcQh|y(ew!w*&nmpg)VzzapXje%6|>t=|Rorvm+DjQ)KI z^_v;}UZ6i6=-6Y4+7=nn(^5}^MHqd)oQy8ip(|KE&$ z&Vu;(X&<1!J5A70{O_7jzmRxJHulK}`uhU?8b-g|==v#-xBZ2Vzq>v9uQK`t zbvpj+{(Cmi-*#Obe@`2IU-@rIJS7|Z^ca1+|2YWgAHwLrVf20dUm2s{5A@4{ek-H@ znbCL0&$?7H*z|1+aM+vsnY$!hSM zoBtU!piqBv$4_$&-|X;i{VgV*%!+*qjs150IRe;!I-}ob^mlbqcJ)^<`dvofF25sz z{vC||+eTlPLdFQ!f4^e*j|}gte~&Wu4}kKY59}Xe^e6XeOMUvUGWx?n|0tlpA)P5e z@iWEfADD4n@S9tH>k&`M#y|Di^X2AWRQq2A^rtiWi;TXn{@G_DY$M8zzTN&E3-lK; z`fWzP$xf7hck^G%ra>s*Z#K{`v;BvA+O4> z8rWY%e@F4N>#ubD`pWO?#8a}dPwt|4`&kS0n;8AsM&DO{iy8d_qi>gA9nkM)^m~l{ z!A{Ox|NofL?=JZ3(BhXi8(vW_o(f7q)IisJqI39l|1O3Yw{gV>vU(Dzi0{v#7{|uvl zuF?0kA6rm1k^e3?d>DUW*|_Dm3GrlB>{Dv&4|&yoq=5ZLGy1C%+W$j_A257{W0{W1 z%pW@#`%}h#yZ>4a?0<>T-}2X5$*upc{_hz5UZB4M=x?zBF25S1zciE8;I~-$5s%6* zr-2Nkk6nJJ0{v=6f57PP5~Py(f3E(qjDC^PxBKtYfc_1P{wGGiEh8QL=IUR==$9M) z8pEsj{Wj1aV)RdcOqaB;{dtwq?*{ol6X<`9D!5W|$NyIt{oRfI;SV?e+YnF5#y)*O z|16-d-YJXpS0&W9->GXGF$nb4S}zTEgHIS2H!}L~8T~>#QTpAjf7dbj9|8K`1^OQ| z`uUG*r3H?@>;DfK{oF=f|H6E#_&X2i??-ofkpE9N`o8l67cl%qhQHOZ-}T=)#FJUE zPl2(&&-{zBza7}Go~eZFpZbJW^3@;vnNqe9L%@F*0)2HS1nJK)`o8&(eW%9OA2s@R z|8X(UpTp>X-{@0#L_V(n?_l`r4S#Zkj?Z6iAs&@q=}GbS|NFrHPZ|C7f0L~IK4SD! zM&FMA%Ygnq6yT`*b};%)p8W4cJj#E&(Qh@pir*gq{nHrz4x{fI|F$stIVZ>c|3jev zD5L+F(O>Gx|AUNv5zxO1=&wr$#E}1|_v`Za_5W)UkNjU_^zHJ$8t5Ow=$~lx+dTO% zWAs~%evRQ(`Ckk4FJ<)qWb}Rg@Anw}L6H9+0sZG0{mD;i|NHcxVf06U{tZBX)34z2 z-`nW>`rnO+r(|QF+@^T{cO%eW%IGgJ`o8}6Bu2jg=>Hh#KfvfeX7s6gMLur-zZM;E zL-pq+!~6Qb&l&qmfc>`s`wwCCM~uF&|0^RNm0zXNxBI_tpnox=KkX?UzrOzOU51}! zcwhhb7Gr;>vA@Wao~r+M0Q(Q11zJ>ocN=|Q`Rz+Q@?SqFzq^3`5=Os2q5pox@Gm9g z*P!>*qWr&U_(LMmA0K~w#^iqp#E&|wk!#Wm`-KIJ{vN;8@pGI<{{-TZ{|lRS`(wxN zPl5hbjQ)j2-&g*ZGx{l`ALdiV-_L;l)5S9NgjDCs7 z|6e5@>30GDKLqp_F!~=EeP8==FT+oITE|aV|HEv!?f0FG{lmuokXPmRD6s!UMt{1| z-zgL}KVAJ#82(tp7kKyr3NTcDryIW1!*5MID!=?C@$qXP$p3ss|6!x=t3O9D`sGHS z{yF$4|E~i2ZH)d4Mt_PY|MxNcM~3&spE}@%{6Fa#9e+N)hT%6cJY_rbapUJghTq2U zzVkQd5s%8h2Kc`p`2S5te;=d2Z^Zg||M5Db-)i*j_WLQIUq%6j{J+xZ7kczdiAVYG z1Nna%=wHIz*C0#&6 z{@?dm9sj=hyZ%29^si;~>y5sz{{4mFmm8kk6Zz;|W&ZRh#{N!V|BJx> z1L!${$bXk4)ZdqQ$mkcQbp5g8_m4pTJw|_q(Wl{ck86*F%GWt_I`EO$QHxu%|VEA%C!zf}FnovM4>fw>57+){h)4Dh z1N+|v_CLhvziRZ|@sF$j3d2wOo&Kh;{d8U`#)jyKTT-=k=tYculKyR)YtyZ zAs+cZcUgS={9j=Id5r$CM&IZERSe&d(Egt@_E!S?bLg&y+kXC;(SO+J``VA!82wJ8 zAGXtK{<9{~-+KpKelHk(xBYPAZ#wa){Ca@CdVjZ@{~H+nj}z)&!|3+|ef9olSAT8F zAZkCh{k_iVu6AXk-`)J@5RdXd1oYMWb6x#1M!($X`^vwR(H{l+>iw^-{`HLhf`s~4 zGx~YU{svqaqaJ6 z^dB?&zVYK7jD9K5SI_Tv^(XC&^Z!P|^813(uLAn&`RA_w@r?dwMxTl|@^Q=WXyTFo zQ$SxmKho8IkkOy=g087P{redGcA&4G|L5v&T8RCBu+jJRKPwsjD8u{4FQ*WX{MTjd zx7Xjd0`_l03rwi~T$<2-8xW852Y~;!0s4y>{rinR4NoE;H-3J}@Gm8_|6#`dVPOAu z!2YS!K_LHqX7s7sjeK1Dk7oFFUexhR%e#?}%U{Rv1%@w<(DC(ytB6PCm(!x#Z##ar z2l*dj^yeD=9XzPif#KEoX=k9H zV)U{eQ{rx@pzl_muGy1t!{=W|NS26k@y__unKWFsY zSH|3H(dUCgIa$|y5#jQZuvJe{8Yn}d6AFHHxQ5FrwiC$1nlo)^iMSUVf_n@ zaP=Qy^m~nd$gB9B3iL-9{Y#C$FMj{Q=nsSZPY3$D(g7`1QttWfZlix-m~r#d&Hs+X zBmd`|IyoT94X5%y1L!Yg^xsLC|7u3R-00iwR|(MXV)WPfgN|Qc{;y^9Ye4?@0s1d9 z`V~gsH-6c54_tm#h7aQ}EXG**5s%8R+t?rSs{GWmE^#K4mKQ-`$4a*u$T} z@V_+tMh@@B?`;hKtl@WbcsG7-CLWdFC@8;g0ssA;(f`os)ATO#arK{N^z%-Ow_isC z{ZASFufC=|<%^$>82v({AJ#wBejWq#51)q1|5&465XpT!elBD9(+%&7pH~?EV#6Qc z(SMP6RQ^>a|MvLp1d#u=r{nxTlhFS;#3TJK;Qwl%e*&Yw{vUPu@8HRQ6{9}@;;$Cy zpTp?yVf20d&tnX~ui<_D&o3GKhk^eV0{j2X=-+Deef4LA(a%3!*I&E-ECTv7_rme> zrqTDs|5Aqk$nf9rl>bS@qxdT~_S@s9MqvLG&(~=)b`5a}Do{pB-jk|J5Yq zFJky5hNt5tk&oMcpHDpUUk&iz65zkTGx`@BeK-DG{Wlo>R-3R z`cKCGPGJAHf&Fv$#{PRfq5fgSBmeaP{WF379~u3R6Y38#`u#xvETF$+ADsV9hqR}U z$+$ZB&22v#iAVV#GWvG>o(=SW&gd^O`fmBV`n`;P;TiGq?{|Uz2Gqf+oVx3G?FsdB ziAVV_1^VX!{c=YCCZm6Z$NvX1`c+2X9zR?F^iz!f2S(qmzpnp#7(VCEI)2>t$F0A2 zF!r|t|6K^|{}ZFXtI_wx&mS25E}(xg(BFYNSQJ0Ajs9Vt^4pGh6hFO2zsB&Y|G5^s5;C{4?YIPY2MylF|Rf=+p9S%Y(K(e-12*a zcoe@K#(yEN;`eIczisx%`Txl1`|9rTJaP=40}{U$~~?=L!jeD!xRqd#c$YmDPm z{?)Ud-SO)^jQ)v6-&cQcXY@b` z>hDfGD*sNP|6`zkGNV7`OUtc$KC*{#yU9TIs%wRPdXd|8C+@{`1b# z@!x8ARsZe)`db`;^&d6*?)b&k--LLi-){8n_`eJ2AI|9i&FCNR$$tf--(~de_V*s3 ze*vRE>u+lW${`<`;pYDwMt=b4-wX7A$>=XL`fmNxR)yB&gl>JJ|Mn;88Lqd#JJ zReySc{u;Ewuaw;SyUVcFzroRW%kMKrzwPX}{~reW&5VA((f`2FU(@;T2I5iqcN%>= z|BnLwhZ+5c-_kkttv~&Y(QiLT=ii<`{{rZ*H5>bX^4nUUmIopqH~*hA`U60}59m*0 z^ba!nb0X^T@#h5$f4SkOIJ_G_uQUAphCjjK-Tc2o{3Pc)>Ob?p8;`%oK>lZzVgGOP z4{fP${5q9*q+bN|p8)zDjQ(y3^)F)d%YlAB(0`TDKgj6UIKFlL{}Q8LWAwxRN3}ms z0sXHXg#CYu(Rcd~SN|-Azu)j~|L?}%>BOV*>j3_H2H5{wM*ojSzr^vMtN#R}-wpit z9MEq#82fMYceK)$j>DY)%&8+D<$uuV4;h11`TY*)Kf~x3y{kcA{pn})d(Vs4-`@lM z0%~BDlG}eBV)T9UzpaT!`5!R)Vf?H7zXv<8U0f~(E0a`|375(huh=+e;epGPz6&;Zu`CYzqGz@{9i{rD*v4C zX?;8Y?*RQ?MnCsMt?wKE|CG@mG5XZJ1s~OaybJWdVDyhQ`t;9{kK2D7MI9XS-z|op z5~1~X?LXbi@coAOjlb_C9{IoI!pVV*-G6)l@;~`-Z2wOG*8ca6AJ!!v=~n{%4}pFI zqhFd(zmCyw0Qw&R{RbHRV~u`|U0C$HTmJVl`fWzv9)FJl{Vy2(hmHP*9{n2H;6(A) zZ}?ptUYBa-kH-;@%C86b?^9s^J&gYQM!zH@75wJv-_Gdw1ONRO=pRvu^S|pyTFE#5 zK7@Fb|52kqWDHjA#}`2VK}LV}s0J@_^6$paeT@F##k&4>8(!(Ju}*yd<5NcecShfh zAJ_jgj>P_ZJt5!D@c&H6|Ayf|GklrHf2)W`<=1wJ_Fs|Zzjc8B)~60e`NZx2W__$Z z^^`|{ZQ_xBkI}cwFBj;4m(id6iPqo7qyHSk7aHEzem}+7Uv+7`|M)*(|EBX8|0UGl zhR& zf5`AOJdAwY_NRb&7zx?|;{ss-N{J$B{?_%^v zjK16dx%t1A(J$zT$Nv^U|1XUGmY?bT`^si>YzuLSzr0R68Xh4X)0Lj8Q=QT`i%{PDXzvqwmJgt&Dyf&@TY`UoiR| zMnCMo!V-7&OK5>Z#e~~`^%>q5e`hoNvrPWo_&bAmC`aM8@ zC!pV4h5fhYe|1iM^{;_=l>dI9uillNYYH+yEKoWiipp;rqyN?Ld*-KG{+}}XLqLC5 zpkK-8?_>10_2?f;Jj(wl(BBQ{-^l1!G5&Y+e;uQrcUips-UH}wa4h!!GNXT_6Y#En zF7YV;g+{;M@T&hR0{Uk%`j35%xaZ6 z|D~>o$M1f?{@fF>{Z|@&U;DKd@kqZN=zkOFAIs?9Z}ffh|8Ft+T}I!YKOO+|pJMc9 zt)WZm3MYQt@_U@oFIO)XrH>sy2Lk>5sJ|kqYUUj$mma5 zQ|I(zkN$m(e!-PG|91U780fF8!TG=2==@qZRYreGC~SVZ`pbz&`n^U!Y=2bw9|rVaVD#TK`o8w( zIYxf~=pO;}*IR(|zriG(Q{VXe1cu)_A^$ML?~;(8REO;^G5i*5L<>;oD)YB5NFSBo zu<>7|;Z^y~2mbqn(XU)vD{YmL3Vw6-|4ls7FS%OBuN^-}0sWm9;{2av^rv|Arx1_y zD~*0Qe^dFd0{WGV{>4UrCy)Mj82&!P@96MOaps)H*xv^HcO0;PfYBc``d2ynZu$L| z(eE_+eTG;5I|1nLT93;wWhTVaJ^DKmKgs!y`p>Fs;_*`r^cOSwHyeFl`?G-2PXYZ} zp#L(X|E$qJ+sT{j|K}O~cB5Zoc;){(pug!N?ElJjwUV#?ZbUrt|1ijZJgU0?EQ~Oo>*$V7Go6)aYPsjf@k=7%=e=@}IErxf?&&~g|lW_je zF}yGTdk~NEUviypKkfXV0rKC*=ucW-=ijy8ZNJ`R_)QF7;`qry=f9m99@w00aw*PR$`}}_a!ylhe z|5=7_O{l+BGq(SH!xyJLuYYm z|2?3;gwY>1`um2$=BFF~jg0=F(GTrc@plo>{|%$R!v;F1vmJdm|En1N+#9t2ZT(At z{^yK-gVFcZ|Bo5{5}^Nmpnt{^9DiL#-&~_fd%?~Bsl=oBYcTqD{l5(8|D4gka3ihc z>p%X*@V6L#!?fl47uWt>mg4;1&+u;iozL*A4DZe#T>fn0k^jnXjMv{Qf&boM^j}M; z|3^l@2IzMJ{l*mb-$x1c7ZQ*1-wO1v0s5aX`gwV}q+S2J<^OL+zXRxB2lS6P1?PWP zqhI8SzY7`uSi`&V>&DNE4Bx=y-{l90NB-{y`R@YxpRo+*|D1&S#l$21KA?XS(0`oK zzb>JEAEQ4A^lt|G$1cbDf57Pb_P@VHJj(wF(7y%f-^u8|z~tYJ|63XT+?(RFyjAHnE%8vO#ptNix>{p%V1!mnthGLQeSX7qc1 z9FM>Ifd0FT{t}}<$D{uiqd#Eu?ef1L=$EX(<^QnJ_qE^WGkm|{U-#I5Ht{Ha@^9Au z8?oZ|L16zXM!$R0WcBCgjDGG?$2czG9OT7O466n9j=&!$p*7wz)w;BB| zqi>i0uYi8}skr=)GWuJ4{C^-^7j>Yrmy&i#yj->q@~ zKMwRiW%Rp^{uGb?fvwnoPZ{2Ae{`-giC)6+gNCQ+LFD7|?ZhMh51Rbj<^Lqe|C5aV z!RF$NYrpIN%}&GlKg#guMXZmnKjsmS>@VonqaV&+RQ?Bm{-o2f|CbnjIvy4IxbgD^qu&qm|2)t? zmeGIO=ueHP$IJg)#G~>b0{MRd=-Vpcl9?T9{E52_IUaK3Fyyb^xKX8#vc948UAX+ z`{MT!#{ME;|DS>VZ!!9}8~yz}_P@#KmjnI30R35K;_@3d`dfMQ_ah#aUk%XzE6{Ic z^w->0N6K`M{&GgY73lvR=)b_|&oKJF`TKK>eh1Kh3+Qk59qj+(jDCref2TU<ZbVpe^;q?=<3( z|MKpP`|m@be=|BrzFTa5k{M&H+dy~*gOK>kO8{?=z>|KDx& zee>tdiAVl#H~RMc`4gbOjL|=FiY|ZO`cpHb-+foS{67Qw&oTNp8~r&s(T`hyo?`U- zjJ{p|p9B4`pM(8BV)T9U=bea0{?ENz=ihF>a@LLC|GI(EpS*+4X>Bz7Ir^`eKVHM= z4;lS@^HtS;t_k!%Wb~I9ec$}&Jw|`j=-d6rB%puDcd`GkH~J@JvKsv6=D&=15%zgDaM?`o8(YlfA2|CEG$ z1H(^G$luTK2N~YC{=eQu*#7y3KQQB};5XNQlZZ#`JKS%UzO1QpECR{ zhX01g{<|6byFmQy3GDw5qyL7{Z+03?*MA={`n^WK!SJg76$Aab7vu7)+$~xBwle$z z!>{MDe>w4}{0r{a?Z=?;zp{Tiu>Vs=ziD@E|CXNe+xHTj|MLxB>)~e-kL({c_S^A0 z6WD(Rqd#o)Dcg~cTmH{8{0D}2+aISma`wCw=YP^3xcptdgW)$fyl?&GBI1$%3V)`{ zzsBTVmH)oLe;+gY4Mu-n#C!4mrw#{{@Ek&A)ag9{GO| zj`ROVqwmI_+kQ?W9_7E_L0$js_^Sl^=P>%~6zlTe&{O_jF#M(r@7llO2RQ#z3{Ts; zk&j#dQpBVDmzez9?caQm|F2wu^{+Sjn?%&(_5XZ^?=k#wPKI6k&n6z(-)8JDF}!L& zj|TQ{_(N>}0=+mfwu4vHk-I z`Cl-6zu}Mc)Zd4QNB$o+{;x5-s(WeT;sS(RcfQxBNhiPme=5+wo6*0*==zw6&rRaO3YOMnCuGy8O!x zuj214pue&U`+u8#wUTfA*T?XC7~Z%3_6YH){3`pj{evd^%KmeJ{mX8|_Rri;+rOLP z!yis{&S@qd=@xG=YKzs{wSm0_G_JgyZ!q<&@cH3&i`{pe>+Ft ztv}OtpKkPb_vlwM`a?kfYM_5JqkpT>FY)N# z!03+}eS7?KEzmEx75jh4==+|3u{H6?|Amj~`Zr_>Ox6D%0sV!H{!_D()&FWnKlh1v z{l5X||CG_sJy7fW<_~u>`UOD$Mxg&Xqd&#yPj|}St$(jD`XxaB$3VZh8<+o4Mt?^~ z->rYU5s%8h66pT~=r=I>XBd57`(MZCHvs)xf&N2`{=*5&|9(cl4d~wn^#9K2zmTx} z-(d7Rf&Lvp{~NdA^3R>EBh6R-Gl)m!-vjjT0{ShC{_aNK*ZwVK^!tsz-TvJJ^w+%| z=YNsW_qBg(5|8pfYV_^)?_Qw4fYGl!Nc-QH{}UMf!T$L8@25cjUyOdc(f2+7>|I7b z_sMws|1+RJ=ML=urRB-;e=zaL|HDtk^Zy{wU++$=-);1tblN|+{hdTS($D{`)*m#y z>i-@B`tun5WffYr#>{}!XalPCX!4F9y@-T9x}fBc@YKlka$ zfpWQJ|1W_3``v}huiy~vKVSP*LOd$JN~3T4uMg;7%;+Cv^tbW&?*)cmV0hp7|7&;S z{HF}>Yd^Lj9_7Emk_k)?k(D3g0Rk!{= zz}P=v?6>3R8DRfMjQ(zOw57iB_xp@~&a=AwZ2vt6^f&Lp<#&+L_pLu4!SHQ{_xb;P zhQHA8UyqcYw$=XAtqlKw;ZL!@OuxJ3e-rU2{_>6gS`DxIuNQ#--edF&57SELdi39B z^gE1xho%1#(BJ=FTz+>N{mTEx*qwmeSp0DSe>s+$WG7^~j_s1Tmbl4Iwv_cRTe|i& zge1EVNwQ`aDM^+qEku#^l7#HUO}2=Tko7dQ2n6(mlgH7`QO9z|02`> zmq30;$`9Iqn}GbBd)?#bB_@9)$R9@eLFeBsp#B=FA9Vgr_Z2_?o2dS4*7{Lf^&zGf z^||?vrSV6eKd&<5Zv*nnHC9QZA4bWa?EIHN{u0WMJb(Vp`P_WI8w>T}ya zk@6$Izv=;#-xK6dYpRlJS>w0!yMX+h``z`QBFg>zfXyKPFy+q*$p0SX*QNZ(<4=gm z&%B18|Gv%CNay!M_#riu{|d;T)?6huFv;o%JHHjkA8|m< zf8_Z)Et9_zx=;OKPM=1J?h2ke@{Pk*_~^l*w-n z@{6@l`3aVb9|ifRD8IOsZ|}bcK>i5IkKBLqF!`m|^Yfp+m73|Gzkikx^||?<$>ir_ z@)v;o(v)91VEl7Hegcyp&E)6!jvs&fWR5?xsLzc*k;xA;`CCE$ILgm$jo)7X8$o^& zlV6C*zXtL@qWot9^5eee=kGYx4?6yi1oh8S{h-HhLqvUU{%_IvBlrIpX8Z?1ev8&> zrbh>ie=o@Ib42a`k&oYsGx=pUfcc~RpvP}diTd35y`%2&rv#J#9>~wsMvXsc{fz_p zv6LTq{3*%gZv^?pDL))A|LZ`0T_!)4${_4hRN>)^4m~; z(BrpwkUx;gFURCB2l;R7`L_-@*00_YkUxp?#XrlNfBr4cC^@Kz@!_ zR8r96heaSif$}3CKU8A!?}Plx@hU&)@x#9$|NL=x{;M$gT{iLaKY{Xtjz8^1eQy3^ ze^vRB^Iwh0p9At2Q-09->msP1K=p$jKb!^qugmnmCe!~0oB8?smGXlgKhzQRx%rEy z{K&@-&oTL*g8XdlQpz1B=<&lxAb%1w{yI$l36LL8`9Y5#j)43nls_=y_)(9^e|`%; z|NALF9B}-oE$VagAALft-^lrYp2?pL@^4UnaVtNC_4{;?--z-f_n#M-{Oce;y1m-| zL60B)0{LB;{Dw?^=dJwwKS%jNk008J`l+lr@qZn`fAqZ_i(4QJ))s zJmp93|DBlpPeFbH7{8tW5y+p!jK2$$|2@b*K>7CivFHCDsQ)|FZ*0wTlR6oY5 zZ})#b=zr92?(wHL)Bocje;no8+u!bg`5*cD{{YOtUB9%b&&_`{)BnCq|A&G61j?^& z&7Ym0aTnkJt5mp#WMeEq{z z-`;*s|3yBxer7V;Zx}Ow13>TBOiZ`W%3Vz{N0ovwEkoF@%=we^~YQDXCFVF6!p3O$58(x|9&u@>Hl_+-?^(w zDrjvmJAV_%UqJa+sQ>=;#{?$7-7oz3$9GdnF#+RmBkFVGpY*%C{U$Q`-+}xuDBs?G z)^vDf_w)VVNcC$5^uMI2&-H%^^*=UZ{w6d1Ujp(|byxEj^!dY!K>lIMkNo`MsZ4&U z1N`{=_E7mN0>)ol)aS-u?Tp%fk&i#8Gx@tfesoWjA9VcN4)W`sb=S`fCcp7Pe*6_F zKTE*)=YskTsD9Ca`ZGj*ZvNt_|B>rwHq-yChxq>Yqx>FLzPYTfN7BKlUKz^22RZ`xE zQSv8y{-=QaXeR$7CjU6dFGcyq1M&}n{5U56V$4`6w zRYZMm{u7w-FJtn%gZ%rHFAf|3x!L*4LH(#+s$|gfUrRv$6Pf<6Wcr`t7(ahcQ+|d2 z^j?*Xq`M$LiP?UunEZwyzbEDAjtmn&+w)gn)aSNert|LcYc-QU5ahp2`9a(7J5Ya8 zGPmCv(Ek{w|6eox&v2aIe&11k(Dh$iQ2$4&AGH6r6!p3JuSWfk+<(_H{eR+DzW=Fu zt1T`5JoulRz5R2D`doe=$`^-sdGpWT>zMp5Ab&UI+kgMD^V@^`x_`Lq?>iHkY7`0Y1@@`L{V(L~hew%-zF z{x&iB%R&A^$`4wc&bwRD)ff3t3k;%UX@+VP#I3WKL$R9!Zk@LTk$uF10&;J*cU);*K*MBKd zpPT;#%Fjvl{q?_#$sY;wk5hio`X2)F6Pf(oO#WGrpQ5kY{z2EDzk&QDCVvl;-{d!b z{>xB)(D+{v^||@K#pLf}@^6Ct7L*^f{;z@jOc&ktzn{skaf%=Ru4InCvZ&9Ee;nmU zuD^p!{%(+emGXnm|2IJW2UOp_{z~Ef_jVQZe*x3~BTWCZ{Lar`?tUp{kl5}1b5r_| zUIg_EQT-YZi^`wu`t?M8ZvNL$|LanHfB!$u^nW_Y?@aln0`ez;eD6=S{vwZmCz$*b zAb&dLXR`9`?RNy^$5MXe`b%Q+i=XDV-(t!STlx0<7Z&xo`LE05pJMWRgZxCwx7WX& zzaG>-NcHmt^#2>s|9GbVXPEx~0rIa?e$e_aa)zJ(`&8dP{@UX&AnK>G#_0b#km>(< zrvLRpexd#d|8bDthw_8gPua8l{12o0 zLF=casL##+VP^g>GyU%l^5-UV{#Swei>ZELYyR!y$1>3WD@^~dGW|ab@_(fKtO5Bc z&++qrg6i9Uzqb2d0o1=j^{WQtml5^3?H6^)J%0bgjDHNsk9}RO^mbOhz5Yjl{5Z;w zJbvF~@_z#PlPSM}m2b~qBFJw<`E{wjzyJNq*pGxKG*+vrvGV}{*M9qLnuFg!1f;j@&_{cQB3|JkUtm9pS}N-zsS%3QmX&F z)qlHwX;Gh>ze&{px>Vmk{yfU`e;mlaLHW4?^7nxH83(GK20i}%5%m8sGyfTw{#W>u zpTBC9A9VduM%3r#?+TNjiOGKtn5aVEbj$j>xbZGU_I?DfAB z)XzutpSR}UuD=!ZeG|0m@awdUVm zKktM5MwA~*_5JJD@=X3|ke_vkN{X}c?d^XO0z(-&LS~bE@BPEi-*n1Id!rkBa(S|8FtJJW>|2d%l znXbFX&*zx_XT8bKU;m+Mr3cOb08sxeP~YDFkAV7Sv?+*{uHC z>vuP(A4BzP1k~Rl>T~07aZ|1T$o1Er8GqCRe*E1jf4P-!Z~u^}&*d+m{3{Xj-;v4h z0rGRcrDm#um2b~qXOKVXmOK8=O#Vuc-;wfzw*NIyzZcaH2lW3E=>K8rf6j>c>&EoI zium*ef19MSCT0@l2c7@k1oh`r{oGdn?d{)R)aSPU6{i0^nf@;U`D>Cn|Cd1hP05`9 z^PvAx|GMXo-c0|irQqlPH09T_=Fi$p-m{`UH-FKTA9?(KjmcjC@?%D+q@eXT2jn+m z^7}FQr$K&w$`3k!oCNtJnE8L5$uFCdpa1@pA9Vd&QqeVe<+iG80423t=50g z`QsOme~a=X&!5AY{PL;z`5#94`K|HW$IsHDJ~#i>Zo9{ykxc$DkUyXD?c=|F{P_jc zUqT&e*T&#Ge4!M&y9Z%lm9N0Ulru{r~IJn-_fA{II17C z{)U78pJ&$JM5g~+LH)Q~f*v{XYuox25`F z>wstd>KzdEx$(!-_%~9%|M+tzGyZ&!@Z%pbP9+6hf9DeQx%}w6?)hUjlRq5f&!+qq z0rNKq&7V)whp-_WoM~)c>36kFfIX z`jtg}ZvJCv{P9%Z-~Sdf;~x$3`;AvKZ9ji)=MM+@<0wD!`ezA~e-z|@Px*NR#(x0h z?_sw8QYODbdVc#Ir~IJv_XJS?3e^w#`_WiYpWA-tssE9GKU&W8KkZ|D|L4D}wqH>H zn}PaYP<{LSWAA_SLH+eqKj{29OVsDafB3$8{#?b3{~E~uoAQIsAD2LW)C2eUv6{(m zo`IkL$0n$m3Oau@7WKLDM^k>}{`(b^zXarWN@o5dkUxUS|AxsAW#q^I9pwj|KkkG4 zBxe5CGWjoq{Iitb-a3BR>$iod&&~fWCVw51zX;^leNQC?oj)#s`Yow`(D~!ZO#J+J zq531N@!QAmBBDMw{!HFuvSvKh_s<_2nDO@k`R6D<=={+G?j zKlA%){)z{zp9dg+V+yr?BIhrW$!`qupQZe`fcyrcJ~#fulpp!{YbTSRIx9c^{*-U; zfA;aC3aI}U)erjn$1|cn*Z-)L?)?44^nW7AUqJa`YyRy1zXS54nf#xb{F5Mm6Xo0I zUpxOO$d6<4_cHl8v+>*SIOPYepRA%jH~)<&KXU#2!sPD)`Pn9^kp^x5?I3>yGyVfi zewFO}_{&g!(Dr{u)aS-OlgU5C{COb% zGUeOHFMIxf2lekJvwrEE{P@#NQS)zK|JeCMLH#GFzJ2_#>kkz5x%u-_xyR2_%=~Qz z`A<`R(ER1f#gD%h)o&26{j-VsT>o=Y{|82_|1(Vg+k*T_ly5)(r?$$&PPGL2lbHEC z$K=lh`Cn81`iD{SCp&*C$X`PF8>zm(|Np_{*Urt)f8VJpDd_P>by1(2|E{Us^>dNQ z?+5Z{Q+_n{U*Fl|p9|`LOZDyRSG)cU(Ekxk|1UHB-v;szQNBL@=>FUL-wz;vCgtn; z{`R}VK=o_riKBbF{v=VK zTYtBh`TK|I|4EQPk@AC{Kg^$pAOELRKj`_x+@e0$|7vO6{pS|b|2IMY;bhMLE>Qn0 z)wlN_d;M+){cpka{|?jt{CWBLOEq0>>7d7d-9i1FRDZd(e(e5t67{+H??e5MeEfHx z>Hjg1zb%>l&!3MU|52(RbpFmQ>T~^%PwTFq6yg{XMe~u9?wf=B>y&Swf9?5e4Dtt3 ze&q2h#N@vV@~eHIwtrCm+aP}xAI;>aWAeWP`Dc=uzXs&TG5P74{EX53{O6dV)=xNK|L+Xy z$5H*J0rlI7`rP(wME#Gv{>;eq{}+(|F6GArT~m-#Ed^XGyXdu|3NbQ-y+PHoVRza{1CC_iZZwE*>ZB(wibMSX7j^RK?Ucc)>{Vr5L==l8&=>Hn(f8_DI z2-E)(h57mWmhyv+-$g}zZvJA^x##~FCjU*4e~R*>t@*Q$Ki`4+DQByaLHo}WMfmY& zqWVF{?;N5&H~zZJ_)9S3j|cfrCA0q3=Dv|2IJXSjyMOU%eUa z^?w!Q52Sou-#>nqX7Zma%5T3tly6^u+v}&AsLyS`jZA)7CVvXZ&of6Q1?9g7@}nMg z&tFe7`G0`?u9R=De|!7|WBBM>%a_ow`zzyCy);QK$0>f6^Z_Vx>j`dt6L$K3O8ZKnT2K>k|F zx8Hwk?>}#V{G5~@x&PN?@>hWTYm{%Ff9?FwKz?0j{Pmgq&{O>UXPU2OI%xYf0`&_~ z{pHsBv-|(NsLyS`cv`kx5$_fme)_1k8U-zbB-ei}0QQ6>5LyG{Ag*7)u9 zTMN|B{h=ypZ-2XfRZ*XtzphOGn=t(!3GypYzP|p@!?3sC5RgBD@^yXx_|=Tb-wg7H zQ-09-?|YD+$c(=^lb^d3zx`%WehWQty0^!lUDW61KZ)|=sh&Un7EJytApdGI^IL)Z zY8l=0M=K_OImoZKK&`Y+0pni+@)uBk@cETKO5XfG0Qs?$A36V>nf%5ee*onNo&V;7`s1m7(Dm00QJ02 ze*9%9zn?yE(7o!_Lrf>?bK{T7toENtRMemU-c0^XkiVGnGe3-yKiT{P&>zp!3fikbjHGAH?KW1Nk2(bNdYk z^}nF{LHqw8QJ>p>F&?*RF+S=I3;a{ax} zV1<{#eQ6j|TbS&y%*j(=Xf5qhg1M)W|bN;V@{DG7oIse}<`A<~l_rEKY zumAo+)97W=KhS*+QJ>rYmN4UA%jDMu`O(YN`YT}NMO(kW4(d0e`j1=X?f%aL_4`o$ zpz+THa?+oc|=y|7uUD^&dI^KQjGK zTa{nGBPc&;{g(vw7bLU)#YBB>{r6$|znkfQ3y_~c`S$zQ?fD-I>hGcYLF?x&(EkP0 z|H$i)y-fdCfcz_z|Ae*v?fxGC^)szd`)|_n;xt(I7w5O11xG z3D|#Yiu(R@Y$2;$4Aqaa-2T0asL!q6=)7wE>hoeW%Hv?s*(P15 zp?ldBvRaU8uY+SI}Qj;x<P zyi?x)hmaQsydv;Qz^eeS2D}FFTEJ^NzFv&ipZ`~ese%3&Q6l8kjrdLdyBcqO$8XZS zCD8|y_{UBE7A4l1-+saA>i0x-=RHM!k$kbJ@84RJPoANEZ?Ep;$Bz5${7s&l+&`WB z{unKA{kV9qaJha8sDg#4e3V$1zKXHYTlNUZ>91JsJwsv_HQ?-{CX;% zSNyJTA+MP;t~_a|pH@3v$)gLY+H~hFBp*RglN$e9w?kf>yo|W)lk2&#g1Y4IkS`!F zMeg5)yymGQew9D|B+C2qaHoNqhrd!jED`crIOY9+4SB7Aw*lT3_$$EM0q+336Yws; zy8-V3{8iw+f%gI47kEG5uLFMr_?y571NV;x?k(gE2R;(`DBxp&j|Dys_;}zGfKLSe zKJdxFrvjf2d8QD!1n;(2Yf&91HcafKLY$1 z@Lz$S1fB%^6!6o)&jLRO{5U+qzmS&_cq-s&fJXsO2RuFS48Su2&kQ^(aQ|xDy@kBTf#(9A8+abz`GDsK zUI2I)ctPNWffof{4EU44p8{SAcr5TTz{>$I4?GTdMc|cyR|Z}ccy-`4fY$=jAG1yaDhRfj0u)1b9>6&4B+8_)EZB0&fkx4e*zNzXH4+@D9K`0`CmGEAVc> zdjRhV{8iw+fcF937kGc*1Aq?%J_z_=;6s5A2R;(`DBxp&j|Kh?@bSPW0G|ka67VU& zrvd)}_zd7PfzJXy2lzbT9|B(pd=cG{f$swT6Y!sb?*;w~@B_dP0Y3u#81P?#p8$Rm_;0{} z2Ywp(S>We^UjY6m@XNrj0KW?S8u07DZvejq{5J4A!0!Qn06c~G>$-ajc_HAbfTsqY z26z9A7?*+UM@V>zN1AiU(8^8ww9|U|b z@FBp50Ur*0B=AwdM*|-N{B7W4fxiR%UEuEle;@c{;8TH513n%22f$|npACF2@cF<$ z1ik?HN5DS@z8Lrt;7fro1HJ-y0`M<@e+m3+;NJjW3w#~$?|^Rr{sZvMz_$Y54m=U~ z4&Xlm-vxX(@IAoy0pAb&An?P$j{-jq`~>hM;J*R?9rzjG=YanK{37s6!2be%75Fva z*MZ*vehc_*;CF%F2kwbiE4erEyc_UTz|#Pa0-g?ddf*v=X9AuDcsAfUfae6B8+abz z`G7|Q4+Ad3&4)&A}+Y=1HSs-@GQWy0nY(EC-B_B^8n8WJQ{cycp>0L zfENWG1H3r!62MCWj|E-^csbzZfyV)_2)q*TD!{7&uK~O!@aKTn0bURI^T1yK-Vk_W z;7x)55BN*KTLNzl{AJ*;0FMXW4tNLPoq%@%-VJzn;5~u&0^S?=Yry*g?+^TS;BNqb z6Zl}@Lx2wjJ`DH>;BNsR1$+$fvB2K}J|6f4;1hvQ0zMh|RN&Kr&j3CP_-x>FfzJoN z0Qg71KL)-S_!8htfiDBT0{BYctAMWt{uS`Afv*9+7Wg{g-vQqMd?WBpz_$S320Rh? zPT;$M?*_gH_&(tKfgc2Z82Az3$ABLPegb$B@KeA~13v@&9PsnNF95#?{1WiXz^?$m z3jA;2*Ma{7{3h^!f!_gs5BPoHp8xSt&P_b;20R2jHSjdRqkyLa{wVOrfM)>ie}a~K z3wc?9X9b=ecn;t>f#(AL1n|7T^8=3t9tK_rcwyj0fyV$Z4!i{Lr+}9N9t*q-@N&S* z1CIk<5%{yfD+8|zygKk2z-s}24tO2lb%ECd{ygv(fHwr*2zV3V&44!t-U4_l;BA1n z1s)H)9q{(RI|AR@ZW%+0)86!8Q|xD{{j3W@Jqli1HS_N8u07D{{emz z_$}bKf!_gs5BPoHp7^w4_a;7f7kCJGYT#*sM*&X5Qa5_k#VC4rX$UK)5=;7nE#wUZ?tde;dkc9( zfcxJ-?cT)aY62e#d=&7}z{da|3w#{#@xUhl_rG!1y@kB@flmhRe{-yR3whIl``@(c z-a?-L4XExdfS=0|Ba#UE#!R&d?D~fz&`=*e^aD;3wi!GIJ&ox_c?I?8xP%E zNPZI`=c_<@|C{^VTgdwgxc^Oe?k(i`-$3WyLf$&y>w){<UC%iY)*0v=iy`>h%Xd)+djORt5DFWL?QK zk?ZpB3-{aKM(xwr7|6;Y`OP@09sU0=shynEj&9%o_mFqi>A&)Gj;m)*BR;&_FDP#6 znZd|bm8)l zY==J7J;Er0PuyodB+j!%^Sq~nLAmvlU3dY|lXVe-5j z(j&k9Lsfl7y8e{?hs`yUu0Lh}p%0c`?jg`mA4%8WitzBCk4V?wity0W$*+})dkFN? zv(ojq89e;w|4D!0A<$0~rN8L-cIk~BzazbggX8z4cXB*h zegS1?$NNg};`lP@-5lR3{WZt`klxqvIQfMw{T!bty}#o>N`Kw)Vwrs!;P^o4Z#e#) z^dXKvkWODd67jFqv-rP^j}Z0acmT_%P|K9bYMZzvG@f#2;|Hh4h1t&yaq| z@te{QJ6>0wDvmh*zVs80{~|rf@sK>V{N{LJ>8Bl!mwv|aiPFzHzFztT$N!f8r{j5Z z`E<$g_R=pqK3n=>p5O7@@)9B1@t36+aD0LE;*KAdUc&KQ z@>1g|$D2wo>3DzXWgMR+y}IMKrPpx$6?rLB)A5DUTR6U1dc5Olqy5Fv&hg69+dJM* zdMC%%O7HCWRq0(EFIK=4x1Nr_CB3iXN2K?6Jh!|Q8{&9<>F+q+Li)RoPnABw@#WGd zJAOj?6vqq7OTej)*OC62+-~>4zQvPWlnY|B?Qy<1t12^>EtpPSVdhenR>M#|ISk+qv%e&(iNYUQ}LE zKX81w^iWE_waD8V>8Tw5TY3h^3(8CL%#PQT{ zQ|YA~A1J-F<5Q%UaeS-vvX0-7UeWQ)@}Wp2#~Vto>3BcswH!~7{+#0%rPp&jQwe__ z{^$6!(wjRzRC-It7fX+K{3q${9DnR7KexT(&r9#@ct7dA9bYKDkK<>h_j5c;Nk4a( z<7K6fcD$DKcO8FQ`b5WfNuTcclcoIJ`HoMQzS!|a(w8~DMLK=?xZfn*?n+N^%IA;u z3#@XyrSx@<50t*m@z131a(s{UpBztF+RxqXc(nAN9d9jtpW_px|KfO}^b?M!E92*$ zalDT7^Nx>^e$nx@(*Jb)mh`_JuUyv8z3uo=>EcgP*6l0lsT@BcJ&ofP%J~iW-@5qU z+cfDp9A7K_3CFKW&+qt?Py6i_b-bSR5{?g%UdHhi(#tyjyY#0W&tKlpt>buG>75;) zDZPv1+okt${I2vdju)!n=T3FJq4ar<50k#Y@pIC@cD#F>-~LaIPm;dh@nzBvJHA!= zQOEt(L*AKm{=Iz@uLH43{x05k0Gw@Jw4Vx;PYpZ`@U+0AfIkA99j@r-qo90x;Ew^% z06Zh`Ou#b(&jLIv@NB@d1J42cao{^5TVYd2zwGJoz&&PtJ_XlPBZqBx(Oc$de~4o5eiKlL_PUV9&TbNHZ=E zu8cq9m=7VZBJgK{R{~xccopDPfmZ`w9e54kHG$Ux{v7by!0Q073%nli`oNzD-T?Ru zz+VL35O^ctje$1--V}H<;Qs^O9QaGXTL5nfycO`)z}o z1l|dFXW(6ccLm-Jcz57EfcFIcD)3&wdjszS{59Zxf%gO6ANcFQ2LOKq_(0%q0v`l? zFz_M3hXNl4d^qqCz()dq3-~DDqk)eB{xZiSz&`*!1Ncnfvw+VAJ_q<*;PZgb2mT@O1;7^q{|NXZ;2#731o&d$p8{V3 z{4?N7fqxEs8Sv%6R{&oLJOTJB;9me=4g5>sUjhFb_&31U0ACCITj1+}uLu4e@b7_d z0KO6U55PA8-wb>U@U6hN0pAWh5%><^JAwZQd>8PafbRzWGw?mY_X6Js{1@Q+fgb>V z5cnbBhk+jfeiZmI;Kzag3j74{lfaXJ{|5XN@ZW)-27U(kS>We@p9lU2@C(2%0{;{E zCE%BV{{{RC@TRO1zXALv@LRzD1%4a&9pHC?-vfRh_ygelANs}L|5I=k z#NYpchk&O7?!G?C&kK3(>!Xyrua8n51=@cEcsk&Z0(W13rE=ZZUnzHAf2BMlXg?G1 z%)s5(ajEvRg7VpbX9w=S9!$0WI4GYJcrM_%fj+zJA0`12FFAdy% zU7u>dEGSV08zYly8@X5fZ0G|qc8u01BKL9=h_)Orl zfX@a#2l!mz^MKC>{vq%Mz!w7l2>2r49|Qjc_+sFn0$&3BGvG^se-3;Z@a4c)0AC3_ z0r)E5UjSbX{7c|p0sk8KH^A2bUkm(O;Ol^|2mT%K?}2Xsz7hBjz&8Qk415dlt-!Yd z-wr$x_zvJZf&U167x15e?*{%e@IAoy0^bMx7vTGW9{_$3_#xnjfgb^W6!imz>|Rg2K*H8-+`Y7eg^ni;OBs!2mS}}3&1Y|{}cEn;Fp2_1^f!|tH7@T{~P#q z;Qs)>0sJQLTfqMXejE55;CF%F1AZU)1K|7%`o-V>Q~HlD?VI@fKXCVbe12W=`hQS9 zHSjdR(*lnI{s{1Nz#j#k9{6Lx-S;P|dB_OLX9DiNpHa1w1(eSUJR9)rz;gh1-$$wX z%13`!1E|1?}Vmo*#HL@B+ZYzzYH|1iUctBEX9Rj{)w!FICN3 zaZvtA;3a@R1-vA1_x-S{Ke3>^`#xD!-hH2}^0J_va=@PkULJS_;Bmm80q(wUSM~o{ zP~Lq%uPR>|l&=E3D)4H+s{^kA+ZkkuV&(4pi~?biWb7r6UAWz~LtQ2u$~ z4S>G@{6*jmfj0u)7;-`}m;X$8u+2Hpnv%fQ%a#9e*^eH;BNvS1bi^?A;5p8)(l;1hwr4}22v$-t)op9*{$@ae!m06qiwOyIMC&jvmR_*~%gfX@g1A@Bvj z7XtqX_#)sR1OEj0V&IwvEZ{vGh|fo}l55%>?lHv!)ad<*ccz_$V44m=U~4&Xb1{|I~+@SlM1 z2L3bfJ;3(@-v|5`;QN6e0DchoA>fCB9|3+8_%Yzef&U8p1n`ri)kQ>n+xsX=-7bE{POw4l8Ec~+|YBcOab;Ew`N z5BxFU8GvU5o(Xtn;8}oY1)dFfcHr*kfT{U>9F)%qJQwiXz}?RoQ@MFS`MkjM0e3&I zOtl{k$`=4023`<&A>f697Xj{muA1t93@Bd=cyZuQ0(U>RP31lX%9jLQ3V1B=(!kx% zi&On^KQB&sIna*#IdZCec~HIr@HpVl0IvxAS>Tm`R|Z}McvaxlfL8}z19(l~wSYed zyf$$6^ZnHJstd~31708a^S~Pbe*yT5z#9T@1iUfuCcv8lZwCB-z?%bq33vwZx6f!@Q%Pc0e3&IQmu3M^D32h1?_YL-W_-k;5~uA3cMHa z-oV|@+f?Iv4V3Q-ydUuXz+VSG0Qeig2LgW+_#ohefe!&b6!A0zU`*Jn%n&UjTj)_@BTp0ly6VFW^^zUj=>*_}{><1OEs3 z4abw>JTL6sGoHqOfFf>D&-i}dcy`5J9^skj=g7OKK>6y@AAV4N7OGTFdWuxKjSTcd z6X_|9mmu#aJ!HHX`8?^V9N#WIweeh3{xt9u75(w1G37H;`2y0@8qZB$NjNtTwL$rI z(jPJH=>EScJ)QAv)c#cIk2=0wdV1q}-nL4A%y=nkCrNrn$L~nbY`m-<@3a0qWHsKN zyuS48#tV{nlK!~y81g~Va~Us5K2>;ui0`4++_Gb#uBEGlxXq0-3itf)c z(9Txr1x@=p_k{Gq#=BGQzrqVdd@s4q&05(XR|`|VCY3KK-EF6y^rEJ`&h03i+b(Yc z9|e30@VUT07asPCoBrti_h;!(I(}WaKhOFZV7-5(tHOIUc{V!2>GtEuOOoq$S_lt& zB}{H^n$HQ++ZgXjz8aK2NA2rJmKEupOLt`XR;C@@ez>Zi`-<^cYQLrQcE)x2@zOgO z*Zo;1+@Bvi_h<5bRHG{O=PK~5)l@rK(x{G5&2Kwm5$H`;Ji&$P$IM;r2D&L<@M9Zk1QRIVWDQHUmG5L9#u)O43 z$m3|jn$UPJk#GA`71Z;Yp_c0Z_-N(&m8MUV=PRf@RSI< zkc+CT`nhePDyY}z6XY#ERj$u>vE;X{@-@lx6;B9M$l-=7J_ z_3@;IaKHWb;&GCH`yaJGiahC0<@#~@C*;>G-%h?pJpS-+`je;rA+I5>XZ>3tb>}_S zNac36ycqd-@)p#eCc?wsWYd2=-nXSsHQtlj{}#0KJNYSbJ?r1Hhtz$>#(w+LO*{Iy zQAfBxKexp7j(_qZiV!imc?&{9_gM3$fg zZ;v)r{i*Rk^?N(=667CS-h%v;*#7=aUndMAza?_~TRl3i&LJ;P<@LO+B~M4?^>xB; zw*+c^Y}pW6|}uZseksClc%SF>US=kC67r^ z1#{5)Ng>AX=a!*))B9Il@=U+0^7?$;nS4P<<@ztGACk}Qpj>a?pM+;p^q>Fl2Y!s& zIZZo+K7ZvA>&)+GzTT=Ceg0}MJnWS>>t7$oMgjj=dYn^!EAX?@XPEL7?-daf682^p z*T?_1(&rc-L8G1_-0%MhnrD4J+D-m-KUHuSmG@ex@^AH5pwA!?=Jll z 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 nC71%A6*1scd(0e! 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 == NULL) { + std::cout << "[Task$NAME$] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks: needed " << typeid(this).name() << " and got " << typeid(t).name() << std::endl; return; } @@ -109,7 +111,7 @@ ReusableTask* Task$NAME$::clone() { char *buff = new char[size]; this->serialize(buff); retValue->deserialize(buff); - delete buff; + delete[] buff; return retValue; } diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/source_template b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/source_template index d56eed6..3bddb17 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/source_template +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/source_template @@ -10,6 +10,7 @@ #include #include #include +#include /**************************************************************************************/ /**************************** PipelineComponent functions *****************************/ @@ -37,14 +38,14 @@ $STAGE_OUTPUT_DR$ map prev_map; list ordered_tasks; for (list::reverse_iterator task=tasks.rbegin(); task!=tasks.rend(); task++) { - cout << "[Segmentation] sending task " << (*task)->getId() << endl; + // cout << "[Segmentation] sending task " << (*task)->getId() << endl; // generate a task copy and update the DR, getting the actual data ReusableTask* t = (*task)->clone(); t->updateDR(inputRt); // solve dependency if it isn't the first task if (t->parentTask != -1) { - cout << "\t\t\t[Segmentation] setting dep of " << t->getId() << " to " << prev_map[t->parentTask]->getId() << endl; + // cout << "\t\t\t[Segmentation] setting dep of " << t->getId() << " to " << prev_map[t->parentTask]->getId() << endl; t->addDependency(prev_map[t->parentTask]->getId()); t->resolveDependencies(prev_map[t->parentTask]); } @@ -57,6 +58,7 @@ $STAGE_OUTPUT_DR$ // send all tasks to be executed for (ReusableTask* t : ordered_tasks) { cout << "\t\t\t[Segmentation] sending task " << t->getId() << endl; + t->mock = false; this->executeTask(t); } diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/stages/Segmentation.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/stages/Segmentation.cpp index c81048c..879b4ad 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/stages/Segmentation.cpp +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/stages/Segmentation.cpp @@ -10,6 +10,7 @@ #include #include #include +#include /**************************************************************************************/ /**************************** PipelineComponent functions *****************************/ @@ -117,14 +118,14 @@ int Segmentation::run() { map prev_map; list ordered_tasks; for (list::reverse_iterator task=tasks.rbegin(); task!=tasks.rend(); task++) { - cout << "[Segmentation] sending task " << (*task)->getId() << endl; + // cout << "[Segmentation] sending task " << (*task)->getId() << endl; // generate a task copy and update the DR, getting the actual data ReusableTask* t = (*task)->clone(); t->updateDR(inputRt); // solve dependency if it isn't the first task if (t->parentTask != -1) { - cout << "\t\t\t[Segmentation] setting dep of " << t->getId() << " to " << prev_map[t->parentTask]->getId() << endl; + // cout << "\t\t\t[Segmentation] setting dep of " << t->getId() << " to " << prev_map[t->parentTask]->getId() << endl; t->addDependency(prev_map[t->parentTask]->getId()); t->resolveDependencies(prev_map[t->parentTask]); } @@ -141,10 +142,6 @@ int Segmentation::run() { this->executeTask(t); } - long long t = Util::ClockGetTime(); - // cout << "[PROFILER] Seg (id | time in ms): " << this->getId() << " " << t << endl; - cout << "[EXEC_ORDER] segmentation " << this->getId() << endl; - return 0; } @@ -217,7 +214,7 @@ TaskSegmentation0::TaskSegmentation0(list args, RegionTemplate* i } TaskSegmentation0::~TaskSegmentation0() { - if (normalized_rt_temp.unique()) + if (normalized_rt_temp.unique() && mock) delete *normalized_rt_temp; } @@ -241,21 +238,18 @@ bool TaskSegmentation0::run(int procType, int tid) { } void TaskSegmentation0::updateDR(RegionTemplate* rt) { - string name = (*this->normalized_rt_temp)->getName(); - string sid = (*this->normalized_rt_temp)->getId(); - int id = stoi((*this->normalized_rt_temp)->getId()); + string name_normalized_rt_temp = (*this->normalized_rt_temp)->getName(); + string sid_normalized_rt_temp = (*this->normalized_rt_temp)->getId(); + int id_normalized_rt_temp = stoi((*this->normalized_rt_temp)->getId()); if (normalized_rt_temp != NULL) delete *normalized_rt_temp; - - normalized_rt_temp = std::make_shared( - dynamic_cast(rt->getDataRegion(name,sid, 0, id))); - + normalized_rt_temp = std::make_shared(dynamic_cast(rt->getDataRegion(name_normalized_rt_temp, sid_normalized_rt_temp, 0, id_normalized_rt_temp))); } void TaskSegmentation0::updateInterStageArgs(ReusableTask* t) { // verify if the tasks are compatible - if (typeid(t) != typeid(this)) { - std::cout << "[TaskSegmentation0] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + if (dynamic_cast(t) == NULL) { + std::cout << "[TaskSegmentation0] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks: needed " << typeid(this).name() << " and got " << typeid(t).name() << std::endl; return; } @@ -264,9 +258,6 @@ void TaskSegmentation0::updateInterStageArgs(ReusableTask* t) { void TaskSegmentation0::resolveDependencies(ReusableTask* t) { // verify if the task type is compatible - if (typeid(t) != typeid(TaskSegmentation1)) { - std::cout << "[TaskSegmentation1] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; - } @@ -470,7 +461,9 @@ TaskSegmentation1::TaskSegmentation1(list args, RegionTemplate* i } -TaskSegmentation1::~TaskSegmentation1() {} +TaskSegmentation1::~TaskSegmentation1() { + +} bool TaskSegmentation1::run(int procType, int tid) { @@ -497,8 +490,8 @@ void TaskSegmentation1::updateDR(RegionTemplate* rt) { void TaskSegmentation1::updateInterStageArgs(ReusableTask* t) { // verify if the tasks are compatible - if (typeid(t) != typeid(this)) { - std::cout << "[TaskSegmentation1] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + if (dynamic_cast(t) == NULL) { + std::cout << "[TaskSegmentation1] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks: needed " << typeid(this).name() << " and got " << typeid(t).name() << std::endl; return; } @@ -509,8 +502,9 @@ void TaskSegmentation1::updateInterStageArgs(ReusableTask* t) { void TaskSegmentation1::resolveDependencies(ReusableTask* t) { // verify if the task type is compatible - if (typeid(t) != typeid(TaskSegmentation2)) { - std::cout << "[TaskSegmentation2] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + if (dynamic_cast(t) == NULL) { + std::cout << "[TaskSegmentation1] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks: needed " << typeid(this).name() << " and got " << typeid(t).name() << std::endl; + return; } @@ -640,7 +634,9 @@ TaskSegmentation2::TaskSegmentation2(list args, RegionTemplate* i } -TaskSegmentation2::~TaskSegmentation2() {} +TaskSegmentation2::~TaskSegmentation2() { + +} bool TaskSegmentation2::run(int procType, int tid) { @@ -666,8 +662,8 @@ void TaskSegmentation2::updateDR(RegionTemplate* rt) { void TaskSegmentation2::updateInterStageArgs(ReusableTask* t) { // verify if the tasks are compatible - if (typeid(t) != typeid(this)) { - std::cout << "[TaskSegmentation2] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + if (dynamic_cast(t) == NULL) { + std::cout << "[TaskSegmentation2] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks: needed " << typeid(this).name() << " and got " << typeid(t).name() << std::endl; return; } @@ -680,8 +676,9 @@ void TaskSegmentation2::updateInterStageArgs(ReusableTask* t) { void TaskSegmentation2::resolveDependencies(ReusableTask* t) { // verify if the task type is compatible - if (typeid(t) != typeid(TaskSegmentation3)) { - std::cout << "[TaskSegmentation3] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + if (dynamic_cast(t) == NULL) { + std::cout << "[TaskSegmentation2] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks: needed " << typeid(this).name() << " and got " << typeid(t).name() << std::endl; + return; } @@ -822,7 +819,9 @@ TaskSegmentation3::TaskSegmentation3(list args, RegionTemplate* i } -TaskSegmentation3::~TaskSegmentation3() {} +TaskSegmentation3::~TaskSegmentation3() { + +} bool TaskSegmentation3::run(int procType, int tid) { @@ -847,8 +846,8 @@ void TaskSegmentation3::updateDR(RegionTemplate* rt) { void TaskSegmentation3::updateInterStageArgs(ReusableTask* t) { // verify if the tasks are compatible - if (typeid(t) != typeid(this)) { - std::cout << "[TaskSegmentation3] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + if (dynamic_cast(t) == NULL) { + std::cout << "[TaskSegmentation3] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks: needed " << typeid(this).name() << " and got " << typeid(t).name() << std::endl; return; } @@ -860,8 +859,9 @@ void TaskSegmentation3::updateInterStageArgs(ReusableTask* t) { void TaskSegmentation3::resolveDependencies(ReusableTask* t) { // verify if the task type is compatible - if (typeid(t) != typeid(TaskSegmentation4)) { - std::cout << "[TaskSegmentation4] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + if (dynamic_cast(t) == NULL) { + std::cout << "[TaskSegmentation3] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks: needed " << typeid(this).name() << " and got " << typeid(t).name() << std::endl; + return; } @@ -996,7 +996,9 @@ TaskSegmentation4::TaskSegmentation4(list args, RegionTemplate* i } -TaskSegmentation4::~TaskSegmentation4() {} +TaskSegmentation4::~TaskSegmentation4() { + +} bool TaskSegmentation4::run(int procType, int tid) { @@ -1021,8 +1023,8 @@ void TaskSegmentation4::updateDR(RegionTemplate* rt) { void TaskSegmentation4::updateInterStageArgs(ReusableTask* t) { // verify if the tasks are compatible - if (typeid(t) != typeid(this)) { - std::cout << "[TaskSegmentation4] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + if (dynamic_cast(t) == NULL) { + std::cout << "[TaskSegmentation4] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks: needed " << typeid(this).name() << " and got " << typeid(t).name() << std::endl; return; } @@ -1034,8 +1036,9 @@ void TaskSegmentation4::updateInterStageArgs(ReusableTask* t) { void TaskSegmentation4::resolveDependencies(ReusableTask* t) { // verify if the task type is compatible - if (typeid(t) != typeid(TaskSegmentation5)) { - std::cout << "[TaskSegmentation5] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + if (dynamic_cast(t) == NULL) { + std::cout << "[TaskSegmentation4] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks: needed " << typeid(this).name() << " and got " << typeid(t).name() << std::endl; + return; } @@ -1175,7 +1178,7 @@ TaskSegmentation5::TaskSegmentation5(list args, RegionTemplate* i } TaskSegmentation5::~TaskSegmentation5() { - if (normalized_rt_temp.unique()) + if (normalized_rt_temp.unique() && mock) delete *normalized_rt_temp; } @@ -1198,21 +1201,18 @@ bool TaskSegmentation5::run(int procType, int tid) { } void TaskSegmentation5::updateDR(RegionTemplate* rt) { - string name = (*this->normalized_rt_temp)->getName(); - string sid = (*this->normalized_rt_temp)->getId(); - int id = stoi((*this->normalized_rt_temp)->getId()); + string name_normalized_rt_temp = (*this->normalized_rt_temp)->getName(); + string sid_normalized_rt_temp = (*this->normalized_rt_temp)->getId(); + int id_normalized_rt_temp = stoi((*this->normalized_rt_temp)->getId()); if (normalized_rt_temp != NULL) delete *normalized_rt_temp; - - normalized_rt_temp = std::make_shared( - dynamic_cast(rt->getDataRegion(name,sid, 0, id))); - + normalized_rt_temp = std::make_shared(dynamic_cast(rt->getDataRegion(name_normalized_rt_temp, sid_normalized_rt_temp, 0, id_normalized_rt_temp))); } void TaskSegmentation5::updateInterStageArgs(ReusableTask* t) { // verify if the tasks are compatible - if (typeid(t) != typeid(this)) { - std::cout << "[TaskSegmentation5] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + if (dynamic_cast(t) == NULL) { + std::cout << "[TaskSegmentation5] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks: needed " << typeid(this).name() << " and got " << typeid(t).name() << std::endl; return; } @@ -1222,8 +1222,9 @@ void TaskSegmentation5::updateInterStageArgs(ReusableTask* t) { void TaskSegmentation5::resolveDependencies(ReusableTask* t) { // verify if the task type is compatible - if (typeid(t) != typeid(TaskSegmentation6)) { - std::cout << "[TaskSegmentation6] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + if (dynamic_cast(t) == NULL) { + std::cout << "[TaskSegmentation5] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks: needed " << typeid(this).name() << " and got " << typeid(t).name() << std::endl; + return; } @@ -1440,8 +1441,8 @@ rt->insertDataRegion(*this->segmented_rt_temp); void TaskSegmentation6::updateInterStageArgs(ReusableTask* t) { // verify if the tasks are compatible - if (typeid(t) != typeid(this)) { - std::cout << "[TaskSegmentation6] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks." << std::endl; + if (dynamic_cast(t) == NULL) { + std::cout << "[TaskSegmentation6] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks: needed " << typeid(this).name() << " and got " << typeid(t).name() << std::endl; return; } @@ -1451,6 +1452,10 @@ void TaskSegmentation6::updateInterStageArgs(ReusableTask* t) { void TaskSegmentation6::resolveDependencies(ReusableTask* t) { // verify if the task type is compatible + if (dynamic_cast(t) == NULL) { + std::cout << "[TaskSegmentation6] " << __FILE__ << ":" << __LINE__ <<" incompatible tasks: needed " << typeid(this).name() << " and got " << typeid(t).name() << std::endl; + return; + } this->seg_nonoverlap = ((TaskSegmentation5*)t)->seg_nonoverlap; From d9b5d254c212921525e1cc06e9902a9a88f5b124 Mon Sep 17 00:00:00 2001 From: Willian Date: Thu, 27 Apr 2017 02:12:11 -0300 Subject: [PATCH 87/87] Forgot to add the jsoncpp source and to update the generator makefile. --- .../PipelineRTFS-NS-Diff-FGO/gen/Makefile | 4 +- .../gen/json/jsoncpp.cpp | 5247 +++++++++++++++++ 2 files changed, 5249 insertions(+), 2 deletions(-) create mode 100644 runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/json/jsoncpp.cpp diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/Makefile b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/Makefile index 132c370..a90d15b 100644 --- a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/Makefile +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/Makefile @@ -4,12 +4,12 @@ all: @g++ gen.cpp jsoncpp -std=c++11 -o gen.out @./gen.out -d segmentation_desc # @./gen.out -d normalization_desc - # @mv Segmentation.* .. + @mv Segmentation.* ../stages # @mv NormalizationComp.* .. debug: g++ -g -ggdb -gdwarf-2 gen.cpp jsoncpp -std=c++11 -o gen.out gen: @./gen.out -d segmentation_desc # @./gen.out -d normalization_desc - @mv Segmentation.* .. + @mv Segmentation.* ../stages # @mv NormalizationComp.* .. \ No newline at end of file diff --git a/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/json/jsoncpp.cpp b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/json/jsoncpp.cpp new file mode 100644 index 0000000..61ce71c --- /dev/null +++ b/runtime/regiontemplates/examples/PipelineRTFS-NS-Diff-FGO/gen/json/jsoncpp.cpp @@ -0,0 +1,5247 @@ +/// Json-cpp amalgated source (http://jsoncpp.sourceforge.net/). +/// It is intended to be used with #include "json/json.h" + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: LICENSE +// ////////////////////////////////////////////////////////////////////// + +/* +The JsonCpp library's source code, including accompanying documentation, +tests and demonstration applications, are licensed under the following +conditions... + +The author (Baptiste Lepilleur) explicitly disclaims copyright in all +jurisdictions which recognize such a disclaimer. In such jurisdictions, +this software is released into the Public Domain. + +In jurisdictions which do not recognize Public Domain property (e.g. Germany as of +2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur, and is +released under the terms of the MIT License (see below). + +In jurisdictions which recognize Public Domain property, the user of this +software may choose to accept it either as 1) Public Domain, 2) under the +conditions of the MIT License (see below), or 3) under the terms of dual +Public Domain/MIT License conditions described here, as they choose. + +The MIT License is about as close to Public Domain as a license can get, and is +described in clear, concise terms at: + + http://en.wikipedia.org/wiki/MIT_License + +The full text of the MIT License follows: + +======================================================================== +Copyright (c) 2007-2010 Baptiste Lepilleur + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, copy, +modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +======================================================================== +(END LICENSE TEXT) + +The MIT license is compatible with both the GPL and commercial +software, affording one all of the rights of Public Domain with the +minor nuisance of being required to keep the above copyright notice +and license text in the source code. Note also that by accepting the +Public Domain "license" you can re-license your copy using whatever +license you like. + +*/ + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: LICENSE +// ////////////////////////////////////////////////////////////////////// + + + + + + +#include "json.h" + +#ifndef JSON_IS_AMALGAMATION +#error "Compile with -I PATH_TO_JSON_DIRECTORY" +#endif + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: src/lib_json/json_tool.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef LIB_JSONCPP_JSON_TOOL_H_INCLUDED +#define LIB_JSONCPP_JSON_TOOL_H_INCLUDED + +/* This header provides common string manipulation support, such as UTF-8, + * portable conversion from/to string... + * + * It is an internal header that must not be exposed. + */ + +namespace Json { + +/// Converts a unicode code-point to UTF-8. +static inline JSONCPP_STRING codePointToUTF8(unsigned int cp) { + JSONCPP_STRING result; + + // based on description from http://en.wikipedia.org/wiki/UTF-8 + + if (cp <= 0x7f) { + result.resize(1); + result[0] = static_cast(cp); + } else if (cp <= 0x7FF) { + result.resize(2); + result[1] = static_cast(0x80 | (0x3f & cp)); + result[0] = static_cast(0xC0 | (0x1f & (cp >> 6))); + } else if (cp <= 0xFFFF) { + result.resize(3); + result[2] = static_cast(0x80 | (0x3f & cp)); + result[1] = static_cast(0x80 | (0x3f & (cp >> 6))); + result[0] = static_cast(0xE0 | (0xf & (cp >> 12))); + } else if (cp <= 0x10FFFF) { + result.resize(4); + result[3] = static_cast(0x80 | (0x3f & cp)); + result[2] = static_cast(0x80 | (0x3f & (cp >> 6))); + result[1] = static_cast(0x80 | (0x3f & (cp >> 12))); + result[0] = static_cast(0xF0 | (0x7 & (cp >> 18))); + } + + return result; +} + +/// Returns true if ch is a control character (in range [1,31]). +static inline bool isControlCharacter(char ch) { return ch > 0 && ch <= 0x1F; } + +enum { + /// Constant that specify the size of the buffer that must be passed to + /// uintToString. + uintToStringBufferSize = 3 * sizeof(LargestUInt) + 1 +}; + +// Defines a char buffer for use with uintToString(). +typedef char UIntToStringBuffer[uintToStringBufferSize]; + +/** Converts an unsigned integer to string. + * @param value Unsigned interger to convert to string + * @param current Input/Output string buffer. + * Must have at least uintToStringBufferSize chars free. + */ +static inline void uintToString(LargestUInt value, char*& current) { + *--current = 0; + do { + *--current = static_cast(value % 10U + static_cast('0')); + value /= 10; + } while (value != 0); +} + +/** Change ',' to '.' everywhere in buffer. + * + * We had a sophisticated way, but it did not work in WinCE. + * @see https://github.com/open-source-parsers/jsoncpp/pull/9 + */ +static inline void fixNumericLocale(char* begin, char* end) { + while (begin < end) { + if (*begin == ',') { + *begin = '.'; + } + ++begin; + } +} + +} // namespace Json { + +#endif // LIB_JSONCPP_JSON_TOOL_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: src/lib_json/json_tool.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: src/lib_json/json_reader.cpp +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2011 Baptiste Lepilleur +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include +#include "json_tool.h" +#endif // if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(_MSC_VER) +#if !defined(WINCE) && defined(__STDC_SECURE_LIB__) && _MSC_VER >= 1500 // VC++ 9.0 and above +#define snprintf sprintf_s +#elif _MSC_VER >= 1900 // VC++ 14.0 and above +#define snprintf std::snprintf +#else +#define snprintf _snprintf +#endif +#elif defined(__ANDROID__) || defined(__QNXNTO__) +#define snprintf snprintf +#elif __cplusplus >= 201103L +#if !defined(__MINGW32__) && !defined(__CYGWIN__) +#define snprintf std::snprintf +#endif +#endif + +#if defined(__QNXNTO__) +#define sscanf std::sscanf +#endif + +#if defined(_MSC_VER) && _MSC_VER >= 1400 // VC++ 8.0 +// Disable warning about strdup being deprecated. +#pragma warning(disable : 4996) +#endif + +static int const stackLimit_g = 1000; +static int stackDepth_g = 0; // see readValue() + +namespace Json { + +#if __cplusplus >= 201103L || (defined(_CPPLIB_VER) && _CPPLIB_VER >= 520) +typedef std::unique_ptr CharReaderPtr; +#else +typedef std::auto_ptr CharReaderPtr; +#endif + +// Implementation of class Features +// //////////////////////////////// + +Features::Features() + : allowComments_(true), strictRoot_(false), + allowDroppedNullPlaceholders_(false), allowNumericKeys_(false) {} + +Features Features::all() { return Features(); } + +Features Features::strictMode() { + Features features; + features.allowComments_ = false; + features.strictRoot_ = true; + features.allowDroppedNullPlaceholders_ = false; + features.allowNumericKeys_ = false; + return features; +} + +// Implementation of class Reader +// //////////////////////////////// + +static bool containsNewLine(Reader::Location begin, Reader::Location end) { + for (; begin < end; ++begin) + if (*begin == '\n' || *begin == '\r') + return true; + return false; +} + +// Class Reader +// ////////////////////////////////////////////////////////////////// + +Reader::Reader() + : errors_(), document_(), begin_(), end_(), current_(), lastValueEnd_(), + lastValue_(), commentsBefore_(), features_(Features::all()), + collectComments_() {} + +Reader::Reader(const Features& features) + : errors_(), document_(), begin_(), end_(), current_(), lastValueEnd_(), + lastValue_(), commentsBefore_(), features_(features), collectComments_() { +} + +bool +Reader::parse(const std::string& document, Value& root, bool collectComments) { + JSONCPP_STRING documentCopy(document.data(), document.data() + document.capacity()); + std::swap(documentCopy, document_); + const char* begin = document_.c_str(); + const char* end = begin + document_.length(); + return parse(begin, end, root, collectComments); +} + +bool Reader::parse(std::istream& sin, Value& root, bool collectComments) { + // std::istream_iterator begin(sin); + // std::istream_iterator end; + // Those would allow streamed input from a file, if parse() were a + // template function. + + // Since JSONCPP_STRING is reference-counted, this at least does not + // create an extra copy. + JSONCPP_STRING doc; + std::getline(sin, doc, (char)EOF); + return parse(doc.data(), doc.data() + doc.size(), root, collectComments); +} + +bool Reader::parse(const char* beginDoc, + const char* endDoc, + Value& root, + bool collectComments) { + if (!features_.allowComments_) { + collectComments = false; + } + + begin_ = beginDoc; + end_ = endDoc; + collectComments_ = collectComments; + current_ = begin_; + lastValueEnd_ = 0; + lastValue_ = 0; + commentsBefore_ = ""; + errors_.clear(); + while (!nodes_.empty()) + nodes_.pop(); + nodes_.push(&root); + + stackDepth_g = 0; // Yes, this is bad coding, but options are limited. + bool successful = readValue(); + Token token; + skipCommentTokens(token); + if (collectComments_ && !commentsBefore_.empty()) + root.setComment(commentsBefore_, commentAfter); + if (features_.strictRoot_) { + if (!root.isArray() && !root.isObject()) { + // Set error location to start of doc, ideally should be first token found + // in doc + token.type_ = tokenError; + token.start_ = beginDoc; + token.end_ = endDoc; + addError( + "A valid JSON document must be either an array or an object value.", + token); + return false; + } + } + return successful; +} + +bool Reader::readValue() { + // This is a non-reentrant way to support a stackLimit. Terrible! + // But this deprecated class has a security problem: Bad input can + // cause a seg-fault. This seems like a fair, binary-compatible way + // to prevent the problem. + if (stackDepth_g >= stackLimit_g) throwRuntimeError("Exceeded stackLimit in readValue()."); + ++stackDepth_g; + + Token token; + skipCommentTokens(token); + bool successful = true; + + if (collectComments_ && !commentsBefore_.empty()) { + currentValue().setComment(commentsBefore_, commentBefore); + commentsBefore_ = ""; + } + + switch (token.type_) { + case tokenObjectBegin: + successful = readObject(token); + currentValue().setOffsetLimit(current_ - begin_); + break; + case tokenArrayBegin: + successful = readArray(token); + currentValue().setOffsetLimit(current_ - begin_); + break; + case tokenNumber: + successful = decodeNumber(token); + break; + case tokenString: + successful = decodeString(token); + break; + case tokenTrue: + { + Value v(true); + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } + break; + case tokenFalse: + { + Value v(false); + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } + break; + case tokenNull: + { + Value v; + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } + break; + case tokenArraySeparator: + case tokenObjectEnd: + case tokenArrayEnd: + if (features_.allowDroppedNullPlaceholders_) { + // "Un-read" the current token and mark the current value as a null + // token. + current_--; + Value v; + currentValue().swapPayload(v); + currentValue().setOffsetStart(current_ - begin_ - 1); + currentValue().setOffsetLimit(current_ - begin_); + break; + } // Else, fall through... + default: + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + return addError("Syntax error: value, object or array expected.", token); + } + + if (collectComments_) { + lastValueEnd_ = current_; + lastValue_ = ¤tValue(); + } + + --stackDepth_g; + return successful; +} + +void Reader::skipCommentTokens(Token& token) { + if (features_.allowComments_) { + do { + readToken(token); + } while (token.type_ == tokenComment); + } else { + readToken(token); + } +} + +bool Reader::readToken(Token& token) { + skipSpaces(); + token.start_ = current_; + Char c = getNextChar(); + bool ok = true; + switch (c) { + case '{': + token.type_ = tokenObjectBegin; + break; + case '}': + token.type_ = tokenObjectEnd; + break; + case '[': + token.type_ = tokenArrayBegin; + break; + case ']': + token.type_ = tokenArrayEnd; + break; + case '"': + token.type_ = tokenString; + ok = readString(); + break; + case '/': + token.type_ = tokenComment; + ok = readComment(); + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '-': + token.type_ = tokenNumber; + readNumber(); + break; + case 't': + token.type_ = tokenTrue; + ok = match("rue", 3); + break; + case 'f': + token.type_ = tokenFalse; + ok = match("alse", 4); + break; + case 'n': + token.type_ = tokenNull; + ok = match("ull", 3); + break; + case ',': + token.type_ = tokenArraySeparator; + break; + case ':': + token.type_ = tokenMemberSeparator; + break; + case 0: + token.type_ = tokenEndOfStream; + break; + default: + ok = false; + break; + } + if (!ok) + token.type_ = tokenError; + token.end_ = current_; + return true; +} + +void Reader::skipSpaces() { + while (current_ != end_) { + Char c = *current_; + if (c == ' ' || c == '\t' || c == '\r' || c == '\n') + ++current_; + else + break; + } +} + +bool Reader::match(Location pattern, int patternLength) { + if (end_ - current_ < patternLength) + return false; + int index = patternLength; + while (index--) + if (current_[index] != pattern[index]) + return false; + current_ += patternLength; + return true; +} + +bool Reader::readComment() { + Location commentBegin = current_ - 1; + Char c = getNextChar(); + bool successful = false; + if (c == '*') + successful = readCStyleComment(); + else if (c == '/') + successful = readCppStyleComment(); + if (!successful) + return false; + + if (collectComments_) { + CommentPlacement placement = commentBefore; + if (lastValueEnd_ && !containsNewLine(lastValueEnd_, commentBegin)) { + if (c != '*' || !containsNewLine(commentBegin, current_)) + placement = commentAfterOnSameLine; + } + + addComment(commentBegin, current_, placement); + } + return true; +} + +static JSONCPP_STRING normalizeEOL(Reader::Location begin, Reader::Location end) { + JSONCPP_STRING normalized; + normalized.reserve(static_cast(end - begin)); + Reader::Location current = begin; + while (current != end) { + char c = *current++; + if (c == '\r') { + if (current != end && *current == '\n') + // convert dos EOL + ++current; + // convert Mac EOL + normalized += '\n'; + } else { + normalized += c; + } + } + return normalized; +} + +void +Reader::addComment(Location begin, Location end, CommentPlacement placement) { + assert(collectComments_); + const JSONCPP_STRING& normalized = normalizeEOL(begin, end); + if (placement == commentAfterOnSameLine) { + assert(lastValue_ != 0); + lastValue_->setComment(normalized, placement); + } else { + commentsBefore_ += normalized; + } +} + +bool Reader::readCStyleComment() { + while (current_ != end_) { + Char c = getNextChar(); + if (c == '*' && *current_ == '/') + break; + } + return getNextChar() == '/'; +} + +bool Reader::readCppStyleComment() { + while (current_ != end_) { + Char c = getNextChar(); + if (c == '\n') + break; + if (c == '\r') { + // Consume DOS EOL. It will be normalized in addComment. + if (current_ != end_ && *current_ == '\n') + getNextChar(); + // Break on Moc OS 9 EOL. + break; + } + } + return true; +} + +void Reader::readNumber() { + const char *p = current_; + char c = '0'; // stopgap for already consumed character + // integral part + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : 0; + // fractional part + if (c == '.') { + c = (current_ = p) < end_ ? *p++ : 0; + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : 0; + } + // exponential part + if (c == 'e' || c == 'E') { + c = (current_ = p) < end_ ? *p++ : 0; + if (c == '+' || c == '-') + c = (current_ = p) < end_ ? *p++ : 0; + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : 0; + } +} + +bool Reader::readString() { + Char c = 0; + while (current_ != end_) { + c = getNextChar(); + if (c == '\\') + getNextChar(); + else if (c == '"') + break; + } + return c == '"'; +} + +bool Reader::readObject(Token& tokenStart) { + Token tokenName; + JSONCPP_STRING name; + Value init(objectValue); + currentValue().swapPayload(init); + currentValue().setOffsetStart(tokenStart.start_ - begin_); + while (readToken(tokenName)) { + bool initialTokenOk = true; + while (tokenName.type_ == tokenComment && initialTokenOk) + initialTokenOk = readToken(tokenName); + if (!initialTokenOk) + break; + if (tokenName.type_ == tokenObjectEnd && name.empty()) // empty object + return true; + name = ""; + if (tokenName.type_ == tokenString) { + if (!decodeString(tokenName, name)) + return recoverFromError(tokenObjectEnd); + } else if (tokenName.type_ == tokenNumber && features_.allowNumericKeys_) { + Value numberName; + if (!decodeNumber(tokenName, numberName)) + return recoverFromError(tokenObjectEnd); + name = JSONCPP_STRING(numberName.asCString()); + } else { + break; + } + + Token colon; + if (!readToken(colon) || colon.type_ != tokenMemberSeparator) { + return addErrorAndRecover( + "Missing ':' after object member name", colon, tokenObjectEnd); + } + Value& value = currentValue()[name]; + nodes_.push(&value); + bool ok = readValue(); + nodes_.pop(); + if (!ok) // error already set + return recoverFromError(tokenObjectEnd); + + Token comma; + if (!readToken(comma) || + (comma.type_ != tokenObjectEnd && comma.type_ != tokenArraySeparator && + comma.type_ != tokenComment)) { + return addErrorAndRecover( + "Missing ',' or '}' in object declaration", comma, tokenObjectEnd); + } + bool finalizeTokenOk = true; + while (comma.type_ == tokenComment && finalizeTokenOk) + finalizeTokenOk = readToken(comma); + if (comma.type_ == tokenObjectEnd) + return true; + } + return addErrorAndRecover( + "Missing '}' or object member name", tokenName, tokenObjectEnd); +} + +bool Reader::readArray(Token& tokenStart) { + Value init(arrayValue); + currentValue().swapPayload(init); + currentValue().setOffsetStart(tokenStart.start_ - begin_); + skipSpaces(); + if (*current_ == ']') // empty array + { + Token endArray; + readToken(endArray); + return true; + } + int index = 0; + for (;;) { + Value& value = currentValue()[index++]; + nodes_.push(&value); + bool ok = readValue(); + nodes_.pop(); + if (!ok) // error already set + return recoverFromError(tokenArrayEnd); + + Token token; + // Accept Comment after last item in the array. + ok = readToken(token); + while (token.type_ == tokenComment && ok) { + ok = readToken(token); + } + bool badTokenType = + (token.type_ != tokenArraySeparator && token.type_ != tokenArrayEnd); + if (!ok || badTokenType) { + return addErrorAndRecover( + "Missing ',' or ']' in array declaration", token, tokenArrayEnd); + } + if (token.type_ == tokenArrayEnd) + break; + } + return true; +} + +bool Reader::decodeNumber(Token& token) { + Value decoded; + if (!decodeNumber(token, decoded)) + return false; + currentValue().swapPayload(decoded); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + return true; +} + +bool Reader::decodeNumber(Token& token, Value& decoded) { + // Attempts to parse the number as an integer. If the number is + // larger than the maximum supported value of an integer then + // we decode the number as a double. + Location current = token.start_; + bool isNegative = *current == '-'; + if (isNegative) + ++current; + // TODO: Help the compiler do the div and mod at compile time or get rid of them. + Value::LargestUInt maxIntegerValue = + isNegative ? Value::LargestUInt(Value::maxLargestInt) + 1 + : Value::maxLargestUInt; + Value::LargestUInt threshold = maxIntegerValue / 10; + Value::LargestUInt value = 0; + while (current < token.end_) { + Char c = *current++; + if (c < '0' || c > '9') + return decodeDouble(token, decoded); + Value::UInt digit(static_cast(c - '0')); + if (value >= threshold) { + // We've hit or exceeded the max value divided by 10 (rounded down). If + // a) we've only just touched the limit, b) this is the last digit, and + // c) it's small enough to fit in that rounding delta, we're okay. + // Otherwise treat this number as a double to avoid overflow. + if (value > threshold || current != token.end_ || + digit > maxIntegerValue % 10) { + return decodeDouble(token, decoded); + } + } + value = value * 10 + digit; + } + if (isNegative && value == maxIntegerValue) + decoded = Value::minLargestInt; + else if (isNegative) + decoded = -Value::LargestInt(value); + else if (value <= Value::LargestUInt(Value::maxInt)) + decoded = Value::LargestInt(value); + else + decoded = value; + return true; +} + +bool Reader::decodeDouble(Token& token) { + Value decoded; + if (!decodeDouble(token, decoded)) + return false; + currentValue().swapPayload(decoded); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + return true; +} + +bool Reader::decodeDouble(Token& token, Value& decoded) { + double value = 0; + JSONCPP_STRING buffer(token.start_, token.end_); + JSONCPP_ISTRINGSTREAM is(buffer); + if (!(is >> value)) + return addError("'" + JSONCPP_STRING(token.start_, token.end_) + + "' is not a number.", + token); + decoded = value; + return true; +} + +bool Reader::decodeString(Token& token) { + JSONCPP_STRING decoded_string; + if (!decodeString(token, decoded_string)) + return false; + Value decoded(decoded_string); + currentValue().swapPayload(decoded); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + return true; +} + +bool Reader::decodeString(Token& token, JSONCPP_STRING& decoded) { + decoded.reserve(static_cast(token.end_ - token.start_ - 2)); + Location current = token.start_ + 1; // skip '"' + Location end = token.end_ - 1; // do not include '"' + while (current != end) { + Char c = *current++; + if (c == '"') + break; + else if (c == '\\') { + if (current == end) + return addError("Empty escape sequence in string", token, current); + Char escape = *current++; + switch (escape) { + case '"': + decoded += '"'; + break; + case '/': + decoded += '/'; + break; + case '\\': + decoded += '\\'; + break; + case 'b': + decoded += '\b'; + break; + case 'f': + decoded += '\f'; + break; + case 'n': + decoded += '\n'; + break; + case 'r': + decoded += '\r'; + break; + case 't': + decoded += '\t'; + break; + case 'u': { + unsigned int unicode; + if (!decodeUnicodeCodePoint(token, current, end, unicode)) + return false; + decoded += codePointToUTF8(unicode); + } break; + default: + return addError("Bad escape sequence in string", token, current); + } + } else { + decoded += c; + } + } + return true; +} + +bool Reader::decodeUnicodeCodePoint(Token& token, + Location& current, + Location end, + unsigned int& unicode) { + + if (!decodeUnicodeEscapeSequence(token, current, end, unicode)) + return false; + if (unicode >= 0xD800 && unicode <= 0xDBFF) { + // surrogate pairs + if (end - current < 6) + return addError( + "additional six characters expected to parse unicode surrogate pair.", + token, + current); + unsigned int surrogatePair; + if (*(current++) == '\\' && *(current++) == 'u') { + if (decodeUnicodeEscapeSequence(token, current, end, surrogatePair)) { + unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF); + } else + return false; + } else + return addError("expecting another \\u token to begin the second half of " + "a unicode surrogate pair", + token, + current); + } + return true; +} + +bool Reader::decodeUnicodeEscapeSequence(Token& token, + Location& current, + Location end, + unsigned int& ret_unicode) { + if (end - current < 4) + return addError( + "Bad unicode escape sequence in string: four digits expected.", + token, + current); + int unicode = 0; + for (int index = 0; index < 4; ++index) { + Char c = *current++; + unicode *= 16; + if (c >= '0' && c <= '9') + unicode += c - '0'; + else if (c >= 'a' && c <= 'f') + unicode += c - 'a' + 10; + else if (c >= 'A' && c <= 'F') + unicode += c - 'A' + 10; + else + return addError( + "Bad unicode escape sequence in string: hexadecimal digit expected.", + token, + current); + } + ret_unicode = static_cast(unicode); + return true; +} + +bool +Reader::addError(const JSONCPP_STRING& message, Token& token, Location extra) { + ErrorInfo info; + info.token_ = token; + info.message_ = message; + info.extra_ = extra; + errors_.push_back(info); + return false; +} + +bool Reader::recoverFromError(TokenType skipUntilToken) { + size_t const errorCount = errors_.size(); + Token skip; + for (;;) { + if (!readToken(skip)) + errors_.resize(errorCount); // discard errors caused by recovery + if (skip.type_ == skipUntilToken || skip.type_ == tokenEndOfStream) + break; + } + errors_.resize(errorCount); + return false; +} + +bool Reader::addErrorAndRecover(const JSONCPP_STRING& message, + Token& token, + TokenType skipUntilToken) { + addError(message, token); + return recoverFromError(skipUntilToken); +} + +Value& Reader::currentValue() { return *(nodes_.top()); } + +Reader::Char Reader::getNextChar() { + if (current_ == end_) + return 0; + return *current_++; +} + +void Reader::getLocationLineAndColumn(Location location, + int& line, + int& column) const { + Location current = begin_; + Location lastLineStart = current; + line = 0; + while (current < location && current != end_) { + Char c = *current++; + if (c == '\r') { + if (*current == '\n') + ++current; + lastLineStart = current; + ++line; + } else if (c == '\n') { + lastLineStart = current; + ++line; + } + } + // column & line start at 1 + column = int(location - lastLineStart) + 1; + ++line; +} + +JSONCPP_STRING Reader::getLocationLineAndColumn(Location location) const { + int line, column; + getLocationLineAndColumn(location, line, column); + char buffer[18 + 16 + 16 + 1]; + snprintf(buffer, sizeof(buffer), "Line %d, Column %d", line, column); + return buffer; +} + +// Deprecated. Preserved for backward compatibility +JSONCPP_STRING Reader::getFormatedErrorMessages() const { + return getFormattedErrorMessages(); +} + +JSONCPP_STRING Reader::getFormattedErrorMessages() const { + JSONCPP_STRING formattedMessage; + for (Errors::const_iterator itError = errors_.begin(); + itError != errors_.end(); + ++itError) { + const ErrorInfo& error = *itError; + formattedMessage += + "* " + getLocationLineAndColumn(error.token_.start_) + "\n"; + formattedMessage += " " + error.message_ + "\n"; + if (error.extra_) + formattedMessage += + "See " + getLocationLineAndColumn(error.extra_) + " for detail.\n"; + } + return formattedMessage; +} + +std::vector Reader::getStructuredErrors() const { + std::vector allErrors; + for (Errors::const_iterator itError = errors_.begin(); + itError != errors_.end(); + ++itError) { + const ErrorInfo& error = *itError; + Reader::StructuredError structured; + structured.offset_start = error.token_.start_ - begin_; + structured.offset_limit = error.token_.end_ - begin_; + structured.message = error.message_; + allErrors.push_back(structured); + } + return allErrors; +} + +bool Reader::pushError(const Value& value, const JSONCPP_STRING& message) { + ptrdiff_t const length = end_ - begin_; + if(value.getOffsetStart() > length + || value.getOffsetLimit() > length) + return false; + Token token; + token.type_ = tokenError; + token.start_ = begin_ + value.getOffsetStart(); + token.end_ = end_ + value.getOffsetLimit(); + ErrorInfo info; + info.token_ = token; + info.message_ = message; + info.extra_ = 0; + errors_.push_back(info); + return true; +} + +bool Reader::pushError(const Value& value, const JSONCPP_STRING& message, const Value& extra) { + ptrdiff_t const length = end_ - begin_; + if(value.getOffsetStart() > length + || value.getOffsetLimit() > length + || extra.getOffsetLimit() > length) + return false; + Token token; + token.type_ = tokenError; + token.start_ = begin_ + value.getOffsetStart(); + token.end_ = begin_ + value.getOffsetLimit(); + ErrorInfo info; + info.token_ = token; + info.message_ = message; + info.extra_ = begin_ + extra.getOffsetStart(); + errors_.push_back(info); + return true; +} + +bool Reader::good() const { + return !errors_.size(); +} + +// exact copy of Features +class OurFeatures { +public: + static OurFeatures all(); + bool allowComments_; + bool strictRoot_; + bool allowDroppedNullPlaceholders_; + bool allowNumericKeys_; + bool allowSingleQuotes_; + bool failIfExtra_; + bool rejectDupKeys_; + bool allowSpecialFloats_; + int stackLimit_; +}; // OurFeatures + +// exact copy of Implementation of class Features +// //////////////////////////////// + +OurFeatures OurFeatures::all() { return OurFeatures(); } + +// Implementation of class Reader +// //////////////////////////////// + +// exact copy of Reader, renamed to OurReader +class OurReader { +public: + typedef char Char; + typedef const Char* Location; + struct StructuredError { + ptrdiff_t offset_start; + ptrdiff_t offset_limit; + JSONCPP_STRING message; + }; + + OurReader(OurFeatures const& features); + bool parse(const char* beginDoc, + const char* endDoc, + Value& root, + bool collectComments = true); + JSONCPP_STRING getFormattedErrorMessages() const; + std::vector getStructuredErrors() const; + bool pushError(const Value& value, const JSONCPP_STRING& message); + bool pushError(const Value& value, const JSONCPP_STRING& message, const Value& extra); + bool good() const; + +private: + OurReader(OurReader const&); // no impl + void operator=(OurReader const&); // no impl + + enum TokenType { + tokenEndOfStream = 0, + tokenObjectBegin, + tokenObjectEnd, + tokenArrayBegin, + tokenArrayEnd, + tokenString, + tokenNumber, + tokenTrue, + tokenFalse, + tokenNull, + tokenNaN, + tokenPosInf, + tokenNegInf, + tokenArraySeparator, + tokenMemberSeparator, + tokenComment, + tokenError + }; + + class Token { + public: + TokenType type_; + Location start_; + Location end_; + }; + + class ErrorInfo { + public: + Token token_; + JSONCPP_STRING message_; + Location extra_; + }; + + typedef std::deque Errors; + + bool readToken(Token& token); + void skipSpaces(); + bool match(Location pattern, int patternLength); + bool readComment(); + bool readCStyleComment(); + bool readCppStyleComment(); + bool readString(); + bool readStringSingleQuote(); + bool readNumber(bool checkInf); + bool readValue(); + bool readObject(Token& token); + bool readArray(Token& token); + bool decodeNumber(Token& token); + bool decodeNumber(Token& token, Value& decoded); + bool decodeString(Token& token); + bool decodeString(Token& token, JSONCPP_STRING& decoded); + bool decodeDouble(Token& token); + bool decodeDouble(Token& token, Value& decoded); + bool decodeUnicodeCodePoint(Token& token, + Location& current, + Location end, + unsigned int& unicode); + bool decodeUnicodeEscapeSequence(Token& token, + Location& current, + Location end, + unsigned int& unicode); + bool addError(const JSONCPP_STRING& message, Token& token, Location extra = 0); + bool recoverFromError(TokenType skipUntilToken); + bool addErrorAndRecover(const JSONCPP_STRING& message, + Token& token, + TokenType skipUntilToken); + void skipUntilSpace(); + Value& currentValue(); + Char getNextChar(); + void + getLocationLineAndColumn(Location location, int& line, int& column) const; + JSONCPP_STRING getLocationLineAndColumn(Location location) const; + void addComment(Location begin, Location end, CommentPlacement placement); + void skipCommentTokens(Token& token); + + typedef std::stack Nodes; + Nodes nodes_; + Errors errors_; + JSONCPP_STRING document_; + Location begin_; + Location end_; + Location current_; + Location lastValueEnd_; + Value* lastValue_; + JSONCPP_STRING commentsBefore_; + int stackDepth_; + + OurFeatures const features_; + bool collectComments_; +}; // OurReader + +// complete copy of Read impl, for OurReader + +OurReader::OurReader(OurFeatures const& features) + : errors_(), document_(), begin_(), end_(), current_(), lastValueEnd_(), + lastValue_(), commentsBefore_(), + stackDepth_(0), + features_(features), collectComments_() { +} + +bool OurReader::parse(const char* beginDoc, + const char* endDoc, + Value& root, + bool collectComments) { + if (!features_.allowComments_) { + collectComments = false; + } + + begin_ = beginDoc; + end_ = endDoc; + collectComments_ = collectComments; + current_ = begin_; + lastValueEnd_ = 0; + lastValue_ = 0; + commentsBefore_ = ""; + errors_.clear(); + while (!nodes_.empty()) + nodes_.pop(); + nodes_.push(&root); + + stackDepth_ = 0; + bool successful = readValue(); + Token token; + skipCommentTokens(token); + if (features_.failIfExtra_) { + if (token.type_ != tokenError && token.type_ != tokenEndOfStream) { + addError("Extra non-whitespace after JSON value.", token); + return false; + } + } + if (collectComments_ && !commentsBefore_.empty()) + root.setComment(commentsBefore_, commentAfter); + if (features_.strictRoot_) { + if (!root.isArray() && !root.isObject()) { + // Set error location to start of doc, ideally should be first token found + // in doc + token.type_ = tokenError; + token.start_ = beginDoc; + token.end_ = endDoc; + addError( + "A valid JSON document must be either an array or an object value.", + token); + return false; + } + } + return successful; +} + +bool OurReader::readValue() { + if (stackDepth_ >= features_.stackLimit_) throwRuntimeError("Exceeded stackLimit in readValue()."); + ++stackDepth_; + Token token; + skipCommentTokens(token); + bool successful = true; + + if (collectComments_ && !commentsBefore_.empty()) { + currentValue().setComment(commentsBefore_, commentBefore); + commentsBefore_ = ""; + } + + switch (token.type_) { + case tokenObjectBegin: + successful = readObject(token); + currentValue().setOffsetLimit(current_ - begin_); + break; + case tokenArrayBegin: + successful = readArray(token); + currentValue().setOffsetLimit(current_ - begin_); + break; + case tokenNumber: + successful = decodeNumber(token); + break; + case tokenString: + successful = decodeString(token); + break; + case tokenTrue: + { + Value v(true); + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } + break; + case tokenFalse: + { + Value v(false); + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } + break; + case tokenNull: + { + Value v; + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } + break; + case tokenNaN: + { + Value v(std::numeric_limits::quiet_NaN()); + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } + break; + case tokenPosInf: + { + Value v(std::numeric_limits::infinity()); + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } + break; + case tokenNegInf: + { + Value v(-std::numeric_limits::infinity()); + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } + break; + case tokenArraySeparator: + case tokenObjectEnd: + case tokenArrayEnd: + if (features_.allowDroppedNullPlaceholders_) { + // "Un-read" the current token and mark the current value as a null + // token. + current_--; + Value v; + currentValue().swapPayload(v); + currentValue().setOffsetStart(current_ - begin_ - 1); + currentValue().setOffsetLimit(current_ - begin_); + break; + } // else, fall through ... + default: + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + return addError("Syntax error: value, object or array expected.", token); + } + + if (collectComments_) { + lastValueEnd_ = current_; + lastValue_ = ¤tValue(); + } + + --stackDepth_; + return successful; +} + +void OurReader::skipCommentTokens(Token& token) { + if (features_.allowComments_) { + do { + readToken(token); + } while (token.type_ == tokenComment); + } else { + readToken(token); + } +} + +bool OurReader::readToken(Token& token) { + skipSpaces(); + token.start_ = current_; + Char c = getNextChar(); + bool ok = true; + switch (c) { + case '{': + token.type_ = tokenObjectBegin; + break; + case '}': + token.type_ = tokenObjectEnd; + break; + case '[': + token.type_ = tokenArrayBegin; + break; + case ']': + token.type_ = tokenArrayEnd; + break; + case '"': + token.type_ = tokenString; + ok = readString(); + break; + case '\'': + if (features_.allowSingleQuotes_) { + token.type_ = tokenString; + ok = readStringSingleQuote(); + break; + } // else continue + case '/': + token.type_ = tokenComment; + ok = readComment(); + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + token.type_ = tokenNumber; + readNumber(false); + break; + case '-': + if (readNumber(true)) { + token.type_ = tokenNumber; + } else { + token.type_ = tokenNegInf; + ok = features_.allowSpecialFloats_ && match("nfinity", 7); + } + break; + case 't': + token.type_ = tokenTrue; + ok = match("rue", 3); + break; + case 'f': + token.type_ = tokenFalse; + ok = match("alse", 4); + break; + case 'n': + token.type_ = tokenNull; + ok = match("ull", 3); + break; + case 'N': + if (features_.allowSpecialFloats_) { + token.type_ = tokenNaN; + ok = match("aN", 2); + } else { + ok = false; + } + break; + case 'I': + if (features_.allowSpecialFloats_) { + token.type_ = tokenPosInf; + ok = match("nfinity", 7); + } else { + ok = false; + } + break; + case ',': + token.type_ = tokenArraySeparator; + break; + case ':': + token.type_ = tokenMemberSeparator; + break; + case 0: + token.type_ = tokenEndOfStream; + break; + default: + ok = false; + break; + } + if (!ok) + token.type_ = tokenError; + token.end_ = current_; + return true; +} + +void OurReader::skipSpaces() { + while (current_ != end_) { + Char c = *current_; + if (c == ' ' || c == '\t' || c == '\r' || c == '\n') + ++current_; + else + break; + } +} + +bool OurReader::match(Location pattern, int patternLength) { + if (end_ - current_ < patternLength) + return false; + int index = patternLength; + while (index--) + if (current_[index] != pattern[index]) + return false; + current_ += patternLength; + return true; +} + +bool OurReader::readComment() { + Location commentBegin = current_ - 1; + Char c = getNextChar(); + bool successful = false; + if (c == '*') + successful = readCStyleComment(); + else if (c == '/') + successful = readCppStyleComment(); + if (!successful) + return false; + + if (collectComments_) { + CommentPlacement placement = commentBefore; + if (lastValueEnd_ && !containsNewLine(lastValueEnd_, commentBegin)) { + if (c != '*' || !containsNewLine(commentBegin, current_)) + placement = commentAfterOnSameLine; + } + + addComment(commentBegin, current_, placement); + } + return true; +} + +void +OurReader::addComment(Location begin, Location end, CommentPlacement placement) { + assert(collectComments_); + const JSONCPP_STRING& normalized = normalizeEOL(begin, end); + if (placement == commentAfterOnSameLine) { + assert(lastValue_ != 0); + lastValue_->setComment(normalized, placement); + } else { + commentsBefore_ += normalized; + } +} + +bool OurReader::readCStyleComment() { + while (current_ != end_) { + Char c = getNextChar(); + if (c == '*' && *current_ == '/') + break; + } + return getNextChar() == '/'; +} + +bool OurReader::readCppStyleComment() { + while (current_ != end_) { + Char c = getNextChar(); + if (c == '\n') + break; + if (c == '\r') { + // Consume DOS EOL. It will be normalized in addComment. + if (current_ != end_ && *current_ == '\n') + getNextChar(); + // Break on Moc OS 9 EOL. + break; + } + } + return true; +} + +bool OurReader::readNumber(bool checkInf) { + const char *p = current_; + if (checkInf && p != end_ && *p == 'I') { + current_ = ++p; + return false; + } + char c = '0'; // stopgap for already consumed character + // integral part + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : 0; + // fractional part + if (c == '.') { + c = (current_ = p) < end_ ? *p++ : 0; + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : 0; + } + // exponential part + if (c == 'e' || c == 'E') { + c = (current_ = p) < end_ ? *p++ : 0; + if (c == '+' || c == '-') + c = (current_ = p) < end_ ? *p++ : 0; + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : 0; + } + return true; +} +bool OurReader::readString() { + Char c = 0; + while (current_ != end_) { + c = getNextChar(); + if (c == '\\') + getNextChar(); + else if (c == '"') + break; + } + return c == '"'; +} + + +bool OurReader::readStringSingleQuote() { + Char c = 0; + while (current_ != end_) { + c = getNextChar(); + if (c == '\\') + getNextChar(); + else if (c == '\'') + break; + } + return c == '\''; +} + +bool OurReader::readObject(Token& tokenStart) { + Token tokenName; + JSONCPP_STRING name; + Value init(objectValue); + currentValue().swapPayload(init); + currentValue().setOffsetStart(tokenStart.start_ - begin_); + while (readToken(tokenName)) { + bool initialTokenOk = true; + while (tokenName.type_ == tokenComment && initialTokenOk) + initialTokenOk = readToken(tokenName); + if (!initialTokenOk) + break; + if (tokenName.type_ == tokenObjectEnd && name.empty()) // empty object + return true; + name = ""; + if (tokenName.type_ == tokenString) { + if (!decodeString(tokenName, name)) + return recoverFromError(tokenObjectEnd); + } else if (tokenName.type_ == tokenNumber && features_.allowNumericKeys_) { + Value numberName; + if (!decodeNumber(tokenName, numberName)) + return recoverFromError(tokenObjectEnd); + name = numberName.asString(); + } else { + break; + } + + Token colon; + if (!readToken(colon) || colon.type_ != tokenMemberSeparator) { + return addErrorAndRecover( + "Missing ':' after object member name", colon, tokenObjectEnd); + } + if (name.length() >= (1U<<30)) throwRuntimeError("keylength >= 2^30"); + if (features_.rejectDupKeys_ && currentValue().isMember(name)) { + JSONCPP_STRING msg = "Duplicate key: '" + name + "'"; + return addErrorAndRecover( + msg, tokenName, tokenObjectEnd); + } + Value& value = currentValue()[name]; + nodes_.push(&value); + bool ok = readValue(); + nodes_.pop(); + if (!ok) // error already set + return recoverFromError(tokenObjectEnd); + + Token comma; + if (!readToken(comma) || + (comma.type_ != tokenObjectEnd && comma.type_ != tokenArraySeparator && + comma.type_ != tokenComment)) { + return addErrorAndRecover( + "Missing ',' or '}' in object declaration", comma, tokenObjectEnd); + } + bool finalizeTokenOk = true; + while (comma.type_ == tokenComment && finalizeTokenOk) + finalizeTokenOk = readToken(comma); + if (comma.type_ == tokenObjectEnd) + return true; + } + return addErrorAndRecover( + "Missing '}' or object member name", tokenName, tokenObjectEnd); +} + +bool OurReader::readArray(Token& tokenStart) { + Value init(arrayValue); + currentValue().swapPayload(init); + currentValue().setOffsetStart(tokenStart.start_ - begin_); + skipSpaces(); + if (*current_ == ']') // empty array + { + Token endArray; + readToken(endArray); + return true; + } + int index = 0; + for (;;) { + Value& value = currentValue()[index++]; + nodes_.push(&value); + bool ok = readValue(); + nodes_.pop(); + if (!ok) // error already set + return recoverFromError(tokenArrayEnd); + + Token token; + // Accept Comment after last item in the array. + ok = readToken(token); + while (token.type_ == tokenComment && ok) { + ok = readToken(token); + } + bool badTokenType = + (token.type_ != tokenArraySeparator && token.type_ != tokenArrayEnd); + if (!ok || badTokenType) { + return addErrorAndRecover( + "Missing ',' or ']' in array declaration", token, tokenArrayEnd); + } + if (token.type_ == tokenArrayEnd) + break; + } + return true; +} + +bool OurReader::decodeNumber(Token& token) { + Value decoded; + if (!decodeNumber(token, decoded)) + return false; + currentValue().swapPayload(decoded); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + return true; +} + +bool OurReader::decodeNumber(Token& token, Value& decoded) { + // Attempts to parse the number as an integer. If the number is + // larger than the maximum supported value of an integer then + // we decode the number as a double. + Location current = token.start_; + bool isNegative = *current == '-'; + if (isNegative) + ++current; + // TODO: Help the compiler do the div and mod at compile time or get rid of them. + Value::LargestUInt maxIntegerValue = + isNegative ? Value::LargestUInt(-Value::minLargestInt) + : Value::maxLargestUInt; + Value::LargestUInt threshold = maxIntegerValue / 10; + Value::LargestUInt value = 0; + while (current < token.end_) { + Char c = *current++; + if (c < '0' || c > '9') + return decodeDouble(token, decoded); + Value::UInt digit(static_cast(c - '0')); + if (value >= threshold) { + // We've hit or exceeded the max value divided by 10 (rounded down). If + // a) we've only just touched the limit, b) this is the last digit, and + // c) it's small enough to fit in that rounding delta, we're okay. + // Otherwise treat this number as a double to avoid overflow. + if (value > threshold || current != token.end_ || + digit > maxIntegerValue % 10) { + return decodeDouble(token, decoded); + } + } + value = value * 10 + digit; + } + if (isNegative) + decoded = -Value::LargestInt(value); + else if (value <= Value::LargestUInt(Value::maxInt)) + decoded = Value::LargestInt(value); + else + decoded = value; + return true; +} + +bool OurReader::decodeDouble(Token& token) { + Value decoded; + if (!decodeDouble(token, decoded)) + return false; + currentValue().swapPayload(decoded); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + return true; +} + +bool OurReader::decodeDouble(Token& token, Value& decoded) { + double value = 0; + const int bufferSize = 32; + int count; + ptrdiff_t const length = token.end_ - token.start_; + + // Sanity check to avoid buffer overflow exploits. + if (length < 0) { + return addError("Unable to parse token length", token); + } + size_t const ulength = static_cast(length); + + // Avoid using a string constant for the format control string given to + // sscanf, as this can cause hard to debug crashes on OS X. See here for more + // info: + // + // http://developer.apple.com/library/mac/#DOCUMENTATION/DeveloperTools/gcc-4.0.1/gcc/Incompatibilities.html + char format[] = "%lf"; + + if (length <= bufferSize) { + Char buffer[bufferSize + 1]; + memcpy(buffer, token.start_, ulength); + buffer[length] = 0; + count = sscanf(buffer, format, &value); + } else { + JSONCPP_STRING buffer(token.start_, token.end_); + count = sscanf(buffer.c_str(), format, &value); + } + + if (count != 1) + return addError("'" + JSONCPP_STRING(token.start_, token.end_) + + "' is not a number.", + token); + decoded = value; + return true; +} + +bool OurReader::decodeString(Token& token) { + JSONCPP_STRING decoded_string; + if (!decodeString(token, decoded_string)) + return false; + Value decoded(decoded_string); + currentValue().swapPayload(decoded); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + return true; +} + +bool OurReader::decodeString(Token& token, JSONCPP_STRING& decoded) { + decoded.reserve(static_cast(token.end_ - token.start_ - 2)); + Location current = token.start_ + 1; // skip '"' + Location end = token.end_ - 1; // do not include '"' + while (current != end) { + Char c = *current++; + if (c == '"') + break; + else if (c == '\\') { + if (current == end) + return addError("Empty escape sequence in string", token, current); + Char escape = *current++; + switch (escape) { + case '"': + decoded += '"'; + break; + case '/': + decoded += '/'; + break; + case '\\': + decoded += '\\'; + break; + case 'b': + decoded += '\b'; + break; + case 'f': + decoded += '\f'; + break; + case 'n': + decoded += '\n'; + break; + case 'r': + decoded += '\r'; + break; + case 't': + decoded += '\t'; + break; + case 'u': { + unsigned int unicode; + if (!decodeUnicodeCodePoint(token, current, end, unicode)) + return false; + decoded += codePointToUTF8(unicode); + } break; + default: + return addError("Bad escape sequence in string", token, current); + } + } else { + decoded += c; + } + } + return true; +} + +bool OurReader::decodeUnicodeCodePoint(Token& token, + Location& current, + Location end, + unsigned int& unicode) { + + if (!decodeUnicodeEscapeSequence(token, current, end, unicode)) + return false; + if (unicode >= 0xD800 && unicode <= 0xDBFF) { + // surrogate pairs + if (end - current < 6) + return addError( + "additional six characters expected to parse unicode surrogate pair.", + token, + current); + unsigned int surrogatePair; + if (*(current++) == '\\' && *(current++) == 'u') { + if (decodeUnicodeEscapeSequence(token, current, end, surrogatePair)) { + unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF); + } else + return false; + } else + return addError("expecting another \\u token to begin the second half of " + "a unicode surrogate pair", + token, + current); + } + return true; +} + +bool OurReader::decodeUnicodeEscapeSequence(Token& token, + Location& current, + Location end, + unsigned int& ret_unicode) { + if (end - current < 4) + return addError( + "Bad unicode escape sequence in string: four digits expected.", + token, + current); + int unicode = 0; + for (int index = 0; index < 4; ++index) { + Char c = *current++; + unicode *= 16; + if (c >= '0' && c <= '9') + unicode += c - '0'; + else if (c >= 'a' && c <= 'f') + unicode += c - 'a' + 10; + else if (c >= 'A' && c <= 'F') + unicode += c - 'A' + 10; + else + return addError( + "Bad unicode escape sequence in string: hexadecimal digit expected.", + token, + current); + } + ret_unicode = static_cast(unicode); + return true; +} + +bool +OurReader::addError(const JSONCPP_STRING& message, Token& token, Location extra) { + ErrorInfo info; + info.token_ = token; + info.message_ = message; + info.extra_ = extra; + errors_.push_back(info); + return false; +} + +bool OurReader::recoverFromError(TokenType skipUntilToken) { + size_t errorCount = errors_.size(); + Token skip; + for (;;) { + if (!readToken(skip)) + errors_.resize(errorCount); // discard errors caused by recovery + if (skip.type_ == skipUntilToken || skip.type_ == tokenEndOfStream) + break; + } + errors_.resize(errorCount); + return false; +} + +bool OurReader::addErrorAndRecover(const JSONCPP_STRING& message, + Token& token, + TokenType skipUntilToken) { + addError(message, token); + return recoverFromError(skipUntilToken); +} + +Value& OurReader::currentValue() { return *(nodes_.top()); } + +OurReader::Char OurReader::getNextChar() { + if (current_ == end_) + return 0; + return *current_++; +} + +void OurReader::getLocationLineAndColumn(Location location, + int& line, + int& column) const { + Location current = begin_; + Location lastLineStart = current; + line = 0; + while (current < location && current != end_) { + Char c = *current++; + if (c == '\r') { + if (*current == '\n') + ++current; + lastLineStart = current; + ++line; + } else if (c == '\n') { + lastLineStart = current; + ++line; + } + } + // column & line start at 1 + column = int(location - lastLineStart) + 1; + ++line; +} + +JSONCPP_STRING OurReader::getLocationLineAndColumn(Location location) const { + int line, column; + getLocationLineAndColumn(location, line, column); + char buffer[18 + 16 + 16 + 1]; + snprintf(buffer, sizeof(buffer), "Line %d, Column %d", line, column); + return buffer; +} + +JSONCPP_STRING OurReader::getFormattedErrorMessages() const { + JSONCPP_STRING formattedMessage; + for (Errors::const_iterator itError = errors_.begin(); + itError != errors_.end(); + ++itError) { + const ErrorInfo& error = *itError; + formattedMessage += + "* " + getLocationLineAndColumn(error.token_.start_) + "\n"; + formattedMessage += " " + error.message_ + "\n"; + if (error.extra_) + formattedMessage += + "See " + getLocationLineAndColumn(error.extra_) + " for detail.\n"; + } + return formattedMessage; +} + +std::vector OurReader::getStructuredErrors() const { + std::vector allErrors; + for (Errors::const_iterator itError = errors_.begin(); + itError != errors_.end(); + ++itError) { + const ErrorInfo& error = *itError; + OurReader::StructuredError structured; + structured.offset_start = error.token_.start_ - begin_; + structured.offset_limit = error.token_.end_ - begin_; + structured.message = error.message_; + allErrors.push_back(structured); + } + return allErrors; +} + +bool OurReader::pushError(const Value& value, const JSONCPP_STRING& message) { + ptrdiff_t length = end_ - begin_; + if(value.getOffsetStart() > length + || value.getOffsetLimit() > length) + return false; + Token token; + token.type_ = tokenError; + token.start_ = begin_ + value.getOffsetStart(); + token.end_ = end_ + value.getOffsetLimit(); + ErrorInfo info; + info.token_ = token; + info.message_ = message; + info.extra_ = 0; + errors_.push_back(info); + return true; +} + +bool OurReader::pushError(const Value& value, const JSONCPP_STRING& message, const Value& extra) { + ptrdiff_t length = end_ - begin_; + if(value.getOffsetStart() > length + || value.getOffsetLimit() > length + || extra.getOffsetLimit() > length) + return false; + Token token; + token.type_ = tokenError; + token.start_ = begin_ + value.getOffsetStart(); + token.end_ = begin_ + value.getOffsetLimit(); + ErrorInfo info; + info.token_ = token; + info.message_ = message; + info.extra_ = begin_ + extra.getOffsetStart(); + errors_.push_back(info); + return true; +} + +bool OurReader::good() const { + return !errors_.size(); +} + + +class OurCharReader : public CharReader { + bool const collectComments_; + OurReader reader_; +public: + OurCharReader( + bool collectComments, + OurFeatures const& features) + : collectComments_(collectComments) + , reader_(features) + {} + bool parse( + char const* beginDoc, char const* endDoc, + Value* root, JSONCPP_STRING* errs) JSONCPP_OVERRIDE { + bool ok = reader_.parse(beginDoc, endDoc, *root, collectComments_); + if (errs) { + *errs = reader_.getFormattedErrorMessages(); + } + return ok; + } +}; + +CharReaderBuilder::CharReaderBuilder() +{ + setDefaults(&settings_); +} +CharReaderBuilder::~CharReaderBuilder() +{} +CharReader* CharReaderBuilder::newCharReader() const +{ + bool collectComments = settings_["collectComments"].asBool(); + OurFeatures features = OurFeatures::all(); + features.allowComments_ = settings_["allowComments"].asBool(); + features.strictRoot_ = settings_["strictRoot"].asBool(); + features.allowDroppedNullPlaceholders_ = settings_["allowDroppedNullPlaceholders"].asBool(); + features.allowNumericKeys_ = settings_["allowNumericKeys"].asBool(); + features.allowSingleQuotes_ = settings_["allowSingleQuotes"].asBool(); + features.stackLimit_ = settings_["stackLimit"].asInt(); + features.failIfExtra_ = settings_["failIfExtra"].asBool(); + features.rejectDupKeys_ = settings_["rejectDupKeys"].asBool(); + features.allowSpecialFloats_ = settings_["allowSpecialFloats"].asBool(); + return new OurCharReader(collectComments, features); +} +static void getValidReaderKeys(std::set* valid_keys) +{ + valid_keys->clear(); + valid_keys->insert("collectComments"); + valid_keys->insert("allowComments"); + valid_keys->insert("strictRoot"); + valid_keys->insert("allowDroppedNullPlaceholders"); + valid_keys->insert("allowNumericKeys"); + valid_keys->insert("allowSingleQuotes"); + valid_keys->insert("stackLimit"); + valid_keys->insert("failIfExtra"); + valid_keys->insert("rejectDupKeys"); + valid_keys->insert("allowSpecialFloats"); +} +bool CharReaderBuilder::validate(Json::Value* invalid) const +{ + Json::Value my_invalid; + if (!invalid) invalid = &my_invalid; // so we do not need to test for NULL + Json::Value& inv = *invalid; + std::set valid_keys; + getValidReaderKeys(&valid_keys); + Value::Members keys = settings_.getMemberNames(); + size_t n = keys.size(); + for (size_t i = 0; i < n; ++i) { + JSONCPP_STRING const& key = keys[i]; + if (valid_keys.find(key) == valid_keys.end()) { + inv[key] = settings_[key]; + } + } + return 0u == inv.size(); +} +Value& CharReaderBuilder::operator[](JSONCPP_STRING key) +{ + return settings_[key]; +} +// static +void CharReaderBuilder::strictMode(Json::Value* settings) +{ +//! [CharReaderBuilderStrictMode] + (*settings)["allowComments"] = false; + (*settings)["strictRoot"] = true; + (*settings)["allowDroppedNullPlaceholders"] = false; + (*settings)["allowNumericKeys"] = false; + (*settings)["allowSingleQuotes"] = false; + (*settings)["stackLimit"] = 1000; + (*settings)["failIfExtra"] = true; + (*settings)["rejectDupKeys"] = true; + (*settings)["allowSpecialFloats"] = false; +//! [CharReaderBuilderStrictMode] +} +// static +void CharReaderBuilder::setDefaults(Json::Value* settings) +{ +//! [CharReaderBuilderDefaults] + (*settings)["collectComments"] = true; + (*settings)["allowComments"] = true; + (*settings)["strictRoot"] = false; + (*settings)["allowDroppedNullPlaceholders"] = false; + (*settings)["allowNumericKeys"] = false; + (*settings)["allowSingleQuotes"] = false; + (*settings)["stackLimit"] = 1000; + (*settings)["failIfExtra"] = false; + (*settings)["rejectDupKeys"] = false; + (*settings)["allowSpecialFloats"] = false; +//! [CharReaderBuilderDefaults] +} + +////////////////////////////////// +// global functions + +bool parseFromStream( + CharReader::Factory const& fact, JSONCPP_ISTREAM& sin, + Value* root, JSONCPP_STRING* errs) +{ + JSONCPP_OSTRINGSTREAM ssin; + ssin << sin.rdbuf(); + JSONCPP_STRING doc = ssin.str(); + char const* begin = doc.data(); + char const* end = begin + doc.size(); + // Note that we do not actually need a null-terminator. + CharReaderPtr const reader(fact.newCharReader()); + return reader->parse(begin, end, root, errs); +} + +JSONCPP_ISTREAM& operator>>(JSONCPP_ISTREAM& sin, Value& root) { + CharReaderBuilder b; + JSONCPP_STRING errs; + bool ok = parseFromStream(b, sin, &root, &errs); + if (!ok) { + fprintf(stderr, + "Error from reader: %s", + errs.c_str()); + + throwRuntimeError(errs); + } + return sin; +} + +} // namespace Json + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: src/lib_json/json_reader.cpp +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: src/lib_json/json_valueiterator.inl +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +// included by json_value.cpp + +namespace Json { + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class ValueIteratorBase +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +ValueIteratorBase::ValueIteratorBase() + : current_(), isNull_(true) { +} + +ValueIteratorBase::ValueIteratorBase( + const Value::ObjectValues::iterator& current) + : current_(current), isNull_(false) {} + +Value& ValueIteratorBase::deref() const { + return current_->second; +} + +void ValueIteratorBase::increment() { + ++current_; +} + +void ValueIteratorBase::decrement() { + --current_; +} + +ValueIteratorBase::difference_type +ValueIteratorBase::computeDistance(const SelfType& other) const { +#ifdef JSON_USE_CPPTL_SMALLMAP + return other.current_ - current_; +#else + // Iterator for null value are initialized using the default + // constructor, which initialize current_ to the default + // std::map::iterator. As begin() and end() are two instance + // of the default std::map::iterator, they can not be compared. + // To allow this, we handle this comparison specifically. + if (isNull_ && other.isNull_) { + return 0; + } + + // Usage of std::distance is not portable (does not compile with Sun Studio 12 + // RogueWave STL, + // which is the one used by default). + // Using a portable hand-made version for non random iterator instead: + // return difference_type( std::distance( current_, other.current_ ) ); + difference_type myDistance = 0; + for (Value::ObjectValues::iterator it = current_; it != other.current_; + ++it) { + ++myDistance; + } + return myDistance; +#endif +} + +bool ValueIteratorBase::isEqual(const SelfType& other) const { + if (isNull_) { + return other.isNull_; + } + return current_ == other.current_; +} + +void ValueIteratorBase::copy(const SelfType& other) { + current_ = other.current_; + isNull_ = other.isNull_; +} + +Value ValueIteratorBase::key() const { + const Value::CZString czstring = (*current_).first; + if (czstring.data()) { + if (czstring.isStaticString()) + return Value(StaticString(czstring.data())); + return Value(czstring.data(), czstring.data() + czstring.length()); + } + return Value(czstring.index()); +} + +UInt ValueIteratorBase::index() const { + const Value::CZString czstring = (*current_).first; + if (!czstring.data()) + return czstring.index(); + return Value::UInt(-1); +} + +JSONCPP_STRING ValueIteratorBase::name() const { + char const* keey; + char const* end; + keey = memberName(&end); + if (!keey) return JSONCPP_STRING(); + return JSONCPP_STRING(keey, end); +} + +char const* ValueIteratorBase::memberName() const { + const char* cname = (*current_).first.data(); + return cname ? cname : ""; +} + +char const* ValueIteratorBase::memberName(char const** end) const { + const char* cname = (*current_).first.data(); + if (!cname) { + *end = NULL; + return NULL; + } + *end = cname + (*current_).first.length(); + return cname; +} + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class ValueConstIterator +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +ValueConstIterator::ValueConstIterator() {} + +ValueConstIterator::ValueConstIterator( + const Value::ObjectValues::iterator& current) + : ValueIteratorBase(current) {} + +ValueConstIterator::ValueConstIterator(ValueIterator const& other) + : ValueIteratorBase(other) {} + +ValueConstIterator& ValueConstIterator:: +operator=(const ValueIteratorBase& other) { + copy(other); + return *this; +} + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class ValueIterator +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +ValueIterator::ValueIterator() {} + +ValueIterator::ValueIterator(const Value::ObjectValues::iterator& current) + : ValueIteratorBase(current) {} + +ValueIterator::ValueIterator(const ValueConstIterator& other) + : ValueIteratorBase(other) { + throwRuntimeError("ConstIterator to Iterator should never be allowed."); +} + +ValueIterator::ValueIterator(const ValueIterator& other) + : ValueIteratorBase(other) {} + +ValueIterator& ValueIterator::operator=(const SelfType& other) { + copy(other); + return *this; +} + +} // namespace Json + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: src/lib_json/json_valueiterator.inl +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: src/lib_json/json_value.cpp +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2011 Baptiste Lepilleur +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include +#endif // if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include +#include +#include +#ifdef JSON_USE_CPPTL +#include +#endif +#include // size_t +#include // min() + +#define JSON_ASSERT_UNREACHABLE assert(false) + +namespace Json { + +// This is a walkaround to avoid the static initialization of Value::null. +// kNull must be word-aligned to avoid crashing on ARM. We use an alignment of +// 8 (instead of 4) as a bit of future-proofing. +#if defined(__ARMEL__) +#define ALIGNAS(byte_alignment) __attribute__((aligned(byte_alignment))) +#else +#define ALIGNAS(byte_alignment) +#endif +static const unsigned char ALIGNAS(8) kNull[sizeof(Value)] = { 0 }; +const unsigned char& kNullRef = kNull[0]; +const Value& Value::null = reinterpret_cast(kNullRef); +const Value& Value::nullRef = null; + +const Int Value::minInt = Int(~(UInt(-1) / 2)); +const Int Value::maxInt = Int(UInt(-1) / 2); +const UInt Value::maxUInt = UInt(-1); +#if defined(JSON_HAS_INT64) +const Int64 Value::minInt64 = Int64(~(UInt64(-1) / 2)); +const Int64 Value::maxInt64 = Int64(UInt64(-1) / 2); +const UInt64 Value::maxUInt64 = UInt64(-1); +// The constant is hard-coded because some compiler have trouble +// converting Value::maxUInt64 to a double correctly (AIX/xlC). +// Assumes that UInt64 is a 64 bits integer. +static const double maxUInt64AsDouble = 18446744073709551615.0; +#endif // defined(JSON_HAS_INT64) +const LargestInt Value::minLargestInt = LargestInt(~(LargestUInt(-1) / 2)); +const LargestInt Value::maxLargestInt = LargestInt(LargestUInt(-1) / 2); +const LargestUInt Value::maxLargestUInt = LargestUInt(-1); + +#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) +template +static inline bool InRange(double d, T min, U max) { + // The casts can lose precision, but we are looking only for + // an approximate range. Might fail on edge cases though. ~cdunn + //return d >= static_cast(min) && d <= static_cast(max); + return d >= min && d <= max; +} +#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) +static inline double integerToDouble(Json::UInt64 value) { + return static_cast(Int64(value / 2)) * 2.0 + static_cast(Int64(value & 1)); +} + +template static inline double integerToDouble(T value) { + return static_cast(value); +} + +template +static inline bool InRange(double d, T min, U max) { + return d >= integerToDouble(min) && d <= integerToDouble(max); +} +#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + +/** Duplicates the specified string value. + * @param value Pointer to the string to duplicate. Must be zero-terminated if + * length is "unknown". + * @param length Length of the value. if equals to unknown, then it will be + * computed using strlen(value). + * @return Pointer on the duplicate instance of string. + */ +static inline char* duplicateStringValue(const char* value, + size_t length) +{ + // Avoid an integer overflow in the call to malloc below by limiting length + // to a sane value. + if (length >= static_cast(Value::maxInt)) + length = Value::maxInt - 1; + + char* newString = static_cast(malloc(length + 1)); + if (newString == NULL) { + throwRuntimeError( + "in Json::Value::duplicateStringValue(): " + "Failed to allocate string value buffer"); + } + memcpy(newString, value, length); + newString[length] = 0; + return newString; +} + +/* Record the length as a prefix. + */ +static inline char* duplicateAndPrefixStringValue( + const char* value, + unsigned int length) +{ + // Avoid an integer overflow in the call to malloc below by limiting length + // to a sane value. + JSON_ASSERT_MESSAGE(length <= static_cast(Value::maxInt) - sizeof(unsigned) - 1U, + "in Json::Value::duplicateAndPrefixStringValue(): " + "length too big for prefixing"); + unsigned actualLength = length + static_cast(sizeof(unsigned)) + 1U; + char* newString = static_cast(malloc(actualLength)); + if (newString == 0) { + throwRuntimeError( + "in Json::Value::duplicateAndPrefixStringValue(): " + "Failed to allocate string value buffer"); + } + *reinterpret_cast(newString) = length; + memcpy(newString + sizeof(unsigned), value, length); + newString[actualLength - 1U] = 0; // to avoid buffer over-run accidents by users later + return newString; +} +inline static void decodePrefixedString( + bool isPrefixed, char const* prefixed, + unsigned* length, char const** value) +{ + if (!isPrefixed) { + *length = static_cast(strlen(prefixed)); + *value = prefixed; + } else { + *length = *reinterpret_cast(prefixed); + *value = prefixed + sizeof(unsigned); + } +} +/** Free the string duplicated by duplicateStringValue()/duplicateAndPrefixStringValue(). + */ +#if JSONCPP_USING_SECURE_MEMORY +static inline void releasePrefixedStringValue(char* value) { + unsigned length = 0; + char const* valueDecoded; + decodePrefixedString(true, value, &length, &valueDecoded); + size_t const size = sizeof(unsigned) + length + 1U; + memset(value, 0, size); + free(value); +} +static inline void releaseStringValue(char* value, unsigned length) { + // length==0 => we allocated the strings memory + size_t size = (length==0) ? strlen(value) : length; + memset(value, 0, size); + free(value); +} +#else // !JSONCPP_USING_SECURE_MEMORY +static inline void releasePrefixedStringValue(char* value) { + free(value); +} +static inline void releaseStringValue(char* value, unsigned length) { + free(value); +} +#endif // JSONCPP_USING_SECURE_MEMORY + +} // namespace Json + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ValueInternals... +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +#if !defined(JSON_IS_AMALGAMATION) + +#include "json_valueiterator.inl" +#endif // if !defined(JSON_IS_AMALGAMATION) + +namespace Json { + +Exception::Exception(JSONCPP_STRING const& msg) + : msg_(msg) +{} +Exception::~Exception() throw() +{} +char const* Exception::what() const throw() +{ + return msg_.c_str(); +} +RuntimeError::RuntimeError(JSONCPP_STRING const& msg) + : Exception(msg) +{} +LogicError::LogicError(JSONCPP_STRING const& msg) + : Exception(msg) +{} +JSONCPP_NORETURN void throwRuntimeError(JSONCPP_STRING const& msg) +{ + throw RuntimeError(msg); +} +JSONCPP_NORETURN void throwLogicError(JSONCPP_STRING const& msg) +{ + throw LogicError(msg); +} + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class Value::CommentInfo +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +Value::CommentInfo::CommentInfo() : comment_(0) +{} + +Value::CommentInfo::~CommentInfo() { + if (comment_) + releaseStringValue(comment_, 0u); +} + +void Value::CommentInfo::setComment(const char* text, size_t len) { + if (comment_) { + releaseStringValue(comment_, 0u); + comment_ = 0; + } + JSON_ASSERT(text != 0); + JSON_ASSERT_MESSAGE( + text[0] == '\0' || text[0] == '/', + "in Json::Value::setComment(): Comments must start with /"); + // It seems that /**/ style comments are acceptable as well. + comment_ = duplicateStringValue(text, len); +} + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class Value::CZString +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +// Notes: policy_ indicates if the string was allocated when +// a string is stored. + +Value::CZString::CZString(ArrayIndex aindex) : cstr_(0), index_(aindex) {} + +Value::CZString::CZString(char const* str, unsigned ulength, DuplicationPolicy allocate) + : cstr_(str) { + // allocate != duplicate + storage_.policy_ = allocate & 0x3; + storage_.length_ = ulength & 0x3FFFFFFF; +} + +Value::CZString::CZString(const CZString& other) { + cstr_ = (other.storage_.policy_ != noDuplication && other.cstr_ != 0 + ? duplicateStringValue(other.cstr_, other.storage_.length_) + : other.cstr_); + storage_.policy_ = static_cast(other.cstr_ + ? (static_cast(other.storage_.policy_) == noDuplication + ? noDuplication : duplicate) + : static_cast(other.storage_.policy_)) & 3U; + storage_.length_ = other.storage_.length_; +} + +#if JSON_HAS_RVALUE_REFERENCES +Value::CZString::CZString(CZString&& other) + : cstr_(other.cstr_), index_(other.index_) { + other.cstr_ = nullptr; +} +#endif + +Value::CZString::~CZString() { + if (cstr_ && storage_.policy_ == duplicate) { + releaseStringValue(const_cast(cstr_), storage_.length_ + 1u); //+1 for null terminating character for sake of completeness but not actually necessary + } +} + +void Value::CZString::swap(CZString& other) { + std::swap(cstr_, other.cstr_); + std::swap(index_, other.index_); +} + +Value::CZString& Value::CZString::operator=(CZString other) { + swap(other); + return *this; +} + +bool Value::CZString::operator<(const CZString& other) const { + if (!cstr_) return index_ < other.index_; + //return strcmp(cstr_, other.cstr_) < 0; + // Assume both are strings. + unsigned this_len = this->storage_.length_; + unsigned other_len = other.storage_.length_; + unsigned min_len = std::min(this_len, other_len); + JSON_ASSERT(this->cstr_ && other.cstr_); + int comp = memcmp(this->cstr_, other.cstr_, min_len); + if (comp < 0) return true; + if (comp > 0) return false; + return (this_len < other_len); +} + +bool Value::CZString::operator==(const CZString& other) const { + if (!cstr_) return index_ == other.index_; + //return strcmp(cstr_, other.cstr_) == 0; + // Assume both are strings. + unsigned this_len = this->storage_.length_; + unsigned other_len = other.storage_.length_; + if (this_len != other_len) return false; + JSON_ASSERT(this->cstr_ && other.cstr_); + int comp = memcmp(this->cstr_, other.cstr_, this_len); + return comp == 0; +} + +ArrayIndex Value::CZString::index() const { return index_; } + +//const char* Value::CZString::c_str() const { return cstr_; } +const char* Value::CZString::data() const { return cstr_; } +unsigned Value::CZString::length() const { return storage_.length_; } +bool Value::CZString::isStaticString() const { return storage_.policy_ == noDuplication; } + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class Value::Value +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +/*! \internal Default constructor initialization must be equivalent to: + * memset( this, 0, sizeof(Value) ) + * This optimization is used in ValueInternalMap fast allocator. + */ +Value::Value(ValueType vtype) { + initBasic(vtype); + switch (vtype) { + case nullValue: + break; + case intValue: + case uintValue: + value_.int_ = 0; + break; + case realValue: + value_.real_ = 0.0; + break; + case stringValue: + value_.string_ = 0; + break; + case arrayValue: + case objectValue: + value_.map_ = new ObjectValues(); + break; + case booleanValue: + value_.bool_ = false; + break; + default: + JSON_ASSERT_UNREACHABLE; + } +} + +Value::Value(Int value) { + initBasic(intValue); + value_.int_ = value; +} + +Value::Value(UInt value) { + initBasic(uintValue); + value_.uint_ = value; +} +#if defined(JSON_HAS_INT64) +Value::Value(Int64 value) { + initBasic(intValue); + value_.int_ = value; +} +Value::Value(UInt64 value) { + initBasic(uintValue); + value_.uint_ = value; +} +#endif // defined(JSON_HAS_INT64) + +Value::Value(double value) { + initBasic(realValue); + value_.real_ = value; +} + +Value::Value(const char* value) { + initBasic(stringValue, true); + value_.string_ = duplicateAndPrefixStringValue(value, static_cast(strlen(value))); +} + +Value::Value(const char* beginValue, const char* endValue) { + initBasic(stringValue, true); + value_.string_ = + duplicateAndPrefixStringValue(beginValue, static_cast(endValue - beginValue)); +} + +Value::Value(const JSONCPP_STRING& value) { + initBasic(stringValue, true); + value_.string_ = + duplicateAndPrefixStringValue(value.data(), static_cast(value.length())); +} + +Value::Value(const StaticString& value) { + initBasic(stringValue); + value_.string_ = const_cast(value.c_str()); +} + +#ifdef JSON_USE_CPPTL +Value::Value(const CppTL::ConstString& value) { + initBasic(stringValue, true); + value_.string_ = duplicateAndPrefixStringValue(value, static_cast(value.length())); +} +#endif + +Value::Value(bool value) { + initBasic(booleanValue); + value_.bool_ = value; +} + +Value::Value(Value const& other) + : type_(other.type_), allocated_(false) + , + comments_(0), start_(other.start_), limit_(other.limit_) +{ + switch (type_) { + case nullValue: + case intValue: + case uintValue: + case realValue: + case booleanValue: + value_ = other.value_; + break; + case stringValue: + if (other.value_.string_ && other.allocated_) { + unsigned len; + char const* str; + decodePrefixedString(other.allocated_, other.value_.string_, + &len, &str); + value_.string_ = duplicateAndPrefixStringValue(str, len); + allocated_ = true; + } else { + value_.string_ = other.value_.string_; + allocated_ = false; + } + break; + case arrayValue: + case objectValue: + value_.map_ = new ObjectValues(*other.value_.map_); + break; + default: + JSON_ASSERT_UNREACHABLE; + } + if (other.comments_) { + comments_ = new CommentInfo[numberOfCommentPlacement]; + for (int comment = 0; comment < numberOfCommentPlacement; ++comment) { + const CommentInfo& otherComment = other.comments_[comment]; + if (otherComment.comment_) + comments_[comment].setComment( + otherComment.comment_, strlen(otherComment.comment_)); + } + } +} + +#if JSON_HAS_RVALUE_REFERENCES +// Move constructor +Value::Value(Value&& other) { + initBasic(nullValue); + swap(other); +} +#endif + +Value::~Value() { + switch (type_) { + case nullValue: + case intValue: + case uintValue: + case realValue: + case booleanValue: + break; + case stringValue: + if (allocated_) + releasePrefixedStringValue(value_.string_); + break; + case arrayValue: + case objectValue: + delete value_.map_; + break; + default: + JSON_ASSERT_UNREACHABLE; + } + + if (comments_) + delete[] comments_; + + value_.uint_ = 0; +} + +Value& Value::operator=(Value other) { + swap(other); + return *this; +} + +void Value::swapPayload(Value& other) { + ValueType temp = type_; + type_ = other.type_; + other.type_ = temp; + std::swap(value_, other.value_); + int temp2 = allocated_; + allocated_ = other.allocated_; + other.allocated_ = temp2 & 0x1; +} + +void Value::swap(Value& other) { + swapPayload(other); + std::swap(comments_, other.comments_); + std::swap(start_, other.start_); + std::swap(limit_, other.limit_); +} + +ValueType Value::type() const { return type_; } + +int Value::compare(const Value& other) const { + if (*this < other) + return -1; + if (*this > other) + return 1; + return 0; +} + +bool Value::operator<(const Value& other) const { + int typeDelta = type_ - other.type_; + if (typeDelta) + return typeDelta < 0 ? true : false; + switch (type_) { + case nullValue: + return false; + case intValue: + return value_.int_ < other.value_.int_; + case uintValue: + return value_.uint_ < other.value_.uint_; + case realValue: + return value_.real_ < other.value_.real_; + case booleanValue: + return value_.bool_ < other.value_.bool_; + case stringValue: + { + if ((value_.string_ == 0) || (other.value_.string_ == 0)) { + if (other.value_.string_) return true; + else return false; + } + unsigned this_len; + unsigned other_len; + char const* this_str; + char const* other_str; + decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str); + decodePrefixedString(other.allocated_, other.value_.string_, &other_len, &other_str); + unsigned min_len = std::min(this_len, other_len); + JSON_ASSERT(this_str && other_str); + int comp = memcmp(this_str, other_str, min_len); + if (comp < 0) return true; + if (comp > 0) return false; + return (this_len < other_len); + } + case arrayValue: + case objectValue: { + int delta = int(value_.map_->size() - other.value_.map_->size()); + if (delta) + return delta < 0; + return (*value_.map_) < (*other.value_.map_); + } + default: + JSON_ASSERT_UNREACHABLE; + } + return false; // unreachable +} + +bool Value::operator<=(const Value& other) const { return !(other < *this); } + +bool Value::operator>=(const Value& other) const { return !(*this < other); } + +bool Value::operator>(const Value& other) const { return other < *this; } + +bool Value::operator==(const Value& other) const { + // if ( type_ != other.type_ ) + // GCC 2.95.3 says: + // attempt to take address of bit-field structure member `Json::Value::type_' + // Beats me, but a temp solves the problem. + int temp = other.type_; + if (type_ != temp) + return false; + switch (type_) { + case nullValue: + return true; + case intValue: + return value_.int_ == other.value_.int_; + case uintValue: + return value_.uint_ == other.value_.uint_; + case realValue: + return value_.real_ == other.value_.real_; + case booleanValue: + return value_.bool_ == other.value_.bool_; + case stringValue: + { + if ((value_.string_ == 0) || (other.value_.string_ == 0)) { + return (value_.string_ == other.value_.string_); + } + unsigned this_len; + unsigned other_len; + char const* this_str; + char const* other_str; + decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str); + decodePrefixedString(other.allocated_, other.value_.string_, &other_len, &other_str); + if (this_len != other_len) return false; + JSON_ASSERT(this_str && other_str); + int comp = memcmp(this_str, other_str, this_len); + return comp == 0; + } + case arrayValue: + case objectValue: + return value_.map_->size() == other.value_.map_->size() && + (*value_.map_) == (*other.value_.map_); + default: + JSON_ASSERT_UNREACHABLE; + } + return false; // unreachable +} + +bool Value::operator!=(const Value& other) const { return !(*this == other); } + +const char* Value::asCString() const { + JSON_ASSERT_MESSAGE(type_ == stringValue, + "in Json::Value::asCString(): requires stringValue"); + if (value_.string_ == 0) return 0; + unsigned this_len; + char const* this_str; + decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str); + return this_str; +} + +#if JSONCPP_USING_SECURE_MEMORY +unsigned Value::getCStringLength() const { + JSON_ASSERT_MESSAGE(type_ == stringValue, + "in Json::Value::asCString(): requires stringValue"); + if (value_.string_ == 0) return 0; + unsigned this_len; + char const* this_str; + decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str); + return this_len; +} +#endif + +bool Value::getString(char const** str, char const** cend) const { + if (type_ != stringValue) return false; + if (value_.string_ == 0) return false; + unsigned length; + decodePrefixedString(this->allocated_, this->value_.string_, &length, str); + *cend = *str + length; + return true; +} + +JSONCPP_STRING Value::asString() const { + switch (type_) { + case nullValue: + return ""; + case stringValue: + { + if (value_.string_ == 0) return ""; + unsigned this_len; + char const* this_str; + decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str); + return JSONCPP_STRING(this_str, this_len); + } + case booleanValue: + return value_.bool_ ? "true" : "false"; + case intValue: + return valueToString(value_.int_); + case uintValue: + return valueToString(value_.uint_); + case realValue: + return valueToString(value_.real_); + default: + JSON_FAIL_MESSAGE("Type is not convertible to string"); + } +} + +#ifdef JSON_USE_CPPTL +CppTL::ConstString Value::asConstString() const { + unsigned len; + char const* str; + decodePrefixedString(allocated_, value_.string_, + &len, &str); + return CppTL::ConstString(str, len); +} +#endif + +Value::Int Value::asInt() const { + switch (type_) { + case intValue: + JSON_ASSERT_MESSAGE(isInt(), "LargestInt out of Int range"); + return Int(value_.int_); + case uintValue: + JSON_ASSERT_MESSAGE(isInt(), "LargestUInt out of Int range"); + return Int(value_.uint_); + case realValue: + JSON_ASSERT_MESSAGE(InRange(value_.real_, minInt, maxInt), + "double out of Int range"); + return Int(value_.real_); + case nullValue: + return 0; + case booleanValue: + return value_.bool_ ? 1 : 0; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to Int."); +} + +Value::UInt Value::asUInt() const { + switch (type_) { + case intValue: + JSON_ASSERT_MESSAGE(isUInt(), "LargestInt out of UInt range"); + return UInt(value_.int_); + case uintValue: + JSON_ASSERT_MESSAGE(isUInt(), "LargestUInt out of UInt range"); + return UInt(value_.uint_); + case realValue: + JSON_ASSERT_MESSAGE(InRange(value_.real_, 0, maxUInt), + "double out of UInt range"); + return UInt(value_.real_); + case nullValue: + return 0; + case booleanValue: + return value_.bool_ ? 1 : 0; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to UInt."); +} + +#if defined(JSON_HAS_INT64) + +Value::Int64 Value::asInt64() const { + switch (type_) { + case intValue: + return Int64(value_.int_); + case uintValue: + JSON_ASSERT_MESSAGE(isInt64(), "LargestUInt out of Int64 range"); + return Int64(value_.uint_); + case realValue: + JSON_ASSERT_MESSAGE(InRange(value_.real_, minInt64, maxInt64), + "double out of Int64 range"); + return Int64(value_.real_); + case nullValue: + return 0; + case booleanValue: + return value_.bool_ ? 1 : 0; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to Int64."); +} + +Value::UInt64 Value::asUInt64() const { + switch (type_) { + case intValue: + JSON_ASSERT_MESSAGE(isUInt64(), "LargestInt out of UInt64 range"); + return UInt64(value_.int_); + case uintValue: + return UInt64(value_.uint_); + case realValue: + JSON_ASSERT_MESSAGE(InRange(value_.real_, 0, maxUInt64), + "double out of UInt64 range"); + return UInt64(value_.real_); + case nullValue: + return 0; + case booleanValue: + return value_.bool_ ? 1 : 0; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to UInt64."); +} +#endif // if defined(JSON_HAS_INT64) + +LargestInt Value::asLargestInt() const { +#if defined(JSON_NO_INT64) + return asInt(); +#else + return asInt64(); +#endif +} + +LargestUInt Value::asLargestUInt() const { +#if defined(JSON_NO_INT64) + return asUInt(); +#else + return asUInt64(); +#endif +} + +double Value::asDouble() const { + switch (type_) { + case intValue: + return static_cast(value_.int_); + case uintValue: +#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + return static_cast(value_.uint_); +#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + return integerToDouble(value_.uint_); +#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + case realValue: + return value_.real_; + case nullValue: + return 0.0; + case booleanValue: + return value_.bool_ ? 1.0 : 0.0; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to double."); +} + +float Value::asFloat() const { + switch (type_) { + case intValue: + return static_cast(value_.int_); + case uintValue: +#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + return static_cast(value_.uint_); +#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + // This can fail (silently?) if the value is bigger than MAX_FLOAT. + return static_cast(integerToDouble(value_.uint_)); +#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + case realValue: + return static_cast(value_.real_); + case nullValue: + return 0.0; + case booleanValue: + return value_.bool_ ? 1.0f : 0.0f; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to float."); +} + +bool Value::asBool() const { + switch (type_) { + case booleanValue: + return value_.bool_; + case nullValue: + return false; + case intValue: + return value_.int_ ? true : false; + case uintValue: + return value_.uint_ ? true : false; + case realValue: + // This is kind of strange. Not recommended. + return (value_.real_ != 0.0) ? true : false; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to bool."); +} + +bool Value::isConvertibleTo(ValueType other) const { + switch (other) { + case nullValue: + return (isNumeric() && asDouble() == 0.0) || + (type_ == booleanValue && value_.bool_ == false) || + (type_ == stringValue && asString() == "") || + (type_ == arrayValue && value_.map_->size() == 0) || + (type_ == objectValue && value_.map_->size() == 0) || + type_ == nullValue; + case intValue: + return isInt() || + (type_ == realValue && InRange(value_.real_, minInt, maxInt)) || + type_ == booleanValue || type_ == nullValue; + case uintValue: + return isUInt() || + (type_ == realValue && InRange(value_.real_, 0, maxUInt)) || + type_ == booleanValue || type_ == nullValue; + case realValue: + return isNumeric() || type_ == booleanValue || type_ == nullValue; + case booleanValue: + return isNumeric() || type_ == booleanValue || type_ == nullValue; + case stringValue: + return isNumeric() || type_ == booleanValue || type_ == stringValue || + type_ == nullValue; + case arrayValue: + return type_ == arrayValue || type_ == nullValue; + case objectValue: + return type_ == objectValue || type_ == nullValue; + } + JSON_ASSERT_UNREACHABLE; + return false; +} + +/// Number of values in array or object +ArrayIndex Value::size() const { + switch (type_) { + case nullValue: + case intValue: + case uintValue: + case realValue: + case booleanValue: + case stringValue: + return 0; + case arrayValue: // size of the array is highest index + 1 + if (!value_.map_->empty()) { + ObjectValues::const_iterator itLast = value_.map_->end(); + --itLast; + return (*itLast).first.index() + 1; + } + return 0; + case objectValue: + return ArrayIndex(value_.map_->size()); + } + JSON_ASSERT_UNREACHABLE; + return 0; // unreachable; +} + +bool Value::empty() const { + if (isNull() || isArray() || isObject()) + return size() == 0u; + else + return false; +} + +bool Value::operator!() const { return isNull(); } + +void Value::clear() { + JSON_ASSERT_MESSAGE(type_ == nullValue || type_ == arrayValue || + type_ == objectValue, + "in Json::Value::clear(): requires complex value"); + start_ = 0; + limit_ = 0; + switch (type_) { + case arrayValue: + case objectValue: + value_.map_->clear(); + break; + default: + break; + } +} + +void Value::resize(ArrayIndex newSize) { + JSON_ASSERT_MESSAGE(type_ == nullValue || type_ == arrayValue, + "in Json::Value::resize(): requires arrayValue"); + if (type_ == nullValue) + *this = Value(arrayValue); + ArrayIndex oldSize = size(); + if (newSize == 0) + clear(); + else if (newSize > oldSize) + (*this)[newSize - 1]; + else { + for (ArrayIndex index = newSize; index < oldSize; ++index) { + value_.map_->erase(index); + } + JSON_ASSERT(size() == newSize); + } +} + +Value& Value::operator[](ArrayIndex index) { + JSON_ASSERT_MESSAGE( + type_ == nullValue || type_ == arrayValue, + "in Json::Value::operator[](ArrayIndex): requires arrayValue"); + if (type_ == nullValue) + *this = Value(arrayValue); + CZString key(index); + ObjectValues::iterator it = value_.map_->lower_bound(key); + if (it != value_.map_->end() && (*it).first == key) + return (*it).second; + + ObjectValues::value_type defaultValue(key, nullRef); + it = value_.map_->insert(it, defaultValue); + return (*it).second; +} + +Value& Value::operator[](int index) { + JSON_ASSERT_MESSAGE( + index >= 0, + "in Json::Value::operator[](int index): index cannot be negative"); + return (*this)[ArrayIndex(index)]; +} + +const Value& Value::operator[](ArrayIndex index) const { + JSON_ASSERT_MESSAGE( + type_ == nullValue || type_ == arrayValue, + "in Json::Value::operator[](ArrayIndex)const: requires arrayValue"); + if (type_ == nullValue) + return nullRef; + CZString key(index); + ObjectValues::const_iterator it = value_.map_->find(key); + if (it == value_.map_->end()) + return nullRef; + return (*it).second; +} + +const Value& Value::operator[](int index) const { + JSON_ASSERT_MESSAGE( + index >= 0, + "in Json::Value::operator[](int index) const: index cannot be negative"); + return (*this)[ArrayIndex(index)]; +} + +void Value::initBasic(ValueType vtype, bool allocated) { + type_ = vtype; + allocated_ = allocated; + comments_ = 0; + start_ = 0; + limit_ = 0; +} + +// Access an object value by name, create a null member if it does not exist. +// @pre Type of '*this' is object or null. +// @param key is null-terminated. +Value& Value::resolveReference(const char* key) { + JSON_ASSERT_MESSAGE( + type_ == nullValue || type_ == objectValue, + "in Json::Value::resolveReference(): requires objectValue"); + if (type_ == nullValue) + *this = Value(objectValue); + CZString actualKey( + key, static_cast(strlen(key)), CZString::noDuplication); // NOTE! + ObjectValues::iterator it = value_.map_->lower_bound(actualKey); + if (it != value_.map_->end() && (*it).first == actualKey) + return (*it).second; + + ObjectValues::value_type defaultValue(actualKey, nullRef); + it = value_.map_->insert(it, defaultValue); + Value& value = (*it).second; + return value; +} + +// @param key is not null-terminated. +Value& Value::resolveReference(char const* key, char const* cend) +{ + JSON_ASSERT_MESSAGE( + type_ == nullValue || type_ == objectValue, + "in Json::Value::resolveReference(key, end): requires objectValue"); + if (type_ == nullValue) + *this = Value(objectValue); + CZString actualKey( + key, static_cast(cend-key), CZString::duplicateOnCopy); + ObjectValues::iterator it = value_.map_->lower_bound(actualKey); + if (it != value_.map_->end() && (*it).first == actualKey) + return (*it).second; + + ObjectValues::value_type defaultValue(actualKey, nullRef); + it = value_.map_->insert(it, defaultValue); + Value& value = (*it).second; + return value; +} + +Value Value::get(ArrayIndex index, const Value& defaultValue) const { + const Value* value = &((*this)[index]); + return value == &nullRef ? defaultValue : *value; +} + +bool Value::isValidIndex(ArrayIndex index) const { return index < size(); } + +Value const* Value::find(char const* key, char const* cend) const +{ + JSON_ASSERT_MESSAGE( + type_ == nullValue || type_ == objectValue, + "in Json::Value::find(key, end, found): requires objectValue or nullValue"); + if (type_ == nullValue) return NULL; + CZString actualKey(key, static_cast(cend-key), CZString::noDuplication); + ObjectValues::const_iterator it = value_.map_->find(actualKey); + if (it == value_.map_->end()) return NULL; + return &(*it).second; +} +const Value& Value::operator[](const char* key) const +{ + Value const* found = find(key, key + strlen(key)); + if (!found) return nullRef; + return *found; +} +Value const& Value::operator[](JSONCPP_STRING const& key) const +{ + Value const* found = find(key.data(), key.data() + key.length()); + if (!found) return nullRef; + return *found; +} + +Value& Value::operator[](const char* key) { + return resolveReference(key, key + strlen(key)); +} + +Value& Value::operator[](const JSONCPP_STRING& key) { + return resolveReference(key.data(), key.data() + key.length()); +} + +Value& Value::operator[](const StaticString& key) { + return resolveReference(key.c_str()); +} + +#ifdef JSON_USE_CPPTL +Value& Value::operator[](const CppTL::ConstString& key) { + return resolveReference(key.c_str(), key.end_c_str()); +} +Value const& Value::operator[](CppTL::ConstString const& key) const +{ + Value const* found = find(key.c_str(), key.end_c_str()); + if (!found) return nullRef; + return *found; +} +#endif + +Value& Value::append(const Value& value) { return (*this)[size()] = value; } + +Value Value::get(char const* key, char const* cend, Value const& defaultValue) const +{ + Value const* found = find(key, cend); + return !found ? defaultValue : *found; +} +Value Value::get(char const* key, Value const& defaultValue) const +{ + return get(key, key + strlen(key), defaultValue); +} +Value Value::get(JSONCPP_STRING const& key, Value const& defaultValue) const +{ + return get(key.data(), key.data() + key.length(), defaultValue); +} + + +bool Value::removeMember(const char* key, const char* cend, Value* removed) +{ + if (type_ != objectValue) { + return false; + } + CZString actualKey(key, static_cast(cend-key), CZString::noDuplication); + ObjectValues::iterator it = value_.map_->find(actualKey); + if (it == value_.map_->end()) + return false; + *removed = it->second; + value_.map_->erase(it); + return true; +} +bool Value::removeMember(const char* key, Value* removed) +{ + return removeMember(key, key + strlen(key), removed); +} +bool Value::removeMember(JSONCPP_STRING const& key, Value* removed) +{ + return removeMember(key.data(), key.data() + key.length(), removed); +} +Value Value::removeMember(const char* key) +{ + JSON_ASSERT_MESSAGE(type_ == nullValue || type_ == objectValue, + "in Json::Value::removeMember(): requires objectValue"); + if (type_ == nullValue) + return nullRef; + + Value removed; // null + removeMember(key, key + strlen(key), &removed); + return removed; // still null if removeMember() did nothing +} +Value Value::removeMember(const JSONCPP_STRING& key) +{ + return removeMember(key.c_str()); +} + +bool Value::removeIndex(ArrayIndex index, Value* removed) { + if (type_ != arrayValue) { + return false; + } + CZString key(index); + ObjectValues::iterator it = value_.map_->find(key); + if (it == value_.map_->end()) { + return false; + } + *removed = it->second; + ArrayIndex oldSize = size(); + // shift left all items left, into the place of the "removed" + for (ArrayIndex i = index; i < (oldSize - 1); ++i){ + CZString keey(i); + (*value_.map_)[keey] = (*this)[i + 1]; + } + // erase the last one ("leftover") + CZString keyLast(oldSize - 1); + ObjectValues::iterator itLast = value_.map_->find(keyLast); + value_.map_->erase(itLast); + return true; +} + +#ifdef JSON_USE_CPPTL +Value Value::get(const CppTL::ConstString& key, + const Value& defaultValue) const { + return get(key.c_str(), key.end_c_str(), defaultValue); +} +#endif + +bool Value::isMember(char const* key, char const* cend) const +{ + Value const* value = find(key, cend); + return NULL != value; +} +bool Value::isMember(char const* key) const +{ + return isMember(key, key + strlen(key)); +} +bool Value::isMember(JSONCPP_STRING const& key) const +{ + return isMember(key.data(), key.data() + key.length()); +} + +#ifdef JSON_USE_CPPTL +bool Value::isMember(const CppTL::ConstString& key) const { + return isMember(key.c_str(), key.end_c_str()); +} +#endif + +Value::Members Value::getMemberNames() const { + JSON_ASSERT_MESSAGE( + type_ == nullValue || type_ == objectValue, + "in Json::Value::getMemberNames(), value must be objectValue"); + if (type_ == nullValue) + return Value::Members(); + Members members; + members.reserve(value_.map_->size()); + ObjectValues::const_iterator it = value_.map_->begin(); + ObjectValues::const_iterator itEnd = value_.map_->end(); + for (; it != itEnd; ++it) { + members.push_back(JSONCPP_STRING((*it).first.data(), + (*it).first.length())); + } + return members; +} +// +//# ifdef JSON_USE_CPPTL +// EnumMemberNames +// Value::enumMemberNames() const +//{ +// if ( type_ == objectValue ) +// { +// return CppTL::Enum::any( CppTL::Enum::transform( +// CppTL::Enum::keys( *(value_.map_), CppTL::Type() ), +// MemberNamesTransform() ) ); +// } +// return EnumMemberNames(); +//} +// +// +// EnumValues +// Value::enumValues() const +//{ +// if ( type_ == objectValue || type_ == arrayValue ) +// return CppTL::Enum::anyValues( *(value_.map_), +// CppTL::Type() ); +// return EnumValues(); +//} +// +//# endif + +static bool IsIntegral(double d) { + double integral_part; + return modf(d, &integral_part) == 0.0; +} + +bool Value::isNull() const { return type_ == nullValue; } + +bool Value::isBool() const { return type_ == booleanValue; } + +bool Value::isInt() const { + switch (type_) { + case intValue: + return value_.int_ >= minInt && value_.int_ <= maxInt; + case uintValue: + return value_.uint_ <= UInt(maxInt); + case realValue: + return value_.real_ >= minInt && value_.real_ <= maxInt && + IsIntegral(value_.real_); + default: + break; + } + return false; +} + +bool Value::isUInt() const { + switch (type_) { + case intValue: + return value_.int_ >= 0 && LargestUInt(value_.int_) <= LargestUInt(maxUInt); + case uintValue: + return value_.uint_ <= maxUInt; + case realValue: + return value_.real_ >= 0 && value_.real_ <= maxUInt && + IsIntegral(value_.real_); + default: + break; + } + return false; +} + +bool Value::isInt64() const { +#if defined(JSON_HAS_INT64) + switch (type_) { + case intValue: + return true; + case uintValue: + return value_.uint_ <= UInt64(maxInt64); + case realValue: + // Note that maxInt64 (= 2^63 - 1) is not exactly representable as a + // double, so double(maxInt64) will be rounded up to 2^63. Therefore we + // require the value to be strictly less than the limit. + return value_.real_ >= double(minInt64) && + value_.real_ < double(maxInt64) && IsIntegral(value_.real_); + default: + break; + } +#endif // JSON_HAS_INT64 + return false; +} + +bool Value::isUInt64() const { +#if defined(JSON_HAS_INT64) + switch (type_) { + case intValue: + return value_.int_ >= 0; + case uintValue: + return true; + case realValue: + // Note that maxUInt64 (= 2^64 - 1) is not exactly representable as a + // double, so double(maxUInt64) will be rounded up to 2^64. Therefore we + // require the value to be strictly less than the limit. + return value_.real_ >= 0 && value_.real_ < maxUInt64AsDouble && + IsIntegral(value_.real_); + default: + break; + } +#endif // JSON_HAS_INT64 + return false; +} + +bool Value::isIntegral() const { +#if defined(JSON_HAS_INT64) + return isInt64() || isUInt64(); +#else + return isInt() || isUInt(); +#endif +} + +bool Value::isDouble() const { return type_ == realValue || isIntegral(); } + +bool Value::isNumeric() const { return isIntegral() || isDouble(); } + +bool Value::isString() const { return type_ == stringValue; } + +bool Value::isArray() const { return type_ == arrayValue; } + +bool Value::isObject() const { return type_ == objectValue; } + +void Value::setComment(const char* comment, size_t len, CommentPlacement placement) { + if (!comments_) + comments_ = new CommentInfo[numberOfCommentPlacement]; + if ((len > 0) && (comment[len-1] == '\n')) { + // Always discard trailing newline, to aid indentation. + len -= 1; + } + comments_[placement].setComment(comment, len); +} + +void Value::setComment(const char* comment, CommentPlacement placement) { + setComment(comment, strlen(comment), placement); +} + +void Value::setComment(const JSONCPP_STRING& comment, CommentPlacement placement) { + setComment(comment.c_str(), comment.length(), placement); +} + +bool Value::hasComment(CommentPlacement placement) const { + return comments_ != 0 && comments_[placement].comment_ != 0; +} + +JSONCPP_STRING Value::getComment(CommentPlacement placement) const { + if (hasComment(placement)) + return comments_[placement].comment_; + return ""; +} + +void Value::setOffsetStart(ptrdiff_t start) { start_ = start; } + +void Value::setOffsetLimit(ptrdiff_t limit) { limit_ = limit; } + +ptrdiff_t Value::getOffsetStart() const { return start_; } + +ptrdiff_t Value::getOffsetLimit() const { return limit_; } + +JSONCPP_STRING Value::toStyledString() const { + StyledWriter writer; + return writer.write(*this); +} + +Value::const_iterator Value::begin() const { + switch (type_) { + case arrayValue: + case objectValue: + if (value_.map_) + return const_iterator(value_.map_->begin()); + break; + default: + break; + } + return const_iterator(); +} + +Value::const_iterator Value::end() const { + switch (type_) { + case arrayValue: + case objectValue: + if (value_.map_) + return const_iterator(value_.map_->end()); + break; + default: + break; + } + return const_iterator(); +} + +Value::iterator Value::begin() { + switch (type_) { + case arrayValue: + case objectValue: + if (value_.map_) + return iterator(value_.map_->begin()); + break; + default: + break; + } + return iterator(); +} + +Value::iterator Value::end() { + switch (type_) { + case arrayValue: + case objectValue: + if (value_.map_) + return iterator(value_.map_->end()); + break; + default: + break; + } + return iterator(); +} + +// class PathArgument +// ////////////////////////////////////////////////////////////////// + +PathArgument::PathArgument() : key_(), index_(), kind_(kindNone) {} + +PathArgument::PathArgument(ArrayIndex index) + : key_(), index_(index), kind_(kindIndex) {} + +PathArgument::PathArgument(const char* key) + : key_(key), index_(), kind_(kindKey) {} + +PathArgument::PathArgument(const JSONCPP_STRING& key) + : key_(key.c_str()), index_(), kind_(kindKey) {} + +// class Path +// ////////////////////////////////////////////////////////////////// + +Path::Path(const JSONCPP_STRING& path, + const PathArgument& a1, + const PathArgument& a2, + const PathArgument& a3, + const PathArgument& a4, + const PathArgument& a5) { + InArgs in; + in.push_back(&a1); + in.push_back(&a2); + in.push_back(&a3); + in.push_back(&a4); + in.push_back(&a5); + makePath(path, in); +} + +void Path::makePath(const JSONCPP_STRING& path, const InArgs& in) { + const char* current = path.c_str(); + const char* end = current + path.length(); + InArgs::const_iterator itInArg = in.begin(); + while (current != end) { + if (*current == '[') { + ++current; + if (*current == '%') + addPathInArg(path, in, itInArg, PathArgument::kindIndex); + else { + ArrayIndex index = 0; + for (; current != end && *current >= '0' && *current <= '9'; ++current) + index = index * 10 + ArrayIndex(*current - '0'); + args_.push_back(index); + } + if (current == end || *current++ != ']') + invalidPath(path, int(current - path.c_str())); + } else if (*current == '%') { + addPathInArg(path, in, itInArg, PathArgument::kindKey); + ++current; + } else if (*current == '.') { + ++current; + } else { + const char* beginName = current; + while (current != end && !strchr("[.", *current)) + ++current; + args_.push_back(JSONCPP_STRING(beginName, current)); + } + } +} + +void Path::addPathInArg(const JSONCPP_STRING& /*path*/, + const InArgs& in, + InArgs::const_iterator& itInArg, + PathArgument::Kind kind) { + if (itInArg == in.end()) { + // Error: missing argument %d + } else if ((*itInArg)->kind_ != kind) { + // Error: bad argument type + } else { + args_.push_back(**itInArg); + } +} + +void Path::invalidPath(const JSONCPP_STRING& /*path*/, int /*location*/) { + // Error: invalid path. +} + +const Value& Path::resolve(const Value& root) const { + const Value* node = &root; + for (Args::const_iterator it = args_.begin(); it != args_.end(); ++it) { + const PathArgument& arg = *it; + if (arg.kind_ == PathArgument::kindIndex) { + if (!node->isArray() || !node->isValidIndex(arg.index_)) { + // Error: unable to resolve path (array value expected at position... + } + node = &((*node)[arg.index_]); + } else if (arg.kind_ == PathArgument::kindKey) { + if (!node->isObject()) { + // Error: unable to resolve path (object value expected at position...) + } + node = &((*node)[arg.key_]); + if (node == &Value::nullRef) { + // Error: unable to resolve path (object has no member named '' at + // position...) + } + } + } + return *node; +} + +Value Path::resolve(const Value& root, const Value& defaultValue) const { + const Value* node = &root; + for (Args::const_iterator it = args_.begin(); it != args_.end(); ++it) { + const PathArgument& arg = *it; + if (arg.kind_ == PathArgument::kindIndex) { + if (!node->isArray() || !node->isValidIndex(arg.index_)) + return defaultValue; + node = &((*node)[arg.index_]); + } else if (arg.kind_ == PathArgument::kindKey) { + if (!node->isObject()) + return defaultValue; + node = &((*node)[arg.key_]); + if (node == &Value::nullRef) + return defaultValue; + } + } + return *node; +} + +Value& Path::make(Value& root) const { + Value* node = &root; + for (Args::const_iterator it = args_.begin(); it != args_.end(); ++it) { + const PathArgument& arg = *it; + if (arg.kind_ == PathArgument::kindIndex) { + if (!node->isArray()) { + // Error: node is not an array at position ... + } + node = &((*node)[arg.index_]); + } else if (arg.kind_ == PathArgument::kindKey) { + if (!node->isObject()) { + // Error: node is not an object at position... + } + node = &((*node)[arg.key_]); + } + } + return *node; +} + +} // namespace Json + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: src/lib_json/json_value.cpp +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: src/lib_json/json_writer.cpp +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2011 Baptiste Lepilleur +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#if !defined(JSON_IS_AMALGAMATION) +#include +#include "json_tool.h" +#endif // if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(_MSC_VER) && _MSC_VER >= 1200 && _MSC_VER < 1800 // Between VC++ 6.0 and VC++ 11.0 +#include +#define isfinite _finite +#elif defined(__sun) && defined(__SVR4) //Solaris +#if !defined(isfinite) +#include +#define isfinite finite +#endif +#elif defined(_AIX) +#if !defined(isfinite) +#include +#define isfinite finite +#endif +#elif defined(__hpux) +#if !defined(isfinite) +#if defined(__ia64) && !defined(finite) +#define isfinite(x) ((sizeof(x) == sizeof(float) ? \ + _Isfinitef(x) : _IsFinite(x))) +#else +#include +#define isfinite finite +#endif +#endif +#else +#include +#if !(defined(__QNXNTO__)) // QNX already defines isfinite +#define isfinite std::isfinite +#endif +#endif + +#if defined(_MSC_VER) +#if !defined(WINCE) && defined(__STDC_SECURE_LIB__) && _MSC_VER >= 1500 // VC++ 9.0 and above +#define snprintf sprintf_s +#elif _MSC_VER >= 1900 // VC++ 14.0 and above +#define snprintf std::snprintf +#else +#define snprintf _snprintf +#endif +#elif defined(__ANDROID__) || defined(__QNXNTO__) +#define snprintf snprintf +#elif __cplusplus >= 201103L +#if !defined(__MINGW32__) && !defined(__CYGWIN__) +#define snprintf std::snprintf +#endif +#endif + +#if defined(__BORLANDC__) +#include +#define isfinite _finite +#define snprintf _snprintf +#endif + +#if defined(_MSC_VER) && _MSC_VER >= 1400 // VC++ 8.0 +// Disable warning about strdup being deprecated. +#pragma warning(disable : 4996) +#endif + +namespace Json { + +#if __cplusplus >= 201103L || (defined(_CPPLIB_VER) && _CPPLIB_VER >= 520) +typedef std::unique_ptr StreamWriterPtr; +#else +typedef std::auto_ptr StreamWriterPtr; +#endif + +static bool containsControlCharacter(const char* str) { + while (*str) { + if (isControlCharacter(*(str++))) + return true; + } + return false; +} + +static bool containsControlCharacter0(const char* str, unsigned len) { + char const* end = str + len; + while (end != str) { + if (isControlCharacter(*str) || 0==*str) + return true; + ++str; + } + return false; +} + +JSONCPP_STRING valueToString(LargestInt value) { + UIntToStringBuffer buffer; + char* current = buffer + sizeof(buffer); + if (value == Value::minLargestInt) { + uintToString(LargestUInt(Value::maxLargestInt) + 1, current); + *--current = '-'; + } else if (value < 0) { + uintToString(LargestUInt(-value), current); + *--current = '-'; + } else { + uintToString(LargestUInt(value), current); + } + assert(current >= buffer); + return current; +} + +JSONCPP_STRING valueToString(LargestUInt value) { + UIntToStringBuffer buffer; + char* current = buffer + sizeof(buffer); + uintToString(value, current); + assert(current >= buffer); + return current; +} + +#if defined(JSON_HAS_INT64) + +JSONCPP_STRING valueToString(Int value) { + return valueToString(LargestInt(value)); +} + +JSONCPP_STRING valueToString(UInt value) { + return valueToString(LargestUInt(value)); +} + +#endif // # if defined(JSON_HAS_INT64) + +JSONCPP_STRING valueToString(double value, bool useSpecialFloats, unsigned int precision) { + // Allocate a buffer that is more than large enough to store the 16 digits of + // precision requested below. + char buffer[32]; + int len = -1; + + char formatString[6]; + sprintf(formatString, "%%.%dg", precision); + + // Print into the buffer. We need not request the alternative representation + // that always has a decimal point because JSON doesn't distingish the + // concepts of reals and integers. + if (isfinite(value)) { + len = snprintf(buffer, sizeof(buffer), formatString, value); + } else { + // IEEE standard states that NaN values will not compare to themselves + if (value != value) { + len = snprintf(buffer, sizeof(buffer), useSpecialFloats ? "NaN" : "null"); + } else if (value < 0) { + len = snprintf(buffer, sizeof(buffer), useSpecialFloats ? "-Infinity" : "-1e+9999"); + } else { + len = snprintf(buffer, sizeof(buffer), useSpecialFloats ? "Infinity" : "1e+9999"); + } + // For those, we do not need to call fixNumLoc, but it is fast. + } + assert(len >= 0); + fixNumericLocale(buffer, buffer + len); + return buffer; +} + +JSONCPP_STRING valueToString(double value) { return valueToString(value, false, 17); } + +JSONCPP_STRING valueToString(bool value) { return value ? "true" : "false"; } + +JSONCPP_STRING valueToQuotedString(const char* value) { + if (value == NULL) + return ""; + // Not sure how to handle unicode... + if (strpbrk(value, "\"\\\b\f\n\r\t") == NULL && + !containsControlCharacter(value)) + return JSONCPP_STRING("\"") + value + "\""; + // We have to walk value and escape any special characters. + // Appending to JSONCPP_STRING is not efficient, but this should be rare. + // (Note: forward slashes are *not* rare, but I am not escaping them.) + JSONCPP_STRING::size_type maxsize = + strlen(value) * 2 + 3; // allescaped+quotes+NULL + JSONCPP_STRING result; + result.reserve(maxsize); // to avoid lots of mallocs + result += "\""; + for (const char* c = value; *c != 0; ++c) { + switch (*c) { + case '\"': + result += "\\\""; + break; + case '\\': + result += "\\\\"; + break; + case '\b': + result += "\\b"; + break; + case '\f': + result += "\\f"; + break; + case '\n': + result += "\\n"; + break; + case '\r': + result += "\\r"; + break; + case '\t': + result += "\\t"; + break; + // case '/': + // Even though \/ is considered a legal escape in JSON, a bare + // slash is also legal, so I see no reason to escape it. + // (I hope I am not misunderstanding something. + // blep notes: actually escaping \/ may be useful in javascript to avoid (*c); + result += oss.str(); + } else { + result += *c; + } + break; + } + } + result += "\""; + return result; +} + +// https://github.com/upcaste/upcaste/blob/master/src/upcore/src/cstring/strnpbrk.cpp +static char const* strnpbrk(char const* s, char const* accept, size_t n) { + assert((s || !n) && accept); + + char const* const end = s + n; + for (char const* cur = s; cur < end; ++cur) { + int const c = *cur; + for (char const* a = accept; *a; ++a) { + if (*a == c) { + return cur; + } + } + } + return NULL; +} +static JSONCPP_STRING valueToQuotedStringN(const char* value, unsigned length) { + if (value == NULL) + return ""; + // Not sure how to handle unicode... + if (strnpbrk(value, "\"\\\b\f\n\r\t", length) == NULL && + !containsControlCharacter0(value, length)) + return JSONCPP_STRING("\"") + value + "\""; + // We have to walk value and escape any special characters. + // Appending to JSONCPP_STRING is not efficient, but this should be rare. + // (Note: forward slashes are *not* rare, but I am not escaping them.) + JSONCPP_STRING::size_type maxsize = + length * 2 + 3; // allescaped+quotes+NULL + JSONCPP_STRING result; + result.reserve(maxsize); // to avoid lots of mallocs + result += "\""; + char const* end = value + length; + for (const char* c = value; c != end; ++c) { + switch (*c) { + case '\"': + result += "\\\""; + break; + case '\\': + result += "\\\\"; + break; + case '\b': + result += "\\b"; + break; + case '\f': + result += "\\f"; + break; + case '\n': + result += "\\n"; + break; + case '\r': + result += "\\r"; + break; + case '\t': + result += "\\t"; + break; + // case '/': + // Even though \/ is considered a legal escape in JSON, a bare + // slash is also legal, so I see no reason to escape it. + // (I hope I am not misunderstanding something.) + // blep notes: actually escaping \/ may be useful in javascript to avoid (*c); + result += oss.str(); + } else { + result += *c; + } + break; + } + } + result += "\""; + return result; +} + +// Class Writer +// ////////////////////////////////////////////////////////////////// +Writer::~Writer() {} + +// Class FastWriter +// ////////////////////////////////////////////////////////////////// + +FastWriter::FastWriter() + : yamlCompatiblityEnabled_(false), dropNullPlaceholders_(false), + omitEndingLineFeed_(false) {} + +void FastWriter::enableYAMLCompatibility() { yamlCompatiblityEnabled_ = true; } + +void FastWriter::dropNullPlaceholders() { dropNullPlaceholders_ = true; } + +void FastWriter::omitEndingLineFeed() { omitEndingLineFeed_ = true; } + +JSONCPP_STRING FastWriter::write(const Value& root) { + document_ = ""; + writeValue(root); + if (!omitEndingLineFeed_) + document_ += "\n"; + return document_; +} + +void FastWriter::writeValue(const Value& value) { + switch (value.type()) { + case nullValue: + if (!dropNullPlaceholders_) + document_ += "null"; + break; + case intValue: + document_ += valueToString(value.asLargestInt()); + break; + case uintValue: + document_ += valueToString(value.asLargestUInt()); + break; + case realValue: + document_ += valueToString(value.asDouble()); + break; + case stringValue: + { + // Is NULL possible for value.string_? + char const* str; + char const* end; + bool ok = value.getString(&str, &end); + if (ok) document_ += valueToQuotedStringN(str, static_cast(end-str)); + break; + } + case booleanValue: + document_ += valueToString(value.asBool()); + break; + case arrayValue: { + document_ += '['; + ArrayIndex size = value.size(); + for (ArrayIndex index = 0; index < size; ++index) { + if (index > 0) + document_ += ','; + writeValue(value[index]); + } + document_ += ']'; + } break; + case objectValue: { + Value::Members members(value.getMemberNames()); + document_ += '{'; + for (Value::Members::iterator it = members.begin(); it != members.end(); + ++it) { + const JSONCPP_STRING& name = *it; + if (it != members.begin()) + document_ += ','; + document_ += valueToQuotedStringN(name.data(), static_cast(name.length())); + document_ += yamlCompatiblityEnabled_ ? ": " : ":"; + writeValue(value[name]); + } + document_ += '}'; + } break; + } +} + +// Class StyledWriter +// ////////////////////////////////////////////////////////////////// + +StyledWriter::StyledWriter() + : rightMargin_(74), indentSize_(3), addChildValues_() {} + +JSONCPP_STRING StyledWriter::write(const Value& root) { + document_ = ""; + addChildValues_ = false; + indentString_ = ""; + writeCommentBeforeValue(root); + writeValue(root); + writeCommentAfterValueOnSameLine(root); + document_ += "\n"; + return document_; +} + +void StyledWriter::writeValue(const Value& value) { + switch (value.type()) { + case nullValue: + pushValue("null"); + break; + case intValue: + pushValue(valueToString(value.asLargestInt())); + break; + case uintValue: + pushValue(valueToString(value.asLargestUInt())); + break; + case realValue: + pushValue(valueToString(value.asDouble())); + break; + case stringValue: + { + // Is NULL possible for value.string_? + char const* str; + char const* end; + bool ok = value.getString(&str, &end); + if (ok) pushValue(valueToQuotedStringN(str, static_cast(end-str))); + else pushValue(""); + break; + } + case booleanValue: + pushValue(valueToString(value.asBool())); + break; + case arrayValue: + writeArrayValue(value); + break; + case objectValue: { + Value::Members members(value.getMemberNames()); + if (members.empty()) + pushValue("{}"); + else { + writeWithIndent("{"); + indent(); + Value::Members::iterator it = members.begin(); + for (;;) { + const JSONCPP_STRING& name = *it; + const Value& childValue = value[name]; + writeCommentBeforeValue(childValue); + writeWithIndent(valueToQuotedString(name.c_str())); + document_ += " : "; + writeValue(childValue); + if (++it == members.end()) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + document_ += ','; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("}"); + } + } break; + } +} + +void StyledWriter::writeArrayValue(const Value& value) { + unsigned size = value.size(); + if (size == 0) + pushValue("[]"); + else { + bool isArrayMultiLine = isMultineArray(value); + if (isArrayMultiLine) { + writeWithIndent("["); + indent(); + bool hasChildValue = !childValues_.empty(); + unsigned index = 0; + for (;;) { + const Value& childValue = value[index]; + writeCommentBeforeValue(childValue); + if (hasChildValue) + writeWithIndent(childValues_[index]); + else { + writeIndent(); + writeValue(childValue); + } + if (++index == size) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + document_ += ','; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("]"); + } else // output on a single line + { + assert(childValues_.size() == size); + document_ += "[ "; + for (unsigned index = 0; index < size; ++index) { + if (index > 0) + document_ += ", "; + document_ += childValues_[index]; + } + document_ += " ]"; + } + } +} + +bool StyledWriter::isMultineArray(const Value& value) { + ArrayIndex const size = value.size(); + bool isMultiLine = size * 3 >= rightMargin_; + childValues_.clear(); + for (ArrayIndex index = 0; index < size && !isMultiLine; ++index) { + const Value& childValue = value[index]; + isMultiLine = ((childValue.isArray() || childValue.isObject()) && + childValue.size() > 0); + } + if (!isMultiLine) // check if line length > max line length + { + childValues_.reserve(size); + addChildValues_ = true; + ArrayIndex lineLength = 4 + (size - 1) * 2; // '[ ' + ', '*n + ' ]' + for (ArrayIndex index = 0; index < size; ++index) { + if (hasCommentForValue(value[index])) { + isMultiLine = true; + } + writeValue(value[index]); + lineLength += static_cast(childValues_[index].length()); + } + addChildValues_ = false; + isMultiLine = isMultiLine || lineLength >= rightMargin_; + } + return isMultiLine; +} + +void StyledWriter::pushValue(const JSONCPP_STRING& value) { + if (addChildValues_) + childValues_.push_back(value); + else + document_ += value; +} + +void StyledWriter::writeIndent() { + if (!document_.empty()) { + char last = document_[document_.length() - 1]; + if (last == ' ') // already indented + return; + if (last != '\n') // Comments may add new-line + document_ += '\n'; + } + document_ += indentString_; +} + +void StyledWriter::writeWithIndent(const JSONCPP_STRING& value) { + writeIndent(); + document_ += value; +} + +void StyledWriter::indent() { indentString_ += JSONCPP_STRING(indentSize_, ' '); } + +void StyledWriter::unindent() { + assert(indentString_.size() >= indentSize_); + indentString_.resize(indentString_.size() - indentSize_); +} + +void StyledWriter::writeCommentBeforeValue(const Value& root) { + if (!root.hasComment(commentBefore)) + return; + + document_ += "\n"; + writeIndent(); + const JSONCPP_STRING& comment = root.getComment(commentBefore); + JSONCPP_STRING::const_iterator iter = comment.begin(); + while (iter != comment.end()) { + document_ += *iter; + if (*iter == '\n' && + (iter != comment.end() && *(iter + 1) == '/')) + writeIndent(); + ++iter; + } + + // Comments are stripped of trailing newlines, so add one here + document_ += "\n"; +} + +void StyledWriter::writeCommentAfterValueOnSameLine(const Value& root) { + if (root.hasComment(commentAfterOnSameLine)) + document_ += " " + root.getComment(commentAfterOnSameLine); + + if (root.hasComment(commentAfter)) { + document_ += "\n"; + document_ += root.getComment(commentAfter); + document_ += "\n"; + } +} + +bool StyledWriter::hasCommentForValue(const Value& value) { + return value.hasComment(commentBefore) || + value.hasComment(commentAfterOnSameLine) || + value.hasComment(commentAfter); +} + +// Class StyledStreamWriter +// ////////////////////////////////////////////////////////////////// + +StyledStreamWriter::StyledStreamWriter(JSONCPP_STRING indentation) + : document_(NULL), rightMargin_(74), indentation_(indentation), + addChildValues_() {} + +void StyledStreamWriter::write(JSONCPP_OSTREAM& out, const Value& root) { + document_ = &out; + addChildValues_ = false; + indentString_ = ""; + indented_ = true; + writeCommentBeforeValue(root); + if (!indented_) writeIndent(); + indented_ = true; + writeValue(root); + writeCommentAfterValueOnSameLine(root); + *document_ << "\n"; + document_ = NULL; // Forget the stream, for safety. +} + +void StyledStreamWriter::writeValue(const Value& value) { + switch (value.type()) { + case nullValue: + pushValue("null"); + break; + case intValue: + pushValue(valueToString(value.asLargestInt())); + break; + case uintValue: + pushValue(valueToString(value.asLargestUInt())); + break; + case realValue: + pushValue(valueToString(value.asDouble())); + break; + case stringValue: + { + // Is NULL possible for value.string_? + char const* str; + char const* end; + bool ok = value.getString(&str, &end); + if (ok) pushValue(valueToQuotedStringN(str, static_cast(end-str))); + else pushValue(""); + break; + } + case booleanValue: + pushValue(valueToString(value.asBool())); + break; + case arrayValue: + writeArrayValue(value); + break; + case objectValue: { + Value::Members members(value.getMemberNames()); + if (members.empty()) + pushValue("{}"); + else { + writeWithIndent("{"); + indent(); + Value::Members::iterator it = members.begin(); + for (;;) { + const JSONCPP_STRING& name = *it; + const Value& childValue = value[name]; + writeCommentBeforeValue(childValue); + writeWithIndent(valueToQuotedString(name.c_str())); + *document_ << " : "; + writeValue(childValue); + if (++it == members.end()) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + *document_ << ","; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("}"); + } + } break; + } +} + +void StyledStreamWriter::writeArrayValue(const Value& value) { + unsigned size = value.size(); + if (size == 0) + pushValue("[]"); + else { + bool isArrayMultiLine = isMultineArray(value); + if (isArrayMultiLine) { + writeWithIndent("["); + indent(); + bool hasChildValue = !childValues_.empty(); + unsigned index = 0; + for (;;) { + const Value& childValue = value[index]; + writeCommentBeforeValue(childValue); + if (hasChildValue) + writeWithIndent(childValues_[index]); + else { + if (!indented_) writeIndent(); + indented_ = true; + writeValue(childValue); + indented_ = false; + } + if (++index == size) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + *document_ << ","; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("]"); + } else // output on a single line + { + assert(childValues_.size() == size); + *document_ << "[ "; + for (unsigned index = 0; index < size; ++index) { + if (index > 0) + *document_ << ", "; + *document_ << childValues_[index]; + } + *document_ << " ]"; + } + } +} + +bool StyledStreamWriter::isMultineArray(const Value& value) { + ArrayIndex const size = value.size(); + bool isMultiLine = size * 3 >= rightMargin_; + childValues_.clear(); + for (ArrayIndex index = 0; index < size && !isMultiLine; ++index) { + const Value& childValue = value[index]; + isMultiLine = ((childValue.isArray() || childValue.isObject()) && + childValue.size() > 0); + } + if (!isMultiLine) // check if line length > max line length + { + childValues_.reserve(size); + addChildValues_ = true; + ArrayIndex lineLength = 4 + (size - 1) * 2; // '[ ' + ', '*n + ' ]' + for (ArrayIndex index = 0; index < size; ++index) { + if (hasCommentForValue(value[index])) { + isMultiLine = true; + } + writeValue(value[index]); + lineLength += static_cast(childValues_[index].length()); + } + addChildValues_ = false; + isMultiLine = isMultiLine || lineLength >= rightMargin_; + } + return isMultiLine; +} + +void StyledStreamWriter::pushValue(const JSONCPP_STRING& value) { + if (addChildValues_) + childValues_.push_back(value); + else + *document_ << value; +} + +void StyledStreamWriter::writeIndent() { + // blep intended this to look at the so-far-written string + // to determine whether we are already indented, but + // with a stream we cannot do that. So we rely on some saved state. + // The caller checks indented_. + *document_ << '\n' << indentString_; +} + +void StyledStreamWriter::writeWithIndent(const JSONCPP_STRING& value) { + if (!indented_) writeIndent(); + *document_ << value; + indented_ = false; +} + +void StyledStreamWriter::indent() { indentString_ += indentation_; } + +void StyledStreamWriter::unindent() { + assert(indentString_.size() >= indentation_.size()); + indentString_.resize(indentString_.size() - indentation_.size()); +} + +void StyledStreamWriter::writeCommentBeforeValue(const Value& root) { + if (!root.hasComment(commentBefore)) + return; + + if (!indented_) writeIndent(); + const JSONCPP_STRING& comment = root.getComment(commentBefore); + JSONCPP_STRING::const_iterator iter = comment.begin(); + while (iter != comment.end()) { + *document_ << *iter; + if (*iter == '\n' && + (iter != comment.end() && *(iter + 1) == '/')) + // writeIndent(); // would include newline + *document_ << indentString_; + ++iter; + } + indented_ = false; +} + +void StyledStreamWriter::writeCommentAfterValueOnSameLine(const Value& root) { + if (root.hasComment(commentAfterOnSameLine)) + *document_ << ' ' << root.getComment(commentAfterOnSameLine); + + if (root.hasComment(commentAfter)) { + writeIndent(); + *document_ << root.getComment(commentAfter); + } + indented_ = false; +} + +bool StyledStreamWriter::hasCommentForValue(const Value& value) { + return value.hasComment(commentBefore) || + value.hasComment(commentAfterOnSameLine) || + value.hasComment(commentAfter); +} + +////////////////////////// +// BuiltStyledStreamWriter + +/// Scoped enums are not available until C++11. +struct CommentStyle { + /// Decide whether to write comments. + enum Enum { + None, ///< Drop all comments. + Most, ///< Recover odd behavior of previous versions (not implemented yet). + All ///< Keep all comments. + }; +}; + +struct BuiltStyledStreamWriter : public StreamWriter +{ + BuiltStyledStreamWriter( + JSONCPP_STRING const& indentation, + CommentStyle::Enum cs, + JSONCPP_STRING const& colonSymbol, + JSONCPP_STRING const& nullSymbol, + JSONCPP_STRING const& endingLineFeedSymbol, + bool useSpecialFloats, + unsigned int precision); + int write(Value const& root, JSONCPP_OSTREAM* sout) JSONCPP_OVERRIDE; +private: + void writeValue(Value const& value); + void writeArrayValue(Value const& value); + bool isMultineArray(Value const& value); + void pushValue(JSONCPP_STRING const& value); + void writeIndent(); + void writeWithIndent(JSONCPP_STRING const& value); + void indent(); + void unindent(); + void writeCommentBeforeValue(Value const& root); + void writeCommentAfterValueOnSameLine(Value const& root); + static bool hasCommentForValue(const Value& value); + + typedef std::vector ChildValues; + + ChildValues childValues_; + JSONCPP_STRING indentString_; + unsigned int rightMargin_; + JSONCPP_STRING indentation_; + CommentStyle::Enum cs_; + JSONCPP_STRING colonSymbol_; + JSONCPP_STRING nullSymbol_; + JSONCPP_STRING endingLineFeedSymbol_; + bool addChildValues_ : 1; + bool indented_ : 1; + bool useSpecialFloats_ : 1; + unsigned int precision_; +}; +BuiltStyledStreamWriter::BuiltStyledStreamWriter( + JSONCPP_STRING const& indentation, + CommentStyle::Enum cs, + JSONCPP_STRING const& colonSymbol, + JSONCPP_STRING const& nullSymbol, + JSONCPP_STRING const& endingLineFeedSymbol, + bool useSpecialFloats, + unsigned int precision) + : rightMargin_(74) + , indentation_(indentation) + , cs_(cs) + , colonSymbol_(colonSymbol) + , nullSymbol_(nullSymbol) + , endingLineFeedSymbol_(endingLineFeedSymbol) + , addChildValues_(false) + , indented_(false) + , useSpecialFloats_(useSpecialFloats) + , precision_(precision) +{ +} +int BuiltStyledStreamWriter::write(Value const& root, JSONCPP_OSTREAM* sout) +{ + sout_ = sout; + addChildValues_ = false; + indented_ = true; + indentString_ = ""; + writeCommentBeforeValue(root); + if (!indented_) writeIndent(); + indented_ = true; + writeValue(root); + writeCommentAfterValueOnSameLine(root); + *sout_ << endingLineFeedSymbol_; + sout_ = NULL; + return 0; +} +void BuiltStyledStreamWriter::writeValue(Value const& value) { + switch (value.type()) { + case nullValue: + pushValue(nullSymbol_); + break; + case intValue: + pushValue(valueToString(value.asLargestInt())); + break; + case uintValue: + pushValue(valueToString(value.asLargestUInt())); + break; + case realValue: + pushValue(valueToString(value.asDouble(), useSpecialFloats_, precision_)); + break; + case stringValue: + { + // Is NULL is possible for value.string_? + char const* str; + char const* end; + bool ok = value.getString(&str, &end); + if (ok) pushValue(valueToQuotedStringN(str, static_cast(end-str))); + else pushValue(""); + break; + } + case booleanValue: + pushValue(valueToString(value.asBool())); + break; + case arrayValue: + writeArrayValue(value); + break; + case objectValue: { + Value::Members members(value.getMemberNames()); + if (members.empty()) + pushValue("{}"); + else { + writeWithIndent("{"); + indent(); + Value::Members::iterator it = members.begin(); + for (;;) { + JSONCPP_STRING const& name = *it; + Value const& childValue = value[name]; + writeCommentBeforeValue(childValue); + writeWithIndent(valueToQuotedStringN(name.data(), static_cast(name.length()))); + *sout_ << colonSymbol_; + writeValue(childValue); + if (++it == members.end()) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + *sout_ << ","; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("}"); + } + } break; + } +} + +void BuiltStyledStreamWriter::writeArrayValue(Value const& value) { + unsigned size = value.size(); + if (size == 0) + pushValue("[]"); + else { + bool isMultiLine = (cs_ == CommentStyle::All) || isMultineArray(value); + if (isMultiLine) { + writeWithIndent("["); + indent(); + bool hasChildValue = !childValues_.empty(); + unsigned index = 0; + for (;;) { + Value const& childValue = value[index]; + writeCommentBeforeValue(childValue); + if (hasChildValue) + writeWithIndent(childValues_[index]); + else { + if (!indented_) writeIndent(); + indented_ = true; + writeValue(childValue); + indented_ = false; + } + if (++index == size) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + *sout_ << ","; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("]"); + } else // output on a single line + { + assert(childValues_.size() == size); + *sout_ << "["; + if (!indentation_.empty()) *sout_ << " "; + for (unsigned index = 0; index < size; ++index) { + if (index > 0) + *sout_ << ", "; + *sout_ << childValues_[index]; + } + if (!indentation_.empty()) *sout_ << " "; + *sout_ << "]"; + } + } +} + +bool BuiltStyledStreamWriter::isMultineArray(Value const& value) { + ArrayIndex const size = value.size(); + bool isMultiLine = size * 3 >= rightMargin_; + childValues_.clear(); + for (ArrayIndex index = 0; index < size && !isMultiLine; ++index) { + Value const& childValue = value[index]; + isMultiLine = ((childValue.isArray() || childValue.isObject()) && + childValue.size() > 0); + } + if (!isMultiLine) // check if line length > max line length + { + childValues_.reserve(size); + addChildValues_ = true; + ArrayIndex lineLength = 4 + (size - 1) * 2; // '[ ' + ', '*n + ' ]' + for (ArrayIndex index = 0; index < size; ++index) { + if (hasCommentForValue(value[index])) { + isMultiLine = true; + } + writeValue(value[index]); + lineLength += static_cast(childValues_[index].length()); + } + addChildValues_ = false; + isMultiLine = isMultiLine || lineLength >= rightMargin_; + } + return isMultiLine; +} + +void BuiltStyledStreamWriter::pushValue(JSONCPP_STRING const& value) { + if (addChildValues_) + childValues_.push_back(value); + else + *sout_ << value; +} + +void BuiltStyledStreamWriter::writeIndent() { + // blep intended this to look at the so-far-written string + // to determine whether we are already indented, but + // with a stream we cannot do that. So we rely on some saved state. + // The caller checks indented_. + + if (!indentation_.empty()) { + // In this case, drop newlines too. + *sout_ << '\n' << indentString_; + } +} + +void BuiltStyledStreamWriter::writeWithIndent(JSONCPP_STRING const& value) { + if (!indented_) writeIndent(); + *sout_ << value; + indented_ = false; +} + +void BuiltStyledStreamWriter::indent() { indentString_ += indentation_; } + +void BuiltStyledStreamWriter::unindent() { + assert(indentString_.size() >= indentation_.size()); + indentString_.resize(indentString_.size() - indentation_.size()); +} + +void BuiltStyledStreamWriter::writeCommentBeforeValue(Value const& root) { + if (cs_ == CommentStyle::None) return; + if (!root.hasComment(commentBefore)) + return; + + if (!indented_) writeIndent(); + const JSONCPP_STRING& comment = root.getComment(commentBefore); + JSONCPP_STRING::const_iterator iter = comment.begin(); + while (iter != comment.end()) { + *sout_ << *iter; + if (*iter == '\n' && + (iter != comment.end() && *(iter + 1) == '/')) + // writeIndent(); // would write extra newline + *sout_ << indentString_; + ++iter; + } + indented_ = false; +} + +void BuiltStyledStreamWriter::writeCommentAfterValueOnSameLine(Value const& root) { + if (cs_ == CommentStyle::None) return; + if (root.hasComment(commentAfterOnSameLine)) + *sout_ << " " + root.getComment(commentAfterOnSameLine); + + if (root.hasComment(commentAfter)) { + writeIndent(); + *sout_ << root.getComment(commentAfter); + } +} + +// static +bool BuiltStyledStreamWriter::hasCommentForValue(const Value& value) { + return value.hasComment(commentBefore) || + value.hasComment(commentAfterOnSameLine) || + value.hasComment(commentAfter); +} + +/////////////// +// StreamWriter + +StreamWriter::StreamWriter() + : sout_(NULL) +{ +} +StreamWriter::~StreamWriter() +{ +} +StreamWriter::Factory::~Factory() +{} +StreamWriterBuilder::StreamWriterBuilder() +{ + setDefaults(&settings_); +} +StreamWriterBuilder::~StreamWriterBuilder() +{} +StreamWriter* StreamWriterBuilder::newStreamWriter() const +{ + JSONCPP_STRING indentation = settings_["indentation"].asString(); + JSONCPP_STRING cs_str = settings_["commentStyle"].asString(); + bool eyc = settings_["enableYAMLCompatibility"].asBool(); + bool dnp = settings_["dropNullPlaceholders"].asBool(); + bool usf = settings_["useSpecialFloats"].asBool(); + unsigned int pre = settings_["precision"].asUInt(); + CommentStyle::Enum cs = CommentStyle::All; + if (cs_str == "All") { + cs = CommentStyle::All; + } else if (cs_str == "None") { + cs = CommentStyle::None; + } else { + throwRuntimeError("commentStyle must be 'All' or 'None'"); + } + JSONCPP_STRING colonSymbol = " : "; + if (eyc) { + colonSymbol = ": "; + } else if (indentation.empty()) { + colonSymbol = ":"; + } + JSONCPP_STRING nullSymbol = "null"; + if (dnp) { + nullSymbol = ""; + } + if (pre > 17) pre = 17; + JSONCPP_STRING endingLineFeedSymbol = ""; + return new BuiltStyledStreamWriter( + indentation, cs, + colonSymbol, nullSymbol, endingLineFeedSymbol, usf, pre); +} +static void getValidWriterKeys(std::set* valid_keys) +{ + valid_keys->clear(); + valid_keys->insert("indentation"); + valid_keys->insert("commentStyle"); + valid_keys->insert("enableYAMLCompatibility"); + valid_keys->insert("dropNullPlaceholders"); + valid_keys->insert("useSpecialFloats"); + valid_keys->insert("precision"); +} +bool StreamWriterBuilder::validate(Json::Value* invalid) const +{ + Json::Value my_invalid; + if (!invalid) invalid = &my_invalid; // so we do not need to test for NULL + Json::Value& inv = *invalid; + std::set valid_keys; + getValidWriterKeys(&valid_keys); + Value::Members keys = settings_.getMemberNames(); + size_t n = keys.size(); + for (size_t i = 0; i < n; ++i) { + JSONCPP_STRING const& key = keys[i]; + if (valid_keys.find(key) == valid_keys.end()) { + inv[key] = settings_[key]; + } + } + return 0u == inv.size(); +} +Value& StreamWriterBuilder::operator[](JSONCPP_STRING key) +{ + return settings_[key]; +} +// static +void StreamWriterBuilder::setDefaults(Json::Value* settings) +{ + //! [StreamWriterBuilderDefaults] + (*settings)["commentStyle"] = "All"; + (*settings)["indentation"] = "\t"; + (*settings)["enableYAMLCompatibility"] = false; + (*settings)["dropNullPlaceholders"] = false; + (*settings)["useSpecialFloats"] = false; + (*settings)["precision"] = 17; + //! [StreamWriterBuilderDefaults] +} + +JSONCPP_STRING writeString(StreamWriter::Factory const& builder, Value const& root) { + JSONCPP_OSTRINGSTREAM sout; + StreamWriterPtr const writer(builder.newStreamWriter()); + writer->write(root, &sout); + return sout.str(); +} + +JSONCPP_OSTREAM& operator<<(JSONCPP_OSTREAM& sout, Value const& root) { + StreamWriterBuilder builder; + StreamWriterPtr const writer(builder.newStreamWriter()); + writer->write(root, &sout); + return sout; +} + +} // namespace Json + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: src/lib_json/json_writer.cpp +// ////////////////////////////////////////////////////////////////////// + + + + +