simopt.models.ironore

Simulate production and sales over multiple periods for an iron ore inventory.

Module Contents

class simopt.models.ironore.IronOreConfig

Bases: pydantic.BaseModel

Configuration model for Iron Ore Inventory simulation.

A model that simulates multiple periods of production and sales for an inventory problem with stochastic price determined by a mean-reverting random walk. Returns total profit, fraction of days producing iron, and mean stock.

mean_price: Annotated[float, Field(default=100.0, description='mean iron ore price per unit', gt=0)]
max_price: Annotated[float, Field(default=200.0, description='maximum iron ore price per unit', gt=0)]
min_price: Annotated[float, Field(default=0.0, description='minimum iron ore price per unit', ge=0)]
capacity: Annotated[int, Field(default=10000, description='maximum holding capacity', ge=0)]
st_dev: Annotated[float, Field(default=7.5, description='standard deviation of random walk steps for price', gt=0)]
holding_cost: Annotated[float, Field(default=1.0, description='holding cost per unit per period', gt=0)]
prod_cost: Annotated[float, Field(default=100.0, description='production cost per unit', gt=0)]
max_prod_perday: Annotated[int, Field(default=100, description='maximum units produced per day', gt=0)]
price_prod: Annotated[float, Field(default=80.0, description='price level to start production', gt=0)]
inven_stop: Annotated[int, Field(default=7000, description='inventory level to cease production', gt=0)]
price_stop: Annotated[float, Field(default=40.0, description='price level to stop production', gt=0)]
price_sell: Annotated[float, Field(default=100.0, description='price level to sell all stock', gt=0)]
n_days: Annotated[int, Field(default=365, description='number of days to simulate', ge=1, json_schema_extra={'isDatafarmable': False})]
class simopt.models.ironore.IronOreMaxRevCntConfig

Bases: pydantic.BaseModel

Configuration model for Iron Ore Max Revenue Continuous Problem.

Max Revenue for Continuous Iron Ore simulation-optimization problem.

initial_solution: Annotated[tuple[float, Ellipsis], Field(default=80, 40, 100, description='initial solution')]
budget: Annotated[int, Field(default=1000, description='max # of replications for a solver to take', gt=0)]
class simopt.models.ironore.IronOreMaxRevConfig

Bases: pydantic.BaseModel

Configuration model for Iron Ore Max Revenue Problem.

Max Revenue for Iron Ore simulation-optimization problem.

initial_solution: Annotated[tuple[float, Ellipsis], Field(default=80, 7000, 40, 100, description='initial solution')]
budget: Annotated[int, Field(default=1000, description='max # of replications for a solver to take', gt=0, json_schema_extra={'isDatafarmable': False})]
class simopt.models.ironore.MovementInputModel

Bases: simopt.input_models.InputModel

Input model for mining movement and price shocks.

rng: random.Random | None = None
random(mean: float, std: float) float

Generate a random variate from the input model.

Returns:

A random variate from the input model.

Return type:

T

class simopt.models.ironore.IronOre(fixed_factors: dict | None = None)

Bases: simopt.base.Model

Iron Ore Inventory Model.

A model that simulates multiple periods of production and sales for an inventory problem with stochastic price determined by a mean-reverting random walk. Returns total profit, fraction of days producing iron, and mean stock.

Initialize the Iron Ore Inventory Model.

Parameters:

fixed_factors (dict, optional) – Fixed factors for the model. Defaults to None.

class_name_abbr: ClassVar[str] = 'IRONORE'

Short name of the model class.

class_name: ClassVar[str] = 'Iron Ore'

Long name of the model class.

config_class: ClassVar[type[pydantic.BaseModel]]

Configuration class for the model.

n_rngs: ClassVar[int] = 1

Number of RNGs used to run a simulation replication.

n_responses: ClassVar[int] = 3

Number of responses (performance measures).

movement_model
before_replicate(rng_list: list[mrg32k3a.mrg32k3a.MRG32k3a]) None

Prepare the model just before generating a replication.

Parameters:

rng_list (list[MRG32k3a]) – RNGs used to drive the simulation.

Raises:

NotImplementedError – If the subclass does not implement this hook.

replicate() tuple[dict, dict]

Simulate a single replication for the current model factors.

Parameters:

rng_list (list[MRG32k3a]) – Random number generators used to simulate the replication.

Returns:

A tuple containing:
  • responses (dict): Performance measures of interest, including:
    • ”total_profit”: The total profit over the time period.

    • ”frac_producing”: The fraction of days spent producing iron ore.

    • ”mean_stock”: The average stock over the time period.

  • gradients (dict): A dictionary of gradient estimates for each

    response.

Return type:

tuple[dict, dict]

class simopt.models.ironore.IronOreMaxRev(name: str = '', fixed_factors: dict | None = None, model_fixed_factors: dict | None = None)

Bases: simopt.base.Problem

Class to make iron ore inventory simulation-optimization problems.

Initialize a problem object.

Parameters:
  • name (str) – Name of the problem.

  • fixed_factors (dict | None) – Dictionary of user-specified problem factors.

  • model_fixed_factors (dict | None) – Subset of user-specified non-decision factors passed to the model.

class_name_abbr: ClassVar[str] = 'IRONORE-1'

Short name of the problem class.

class_name: ClassVar[str] = 'Max Revenue for Iron Ore'

Long name of the problem class.

config_class: ClassVar[type[pydantic.BaseModel]]

Configuration class for problem.

model_class: ClassVar[type[simopt.base.Model]]

Simulation model class for problem.

n_objectives: ClassVar[int] = 1

Number of objectives.

n_stochastic_constraints: ClassVar[int] = 0

Number of stochastic constraints.

minmax: ClassVar[tuple[int, Ellipsis]] = (1,)

Indicators of maximization (+1) or minimization (-1) for each objective.

constraint_type: ClassVar[simopt.base.ConstraintType]

Description of constraints types.

variable_type: ClassVar[simopt.base.VariableType]

Description of variable types.

gradient_available: ClassVar[bool] = False

Indicates whether the solver provides direct gradient information.

optimal_value: ClassVar[float | None] = None

Optimal objective function value (if known).

optimal_solution: tuple | None = None

Optimal solution if known; defaults to None.

model_default_factors: ClassVar[dict]

Default values for overriding model-level default factors.

model_decision_factors: ClassVar[set[str]]

Set of keys for factors that are decision variables.

property dim: int

Number of decision variables.

property lower_bounds: tuple

Lower bound for each decision variable.

property upper_bounds: tuple

Upper bound for each decision variable.

vector_to_factor_dict(vector: tuple) dict

Convert a vector of variables to a dictionary with factor keys.

Parameters:

vector (tuple) – A vector of values associated with decision variables.

Returns:

Dictionary with factor keys and associated values.

Return type:

dict

factor_dict_to_vector(factor_dict: dict) tuple

Convert a dictionary with factor keys to a vector of variables.

Parameters:

factor_dict (dict) – Dictionary with factor keys and associated values.

Returns:

Vector of values associated with decision variables.

Return type:

tuple

replicate(_x: tuple) simopt.base.RepResult

Replicate the problem for a given solution.

Parameters:

x (tuple) – The solution to evaluate.

get_random_solution(rand_sol_rng: mrg32k3a.mrg32k3a.MRG32k3a) tuple

Generate a random solution for starting or restarting solvers.

Parameters:

rand_sol_rng (MRG32k3a) – Random number generator used to sample the solution.

Returns:

A tuple representing a randomly generated vector of decision

variables.

Return type:

tuple

class simopt.models.ironore.IronOreMaxRevCnt(name: str = '', fixed_factors: dict | None = None, model_fixed_factors: dict | None = None)

Bases: simopt.base.Problem

Class to make iron ore inventory simulation-optimization problems.

Initialize a problem object.

Parameters:
  • name (str) – Name of the problem.

  • fixed_factors (dict | None) – Dictionary of user-specified problem factors.

  • model_fixed_factors (dict | None) – Subset of user-specified non-decision factors passed to the model.

class_name_abbr: ClassVar[str] = 'IRONORECONT-1'

Short name of the problem class.

class_name: ClassVar[str] = 'Max Revenue for Continuous Iron Ore'

Long name of the problem class.

config_class: ClassVar[type[pydantic.BaseModel]]

Configuration class for problem.

model_class: ClassVar[type[simopt.base.Model]]

Simulation model class for problem.

n_objectives: ClassVar[int] = 1

Number of objectives.

n_stochastic_constraints: ClassVar[int] = 0

Number of stochastic constraints.

minmax: ClassVar[tuple[int, Ellipsis]] = (1,)

Indicators of maximization (+1) or minimization (-1) for each objective.

constraint_type: ClassVar[simopt.base.ConstraintType]

Description of constraints types.

variable_type: ClassVar[simopt.base.VariableType]

Description of variable types.

gradient_available: ClassVar[bool] = False

Indicates whether the solver provides direct gradient information.

optimal_value: ClassVar[float | None] = None

Optimal objective function value (if known).

optimal_solution: tuple | None = None

Optimal solution if known; defaults to None.

model_default_factors: ClassVar[dict]

Default values for overriding model-level default factors.

model_decision_factors: ClassVar[set[str]]

Set of keys for factors that are decision variables.

property dim: int

Number of decision variables.

property lower_bounds: tuple

Lower bound for each decision variable.

property upper_bounds: tuple

Upper bound for each decision variable.

vector_to_factor_dict(vector: tuple) dict

Convert a vector of variables to a dictionary with factor keys.

Parameters:

vector (tuple) – A vector of values associated with decision variables.

Returns:

Dictionary with factor keys and associated values.

Return type:

dict

factor_dict_to_vector(factor_dict: dict) tuple

Convert a dictionary with factor keys to a vector of variables.

Parameters:

factor_dict (dict) – Dictionary with factor keys and associated values.

Returns:

Vector of values associated with decision variables.

Return type:

tuple

replicate(_x: tuple) simopt.base.RepResult

Replicate the problem for a given solution.

Parameters:

x (tuple) – The solution to evaluate.

check_deterministic_constraints(x: tuple) bool

Check if a solution x satisfies the problem’s deterministic constraints.

Parameters:

x (tuple) – A vector of decision variables.

Returns:

True if the solution satisfies all deterministic constraints;

False otherwise.

Return type:

bool

get_random_solution(rand_sol_rng: mrg32k3a.mrg32k3a.MRG32k3a) tuple

Generate a random solution for starting or restarting solvers.

Parameters:

rand_sol_rng (MRG32k3a) – Random number generator used to sample the solution.

Returns:

A tuple representing a randomly generated vector of decision

variables.

Return type:

tuple