miga-base 1.3.20.10 → 1.3.20.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/miga/cli/action/doctor/base.rb +2 -1
- data/lib/miga/cli/action/doctor/distances.rb +10 -7
- data/lib/miga/common.rb +4 -4
- data/lib/miga/parallel.rb +21 -5
- data/lib/miga/version.rb +2 -2
- data/test/parallel_test.rb +12 -0
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 91302d7d75ccc35b6ff9606f8b6d777f1ed9d003884b1239ccf88d1a60e9cd23
         | 
| 4 | 
            +
              data.tar.gz: d71e38b02f3e54695a4e2c40b07b910ebaf8719511f20fb5c19198aa9b4dbae2
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: e0df7e189c74f4c791493d04f14000671c40a2fe5d9a50c92985a82eb0b7fe9670205a8d5b01ab7fb158df9836fb5d41040c1cf3ac81321dd66dde84d01adbe3
         | 
| 7 | 
            +
              data.tar.gz: 0f30aac316c440e623405eab59855a3ace6d5bc04e452bfe67d67c1cb486670a48a629e0fd9f631cdd66446907147043d80d03e273423a620074d5a320bd3975
         | 
| @@ -37,11 +37,12 @@ module MiGA::Cli::Action::Doctor::Base | |
| 37 37 | 
             
                return if fix.empty?
         | 
| 38 38 |  | 
| 39 39 | 
             
                cli.say("- Fixing #{fix.size} datasets")
         | 
| 40 | 
            -
                MiGA::Parallel.distribute(fix, cli[:threads]) do |d_n, idx, thr|
         | 
| 40 | 
            +
                o = MiGA::Parallel.distribute(fix, cli[:threads]) do |d_n, idx, thr|
         | 
| 41 41 | 
             
                  cli.advance('  > Fixing', idx + 1, fix.size, false) if thr == 0
         | 
| 42 42 | 
             
                  p.dataset(d_n).cleanup_distances!
         | 
| 43 43 | 
             
                end
         | 
| 44 44 | 
             
                cli.say
         | 
| 45 | 
            +
                MiGA::Parallel.assess_success(o)
         | 
| 45 46 | 
             
              end
         | 
| 46 47 |  | 
| 47 48 | 
             
              ##
         | 
| @@ -103,7 +103,7 @@ module MiGA::Cli::Action::Doctor::Distances | |
| 103 103 | 
             
                # Read data (threaded)
         | 
| 104 104 | 
             
                FileUtils.mkdir_p(tmp)
         | 
| 105 105 | 
             
                chunks_e = 0 .. chunks - 1
         | 
| 106 | 
            -
                MiGA::Parallel.distribute(chunks_e, cli[:threads]) do |chunk, k, thr|
         | 
| 106 | 
            +
                o = MiGA::Parallel.distribute(chunks_e, cli[:threads]) do |chunk, k, thr|
         | 
| 107 107 | 
             
                  cli.advance('Reading:', k, chunks, false) if thr == 0
         | 
| 108 108 | 
             
                  dist = {}
         | 
| 109 109 | 
             
                  [:aai, :ani].each do |metric|
         | 
| @@ -121,6 +121,7 @@ module MiGA::Cli::Action::Doctor::Distances | |
| 121 121 | 
             
                end
         | 
| 122 122 | 
             
                cli.advance('Reading:', chunks, chunks, false)
         | 
| 123 123 | 
             
                cli.say
         | 
| 124 | 
            +
                MiGA::Parallel.assess_success(o)
         | 
| 124 125 |  | 
| 125 126 | 
             
                # Save information to indicate that the run is complete and return
         | 
| 126 127 | 
             
                File.open(tmp_chunks, 'w') { |fh| fh.puts(chunks, n) }
         | 
| @@ -135,12 +136,12 @@ module MiGA::Cli::Action::Doctor::Distances | |
| 135 136 | 
             
                tmp_done = File.join(tmp, 'chunks.txt')
         | 
| 136 137 | 
             
                chunks = File.readlines(tmp_done)[0].chomp.to_i
         | 
| 137 138 |  | 
| 138 | 
            -
                 | 
| 139 | 
            +
                lower_tr = []
         | 
| 139 140 | 
             
                chunks.times.each do |i|
         | 
| 140 | 
            -
                  (0 .. i).to_a.each { |j|  | 
| 141 | 
            +
                  (0 .. i).to_a.each { |j| lower_tr << [i, j] }
         | 
| 141 142 | 
             
                end
         | 
| 142 | 
            -
                MiGA::Parallel.distribute( | 
| 143 | 
            -
                  cli.advance('Writing:', k,  | 
| 143 | 
            +
                o = MiGA::Parallel.distribute(lower_tr, cli[:threads]) do |cell, k, thr|
         | 
| 144 | 
            +
                  cli.advance('Writing:', k, lower_tr.size, false) if thr == 0
         | 
| 144 145 | 
             
                  done_f = File.join(tmp, "#{cell[0]}-#{cell[1]}.txt")
         | 
| 145 146 | 
             
                  next if File.exist?(done_f)
         | 
| 146 147 |  | 
| @@ -148,9 +149,11 @@ module MiGA::Cli::Action::Doctor::Distances | |
| 148 149 | 
             
                  File.open("#{done_f}.tmp", 'w') { |fh| fixed_ds.each { |ds| fh.puts ds } }
         | 
| 149 150 | 
             
                  File.rename("#{done_f}.tmp", done_f)
         | 
| 150 151 | 
             
                end
         | 
| 151 | 
            -
                cli.advance('Writing:',  | 
| 152 | 
            +
                cli.advance('Writing:', lower_tr.size, lower_tr.size, false)
         | 
| 152 153 | 
             
                cli.say
         | 
| 153 | 
            -
                 | 
| 154 | 
            +
                MiGA::Parallel.assess_success(o)
         | 
| 155 | 
            +
             | 
| 156 | 
            +
                lower_tr.map do |cell|
         | 
| 154 157 | 
             
                  Set.new.tap do |y|
         | 
| 155 158 | 
             
                    file = File.join(tmp, "#{cell[0]}-#{cell[1]}.txt")
         | 
| 156 159 | 
             
                    raise MiGA::Error.new(
         | 
    
        data/lib/miga/common.rb
    CHANGED
    
    | @@ -106,13 +106,13 @@ class MiGA::MiGA | |
| 106 106 | 
             
                    ''
         | 
| 107 107 | 
             
                  else
         | 
| 108 108 | 
             
                    left_time = @_advance_time[:avg] * (total - n) / 60 # <- in minutes
         | 
| 109 | 
            -
                    left_time | 
| 110 | 
            -
                      left_time < 1 | 
| 109 | 
            +
                    left_time   < 0.01 ? '' :
         | 
| 110 | 
            +
                      left_time < 1    ? ('%.0fs left' % (left_time * 60))   :
         | 
| 111 111 | 
             
                      left_time > 1440 ? ('%.1fd left' % (left_time / 1440)) :
         | 
| 112 | 
            -
                      left_time > 60 | 
| 112 | 
            +
                      left_time > 60   ? ('%.1fh left' % (left_time / 60))   :
         | 
| 113 113 | 
             
                      ('%.1fm left' % left_time)
         | 
| 114 114 | 
             
                  end
         | 
| 115 | 
            -
                $stderr.print("[%s] %s %s  | 
| 115 | 
            +
                $stderr.print("[%s] %s %s %-12s   \r" % [Time.now, step, adv, left])
         | 
| 116 116 | 
             
              end
         | 
| 117 117 |  | 
| 118 118 | 
             
              ##
         | 
    
        data/lib/miga/parallel.rb
    CHANGED
    
    | @@ -8,10 +8,9 @@ class MiGA::Parallel < MiGA::MiGA | |
| 8 8 | 
             
                # Executes the passed block with the thread number as argument (0-numbered)
         | 
| 9 9 | 
             
                # in +threads+ processes
         | 
| 10 10 | 
             
                def process(threads)
         | 
| 11 | 
            -
                  threads.times | 
| 12 | 
            -
                    Process.fork { yield(i) }
         | 
| 13 | 
            -
             | 
| 14 | 
            -
                  Process.waitall
         | 
| 11 | 
            +
                  threads.times
         | 
| 12 | 
            +
                    .map { |i| Process.fork { yield(i) } }
         | 
| 13 | 
            +
                    .map { |pid| Process.waitpid2(pid) }
         | 
| 15 14 | 
             
                end
         | 
| 16 15 |  | 
| 17 16 | 
             
                ##
         | 
| @@ -21,7 +20,6 @@ class MiGA::Parallel < MiGA::MiGA | |
| 21 20 | 
             
                # 3. Index of the acting thread
         | 
| 22 21 | 
             
                def distribute(enum, threads, &blk)
         | 
| 23 22 | 
             
                  process(threads) { |thr| thread_enum(enum, threads, thr, &blk) }
         | 
| 24 | 
            -
                  Process.waitall # <- Just to double-check, but `process` should suffice
         | 
| 25 23 | 
             
                end
         | 
| 26 24 |  | 
| 27 25 | 
             
                ##
         | 
| @@ -33,5 +31,23 @@ class MiGA::Parallel < MiGA::MiGA | |
| 33 31 | 
             
                    yield(obj, idx, thr) if idx % threads == thr
         | 
| 34 32 | 
             
                  end
         | 
| 35 33 | 
             
                end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                ##
         | 
| 36 | 
            +
                # Assesses the success of all thread exit codes and raises an error if
         | 
| 37 | 
            +
                # any of the children status in +status+ failed. It can be used as:
         | 
| 38 | 
            +
                #
         | 
| 39 | 
            +
                #   status = MiGA::Parallel.process(3) { |i| 1/i }
         | 
| 40 | 
            +
                #   MiGA::Parallel.assess_success(status)
         | 
| 41 | 
            +
                # 
         | 
| 42 | 
            +
                # Or in conjunction with +MiGA::Parallel.distribute+
         | 
| 43 | 
            +
                def assess_success(status)
         | 
| 44 | 
            +
                  failed = status.map { |i| i[1].success? ? 0 : 1 }.inject(:+)
         | 
| 45 | 
            +
                  return if failed.zero?
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                  raise MiGA::Error.new(
         | 
| 48 | 
            +
                    "Child threads failed: #{failed}/#{status.size}. " \
         | 
| 49 | 
            +
                    "Maximum exit status: #{status.map { |i| i[1].exitstatus || 0 }.max}"
         | 
| 50 | 
            +
                  )
         | 
| 51 | 
            +
                end
         | 
| 36 52 | 
             
              end
         | 
| 37 53 | 
             
            end
         | 
    
        data/lib/miga/version.rb
    CHANGED
    
    | @@ -12,7 +12,7 @@ module MiGA | |
| 12 12 | 
             
              # - String indicating release status:
         | 
| 13 13 | 
             
              #   - rc* release candidate, not released as gem
         | 
| 14 14 | 
             
              #   - [0-9]+ stable release, released as gem
         | 
| 15 | 
            -
              VERSION = [1.3, 20,  | 
| 15 | 
            +
              VERSION = [1.3, 20, 11].freeze
         | 
| 16 16 |  | 
| 17 17 | 
             
              ##
         | 
| 18 18 | 
             
              # Nickname for the current major.minor version.
         | 
| @@ -20,7 +20,7 @@ module MiGA | |
| 20 20 |  | 
| 21 21 | 
             
              ##
         | 
| 22 22 | 
             
              # Date of the current gem relese.
         | 
| 23 | 
            -
              VERSION_DATE = Date.new(2024, 9,  | 
| 23 | 
            +
              VERSION_DATE = Date.new(2024, 9, 13)
         | 
| 24 24 |  | 
| 25 25 | 
             
              ##
         | 
| 26 26 | 
             
              # References of MiGA
         | 
    
        data/test/parallel_test.rb
    CHANGED
    
    | @@ -19,6 +19,18 @@ class ParallelTest < Test::Unit::TestCase | |
| 19 19 | 
             
                assert_equal([0, 0, 1, 1], t.sort)
         | 
| 20 20 | 
             
              end
         | 
| 21 21 |  | 
| 22 | 
            +
              def test_assess_success
         | 
| 23 | 
            +
                declare_forks
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                o = MiGA::Parallel.process(1) { |i| i / 2 }
         | 
| 26 | 
            +
                assert(o.all? { |i| i[1].success? })
         | 
| 27 | 
            +
                assert_nil(MiGA::Parallel.assess_success(o))
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                o = MiGA::Parallel.process(1) { |i| $stderr = StringIO.new ; 1 / i }
         | 
| 30 | 
            +
                assert_equal(1, o.map { |i| i[1].success? ? 0 : 1 }.inject(:+))
         | 
| 31 | 
            +
                assert_raise { MiGA::Parallel.assess_success(o) }
         | 
| 32 | 
            +
              end
         | 
| 33 | 
            +
             | 
| 22 34 | 
             
              def test_thread_enum
         | 
| 23 35 | 
             
                MiGA::Parallel.thread_enum(%w[a b c d], 3, 1) do |o, _k, _t|
         | 
| 24 36 | 
             
                  assert_equal('b', o)
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: miga-base
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1.3.20. | 
| 4 | 
            +
              version: 1.3.20.11
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Luis M. Rodriguez-R
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2024-09- | 
| 11 | 
            +
            date: 2024-09-13 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: daemons
         |