You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
After tinkering with it a bit, I arrived at the following definition sketch:
dataIVCCircuitapio=forallspsiit.IVCCircuit{ivcStep::NoIVCasp (si:*:it) spsi
, ivcBoot::NoIVCa (p:*:sp) (i:*:si) (o:*:si) (sp:*: (Infinite:.:it))
}dataNoIVCapioq=NoIVC{noSystem:: [Constraintai]
, noRange::Mapa [SysVari] -- no FoldVar's. Better to introduce a separate type
, noWitness::MapByteString (CircuitWitnessapi)
, noOutput::o (Varai)
, noPayload::forallw.isWitnessaw=> (p:*:i) w->qw}
That is, all the folding in the circuit is performed with the ivcStep function. Operations outside of circuit are performed with the ivcBoot functions; this includes both preparation of inputs for the step function as well as post-processing of the results. Thanks to Haskell being lazy, witness computation would not get stuck as long as we preserve witnesses from the original circuit.
Also note that there should be no separate notion of "fold variables" in the end: once we compile to this form, results from folding are fed as input to the ivcBoot.
Functors describing the layout/payload of step function are hidden behind an existential because they cannot be known statically in advance. Most likely we would need some Haskell constraints on them, but I didn't explore it properly yet.
No description provided.
The text was updated successfully, but these errors were encountered: