Skip to content

Commit 10f59f6

Browse files
Refactored target power handling
1 parent 8722413 commit 10f59f6

File tree

2 files changed

+26
-15
lines changed

2 files changed

+26
-15
lines changed

src/main/scala/edu/ie3/simona/model/em/opt/OptimizedFlexStrat.scala

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,8 @@ object OptimizedFlexStrat {
369369
val difference = results
370370
.map(_.operation)
371371
.reduceOption[Expression](_ + _)
372-
.getOrElse(Zero) - target.toKilowatts
372+
.getOrElse(Zero)
373+
val powerObjective = powerObjectiveFactory.build(difference, target)
373374

374375
val constraints =
375376
results.flatMap(_.softConstraint)
@@ -378,8 +379,6 @@ object OptimizedFlexStrat {
378379
.reduceLeftOption(_ + _)
379380
.getOrElse(Zero)
380381

381-
val powerObjective = powerObjectiveFactory.build(difference)
382-
383382
(
384383
objective + constraintsExpression + powerObjective,
385384
allConstraints.appendedAll(constraints),

src/main/scala/edu/ie3/simona/model/em/opt/PowerObjectiveFactory.scala

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ package edu.ie3.simona.model.em.opt
88

99
import optimus.algebra.{Double2Const, Expression}
1010
import optimus.optimization.MPModel
11-
import optimus.optimization.model.MPFloatVar
11+
import optimus.optimization.model.{MPFloatVar, MPVar}
12+
import squants.Power
1213

1314
/** Trait for factories of power objectives. An objective is created for the sum
1415
* of power of a single time step.
@@ -25,7 +26,9 @@ trait PowerObjectiveFactory {
2526
* @return
2627
* The objective as an expression.
2728
*/
28-
def build(totalPower: Expression)(using model: MPModel): Expression
29+
def build(totalPower: Expression, target: Power)(using
30+
model: MPModel
31+
): Expression
2932
}
3033

3134
object PowerObjectiveFactory {
@@ -36,13 +39,12 @@ object PowerObjectiveFactory {
3639
object MinAbsPowerObjectiveFactory extends PowerObjectiveFactory {
3740

3841
override def build(
39-
totalPower: Expression
42+
totalPower: Expression,
43+
target: Power,
4044
)(using model: MPModel): Expression = {
41-
val d = MPFloatVar.positive("d")
42-
model.add(d >:= totalPower)
43-
model.add(d >:= -totalPower)
45+
val difference = totalPower - target.toKilowatts
4446

45-
d
47+
absoluteValue(difference, "differenceAbs")
4648
}
4749

4850
}
@@ -70,12 +72,12 @@ object PowerObjectiveFactory {
7072
) extends PowerObjectiveFactory {
7173

7274
override def build(
73-
totalPower: Expression
75+
totalPower: Expression,
76+
target: Power,
7477
)(using model: MPModel): Expression = {
78+
val difference = totalPower - target.toKilowatts
7579

76-
val powerAbs = MPFloatVar.positive("powerAbs")
77-
model.add(powerAbs >:= totalPower)
78-
model.add(powerAbs >:= -totalPower)
80+
val differenceAbs = absoluteValue(difference, "differenceAbs")
7981

8082
val segmentSize = lastSegment / segmentCount
8183

@@ -86,7 +88,7 @@ object PowerObjectiveFactory {
8688
val m = uCurrent + uNext
8789
val b = -uCurrent * uNext
8890

89-
model.add(t >:= m * powerAbs + b)
91+
model.add(t >:= m * differenceAbs + b)
9092
}
9193

9294
// normalize the final value so that it maximizes
@@ -97,4 +99,14 @@ object PowerObjectiveFactory {
9799
}
98100

99101
}
102+
103+
private def absoluteValue(value: Expression, name: String)(using
104+
model: MPModel
105+
): MPVar = {
106+
val valueAbs = MPFloatVar.positive(name)
107+
model.add(valueAbs >:= value)
108+
model.add(valueAbs >:= -value)
109+
valueAbs
110+
}
111+
100112
}

0 commit comments

Comments
 (0)