/// Solve w/ the specified RHS and estimate (result in x) void p_solveImpl(MatrixType& A, const VectorType& b, VectorType& x) const { PetscErrorCode ierr(0); try { Mat *Amat(PETScMatrix(A)); if (p_matrixSet && this->p_constSerialMatrix) { // KSPSetOperators can be skipped } else { #if PETSC_VERSION_LT(3,5,0) ierr = KSPSetOperators(p_KSP, *Amat, *Amat, SAME_NONZERO_PATTERN); CHKERRXX(ierr); #else ierr = KSPSetOperators(p_KSP, *Amat, *Amat); CHKERRXX(ierr); #endif p_matrixSet = true; } this->p_resolveImpl(b, x); } catch (const PETSC_EXCEPTION_TYPE& e) { throw PETScException(ierr, e); } catch (const Exception& e) { throw e; } }
void OCCSurface :: DefineTangentialPlane (const Point<3> & ap1, const PointGeomInfo & geominfo1, const Point<3> & ap2, const PointGeomInfo & geominfo2) { if (projecttype == PLANESPACE) { p1 = ap1; p2 = ap2; //cout << "p1 = " << p1 << endl; //cout << "p2 = " << p2 << endl; GetNormalVector (p1, geominfo1, ez); ex = p2 - p1; ex -= (ex * ez) * ez; ex.Normalize(); ey = Cross (ez, ex); GetNormalVector (p2, geominfo2, n2); nmid = 0.5*(n2+ez); ez = nmid; ez.Normalize(); ex = (p2 - p1).Normalize(); ez -= (ez * ex) * ex; ez.Normalize(); ey = Cross (ez, ex); nmid = ez; //cout << "ex " << ex << " ey " << ey << " ez " << ez << endl; } else { if ( (geominfo1.u < umin) || (geominfo1.u > umax) || (geominfo2.u < umin) || (geominfo2.u > umax) || (geominfo1.v < vmin) || (geominfo1.v > vmax) || (geominfo2.v < vmin) || (geominfo2.v > vmax) ) throw UVBoundsException(); p1 = ap1; p2 = ap2; psp1 = Point<2>(geominfo1.u, geominfo1.v); psp2 = Point<2>(geominfo2.u, geominfo2.v); Vec<3> n; GetNormalVector (p1, geominfo1, n); gp_Pnt pnt; gp_Vec du, dv; occface->D1 (geominfo1.u, geominfo1.v, pnt, du, dv); DenseMatrix D1(3,2), D1T(2,3), DDTinv(2,2); D1(0,0) = du.X(); D1(1,0) = du.Y(); D1(2,0) = du.Z(); D1(0,1) = dv.X(); D1(1,1) = dv.Y(); D1(2,1) = dv.Z(); /* (*testout) << "DefineTangentialPlane" << endl << "---------------------" << endl; (*testout) << "D1 = " << endl << D1 << endl; */ Transpose (D1, D1T); DenseMatrix D1TD1(3,3); D1TD1 = D1T*D1; if (D1TD1.Det() == 0) throw SingularMatrixException(); CalcInverse (D1TD1, DDTinv); DenseMatrix Y(3,2); Vec<3> y1 = (ap2-ap1).Normalize(); Vec<3> y2 = Cross(n, y1).Normalize(); for (int i = 0; i < 3; i++) { Y(i,0) = y1(i); Y(i,1) = y2(i); } DenseMatrix A(2,2); A = DDTinv * D1T * Y; DenseMatrix Ainv(2,2); if (A.Det() == 0) throw SingularMatrixException(); CalcInverse (A, Ainv); for (int i = 0; i < 2; i++) for (int j = 0; j < 2; j++) { Amat(i,j) = A(i,j); Amatinv(i,j) = Ainv(i,j); } Vec<2> temp = Amatinv * (psp2-psp1); double r = temp.Length(); // double alpha = -acos (temp(0)/r); double alpha = -atan2 (temp(1),temp(0)); DenseMatrix R(2,2); R(0,0) = cos (alpha); R(1,0) = -sin (alpha); R(0,1) = sin (alpha); R(1,1) = cos (alpha); A = A*R; if (A.Det() == 0) throw SingularMatrixException(); CalcInverse (A, Ainv); for (int i = 0; i < 2; i++) for (int j = 0; j < 2; j++) { Amat(i,j) = A(i,j); Amatinv(i,j) = Ainv(i,j); } temp = Amatinv * (psp2-psp1); }; }
void run_setup(int num_constraints, int num_inputs, int num_outputs, int num_vars, mpz_t p, string vkey_file, string pkey_file, string unprocessed_vkey_file) { std::ifstream Amat("./bin/" + std::string(NAME) + ".qap.matrix_a"); std::ifstream Bmat("./bin/" + std::string(NAME) + ".qap.matrix_b"); std::ifstream Cmat("./bin/" + std::string(NAME) + ".qap.matrix_c"); libsnark::default_r1cs_gg_ppzksnark_pp::init_public_params(); libsnark::r1cs_constraint_system<FieldT> q; int Ai, Aj, Bi, Bj, Ci, Cj; mpz_t Acoef, Bcoef, Ccoef; mpz_init(Acoef); mpz_init(Bcoef); mpz_init(Ccoef); Amat >> Ai; Amat >> Aj; Amat >> Acoef; if (mpz_cmpabs(Acoef, p) > 0) { gmp_printf("WARNING: Coefficient larger than prime (%Zd > %Zd).\n", Acoef, p); mpz_mod(Acoef, Acoef, p); } if (mpz_sgn(Acoef) == -1) { mpz_add(Acoef, p, Acoef); } // std::cout << Ai << " " << Aj << " " << Acoef << std::std::endl; Bmat >> Bi; Bmat >> Bj; Bmat >> Bcoef; if (mpz_cmpabs(Bcoef, p) > 0) { gmp_printf("WARNING: Coefficient larger than prime (%Zd > %Zd).\n", Bcoef, p); mpz_mod(Bcoef, Bcoef, p); } if (mpz_sgn(Bcoef) == -1) { mpz_add(Bcoef, p, Bcoef); } Cmat >> Ci; Cmat >> Cj; Cmat >> Ccoef; if (mpz_cmpabs(Ccoef, p) > 0) { gmp_printf("WARNING: Coefficient larger than prime (%Zd > %Zd).\n", Ccoef, p); mpz_mod(Ccoef, Ccoef, p); } if (mpz_sgn(Ccoef) == -1) { mpz_mul_si(Ccoef, Ccoef, -1); } else if(mpz_sgn(Ccoef) == 1) { mpz_mul_si(Ccoef, Ccoef, -1); mpz_add(Ccoef, p, Ccoef); } int num_intermediate_vars = num_vars; int num_inputs_outputs = num_inputs + num_outputs; q.primary_input_size = num_inputs_outputs; q.auxiliary_input_size = num_intermediate_vars; for (int currentconstraint = 1; currentconstraint <= num_constraints; currentconstraint++) { libsnark::linear_combination<FieldT> A, B, C; while(Aj == currentconstraint && Amat) { if (Ai <= num_intermediate_vars && Ai != 0) { Ai += num_inputs_outputs; } else if (Ai > num_intermediate_vars) { Ai -= num_intermediate_vars; } FieldT AcoefT(Acoef); A.add_term(Ai, AcoefT); if(!Amat) { break; } Amat >> Ai; Amat >> Aj; Amat >> Acoef; if (mpz_cmpabs(Acoef, p) > 0) { gmp_printf("WARNING: Coefficient larger than prime (%Zd > %Zd).\n", Acoef, p); mpz_mod(Acoef, Acoef, p); } if (mpz_sgn(Acoef) == -1) { mpz_add(Acoef, p, Acoef); } } while(Bj == currentconstraint && Bmat) { if (Bi <= num_intermediate_vars && Bi != 0) { Bi += num_inputs_outputs; } else if (Bi > num_intermediate_vars) { Bi -= num_intermediate_vars; } // std::cout << Bi << " " << Bj << " " << Bcoef << std::std::endl; FieldT BcoefT(Bcoef); B.add_term(Bi, BcoefT); if (!Bmat) { break; } Bmat >> Bi; Bmat >> Bj; Bmat >> Bcoef; if (mpz_cmpabs(Bcoef, p) > 0) { gmp_printf("WARNING: Coefficient larger than prime (%Zd > %Zd).\n", Bcoef, p); mpz_mod(Bcoef, Bcoef, p); } if (mpz_sgn(Bcoef) == -1) { mpz_add(Bcoef, p, Bcoef); } } while(Cj == currentconstraint && Cmat) { if (Ci <= num_intermediate_vars && Ci != 0) { Ci += num_inputs_outputs; } else if (Ci > num_intermediate_vars) { Ci -= num_intermediate_vars; } //Libsnark constraints are A*B = C, vs. A*B - C = 0 for Zaatar. //Which is why the C coefficient is negated. // std::cout << Ci << " " << Cj << " " << Ccoef << std::std::endl; FieldT CcoefT(Ccoef); C.add_term(Ci, CcoefT); if (!Cmat) { break; } Cmat >> Ci; Cmat >> Cj; Cmat >> Ccoef; if (mpz_cmpabs(Ccoef, p) > 0) { gmp_printf("WARNING: Coefficient larger than prime (%Zd > %Zd).\n", Ccoef, p); mpz_mod(Ccoef, Ccoef, p); } if (mpz_sgn(Ccoef) == -1) { mpz_mul_si(Ccoef, Ccoef, -1); } else if (mpz_sgn(Ccoef) == 1) { mpz_mul_si(Ccoef, Ccoef, -1); mpz_add(Ccoef, p, Ccoef); } } q.add_constraint(libsnark::r1cs_constraint<FieldT>(A, B, C)); //dump_constraint(r1cs_constraint<FieldT>(A, B, C), va, variable_annotations); } Amat.close(); Bmat.close(); Cmat.close(); libff::start_profiling(); libsnark::r1cs_gg_ppzksnark_keypair<libsnark::default_r1cs_gg_ppzksnark_pp> keypair = libsnark::r1cs_gg_ppzksnark_generator<libsnark::default_r1cs_gg_ppzksnark_pp>(q); libsnark::r1cs_gg_ppzksnark_processed_verification_key<libsnark::default_r1cs_gg_ppzksnark_pp> pvk = libsnark::r1cs_gg_ppzksnark_verifier_process_vk<libsnark::default_r1cs_gg_ppzksnark_pp>(keypair.vk); std::ofstream vkey(vkey_file); std::ofstream pkey(pkey_file); vkey << pvk; pkey << keypair.pk; pkey.close(); vkey.close(); if (unprocessed_vkey_file.length() > 0) { std::ofstream unprocessed_vkey(unprocessed_vkey_file); unprocessed_vkey << keypair.vk; unprocessed_vkey.close(); } }