compute.hoon 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962
  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. ++ write-compressed-noun
  189. ~/ %write-compressed-noun
  190. |= chals=ext-chals:chal
  191. |= [[s=tree-data f=tree-data e=tree-data] tail=(list belt)]
  192. ^- (list belt)
  193. %+ print-pelt ((compress-nouns chals) s f e)
  194. tail
  195. ::
  196. ++ compress-nouns
  197. ~/ %compress-nouns
  198. |= chals=ext-chals:chal
  199. |= [s=tree-data f=tree-data e=tree-data]
  200. ^- pelt
  201. ;: padd
  202. %+ pmul d.chals
  203. ;: padd
  204. (pmul a.chals size.s)
  205. (pmul b.chals dyck.s)
  206. (pmul c.chals leaf.s)
  207. ==
  208. ::
  209. %+ pmul e.chals
  210. ;: padd
  211. (pmul a.chals size.f)
  212. (pmul b.chals dyck.f)
  213. (pmul c.chals leaf.f)
  214. ==
  215. ::
  216. %+ pmul f.chals
  217. ;: padd
  218. (pmul a.chals size.e)
  219. (pmul b.chals dyck.e)
  220. (pmul c.chals leaf.e)
  221. ==
  222. ==
  223. ::
  224. ++ update-mset
  225. ~/ %update-mset
  226. |= [chals=mega-ext-chals:chal mset=pelt s=tree-data axis=tree-data e=tree-data]
  227. ^- pelt
  228. =/ mroot=pelt
  229. ;: padd
  230. (pmul a.chals size.s)
  231. (pmul b.chals dyck.s)
  232. (pmul c.chals leaf.s)
  233. ==
  234. =/ maxis=pelt
  235. (pmul d.chals leaf.axis)
  236. =/ mval=pelt
  237. ;: padd
  238. (pmul e.chals size.e)
  239. (pmul f.chals dyck.e)
  240. (pmul g.chals leaf.e)
  241. ==
  242. =/ mvar=pelt
  243. :(padd mroot maxis mval)
  244. ::
  245. (padd mset (pinv (psub bet.chals mvar)))
  246. ::
  247. ++ update-decoder
  248. ~/ %update-decoder
  249. |= [chals=mega-ext-chals:chal mset=pelt s=tree-data h=tree-data t=tree-data]
  250. ^- pelt
  251. =/ trip=pelt
  252. ;: padd
  253. (pmul j.chals size.s)
  254. (pmul k.chals dyck.s)
  255. (pmul l.chals leaf.s)
  256. (pmul m.chals size.h)
  257. (pmul n.chals dyck.h)
  258. (pmul o.chals leaf.h)
  259. (pmul w.chals size.t)
  260. (pmul x.chals dyck.t)
  261. (pmul y.chals leaf.t)
  262. ==
  263. ::
  264. (padd mset (pinv (psub gam.chals trip)))
  265. ::
  266. ++ update-stack
  267. ~/ %update-stack
  268. |= [state=state-data row=row-data chals=mega-ext-chals:chal]
  269. ^- pelt
  270. =/ c (compress-nouns (to-ext-chals chals))
  271. =/ program (c s.row f.row e.row)
  272. =/ sp1 (c sf1-s.row sf1-f.row sf1-e.row)
  273. =/ sp2 (c sf2-s.row sf2-f.row sf2-e.row)
  274. =/ sp3 (c sf3-s.row sf3-f.row sf3-e.row)
  275. =/ op (need op.row)
  276. ;: padd
  277. stack-kv.state
  278. ::
  279. ?: ?=(?(%0 %1) op)
  280. pzero
  281. :(pmul sp1 opc.state z.chals)
  282. ::
  283. ?: ?=(?(%0 %1 %3 %4) op)
  284. pzero
  285. :(pmul sp2 opc.state z.chals z.chals)
  286. ::
  287. ?. ?=(%2 op)
  288. pzero
  289. :(pmul sp3 opc.state z.chals z.chals z.chals)
  290. ::
  291. (pneg (pmul program ln.state))
  292. ==
  293. ::
  294. +$ row-data
  295. $: op=(unit @)
  296. pad=@
  297. s=tree-data f=tree-data e=tree-data
  298. sf1-s=tree-data sf1-f=tree-data sf1-e=tree-data
  299. sf2-s=tree-data sf2-f=tree-data sf2-e=tree-data
  300. sf3-s=tree-data sf3-f=tree-data sf3-e=tree-data
  301. f-h=tree-data f-t=tree-data f-th=tree-data
  302. f-tt=tree-data f-tth=tree-data f-ttt=tree-data
  303. fcons-inv=pelt
  304. ==
  305. ::
  306. +$ state-data
  307. $: ln=pelt
  308. sfcons-inv=pelt
  309. opc=pelt
  310. stack-kv=pelt
  311. decode-mset=pelt
  312. op0-mset=pelt
  313. ==
  314. ::
  315. ++ to-ext-chals
  316. ~/ %to-ext-chals
  317. |= chals=mega-ext-chals:chal
  318. ^- ext-chals:chal
  319. [a b c d e f g p q r s t u alf]:chals
  320. ::
  321. :: pinv but 1/0 = 0
  322. ++ make-invs
  323. ~/ %make-invs
  324. |= p=pelt
  325. ^- pelt
  326. ?: =(pzero p)
  327. pzero
  328. (pinv p)
  329. ::
  330. ++ compute-gen
  331. ~/ %compute-gen
  332. |= [row=row-data chals=ext-chals:chal]
  333. ^- pelt
  334. ?~ op.row pzero
  335. ?+ u.op.row pzero
  336. %0 (make-invs (psub leaf.f-t.row pone))
  337. %3 (make-invs (psub alf.chals size.sf1-e.row))
  338. ==
  339. ::
  340. ++ write-extend-row
  341. ~/ %write-extend-row
  342. |= [row=row-data chals=ext-chals:chal]
  343. ^- bpoly
  344. =/ p print-pelt
  345. =/ n (write-noun alf.chals)
  346. =/ c (write-compressed-noun chals)
  347. %- init-bpoly
  348. %+ n s.row
  349. %+ n f.row
  350. %+ n e.row
  351. %+ n sf1-s.row
  352. %+ n sf1-f.row
  353. %+ n sf1-e.row
  354. %+ n sf2-s.row
  355. %+ n sf2-f.row
  356. %+ n sf2-e.row
  357. %+ n sf3-s.row
  358. %+ n sf3-f.row
  359. %+ n sf3-e.row
  360. %+ n f-h.row
  361. %+ n f-t.row
  362. %+ n f-th.row
  363. %+ n f-tt.row
  364. %+ n f-tth.row
  365. %+ n f-ttt.row
  366. %+ p fcons-inv.row
  367. ~
  368. ::
  369. ++ write-mega-extend-row
  370. ~/ %write-mega-extend-row
  371. |= state=state-data
  372. ^- bpoly
  373. =/ p print-pelt
  374. %- init-bpoly
  375. %+ p ln.state
  376. %+ p sfcons-inv.state
  377. %+ p opc.state
  378. %+ p stack-kv.state
  379. %+ p decode-mset.state
  380. %+ p op0-mset.state
  381. ~
  382. ::
  383. ++ compute-fcons-inv
  384. ~/ %compute-fcons-inv
  385. |= row=row-data
  386. ^- pelt
  387. %- pinv
  388. ;: pmul
  389. size.f-h.row
  390. size.f-th.row
  391. size.f-tt.row
  392. ==
  393. ::
  394. ++ compute-sfcons-inv
  395. ~/ %compute-sfcons-inv
  396. |= [row=row-data state=state-data chals=mega-ext-chals:chal]
  397. ^- pelt
  398. ?: =(1 pad.row)
  399. (pinv (psub z.chals ln.state))
  400. ?+ (need op.row) pone
  401. %0
  402. (make-invs (psub leaf.f-t.row pone))
  403. ::
  404. %3
  405. (make-invs (psub alf.chals size.sf1-e.row))
  406. ::
  407. %5
  408. %- pinv
  409. ;: padd
  410. (pmul a.chals (psub size.sf1-e.row size.sf2-e.row))
  411. (pmul b.chals (psub dyck.sf1-e.row dyck.sf2-e.row))
  412. (pmul c.chals (psub leaf.sf1-e.row leaf.sf2-e.row))
  413. (psub pone leaf.e.row)
  414. ==
  415. ::
  416. %8
  417. (pinv (pmul size.s.row size.sf2-e.row))
  418. ::
  419. %9
  420. (pinv (pmul size.sf1-e.row size.sf2-e.row))
  421. ==
  422. ::
  423. ++ build
  424. ~/ %build
  425. |= fock-meta=fock-return
  426. ^- table-mary
  427. =/ queue=(list *) queue.fock-meta
  428. =| rows=(list bpoly)
  429. |- ^- table-mary
  430. ?: =(0 (lent queue))
  431. :- header
  432. %- zing-bpolys
  433. %- flop
  434. :_ rows
  435. (init-bpoly [1 (reap (dec (lent basic-column-names:static:common)) 0)])
  436. =| row=row-data
  437. =/ f (snag 1 queue)
  438. =. queue (slag 3 queue)
  439. ?> ?=(^ f)
  440. =/ op ?^(-.f %9 -.f)
  441. =/ ops (~(got by op-map) op)
  442. =. rows
  443. :_ rows
  444. %- init-bpoly
  445. :~ 0 :: pad
  446. o0.ops
  447. o1.ops
  448. o2.ops
  449. o3.ops
  450. o4.ops
  451. o5.ops
  452. o6.ops
  453. o7.ops
  454. o8.ops
  455. o9.ops
  456. ==
  457. =. queue
  458. ?+ op !!
  459. %0 queue
  460. %1 queue
  461. %2 (slag 2 queue)
  462. %3 (slag 1 queue)
  463. %4 (slag 1 queue)
  464. %5 (slag 2 queue)
  465. %6 (slag 3 queue)
  466. %7 (slag 1 queue)
  467. %8 (slag 2 queue)
  468. %9 (slag 2 queue)
  469. ==
  470. $
  471. ::
  472. ++ mega-extend
  473. ~/ %mega-extend
  474. |= [table=table-mary all-chals=(list belt) fock-meta=fock-return]
  475. ^- table-mary
  476. ::
  477. :: challenges
  478. =/ chals=mega-ext-chals:chal (init-mega-ext-chals:chal all-chals)
  479. =/ z=pelt-chal:constraint-util z.chals
  480. =/ z2=pelt-chal:constraint-util (pmul z z)
  481. =/ z3=pelt-chal:constraint-util (pmul z2 z)
  482. =/ compress (compress-nouns (to-ext-chals chals))
  483. =/ stack=(list tree-data)
  484. (build-compute-queue:fock queue.fock-meta alf.chals)
  485. =| rows=(list bpoly)
  486. =| state=state-data
  487. =. state
  488. =/ [s=tree-data f=tree-data e=tree-data]
  489. [(snag 0 stack) (snag 1 stack) (snag 2 stack)]
  490. %_ state
  491. ln z
  492. opc z
  493. stack-kv (pmul z (compress s f e))
  494. ==
  495. |- ^- table-mary
  496. ?: =(0 (lent stack))
  497. :: computation is finished
  498. :- header
  499. :: write one final row that will contain the final kv stores and multisets
  500. :: then decrement ln during padding
  501. =/ z-inv (pinv z)
  502. =| row=row-data
  503. =. row row(pad 1)
  504. =. state state(sfcons-inv (compute-sfcons-inv row state chals))
  505. =/ last-row (write-mega-extend-row state)
  506. =. rows [last-row rows]
  507. %- zing-bpolys
  508. %- flop
  509. =- acc
  510. %+ roll (range (sub len.array.p.table (lent rows)))
  511. |= [@ state=_state acc=_rows]
  512. =. state state(ln (pmul ln.state z-inv))
  513. =. state state(sfcons-inv (compute-sfcons-inv row state chals))
  514. :- state
  515. [(write-mega-extend-row state) acc]
  516. ::
  517. =| row=row-data
  518. =/ old-state state
  519. =. state state(ln (pmul z ln.state))
  520. =. s.row (snag 0 stack)
  521. =. f.row (snag 1 stack)
  522. =. e.row (snag 2 stack)
  523. =. stack (slag 3 stack)
  524. =. f-h.row
  525. (build-tree-data:fock -.n.f.row alf.chals)
  526. =. f-t.row
  527. (build-tree-data:fock +.n.f.row alf.chals)
  528. ::
  529. =. op.row (some ?^(-.n.f.row %9 -.n.f.row))
  530. =. f-th.row
  531. ?: ?=(?(%2 %5 %6 %7 %8) (need op.row))
  532. (build-tree-data:fock -.n.f-t.row alf.chals)
  533. *tree-data
  534. =. f-tt.row
  535. ?: ?=(?(%2 %5 %6 %7 %8) (need op.row))
  536. (build-tree-data:fock +.n.f-t.row alf.chals)
  537. *tree-data
  538. =. f-tth.row
  539. ?: ?=(%6 (need op.row))
  540. (build-tree-data:fock -.n.f-tt.row alf.chals)
  541. *tree-data
  542. =. f-ttt.row
  543. ?: ?=(%6 (need op.row))
  544. (build-tree-data:fock +.n.f-tt.row alf.chals)
  545. *tree-data
  546. ::
  547. =/ [new-stack=(list tree-data) new-state=state-data new-row=row-data]
  548. ?+ (need op.row) !!
  549. %0
  550. :+ stack
  551. %_ state
  552. decode-mset
  553. (update-decoder chals decode-mset.state f.row f-h.row f-t.row)
  554. op0-mset
  555. ?: =(1 n.f-t.row)
  556. op0-mset.state :: for axis=1 don't use memory table
  557. (update-mset chals op0-mset.state s.row f-t.row e.row)
  558. ==
  559. row
  560. ::
  561. %1
  562. :+ stack
  563. %_ state
  564. decode-mset
  565. (update-decoder chals decode-mset.state f.row f-h.row f-t.row)
  566. ==
  567. row
  568. ::
  569. %2
  570. =/ sf1-e (snag 0 stack)
  571. =/ sf2-e (snag 1 stack)
  572. =. opc.state (pmul opc.state z3)
  573. =. decode-mset.state
  574. (update-decoder chals decode-mset.state f.row f-h.row f-t.row)
  575. =. decode-mset.state
  576. (update-decoder chals decode-mset.state f-t.row f-th.row f-tt.row)
  577. :+ (slag 2 stack)
  578. state
  579. %_ row
  580. sf1-s s.row
  581. sf1-f f-th.row
  582. sf1-e sf1-e
  583. sf2-s s.row
  584. sf2-f f-tt.row
  585. sf2-e sf2-e
  586. sf3-s sf1-e
  587. sf3-f sf2-e
  588. sf3-e e.row
  589. ==
  590. ::
  591. %3
  592. =/ sf1-e (snag 0 stack)
  593. :+ (slag 1 stack)
  594. %_ state
  595. opc (pmul opc.state z)
  596. decode-mset
  597. (update-decoder chals decode-mset.state f.row f-h.row f-t.row)
  598. ==
  599. %_ row
  600. sf1-s s.row
  601. sf1-f f-t.row
  602. sf1-e sf1-e
  603. ==
  604. ::
  605. %4
  606. =/ sf1-e (snag 0 stack)
  607. :+ (slag 1 stack)
  608. %_ state
  609. opc (pmul opc.state z)
  610. decode-mset
  611. (update-decoder chals decode-mset.state f.row f-h.row f-t.row)
  612. ==
  613. %_ row
  614. sf1-s s.row
  615. sf1-f f-t.row
  616. sf1-e sf1-e
  617. ==
  618. ::
  619. %5
  620. =/ sf1-e (snag 0 stack)
  621. =/ sf2-e (snag 1 stack)
  622. =. opc.state (pmul opc.state z2)
  623. =. decode-mset.state
  624. (update-decoder chals decode-mset.state f.row f-h.row f-t.row)
  625. =. decode-mset.state
  626. (update-decoder chals decode-mset.state f-t.row f-th.row f-tt.row)
  627. :+ (slag 2 stack)
  628. state
  629. %_ row
  630. sf1-s s.row
  631. sf1-f f-th.row
  632. sf1-e sf1-e
  633. sf2-s s.row
  634. sf2-f f-tt.row
  635. sf2-e sf2-e
  636. ==
  637. ::
  638. %6
  639. =/ sf1-f (snag 0 stack)
  640. =/ sf1-e (snag 1 stack)
  641. =/ sf2-e (snag 2 stack)
  642. =. opc.state (pmul opc.state z2)
  643. =. decode-mset.state
  644. (update-decoder chals decode-mset.state f.row f-h.row f-t.row)
  645. =. decode-mset.state
  646. (update-decoder chals decode-mset.state f-t.row f-th.row f-tt.row)
  647. =. decode-mset.state
  648. (update-decoder chals decode-mset.state f-tt.row f-tth.row f-ttt.row)
  649. :+ (slag 3 stack)
  650. state
  651. %_ row
  652. sf1-s s.row
  653. sf1-f sf1-f
  654. sf1-e sf1-e
  655. sf2-s s.row
  656. sf2-f f-th.row
  657. sf2-e sf2-e
  658. ==
  659. ::
  660. %7
  661. =/ sf2-e (snag 0 stack)
  662. =. opc.state (pmul opc.state z2)
  663. =. decode-mset.state
  664. (update-decoder chals decode-mset.state f.row f-h.row f-t.row)
  665. =. decode-mset.state
  666. (update-decoder chals decode-mset.state f-t.row f-th.row f-tt.row)
  667. :+ (slag 1 stack)
  668. state
  669. %_ row
  670. sf1-s sf2-e
  671. sf1-f f-tt.row
  672. sf1-e e.row
  673. sf2-s s.row
  674. sf2-f f-th.row
  675. sf2-e sf2-e
  676. ==
  677. ::
  678. %8
  679. =/ sf1-s (snag 0 stack)
  680. =/ sf2-e (snag 1 stack)
  681. =. opc.state (pmul opc.state z2)
  682. =. decode-mset.state
  683. (update-decoder chals decode-mset.state f.row f-h.row f-t.row)
  684. =. decode-mset.state
  685. (update-decoder chals decode-mset.state f-t.row f-th.row f-tt.row)
  686. :+ (slag 2 stack)
  687. state(opc (pmul opc.state z2))
  688. %_ row
  689. sf1-s sf1-s
  690. sf1-f f-tt.row
  691. sf1-e e.row
  692. sf2-s s.row
  693. sf2-f f-th.row
  694. sf2-e sf2-e
  695. ==
  696. ::
  697. %9
  698. =/ left-e (snag 0 stack)
  699. =/ right-e (snag 1 stack)
  700. :+ (slag 2 stack)
  701. %_ state
  702. opc (pmul opc.state z2)
  703. decode-mset
  704. (update-decoder chals decode-mset.state f.row f-h.row f-t.row)
  705. ==
  706. %_ row
  707. sf1-s s.row
  708. sf1-f f-h.row
  709. sf1-e left-e
  710. sf2-s s.row
  711. sf2-f f-t.row
  712. sf2-e right-e
  713. ==
  714. ::
  715. ==
  716. =. stack new-stack
  717. =. state new-state
  718. =. row new-row
  719. =. old-state old-state(sfcons-inv (compute-sfcons-inv row old-state chals))
  720. =. stack-kv.state (update-stack old-state row chals)
  721. =. rows
  722. :_ rows
  723. (write-mega-extend-row old-state)
  724. $
  725. ::
  726. ++ extend
  727. ~/ %extend
  728. |= [table=table-mary chals-rd1=(list belt) fock-meta=fock-return]
  729. ^- table-mary
  730. ::
  731. :: challenges
  732. =/ chals=ext-chals:chal (init-ext-chals:chal chals-rd1)
  733. ::
  734. ::
  735. =/ stack=(list tree-data)
  736. (build-compute-queue:fock queue.fock-meta alf.chals)
  737. =| rows=(list bpoly)
  738. |- ^- table-mary
  739. ?: =(0 (lent stack))
  740. :- header
  741. =/ last-row
  742. (init-bpoly (reap (lent ext-column-names:static:common) 0))
  743. %- zing-bpolys
  744. %+ weld
  745. (flop rows)
  746. (reap (sub len.array.p.table (lent rows)) last-row)
  747. =| row=row-data
  748. =. s.row (snag 0 stack)
  749. =. f.row (snag 1 stack)
  750. =. e.row (snag 2 stack)
  751. =. stack (slag 3 stack)
  752. =. f-h.row
  753. (build-tree-data:fock -.n.f.row alf.chals)
  754. =. f-t.row
  755. (build-tree-data:fock +.n.f.row alf.chals)
  756. ::
  757. =. op.row (some ?^(-.n.f.row %9 -.n.f.row))
  758. =. f-th.row
  759. ?: ?=(?(%2 %5 %6 %7 %8) (need op.row))
  760. (build-tree-data:fock -.n.f-t.row alf.chals)
  761. *tree-data
  762. =. f-tt.row
  763. ?: ?=(?(%2 %5 %6 %7 %8) (need op.row))
  764. (build-tree-data:fock +.n.f-t.row alf.chals)
  765. *tree-data
  766. =. f-tth.row
  767. ?: ?=(%6 (need op.row))
  768. (build-tree-data:fock -.n.f-tt.row alf.chals)
  769. *tree-data
  770. =. f-ttt.row
  771. ?: ?=(%6 (need op.row))
  772. (build-tree-data:fock +.n.f-tt.row alf.chals)
  773. *tree-data
  774. ::
  775. =/ [new-stack=(list tree-data) new-row=row-data]
  776. ?+ (need op.row) !!
  777. %0
  778. :- stack
  779. row
  780. ::
  781. %1
  782. :- stack
  783. row
  784. ::
  785. %2
  786. =/ sf1-e (snag 0 stack)
  787. =/ sf2-e (snag 1 stack)
  788. :- (slag 2 stack)
  789. %_ row
  790. sf1-s s.row
  791. sf1-f f-th.row
  792. sf1-e sf1-e
  793. sf2-s s.row
  794. sf2-f f-tt.row
  795. sf2-e sf2-e
  796. sf3-s sf1-e
  797. sf3-f sf2-e
  798. sf3-e e.row
  799. ==
  800. ::
  801. %3
  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. %4
  811. =/ sf1-e (snag 0 stack)
  812. :- (slag 1 stack)
  813. %_ row
  814. sf1-s s.row
  815. sf1-f f-t.row
  816. sf1-e sf1-e
  817. ==
  818. ::
  819. %5
  820. =/ sf1-e (snag 0 stack)
  821. =/ sf2-e (snag 1 stack)
  822. :- (slag 2 stack)
  823. %_ row
  824. sf1-s s.row
  825. sf1-f f-th.row
  826. sf1-e sf1-e
  827. sf2-s s.row
  828. sf2-f f-tt.row
  829. sf2-e sf2-e
  830. ==
  831. ::
  832. %6
  833. =/ sf1-f (snag 0 stack)
  834. =/ sf1-e (snag 1 stack)
  835. =/ sf2-e (snag 2 stack)
  836. :- (slag 3 stack)
  837. %_ row
  838. sf1-s s.row
  839. sf1-f sf1-f
  840. sf1-e sf1-e
  841. sf2-s s.row
  842. sf2-f f-th.row
  843. sf2-e sf2-e
  844. ==
  845. ::
  846. %7
  847. =/ sf2-e (snag 0 stack)
  848. :- (slag 1 stack)
  849. %_ row
  850. sf1-s sf2-e
  851. sf1-f f-tt.row
  852. sf1-e e.row
  853. sf2-s s.row
  854. sf2-f f-th.row
  855. sf2-e sf2-e
  856. ==
  857. ::
  858. %8
  859. =/ sf1-s (snag 0 stack)
  860. =/ sf2-e (snag 1 stack)
  861. :- (slag 2 stack)
  862. %_ row
  863. sf1-s sf1-s
  864. sf1-f f-tt.row
  865. sf1-e e.row
  866. sf2-s s.row
  867. sf2-f f-th.row
  868. sf2-e sf2-e
  869. ==
  870. ::
  871. %9
  872. =/ left-e (snag 0 stack)
  873. =/ right-e (snag 1 stack)
  874. :- (slag 2 stack)
  875. %_ row
  876. sf1-s s.row
  877. sf1-f f-h.row
  878. sf1-e left-e
  879. sf2-s s.row
  880. sf2-f f-t.row
  881. sf2-e right-e
  882. ==
  883. ::
  884. ==
  885. =. stack new-stack
  886. =. row
  887. %_ new-row
  888. fcons-inv (compute-fcons-inv new-row)
  889. ==
  890. =. rows
  891. :_ rows
  892. (write-extend-row row chals)
  893. $
  894. ::
  895. ++ funcs
  896. ^- table-funcs
  897. ~% %funcs ..grab ~
  898. |%
  899. ++ build
  900. ~/ %build
  901. |= fock-meta=fock-return
  902. ^- table-mary
  903. (^build +<)
  904. ::
  905. ++ extend
  906. ~/ %extend
  907. |= [table=table-mary challenges=(list belt) fock-meta=fock-return]
  908. ^- table-mary
  909. ::~& %outer-extend
  910. (^extend +<)
  911. ::
  912. ++ mega-extend
  913. ~/ %mega-extend
  914. |= [table=table-mary challenges=(list belt) fock-meta=fock-return]
  915. ^- table-mary
  916. (^mega-extend +<)
  917. ::
  918. ++ pad
  919. ~/ %pad
  920. |= table=table-mary
  921. ^- table-mary
  922. =/ height (height-mary:tlib p.table)
  923. =/ rows p.table
  924. =/ offset (sub height len.array.rows)
  925. ?: =(0 offset)
  926. table
  927. =/ pad-row=bpoly
  928. %- init-bpoly
  929. :- 1
  930. (reap (dec (lent basic-column-names:static:common)) 0)
  931. =; padding=mary
  932. table(p (~(weld ave rows) padding))
  933. %- zing-bpolys
  934. (reap offset pad-row)
  935. ::
  936. ++ terminal
  937. ~/ %terminal
  938. |= =table-mary
  939. ^- bpoly
  940. =/ pr print-pelt
  941. =/ first-row (~(snag-as-bpoly ave p.table-mary) 0)
  942. =/ last-row [step.p.table-mary ~(rear ave p.table-mary)]
  943. %- init-bpoly
  944. %+ pr (grab-pelt %s-size first-row)
  945. %+ pr (grab-pelt %s-leaf first-row)
  946. %+ pr (grab-pelt %s-dyck first-row)
  947. %+ pr (grab-pelt %f-size first-row)
  948. %+ pr (grab-pelt %f-leaf first-row)
  949. %+ pr (grab-pelt %f-dyck first-row)
  950. %+ pr (grab-pelt %e-size first-row)
  951. %+ pr (grab-pelt %e-leaf first-row)
  952. %+ pr (grab-pelt %e-dyck first-row)
  953. %+ pr (grab-pelt %decode-mset last-row)
  954. %+ pr (grab-pelt %op0-mset last-row)
  955. ~
  956. ::
  957. ++ boundary-constraints boundary-constraints:funcs:engine:verifier-compute
  958. ++ row-constraints row-constraints:funcs:engine:verifier-compute
  959. ++ transition-constraints transition-constraints:funcs:engine:verifier-compute
  960. ++ terminal-constraints terminal-constraints:funcs:engine:verifier-compute
  961. --
  962. --