public Constraint AddReservoirConstraintWithActive <I>( IEnumerable <IntVar> times, IEnumerable <I> demands, IEnumerable <IntVar> actives, long min_level, long max_level) { Constraint ct = new Constraint(model_); ReservoirConstraintProto res = new ReservoirConstraintProto(); foreach (IntVar var in times) { res.Times.Add(var.Index); } foreach (I d in demands) { res.Demands.Add(Convert.ToInt64(d)); } foreach (IntVar var in actives) { res.Actives.Add(var.Index); } ct.Proto.Reservoir = res; return(ct); }
/** * <summary> * Adds an optional event. * </summary> * * <remarks> * If `is_active` is true, It will increase the used capacity by `level_change` at time `time`. * `time` must be an affine expression. * </remarks> */ public ReservoirConstraint AddOptionalEvent <T, L>(T time, L level_change, ILiteral literal) { ReservoirConstraintProto res = Proto.Reservoir; res.TimeExprs.Add(cp_model_.GetLinearExpressionProto(cp_model_.GetLinearExpr(time))); res.LevelChanges.Add(Convert.ToInt64(level_change)); res.ActiveLiterals.Add(literal.GetIndex()); return(this); }
/** * <summary> * Adds a reservoir constraint with optional refill/emptying events. * </summary> * * <remarks> * <para>Maintain a reservoir level within bounds. The water level starts at 0, and at any time, it * must be within [min_level, max_level]. * </para> * * <para>Given an event (time, levelChange, active), if active is true, and if time is assigned a * value t, then the level of the reservoir changes by levelChange (which is constant) at time t. * Therefore, at any time t: * <code>∑(levelChanges[i] * actives[i] if times[i] ≤ t) in [min_level, max_level]</code> * </para> * * <para>Note that min level must be ≤ 0, and the max level must be ≥ 0. Please use fixed * level_changes to simulate an initial state. </para> * </remarks> * * <param name="minLevel"> at any time, the level of the reservoir must be greater of equal than the min * level. minLevel must me ≤ 0 </param> * <param name="maxLevel"> at any time, the level of the reservoir must be less or equal than the max * level. maxLevel must be ≥ 0 </param> * <returns> an instance of the ReservoirConstraint class </returns> */ public ReservoirConstraint AddReservoirConstraint(long minLevel, long maxLevel) { ReservoirConstraintProto res = new ReservoirConstraintProto(); res.MinLevel = minLevel; res.MaxLevel = maxLevel; ReservoirConstraint ct = new ReservoirConstraint(this, model_); ct.Proto.Reservoir = res; return(ct); }
public Constraint AddReservoirConstraint(IEnumerable<IntVar> times, IEnumerable<int> demands, long min_level, long max_level) { Constraint ct = new Constraint(model_); ReservoirConstraintProto res = new ReservoirConstraintProto(); foreach (IntVar var in times) { res.Times.Add(var.Index); } foreach (int d in demands) { res.Demands.Add(d); } ct.Proto.Reservoir = res; return ct; }
public Constraint AddReservoirConstraint <I>(IEnumerable <LinearExpr> times, IEnumerable <I> levelChanges, long minLevel, long maxLevel) { Constraint ct = new Constraint(model_); ReservoirConstraintProto res = new ReservoirConstraintProto(); foreach (LinearExpr time in times) { res.TimeExprs.Add(GetLinearExpressionProto(time)); } foreach (I d in levelChanges) { res.LevelChanges.Add(Convert.ToInt64(d)); } res.MinLevel = minLevel; res.MaxLevel = maxLevel; ct.Proto.Reservoir = res; return(ct); }