From aa6a09ea4e9616d11d3cb3f7c47b14033160c788 Mon Sep 17 00:00:00 2001 From: Jerry Yurchisin Date: Wed, 13 Nov 2024 18:54:44 -0500 Subject: [PATCH] streamlining --- .../opti202_disaster_prepositioning.ipynb | 93 ++------ .../workspaces/helper_scripts.py | 217 ------------------ .../workspaces/temp_Analyer_workspace.py | 115 ---------- .../workspaces/temp_solver_workspace.py | 200 ---------------- .../workspaces/temp_worker_workspace.py | 107 --------- 5 files changed, 14 insertions(+), 718 deletions(-) delete mode 100644 optimization202/ESUPS_case_study/workspaces/helper_scripts.py delete mode 100644 optimization202/ESUPS_case_study/workspaces/temp_Analyer_workspace.py delete mode 100644 optimization202/ESUPS_case_study/workspaces/temp_solver_workspace.py delete mode 100644 optimization202/ESUPS_case_study/workspaces/temp_worker_workspace.py diff --git a/optimization202/ESUPS_case_study/opti202_disaster_prepositioning.ipynb b/optimization202/ESUPS_case_study/opti202_disaster_prepositioning.ipynb index 68a3bed..71f136d 100644 --- a/optimization202/ESUPS_case_study/opti202_disaster_prepositioning.ipynb +++ b/optimization202/ESUPS_case_study/opti202_disaster_prepositioning.ipynb @@ -11,25 +11,9 @@ }, { "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "" - ] - }, - "execution_count": 21, - "metadata": { - "image/png": { - "width": 600 - } - }, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "from IPython.display import Image\n", "Image(filename='images/ESUPS-Logo.png', width=600)" @@ -220,16 +204,14 @@ "outputs": [], "source": [ "def graph_locations():\n", - " h = 0.1\n", - " l = -0.1\n", " warehouses = [['warehouses',\n", - " depot.latitude + np.random.uniform(low=l, high=h),\n", - " depot.longitude + np.random.uniform(low=l, high=h)] \n", + " depot.latitude,\n", + " depot.longitude] \n", " for depot in dataset.depots]\n", "\n", " disasters = [['disasters',\n", - " disaster_locations.latitude + np.random.uniform(low=l, high=h),\n", - " disaster_locations.longitude + np.random.uniform(low=l, high=h)] \n", + " disaster_locations.latitude,\n", + " disaster_locations.longitude] \n", " for disaster_locations in dataset.disaster_locations]\n", "\n", " dfw = pd.DataFrame(warehouses)\n", @@ -621,11 +603,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The earlier version of the ESUPS dashboard, while not perfect, played a critical role in enabling the organization to quickly deliver a functional product that demonstrated tangible results to other non-profits. This initial version provided the essential tools needed to map stockpiles and showcase the value of the platform in real-world scenarios. By prioritizing functionality and speed, ESUPS was able to meet the immediate needs of its partners, proving the concept and gaining crucial buy-in from stakeholders.\n", + "Here is one of the earlier versions of the ESUPS dashboard; even in v1, it played a critical role in enabling the organization to quickly deliver a functional product that demonstrated tangible results to other non-profits. This initial version provided the essential tools needed to map stockpiles and showcase the value of the platform in real-world scenarios. By prioritizing functionality and speed, ESUPS was able to meet the immediate needs of its partners, proving the concept and gaining crucial buy-in from stakeholders.\n", "\n", - "The design, though basic, allowed for rapid deployment and iteration, proving that in the early stages of development, it's more important to have a working solution than to strive for perfection. The dashboard's ability to deliver key insights swiftly and effectively earned it significant merit, as it laid the groundwork for future improvements and set the stage for more advanced iterations. This approach underscores a vital lesson in development: sometimes, a good solution delivered quickly can be more valuable than a perfect one delivered too late.\n", - "\n", - "The initial success provided a strong foundation upon which ESUPS could build. The insights gained from this deployment informed the development of a new version, which addresses the limitations of the first while enhancing user experience and data communication. The new dashboard takes these lessons to heart, incorporating more advanced features and a more intuitive design, ensuring that ESUPS continues to meet the needs of its partners more effectively. Now, let’s explore how this new version improves upon the original and further advances ESUPS' mission." + "The lesson here: Start with the tools and skills available and always look for ways to improve. " ] }, { @@ -778,7 +758,7 @@ " #print('%s %g | total= %g | distance=%g' % (v.VarName, v.X,total[2],dis))\n", " b.append([v.VarName, v.X,total[2],dis])\n", "b=pd.DataFrame(b)\n", - "b.columns=['Var','amount','possible','distance' ]\n", + "b.columns=['Var','amount','possible','distance']\n", "b.sort_values('distance')" ] }, @@ -1054,34 +1034,6 @@ "##### Intermediate Problems" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Custom Die Game:**\n", - "Imagine a custom die with faces labeled 1, 2, 3, 4, 5, and 6. Each face has a different probability: \\(P(1) = 0.1\\), \\(P(2) = 0.2\\), \\(P(3) = 0.15\\), \\(P(4) = 0.25\\), \\(P(5) = 0.2\\), and \\(P(6) = 0.1\\). If the outcome of the die is 1, you win $2; for a 2, you win $4; for a 3, you win $6; for a 4, you lose $3; for a 5, you lose $7; and for a 6, you lose $5. What is the expected value of this game?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Solution:\n", - "$$\n", - "\\begin{aligned}\n", - "E[X] &= (0.1 \\times 2) + (0.2 \\times 4) + (0.15 \\times 6) + (0.25 \\times -3) + (0.2 \\times -7) + (0.1 \\times -5)\n", - "\n", - "\\\\\n", - "E[X] &= (0.2) + (0.8) + (0.9) + (-0.75) + (-1.4) + (-0.5)\n", - "\\\\\n", - "\n", - "E[X] &= 1.9 - 2.65 = -0.75\n", - "\n", - "\\end{aligned}\n", - "$$\n", - "**Answer**:The expected value is $-\\$0.75$. On average, you lose $75$ cents per roll.\n" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -1122,23 +1074,6 @@ "**Answer**: The expected value is approximately \\$0.23. On average, you gain 23 cents per draw.\n" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "##### Advanced Extension Problems \n", - "\n", - "5. **Roulette Game:**\n", - " You bet $1 on a single number in a game of American Roulette. If the ball lands on your number, you win $35; otherwise, you lose your bet. There are 38 slots on an American Roulette wheel (numbers 1-36, 0, and 00). What is the expected value of this bet?\n", - "\n", - "6. **Insurance Policy:**\n", - " An insurance company sells a one-year term life insurance policy for $500 to a healthy 30-year-old. The policy pays $100,000 in case of death within the year. The probability of a healthy 30-year-old dying within a year is 0.001. What is the expected profit for the insurance company from selling this policy?\n", - "\n", - "7. **Stock Investment Scenario:**\n", - " Suppose you invest in a stock with three possible outcomes over a year: there is a 50% chance it will increase by 10%, a 30% chance it will decrease by 5%, and a 20% chance it will decrease by 15%. What is the expected value of the return on investment after one year?\n" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -1475,11 +1410,11 @@ "\\begin{aligned}\n", "\\text{s.t.} \\\\\n", "\\sum_{i}\\sum_{r} & y^k_{ir}&=d^k & & \\hspace{.2cm} \\text{(total supplies sent must meet demand)}\\\\\n", - " \\sum_{r} & y^k_{ir} &\\leq x_i & \\forall i \\in I& \\hspace{.2cm}\\text{(you can't send more than a warehouse has)}\\\\\n", - " \\sum_{i} & x_i&=\\chi & & \\hspace{.2cm} \\text{(we allocate all supplies and no more)}\\\\\n", - "\\text{} & y^k_{ir} &\\geq 0 &\\forall r\\in R, i \\in I& \\hspace{.2cm} \\text{(you can't send negative supplies)}\\\\\n", + "\\sum_{r} & y^k_{ir} &\\leq x_i & \\forall i \\in I& \\hspace{.2cm}\\text{(you can't send more than a warehouse has)}\\\\\n", + "\\sum_{i} & x_i&=\\chi & & \\hspace{.2cm} \\text{(we allocate all supplies and no more)}\\\\\n", + "& y^k_{ir} &\\geq 0, \\space &\\forall r\\in R, i \\in I& \\hspace{.2cm} \\text{(you can't send negative supplies)}\\\\\n", "\\\\\n", - "& x_{i} &\\geq 0 &\\forall i \\in I& \\hspace{.2cm} \\text{(you can't allocate negative supplies)}\\\\\n", + "& x_{i} &\\geq 0 , \\space &\\forall i \\in I& \\hspace{.2cm} \\text{(you can't allocate negative supplies)}\\\\\n", "\n", "\n", "\\end{aligned}\n", diff --git a/optimization202/ESUPS_case_study/workspaces/helper_scripts.py b/optimization202/ESUPS_case_study/workspaces/helper_scripts.py deleted file mode 100644 index 236b15d..0000000 --- a/optimization202/ESUPS_case_study/workspaces/helper_scripts.py +++ /dev/null @@ -1,217 +0,0 @@ - -#Called in analysis/analysis worker to filter the disasters by time -def _filter_dataset(self, dataset: Dataset) -> Dataset: - if self.parameters.disaster_month > -1: - months = range( - self.parameters.disaster_month, - self.parameters.disaster_month - + 1 - + self.parameters.num_months_to_average, - ) - months = [(month - 1) % 12 + 1 for month in months] - predicate: Callable[[Disaster], bool] = ( - lambda disaster: disaster.month in months - ) - dataset = dataset.take_disaster_subset(predicate) - - dataset = dataset.take_disaster_subset( - lambda disaster: disaster.year >= self.parameters.min_year - and disaster.year <= self.parameters.max_year - ) - - return dataset - - -def _post_process( - self, - dataset: Dataset, - item: Item, - costs: dict[SolverObjective, CostMatrix], - solutions: dict[SolutionTags, Solution], - ): - beta_source = ( - dataset.persons_per_item_monthly - if self.parameters.care_about_month_demand - else dataset.persons_per_item_general - ) - beta = { - location.id: beta_source[location, item] - for disaster in dataset.disasters - for location in disaster.impacted_locations - } - - solution_stats = pd.DataFrame.from_records( - [ - { - "objective": objective, - "strategy": strategy, - "coveredDemandExcDummy": solution.covered_demand_exc_dummy, - "dualTotInv": solution.dual_total_inventory, - "totalCostIncDummy": solution.total_cost_inc_dummy, - "totalCostExcDummy": solution.total_cost_exc_dummy, - "totalDemand": solution.total_demand, - "fractionOfDisastersUsingDummy": solution.fraction_of_disasters_using_dummy, - } - for (objective, strategy), solution in solutions.items() - ] - ).set_index(["objective", "strategy"]) - - df_flows = pd.DataFrame.from_records( - [ - { - "objective": objective, - "strategy": strategy, - "disaster": disaster.id, - "depot": depot.id, - "impact": impact.id, - "location": impact.location.id, - "mode": mode.id, - "flow": value, - "distance": dataset.distance[depot, impact.location, mode].distance - if depot.id != "DUMMY" - else None, - } - for (objective, strategy), solution in solutions.items() - for (disaster, depot, impact, mode), value in solution.flow.items() - ] - ) - - # Average unit cost - solution_stats["averageUnitCost"] = solution_stats["totalCostExcDummy"] / ( - solution_stats["coveredDemandExcDummy"] + 1e-7 - ) - - # Demand fulfillment fraction - solution_stats["demandFulfillmentFraction"] = solution_stats[ - "coveredDemandExcDummy" - ] / (solution_stats["totalDemand"] + 1e-7) - - # Balance metric - strategies = set(solution_stats.reset_index()["strategy"]) - pivoted = solution_stats.reset_index().pivot( - index="objective", columns="strategy", values="totalCostExcDummy" - ) - pivoted["balanceMetric"] = ( - pivoted[AllocationStrategy.MinimizeFixedInventory] - / (pivoted[AllocationStrategy.MinimizeTwoStage] + 1e-7) - if AllocationStrategy.MinimizeFixedInventory in strategies - and AllocationStrategy.MinimizeTwoStage in strategies - else None - ) - balance_metric = pivoted - - df_probabilities = pd.DataFrame.from_dict( - { - disaster.id: dataset.probabilities[disaster] - for disaster in dataset.disasters - }, - columns=["probability"], - orient="index", - ) - - # Units shipped - df_flow_no_dummy = df_flows.join(df_probabilities, on="disaster") - df_flow_no_dummy = df_flow_no_dummy[ - df_flow_no_dummy["depot"] != "DUMMY" - ] # TODO Replace hardcoded dummy ID - temp = df_flow_no_dummy.copy() - temp["unitsShipped"] = temp["probability"] * temp["flow"] - temp["unitsShippedWeighted"] = temp["unitsShipped"] * temp["distance"] - units_shipped = ( - temp.set_index(["objective", "strategy", "mode"])[ - ["unitsShipped", "unitsShippedWeighted"] - ] - .groupby(["objective", "strategy", "mode"]) - .sum() - ) - - # People served per item - temp = df_flow_no_dummy.copy() - temp["beta"] = temp["impact"].apply(lambda loc: beta[loc]) - temp["peopleServed"] = temp["probability"] * temp["beta"] * temp["flow"] - people_served = ( - temp.set_index(["objective", "strategy"])["peopleServed"] - .groupby(["objective", "strategy"]) - .sum() - ) - people_served_per_item = pd.DataFrame( - people_served / (solution_stats["coveredDemandExcDummy"] + 1e-7), - columns=["peopleServedPerItem"], - ) - - # Impact of optimizing one objective on another objective - impact = [] - for other in self.parameters.comparison_objectives: - cost = { - (depot.id, location.id, mode.id): value - for (depot, location, mode), value in costs[other].items() - } - temp = df_flow_no_dummy.copy() - if temp.empty: - raise RuntimeError("Empty flow matrix encountered") - temp["cost"] = temp.apply( - lambda row: cost[row["depot"], row["location"], row["mode"]], axis=1 - ) - temp["other"] = other - temp["impact"] = temp["cost"] * temp["probability"] * temp["flow"] - impact.append(temp.reset_index()) - cross_impact = ( - pd.concat(impact) - .groupby(["objective", "strategy", "other"])[["impact"]] - .sum() - ) - - return Analysis( - self.parameters, - dataset, - item, - solutions, - solution_stats, - balance_metric, - units_shipped, - people_served_per_item, - cross_impact, - ) - - - - - -def _get_arc_cost( - self, - cost: CostMatrix, - source: Location, - target: DisasterImpact, - mode: TransportMode, -): - if source == self._dummy: - return self._threshold_cost_dummy - cell = cost.get((source, target.location, mode)) - return self._threshold_cost_elim if cell == None else cell - -def _scale_demand(self, problem: Problem) -> dict[DisasterImpact, float]: - supply = sum(problem.inventory.values()) - result: dict[DisasterImpact, float] = {} - for disaster in problem.disasters: - total_demand = sum( - problem.demand[location] for location in disaster.impacted_locations - ) - factor = min(1, supply / total_demand) if total_demand > 1e-6 else 1 - for location in disaster.impacted_locations: - result[location] = factor * problem.demand[location] - return result - - - - - - - - - - - - - - - diff --git a/optimization202/ESUPS_case_study/workspaces/temp_Analyer_workspace.py b/optimization202/ESUPS_case_study/workspaces/temp_Analyer_workspace.py deleted file mode 100644 index 01299d1..0000000 --- a/optimization202/ESUPS_case_study/workspaces/temp_Analyer_workspace.py +++ /dev/null @@ -1,115 +0,0 @@ - - -#Code for the class - -from enum import IntEnum -from multiprocessing import Pool -from os import getenv -from typing import Callable - -import pandas as pd - -from src.data import Dataset, Disaster, DisasterImpact, DistanceInfo, Item -from src.solving import ( - AllocationStrategy, - CostMatrix, - Problem, - Solution, - SolverParameters, - StochasticSolver, -) - - -class AnalysisParameters: - """ - - Attributes - ---------- - expand_depot_set - Flag indicating whether inventory can be reallocated to depots that don't currently hold any stock - care_about_month_demand - Flag indicating whether we take month-by-month demand (True) or the general number (False) - disaster_month - Month from which to select disasters - num_months_to_average - Number of months to use for selecting disasters, when disasterMonth>=0 - optimization_objectives - Set of objectives to use for running the optimization model - comparison_objectives - Set of objectives to use for comparing results - allocation_strategies - Which strategies to test for (re)allocation inventory to depots in the first stage - min_year - First year from which disasters should be taken into account - max_year - Last year from which disasters should be taken into account - scale_demand - Whether demand must be scaled to not exceed total available inventory or not - - - """ - - expand_depot_set: bool = False - care_about_month_demand: bool = True - disaster_month: int = -1 - num_months_to_average: int = 3 - optimization_objectives: list[SolverObjective] = [ - SolverObjective.Cost, - SolverObjective.Time, - ] - comparison_objectives: list[SolverObjective] = list(SolverObjective) - allocation_strategies: list[AllocationStrategy] = list(AllocationStrategy) - min_year: int = 1900 - max_year: int = 2100 - scale_demand: bool = True - - - - - -#instanctiate object, might be better to just make the object - -parameters = AnalysisParameters() - - - -analyzer = Analyzer(parameters) - - -#def run_all(self, dataset: Dataset) -> dict[tuple[str, Item], Analysis]: -inventory_datasets = { - filename: dataset.take_inventory_scenario(filename) - for filename in dataset.inventory_scenarios -} -tasks = [ - (filename, inventory_dataset, item) - for (filename, inventory_dataset) in inventory_datasets.items() - for item in inventory_dataset.items -] - - - - -#def _run_tasks(self, tasks: list[tuple[str, Dataset, Item]]): - - - -_solver=StochasticSolver() -#worker = AnalyzerWorker(self.parameters) -result = [ - (filename, format_data(dataset, item,parameters)) - for (filename, dataset, item) in tasks -] - - - - - -PROCESSED_INFO= { - (filename, analysis.item): analysis - for (filename, analysis) in result - if analysis is not None -} - - - diff --git a/optimization202/ESUPS_case_study/workspaces/temp_solver_workspace.py b/optimization202/ESUPS_case_study/workspaces/temp_solver_workspace.py deleted file mode 100644 index 69b77ee..0000000 --- a/optimization202/ESUPS_case_study/workspaces/temp_solver_workspace.py +++ /dev/null @@ -1,200 +0,0 @@ - -from dataclasses import dataclass -from enum import IntEnum -from typing import Tuple, Union - -import gurobipy as gp -from gurobipy import GRB, tupledict - -from src.data import Depot, Disaster, DisasterImpact, Location, TransportMode - - - -class StochasticSolver: - _threshold_cost_elim: float = 1e9 - _threshold_cost_dummy: float = 1e9 - - def __init__(self): - self._dummy = Location("DUMMY", "", "", 0, 0) - self._env = gp.Env(params={"OutputFlag": 0, "Threads": 1}) - - def dispose(self): - self._env.dispose() - self._env = None - - def solve(self, problem: Problem, parameters: SolverParameters) -> Solution: - sources = problem.depots + [self._dummy] - - demand = ( - self._scale_demand(problem) if parameters.scale_demand else problem.demand - ) - - arcs = gp.tuplelist( - [ - (k, i, j, v) - for i in sources - for k in problem.disasters - for j in k.impacted_locations - for v in problem.transport_modes - if ( - self._get_arc_cost(problem.cost, i, j, v) - < self._threshold_cost_elim - ) - or (i == self._dummy) - ] - ) - - arc_cost = { - (k, i, j, v): self._get_arc_cost(problem.cost, i, j, v) - * problem.probabilities[k] - for (k, i, j, v) in arcs - } - - model = gp.Model("StochLP", env=self._env) - - # First stage variable: Quantity to be allocated to each depot - x: tupledict[Depot, gp.Var] = model.addVars(problem.depots, lb=0, name="x") - - # Second stage variable: Quantity transported from (real or dummy) depot to disaster locations using each mode of transport - y: tupledict[ - Tuple[Disaster, Union[Depot, Location], DisasterImpact, TransportMode], - gp.Var, - ] = model.addVars(arcs, lb=0, obj=arc_cost, name="y") - - # Constraint: Total incoming arc flow must cover demand for each disaster location - model.addConstrs( - ( - y.sum(k, "*", j, "*") == demand[j] - for k in problem.disasters - for j in k.impacted_locations - ), - name="satisfyDemand", - ) - - # Constraint: Total outgoing arc flow must match initial or reallocated inventory - inventory_balance: tupledict[ - Tuple[Disaster, Depot], gp.Constr - ] = model.addConstrs( - ( - y.sum(k, i, "*", "*") <= x[i] - for k in problem.disasters - for i in problem.depots - ), - name="satisfySupply", - ) - - # Constraint: Ensure inventory reallocation matches total existing inventory - total_initial_inventory = sum(problem.inventory.values()) - match_total_inventory = model.addConstr(x.sum() == total_initial_inventory) - - def fix_inventory_balance(values: dict[Disaster, float]): - for key, value in values.items(): - x[key].LB = x[key].UB = value - - if parameters.allocation_strategy == AllocationStrategy.MinimizeFixedInventory: - fix_inventory_balance(problem.inventory) - elif parameters.allocation_strategy == AllocationStrategy.WorstDepot: - worst_depot = None - worst_objective = -1e100 - for depot in problem.depots: - centralized_inventory = { - other: total_initial_inventory if other == depot else 0 - for other in problem.depots - } - fix_inventory_balance(centralized_inventory) - model.optimize() - if model.Status != GRB.Status.OPTIMAL: - raise RuntimeError("Could not solve model to optimality") - if model.ObjVal > worst_objective: - worst_depot = depot - worst_objective = model.ObjVal - centralized_inventory = { - other: total_initial_inventory if other == worst_depot else 0 - for other in problem.depots - } - fix_inventory_balance(centralized_inventory) - - model.optimize() - if model.Status != GRB.Status.OPTIMAL: - raise RuntimeError("Could not solve model to optimality") - - # Total transport cost - total_cost_inc_dummy = model.ObjVal - dummy_cost = sum( - var.X * var.Obj for var in y.select("*", self._dummy, "*", "*") - ) - total_cost_exc_dummy = total_cost_inc_dummy - dummy_cost - - # Demand met without using the dummy node - covered_demand_by_dummy = sum( - y[k, i, j, v].X * problem.probabilities[k] - for (k, i, j, v) in arcs.select("*", self._dummy, "*", "*") - ) - total_demand = sum( - local_demand * problem.probabilities[j.disaster] - for (j, local_demand) in demand.items() - ) - covered_demand_exc_dummy = total_demand - covered_demand_by_dummy - - # Flow in solution - solution_y = {key: y[key].X for key in arcs} - - # Fraction of disaster scenarios in which the dummy supply is used - fraction_of_disasters_using_dummy = len( - [ - disaster - for disaster in problem.disasters - if sum( - solution_y[key] - for key in arcs.select(disaster, self._dummy, "*", "*") - ) - > 0 - ] - ) / len(problem.disasters) - - # Dual variables for the inventory balance constraints - dual_correction = fraction_of_disasters_using_dummy * self._threshold_cost_dummy - duals_inventory_exc_dummy_unadjusted = { - i: sum(inventory_balance[k, i].Pi for k in problem.disasters) - for i in problem.depots - } - duals_inventory_exc_dummy_plus_dummy_cost = { - i: dual_correction + pi - for (i, pi) in duals_inventory_exc_dummy_unadjusted.items() - } - duals_inventory_exc_dummy_all = { - (k, i): constr.Pi for (k, i), constr in inventory_balance.items() - } - - flow = {(k, i, j, v): var.X for (k, i, j, v), var in y.items() if var.X > 0} - - flow_exc_dummy = { - (k, i, j, v): value - for (k, i, j, v), value in flow.items() - if i != self._dummy - } - - optimal_inventory = {depot: var.X for depot, var in x.items()} - - dual_total_inventory = ( - match_total_inventory.Pi - if parameters.allocation_strategy - == AllocationStrategy.MinimizeFixedInventory - else None - ) - - return Solution( - total_cost_inc_dummy, - total_cost_exc_dummy, - total_demand, - covered_demand_exc_dummy, - fraction_of_disasters_using_dummy, - duals_inventory_exc_dummy_plus_dummy_cost, - duals_inventory_exc_dummy_unadjusted, - duals_inventory_exc_dummy_all, - flow_exc_dummy, - flow, - optimal_inventory, - dual_total_inventory, - self._dummy, - ) diff --git a/optimization202/ESUPS_case_study/workspaces/temp_worker_workspace.py b/optimization202/ESUPS_case_study/workspaces/temp_worker_workspace.py deleted file mode 100644 index a1b5196..0000000 --- a/optimization202/ESUPS_case_study/workspaces/temp_worker_workspace.py +++ /dev/null @@ -1,107 +0,0 @@ -#This script will roughly fill in the job that a worker does, -#it will become a jupyter notebook -from enum import IntEnum -from multiprocessing import Pool -from os import getenv -from typing import Callable - -import pandas as pd - -from src.data import Dataset, Disaster, DisasterImpact, DistanceInfo, Item -from src.solving import ( - AllocationStrategy, - CostMatrix, - Problem, - Solution, - SolverParameters, - StochasticSolver, -) - - -def format_data(dataset,item,parameters): -#Calculate disaster prob - - #dataset = self._filter_dataset(dataset) - probabilities = { - disaster: 1 / len(dataset.disasters) for disaster in dataset.disasters - } - - - - #Let's derfine our dictionary to store all the dictionaries - - solutions: dict[SolutionTags, Solution] = {} - - #First we construct the chance each distaster will occur - probabilities = { - disaster: 1 / len(dataset.disasters) for disaster in dataset.disasters - } - - #Now we need to create our cost matrix to tell the solver how much each thing will - #reguire from out budget - - #To do this we will iterate over every item in our dataset and return the designated item - cost_matrices={} - for key, value in dataset.distance.items(): - match objective: - case SolverObjective.Cost: - aa = item.weight * value.cost_per_ton - - case SolverObjective.Time: - aa = value.time - - case SolverObjective.Distance: - aa = value.distance - cost_matrices[key]=aa - - - #Now we find the inventory in a nice formate - inventory = { - depot: dataset.inventory.get((depot, item), 0) - for depot in dataset.depots - if self.parameters.expand_depot_set - or dataset.inventory.get((depot, item), 0) > 0 - } - - - #Check that there is inventory - if sum(inventory.values()) == 0: - return None - - - #Now we get the demand for each item - - #One of the settings we can tweak, need to look more at this - source = ( - dataset.monthly_demand - if self.parameters.care_about_month_demand - else dataset.general_demand - ) - - #After the setting is tweeked, we now make the dictionary - demand={ - location: source.get((location, item), 0) - for disaster in dataset.disasters - for location in disaster.impacted_locations - } - - # Solve models for all objectives - for objective in self.parameters.optimization_objectives: - #Check all stratigies for each objective - for strategy in self.parameters.allocation_strategies: - problem = Problem( #from another file - dataset.depots, - inventory, - demand, - dataset.disasters, - probabilities, - dataset.transport_modes, - cost_matrices[objective], - ) - parameters = SolverParameters(strategy, self.parameters.scale_demand) - tags = (objective, strategy) - solutions[tags] = self._solver.solve(problem, parameters) - - return self._post_process(dataset, item, cost_matrices, solutions) - - #self._solver = StochasticSolver()