Source code for lumix.core.enums
"""Core enumerations for LumiX optimization library.
This module defines type-safe enumerations for optimization modeling:
- **Variable Types**: Continuous, integer, and binary variables
- **Constraint Senses**: Less-than-or-equal, greater-than-or-equal, and equality
- **Objective Directions**: Minimize and maximize
These enumerations provide IDE autocomplete and type checking throughout the library.
Examples:
Creating variables with different types::
from lumix import LXVariable, LXVarType
# Continuous variable (default)
production = LXVariable[Product, float]("production").continuous()
# Integer variable
trucks = LXVariable[Route, int]("trucks").integer()
# Binary variable (0 or 1)
is_open = LXVariable[Facility, int]("is_open").binary()
Using constraint senses::
from lumix import LXConstraint, LXConstraintSense
# Less-than-or-equal constraint
constraint1 = LXConstraint("capacity").le().rhs(100)
# Greater-than-or-equal constraint
constraint2 = LXConstraint("minimum").ge().rhs(50)
# Equality constraint
constraint3 = LXConstraint("balance").eq().rhs(0)
Setting objective direction::
from lumix import LXModel, LXObjectiveSense
# Maximize profit
model.maximize(profit_expr)
# Minimize cost
model.minimize(cost_expr)
"""
from enum import Enum
[docs]
class LXVarType(Enum):
"""Variable type enumeration for optimization variables.
Defines the domain of decision variables in the optimization model.
Each type has different solver representations and computational characteristics.
Attributes:
CONTINUOUS: Real-valued variables (floating-point)
Range: [-inf, inf] or bounded
Use for: Production quantities, weights, percentages
Example: production[product] = 123.45
INTEGER: Integer-valued variables
Range: Whole numbers only
Use for: Counts, discrete quantities
Example: num_trucks[route] = 5
BINARY: Binary variables (0 or 1)
Range: {0, 1}
Use for: Yes/no decisions, selection, activation
Example: is_facility_open[location] = 1
Note:
- CONTINUOUS variables generally solve faster than integer variables
- BINARY is a special case of INTEGER with automatic bounds [0, 1]
- Mixed-integer problems combine CONTINUOUS with INTEGER/BINARY variables
Examples:
Variable type affects solver choice and performance::
# Fast: Linear program with continuous variables
production = LXVariable[Product, float]("prod").continuous()
# Slower: Mixed-integer program
trucks = LXVariable[Route, int]("trucks").integer()
# Classic: Binary decision variables
select = LXVariable[Item, int]("select").binary()
"""
CONTINUOUS = "continuous"
INTEGER = "integer"
BINARY = "binary"
[docs]
class LXConstraintSense(Enum):
"""Constraint sense enumeration for inequality and equality constraints.
Defines the relationship between left-hand side (LHS) and right-hand side (RHS)
of constraints in the optimization model.
Attributes:
LE: Less-than-or-equal constraint (<=)
Meaning: LHS <= RHS
Use for: Capacity limits, maximum bounds, upper limits
Example: total_production <= factory_capacity
GE: Greater-than-or-equal constraint (>=)
Meaning: LHS >= RHS
Use for: Minimum requirements, lower bounds, demand satisfaction
Example: production >= minimum_quota
EQ: Equality constraint (==)
Meaning: LHS == RHS
Use for: Balance equations, exact requirements, flow conservation
Example: inflow - outflow == 0
Note:
- LE and GE constraints define feasible regions (inequalities)
- EQ constraints are more restrictive and may reduce feasibility
- All constraints must be satisfied for a solution to be feasible
Examples:
Different constraint types::
# Capacity constraint (upper limit)
LXConstraint("capacity")
.expression(resource_usage_expr)
.le()
.rhs(max_capacity)
# Demand constraint (lower limit)
LXConstraint("demand")
.expression(production_expr)
.ge()
.rhs(min_demand)
# Balance constraint (exact equality)
LXConstraint("flow_balance")
.expression(inflow - outflow)
.eq()
.rhs(0)
"""
LE = "<="
GE = ">="
EQ = "=="
[docs]
class LXObjectiveSense(Enum):
"""Objective sense enumeration for optimization direction.
Defines whether the objective function should be minimized or maximized.
Attributes:
MINIMIZE: Minimize the objective function
Use for: Costs, distances, time, waste, deviations, risk
Example: Minimize total transportation cost
MAXIMIZE: Maximize the objective function
Use for: Profit, revenue, efficiency, throughput, utility
Example: Maximize total profit
Note:
- Every optimization model must have exactly one objective
- Minimizing f(x) is equivalent to maximizing -f(x)
- For multi-objective problems, use goal programming module
Examples:
Setting objective direction::
# Maximize profit
model = LXModel("production_plan")
model.maximize(
LXLinearExpression()
.add_term(production, lambda p: p.profit)
)
# Minimize cost
model = LXModel("logistics")
model.minimize(
LXLinearExpression()
.add_term(shipment, lambda s: s.cost)
)
# Multi-objective (using goal programming)
model.set_goal_mode("weighted")
# Objectives defined via goal constraints
"""
MINIMIZE = "min"
MAXIMIZE = "max"
__all__ = ["LXVarType", "LXConstraintSense", "LXObjectiveSense"]