-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathmodel_expression_sum.go
104 lines (87 loc) · 2.18 KB
/
model_expression_sum.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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
// © 2019-present nextmv.io inc
package nextroute
import (
"fmt"
"slices"
"strings"
)
// SumExpression is an expression that returns the sum of the values of the
// given expressions.
type SumExpression interface {
ModelExpression
// AddExpression adds an expression to the sum.
AddExpression(expression ModelExpression)
// Expressions returns the expressions that are part of the sum.
Expressions() ModelExpressions
}
// NewSumExpression returns a new SumExpression.
func NewSumExpression(
expressions ModelExpressions,
) SumExpression {
name := "sum("
for i, expression := range expressions {
if i > 0 {
name += ","
}
name += expression.Name()
}
name += ")"
return &sumExpressionImpl{
index: NewModelExpressionIndex(),
expressions: expressions,
name: name,
}
}
type sumExpressionImpl struct {
name string
expressions ModelExpressions
index int
}
func (n *sumExpressionImpl) HasNegativeValues() bool {
return slices.ContainsFunc(n.expressions, func(expression ModelExpression) bool {
return expression.HasNegativeValues()
})
}
func (n *sumExpressionImpl) HasPositiveValues() bool {
return slices.ContainsFunc(n.expressions, func(expression ModelExpression) bool {
return expression.HasPositiveValues()
})
}
func (n *sumExpressionImpl) String() string {
var sb strings.Builder
fmt.Fprintf(&sb, "sum[%v], ",
n.index,
)
for _, expression := range n.expressions {
fmt.Fprintf(&sb, " %v, ", expression)
}
return sb.String()
}
func (n *sumExpressionImpl) Index() int {
return n.index
}
func (n *sumExpressionImpl) Name() string {
return n.name
}
func (n *sumExpressionImpl) SetName(name string) {
n.name = name
}
func (n *sumExpressionImpl) Value(
vehicle ModelVehicleType,
from ModelStop,
to ModelStop,
) float64 {
value := 0.0
for _, expression := range n.expressions {
value += expression.Value(vehicle, from, to)
}
return value
}
func (n *sumExpressionImpl) AddExpression(expression ModelExpression) {
n.expressions = append(n.expressions, expression)
}
func (n *sumExpressionImpl) Expressions() ModelExpressions {
expressions := make(ModelExpressions, len(n.expressions))
copy(expressions, n.expressions)
return expressions
}