Skip to content

Instantly share code, notes, and snippets.

@vznvzn
Created January 20, 2019 04:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vznvzn/4d65ffefea11bbfa91490a29a6ff7e51 to your computer and use it in GitHub Desktop.
Save vznvzn/4d65ffefea11bbfa91490a29a6ff7e51 to your computer and use it in GitHub Desktop.
def f2(n)
return n.odd? ? (n * 3 + 1) / 2 : n / 2
end
def d(s)
c = s.split('').select { |x| x == '1' }.size
d = c.to_f / s.length
return d
end
def len01(ns)
nl = ns.length
l1 = ns.split(/0+/).map { |x| x.length }
l2 = ns.split(/1+/)[1..-1]
l2 = [''] if (l2.nil?)
l0 = l2.map { |x| x.length }
return l0, l1
end
def e(ns)
return len01(ns).flatten.size.to_f / ns.length
end
def mx01(ns)
return len01(ns).flatten.max
end
def mx01s(ns)
return mx01(ns).to_f / ns.length
end
def nonmono(l1)
# i = (0...l1.size).max_by { |x| l1[x] }
i = 0
j = (l = (i...(l1.size - 1)).to_a).index { |x| l1[x + 1] > l1[x] }
return i, j.nil? ? i : l[j]
end
def count(x, l2 = [], l = [])
n = n1 = x['n']
l << n1
while (n != 1)
n = f2(n)
l << n
end
d = d(ns = n1.to_s(2))
cg = l.index { |x| x < n1 }
cg = 0 if (cg.nil?)
cm = (0..cg).max_by { |x| l[x] }
cg1 = l.rindex { |x| x >= n1 }
cm1 = (0...l.size).max_by { |x| l[x] }
nl = ns.length
l1 = l[0..cg].map { |x| mx01s(x.to_s(2)) }
i, j = nonmono(l1[0..cm])
l2.replace((0..cg).map { |x| {'x' => Math.log(l[x]), 'mx01s' => l1[x] } })
c = l.size
l[(cg + 1)..-1] = []
return x.merge({'da' => (d - 0.5).abs,
'ns' => ns,
'cm' => cm,
'cm1' => cm,
'cg' => cg,
'cg1' => cg,
'c' => c,
'nl' => nl,
'd' => d,
'e' => e(ns),
'mx01s' => l1[j..cm].max,
'i' => i,
'j' => j
})
end
def out(a, a2 = {}, t = nil)
fn = 'out.txt'
k = a.keys
if ($f1.nil?) then
$f1 = File.open(fn, 'w')
$f1.puts(k.join("\t"))
f2 = File.open('gnuplot.cmd', 'w')
st = t.nil? ? 'unset title; ' : "set title '#{t}'; "
f2.puts("set ytics nomirror; set y2tics; set colors classic; set key top left box opaque; #{st}; plot \\")
(a.keys - ['t']).each \
{
|x|
f2.puts("'#{fn}' using (column('t')):(column('#{x}')) with line title '#{x}' #{a2[x]}, \\")
}
f2.puts
f2.close
end
$f1.puts(a.values_at(*k).join("\t"))
$f1.flush
end
def fmt(ks = [])
fmt = {}
ks.each { |x| fmt[x] = 'lw 2' }
['da', 'd', 'e', 'mx01s'].each { |x| fmt[x] = fmt.fetch(x, '') + ' dt 3 axes x1y2' }
return fmt
end
def next2(z, l, ks, t)
out(z.select { |k, v| !['n', 'ns', 'p'].member?(k) },
fmt(ks), t.inspect) if (z['t'] % 10 == 0)
p = z['p'] + 1
l << [z, count({'n'=>z['n'] + 2 ** p, 'p'=>p, 't' => z['t']}), z.merge({'p'=>p})]
return
end
def maxs(l)
l.map { |x| x[-1, 1] == '-' ? x.dup.chop : x }
end
def hard(ks)
$stderr.puts(ks.inspect)
$f1 = nil
l = []
mx = maxs(ks)
next2(count({'n' => 1, 'p' => 0, 't' => 0}), l, mx, ks)
add = nil
seen = {}
f = File.open($fn, 'w')
c = 20
5e3.to_i.times \
{
|t|
l2 = (0...l.size).map { {} }
mx.each \
{
|k2|
l1 = (0...l.size).map { |x| {k2 => l[x][1][k2], 'i' => x} }
l1.sort_by! { |x| x[k2] }
l1 = l1.reverse if (ks.member?(k2))
(0...l1.size).each { |x| l2[l1[x]['i']][k2] = x }
}
l2.each { |x| x['z'] = x.values.inject(0) { |t, x| t + x } }
l1 = (0...l2.size).sort_by { |x| l2[x]['z'] }
a = {'t1' => t, 'l1' => l.size, 'cs' => seen.size}.merge(l[l1[0]][1])
if (!seen.member?(a['n'])) then
seen[a['n']] = nil
f.puts(a)
f.flush
end
$stderr.puts(a.select { |k, | !['n'].member?(k)}) if ((t + 1) % 500 == 0)
i = l1[rand([l1.size, c].min)]
z = l.delete_at(i)
[z[1], z[2]].each { |x| next2(x.merge({'t' => t}), l, mx, ks) }
l.delete_at(l1[-1]) if (l.size > 2000)
}
f.close
end
def out2(fn, l, a2 = {})
f = File.open(fn, 'w')
f.puts('$dat << eof')
f.puts(l[0].keys.join("\t"))
l.each { |x| f.puts(x.values.join("\t")) }
f.puts('eof')
f.puts('plot \\')
l[0].keys.each \
{
|x|
next if (a2.member?(x) && a2[x] == nil)
f.puts("$dat using (column('#{x}')) with line #{a2[x]},\\")
}
f.close
end
def fmt1(l, f)
w = l.max_by { |x| x.length }.length
f.puts("set colors classic; \\")
f.puts("plot \\")
f.puts("[0:#{w}][0:#{l.size - 1}] '-' matrix with image title ''")
l.each_with_index \
{
|z, i|
c = w - z.length
z[z.length...w] = '0' * c
f.puts(z.split('').join(' '))
}
f.puts("eof")
f.puts("eof")
# f.puts("pause -1;")
end
def grid(l)
f = File.open(fn = "gnuplot1.cmd", 'w')
f.puts("set palette negative grayscale; unset colorbox;")
fmt1(l.map { |x| x.to_s(2).reverse }, f)
f.close
end
def review(ks)
l = File.open($fn).readlines.map { |x| Kernel.eval(x) }
x = l.max_by { |x| x['nl'] }
$stderr.puts(x.inspect)
count({'n' => x['n']}, l2 = [], l1 = [])
grid(l1)
out2('gnuplot2.cmd', l2, {'mx01s' => 'axes x1y2'})
out2('gnuplot3.cmd', l.sort_by { |x| x['nl'] },
fmt(ks).merge(Hash[[['n', 'ns', 'p', 't', 't1', 'l1', 'cs'], [nil] * 7].transpose]))
exit
end
k = 'mx01s'
#ks = [k]
ks = [k, 'nl', 'cm', 'cg', 'c']
review(ks) if (File.exist?($fn = 'mixdb.txt'))
hard(ks)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment