def computeMetric(self, ph, scenario_tree, instances): normalized_term_diff = 0.0 for stage, tree_node, variable_id, variable_values, is_fixed, is_stale \ in scenario_tree_node_variables_generator_noinstances( scenario_tree, includeDerivedVariables=False, includeLastStage=False): average_value = tree_node._averages[variable_id] # should think about nixing the magic constant below (not # sure how to best pararamterize it). if ((not is_stale) or (is_fixed)) and \ (fabs(average_value) > 0.0001): for var_value, scenario_probability in variable_values: normalized_term_diff += \ scenario_probability * \ fabs((var_value - average_value)/average_value) normalized_term_diff = \ normalized_term_diff / \ (ph._total_discrete_vars + ph._total_continuous_vars) return normalized_term_diff
def _w_printing(self, ofile, ph=None): # print the w values in a useful way to the open file ofile # if ph is None, just write the header if ph is None: ofile.write("iteration; tree node; scenario; variable; ID; W\n") else: root_node_name = ph._scenario_tree.findRootNode()._name for stage, tree_node, variable_id, variable_values, is_fixed, is_stale in \ scenario_tree_node_variables_generator_noinstances(ph._scenario_tree, includeDerivedVariables=False, includeLastStage=False): if is_stale is False \ and (OnlyRootNode is False or tree_node._name == root_node_name): for scenario in tree_node._scenarios: scen_name = scenario._name weight_value = scenario._w[ tree_node._name][variable_id] variable_name, index = tree_node._variable_ids[ variable_id] full_variable_name = variable_name + indexToString( index) ofile.write( str(ph._current_iteration) + ';' + tree_node._name + ';' + scen_name + ';' + full_variable_name + ';' + str(variable_id) + ';' + str(weight_value) + '\n')
def _inspect_variable_convergence(self, ph, ph_iter): # collect termdiff by node and variable so we can # report and possibly sort term_diff = dict((tree_node._name, {}) \ for stage in ph._scenario_tree._stages[:-1] for tree_node in stage._tree_nodes) # Track these for reporting purposes node_fixed_cnt = dict((tree_node._name, 0) \ for stage in ph._scenario_tree._stages[:-1] for tree_node in stage._tree_nodes) total_fixed_cnt = 0 for stage, tree_node, variable_id, variable_values, is_fixed, is_stale \ in scenario_tree_node_variables_generator_noinstances( ph._scenario_tree, includeDerivedVariables=False, includeLastStage=False): if is_fixed: node_fixed_cnt[tree_node._name] += 1 total_fixed_cnt += 1 # Depending on preprocessing options, stale may indicate # fixed or unused in the model, either way we can skip it if (not is_stale): var_node_avg = 0.0 for var_value, scenario_probability in variable_values: var_node_avg += scenario_probability * var_value var_term_diff = 0.0 for var_value, scenario_probability in variable_values: var_term_diff += \ scenario_probability * \ fabs(var_value - var_node_avg) term_diff[tree_node._name][variable_id] = var_term_diff # Print individual variable term diffs by node # and sorted highest to lowest # skip the leaf stage ofile = open(self.wonly_file, 'a') for stage in ph._scenario_tree._stages[:-1]: for tree_node in stage._tree_nodes: for variable_id, var_term_diff in sorted( term_diff[tree_node._name].items(), key=itemgetter(1), reverse=True): variable_name, index = tree_node._variable_ids[variable_id] ofile.write( str(ph_iter) + "; " + tree_node._name + "; " + variable_name + indexToString(index) + "; " + str(var_term_diff) + '\n') ofile.close()
def _inspect_variable_convergence(self, ph, ph_iter): # collect termdiff by node and variable so we can # report and possibly sort term_diff = dict((tree_node._name, {}) \ for stage in ph._scenario_tree._stages[:-1] for tree_node in stage._tree_nodes) # Track these for reporting purposes node_fixed_cnt = dict((tree_node._name, 0) \ for stage in ph._scenario_tree._stages[:-1] for tree_node in stage._tree_nodes) total_fixed_cnt = 0 for stage, tree_node, variable_id, variable_values, is_fixed, is_stale \ in scenario_tree_node_variables_generator_noinstances( ph._scenario_tree, includeDerivedVariables=False, includeLastStage=False): if is_fixed: node_fixed_cnt[tree_node._name] += 1 total_fixed_cnt += 1 # Depending on preprocessing options, stale may indicate # fixed or unused in the model, either way we can skip it if (not is_stale): var_node_avg = 0.0 for var_value, scenario_probability in variable_values: var_node_avg += scenario_probability * var_value var_term_diff = 0.0 for var_value, scenario_probability in variable_values: var_term_diff += \ scenario_probability * \ fabs(var_value - var_node_avg) term_diff[tree_node._name][variable_id] = var_term_diff # Print individual variable term diffs by node # and sorted highest to lowest # skip the leaf stage ofile = open(self.wonly_file, 'a') for stage in ph._scenario_tree._stages[:-1]: for tree_node in stage._tree_nodes: for variable_id, var_term_diff in sorted(term_diff[tree_node._name].items(), key=itemgetter(1), reverse=True): variable_name, index = tree_node._variable_ids[variable_id] ofile.write(str(ph_iter)+"; "+tree_node._name+"; "+variable_name+indexToString(index)+"; "+str(var_term_diff)+'\n') ofile.close()
def _w_printing(self, ofile, ph=None): # print the w values in a useful way to the open file ofile # if ph is None, just write the header if ph is None: ofile.write("iteration; tree node; scenario; variable; W\n") else: for stage, tree_node, variable_id, variable_values, is_fixed, is_stale in \ scenario_tree_node_variables_generator_noinstances(ph._scenario_tree, includeDerivedVariables=False, includeLastStage=False): if (is_stale is False): for scenario in tree_node._scenarios: scen_name = scenario._name weight_value = scenario._w[tree_node._name][variable_id] variable_name, index = tree_node._variable_ids[variable_id] full_variable_name = variable_name+indexToString(index) ofile.write(str(ph._current_iteration) + ';' + tree_node._name + ';' + scen_name + ';' + full_variable_name + ';' + str(weight_value)+'\n')
def computeMetric(self, ph, scenario_tree, instances): term_diff = 0.0 for stage, tree_node, variable_id, variable_values, is_fixed, is_stale \ in scenario_tree_node_variables_generator_noinstances( scenario_tree, includeDerivedVariables=False, includeLastStage=False): if (not is_stale) or (is_fixed): for var_value, scenario_probability in variable_values: term_diff += \ scenario_probability * \ fabs(var_value - tree_node._averages[variable_id]) return term_diff