Advertisement
Guest User

Untitled

a guest
Jun 25th, 2019
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.33 KB | None | 0 0
  1. def f2(n)
  2. return n.odd? ? (n * 3 + 1) / 2 : n / 2
  3.  
  4. end
  5.  
  6. def lenx(ns, p)
  7. l = ns.split(p)
  8. l = [] if (l.nil?)
  9. l.shift if (l[0] == '')
  10. return l.map { |x| x.length }
  11. end
  12.  
  13. def len01x(ns)
  14. return lenx(ns, /0+/), lenx(ns, /1+/)
  15. end
  16.  
  17. def mx01x(ns)
  18. l1, l0 = len01x(ns)
  19. return (l1 + l0).max
  20. end
  21.  
  22. def count(ns, l2 = [])
  23.  
  24. n = n1 = ns.to_i(2)
  25. l = [n1]
  26.  
  27. while (n != 1 && n >= n1)
  28. n = f2(n)
  29.  
  30. l << n
  31.  
  32. end
  33.  
  34. cg = l.size
  35. cm = (0...l.size).max_by { |x| l[x] }
  36.  
  37. l1 = l[ns.length..-1]
  38. mx01r = (l1.nil? || l1.empty?) ? 0 : l1.map { |x| mx01x(x.to_s(2)) }.max
  39.  
  40. nl = ns.length
  41.  
  42. return {'ns' => ns,
  43. 'cm' => cm,
  44. 'cg' => l.size,
  45. 'cr' => l.size - cm,
  46. 'nl' => nl,
  47. 'mx01r' => mx01r
  48. }
  49. end
  50.  
  51. def initd(w, m)
  52.  
  53. d = m.to_f / w
  54. w2 = w - 1
  55.  
  56. a = (0...w2).to_a
  57. s = '0' * w2
  58. (1..(d * w - 1)).map { a.delete_at(rand(a.size)) }.each { |x| s[x, 1] = '1' }
  59. return ('1' + s)
  60. end
  61.  
  62. def initb(w, m)
  63. r = m.to_f / w
  64. return '1' + (1...w).map { rand < r ? '0' : '1' }.join
  65.  
  66. end
  67.  
  68. def initw(w, m)
  69. s = initd(w, w / 2)
  70.  
  71. i = rand(w - m) + 1
  72. m = [w - i, m].max
  73. s[i, m] = rand(2).to_s * m
  74. return s
  75. end
  76.  
  77. def mut(ns)
  78.  
  79. ns = ns.dup
  80. i = rand(ns.length - 1) + 1
  81. ns[i, 1] = (ns[i, 1].to_i ^ 1).to_s
  82. return ns
  83.  
  84. end
  85.  
  86. def inner(ns1, ns2)
  87. a, b = [ns1, ns2].sort_by { |x| x.length }
  88. d = b.length - a.length
  89. i = rand(d + 1)
  90.  
  91. c = b.dup
  92. c[i, a.length] = a
  93.  
  94. ns1.replace(b)
  95. ns2.replace(c)
  96. end
  97.  
  98. def mix(ns1, ns2)
  99.  
  100. ns1 = ns1.dup
  101. ns2 = ns2.dup
  102.  
  103. inner(ns1, ns2)
  104. return (0...ns1.length).map { |x| [ns1, ns2][rand(2)][x, 1] }.join
  105.  
  106. end
  107.  
  108. def cut(ns1, ns2)
  109. ns1 = ns1.dup
  110. ns2 = ns2.dup
  111.  
  112. inner(ns1, ns2)
  113. i = rand(ns1.length)
  114. return ns1[0...i] + ns2[i..-1]
  115. end
  116.  
  117. def ext(ns)
  118.  
  119. ns = ns.dup
  120. (rand(3) + 1).times { ns[rand(ns.length) + 1, 0] = rand(2).to_s }
  121. return ns
  122. end
  123.  
  124. def short(ns)
  125. return ns if (ns.length == 1)
  126. ns = ns.dup
  127. (rand([ns.length - 1, 3].min) + 1).times { ns[rand(ns.length - 1) + 1, 1] = '' }
  128. return ns
  129.  
  130. end
  131.  
  132. def rank(x)
  133. return -x['z']
  134. end
  135.  
  136. def adj(x, wt, km)
  137. z = 0
  138.  
  139. km.keys.each { |k| z += (x[k] - wt["#{k}_a"]) / wt["#{k}_sd"] * km[k] }
  140.  
  141. x['z'] = z
  142. raise if (!z.finite?)
  143. return x
  144. end
  145.  
  146. def out(a, d, a2 = {}, t = nil)
  147.  
  148. fn = 'out.txt'
  149. k = a.keys
  150.  
  151. if ($f1.nil?) then
  152. $f1 = File.open(fn, 'w')
  153. $f1.puts(k.join("\t"))
  154.  
  155. f2 = File.open('gnuplot.cmd', 'w')
  156. st = t.nil? ? 'unset title; ' : "set title '#{t}'; "
  157. f2.puts("set ytics nomirror; set y2tics; set colors classic; set key top left box opaque; #{st}; plot \\")
  158. (a.keys - ['t']).each \
  159. {
  160. |x|
  161. f2.puts("'#{fn}' using (column('t')):(column('#{x}')) every #{d} with line title '#{x}' #{a2[x]}, \\")
  162. }
  163. f2.puts
  164. f2.close
  165. end
  166. $f1.puts(a.values_at(*k).join("\t"))
  167. $f1.flush
  168. end
  169.  
  170. def remove(a, ks)
  171. a = a.dup
  172. ks.each { |x| a.delete(x) }
  173. return a
  174. end
  175.  
  176. def add(bs, km, h, ns, fn, wt, t, d)
  177. j = ns.length
  178. h[j] = [] if (!h.member?(j))
  179.  
  180. x = adj(count(ns), wt, km)
  181.  
  182. a, b = [h[j][0], h[j][-1]]
  183.  
  184. return if (h[j].map { |x| x['ns'] }.member?(x['ns']))
  185.  
  186. x['t'] = t
  187. h[j] << x
  188.  
  189. h[j].sort_by! { |x| rank(x) }
  190. h[j][bs..-1] = [] if (h[j].size > bs)
  191.  
  192. out(remove(x, ['ns']), d, {'z' => 'axis x1y2'})
  193.  
  194. end
  195.  
  196. def top(h1)
  197. return h1[rand([h1.size / 4, h1.size].max)]
  198. end
  199.  
  200. def stat(l)
  201. return 0, 1.0 if (l.empty?)
  202. t = l.inject { |a, x| a + x }
  203. t2 = l.inject { |a, x| a + x ** 2 }
  204.  
  205. c = l.size
  206. a = t.to_f / c
  207. z = t2.to_f / c - a ** 2
  208. sd = Math.sqrt(z < 0 ? 0 : z)
  209. raise if (sd.nan?)
  210. return a, sd
  211. end
  212.  
  213. def dist(km, h, wt)
  214.  
  215. l = h.values.flatten
  216.  
  217. km.keys.each \
  218. {
  219. |k|
  220.  
  221. a, sd = stat(l.map { |x| x[k] })
  222.  
  223. sd = 1.0 if (sd == 0)
  224. wt.merge!({"#{k}_a" => a, "#{k}_sd" => sd})
  225. }
  226.  
  227. end
  228.  
  229. def nonnil(x, y)
  230. return x.nil? ? y : x
  231. end
  232.  
  233. def opt(km, w1, k, fn)
  234. h = {}
  235.  
  236. ops = ['initd0', 'initb0', 'initw0', 'mut1', 'mix2', 'cut2']
  237. # ops += ['ext1', 'short1']
  238.  
  239. bs = 50
  240. bc = 50
  241.  
  242. t = 0
  243. n = 1e4.to_i
  244. d = n / 2000
  245.  
  246. wt = {}
  247. n.times \
  248. {
  249. if (t % 100 == 0) then
  250. dist(km, h, wt)
  251. h.values.flatten.each { |x| adj(x, wt, km) }
  252. end
  253.  
  254. opc = ops[rand(ops.size)]
  255.  
  256. c = opc[-1..-1].to_i
  257. op = opc[0..-2]
  258.  
  259. ks = h.keys.sort_by { |x| rank(h[x][0]) }
  260. ks = ks[0...[ks.size, ks.size / 4].max]
  261.  
  262.  
  263. case (c)
  264. when 0
  265. w = ks.empty? ? w1 : ks[rand(ks.size)]
  266. ns = send(op, w, rand(w))
  267.  
  268. when 1, 2
  269.  
  270. redo if (h.empty?)
  271.  
  272. h.delete(ks.pop) if (ks.size > bc)
  273.  
  274. arg = (0...c).map { ks[rand(ks.size)] }
  275. l = arg.map { |x| top(h[x])['ns'] }
  276. ns = send(op, *l)
  277. ns[0, 1] = '1'
  278.  
  279. end
  280. if (ns.length != w1) then
  281. p([op, c])
  282. p(ns.length)
  283. exit
  284. end
  285.  
  286.  
  287. add(bs, km, h, ns, fn, wt, t, d)
  288.  
  289. if (t % 100 == 0) then
  290. kmx = nonnil(h.values.flatten.max_by { |x| x[k] }, {}).dup
  291. h0 = nonnil(h.fetch(ks[0], [])[0], {}).dup
  292. msg = Hash[[['t', 'hmn', 'hmx', 'hc', 'h_0', "#{k}_0"], [t, ks.min, ks.max, h.size, h0, kmx]].transpose]
  293. msg['h_0'].delete('ns')
  294. msg["#{k}_0"].delete('ns')
  295. p(msg)
  296. # p(wt)
  297. end
  298.  
  299. t += 1
  300. }
  301.  
  302.  
  303. end
  304.  
  305. f = File.open('gnuplot2.cmd', 'w')
  306. f.puts("set title 'mx01r'; unset y2tics; set key top left; plot \\")
  307. ks = ['cg', 'cr', 'cm']
  308. ks.each \
  309. {
  310. |x|
  311. f.puts("'out.txt' using (column('#{x}')):(column('mx01r')) pt 5 ps 0.2,\\")
  312. }
  313. f.puts
  314. f.puts('pause -1')
  315. f.puts("set title 'mx01r log log'; unset y2tics; set key top right; plot \\")
  316. ks.each \
  317. {
  318. |x|
  319. f.puts("'out.txt' using (log(column('#{x}'))):(log(column('mx01r'))) pt 5 ps 0.2,\\")
  320. }
  321.  
  322. f.close
  323.  
  324. v = {'mx01r' => 1, 'cm' => 1, 'cg' => 1, 'cr' => 1}
  325. opt(v, 100, 'mx01r', fn = 'mixdb.txt')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement