1
0
Fork 0
mirror of synced 2025-09-23 12:18:44 +00:00

invert lhs and rhs in r1cs import to please the R1CS exporter. Replace fold with reduce for more concise output

This commit is contained in:
schaeff 2018-06-13 17:22:20 +02:00
parent 04b624688a
commit 4889989de2
3 changed files with 28 additions and 7 deletions

7
Cargo.lock generated
View file

@ -341,6 +341,11 @@ dependencies = [
"redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "reduce"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "regex"
version = "0.2.11"
@ -571,6 +576,7 @@ dependencies = [
"lazy_static 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
"num 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
"reduce 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
"regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)",
@ -623,6 +629,7 @@ dependencies = [
"checksum rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eba5f8cb59cc50ed56be8880a5c7b496bfd9bd26394e176bc67884094145c2c5"
"checksum redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "c214e91d3ecf43e9a4e41e578973adeb14b474f2bee858742d127af75a0112b1"
"checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76"
"checksum reduce 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5f77b717415291f4d7929a111402316b272c566ae9d4b75a61507dba88ecbd89"
"checksum regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9329abc99e39129fcceabd24cf5d85b4671ef7c29c50e972bc5afe32438ec384"
"checksum regex-syntax 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7d707a4fa2637f2dca2ef9fd02225ec7661fe01a53623c1e6515b6916511f7a7"
"checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5"

View file

@ -13,6 +13,7 @@ nolibsnark = []
libc = "0.2.0"
num = "0.1.36"
lazy_static = "0.1.*"
reduce = "0.1.1"
# cli
clap = "2.26.2"
# serialization and deserialization

View file

@ -4,6 +4,7 @@ use flat_absy::{FlatStatement, FlatExpression, FlatFunction, FlatExpressionList}
use field::Field;
use executable::Sha256Libsnark;
use parameter::Parameter;
use reduce::Reduce;
// for r1cs import, can be moved.
// r1cs data strucutre reflecting JSON standard format:
@ -32,19 +33,31 @@ pub struct Constraint {
impl<T: Field> Into<FlatStatement<T>> for Constraint {
fn into(self: Constraint) -> FlatStatement<T> {
let lhs_a = self.a.iter()
let rhs_a = match self.a.iter()
.map(|(key, val)| FlatExpression::Mult(box FlatExpression::Number(T::from_dec_string(val.to_string())), box FlatExpression::Identifier(format!("inter{}",key.clone()))))
.fold(FlatExpression::Number(T::zero()), |acc, e| FlatExpression::Add(box acc, box e));
.reduce(|acc, e| FlatExpression::Add(box acc, box e)) {
Some(e @ FlatExpression::Mult(..)) => FlatExpression::Add(box FlatExpression::Number(T::zero()), box e), // the R1CS serializer only recognizes Add
Some(e) => e,
None => FlatExpression::Number(T::zero())
};
let lhs_b = self.b.iter()
let rhs_b = match self.b.iter()
.map(|(key, val)| FlatExpression::Mult(box FlatExpression::Number(T::from_dec_string(val.to_string())), box FlatExpression::Identifier(format!("inter{}",key.clone()))))
.fold(FlatExpression::Number(T::zero()), |acc, e| FlatExpression::Add(box acc, box e));
.reduce(|acc, e| FlatExpression::Add(box acc, box e)) {
Some(e @ FlatExpression::Mult(..)) => FlatExpression::Add(box FlatExpression::Number(T::zero()), box e), // the R1CS serializer only recognizes Add
Some(e) => e,
None => FlatExpression::Number(T::zero())
};
let rhs = self.c.iter()
let lhs = match self.c.iter()
.map(|(key, val)| FlatExpression::Mult(box FlatExpression::Number(T::from_dec_string(val.to_string())), box FlatExpression::Identifier(format!("inter{}",key.clone()))))
.fold(FlatExpression::Number(T::zero()), |acc, e| FlatExpression::Add(box acc, box e));
.reduce(|acc, e| FlatExpression::Add(box acc, box e)) {
Some(e @ FlatExpression::Mult(..)) => FlatExpression::Add(box FlatExpression::Number(T::zero()), box e), // the R1CS serializer only recognizes Add
Some(e) => e,
None => FlatExpression::Number(T::zero())
};
FlatStatement::Condition(FlatExpression::Mult(box lhs_a, box lhs_b), rhs)
FlatStatement::Condition(lhs, FlatExpression::Mult(box rhs_a, box rhs_b))
}
}