Guest User

Untitled

a guest
Feb 22nd, 2018
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.14 KB | None | 0 0
  1. def f2(n)
  2. return n.odd? ? (n * 3 + 1) / 2 : n / 2
  3.  
  4. end
  5.  
  6. def dense(w, d)
  7. w2 = w - 1
  8.  
  9. a = (0...w2).to_a
  10. s = '0' * w2
  11. (1..(d * w - 1)).map { a.delete_at(rand(a.size)) }.each { |x| s[x, 1] = '1' }
  12. return ('1' + s).to_i(2)
  13.  
  14. end
  15.  
  16. def stat(l)
  17. l = [0] if (l.empty?)
  18. t = t2 = 0
  19. l.each \
  20. {
  21. |x|
  22. t += x
  23. t2 += x ** 2
  24. }
  25. c = l.size
  26. a = t.to_f / c
  27. z = t2.to_f / c - a ** 2
  28. sd = Math.sqrt(z < 0 ? 0 : z)
  29.  
  30. return a, sd, l.max.to_f, l.min.to_f
  31. end
  32.  
  33. def stat2(l, t, n)
  34. return Hash[[["a#{n}", "sd#{n}", "mx#{n}"], stat(l)[0..2].map { |x| x / t }].transpose]
  35. end
  36.  
  37. def d(s)
  38. c = s.split('').select { |x| x == '1' }.size
  39. d = c.to_f / s.length
  40. return d
  41.  
  42. end
  43.  
  44. def data(n)
  45. ns = n.to_s(2)
  46. nl = ns.length
  47. m = nl / 2
  48.  
  49. nsh = ns[0..m]
  50. nsl = ns[m..-1]
  51.  
  52. asdm1 = stat2(ns.split(/0+/).map { |x| x.length }, nl, 1)
  53.  
  54. l1 = ns.split(/1+/)
  55.  
  56. l1.shift
  57. asdm0 = stat2(l1.map { |x| x.length }, nl, 0)
  58.  
  59. return {'n' => n, 'ns' => ns, 'nl' => nl, 'd' => d(ns), 'dh' => d(nsh), 'dl' => d(nsl)}.merge(asdm1).merge(asdm0)
  60. end
  61.  
  62. def sum(l)
  63.  
  64. t = 0.0
  65. l.each { |x| t += x }
  66. return t
  67. end
  68.  
  69. def count(n)
  70.  
  71. n1 = n
  72. l = [n]
  73. begin
  74. n = f2(n)
  75. l << n
  76. end while n > n1
  77.  
  78.  
  79. m = (0...l.size).max_by { |x| l[x] }
  80. r = l[m].to_s(2).length - n1.to_s(2).length
  81.  
  82. return {'c' => l.size, 'n' => n1, 'l' => l, 'm' => m, 'r' => r}
  83. end
  84.  
  85. def load(s)
  86.  
  87. raise if (s.nil?)
  88.  
  89. d = "out/#{s}"
  90. l = Dir.glob("#{d}/*").select { |x| x =~ /out\d+.txt$/}
  91. n = l.size
  92.  
  93. i = n - 1
  94. a = Kernel.eval(File.open("#{d}/out#{i}.txt").readlines[0])
  95.  
  96. l = a['lb'].map { |x| x.size }
  97.  
  98. raise if (sum(l) != 0)
  99. return a
  100. end
  101.  
  102. def dot(x, z)
  103.  
  104. t = z['c']
  105.  
  106. (z.keys - ['c']).each { |v| t += z[v] * x[v] }
  107. return t
  108.  
  109. end
  110.  
  111. def detect(n, a)
  112.  
  113. $seen = {} if ($seen.nil?)
  114. if $seen.member?(n) then
  115. $seen['h'] = $seen.fetch('h', 0) + 1
  116. return $seen[n]
  117. end
  118.  
  119. x1 = data(n)
  120. i = 0
  121.  
  122. w = 1.0
  123. x1['wr'] = 1.0
  124. loop \
  125. {
  126.  
  127. x2 = {}
  128.  
  129. (a['v'] + ['wr']).each \
  130. {
  131. |vy|
  132.  
  133. x2[vy] = dot(x1, a[vy].select { |k, x| (a['v'] + ['c']).member?(k) })
  134. }
  135.  
  136. x1 = x2
  137. w *= x1['wr']
  138.  
  139. i += 1
  140. break if (w < 1.0 || i == 500)
  141. }
  142. $seen[n] = i
  143. return i
  144.  
  145. end
  146.  
  147. def out(fn, l)
  148.  
  149. f = File.open(fn, 'w')
  150. f.puts(l[0].keys.join("\t"))
  151.  
  152. l.each { |x| f.puts(x.values.join("\t")) }
  153. f.close
  154.  
  155. f = File.open('gnuplot.cmd', 'w')
  156. f.print('set colors classic; set ytics nomirror; set y2tics; plot [][0:] ')
  157.  
  158. l[0].keys.each_with_index \
  159. {
  160. |x, i|
  161. f.puts("'#{fn}' using (column('#{x}')) with line axes x1y#{i + 1},\\")
  162. }
  163. f.puts
  164. f.close
  165.  
  166. end
  167.  
  168. def dist(c)
  169.  
  170. l = []
  171. seen = {}
  172. 3.times {
  173. l += (0...c).map \
  174. {
  175. |i|
  176. n = dense(100, i.to_f / (c - 1))
  177. next if (seen.member?(n))
  178. seen[n] = nil
  179. count(n)
  180. }.compact
  181. }
  182. l.sort_by! { |x| x['m'] }
  183. l.reverse!
  184. return l
  185. end
  186.  
  187. def mono(l1)
  188.  
  189. l = l1.map { |x| x['a'] }
  190. c = 0
  191. m = l[0]
  192. mx = nil
  193. j = 0
  194. l2 = []
  195. (1...l.size).each \
  196. {
  197. |i|
  198. c += 1 if (l[i] < l[i - 1])
  199. if (l[i] < m) then
  200. l2 << i - j
  201. m, j = [l[i], i]
  202. end
  203. mx = [mx, i - j].compact.max
  204. }
  205.  
  206. mx = 0 if (mx.nil?)
  207.  
  208. return {'mx' => mx, 'ls' => l.size, 'l' => l1}
  209. end
  210.  
  211. def avg(l2, x1)
  212.  
  213. m = 20
  214. c = 0
  215. t = 0
  216. l = []
  217. l1 = []
  218. (x1...l2.size).each \
  219. {
  220. |x|
  221. l << l2[x]['d']
  222. t += l[-1]
  223. t -= l.shift if (l.size > m)
  224. if (l.size == m) then
  225. a = t.to_f / l.size
  226. l2[x]['a'] = a
  227. l1 << {'a' => a, 'w' => l2[x]['w'] }
  228. end
  229. }
  230. return mono(l1)
  231.  
  232. end
  233.  
  234. def test(a, f, l1)
  235.  
  236.  
  237. l2 = []
  238.  
  239. l = dist(500)
  240.  
  241. i = 0
  242. l.select { |x| x['m'] >= 50}.each_with_index \
  243. {
  244. |y, j|
  245.  
  246. # p([j + 1, y['l'][0]])
  247.  
  248.  
  249. x1 = l2.size
  250. y['l'][0..y['m']].each \
  251. {
  252. |x|
  253.  
  254. l2 << {'i' => i, 'w' => x.to_s(2).length, 'd' => detect(x, a)}
  255. i += 1
  256. }
  257. l1 << avg(l2, x1)
  258. f.puts(l1[-1].values.join("\t"))
  259. f.flush
  260.  
  261. l2 << {}
  262. i += 20
  263. }
  264.  
  265. l2[0]['a'] = nil
  266. # out('out.txt', l2)
  267.  
  268. $stderr.puts("hits #{$seen['h']}") if ($seen.member?('h'))
  269.  
  270. end
  271.  
  272. a = load(ARGV[0])
  273.  
  274. l = []
  275. f = File.open('out.txt', 'w')
  276. 10.times { test(a, f, l) }
  277. f.close
  278.  
  279. z = l.max_by { |x| x['mx'] }
  280. $stderr.puts(['mx', z['mx']].inspect)
  281.  
  282.  
  283. out('out2.txt', z['l'])
Add Comment
Please, Sign In to add comment