Source code for discrete_optimization.lotsizing.generic_solver.cpsat.inventory

#  Copyright (c) 2026 AIRBUS and its affiliates.
#  This source code is licensed under the MIT license found in the
#  LICENSE file in the root directory of this source tree.
from discrete_optimization.lotsizing.generic_solver.cpsat.lotsizing_solver_cpsat import (
    Item,
    LotSizingCpSatSolver,
)


[docs] class InventoryConstraintCpsat(LotSizingCpSatSolver[Item]):
[docs] def create_constraint_inventory(self): if self.problem.has_stock_limits(): for t in range(self.problem.horizon): if self.problem.has_overall_stock_limit(period=t): overall_limit = self.problem.get_overall_stock_limit(period=t) self.cp_model.add( sum( [ self.get_inventory_var(item=item, period=t) for item in self.problem.items_list ] ) <= int(overall_limit) ) for item in self.problem.items_list: if self.problem.has_stock_limit_for_item(item=item, period=t): self.cp_model.add( self.get_inventory_var(item=item, period=t) <= self.problem.get_stock_limit_for_item( item=item, period=t ) ) # Definition of the inventory. if not self.problem.is_backlog_allowed(): for t in range(self.problem.horizon): for item in self.problem.items_list: self.cp_model.add( self.get_delivery_var(item=item, period=t) == self.problem.get_demand(item=item, period=t) ) if t == 0: self.cp_model.add( self.get_inventory_var(item=item, period=t) == self.get_production_quantity_var(item=item, period=t) - self.problem.get_demand(item=item, period=t) ) else: self.cp_model.add( self.get_inventory_var(item=item, period=t) == self.get_inventory_var(item=item, period=t - 1) + self.get_production_quantity_var(item=item, period=t) - self.problem.get_demand(item=item, period=t) ) else: for t in range(self.problem.horizon): for item in self.problem.items_list: if t == 0: self.cp_model.add( self.get_inventory_var(item=item, period=t) == self.get_production_quantity_var(item=item, period=t) - self.get_delivery_var(item=item, period=t) ) else: self.cp_model.add( self.get_inventory_var(item=item, period=t) == self.get_inventory_var(item=item, period=t - 1) + self.get_production_quantity_var(item=item, period=t) - self.get_delivery_var(item=item, period=t) )
[docs] def create_inventory_cost(self): inventory_cost_terms = [] for item in self.problem.items_list: for t in range(self.problem.horizon): cost_per_unit = int(self.problem.get_inventory_cost_per_unit(item, t)) if cost_per_unit > 0: inventory_cost_terms.append( cost_per_unit * self.get_inventory_var(item=item, period=t) ) return sum(inventory_cost_terms)