@@ -77,32 +77,36 @@ def varied n
77
77
class Miner < Worker
78
78
attr_accessor :depth , :partial_reward
79
79
80
- def initialize ( depth : 10 ,
81
- partial_reward : true ,
80
+ def initialize ( depth : 5 ,
81
+ partial_reward : false ,
82
82
variance : 0 ,
83
83
logging : false ,
84
84
debugging : false ,
85
85
timer : nil )
86
86
@partial_reward = partial_reward
87
87
@depth = depth
88
- super ( variance : variance , logging : logging ,
89
- debugging : debugging , timer : timer )
88
+ super ( variance : variance , timer : timer ,
89
+ logging : logging , debugging : debugging )
90
90
end
91
91
92
92
def state
93
93
super . merge ( depth : @depth , partial_reward : @partial_reward )
94
94
end
95
95
96
+ # return an array of integers representing ore mined at each depth
97
+ def mine_ores ( depth = @depth )
98
+ # every new depth is a new mining operation
99
+ Array . new ( depth ) { |d |
100
+ # mine ore by calculating fibonacci for that depth
101
+ mined = MinerMover . fib ( self . varied ( d ) . round )
102
+ @partial_reward ? rand ( 1 + mined ) : mined
103
+ }
104
+ end
105
+
106
+ # wrap the above method with logging, timing, and summing
96
107
def mine_ore ( depth = @depth )
97
108
log format ( "MINE Depth %i" , depth )
98
- ores , elapsed = Timer . elapsed {
99
- # every new depth is a new mining operation
100
- Array . new ( depth ) { |d |
101
- # mine ore by calculating fibonacci for that depth
102
- mined = MinerMover . fib self . varied ( d ) . round
103
- @partial_reward ? rand ( 1 + mined ) : mined
104
- }
105
- }
109
+ ores , elapsed = Timer . elapsed { self . mine_ores ( depth ) }
106
110
total = ores . sum
107
111
log format ( "MIND %s %s (%.2f s)" ,
108
112
Ore . display ( total ) , ores . inspect , elapsed )
@@ -124,8 +128,8 @@ def initialize(batch_size: 10,
124
128
@rate = rate . to_f * Ore ::BLOCK
125
129
@work_type = work_type
126
130
@batch , @batches , @ore_moved = 0 , 0 , 0
127
- super ( variance : variance , logging : logging ,
128
- debugging : debugging , timer : timer )
131
+ super ( variance : variance , timer : timer ,
132
+ logging : logging , debugging : debugging )
129
133
end
130
134
131
135
def state
@@ -145,33 +149,37 @@ def status
145
149
] . join ( ' | ' )
146
150
end
147
151
148
- def load_ore ( amt )
149
- @batch += amt
152
+ # accept some ore for moving; just accumulate unless we have a full batch
153
+ def load_ore amount
154
+ log format ( "LOAD %s | %s" , Ore . display ( amount ) , self . status )
155
+ @batch += amount
150
156
move_batch if @batch >= @batch_size
151
- log format ( "LOAD %s" , self . status )
157
+ log format ( "LDED %s | %s" , Ore . display ( amount ) , self . status )
152
158
@batch
153
159
end
154
160
155
- def move ( duration )
156
- MinerMover . work ( duration , @work_type )
157
- end
158
-
161
+ # return the amount moved
159
162
def move_batch
160
163
raise "unexpected batch: #{ @batch } " if @batch <= 0
161
- amt = [ @batch , @batch_size ] . min
162
- duration = self . varied ( amt / @rate )
164
+ amount = [ @batch , @batch_size ] . min
163
165
164
- log format ( "MOVE %s (%.2f s)" , Ore . display ( amt ) , duration )
165
- _ , elapsed = Timer . elapsed { self . move ( duration ) }
166
- log format ( "MOVD %s (%.2f s)" , Ore . display ( amt ) , elapsed )
166
+ self . move amount
167
167
168
168
# accounting
169
- @ore_moved += amt
170
- @batch -= amt
169
+ @ore_moved += amount
170
+ @batch -= amount
171
171
@batches += 1
172
172
173
- # what moved
174
- amt
173
+ amount
174
+ end
175
+
176
+ # perform the work of moving the amount of ore
177
+ def move amount
178
+ duration = self . varied ( amount / @rate )
179
+ log format ( "MOVE %s (%.2f s)" , Ore . display ( amount ) , duration )
180
+ _ , elapsed = Timer . elapsed { MinerMover . work ( duration , @work_type ) }
181
+ log format ( "MOVD %s (%.2f s)" , Ore . display ( amount ) , elapsed )
182
+ self
175
183
end
176
184
end
177
185
end
0 commit comments