| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024 |
- /= ztd-four /common/ztd/four
- => ztd-four
- ~% %utils ..proof-path ~
- :: utils
- |%
- ++ proof-stream :: /lib/proof-stream
- ~% %proof-stream +> ~
- |_ proof
- ++ push
- ~/ %push
- |= dat=proof-data
- ^- proof
- :+ (snoc objects dat)
- (snoc hashes (hash-hashable:tip5 (hashable-proof-data dat)))
- read-index
- ::
- ++ pull
- ^- [proof-data proof]
- ?> (lth read-index (lent objects))
- =/ dat (snag read-index objects)
- :- dat
- :+ objects
- (snoc hashes (hash-hashable:tip5 (hashable-proof-data dat)))
- +(read-index)
- ::
- ++ prover-fiat-shamir
- ^+ tog:tip5
- (absorb-proof-objects objects hashes)
- ::
- ++ verifier-fiat-shamir
- ^+ tog:tip5
- =/ objects=(list proof-data) (scag read-index objects)
- =/ hashes=(list noun-digest:tip5) (scag read-index hashes)
- (absorb-proof-objects objects hashes)
- -- ::proof-stream
- ::
- +$ mp-pelt [a=mp-mega b=mp-mega c=mp-mega]
- +$ mp-pelt-comp [dep=mp-pelt com=mp-pelt]
- ::
- :: triple belt
- ++ rack
- |= b=belt
- ^- [belt belt belt]
- [b b b]
- ::
- :: raise belt
- ++ reck
- |= b=belt
- ^- [belt belt belt]
- [b 0 0]
- ::
- ++ constraint-util :: /lib/constraint-util
- =, mp-to-mega
- ~% %constraint-util ..constraint-util ~
- |%
- ++ unlabel-constraints
- ~/ %unlabel-constraints
- |= mp=(map term mp-ultra)
- ^- (list mp-ultra)
- ~+
- (turn ~(tap by mp) tail)
- ::
- ++ lift-to-mp-pelt
- |= m=mp-mega
- ^- mp-pelt
- [m *mp-mega *mp-mega]
- ::
- ++ mpadd-pelt
- |= [p=mp-pelt q=mp-pelt]
- ^- mp-pelt
- :+ (mpadd a.p a.q)
- (mpadd b.p b.q)
- (mpadd c.p c.q)
- ::
- ++ mpsub-pelt
- |= [p=mp-pelt q=mp-pelt]
- ^- mp-pelt
- :+ (mpsub a.p a.q)
- (mpsub b.p b.q)
- (mpsub c.p c.q)
- ::
- ++ mpcomp-pelt
- |= [p=mp-pelt q=mp-pelt]
- ^- mp-pelt-comp
- [dep=p com=q]
- ::
- ++ mpmul-pelt
- |= [p=mp-pelt q=mp-pelt]
- ^- mp-pelt
- =/ m0 (mpmul a.p a.q)
- =/ m1 (mpmul b.p b.q)
- =/ m2 (mpmul c.p c.q)
- =/ n01
- %+ mpsub
- (mpmul (mpadd a.p b.p) (mpadd a.q b.q))
- (mpadd m0 m1)
- =/ n02
- %+ mpsub
- (mpmul (mpadd a.p c.p) (mpadd a.q c.q))
- (mpadd m0 m2)
- =/ n12
- %+ mpsub
- (mpmul (mpadd b.p c.p) (mpadd b.q c.q))
- (mpadd m1 m2)
- :+ (mpsub m0 n12)
- (mpsub (mpadd n01 n12) m2)
- :(mpadd n02 m1 m2)
- ::
- :: pass in m=(mp-c c) to scale by belt constant c
- ++ mpscal-pelt
- |= [m=mp-mega p=mp-pelt]
- ^- mp-pelt
- :+ (mpmul m a.p)
- (mpmul m b.p)
- (mpmul m c.p)
- ::
- ++ lift-to-mega
- |= =mp-mega
- ^- mp-ultra
- [%mega mp-mega]
- ::
- ++ tag-mp-comp
- |= [name=term mp=mp-pelt-comp tail=(list [term mp-ultra])]
- ^- (list [term mp-ultra])
- :- :- (crip (weld (trip name) "-comp"))
- :+ %comp
- ~[a.dep.mp b.dep.mp c.dep.mp]
- ~[a.com.mp b.com.mp c.com.mp]
- tail
- ::
- ++ tag-mp-pelt
- |= [name=term =mp-pelt tail=(list [term mp-ultra])]
- ^- (list [term mp-ultra])
- :^ [(crip (weld (trip name) "-a")) [%mega a.mp-pelt]]
- [(crip (weld (trip name) "-b")) [%mega b.mp-pelt]]
- [(crip (weld (trip name) "-c")) [%mega c.mp-pelt]]
- tail
- ::
- ++ untagged-mp-pelt
- |= [=mp-pelt tail=(list mp-ultra)]
- ^- (list mp-ultra)
- :* (lift-to-mega a.mp-pelt)
- (lift-to-mega b.mp-pelt)
- (lift-to-mega c.mp-pelt)
- tail
- ==
- ::
- ++ pelt-col
- |= [name=term tail=(list term)]
- ^- (list term)
- :^ (crip (weld (trip name) "-a"))
- (crip (weld (trip name) "-b"))
- (crip (weld (trip name) "-c"))
- tail
- ::
- +$ pelt-chal @ux
- ++ make-pelt-chal
- |= r=$-(term belt)
- |= name=term
- ^- pelt-chal
- =< dat
- %- init-bpoly
- :~ (r (crip (weld (trip name) "-a")))
- (r (crip (weld (trip name) "-b")))
- (r (crip (weld (trip name) "-c")))
- ==
- ::
- +$ felt-stack
- $: alf=felt
- alf-inv=felt
- len=@
- dat=felt
- ==
- ::
- ++ init-fstack
- ~/ %init-fstack
- |= alf=felt
- ^- felt-stack
- =/ alf-inv=felt (finv alf)
- [alf alf-inv 0 (lift 0)]
- ::
- :: +fstack: door for working with a $felt-stack
- ::
- :: bottom [a b c] top
- :: empty stack [] <-> dat 0
- ++ fstack
- ~/ %fstack
- |_ fs=felt-stack
- ++ push
- :: [a b c] => [a b c x]
- ~/ %push
- |= x=felt
- ^- felt-stack
- fs(len +(len.fs), dat (fadd (fmul dat.fs alf.fs) x))
- ++ pop
- :: [a b c x] => [a b c]
- ~/ %pop
- |= x=felt
- ^- felt-stack
- ?> (gth len.fs 0)
- fs(len (dec len.fs), dat (fmul (fsub dat.fs x) alf-inv.fs))
- ++ push-all
- :: [a b c] => [a b c x1 ... xn]
- ~/ %push-all
- |= xs=(list felt)
- ^- felt-stack
- %+ roll xs
- |= [x=felt fs-new=_fs]
- (~(push fstack fs-new) x)
- ++ push-bottom
- :: [a b c] => [x a b c]
- ~/ %push-bottom
- |= x=felt
- ^- felt-stack
- :: alf^len * x + dat.fs
- fs(len +(len.fs), dat (fadd (fmul (fpow alf.fs len.fs) x) dat.fs))
- ++ push-bottom-all
- :: [a b c] => [x0 ... xn a b c]
- ~/ %push-bottom-all
- |= xs=(list felt)
- ^- felt-stack
- %+ roll (flop xs)
- :: let sx = (flop xs)
- :: [a b c] => [sx2 sx1 sx0 a b c]
- :: = [a b c] => [xs0 sx1 sx2 a b c]
- |= [x=felt fs-new=_fs]
- (~(push-bottom fstack fs-new) x)
- ++ cons
- :: stack cons: [a b], [c d] => [a b c d]
- ~/ %cons
- |= other=felt-stack
- ^- felt-stack
- ?> =(alf.fs alf.other)
- :: alf^len(other) * dat.fs + dat.other
- %_ fs
- len (add len.fs len.other)
- dat (fadd (fmul (fpow alf.fs len.other) dat.fs) dat.other)
- ==
- ++ pop-all
- ~/ %pop-all
- |= xs=(list felt)
- ^- felt-stack
- %+ roll xs
- |= [x=felt fs-new=_fs]
- ?> (gth len.fs 0)
- (~(pop fstack fs-new) x)
- ::
- ++ is-empty =(len.fs 0)
- --
- ::
- +$ belt-stack
- $: alf=belt
- alf-inv=belt
- len=@
- dat=belt
- ==
- ::
- ++ init-bstack
- ~/ %init-bstack
- |= alf=belt
- ^- belt-stack
- =/ alf-inv=belt (binv alf)
- [alf alf-inv 0 0]
- ::
- :: +bstack: door for working with a $belt-stack
- ::
- :: bottom [a b c] top
- :: empty stack [] <-> dat 0
- ++ bstack
- ~/ %bstack
- |_ bs=belt-stack
- ++ push
- :: [a b c] => [a b c x]
- ~/ %push
- |= x=belt
- ^- belt-stack
- bs(len +(len.bs), dat (badd (bmul dat.bs alf.bs) x))
- ++ pop
- :: [a b c x] => [a b c]
- ~/ %pop
- |= x=belt
- ^- belt-stack
- ?> (gth len.bs 0)
- bs(len (dec len.bs), dat (bmul (bsub dat.bs x) alf-inv.bs))
- ++ push-all
- :: [a b c] => [a b c x1 ... xn]
- ~/ %push-all
- |= xs=(list belt)
- ^- belt-stack
- %+ roll xs
- |= [x=belt bs-new=_bs]
- (~(push bstack bs-new) x)
- ++ push-bottom
- :: [a b c] => [x a b c]
- ~/ %push-bottom
- |= x=belt
- ^- belt-stack
- :: alf^len * x + dat.fs
- bs(len +(len.bs), dat (badd (bmul (bpow alf.bs len.bs) x) dat.bs))
- ++ push-bottom-all
- :: [a b c] => [x0 ... xn a b c]
- ~/ %push-bottom-all
- |= xs=(list belt)
- ^- belt-stack
- %+ roll (flop xs)
- :: let sx = (flop xs)
- :: [a b c] => [sx2 sx1 sx0 a b c]
- :: = [a b c] => [xs0 sx1 sx2 a b c]
- |= [x=belt bs-new=_bs]
- (~(push-bottom bstack bs-new) x)
- ++ cons
- :: stack cons: [a b], [c d] => [a b c d]
- ~/ %cons
- |= other=belt-stack
- ^- belt-stack
- ?> =(alf.bs alf.other)
- :: alf^len(other) * dat.bs + dat.other
- %_ bs
- len (add len.bs len.other)
- dat (badd (bmul (bpow alf.bs len.other) dat.bs) dat.other)
- ==
- ++ pop-all
- ~/ %pop-all
- |= xs=(list belt)
- ^- belt-stack
- %+ roll xs
- |= [x=belt bs-new=_bs]
- ?> (gth len.bs 0)
- (~(pop bstack bs-new) x)
- ::
- ++ is-empty =(len.bs 0)
- --
- ::
- +$ pelt-stack
- $: alf=pelt
- alf-inv=pelt
- len=@
- dat=pelt
- ==
- ::
- ++ init-pstack
- ~/ %init-pstack
- |= alf=pelt
- ^- pelt-stack
- =/ alf-inv=pelt (pinv alf)
- [alf alf-inv 0 (pelt-lift 0)]
- ::
- :: +pstack: door for working with a $pelt-stack
- ::
- :: bottom [a b c] top
- :: empty stack [] <-> dat 0
- ++ pstack
- ~/ %pstack
- |_ ps=pelt-stack
- ++ push
- :: [a b c] => [a b c x]
- ~/ %push
- |= x=pelt
- ^- pelt-stack
- ps(len +(len.ps), dat (padd (pmul dat.ps alf.ps) x))
- ++ pop
- :: [a b c x] => [a b c]
- ~/ %pop
- |= x=pelt
- ^- pelt-stack
- ?> (gth len.ps 0)
- ps(len (dec len.ps), dat (pmul (psub dat.ps x) alf-inv.ps))
- ++ push-all
- :: [a b c] => [a b c x1 ... xn]
- ~/ %push-all
- |= xs=(list pelt)
- ^- pelt-stack
- %+ roll xs
- |= [x=pelt ps-new=_ps]
- (~(push pstack ps-new) x)
- ++ push-bottom
- :: [a b c] => [x a b c]
- ~/ %push-bottom
- |= x=pelt
- ^- pelt-stack
- :: alf^len * x + dat.fs
- ps(len +(len.ps), dat (padd (pmul (ppow alf.ps len.ps) x) dat.ps))
- ++ push-bottom-all
- :: [a b c] => [x0 ... xn a b c]
- ~/ %push-bottom-all
- |= xs=(list pelt)
- ^- pelt-stack
- %+ roll (flop xs)
- :: let sx = (flop xs)
- :: [a b c] => [sx2 sx1 sx0 a b c]
- :: = [a b c] => [xs0 sx1 sx2 a b c]
- |= [x=pelt ps-new=_ps]
- (~(push-bottom pstack ps-new) x)
- ++ cons
- :: stack cons: [a b], [c d] => [a b c d]
- ~/ %cons
- |= other=pelt-stack
- ^- pelt-stack
- ?> =(alf.ps alf.other)
- :: alf^len(other) * dat.bs + dat.other
- %_ ps
- len (add len.ps len.other)
- dat (padd (pmul (ppow alf.ps len.other) dat.ps) dat.other)
- ==
- ++ pop-all
- ~/ %pop-all
- |= xs=(list pelt)
- ^- pelt-stack
- %+ roll xs
- |= [x=pelt ps-new=_ps]
- ?> (gth len.ps 0)
- (~(pop pstack ps-new) x)
- ::
- ++ is-empty =(len.ps 0)
- --
- :: utilities for working with log derivative multisets
- ::
- :: $ld-mset: multiset based on the logarithmic derivative
- +$ ld-mset
- $~ [(lift 0) (lift 0)]
- $: bet=felt :: beta - random challenge for polynomial
- dat=felt :: data - actual value of multiset to write into trace
- ==
- ::
- ++ init-ld-mset
- |= bet=felt
- ^- ld-mset
- [bet (lift 0)]
- ::
- ++ ld-union
- |= msets=(list ld-mset)
- ^- ld-mset
- ?~ msets
- *ld-mset
- =/ bet bet.i.msets
- ?: ?!((levy `(list ld-mset)`msets |=(=ld-mset =(bet.ld-mset bet))))
- !!
- [bet (roll `(list ld-mset)`msets |=([=ld-mset f=felt] (fadd f dat.ld-mset)))]
- ::
- :: +ld: door for working with ld-msets
- ++ ld
- ~/ %ld
- |_ ms=ld-mset
- ::
- :: +add: add f to the multiset n times
- ::
- :: dat' = dat + n/(bet - f)
- ++ add
- ~/ %add
- |= [f=felt n=@]
- ^- ld-mset
- :- bet.ms
- (fadd dat.ms (fmul (lift n) (finv (fsub bet.ms f))))
- :: +add-all: add a list of [felt, multiplicity] pairs to the multiset
- ::
- :: adds them one at a time starting with ms and returns a list of
- :: each intermediate memset in order.
- ++ add-all
- ~/ %add-all
- |= l=(list [f=felt n=@])
- ^- (list ld-mset)
- %+ spun l
- |= [[f=felt n=@] acc=_ms]
- =/ ret (~(add ld acc) f n)
- [ret ret]
- ::
- :: +remove: remove a felt n times
- ++ remove
- |= [f=felt n=@]
- ^- ld-mset
- :- bet.ms
- (fsub dat.ms (fmul (lift n) (finv (fsub bet.ms f))))
- ::
- :: +union: union multiset ms with multiset ms1
- ++ union
- |= ms1=ld-mset
- ^- ld-mset
- :: randomness has to be the same to perform union
- ?> =(bet.ms bet.ms1)
- :- bet.ms
- (fadd dat.ms dat.ms1)
- --
- ::
- :: $ld-mset-bf: multiset based on the logarithmic derivative
- +$ ld-mset-bf
- $: bet=belt :: beta - random challenge for polynomial
- dat=belt :: data - actual value of multiset to write into trace
- ==
- ::
- ++ init-ld-mset-bf
- |= bet=belt
- ^- ld-mset-bf
- [bet 0]
- ::
- ++ ld-union-bf
- |= msets=(list ld-mset-bf)
- ^- ld-mset-bf
- ?~ msets
- *ld-mset-bf
- =/ bet bet.i.msets
- ?: ?!((levy `(list ld-mset-bf)`msets |=(=ld-mset =(bet.ld-mset bet))))
- !!
- [bet (roll `(list ld-mset-bf)`msets |=([=ld-mset f=belt] (badd f dat.ld-mset)))]
- ::
- :: +ld: door for working with ld-msets
- ++ ld-bf
- ~/ %ld-bf
- |_ ms=ld-mset-bf
- ::
- :: +add: add b to the multiset n times
- ::
- :: dat' = dat + n/(bet - b)
- ++ add
- ~/ %add
- |= [b=belt n=@]
- ^- ld-mset-bf
- :- bet.ms
- (badd dat.ms (bmul n (binv (bsub bet.ms b))))
- :: +add-all: add a list of [belt, multiplicity] pairs to the multiset
- ::
- :: adds them one at a time starting with ms and returns a list of
- :: each intermediate memset in order.
- ++ add-all
- ~/ %add-all
- |= l=(list [b=belt n=@])
- ^- (list ld-mset-bf)
- %+ spun l
- |= [[b=belt n=@] acc=_ms]
- =/ ret (~(add ld acc) b n)
- [ret ret]
- ::
- :: +remove: remove a belt n times
- ++ remove
- |= [b=belt n=@]
- ^- ld-mset-bf
- :- bet.ms
- (bsub dat.ms (bmul n (binv (bsub bet.ms b))))
- ::
- :: +union: union multiset ms with multiset ms1
- ++ union
- |= ms1=ld-mset-bf
- :: randomness has to be the same to perform union
- ?> =(bet.ms bet.ms1)
- :- bet.ms
- (badd dat.ms dat.ms1)
- --
- ::
- :: $ld-mset-pelt: multiset based on the logarithmic derivative
- +$ ld-mset-pelt
- $~ [pzero pzero]
- $: bet=pelt :: beta - random challenge for polynomial
- dat=pelt :: data - actual value of multiset to write into trace
- ==
- ::
- ++ init-ld-mset-pelt
- |= bet=pelt
- ^- ld-mset-pelt
- [bet pzero]
- ::
- ++ ld-pelt-union
- |= msets=(list ld-mset-pelt)
- ^- ld-mset-pelt
- ?~ msets
- *ld-mset-pelt
- =/ bet bet.i.msets
- ?: ?!((levy `(list ld-mset-pelt)`msets |=(=ld-mset-pelt =(bet.ld-mset-pelt bet))))
- !!
- [bet (roll `(list ld-mset-pelt)`msets |=([=ld-mset-pelt p=pelt] (padd p dat.ld-mset-pelt)))]
- ::
- :: +ld: door for working with ld-msets
- ++ ld-pelt
- ~/ %ld-pelt
- |_ ms=ld-mset-pelt
- ::
- :: +add: add f to the multiset n times
- ::
- :: dat' = dat + n/(bet - f)
- ++ add
- ~/ %add
- |= [p=pelt n=@]
- ^- ld-mset-pelt
- :- bet.ms
- (padd dat.ms (pmul (pelt-lift n) (pinv (psub bet.ms p))))
- :: +add-all: add a list of [felt, multiplicity] pairs to the multiset
- ::
- :: adds them one at a time starting with ms and returns a list of
- :: each intermediate memset in order.
- ++ add-all
- ~/ %add-all
- |= l=(list [p=pelt n=@])
- ^- (list ld-mset-pelt)
- %+ spun l
- |= [[p=pelt n=@] acc=_ms]
- =/ ret (~(add ld-pelt acc) p n)
- [ret ret]
- ::
- :: +remove: remove a felt n times
- ++ remove
- |= [p=pelt n=@]
- ^- ld-mset-pelt
- :- bet.ms
- (psub dat.ms (pmul (pelt-lift n) (pinv (psub bet.ms p))))
- ::
- :: +union: union multiset ms with multiset ms1
- ++ union
- |= ms1=ld-mset-pelt
- ^- ld-mset-pelt
- :: randomness has to be the same to perform union
- ?> =(bet.ms bet.ms1)
- :- bet.ms
- (padd dat.ms dat.ms1)
- --
- ::
- :: stack in triplicate
- +$ tri-stack [a=belt-stack b=belt-stack c=belt-stack]
- :: mset in triplicate
- +$ tri-mset [a=ld-mset-bf b=ld-mset-bf c=ld-mset-bf]
- ++ print-tri-mset
- |= [m=tri-mset t=(list belt)]
- ^- (list belt)
- [dat.a.m dat.b.m dat.c.m t]
- ::
- :: door to manipulate tri-stack
- ++ tstack
- |_ s=tri-stack
- ++ push
- |= [a=belt b=belt c=belt]
- ^- tri-stack
- :+ (~(push bstack a.s) a)
- (~(push bstack b.s) b)
- (~(push bstack c.s) c)
- ::
- ++ pop
- |= [a=belt b=belt c=belt]
- ^- tri-stack
- :+ (~(pop bstack a.s) a)
- (~(pop bstack b.s) b)
- (~(pop bstack c.s) c)
- ::
- ++ push-all
- |= xs=(list [belt belt belt])
- ^- tri-stack
- %+ roll xs
- |= [x=[belt belt belt] acc=_s]
- (~(push tstack acc) x)
- ::
- ++ pop-all
- |= xs=(list [belt belt belt])
- ^- tri-stack
- %+ roll xs
- |= [x=[belt belt belt] acc=_s]
- (~(pop tstack acc) x)
- ++ is-empty
- ^- ?
- ~(is-empty bstack a.s)
- --
- ::
- :: door to manipulate mset-state
- ++ tmset
- |_ ms=tri-mset
- ++ add
- |= [b=triple-belt n=@]
- ^- tri-mset
- :+ (~(add ld-bf a.ms) a.b n)
- (~(add ld-bf b.ms) b.b n)
- (~(add ld-bf c.ms) c.b n)
- ::
- ++ add-all
- |= l=(list [b=triple-belt n=@])
- ^- (list tri-mset)
- %+ spun l
- |= [[b=triple-belt n=@] st=_ms]
- =/ ret=tri-mset (~(add tmset st) b n)
- [ret ret]
- ::
- ++ remove
- |= [b=belt n=@]
- ^- tri-mset
- :+ (~(remove ld-bf a.ms) b n)
- (~(remove ld-bf b.ms) b n)
- (~(remove ld-bf c.ms) b n)
- ::
- ++ union
- |= ms1=tri-mset
- :+ (~(union ld-bf a.ms) a.ms1)
- (~(union ld-bf b.ms) b.ms1)
- (~(union ld-bf c.ms) c.ms1)
- --
- ::
- ++ init-tri-stack
- |= [alf-a=belt alf-b=belt alf-c=belt]
- ^- tri-stack
- :+ (init-bstack alf-a)
- (init-bstack alf-b)
- (init-bstack alf-c)
- ::
- ++ init-tri-mset
- |= [bet-a=belt bet-b=belt bet-c=belt]
- ^- tri-mset
- :+ (init-ld-mset-bf bet-a)
- (init-ld-mset-bf bet-b)
- (init-ld-mset-bf bet-c)
- ::
- :: +poly-ld: door handling polynomial constraints for log derivative multiset
- ++ poly-ld
- ~/ %poly-ld
- |_ bet=mp-mega
- ::
- :: +add: add element v with n multiplicity to old muliset and store in new
- ::
- :: add element v with n multiplicity to the old multiset in mold and store in
- :: the new multiset mnew.
- ::
- :: ldc' = ldc + n / (bet - value)
- :: => (bet-value)*ldc' = (bet-value)*ldc + n
- :: => (bet-value)*ldc' - [(bet-value)*ldc) + n] = 0
- ++ add
- ~/ %add
- |= [mold=mp-mega mnew=mp-mega v=mp-mega n=mp-mega]
- ^- mp-mega
- %+ mpsub (mpmul (mpsub bet v) mnew)
- (mpadd n (mpmul (mpsub bet v) mold))
- ::
- ++ add-two
- |= [mold=mp-mega mnew=mp-mega p1=mp-mega p2=mp-mega]
- ^- mp-mega
- %+ mpsub
- :(mpmul mnew (mpsub bet p1) (mpsub bet p2))
- ;: mpadd
- (mpsub bet p1)
- (mpsub bet p2)
- :(mpmul mold (mpsub bet p1) (mpsub bet p2))
- ==
- ::
- ++ remove
- |= [mold=mp-mega mnew=mp-mega v=mp-mega n=mp-mega]
- ^- mp-mega
- %+ mpsub (mpmul (mpsub bet v) mnew)
- (mpsub (mpmul (mpsub bet v) mold) n)
- --
- ::
- :: +poly-ld: door handling polynomial constraints for log derivative multiset
- ++ poly-ld-pelt
- |_ bet=mp-pelt
- ::
- :: +add: add element v with n multiplicity to old muliset and store in new
- ::
- :: add element v with n multiplicity to the old multiset in mold and store in
- :: the new multiset mnew.
- ::
- :: ldc' = ldc + n / (bet - value)
- :: => (bet-value)*ldc' = (bet-value)*ldc + n
- :: => (bet-value)*ldc' - [(bet-value)*ldc) + n] = 0
- ++ add
- ~/ %add
- |= [mold=mp-pelt mnew=mp-pelt v=mp-pelt n=mp-mega]
- ^- mp-pelt
- %+ mpsub-pelt (mpmul-pelt (mpsub-pelt bet v) mnew)
- (mpadd-pelt (lift-to-mp-pelt n) (mpmul-pelt (mpsub-pelt bet v) mold))
- ::
- ++ add-two
- |= [mold=mp-pelt mnew=mp-pelt p1=mp-pelt p2=mp-pelt]
- ^- mp-pelt
- %+ mpsub-pelt
- :(mpmul-pelt mnew (mpsub-pelt bet p1) (mpsub-pelt bet p2))
- ;: mpadd-pelt
- (mpsub-pelt bet p1)
- (mpsub-pelt bet p2)
- :(mpmul-pelt mold (mpsub-pelt bet p1) (mpsub-pelt bet p2))
- ==
- ::
- ++ remove
- |= [mold=mp-pelt mnew=mp-pelt v=mp-pelt n=mp-mega]
- ^- mp-pelt
- %+ mpsub-pelt (mpmul-pelt (mpsub-pelt bet v) mnew)
- (mpsub-pelt (mpmul-pelt (mpsub-pelt bet v) mold) (lift-to-mp-pelt n))
- --
- :: +subtree-ld-utils: door for ld subtrees
- ::
- :: utilities for creating zeroes and tens for the log derivative memory multiset
- ++ subtree-ld-utils
- ~/ %subtree-ld-utils
- |_ cs=(list mp-mega)
- ::
- :: +make-zero: Create a compressed felt of a zero access which can be added to a multiset
- ++ make-zero
- ~/ %make-zero
- |= [noun=mp-mega axis=mp-mega child=mp-mega]
- ^- mp-mega
- (make-ten noun axis child noun child)
- ++ make-ten
- ~/ %make-ten
- |= $: noun=mp-mega
- axis=mp-mega
- child=mp-mega
- new-noun=mp-mega
- new-child=mp-mega
- ==
- ^- mp-mega
- (~(compress poly-tupler cs) ~[noun axis child new-noun new-child])
- --
- ::
- ::
- ++ tuple
- ~/ %tuple
- |_ cs=(list felt)
- ++ compress
- ~/ %compress
- |= fs=(list felt)
- ^- felt
- %^ zip-roll cs fs
- |= [[c=felt f=felt] acc=_(lift 0)]
- (fadd acc (fmul c f))
- --
- ::
- ++ tuple-bf
- ~/ %tuple-bf
- |_ cs=(list belt)
- ++ compress
- ~/ %compress
- |= bs=(list belt)
- ^- belt
- %^ zip-roll cs bs
- |= [[c=belt b=belt] acc=belt]
- (badd acc (bmul c b))
- --
- ::
- +$ triple-belt [a=belt b=belt c=belt]
- ::
- ++ tuple-trip
- ~/ %tuple-trip
- |_ cs=(list triple-belt)
- ++ compress
- ~/ %compress
- |= bs=(list triple-belt)
- ^- triple-belt
- %^ zip-roll cs bs
- |= [[c=triple-belt b=triple-belt] acc=triple-belt]
- :+ (badd a.acc (bmul a.c a.b))
- (badd b.acc (bmul b.c b.b))
- (badd c.acc (bmul c.c c.b))
- --
- ::
- :: utilities for working with polynomial stacks
- ::
- :: +poly-stack: door for working with polynomial stacks
- ++ poly-stack
- ~/ %poly-stack
- |_ [alf=mp-mega alf-inv=mp-mega vars=(map term mp-mega)]
- ++ v
- ~/ %v
- |= nam=term
- ^- mp-mega
- ~+
- ~| var-not-found+nam
- (~(got by vars) nam)
- ++ push
- ~/ %push
- |= [s=mp-mega nam=mp-mega]
- ^- mp-mega
- (mpadd (mpmul alf s) nam)
- ++ push-all
- ~/ %push-all
- |= [s=mp-mega nams=(list mp-mega)]
- ^- mp-mega
- %+ roll nams
- |: [nam=`mp-mega`(mp-c 0) mp=`mp-mega`s]
- (push mp nam)
- ++ pop
- ~/ %pop
- |= [s=mp-mega nam=mp-mega]
- ^- mp-mega
- (mpmul alf-inv (mpsub s nam))
- ++ pop-all
- ~/ %pop-all
- |= [s=mp-mega nams=(list mp-mega)]
- ^- mp-mega
- %+ roll nams
- |: [nam=`mp-mega`(mp-c 0) mp=`mp-mega`s]
- (pop mp nam)
- --
- ::
- ++ poly-tupler
- ~/ %poly-tupler
- |_ cs=(list mp-mega)
- ++ compress
- ~/ %compress
- |= nams=(list mp-mega)
- ^- mp-mega
- %^ zip-roll cs nams
- |= [[c=mp-mega n=mp-mega] acc=_(mp-c 0)]
- (mpadd acc (mpmul c n))
- --
- ::
- ++ poly-tupler-pelt
- ~/ %poly-tupler-pelt
- |_ cs=(list mp-pelt)
- ++ compress
- ~/ %compress
- |= nams=(list mp-pelt)
- ^- mp-pelt
- =/ acc=mp-pelt [(mp-c 0) (mp-c 0) (mp-c 0)]
- %^ zip-roll cs nams
- |= [[c=mp-pelt n=mp-pelt] acc=_acc]
- (mpadd-pelt acc (mpmul-pelt c n))
- --
- :: column name utilities
- ::
- :: +grab: alias for snagging from a row using the var name instead of col index
- ++ grab
- ~/ %grab
- |= [label=term row=fpoly var-indices=(map term @)]
- %- ~(snag fop row)
- (~(got by var-indices) label)
- ::
- ++ grab-bf
- ~/ %grab-bf
- |= [label=term row=bpoly var-indices=(map term @)]
- %- ~(snag bop row)
- (~(got by var-indices) label)
- ::
- :: noun utilities
- ::
- ++ noun-utils
- ~/ %noun-utils
- |_ $: noun-chals=[a=felt b=felt c=felt alf=felt]
- tuple-chals=[p=felt q=felt r=felt s=felt t=felt]
- ==
- ++ build-atom
- ~/ %build-atom
- |= atom=@
- ^- felt
- :: general format: (a * len) + (b * dyck) + (c * leaf)
- :: for atoms: (a * 1) + (b * 0) + (c * <atom>)
- (fadd a.noun-chals (fmul c.noun-chals (lift atom)))
- ::
- ++ make-zero-ld
- ~/ %make-zero-ld
- |= [memset=ld-mset noun=felt axis=@ child=felt num=@]
- ^- ld-mset
- %- ~(add ld memset)
- :_ num
- %- ~(compress tuple [p q r s t ~]:tuple-chals)
- ~[noun (build-atom axis) child noun child]
- ::
- ++ make-zeroes-ld
- ~/ %make-zeroed-ld
- |= [memset=ld-mset zs=(list [noun=felt axis=@ child=felt num=@])]
- ^- (list ld-mset)
- %- ~(add-all ld memset)
- %+ turn zs
- |= [noun=felt axis=@ child=felt num=@]
- :_ num
- %- ~(compress tuple [p q r s t ~]:tuple-chals)
- ~[noun (build-atom axis) child noun child]
- --
- ::
- ::
- ++ noun-poly-utils
- ~/ %noun-poly-utils
- |_ $: noun-chals=[a=mp-mega b=mp-mega c=mp-mega alf=mp-mega]
- vars=(map term mp-mega)
- ==
- ++ v
- ~/ %v
- |= nam=term
- ^- mp-mega
- ~+
- ~| var-not-found+nam
- (~(got by vars) nam)
- ++ build-atom-literal
- ~/ %build-atom-literal
- |= atom=@
- ^- mp-mega
- (mpadd a.noun-chals (mpscal atom c.noun-chals))
- ++ build-atom-reg
- ~/ %build-atom-reg
- |= atom=@tas
- ^- mp-mega
- (mpadd a.noun-chals (mpmul c.noun-chals (v atom)))
- ++ build-atom-poly
- ~/ %build-atom-poly
- |= atom=mp-mega
- ^- mp-mega
- (mpadd a.noun-chals (mpmul c.noun-chals atom))
- --
- ::
- ::
- ::TODO the %tree-utils chapter (and arms formerly in it, such as
- ::+get-subtree-multiset) consists of some of the worst code in
- ::the system. they're used for generating data for the tables, and there's a
- ::lot of duplicated code between the arms that just different enough to make
- ::it a pain to refactor. I suspect that some of this should actually be put
- ::into $fock-return to avoid recalculating the same things between tables (or
- ::even between +build and +extend for the same table). this deserves special
- ::attention and a partial solution shouldn't be thrown in as a "btw" for
- ::another PR. see also the work on $bushes in the PR section of the old zkvm
- ::repo.
- ::
- :: TODO make these arms a door over the randomness
- ::
- :: a, b, c, and alf are random weights from the challenges
- ::
- ::
- ++ build-tree-data
- ~/ %build-tree-data
- |= [t=* alf=pelt]
- ^- tree-data
- ~+
- =/ leaf=(list pelt) (turn (leaf-sequence:shape t) pelt-lift)
- =/ dyck=(list pelt) (turn (dyck:shape t) pelt-lift)
- =/ leaf-pelt=pelt
- dat:(~(push-all pstack (init-pstack alf)) leaf)
- =/ dyck-pelt=pelt
- dat:(~(push-all pstack (init-pstack alf)) dyck)
- =/ len (lent leaf)
- =/ size (ppow alf len)
- :* size
- dyck-pelt
- leaf-pelt
- t
- ==
- -- ::constraint
- --
|