Skip to content

This feature is currently in Preview.

relationalai.experimental.solvers.min()

Signature
min(*args: dsl.Instance|SolverExpression, per: list = []) -> SolverExpression

Returns a solver expression that computes the minimum value among the input arguments. If one or more per keys are provided, aggregation is performed per group. Must be called in a Model.rule() or solvers.operators() context.

NameTypeDescription
*argsdsl.Instance, SolverExpressionOne or more numeric solver variables or expressions to evaluate.
perlistOptional grouping key(s) to perform aggregation per value of one or more variables. Defaults to [].

A SolverExpression object representing the minimum value.

Use min() with the SolverModel.constraint() method to require that at least one value meets a lower bound:

import relationalai as rai
from relationalai.experimental import solvers
# Create a model.
model = rai.Model("DietaryConstraints")
# Declare entity types.
Food = model.Type("Food")
Day = model.Type("Day")
Portion = model.Type("Portion")
23 collapsed lines
# Declare properties.
Food.calories.declare()
Food.fat.declare()
Food.salt.declare()
Food.carbs.declare()
Portion.food.declare()
Portion.day.declare()
# Define foods.
with model.rule():
Food.add(name="Oatmeal").set(calories=150, fat=3, salt=0.1, carbs=27)
Food.add(name="Egg").set(calories=70, fat=5, salt=0.2, carbs=1)
Food.add(name="Banana").set(calories=100, fat=0.5, salt=0.0, carbs=26)
Food.add(name="Toast").set(calories=80, fat=1, salt=0.3, carbs=15)
# Define days.
with model.rule():
for name in ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]:
Day.add(name=name)
# Define all possible food portions for each day.
with model.rule():
Portion.add(food=Food(), day=Day())
# Create a solver model.
solver_model = solvers.SolverModel(model)
# Define solver variables for portions.
with model.rule():
portion = Portion()
solver_model.variable(
portion,
name_args=["portion", portion.food.name, portion.day.name],
lower=0,
upper=5,
)
# Constrain that some food must contribute at least 5g of carbs.
with solvers.operators():
portion = Portion()
carbs = portion.food.carbs * portion
solver_model.constraint(solvers.min(carbs, per=[portion.day]) >= 5)