-
Notifications
You must be signed in to change notification settings - Fork 74
/
Copy pathknapsack.go
56 lines (44 loc) · 1.1 KB
/
knapsack.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
package optimus
import (
"github.com/sonm-io/core/proto"
)
type Knapsack struct {
manager *DeviceManager
plans []*sonm.AskPlan
}
func NewKnapsack(deviceManager *DeviceManager) *Knapsack {
return &Knapsack{
manager: deviceManager,
}
}
func (m *Knapsack) Clone() *Knapsack {
plans := make([]*sonm.AskPlan, len(m.plans))
copy(plans, m.plans)
return &Knapsack{
manager: m.manager.Clone(),
plans: plans,
}
}
func (m *Knapsack) Put(order *sonm.Order) error {
resources, err := m.manager.Consume(*order.GetBenchmarks(), *order.GetNetflags())
if err != nil {
return err
}
resources.Network.NetFlags = order.GetNetflags()
m.plans = append(m.plans, &sonm.AskPlan{
OrderID: order.GetId(),
Price: &sonm.Price{PerSecond: order.Price},
Duration: &sonm.Duration{Nanoseconds: 1e9 * int64(order.Duration)},
Resources: resources,
})
return nil
}
func (m *Knapsack) Price() *sonm.Price {
return sonm.SumPrice(m.plans)
}
func (m *Knapsack) PPSf64() float64 {
return float64(m.Price().GetPerSecond().Unwrap().Uint64()) * 1e-18
}
func (m *Knapsack) Plans() []*sonm.AskPlan {
return m.plans
}