Skip to content

Commit

Permalink
Adding gadget2 for convolution
Browse files Browse the repository at this point in the history
  • Loading branch information
ttyhgo committed Feb 18, 2019
1 parent 233aacb commit 12034de
Show file tree
Hide file tree
Showing 31 changed files with 3,238 additions and 22 deletions.
10 changes: 10 additions & 0 deletions libsnark/gadgetlib2/adapters.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,16 @@ GLA::constraint_t GLA::convert(const Constraint& constraint) const {
convert(rank1_constraint.c()));
}

GLA::constraint2_t GLA::convert(const Constraint& constraint, bool convol) const {
const auto rank1_constraint = dynamic_cast<const Rank1Constraint&>(constraint);
return constraint2_t(convert(rank1_constraint.a()),
convert(rank1_constraint.b()),
convert(rank1_constraint.c()),
convert(rank1_constraint.a2()),
convert(rank1_constraint.b2()),
convert(rank1_constraint.c2()));
}

GLA::constraint_sys_t GLA::convert(const ConstraintSystem& constraint_sys) const {
constraint_sys_t retval;
retval.reserve(constraint_sys.constraintsPtrs_.size());
Expand Down
11 changes: 10 additions & 1 deletion libsnark/gadgetlib2/adapters.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,15 @@ class GadgetLibAdapter {
typedef ::std::pair<sparse_vec_t, Fp_elem_t> linear_combination_t;
typedef ::std::tuple<linear_combination_t,
linear_combination_t,
linear_combination_t> constraint_t;
linear_combination_t
> constraint_t;
typedef ::std::tuple<linear_combination_t,
linear_combination_t,
linear_combination_t,
linear_combination_t,
linear_combination_t,
linear_combination_t
> constraint2_t;
typedef ::std::vector<constraint_t> constraint_sys_t;
typedef ::std::map<variable_index_t, Fp_elem_t> assignment_t;
typedef ::std::pair<constraint_sys_t, assignment_t> protoboard_t;
Expand All @@ -54,6 +62,7 @@ class GadgetLibAdapter {
linear_term_t convert(const LinearTerm& lt) const;
linear_combination_t convert(const LinearCombination& lc) const;
constraint_t convert(const Constraint& constraint) const;
constraint2_t convert(const Constraint& constraint, bool convol) const;
constraint_sys_t convert(const ConstraintSystem& constraint_sys) const;
assignment_t convert(const VariableAssignment& assignment) const;
static void resetVariableIndex(); ///< Resets variable index to 0 to make variable indices deterministic.
Expand Down
18 changes: 17 additions & 1 deletion libsnark/gadgetlib2/constraint.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,11 +64,23 @@ Rank1Constraint::Rank1Constraint(const LinearCombination &a,
const LinearCombination &b,
const LinearCombination &c,
const string& name)
: Constraint(name), a_(a), b_(b), c_(c) {}
: Constraint(name), a_(a), b_(b), c_(c), a2_(), b2_(), c2_() {}

Rank1Constraint::Rank1Constraint(const LinearCombination &a,
const LinearCombination &b,
const LinearCombination &c,
const LinearCombination &a2,
const LinearCombination &b2,
const LinearCombination &c2,
const string& name)
: Constraint(name), a_(a), b_(b), c_(c), a2_(a2), b2_(b2), c2_(c2) {}

LinearCombination Rank1Constraint::a() const {return a_;}
LinearCombination Rank1Constraint::b() const {return b_;}
LinearCombination Rank1Constraint::c() const {return c_;}
LinearCombination Rank1Constraint::a2() const {return a2_;}
LinearCombination Rank1Constraint::b2() const {return b2_;}
LinearCombination Rank1Constraint::c2() const {return c2_;}

bool Rank1Constraint::isSatisfied(const VariableAssignment& assignment,
const PrintOptions& printOnFail) const {
Expand Down Expand Up @@ -183,6 +195,10 @@ void ConstraintSystem::addConstraint(const Rank1Constraint& c) {
constraintsPtrs_.emplace_back(::std::shared_ptr<Constraint>(new Rank1Constraint(c)));
}

void ConstraintSystem::addConstraintConvol(const Rank1Constraint& c) {
constraintsPtrs_.emplace_back(::std::shared_ptr<Constraint>(new Rank1Constraint(c)));
}

void ConstraintSystem::addConstraint(const PolynomialConstraint& c) {
constraintsPtrs_.emplace_back(::std::shared_ptr<Constraint>(new PolynomialConstraint(c)));
}
Expand Down
14 changes: 13 additions & 1 deletion libsnark/gadgetlib2/constraint.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -75,16 +75,27 @@ class Constraint {
/// where x is an assignment of field elements to the variables.
class Rank1Constraint : public Constraint {
private:
LinearCombination a_, b_, c_; // <a,x> * <b,x> = <c,x>
LinearCombination a_, b_, c_, a2_, b2_, c2_; // <a,x> * <b,x> = <c,x>
public:
Rank1Constraint(const LinearCombination& a,
const LinearCombination& b,
const LinearCombination& c,
const ::std::string& name);

Rank1Constraint(const LinearCombination& a,
const LinearCombination& b,
const LinearCombination& c,
const LinearCombination& a2,
const LinearCombination& b2,
const LinearCombination& c2,
const ::std::string& name);

LinearCombination a() const;
LinearCombination b() const;
LinearCombination c() const;
LinearCombination a2() const;
LinearCombination b2() const;
LinearCombination c2() const;

virtual bool isSatisfied(const VariableAssignment& assignment,
const PrintOptions& printOnFail = PrintOptions::NO_DBG_PRINT) const;
Expand Down Expand Up @@ -151,6 +162,7 @@ class ConstraintSystem {
bool isSatisfied(const VariableAssignment& assignment,
const PrintOptions& printOnFail = PrintOptions::NO_DBG_PRINT) const;
void addConstraint(const Rank1Constraint& c);
void addConstraintConvol(const Rank1Constraint& c);
void addConstraint(const PolynomialConstraint& c);
::std::string annotation() const;
Variable::set getUsedVariables() const;
Expand Down
39 changes: 39 additions & 0 deletions libsnark/gadgetlib2/examples/simple_example.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,5 +52,44 @@ r1cs_example<libff::Fr<libff::default_ec_pp> > gen_r1cs_example_from_gadgetlib2_
return r1cs_example<FieldT>(cs, primary_input, auxiliary_input);
}

r1cs_example<libff::Fr<libff::default_ec_pp> > gen_r1cs_convol_example_from_gadgetlib2_protoboard(const size_t size)
{
typedef libff::Fr<libff::default_ec_pp> FieldT;

gadgetlib2::initPublicParamsFromDefaultPp();
// necessary in case a protoboard was built before, libsnark assumes variable indices always
// begin with 0 so we must reset the index before creating constraints which will be used by
// libsnark
gadgetlib2::GadgetLibAdapter::resetVariableIndex();

// create a gadgetlib2 gadget. This part is done by both generator and prover.
auto pb = gadgetlib2::Protoboard::create(gadgetlib2::R1P);
gadgetlib2::VariableArray A(size, "A");
gadgetlib2::VariableArray B(size, "B");
gadgetlib2::Variable result("result");
auto g = gadgetlib2::InnerProduct_Gadget::create(pb, A, B, result);
// create constraints. This part is done by generator.
g->generateConstraints();
// create assignment (witness). This part is done by prover.
for (size_t k = 0; k < size; ++k)
{
pb->val(A[k]) = std::rand() % 2;
pb->val(B[k]) = std::rand() % 2;
}
g->generateWitness();
// translate constraint system to libsnark format.
r1cs_constraint_system<FieldT> cs = get_constraint_convol_system_from_gadgetlib2(*pb);
// translate full variable assignment to libsnark format
const r1cs_variable_assignment<FieldT> full_assignment = get_variable_assignment_from_gadgetlib2(*pb);
// extract primary and auxiliary input
const r1cs_primary_input<FieldT> primary_input(full_assignment.begin(), full_assignment.begin() + cs.num_inputs());
const r1cs_auxiliary_input<FieldT> auxiliary_input(full_assignment.begin() + cs.num_inputs(), full_assignment.end());

assert(cs.is_valid());
assert(cs.is_satisfied(primary_input, auxiliary_input));

return r1cs_example<FieldT>(cs, primary_input, auxiliary_input);
}

} // libsnark

1 change: 1 addition & 0 deletions libsnark/gadgetlib2/examples/simple_example.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
namespace libsnark {

r1cs_example<libff::Fr<libff::default_ec_pp> > gen_r1cs_example_from_gadgetlib2_protoboard(const size_t size);
r1cs_example<libff::Fr<libff::default_ec_pp> > gen_r1cs_convol_example_from_gadgetlib2_protoboard(const size_t size);

} // libsnark

Expand Down
10 changes: 10 additions & 0 deletions libsnark/gadgetlib2/gadget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,16 @@ void R1P_Gadget::addRank1Constraint(const LinearCombination& a,
pb_->addRank1Constraint(a,b,c, name);
}

void R1P_Gadget::addRank1Constraint(const LinearCombination& a,
const LinearCombination& b,
const LinearCombination& c,
const LinearCombination& a2,
const LinearCombination& b2,
const LinearCombination& c2,
const string& name) {
pb_->addRank1Constraint(a,b,c, a2, b2, c2, name);
}

/***********************************/
/*** End of Gadget Interfaces ***/
/***********************************/
Expand Down
8 changes: 8 additions & 0 deletions libsnark/gadgetlib2/gadget.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,14 @@ class R1P_Gadget : virtual public Gadget {
const LinearCombination& b,
const LinearCombination& c,
const ::std::string& name);

virtual void addRank1Constraint(const LinearCombination& a,
const LinearCombination& b,
const LinearCombination& c,
const LinearCombination& a2,
const LinearCombination& b2,
const LinearCombination& c2,
const ::std::string& name);
private:
virtual void init() = 0; // private in order to force programmer to invoke from a Gadget* only
DISALLOW_COPY_AND_ASSIGN(R1P_Gadget);
Expand Down
23 changes: 23 additions & 0 deletions libsnark/gadgetlib2/integration.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,29 @@ r1cs_constraint_system<libff::Fr<libff::default_ec_pp> > get_constraint_system_f
return result;
}

r1cs_constraint_system<libff::Fr<libff::default_ec_pp> > get_constraint_convol_system_from_gadgetlib2(const gadgetlib2::Protoboard &pb)
{
typedef libff::Fr<libff::default_ec_pp> FieldT;
typedef gadgetlib2::GadgetLibAdapter GLA;

r1cs_constraint_system<FieldT> result;
const GLA adapter;

GLA::protoboard_t converted_pb = adapter.convert(pb);
for (const GLA::constraint_t &constr : converted_pb.first)
{
result.constraints.emplace_back(r1cs_constraint<FieldT>(convert_gadgetlib2_linear_combination(std::get<0>(constr)),
convert_gadgetlib2_linear_combination(std::get<1>(constr)),
convert_gadgetlib2_linear_combination(std::get<2>(constr))));
}
//The number of variables is the highest index created.
//TODO: If there are multiple protoboards, or variables not assigned to a protoboard, then getNextFreeIndex() is *not* the number of variables! See also in get_variable_assignment_from_gadgetlib2.
const size_t num_variables = GLA::getNextFreeIndex();
result.primary_input_size = pb.numInputs();
result.auxiliary_input_size = num_variables - pb.numInputs();
return result;
}

r1cs_variable_assignment<libff::Fr<libff::default_ec_pp> > get_variable_assignment_from_gadgetlib2(const gadgetlib2::Protoboard &pb)
{
typedef libff::Fr<libff::default_ec_pp> FieldT;
Expand Down
1 change: 1 addition & 0 deletions libsnark/gadgetlib2/integration.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ namespace libsnark {

r1cs_constraint_system<libff::Fr<libff::default_ec_pp> > get_constraint_system_from_gadgetlib2(const gadgetlib2::Protoboard &pb);
r1cs_variable_assignment<libff::Fr<libff::default_ec_pp> > get_variable_assignment_from_gadgetlib2(const gadgetlib2::Protoboard &pb);
r1cs_constraint_system<libff::Fr<libff::default_ec_pp> > get_constraint_convol_system_from_gadgetlib2(const gadgetlib2::Protoboard &pb);

} // libsnark

Expand Down
10 changes: 10 additions & 0 deletions libsnark/gadgetlib2/protoboard.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,16 @@ void Protoboard::addRank1Constraint(const LinearCombination& a,
constraintSystem_.addConstraint(Rank1Constraint(a,b,c,name));
}

void Protoboard::addRank1Constraint(const LinearCombination& a,
const LinearCombination& b,
const LinearCombination& c,
const LinearCombination& a2,
const LinearCombination& b2,
const LinearCombination& c2,
const ::std::string& name) {
constraintSystem_.addConstraint(Rank1Constraint(a,b,c,a2,b2,c2,name));
}

void Protoboard::addGeneralConstraint(const Polynomial& a,
const Polynomial& b,
const ::std::string& name) {
Expand Down
9 changes: 9 additions & 0 deletions libsnark/gadgetlib2/protoboard.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,15 @@ class Protoboard {
const LinearCombination& b,
const LinearCombination& c,
const ::std::string& name);

void addRank1Constraint(const LinearCombination& a,
const LinearCombination& b,
const LinearCombination& c,
const LinearCombination& a2,
const LinearCombination& b2,
const LinearCombination& c2,
const ::std::string& name);

void addGeneralConstraint(const Polynomial& a,
const Polynomial& b,
const ::std::string& name);
Expand Down
4 changes: 3 additions & 1 deletion libsnark/gadgetlib2/tests/integration_UTEST.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@ TEST(gadgetLib2,Integration) {
using namespace libsnark;

initPublicParamsFromDefaultPp();
const r1cs_example<libff::Fr<default_r1cs_ppzksnark_pp> > example = gen_r1cs_example_from_gadgetlib2_protoboard(100);
//const r1cs_example<libff::Fr<default_r1cs_ppzksnark_pp> > example = gen_r1cs_example_from_gadgetlib2_protoboard(100);
const r1cs_example<libff::Fr<default_r1cs_ppzksnark_pp> > example = gen_r1cs_convol_example_from_gadgetlib2_protoboard(100);

const bool test_serialization = false;

const bool bit = run_r1cs_ppzksnark<default_r1cs_ppzksnark_pp>(example, test_serialization);
Expand Down
Loading

0 comments on commit 12034de

Please sign in to comment.