miner_mover 0.1.0.1 → 0.1.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7d6d5e0e85b066dc78e4e6c7b86d751245f1e2b3809ab176f9b69e7047c2d330
4
- data.tar.gz: cd0f57ea360871fefdb7927eddef3651a277c8e8116d41a2da085dcf02a3ed73
3
+ metadata.gz: 9e2daa3ba8e778e20c25e3a6363683b3163e1141f9438b53be890845acf5440e
4
+ data.tar.gz: b72dc662be9c50caa281e087b3708c72a53aa5e593eeb053b59a0679238d568b
5
5
  SHA512:
6
- metadata.gz: 1a8d2759692483f004c0d512a17b2b4ec6a10e6d26b3e66b8785b28a0510cc3eaf7ad029b95f0a11a37b0264dc028e3c65a5cbccffbc64e5446365cdaf9ae2ce
7
- data.tar.gz: d88946c92b88073fc01f4b57ae0f13ba157ca7a72c85ae6ad405a0569b311e5420689d76014c5cda88c709b2dfbfa2dbed6b090e2c001894fdf4267686cbd87d
6
+ metadata.gz: 3203db4674a641c4a53ebed0cea4aaa445ef9e120ad582bc1cfcc787541ee53a8677eff1e4936429c4eaa72ef686ef97941a7a929d2d5db4e88a678684005962
7
+ data.tar.gz: e0052a82fa40bcf19b3382ead683087e52f90e6065751a65ff9475aadd141beb0ebe098673acffe48784f90c672aa5990fe2c0e117a3db4bd1782252af7cec91
data/README.md CHANGED
@@ -18,7 +18,7 @@ results as well. Ore is gathered at each depth; either a fixed amount or
18
18
  randomized, based on depth. The amount of time spent mining each level is
19
19
  independent and may be randomized.
20
20
 
21
- https://github.com/rickhull/miner_mover/blob/bd76ea400944aab8eab9e3ffcac85d1e28353eff/lib/miner_mover/worker.rb#L85-L99
21
+ https://github.com/rickhull/miner_mover/blob/4f2a62f6d77316e780c7c13248698d4c57bb392e/lib/miner_mover/worker.rb#L96-L104
22
22
 
23
23
  In this case, miners are rewarded by calculating `fibonacci(depth)`, using
24
24
  classic, inefficient fibonacci.
@@ -31,7 +31,7 @@ A mover has a batch size, say 10. As the mover accumulates ore over time,
31
31
  once the batch size is reached, the mover delivers the ore to the destination.
32
32
  Larger batches take longer. The delivery time can be randomized.
33
33
 
34
- https://github.com/rickhull/miner_mover/blob/bd76ea400944aab8eab9e3ffcac85d1e28353eff/lib/miner_mover/worker.rb#L135-L162
34
+ https://github.com/rickhull/miner_mover/blob/4f2a62f6d77316e780c7c13248698d4c57bb392e/lib/miner_mover/worker.rb#L152-L183
35
35
 
36
36
  The time and work spent delivering ore can be simulated three ways,
37
37
  configured via `:work_type`
@@ -44,7 +44,7 @@ configured via `:work_type`
44
44
 
45
45
  ## Install
46
46
 
47
- You'll want to use **Ruby 3.x** to make the most of Fibers.
47
+ You'll want to use **Ruby 3.x** (CRuby) to make the most of Fibers.
48
48
 
49
49
  ### Dependencies
50
50
 
@@ -53,8 +53,6 @@ You'll want to use **Ruby 3.x** to make the most of Fibers.
53
53
  * dotcfg
54
54
  * fiber_scheduler
55
55
 
56
- `gem install miner_mover` will take care of the following:
57
-
58
56
  `gem install rake minitest dotcfg fiber_scheduler`
59
57
 
60
58
  ### Clone
@@ -85,6 +83,8 @@ rake test # Run tests
85
83
  rake thread # run demo/thread
86
84
  ```
87
85
 
86
+ Try: `rake test`
87
+
88
88
  ## Rake Tasks
89
89
 
90
90
  Included demonstration scripts can be executed via Rake tasks.
@@ -113,7 +113,7 @@ Rake tasks take care of `LOAD_PATH`, so the following is
113
113
 
114
114
  ## Exploration in `irb`
115
115
 
116
- `$ irb -Ilib -rminer_mover/worker`
116
+ `$ irb -I lib`
117
117
 
118
118
  ```
119
119
  irb(main):001:0> include MinerMover
@@ -379,11 +379,15 @@ others. My favorites:
379
379
 
380
380
  * `Process.fork` - when called with a block, the block is only executed in the
381
381
  child subprocess
382
- * `Process.spawn` - extensive options, nonblocking, call Process.wait(pid)
382
+ * `Process.spawn` - extensive options, nonblocking, call `Process.wait(pid)`
383
383
  to get the result
384
- * `Open3.popen3` - for access to STDIN, STDOUT, STDERR
384
+ * `Open3.popen3` - for access to `STDIN` `STDOUT` `STDERR`
385
385
 
386
386
  ### IPC
387
387
 
388
- * Pipes - streaming bytes: `IO.pipe`
389
- * Unix sockets - messages with datagrams: `Socket.pair(:UNIX, :DGRAM, 0)`
388
+ * Pipes
389
+ - `IO.pipe` (streaming / bytes / unidirectional)
390
+ * Unix sockets
391
+ - `UNIXSocket.pair :RAW`
392
+ - `UNIXSocket.pair :DGRAM` (datagram / message / "like UDP")
393
+ - `UNIXSocket.pair :STREAM` (streaming / bytes / "like TCP")
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0.1
1
+ 0.1.1.1
@@ -44,22 +44,22 @@ module MinerMover
44
44
  t.strftime "%Y-%m-%d %H:%M:%S.%L"
45
45
  end
46
46
 
47
- def restart(t = Time.now)
48
- @start = t
47
+ def restart(f = Timer.now)
48
+ @start = f
49
49
  self
50
50
  end
51
51
  alias_method :initialize, :restart
52
52
 
53
- def elapsed(t = Time.now)
54
- t - @start
53
+ def elapsed(f = Timer.now)
54
+ f - @start
55
55
  end
56
56
 
57
- def elapsed_ms(t = Time.now)
58
- elapsed(t) * 1000
57
+ def elapsed_ms(f = Timer.now)
58
+ elapsed(f) * 1000
59
59
  end
60
60
 
61
- def elapsed_display(t = Time.now)
62
- Timer.elapsed_display(elapsed_ms(t))
61
+ def elapsed_display(f = Timer.now)
62
+ Timer.elapsed_display(elapsed_ms(f))
63
63
  end
64
64
  alias_method :to_s, :elapsed_display
65
65
  alias_method :inspect, :elapsed_display
@@ -77,32 +77,36 @@ module MinerMover
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 @@ module MinerMover
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 @@ module MinerMover
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
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: miner_mover
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.1
4
+ version: 0.1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rick Hull