residualConnectivity::context graphInterface(SEXP graph_sexp, SEXP probabilities_sexp) { //Convert probability std::vector<residualConnectivity::mpfr_class> probabilities; Rcpp::NumericVector probabilities_R; try { probabilities_R = Rcpp::as<Rcpp::NumericVector>(probabilities_sexp); std::transform(probabilities_R.begin(), probabilities_R.end(), std::back_inserter(probabilities), [](double x){return residualConnectivity::mpfr_class(x); }); } catch(Rcpp::not_compatible&) { throw std::runtime_error("Unable to convert input probability to a number"); } boost::shared_ptr<residualConnectivity::context::inputGraph> boostGraph(new residualConnectivity::context::inputGraph()); boost::shared_ptr<std::vector<residualConnectivity::context::vertexPosition> > vertexCoordinates(new std::vector<residualConnectivity::context::vertexPosition>()); graphConvert(graph_sexp, *boostGraph.get(), *vertexCoordinates.get()); std::size_t nVertices = boost::num_vertices(*boostGraph); if(probabilities.size() != nVertices && probabilities.size() != 1) { throw std::runtime_error("Input probabilities must contain a single value, or a value for each vertex"); } //Construct default vertex ordering boost::shared_ptr<std::vector<int> > defaultOrdering(new std::vector<int>()); std::vector<int>& defaultOrderingRef = *defaultOrdering; for(std::size_t i = 0; i < nVertices; i++) { defaultOrderingRef.push_back((int)i); } residualConnectivity::context contextObj(boostGraph, defaultOrdering, vertexCoordinates, probabilities); return contextObj; }
Vector RectilinearGrid::getVertex(Index v) const { auto n = vertexCoordinates(v, m_numDivisions); return Vector(m_coords[0][n[0]], m_coords[1][n[1]], m_coords[2][n[2]]); }
Vector UniformGrid::getVertex(Index v) const { auto n = vertexCoordinates(v, m_numDivisions); return Vector(m_min[0]+n[0]*m_dist[0], m_min[1]+n[1]*m_dist[1], m_min[2]+n[2]*m_dist[2]); }