-
Notifications
You must be signed in to change notification settings - Fork 145
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add TestLessThanOrEqual match case + start implementing EvalCircuit Hint
- Loading branch information
1 parent
5f8a011
commit 7a5998b
Showing
4 changed files
with
158 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
use core::circuit::{ | ||
RangeCheck96, AddMod, MulMod, u96, CircuitElement, CircuitInput, circuit_add, | ||
circuit_sub, circuit_mul, circuit_inverse, EvalCircuitTrait, u384, | ||
CircuitOutputsTrait, CircuitModulus, AddInputResultTrait, CircuitInputs, | ||
}; | ||
|
||
fn main() -> u384 { | ||
let in1 = CircuitElement::<CircuitInput<0>> {}; | ||
let in2 = CircuitElement::<CircuitInput<1>> {}; | ||
let add1 = circuit_add(in1, in2); | ||
let mul1 = circuit_mul(add1, in1); | ||
let mul2 = circuit_mul(mul1, add1); | ||
let inv1 = circuit_inverse(mul2); | ||
let sub1 = circuit_sub(inv1, in2); | ||
let sub2 = circuit_sub(sub1, mul2); | ||
let inv2 = circuit_inverse(sub2); | ||
let add2 = circuit_add(inv2, inv2); | ||
|
||
let modulus = TryInto::<_, CircuitModulus>::try_into([17, 14, 14, 14]).unwrap(); | ||
|
||
let outputs = (add2,) | ||
.new_inputs() | ||
.next([9, 2, 9, 3]) | ||
.next([5, 7, 0, 8]) | ||
.done() | ||
.eval(modulus) | ||
.unwrap(); | ||
|
||
outputs.get_output(add2) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
use ark_ff::Zero; | ||
use num_bigint::BigUint; | ||
|
||
use crate::{types::relocatable::{MaybeRelocatable, Relocatable}, vm::vm_core::VirtualMachine}; | ||
|
||
// Represents the number of limbs use to represent a single value in a circuit | ||
const LIMBS_COUNT: usize = 4; | ||
|
||
struct CircuitInstance<'a> { | ||
vm: &'a mut VirtualMachine, | ||
values_ptr: Relocatable, | ||
add_mod_offsets: Relocatable, | ||
mul_mod_offsets: Relocatable, | ||
modulus: BigUint, | ||
} | ||
|
||
impl CircuitInstance<'_> { | ||
fn fill_add_gate(&mut self, index: usize) -> bool {todo!()} | ||
fn fill_mul_gate(&mut self, index: usize) -> bool {todo!()} | ||
} | ||
|
||
fn read_circuit_value(vm: &mut VirtualMachine, add: Relocatable) -> Option<BigUint> { | ||
let mut res = BigUint::zero(); | ||
|
||
for l in (0..LIMBS_COUNT).rev() { | ||
let add_l = (add + l).unwrap(); | ||
match vm.get_maybe(&add_l) { | ||
Some(MaybeRelocatable::Int(limb)) => res = (res << 96) + limb.to_biguint(), | ||
_ => return None | ||
} | ||
} | ||
|
||
Some(res) | ||
} | ||
|
||
pub fn fill_values( | ||
vm: &mut VirtualMachine, | ||
values_ptr: Relocatable, | ||
add_mod_offsets: Relocatable, | ||
n_add_mods: usize, | ||
mul_mod_offsets: Relocatable, | ||
n_mul_mods: usize, | ||
modulus_ptr: Relocatable, | ||
) -> usize { | ||
let modulus = read_circuit_value(vm, modulus_ptr).unwrap(); | ||
let circuit = CircuitInstance {vm, values_ptr, add_mod_offsets, mul_mod_offsets, modulus}; | ||
|
||
let mut addmod_idx = 0; | ||
let mut mulmod_idx = 0; | ||
|
||
// A circuit evaluation can only fail through a mulmod operation | ||
let mut first_failure_idx = n_mul_mods; | ||
|
||
loop { | ||
while addmod_idx < n_add_mods { | ||
if !circuit.fill_add_gate() { | ||
break; | ||
} | ||
addmod_idx += 1; | ||
} | ||
|
||
if mulmod_idx == n_mul_mods { | ||
break; | ||
} | ||
|
||
if !circuit.fill_mul_gate(3 * mulmod_idx) && first_failure_idx == n_mul_mods { | ||
first_failure_idx = mulmod_idx; | ||
} | ||
mulmod_idx += 1; | ||
} | ||
0 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,4 @@ | ||
pub mod circuit; | ||
pub mod dict_manager; | ||
pub mod hint_processor; | ||
pub mod hint_processor_utils; |