-
Notifications
You must be signed in to change notification settings - Fork 0
/
PlanningUnitDecisionVariable.go
58 lines (44 loc) · 1.8 KB
/
PlanningUnitDecisionVariable.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
// Copyright (c) 2019 Australian Rivers Institute.
package variable
import (
"github.com/LindsayBradford/crem/internal/pkg/model/planningunit"
"github.com/LindsayBradford/crem/pkg/math"
)
type PlanningUnitValueMap map[planningunit.Id]float64
type PlanningUnitDecisionVariable interface {
DecisionVariable
ValuesPerPlanningUnit() PlanningUnitValueMap
SetPlanningUnitValue(planningUnit planningunit.Id, newValue float64)
PlanningUnitValue(planningUnit planningunit.Id) float64
}
func NewPerPlanningUnitDecisionVariable() *PerPlanningUnitDecisionVariable {
return new(PerPlanningUnitDecisionVariable).Initialise()
}
type PerPlanningUnitDecisionVariable struct {
SimpleDecisionVariable
ContainedDecisionVariableObservers
planningUnitValues PlanningUnitValueMap
}
func (v *PerPlanningUnitDecisionVariable) Initialise() *PerPlanningUnitDecisionVariable {
v.planningUnitValues = make(PlanningUnitValueMap, 0)
return v
}
func (v *PerPlanningUnitDecisionVariable) SetPlanningUnitValue(planningUnit planningunit.Id, newPlanningUnitValue float64) {
oldPlanningUnitValue := v.planningUnitValues[planningUnit]
v.planningUnitValues[planningUnit] = newPlanningUnitValue
v.planningUnitValues[planningUnit] = math.RoundFloat(v.planningUnitValues[planningUnit], int(v.Precision()))
difference := newPlanningUnitValue - oldPlanningUnitValue
v.value += difference
v.value = math.RoundFloat(v.value, int(v.Precision()))
}
func (v *PerPlanningUnitDecisionVariable) PlanningUnitValue(planningUnit planningunit.Id) float64 {
return v.planningUnitValues[planningUnit]
}
func (v *PerPlanningUnitDecisionVariable) ValuesPerPlanningUnit() PlanningUnitValueMap {
return v.planningUnitValues
}
func (v *PerPlanningUnitDecisionVariable) NotifyObservers() {
for _, observer := range v.Observers() {
observer.ObserveDecisionVariable(v)
}
}