main() { int uid, i; FILE *fd; char *myname, fname[128]; uid = getuid(); myname = (char *) getlogin(); if(myname == NULL) myname = getpwuid(uid)->pw_name; sprintf(fname, "%s/%s.key", maildir, myname); comminit(); setup(getpass("Gimme key: ")); mkb(); mkx(); #ifdef debug omout(b); omout(x); #endif mka(); i = creat(fname, 0644); if(i<0) { perror(fname); exit(1); } close(i); fd = fopen(fname, "w"); for(i=0; i<42; i++) nout(a[i], fd); exit(0); }
int Compute(const Circuit& c, byte *out, int outcount, const byte *in, int incount, int limit = 100) { byte value[COUNT]; memset(value, 0, COUNT); int w = 0; for(int i = 0; i < incount; i++) for(int q = 0x80; q; q >>= 1) value[w++] = !!(q & in[i]); memset(out, 0, outcount); for(int ii = 0; ii < limit; ii++) { c.Evaluate(value); Buffer<byte> nout(outcount, 0); int r = w; for(int i = 0; i < outcount; i++) { nout[i] = 0; for(int q = 0x80; q; q >>= 1) if(value[r++]) nout[i] |= q; } if(memcmp(out, ~nout, outcount) == 0) return ii; memcpy(out, ~nout, outcount); } return limit; }
void Split::generate(CodeGenerator& g, const std::string& mem, const std::vector<int>& arg, const std::vector<int>& res) const { int nx = nout(); for (int i=0; i<nx; ++i) { int nz_first = offset_[i]; int nz_last = offset_[i+1]; int nz = nz_last-nz_first; if (res[i]>=0 && nz>0) { // if anything to assign if (nz==1) { // assign scalar g.body << " " << g.workel(res[i]) << " = "; if (dep(0).nnz()==1) { // rhs is also scalar casadi_assert(nz_first==0); g.body << g.workel(arg[0]) << ";" << endl; } else { // rhs is an element in a vector g.body << g.work(arg[0], dep(0).nnz()) << "[" << nz_first << "];" << endl; } } else { // assign vector std::string r = g.work(arg[0], dep(0).nnz()); if (nz_first!=0) r = r + "+" + g.to_string(nz_first); g.body << " " << g.copy(r, nz, g.work(res[i], nnz(i))) << endl; } } } }
void Call::evalFwd(const vector<vector<MX> >& fseed, vector<vector<MX> >& fsens) { // Nondifferentiated inputs and outputs vector<MX> arg(ndep()); for (int i=0; i<arg.size(); ++i) arg[i] = dep(i); vector<MX> res(nout()); for (int i=0; i<res.size(); ++i) res[i] = getOutput(i); // Call the cached functions fcn_.forward(arg, res, fseed, fsens); }
void Split::generate(std::ostream &stream, const std::vector<int>& arg, const std::vector<int>& res, CodeGenerator& gen) const { int nx = nout(); for (int i=0; i<nx; ++i) { int nz_first = offset_[i]; int nz_last = offset_[i+1]; int nz = nz_last-nz_first; if (res[i]>=0) { stream << " for (i=0, rr=" << gen.work(res[i]) << ", " << "cr=" << gen.work(arg[0]+nz_first) << "; i<" << nz << "; ++i) " << "*rr++ = *cr++;" << endl; } } }
MX Diagsplit::get_diagcat(const std::vector<MX>& x) const { // Check x length if (x.size()!=nout()) { return MXNode::get_diagcat(x); } // Check x content for (int i=0; i<x.size(); ++i) { if (!(x[i]->isOutputNode() && x[i]->getFunctionOutput()==i && x[i]->dep().get()==this)) { return MXNode::get_diagcat(x); } } // OK if reached this point return dep(); }
void Call::evalAdj(const vector<vector<MX> >& aseed, vector<vector<MX> >& asens) { // Nondifferentiated inputs and outputs vector<MX> arg(ndep()); for (int i=0; i<arg.size(); ++i) arg[i] = dep(i); vector<MX> res(nout()); for (int i=0; i<res.size(); ++i) res[i] = getOutput(i); // Call the cached functions vector<vector<MX> > v; fcn_.reverse(arg, res, aseed, v); for (int i=0; i<v.size(); ++i) { for (int j=0; j<v[i].size(); ++j) { if (!v[i][j].is_empty()) { // TODO(@jaeandersson): Hack asens[i][j] += v[i][j]; } } } }
/* * mexFunction(): entry point for the mex function */ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { // interface to deal with input arguments from Matlab enum InputIndexType {IN_TRI, IN_X, IN_METHOD, IN_ITER, InputIndexType_MAX}; MatlabImportFilter::Pointer matlabImport = MatlabImportFilter::New(); matlabImport->ConnectToMatlabFunctionInput(nrhs, prhs); // check that we have all input arguments matlabImport->CheckNumberOfArguments(2, InputIndexType_MAX); // register the inputs for this function at the import filter MatlabInputPointer inTRI = matlabImport->RegisterInput(IN_TRI, "TRI"); MatlabInputPointer inX = matlabImport->RegisterInput(IN_X, "X"); MatlabInputPointer inMETHOD = matlabImport->RegisterInput(IN_METHOD, "METHOD"); MatlabInputPointer inITER = matlabImport->RegisterInput(IN_ITER, "ITER"); // interface to deal with outputs to Matlab enum OutputIndexType {OUT_TRI, OUT_N, OutputIndexType_MAX}; MatlabExportFilter::Pointer matlabExport = MatlabExportFilter::New(); matlabExport->ConnectToMatlabFunctionOutput(nlhs, plhs); // check number of outputs the user is asking for matlabExport->CheckNumberOfArguments(0, OutputIndexType_MAX); // register the outputs for this function at the export filter typedef MatlabExportFilter::MatlabOutputPointer MatlabOutputPointer; MatlabOutputPointer outTRI = matlabExport->RegisterOutput(OUT_TRI, "TRI"); MatlabOutputPointer outN = matlabExport->RegisterOutput(OUT_N, "N"); // if any of the inputs is empty, the output is empty too if (mxIsEmpty(prhs[IN_TRI]) || mxIsEmpty(prhs[IN_X])) { matlabExport->CopyEmptyArrayToMatlab(outTRI); matlabExport->CopyEmptyArrayToMatlab(outN); return; } // polyhedron to contain the input mesh Polyhedron mesh; PolyhedronBuilder<Polyhedron> builder(matlabImport, inTRI, inX); mesh.delegate(builder); // get size of input matrix with the points mwSize nrowsTri = mxGetM(inTRI->pm); mwSize nrowsX = mxGetM(inX->pm); #ifdef DEBUG std::cout << "Number of facets read = " << mesh.size_of_facets() << std::endl; std::cout << "Number of vertices read = " << mesh.size_of_vertices() << std::endl; #endif if (nrowsTri != mesh.size_of_facets()) { mexErrMsgTxt(("Input " + inTRI->name + ": Number of triangles read into mesh different from triangles provided at the input").c_str()); } if (nrowsX != mesh.size_of_vertices()) { mexErrMsgTxt(("Input " + inX->name + ": Number of vertices read into mesh different from vertices provided at the input").c_str()); } // sort halfedges such that the non-border edges precede the // border edges. We need to do this before any halfedge iterator // operations are valid mesh.normalize_border(); #ifdef DEBUG std::cout << "Number of border halfedges = " << mesh.size_of_border_halfedges() << std::endl; #endif // number of holes we have filled mwIndex n = 0; // a closed mesh with no holes will have no border edges. What we do // is grab a border halfedge and close the associated hole. This // makes the rest of the iterators invalid, so we have to normalize // the mesh again. Then we iterate, looking for a new border // halfedge, filling the hole, etc. // // Note that confusingly, mesh.border_halfedges_begin() gives a // pointer to the halfedge that is NOT a border in a border // edge. The border halfedge is instead // mesh.border_halfedges_begin()->opposite() while (!mesh.is_closed()) { // exit if user pressed Ctrl+C ctrlcCheckPoint(__FILE__, __LINE__); // get the first hole we can find, and close it mesh.fill_hole(mesh.border_halfedges_begin()->opposite()); // increase the counter of number of holes we have filled n++; // renormalize mesh so that halfedge iterators are again valid mesh.normalize_border(); } // split all facets to triangles CGAL::triangulate_polyhedron<Polyhedron>(mesh); // copy output with number of holes filled std::vector<double> nout(1, n); matlabExport->CopyVectorOfScalarsToMatlab<double, std::vector<double> >(outN, nout, 1); // allocate memory for Matlab outputs double *tri = matlabExport->AllocateMatrixInMatlab<double>(outTRI, mesh.size_of_facets(), 3); // extract the triangles of the solution // snippet adapted from CgalMeshSegmentation.cpp // vertices coordinates. Assign indices to the vertices by defining // a map between their handles and the index std::map<Vertex_handle, int> V; int inum = 0; for(Vertex_iterator vit = mesh.vertices_begin(); vit != mesh.vertices_end(); ++vit) { // save to internal list of vertices V[vit] = inum++; } // triangles given as (i,j,k), where each index corresponds to a vertex in x mwIndex row = 0; for (Facet_iterator fit = mesh.facets_begin(); fit != mesh.facets_end(); ++fit, ++row) { if (fit->facet_degree() != 3) { std::cerr << "Facet has " << fit->facet_degree() << " edges" << std::endl; mexErrMsgTxt("Facet does not have 3 edges"); } // go around the half-edges of the facet, to extract the vertices Halfedge_around_facet_circulator heit = fit->facet_begin(); int idx = 0; do { // extract triangle indices and save to Matlab output // note that Matlab indices go like 1, 2, 3..., while C++ indices go like 0, 1, 2... tri[row + idx * mesh.size_of_facets()] = 1 + V[heit->vertex()]; idx++; } while (++heit != fit->facet_begin()); } }
/** \brief Get required length of res field */ virtual size_t sz_res() const { return nout();}