void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { // Verify input char* inputError = "Expected at least 3 parameters\n N - number of nodes\n from - 1xM vector of indices\n to - 1xM vector of indices\n s - (optional) source node in range (1:N)\n Example: [visit] = lemon_bfs(n, from, to, s);"; if (nrhs < 3 || !mxIsNumeric(prhs[0]) || !mxIsNumeric(prhs[1]) || !mxIsNumeric(prhs[2])) mexErrMsgTxt(inputError); mwSize m = mxGetN(prhs[1]); double* x = mxGetPr(prhs[1]); double* y = mxGetPr(prhs[2]); mwSize n = (mwSize)mxGetScalar(prhs[0]); double s = 0; if (mxGetM(prhs[1]) != 1 || mxGetM(prhs[2]) != 1 || mxGetN(prhs[2]) != m) mexErrMsgTxt(inputError); if (nrhs > 3) { if (!mxIsNumeric(prhs[3])) mexErrMsgTxt(inputError); s = mxGetScalar(prhs[3]); if (s < 1 || s > n) mexErrMsgTxt(inputError); } // Read input SmartDigraph g; g.reserveNode(n); g.reserveArc(m); for (mwIndex i = 0; i < n; i++) g.addNode(); for (mwIndex i = 0; i < m; i++) g.addArc(g.nodeFromId(x[i] - 1), g.nodeFromId(y[i] - 1)); // Do stuff Visitor<SmartDigraph> v; BfsVisit<SmartDigraph, Visitor<SmartDigraph>> bfs(g, v); if (s != 0) bfs.run(g.nodeFromId(s - 1)); else bfs.run(); // Create output if (nlhs > 0) { plhs[0] = mxCreateDoubleMatrix(1, v.list.size(), mxREAL); double *visit = mxGetPr(plhs[0]); for (mwIndex i = 0; i < v.list.size(); i++) visit[i] = g.id(v.list[i]) + 1; } return; }
int main() { int runsNr = 100000; int nodesNr = 100000; int trash; Graph graph ( nodesNr ); double a = .0123; Timer T(true); T.restart(); /* for ( int n = 0 ; n < runsNr ; ++n ) { VertexIterator v , v_end; boost::tie( v , v_end ) = vertices(graph); // for ( int m = 0 ; m < 100000 ; ++m ) graph[*v] = (a *= 4.*(1.-a)); while ( v != v_end ) { // graph[*v] = (a *= 4.*(1.-a)); // get ( boost::vertex_bundle , graph )[*v] = (a *= 4.*(1.-a)); // ((Graph::stored_vertex*)*v)->m_property = (a *= 4.*(1.-a)); // worx w/ list only!! ++v; trash++; } } cout << "Boost Zeit: " << T.realTime() << endl; T.restart(); // for ( int n = 0 ; n < 100 ; ++n ) { // // auto // v = graph.vertex_set().begin(), // v_end = graph.vertex_set().end(); // // while ( v != v_end ) { //// graph[*v] = (a *= 4.*(1.-a)); // ++v; // } // } std::list<double> liste ( nodesNr ); for ( int n = 0 ; n < runsNr ; ++n ) { std::list<double>::iterator l = liste.begin(), l_end = liste.end(); // for ( int m = 0 ; m < 100000 ; ++m ) *l = (a *= 4.*(1.-a)); while ( l != l_end ) { // *l = (a *= 4.*(1.-a)); ++l; trash++; } } cout << "List Zeit: " << T.realTime() << endl; T.restart(); ListGraph myGraph; for (int i = 0; i < nodesNr; i++) myGraph.addNode(); cout << "ListDigraph Generation Zeit: " << T.realTime() << endl; T.restart(); for (int i = 0; i < runsNr; i++){ ListGraph::NodeIt nd( myGraph ); while ( nd != INVALID ) { // trash = myGraph.id( nd ); trash++; ++nd; } } cout << "ListDigraph Zeit: " << T.realTime() << endl; */ T.restart(); SmartDigraph mySmart; for (int i = 0; i < nodesNr; i++) mySmart.addNode(); int trashSmart = 0; cout << "SmartDigraph Generation Zeit: " << T.realTime() << endl; T.restart(); for (int i = 0; i < runsNr; i++) { SmartDigraph::NodeIt ns( mySmart ); while (ns != INVALID) { trash = mySmart.id( ns ) * 4; trashSmart ++; ++ns; } } cout << "SmartDigraph Zeit: " << T.realTime() << endl; cout << "trash: " << trashSmart << " | SmartNodes: " << countNodes( mySmart ) << endl; }