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; }
std::shared_ptr<BoostAdjacencyList::BoostGraph> BoostAdjacencyList::GetBoostGraph() { BoostGraphData graph(&edges_[0], &edges_[0] + edges_.size(), &weights_[0], numVertices_); IndexMap index = get(boost::vertex_index, graph); std::shared_ptr<BoostGraph> boostGraph(new BoostGraph()); boostGraph->numVertices = numVertices_; boostGraph->graph = graph; boostGraph->index = index; return boostGraph; }