Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.17 KB | None | 0 0
  1. require 'statsample'
  2.  
  3.  
  4. def f2(n)
  5. return n.odd? ? (n * 3 + 1) / 2 : n / 2
  6.  
  7. end
  8.  
  9. def f1(n)
  10. n = (n * 3 + 1) / 2 if (n.odd?)
  11. n /= 2 if (n.even?)
  12. return n
  13.  
  14. end
  15.  
  16. def dense(w, d)
  17. w2 = w - 1
  18.  
  19. a = (0...w2).to_a
  20. s = '0' * w2
  21. (1..(d * w - 1)).map { a.delete_at(rand(a.size)) }.each { |x| s[x, 1] = '1' }
  22. return ('1' + s).to_i(2)
  23.  
  24. end
  25.  
  26. def stat(l)
  27. l = [0] if (l.empty?)
  28. t = t2 = 0
  29. l.each \
  30. {
  31. |x|
  32. t += x
  33. t2 += x ** 2
  34. }
  35. c = l.size
  36. a = t.to_f / c
  37. z = t2.to_f / c - a ** 2
  38. sd = Math.sqrt(z < 0 ? 0 : z)
  39.  
  40. return a, sd, l.max.to_f, l.min.to_f
  41. end
  42.  
  43. def stat2(l, t, n)
  44. return Hash[[["a#{n}", "sd#{n}", "mx#{n}"], stat(l)[0..2].map { |x| x / t }].transpose]
  45. end
  46.  
  47. def d(s)
  48. c = s.split('').select { |x| x == '1' }.size
  49. d = c.to_f / s.length
  50. return d
  51.  
  52. end
  53.  
  54. def data(n)
  55. ns = n.to_s(2)
  56. nl = ns.length
  57. m = nl / 2
  58.  
  59. nsh = ns[0..m]
  60. nsl = ns[m..-1]
  61.  
  62. asdm1 = stat2(ns.split(/0+/).map { |x| x.length }, nl, 1)
  63.  
  64. l1 = ns.split(/1+/)
  65.  
  66. l1.shift
  67. asdm0 = stat2(l1.map { |x| x.length }, nl, 0)
  68.  
  69. return {'n' => n, 'ns' => ns, 'nl' => nl, 'd' => d(ns), 'dh' => d(nsh), 'dl' => d(nsl)}.merge(asdm1).merge(asdm0)
  70. end
  71.  
  72. def pair2(n, m)
  73. n1 = n
  74.  
  75. m.times { n = f2(n) }
  76. x = {0 => data(n1), 1 => data(n)}
  77.  
  78. x[1]['wr'] = x[1]['nl'].to_f / x[0]['nl'].to_f
  79. return x
  80. end
  81.  
  82. def pair(d, m)
  83. w = 100
  84. return(pair2(dense(w, d), m))
  85. end
  86.  
  87. def dist(m)
  88.  
  89. w = 100
  90. d = 0.0
  91. c = 50
  92. l = []
  93. c.times \
  94. {
  95. |i|
  96.  
  97. l << pair(i.to_f / (c - 1), m)
  98. }
  99. # $stderr.puts("#{l.size} pts")
  100. return l
  101. end
  102.  
  103. def sum(l)
  104.  
  105. t = 0.0
  106. l.each { |x| t += x }
  107. return t
  108. end
  109.  
  110. def av(l)
  111. return nil if (l.empty?)
  112. return sum(l) / l.size
  113. end
  114.  
  115. def corr(l, y1)
  116.  
  117. yp = "#{y1}_p"
  118. ye = "#{y1}_e"
  119. xav = av(l.map { |x| x[y1] })
  120. yav = av(l.map { |x| x[yp] })
  121.  
  122. tx = ty = txy = e = 0.0
  123. m = nil
  124. l.each \
  125. {
  126. |z|
  127.  
  128. x = z[y1]
  129. y = z[yp]
  130.  
  131. txy += (x - xav) * (y - yav)
  132. tx += (x - xav) ** 2
  133. ty += (y - yav) ** 2
  134.  
  135. z[ye] = (x - y)
  136. e1 = z[ye]
  137. e += e1
  138. m = [m, e1.abs].compact.max
  139. }
  140. r = txy / (Math.sqrt(tx) * Math.sqrt(ty))
  141. e /= l.size
  142. return {'r' => r, 'e_a' => e, 'e_m' => m}
  143.  
  144. end
  145.  
  146. def dot(x, z)
  147.  
  148. t = z['c']
  149.  
  150. (z.keys - ['c']).each { |v| t += z[v] * x[v] }
  151. return t
  152.  
  153. end
  154.  
  155. def predict(l, vy, z)
  156. l.each \
  157. {
  158. |x|
  159.  
  160. x[1]["#{vy}_p"] = dot(x[0], z)
  161. }
  162. end
  163.  
  164. def fit(l, vx, vy)
  165.  
  166. a = {}
  167.  
  168. vx.each { |v| a[v] = l.map { |x| x[0][v] }.to_vector() }
  169.  
  170. a[vy] = l.map { |x| x[1][vy] }.to_vector()
  171.  
  172. ds = a.to_dataset()
  173.  
  174. r = Statsample::Regression.multiple(ds, vy)
  175. # $stderr.puts(r.summary)
  176.  
  177. z = r.coeffs.merge({'c' => r.constant})
  178.  
  179. predict(l, vy, z)
  180.  
  181. a = corr(l.map { |x| x[1] }, vy)
  182.  
  183. return z.merge!(a)
  184.  
  185. end
  186.  
  187. def fmt(a)
  188. a2 = {}
  189. a.each \
  190. {
  191. |k, v|
  192. a2[k] = v.is_a?(Numeric) ? sprintf("%.3g", v).to_f : v
  193. }
  194. return a2
  195.  
  196. end
  197.  
  198. def fit1(v, x, l)
  199. a = fit(l, v, x)
  200. l1 = l.map { |y| y[1][x] }
  201.  
  202. a.merge!({'mn' => l1.min, 'mx' => l1.max})
  203.  
  204. # $stderr.puts(fmt({'x' => x}.merge(a.select { |k, v| ['r', 'e_m', 'e_a', 'mn', 'mx'].member?(k) })).inspect)
  205. return a
  206. end
  207.  
  208. def model(a)
  209.  
  210. (a['v'] + ['wr']).each \
  211. {
  212. |x|
  213. a[x] = fit1(a['v'], x, a['l'])
  214. }
  215.  
  216. # $stderr.puts
  217. return a
  218.  
  219. end
  220.  
  221. def out(fn, a)
  222.  
  223. return if (fn.nil?)
  224. f = File.open(fn, 'a')
  225. f.puts(a.keys.join("\t")) if (f.size == 0)
  226. if (a.nil?)
  227. f.puts
  228. else
  229. f.puts(a.values.join("\t"))
  230. end
  231. f.close
  232. end
  233.  
  234. def count(m)
  235. a = {'l' => dist(m), 'v' => ['a1', 'a0', 'dh', 'dl', 'sd0', 'sd1', 'mx1']}
  236.  
  237. a = model(a)
  238. return a
  239. end
  240.  
  241. def opt(m, a)
  242. l = []
  243.  
  244. a['l'].size.times \
  245. {
  246. |i|
  247. l << {'ns' => a['l'][i][0]['ns'], 'wr_e' => a['l'][i][1]['wr_e']}
  248. }
  249.  
  250. c = 20
  251. w = 100
  252. 1000.times \
  253. {
  254. |n|
  255.  
  256. c = l.size / 4
  257. l.sort_by! { |x| x['wr_e'] }
  258. # l.reverse!
  259.  
  260. x = rand(c)
  261. y = rand(c)
  262. y += 1 if (y == x)
  263. ns = ns1 = ns2 = nil
  264. case rand(3)
  265. when 0
  266. ns1 = l[x]['ns']
  267. ns = ns1.dup
  268. i = rand(w - 1) + 1
  269. ns[i, 1] = (ns1[i, 1].to_i ^ 1).to_s
  270. when 1
  271. ns1 = l[x]['ns']
  272. ns2 = l[y]['ns']
  273. ns = ''
  274. w.times \
  275. {
  276. |i|
  277. ns[i, 1] = [ns1[i, 1], ns2[i, 1]][rand(2)]
  278. }
  279.  
  280. when 2
  281. ns1 = l[x]['ns']
  282. ns2 = l[y]['ns']
  283. i = rand(w)
  284. ns = ns1[0...i] + ns2[i..-1]
  285. end
  286.  
  287. w2 = ns.to_i(2).to_s(2).length
  288. raise if (w2 != w)
  289.  
  290. next if (l.map { |x| x['ns'] }.member?(ns))
  291.  
  292. x = pair2(ns.to_i(2), m)
  293.  
  294.  
  295. (a['v'] + ['wr']).each \
  296. {
  297. |vy|
  298. z = a[vy].select { |k, v| (a['v'] + ['c']).member?(k) }
  299.  
  300. predict([x], vy, z)
  301. corr([x[1]], vy)
  302. }
  303.  
  304. l.pop if (l.size > 2000)
  305. l << {'ns'=> ns, 'wr_e' => x[1]['wr_e']}
  306.  
  307. # puts([l[0]['wr_e'], l[-1]['wr_e'], d(ns), ns].join("\t")) if (n % 40 == 0)
  308. $stdout.flush
  309. }
  310. return l.first
  311. end
  312.  
  313. def detect(x1, a, j, l)
  314.  
  315. x1 = x1.dup
  316. i = 0
  317. c = 500
  318. x1['nl'] = 1
  319. loop \
  320. {
  321. x2 = {}
  322. (a['v'] + ['wr']).each \
  323. {
  324. |vy|
  325.  
  326. x2[vy] = dot(x1, a[vy].select { |k, x| (a['v'] + ['c']).member?(k) })
  327.  
  328. x2[vy] += l[j][1]["#{vy}_e"] if (!j.nil?)
  329.  
  330. x2[vy] = a[vy]['mn'] if (x2[vy] < a[vy]['mn'])
  331. x2[vy] = a[vy]['mx'] if (x2[vy] > a[vy]['mx'])
  332. }
  333. x2['nl'] = x1['nl'] * x2['wr']
  334. x1 = x2
  335. i += 1
  336. break if (x1['nl'] < 1 || i == c)
  337. }
  338. return i == c ? nil : i
  339.  
  340. end
  341.  
  342. def count2(l, a, y)
  343.  
  344. t2 = 0
  345. l.size.times \
  346. {
  347. |i|
  348. t2 += 1 if (detect(l[i][0], a, nil, l).nil?)
  349. }
  350.  
  351. t = 0
  352. l.size.times \
  353. {
  354. |i|
  355. l1 = []
  356. l.size.times \
  357. {
  358. |j|
  359. x = detect(l[i][0], a, j, l)
  360. l1 << j if (x.nil?)
  361. }
  362. t += l1.size
  363. $stderr.puts([i, t, l1].inspect)
  364. }
  365. return {"t#{y}" => t, "t#{y}2" => t2}
  366. end
  367.  
  368. def stat1(l)
  369. return Hash[[['a', 'sd', 'mx', 'mn'], stat(l)].transpose]
  370. end
  371.  
  372. def test(m, a)
  373. l = dist(m)
  374.  
  375. (a['v'] + ['wr']).each \
  376. {
  377. |vy|
  378. z = a[vy].select { |k, v| (a['v'] + ['c']).member?(k) }
  379.  
  380. predict(l, vy, z)
  381. corr(l.map { |x| x[1] }, vy)
  382. }
  383. return count2(l, a, 'b')
  384. end
  385.  
  386. def load()
  387. x = Kernel.eval(File.open('out.txt').readlines[0])
  388. p(x)
  389. exit
  390. end
  391.  
  392. load() if (File.exists?('out.txt'))
  393.  
  394. srand(0)
  395.  
  396.  
  397. m = [ARGV[0], 50].compact.first.to_i
  398. a = count(m)
  399.  
  400. File.open(fn = 'out1.txt', 'w').close
  401.  
  402. 200.times \
  403. {
  404. |i|
  405. x = opt(m, a)
  406.  
  407. j = (0...a['l'].size).max_by { |x| a['l'][x][1]['wr_e'] }
  408.  
  409. a['l'][j] = pair2(x['ns'].to_i(2), m)
  410.  
  411. a = model(a)
  412. if (i % 5 == 0) then
  413. x = stat1(a['l'].map { |x| x[1]['wr_e'] }).merge(count2(a['l'], a, 'a')).merge(test(m, a))
  414. out(fn, x)
  415. break if (x['tb'] == 0)
  416. end
  417. }
  418.  
  419. f = File.open('out.txt', 'w')
  420. f.puts(a.inspect)
  421. f.close
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement