def __init__(self, model, **settings): """ Initialize the Active Learner :param model: :return: """ O.__init__(self) self.de = DE(model) self.settings = default_settings().update(**settings)
class Active(O): """ Identifying the importance of decisions """ def __init__(self, model, **settings): """ Initialize the Active Learner :param model: :return: """ O.__init__(self) self.de = DE(model) self.settings = default_settings().update(**settings) def learn(self): best_points = [] for _ in range(self.settings.gens): say(".") self.de.model.generate_costs_benefits() stat = self.de.run() last_gen = stat.generations[-1] gen_best_costs = set() gen_best_benefits = set() best_cost = sys.maxint best_benefit = -sys.maxint for point in last_gen: if point.objectives[1] > best_benefit: gen_best_benefits = set() gen_best_benefits.add(point) elif point.objectives[1] == best_benefit: gen_best_benefits.add(point) if point.objectives[0] < best_cost: gen_best_costs = set() gen_best_costs.add(point) elif point.objectives[0] == best_cost: gen_best_costs.add(point) best_points += list(gen_best_costs) best_points += list(gen_best_benefits) return best_points def cluster(self, best_points): rows = [] for point in best_points: objs = point.objectives + [point.decisions_set] row = Row(objs) row.meta = O(costs=point.node_costs, benefits=point.node_benefits) rows.append(row) where = Where(rows, min_size=(len(rows)**0.5)) print("") root = where.cluster(verbose=self.settings.verbose) clusters = where.get_leaves(root) return clusters def report_cluster(self, cluster): decisions_map = {} costs_map = {} benefits_map = {} report = Report() for row in cluster.get_rows(): for index, decision in enumerate(row.decisions): decisions = decisions_map.get(index, []) decisions.append(decision) decisions_map[index] = decisions for node_id in row.meta.costs.keys(): node_costs = costs_map.get(node_id, []) node_costs.append(row.meta.costs[node_id]) costs_map[node_id] = node_costs node_benefits = benefits_map.get(node_id, []) node_benefits.append(row.meta.benefits[node_id]) benefits_map[node_id] = node_benefits decisions_report = OrderedDict() for index, name in enumerate(self.settings.decisions_names): median, iqr = median_iqr(decisions_map[index]) decisions_report[name] = O(median=median, iqr=iqr) report.decisions = decisions_report nodes_report = OrderedDict() for node_id in costs_map.keys(): name = self.de.model.get_tree().get_node(node_id).name costs = costs_map[node_id] benefits = benefits_map[node_id] costs_median, costs_iqr = median_iqr(costs) benefits_median, benefits_iqr = median_iqr(benefits) nodes_report[name] = O(cost=O(median=costs_median, iqr=costs_iqr), benefit=O(median=benefits_median, iqr=benefits_iqr)) report.nodes = nodes_report return report def dump_clusters(self, cluster_reports, folder): def to_csv(file_name, rows): with open(file_name, "wb") as file_obj: writer = csv.writer(file_obj) writer.writerows(rows) return file_name #decisions = cluster_reports[0].nodes.keys() decisions = [base.name for base in self.de.model.bases] objectives = cluster_reports[0].decisions.keys() costs_list, benefits_list = [], [] header = ["Cluster ID" ] + decisions + ["?%s" % obj for obj in objectives] costs_list.append(header) benefits_list.append(header) for cluster_id, cluster in enumerate(cluster_reports): cost_row, benefit_row = [cluster_id + 1], [cluster_id + 1] for decision in decisions: cost_row.append(cluster.nodes[decision].cost.median) benefit_row.append(cluster.nodes[decision].benefit.median) for objective in objectives: cost_row.append(cluster.decisions[objective].median) benefit_row.append(cluster.decisions[objective].median) costs_list.append(cost_row) benefits_list.append(benefit_row) directory = "csv/%s" % folder mkdir(directory) cost_csv = to_csv("%s/costs.csv" % directory, costs_list) benefit_csv = to_csv("%s/benefits.csv" % directory, benefits_list) print("### [Costs](../../../src/%s)" % cost_csv) print("### [Benefits](../../../src/%s)" % benefit_csv)
class Active(O): """ Identifying the importance of decisions """ def __init__(self, model, **settings): """ Initialize the Active Learner :param model: :return: """ O.__init__(self) self.de = DE(model) self.settings = default_settings().update(**settings) def learn(self): best_points = [] for _ in range(self.settings.gens): say(".") self.de.model.generate_costs_benefits() stat = self.de.run() last_gen = stat.generations[-1] gen_best_costs = set() gen_best_benefits = set() best_cost = sys.maxint best_benefit = -sys.maxint for point in last_gen: if point.objectives[1] > best_benefit: gen_best_benefits = set() gen_best_benefits.add(point) elif point.objectives[1] == best_benefit: gen_best_benefits.add(point) if point.objectives[0] < best_cost: gen_best_costs = set() gen_best_costs.add(point) elif point.objectives[0] == best_cost: gen_best_costs.add(point) best_points += list(gen_best_costs) best_points += list(gen_best_benefits) return best_points def cluster(self, best_points): rows = [] for point in best_points: objs = point.objectives + [point.decisions_set] row = Row(objs) row.meta = O(costs=point.node_costs, benefits = point.node_benefits) rows.append(row) where = Where(rows, min_size = (len(rows)**0.5)) print("") root = where.cluster(verbose=self.settings.verbose) clusters = where.get_leaves(root) return clusters def report_cluster(self, cluster): decisions_map = {} costs_map = {} benefits_map = {} report = Report() for row in cluster.get_rows(): for index, decision in enumerate(row.decisions): decisions = decisions_map.get(index, []) decisions.append(decision) decisions_map[index] = decisions for node_id in row.meta.costs.keys(): node_costs = costs_map.get(node_id, []) node_costs.append(row.meta.costs[node_id]) costs_map[node_id] = node_costs node_benefits = benefits_map.get(node_id, []) node_benefits.append(row.meta.benefits[node_id]) benefits_map[node_id] = node_benefits decisions_report = OrderedDict() for index, name in enumerate(self.settings.decisions_names): median, iqr = median_iqr(decisions_map[index]) decisions_report[name] = O(median = median, iqr = iqr) report.decisions = decisions_report nodes_report = OrderedDict() for node_id in costs_map.keys(): name = self.de.model.get_tree().get_node(node_id).name costs = costs_map[node_id] benefits = benefits_map[node_id] costs_median, costs_iqr = median_iqr(costs) benefits_median, benefits_iqr = median_iqr(benefits) nodes_report[name] = O(cost=O(median=costs_median, iqr=costs_iqr), benefit=O(median=benefits_median, iqr=benefits_iqr)) report.nodes = nodes_report return report def dump_clusters(self, cluster_reports, folder): def to_csv(file_name, rows): with open(file_name, "wb") as file_obj: writer = csv.writer(file_obj) writer.writerows(rows) return file_name #decisions = cluster_reports[0].nodes.keys() decisions = [base.name for base in self.de.model.bases] objectives = cluster_reports[0].decisions.keys() costs_list, benefits_list = [], [] header = ["Cluster ID"] + decisions + ["?%s"%obj for obj in objectives] costs_list.append(header) benefits_list.append(header) for cluster_id, cluster in enumerate(cluster_reports): cost_row, benefit_row = [cluster_id+1], [cluster_id+1] for decision in decisions: cost_row.append(cluster.nodes[decision].cost.median) benefit_row.append(cluster.nodes[decision].benefit.median) for objective in objectives: cost_row.append(cluster.decisions[objective].median) benefit_row.append(cluster.decisions[objective].median) costs_list.append(cost_row) benefits_list.append(benefit_row) directory = "csv/%s"%folder mkdir(directory) cost_csv = to_csv("%s/costs.csv"%directory, costs_list) benefit_csv = to_csv("%s/benefits.csv"%directory, benefits_list) print("### [Costs](../../../src/%s)"%cost_csv) print("### [Benefits](../../../src/%s)"%benefit_csv)