compute.hoon 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954
  1. /= common /common/table/compute
  2. /= verifier-compute /common/table/verifier/compute
  3. /= * /common/zeke
  4. ::
  5. ~% %compute-table ..ride ~
  6. |%
  7. ++ num-randomizers 1
  8. ++ header
  9. ^- header:table ^~
  10. :* name:static:common
  11. p
  12. (lent basic-column-names:static:common)
  13. (lent ext-column-names:static:common)
  14. (lent mega-ext-column-names:static:common)
  15. (lent column-names:static:common)
  16. num-randomizers
  17. ==
  18. ::
  19. ++ test-nocks
  20. ^- (list ^)
  21. :~ [[1 2 3] 3 0 1]
  22. [[1 2 3] 3 0 2]
  23. [[1 2 3] 3 1 4]
  24. [[1 2 3] 3 4 0 2]
  25. [[1 2 3] 3 4 1 99]
  26. [[1 2 3] 4 0 2]
  27. [[1 2 3] 5 [0 1] 0 1]
  28. [[1 2 3] 5 [0 1] 0 2]
  29. [42 6 [1 0] [1 2] 1 3]
  30. [42 6 [1 1] [1 2] 1 3]
  31. [42 7 [4 0 1] 1 15]
  32. [42 8 [4 0 1] 1 15]
  33. [[1 2 3] [4 0 2] 4 1 2]
  34. [[1 2 3] 2 [0 1] 1 0 2]
  35. new-pow-5
  36. new-pow-10
  37. ==
  38. ::
  39. ++ new-pow-5
  40. [ [1 2 3 4 5 0]
  41. [6 [3 0 62] [0 0] 4 0 62]
  42. [6 [3 0 30] [0 0] 4 0 30]
  43. [6 [3 0 14] [0 0] 4 0 14]
  44. [6 [3 0 6] [0 0] 4 0 6]
  45. [6 [3 0 2] [0 0] 4 0 2]
  46. 1
  47. 0
  48. ]
  49. ::
  50. ++ new-pow-10
  51. [ [1 2 3 4 5 6 7 8 9 10 0]
  52. [6 [3 0 2.046] [0 0] 4 0 2.046]
  53. [6 [3 0 1.022] [0 0] 4 0 1.022]
  54. [6 [3 0 510] [0 0] 4 0 510]
  55. [6 [3 0 254] [0 0] 4 0 254]
  56. [6 [3 0 126] [0 0] 4 0 126]
  57. [6 [3 0 62] [0 0] 4 0 62]
  58. [6 [3 0 30] [0 0] 4 0 30]
  59. [6 [3 0 14] [0 0] 4 0 14]
  60. [6 [3 0 6] [0 0] 4 0 6]
  61. [6 [3 0 2] [0 0] 4 0 2]
  62. 1
  63. 0
  64. ]
  65. ::
  66. ++ test-all
  67. ^- ?
  68. %- levy
  69. :_ same
  70. %+ iturn test-nocks
  71. |= [i=@ n=^]
  72. ~& "testing #{<i>}: {<n>}"
  73. ?: (test n)
  74. ~& " result #{<i>}: PASS"
  75. %.y
  76. ~& " result #{<i>}: FAIL"
  77. !!
  78. ::
  79. ++ test-n
  80. ~/ %test-n
  81. |= id=@ud
  82. ^- ?
  83. =/ nock (snag id test-nocks)
  84. ~& "testing #{<id>}: {<nock>}"
  85. ?: (test nock)
  86. ~& " #{<id>} {<nock>} passed"
  87. %.y
  88. ~& " #{<id>} {<nock>} failed"
  89. %.n
  90. ::
  91. ++ test
  92. ~/ %test
  93. |= nock=^
  94. ^- ?
  95. =/ ext-chals
  96. (turn (gulf 1 num-chals-rd1:chal) |=(n=@ (mod (digest-to-atom:tip5 (hash-leaf:tip5 n)) p)))
  97. =/ mega-ext-chals
  98. (turn (gulf 1 (lent chal-names-basic:chal)) |=(n=@ (mod (digest-to-atom:tip5 (hash-leaf:tip5 n)) p)))
  99. =/ dat (fink:fock nock)
  100. =/ base-table=table-mary (pad:funcs (build q.dat))
  101. =/ ext-table (extend base-table ext-chals q.dat)
  102. =/ mega-ext-table (mega-extend base-table mega-ext-chals q.dat)
  103. ::
  104. =/ num-rows len.array.p.base-table
  105. =/ tab=table-mary
  106. :: %- print-table
  107. :(weld-exts:tlib base-table ext-table mega-ext-table)
  108. =/ terminals (terminal:funcs tab)
  109. %- (test:zkvm-debug tab nock)
  110. :* mega-ext-chals
  111. terminals
  112. (table-to-verifier-funcs:tlib funcs)
  113. ==
  114. ::
  115. ++ variable-indices
  116. ^- (map col-name @) ^~
  117. %- ~(gas by *(map term @))
  118. (zip-up column-names:static:common (range (lent column-names:static:common)))
  119. ::
  120. ++ grab
  121. ~/ %grab
  122. |= [label=col-name =row]
  123. (grab-bf:constraint-util label row variable-indices)
  124. ::
  125. ++ grab-pelt
  126. ~/ %grab-pelt
  127. |= [label=col-name =row]
  128. ^- pelt
  129. =< dat
  130. %- init-bpoly
  131. :~ (grab-bf:constraint-util (crip (weld (trip label) "-a")) row variable-indices)
  132. (grab-bf:constraint-util (crip (weld (trip label) "-b")) row variable-indices)
  133. (grab-bf:constraint-util (crip (weld (trip label) "-c")) row variable-indices)
  134. ==
  135. ::
  136. ++ print-table (print-table:zkvm-debug column-names:static:common)
  137. ++ print-row
  138. ~/ %print-row
  139. |= row=(list belt)
  140. ^- (list belt)
  141. =- row
  142. (print-row:zkvm-debug row ext-column-names:static:common)
  143. ::
  144. ++ print-full-row
  145. ~/ %print-full-row
  146. |= row=(list belt)
  147. ^- (list belt)
  148. =- row
  149. (print-row:zkvm-debug row column-names:static:common)
  150. ::
  151. +$ op-flags
  152. $: o0=belt
  153. o1=belt
  154. o2=belt
  155. o3=belt
  156. o4=belt
  157. o5=belt
  158. o6=belt
  159. o7=belt
  160. o8=belt
  161. o9=belt
  162. ==
  163. ++ op-map
  164. ^- (map @ op-flags)
  165. %- ~(gas by *(map @ op-flags))
  166. :~ :- 0 [1 0 0 0 0 0 0 0 0 0]
  167. :- 1 [0 1 0 0 0 0 0 0 0 0]
  168. :- 2 [0 0 1 0 0 0 0 0 0 0]
  169. :- 3 [0 0 0 1 0 0 0 0 0 0]
  170. :- 4 [0 0 0 0 1 0 0 0 0 0]
  171. :- 5 [0 0 0 0 0 1 0 0 0 0]
  172. :- 6 [0 0 0 0 0 0 1 0 0 0]
  173. :- 7 [0 0 0 0 0 0 0 1 0 0]
  174. :- 8 [0 0 0 0 0 0 0 0 1 0]
  175. :- 9 [0 0 0 0 0 0 0 0 0 1]
  176. ==
  177. ::
  178. ++ write-noun
  179. ~/ %write-noun
  180. |= alf=pelt
  181. |= [n=tree-data tail=(list belt)]
  182. ^- (list belt)
  183. %+ print-pelt size.n
  184. %+ print-pelt leaf.n
  185. %+ print-pelt dyck.n
  186. tail
  187. ::
  188. ++ compress-nouns
  189. ~/ %compress-nouns
  190. |= chals=mega-ext-chals:chal
  191. |= [s=tree-data f=tree-data e=tree-data]
  192. ^- pelt
  193. ;: padd
  194. %+ pmul m.chals
  195. ;: padd
  196. (pmul j.chals size.s)
  197. (pmul k.chals dyck.s)
  198. (pmul l.chals leaf.s)
  199. ==
  200. ::
  201. %+ pmul n.chals
  202. ;: padd
  203. (pmul j.chals size.f)
  204. (pmul k.chals dyck.f)
  205. (pmul l.chals leaf.f)
  206. ==
  207. ::
  208. %+ pmul o.chals
  209. ;: padd
  210. (pmul j.chals size.e)
  211. (pmul k.chals dyck.e)
  212. (pmul l.chals leaf.e)
  213. ==
  214. ==
  215. ::
  216. ++ update-mset
  217. ~/ %update-mset
  218. |= [chals=mega-ext-chals:chal mset=pelt s=tree-data axis=tree-data e=tree-data]
  219. ^- pelt
  220. =/ mroot=pelt
  221. ;: padd
  222. (pmul a.chals size.s)
  223. (pmul b.chals dyck.s)
  224. (pmul c.chals leaf.s)
  225. ==
  226. =/ maxis=pelt
  227. (pmul m.chals leaf.axis)
  228. =/ mval=pelt
  229. ;: padd
  230. (pmul j.chals size.e)
  231. (pmul k.chals dyck.e)
  232. (pmul l.chals leaf.e)
  233. ==
  234. =/ mvar=pelt
  235. :(padd mroot maxis mval)
  236. ::
  237. (padd mset (pinv (psub bet.chals mvar)))
  238. ::
  239. ++ update-decoder
  240. ~/ %update-decoder
  241. |= [chals=mega-ext-chals:chal mset=pelt s=tree-data h=tree-data t=tree-data]
  242. ^- pelt
  243. =/ trip=pelt
  244. ;: padd
  245. (pmul j.chals size.s)
  246. (pmul k.chals dyck.s)
  247. (pmul l.chals leaf.s)
  248. (pmul m.chals size.h)
  249. (pmul n.chals dyck.h)
  250. (pmul o.chals leaf.h)
  251. (pmul w.chals size.t)
  252. (pmul x.chals dyck.t)
  253. (pmul y.chals leaf.t)
  254. ==
  255. ::
  256. (padd mset (pinv (psub gam.chals trip)))
  257. ::
  258. ++ update-stack
  259. ~/ %update-stack
  260. |= [state=state-data row=row-data chals=mega-ext-chals:chal]
  261. ^- pelt
  262. =/ c (compress-nouns chals)
  263. =/ program (c s.row f.row e.row)
  264. =/ sp1 (c sf1-s.row sf1-f.row sf1-e.row)
  265. =/ sp2 (c sf2-s.row sf2-f.row sf2-e.row)
  266. =/ sp3 (c sf3-s.row sf3-f.row sf3-e.row)
  267. =/ op (need op.row)
  268. ;: padd
  269. stack-kv.state
  270. ::
  271. ?: ?=(?(%0 %1) op)
  272. pzero
  273. :(pmul sp1 opc.state z.chals)
  274. ::
  275. ?: ?=(?(%0 %1 %3 %4) op)
  276. pzero
  277. :(pmul sp2 opc.state z.chals z.chals)
  278. ::
  279. ?. ?=(%2 op)
  280. pzero
  281. :(pmul sp3 opc.state z.chals z.chals z.chals)
  282. ::
  283. (pneg (pmul program ln.state))
  284. ==
  285. ::
  286. +$ row-data
  287. $: op=(unit @)
  288. pad=@
  289. s=tree-data f=tree-data e=tree-data
  290. sf1-s=tree-data sf1-f=tree-data sf1-e=tree-data
  291. sf2-s=tree-data sf2-f=tree-data sf2-e=tree-data
  292. sf3-s=tree-data sf3-f=tree-data sf3-e=tree-data
  293. f-h=tree-data f-t=tree-data f-th=tree-data
  294. f-tt=tree-data f-tth=tree-data f-ttt=tree-data
  295. fcons-inv=pelt
  296. ==
  297. ::
  298. +$ state-data
  299. $: ln=pelt
  300. sfcons-inv=pelt
  301. opc=pelt
  302. stack-kv=pelt
  303. decode-mset=pelt
  304. op0-mset=pelt
  305. ==
  306. ::
  307. ++ to-ext-chals
  308. ~/ %to-ext-chals
  309. |= chals=mega-ext-chals:chal
  310. ^- ext-chals:chal
  311. [a b c d e f g p q r s t u alf]:chals
  312. ::
  313. :: pinv but 1/0 = 0
  314. ++ make-invs
  315. ~/ %make-invs
  316. |= p=pelt
  317. ^- pelt
  318. ?: =(pzero p)
  319. pzero
  320. (pinv p)
  321. ::
  322. ++ compute-gen
  323. ~/ %compute-gen
  324. |= [row=row-data chals=ext-chals:chal]
  325. ^- pelt
  326. ?~ op.row pzero
  327. ?+ u.op.row pzero
  328. %0 (make-invs (psub leaf.f-t.row pone))
  329. %3 (make-invs (psub alf.chals size.sf1-e.row))
  330. ==
  331. ::
  332. ++ write-extend-row
  333. ~/ %write-extend-row
  334. |= [row=row-data chals=ext-chals:chal]
  335. ^- bpoly
  336. =/ p print-pelt
  337. =/ n (write-noun alf.chals)
  338. %- init-bpoly
  339. %+ n s.row
  340. %+ n f.row
  341. %+ n e.row
  342. %+ n sf1-s.row
  343. %+ n sf1-f.row
  344. %+ n sf1-e.row
  345. %+ n sf2-s.row
  346. %+ n sf2-f.row
  347. %+ n sf2-e.row
  348. %+ n sf3-s.row
  349. %+ n sf3-f.row
  350. %+ n sf3-e.row
  351. %+ n f-h.row
  352. %+ n f-t.row
  353. %+ n f-th.row
  354. %+ n f-tt.row
  355. %+ n f-tth.row
  356. %+ n f-ttt.row
  357. %+ p fcons-inv.row
  358. ~
  359. ::
  360. ++ write-mega-extend-row
  361. ~/ %write-mega-extend-row
  362. |= state=state-data
  363. ^- bpoly
  364. =/ p print-pelt
  365. %- init-bpoly
  366. %+ p ln.state
  367. %+ p sfcons-inv.state
  368. %+ p opc.state
  369. %+ p stack-kv.state
  370. %+ p decode-mset.state
  371. %+ p op0-mset.state
  372. ~
  373. ::
  374. ++ compute-fcons-inv
  375. ~/ %compute-fcons-inv
  376. |= row=row-data
  377. ^- pelt
  378. %- pinv
  379. ;: pmul
  380. size.f-h.row
  381. size.f-th.row
  382. size.f-tt.row
  383. ==
  384. ::
  385. ++ compute-sfcons-inv
  386. ~/ %compute-sfcons-inv
  387. |= [row=row-data state=state-data chals=mega-ext-chals:chal]
  388. ^- pelt
  389. ?: =(1 pad.row)
  390. (pinv (psub z.chals ln.state))
  391. ?+ (need op.row) pone
  392. %0
  393. (make-invs (psub leaf.f-t.row pone))
  394. ::
  395. %3
  396. (make-invs (psub alf.chals size.sf1-e.row))
  397. ::
  398. %5
  399. %- pinv
  400. ;: padd
  401. (pmul a.chals (psub size.sf1-e.row size.sf2-e.row))
  402. (pmul b.chals (psub dyck.sf1-e.row dyck.sf2-e.row))
  403. (pmul c.chals (psub leaf.sf1-e.row leaf.sf2-e.row))
  404. (psub pone leaf.e.row)
  405. ==
  406. ::
  407. %8
  408. (pinv (pmul size.s.row size.sf2-e.row))
  409. ::
  410. %9
  411. (pinv (pmul size.sf1-e.row size.sf2-e.row))
  412. ==
  413. ::
  414. ++ build
  415. ~/ %build
  416. |= fock-meta=fock-return
  417. ^- table-mary
  418. =/ queue=(list *) queue.fock-meta
  419. =| rows=(list bpoly)
  420. |- ^- table-mary
  421. ?: =(0 (lent queue))
  422. :- header
  423. %- zing-bpolys
  424. %- flop
  425. :_ rows
  426. (init-bpoly [1 (reap (dec (lent basic-column-names:static:common)) 0)])
  427. =| row=row-data
  428. =/ f (snag 1 queue)
  429. =. queue (slag 3 queue)
  430. ?> ?=(^ f)
  431. =/ op ?^(-.f %9 -.f)
  432. =/ ops (~(got by op-map) op)
  433. =. rows
  434. :_ rows
  435. %- init-bpoly
  436. :~ 0 :: pad
  437. o0.ops
  438. o1.ops
  439. o2.ops
  440. o3.ops
  441. o4.ops
  442. o5.ops
  443. o6.ops
  444. o7.ops
  445. o8.ops
  446. o9.ops
  447. ==
  448. =. queue
  449. ?+ op !!
  450. %0 queue
  451. %1 queue
  452. %2 (slag 2 queue)
  453. %3 (slag 1 queue)
  454. %4 (slag 1 queue)
  455. %5 (slag 2 queue)
  456. %6 (slag 3 queue)
  457. %7 (slag 1 queue)
  458. %8 (slag 2 queue)
  459. %9 (slag 2 queue)
  460. ==
  461. $
  462. ::
  463. ++ mega-extend
  464. ~/ %mega-extend
  465. |= [table=table-mary all-chals=(list belt) fock-meta=fock-return]
  466. ^- table-mary
  467. ::
  468. :: challenges
  469. =/ chals=mega-ext-chals:chal (init-mega-ext-chals:chal all-chals)
  470. =/ z=pelt-chal:constraint-util z.chals
  471. =/ z2=pelt-chal:constraint-util (pmul z z)
  472. =/ z3=pelt-chal:constraint-util (pmul z2 z)
  473. =/ compress (compress-nouns chals)
  474. =/ stack=(list tree-data)
  475. (build-compute-queue:fock queue.fock-meta alf.chals)
  476. =| rows=(list bpoly)
  477. =| state=state-data
  478. =. state
  479. =/ [s=tree-data f=tree-data e=tree-data]
  480. [(snag 0 stack) (snag 1 stack) (snag 2 stack)]
  481. %_ state
  482. ln z
  483. opc z
  484. stack-kv (pmul z (compress s f e))
  485. ==
  486. |- ^- table-mary
  487. ?: =(0 (lent stack))
  488. :: computation is finished
  489. :- header
  490. :: write one final row that will contain the final kv stores and multisets
  491. :: then decrement ln during padding
  492. =/ z-inv (pinv z)
  493. =| row=row-data
  494. =. row row(pad 1)
  495. =. state state(sfcons-inv (compute-sfcons-inv row state chals))
  496. =/ last-row (write-mega-extend-row state)
  497. =. rows [last-row rows]
  498. %- zing-bpolys
  499. %- flop
  500. =- acc
  501. %+ roll (range (sub len.array.p.table (lent rows)))
  502. |= [@ state=_state acc=_rows]
  503. =. state state(ln (pmul ln.state z-inv))
  504. =. state state(sfcons-inv (compute-sfcons-inv row state chals))
  505. :- state
  506. [(write-mega-extend-row state) acc]
  507. ::
  508. =| row=row-data
  509. =/ old-state state
  510. =. state state(ln (pmul z ln.state))
  511. =. s.row (snag 0 stack)
  512. =. f.row (snag 1 stack)
  513. =. e.row (snag 2 stack)
  514. =. stack (slag 3 stack)
  515. =. f-h.row
  516. (build-tree-data:fock -.n.f.row alf.chals)
  517. =. f-t.row
  518. (build-tree-data:fock +.n.f.row alf.chals)
  519. ::
  520. =. op.row (some ?^(-.n.f.row %9 -.n.f.row))
  521. =. f-th.row
  522. ?: ?=(?(%2 %5 %6 %7 %8) (need op.row))
  523. (build-tree-data:fock -.n.f-t.row alf.chals)
  524. *tree-data
  525. =. f-tt.row
  526. ?: ?=(?(%2 %5 %6 %7 %8) (need op.row))
  527. (build-tree-data:fock +.n.f-t.row alf.chals)
  528. *tree-data
  529. =. f-tth.row
  530. ?: ?=(%6 (need op.row))
  531. (build-tree-data:fock -.n.f-tt.row alf.chals)
  532. *tree-data
  533. =. f-ttt.row
  534. ?: ?=(%6 (need op.row))
  535. (build-tree-data:fock +.n.f-tt.row alf.chals)
  536. *tree-data
  537. ::
  538. =/ [new-stack=(list tree-data) new-state=state-data new-row=row-data]
  539. ?+ (need op.row) !!
  540. %0
  541. :+ stack
  542. %_ state
  543. decode-mset
  544. (update-decoder chals decode-mset.state f.row f-h.row f-t.row)
  545. op0-mset
  546. ?: =(1 n.f-t.row)
  547. op0-mset.state :: for axis=1 don't use memory table
  548. (update-mset chals op0-mset.state s.row f-t.row e.row)
  549. ==
  550. row
  551. ::
  552. %1
  553. :+ stack
  554. %_ state
  555. decode-mset
  556. (update-decoder chals decode-mset.state f.row f-h.row f-t.row)
  557. ==
  558. row
  559. ::
  560. %2
  561. =/ sf1-e (snag 0 stack)
  562. =/ sf2-e (snag 1 stack)
  563. =. opc.state (pmul opc.state z3)
  564. =. decode-mset.state
  565. (update-decoder chals decode-mset.state f.row f-h.row f-t.row)
  566. =. decode-mset.state
  567. (update-decoder chals decode-mset.state f-t.row f-th.row f-tt.row)
  568. :+ (slag 2 stack)
  569. state
  570. %_ row
  571. sf1-s s.row
  572. sf1-f f-th.row
  573. sf1-e sf1-e
  574. sf2-s s.row
  575. sf2-f f-tt.row
  576. sf2-e sf2-e
  577. sf3-s sf1-e
  578. sf3-f sf2-e
  579. sf3-e e.row
  580. ==
  581. ::
  582. %3
  583. =/ sf1-e (snag 0 stack)
  584. :+ (slag 1 stack)
  585. %_ state
  586. opc (pmul opc.state z)
  587. decode-mset
  588. (update-decoder chals decode-mset.state f.row f-h.row f-t.row)
  589. ==
  590. %_ row
  591. sf1-s s.row
  592. sf1-f f-t.row
  593. sf1-e sf1-e
  594. ==
  595. ::
  596. %4
  597. =/ sf1-e (snag 0 stack)
  598. :+ (slag 1 stack)
  599. %_ state
  600. opc (pmul opc.state z)
  601. decode-mset
  602. (update-decoder chals decode-mset.state f.row f-h.row f-t.row)
  603. ==
  604. %_ row
  605. sf1-s s.row
  606. sf1-f f-t.row
  607. sf1-e sf1-e
  608. ==
  609. ::
  610. %5
  611. =/ sf1-e (snag 0 stack)
  612. =/ sf2-e (snag 1 stack)
  613. =. opc.state (pmul opc.state z2)
  614. =. decode-mset.state
  615. (update-decoder chals decode-mset.state f.row f-h.row f-t.row)
  616. =. decode-mset.state
  617. (update-decoder chals decode-mset.state f-t.row f-th.row f-tt.row)
  618. :+ (slag 2 stack)
  619. state
  620. %_ row
  621. sf1-s s.row
  622. sf1-f f-th.row
  623. sf1-e sf1-e
  624. sf2-s s.row
  625. sf2-f f-tt.row
  626. sf2-e sf2-e
  627. ==
  628. ::
  629. %6
  630. =/ sf1-f (snag 0 stack)
  631. =/ sf1-e (snag 1 stack)
  632. =/ sf2-e (snag 2 stack)
  633. =. opc.state (pmul opc.state z2)
  634. =. decode-mset.state
  635. (update-decoder chals decode-mset.state f.row f-h.row f-t.row)
  636. =. decode-mset.state
  637. (update-decoder chals decode-mset.state f-t.row f-th.row f-tt.row)
  638. =. decode-mset.state
  639. (update-decoder chals decode-mset.state f-tt.row f-tth.row f-ttt.row)
  640. :+ (slag 3 stack)
  641. state
  642. %_ row
  643. sf1-s s.row
  644. sf1-f sf1-f
  645. sf1-e sf1-e
  646. sf2-s s.row
  647. sf2-f f-th.row
  648. sf2-e sf2-e
  649. ==
  650. ::
  651. %7
  652. =/ sf2-e (snag 0 stack)
  653. =. opc.state (pmul opc.state z2)
  654. =. decode-mset.state
  655. (update-decoder chals decode-mset.state f.row f-h.row f-t.row)
  656. =. decode-mset.state
  657. (update-decoder chals decode-mset.state f-t.row f-th.row f-tt.row)
  658. :+ (slag 1 stack)
  659. state
  660. %_ row
  661. sf1-s sf2-e
  662. sf1-f f-tt.row
  663. sf1-e e.row
  664. sf2-s s.row
  665. sf2-f f-th.row
  666. sf2-e sf2-e
  667. ==
  668. ::
  669. %8
  670. =/ sf1-s (snag 0 stack)
  671. =/ sf2-e (snag 1 stack)
  672. =. opc.state (pmul opc.state z2)
  673. =. decode-mset.state
  674. (update-decoder chals decode-mset.state f.row f-h.row f-t.row)
  675. =. decode-mset.state
  676. (update-decoder chals decode-mset.state f-t.row f-th.row f-tt.row)
  677. :+ (slag 2 stack)
  678. state(opc (pmul opc.state z2))
  679. %_ row
  680. sf1-s sf1-s
  681. sf1-f f-tt.row
  682. sf1-e e.row
  683. sf2-s s.row
  684. sf2-f f-th.row
  685. sf2-e sf2-e
  686. ==
  687. ::
  688. %9
  689. =/ left-e (snag 0 stack)
  690. =/ right-e (snag 1 stack)
  691. :+ (slag 2 stack)
  692. %_ state
  693. opc (pmul opc.state z2)
  694. decode-mset
  695. (update-decoder chals decode-mset.state f.row f-h.row f-t.row)
  696. ==
  697. %_ row
  698. sf1-s s.row
  699. sf1-f f-h.row
  700. sf1-e left-e
  701. sf2-s s.row
  702. sf2-f f-t.row
  703. sf2-e right-e
  704. ==
  705. ::
  706. ==
  707. =. stack new-stack
  708. =. state new-state
  709. =. row new-row
  710. =. old-state old-state(sfcons-inv (compute-sfcons-inv row old-state chals))
  711. =. stack-kv.state (update-stack old-state row chals)
  712. =. rows
  713. :_ rows
  714. (write-mega-extend-row old-state)
  715. $
  716. ::
  717. ++ extend
  718. ~/ %extend
  719. |= [table=table-mary chals-rd1=(list belt) fock-meta=fock-return]
  720. ^- table-mary
  721. ::
  722. :: challenges
  723. =/ chals=ext-chals:chal (init-ext-chals:chal chals-rd1)
  724. ::
  725. ::
  726. =/ stack=(list tree-data)
  727. (build-compute-queue:fock queue.fock-meta alf.chals)
  728. =| rows=(list bpoly)
  729. |- ^- table-mary
  730. ?: =(0 (lent stack))
  731. :- header
  732. =/ last-row
  733. (init-bpoly (reap (lent ext-column-names:static:common) 0))
  734. %- zing-bpolys
  735. %+ weld
  736. (flop rows)
  737. (reap (sub len.array.p.table (lent rows)) last-row)
  738. =| row=row-data
  739. =. s.row (snag 0 stack)
  740. =. f.row (snag 1 stack)
  741. =. e.row (snag 2 stack)
  742. =. stack (slag 3 stack)
  743. =. f-h.row
  744. (build-tree-data:fock -.n.f.row alf.chals)
  745. =. f-t.row
  746. (build-tree-data:fock +.n.f.row alf.chals)
  747. ::
  748. =. op.row (some ?^(-.n.f.row %9 -.n.f.row))
  749. =. f-th.row
  750. ?: ?=(?(%2 %5 %6 %7 %8) (need op.row))
  751. (build-tree-data:fock -.n.f-t.row alf.chals)
  752. *tree-data
  753. =. f-tt.row
  754. ?: ?=(?(%2 %5 %6 %7 %8) (need op.row))
  755. (build-tree-data:fock +.n.f-t.row alf.chals)
  756. *tree-data
  757. =. f-tth.row
  758. ?: ?=(%6 (need op.row))
  759. (build-tree-data:fock -.n.f-tt.row alf.chals)
  760. *tree-data
  761. =. f-ttt.row
  762. ?: ?=(%6 (need op.row))
  763. (build-tree-data:fock +.n.f-tt.row alf.chals)
  764. *tree-data
  765. ::
  766. =/ [new-stack=(list tree-data) new-row=row-data]
  767. ?+ (need op.row) !!
  768. %0
  769. :- stack
  770. row
  771. ::
  772. %1
  773. :- stack
  774. row
  775. ::
  776. %2
  777. =/ sf1-e (snag 0 stack)
  778. =/ sf2-e (snag 1 stack)
  779. :- (slag 2 stack)
  780. %_ row
  781. sf1-s s.row
  782. sf1-f f-th.row
  783. sf1-e sf1-e
  784. sf2-s s.row
  785. sf2-f f-tt.row
  786. sf2-e sf2-e
  787. sf3-s sf1-e
  788. sf3-f sf2-e
  789. sf3-e e.row
  790. ==
  791. ::
  792. %3
  793. =/ sf1-e (snag 0 stack)
  794. :- (slag 1 stack)
  795. %_ row
  796. sf1-s s.row
  797. sf1-f f-t.row
  798. sf1-e sf1-e
  799. ==
  800. ::
  801. %4
  802. =/ sf1-e (snag 0 stack)
  803. :- (slag 1 stack)
  804. %_ row
  805. sf1-s s.row
  806. sf1-f f-t.row
  807. sf1-e sf1-e
  808. ==
  809. ::
  810. %5
  811. =/ sf1-e (snag 0 stack)
  812. =/ sf2-e (snag 1 stack)
  813. :- (slag 2 stack)
  814. %_ row
  815. sf1-s s.row
  816. sf1-f f-th.row
  817. sf1-e sf1-e
  818. sf2-s s.row
  819. sf2-f f-tt.row
  820. sf2-e sf2-e
  821. ==
  822. ::
  823. %6
  824. =/ sf1-f (snag 0 stack)
  825. =/ sf1-e (snag 1 stack)
  826. =/ sf2-e (snag 2 stack)
  827. :- (slag 3 stack)
  828. %_ row
  829. sf1-s s.row
  830. sf1-f sf1-f
  831. sf1-e sf1-e
  832. sf2-s s.row
  833. sf2-f f-th.row
  834. sf2-e sf2-e
  835. ==
  836. ::
  837. %7
  838. =/ sf2-e (snag 0 stack)
  839. :- (slag 1 stack)
  840. %_ row
  841. sf1-s sf2-e
  842. sf1-f f-tt.row
  843. sf1-e e.row
  844. sf2-s s.row
  845. sf2-f f-th.row
  846. sf2-e sf2-e
  847. ==
  848. ::
  849. %8
  850. =/ sf1-s (snag 0 stack)
  851. =/ sf2-e (snag 1 stack)
  852. :- (slag 2 stack)
  853. %_ row
  854. sf1-s sf1-s
  855. sf1-f f-tt.row
  856. sf1-e e.row
  857. sf2-s s.row
  858. sf2-f f-th.row
  859. sf2-e sf2-e
  860. ==
  861. ::
  862. %9
  863. =/ left-e (snag 0 stack)
  864. =/ right-e (snag 1 stack)
  865. :- (slag 2 stack)
  866. %_ row
  867. sf1-s s.row
  868. sf1-f f-h.row
  869. sf1-e left-e
  870. sf2-s s.row
  871. sf2-f f-t.row
  872. sf2-e right-e
  873. ==
  874. ::
  875. ==
  876. =. stack new-stack
  877. =. row
  878. %_ new-row
  879. fcons-inv (compute-fcons-inv new-row)
  880. ==
  881. =. rows
  882. :_ rows
  883. (write-extend-row row chals)
  884. $
  885. ::
  886. ++ funcs
  887. ^- table-funcs
  888. ~% %funcs ..grab ~
  889. |%
  890. ++ build
  891. ~/ %build
  892. |= fock-meta=fock-return
  893. ^- table-mary
  894. (^build +<)
  895. ::
  896. ++ extend
  897. ~/ %extend
  898. |= [table=table-mary challenges=(list belt) fock-meta=fock-return]
  899. ^- table-mary
  900. ::~& %outer-extend
  901. (^extend +<)
  902. ::
  903. ++ mega-extend
  904. ~/ %mega-extend
  905. |= [table=table-mary challenges=(list belt) fock-meta=fock-return]
  906. ^- table-mary
  907. (^mega-extend +<)
  908. ::
  909. ++ pad
  910. ~/ %pad
  911. |= table=table-mary
  912. ^- table-mary
  913. =/ height (height-mary:tlib p.table)
  914. =/ rows p.table
  915. =/ offset (sub height len.array.rows)
  916. ?: =(0 offset)
  917. table
  918. =/ pad-row=bpoly
  919. %- init-bpoly
  920. :- 1
  921. (reap (dec (lent basic-column-names:static:common)) 0)
  922. =; padding=mary
  923. table(p (~(weld ave rows) padding))
  924. %- zing-bpolys
  925. (reap offset pad-row)
  926. ::
  927. ++ terminal
  928. ~/ %terminal
  929. |= =table-mary
  930. ^- bpoly
  931. =/ pr print-pelt
  932. =/ first-row (~(snag-as-bpoly ave p.table-mary) 0)
  933. =/ last-row [step.p.table-mary ~(rear ave p.table-mary)]
  934. %- init-bpoly
  935. %+ pr (grab-pelt %s-size first-row)
  936. %+ pr (grab-pelt %s-leaf first-row)
  937. %+ pr (grab-pelt %s-dyck first-row)
  938. %+ pr (grab-pelt %f-size first-row)
  939. %+ pr (grab-pelt %f-leaf first-row)
  940. %+ pr (grab-pelt %f-dyck first-row)
  941. %+ pr (grab-pelt %e-size first-row)
  942. %+ pr (grab-pelt %e-leaf first-row)
  943. %+ pr (grab-pelt %e-dyck first-row)
  944. %+ pr (grab-pelt %decode-mset last-row)
  945. %+ pr (grab-pelt %op0-mset last-row)
  946. ~
  947. ::
  948. ++ boundary-constraints boundary-constraints:funcs:engine:verifier-compute
  949. ++ row-constraints row-constraints:funcs:engine:verifier-compute
  950. ++ transition-constraints transition-constraints:funcs:engine:verifier-compute
  951. ++ terminal-constraints terminal-constraints:funcs:engine:verifier-compute
  952. ++ extra-constraints extra-constraints:funcs:engine:verifier-compute
  953. --
  954. --