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; }
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { // Verify input char* inputError = "Expected at least 4 parameters\n N - number of nodes\n from - 1xM vector of indices\n to - 1xM vector of indices\n cap - 1xM vector of capacities\n s - (optional) source node in range (1:N)\n Example: [value, cut] = lemon_haoorlin(n, from, to, cap);"; if (nrhs < 4 || !mxIsNumeric(prhs[0]) || !mxIsNumeric(prhs[1]) || !mxIsNumeric(prhs[2]) || !mxIsNumeric(prhs[3])) mexErrMsgTxt(inputError); mwSize m = mxGetN(prhs[1]); double* x = mxGetPr(prhs[1]); double* y = mxGetPr(prhs[2]); double* c = mxGetPr(prhs[3]); mwSize n = (mwSize)mxGetScalar(prhs[0]); double s = 0; if (mxGetM(prhs[1]) != 1 || mxGetM(prhs[2]) != 1 || mxGetM(prhs[3]) != 1 || mxGetN(prhs[2]) != m || mxGetN(prhs[3]) != m) mexErrMsgTxt(inputError); if (nrhs > 4) { if (!mxIsNumeric(prhs[4])) mexErrMsgTxt(inputError); s = mxGetScalar(prhs[4]); if (s < 1 || s > n) mexErrMsgTxt(inputError); } // Read input SmartDigraph g; g.reserveNode(n); g.reserveArc(m); typedef SmartDigraph::ArcMap<double> ArcMap; typedef SmartDigraph::NodeMap<double> NodeMap; ArcMap cap(g); for (mwIndex i = 0; i < n; i++) g.addNode(); for (mwIndex i = 0; i < m; i++) { SmartDigraph::Arc arc = g.addArc(g.nodeFromId(x[i] - 1), g.nodeFromId(y[i] - 1)); cap[arc] = c[i]; } // Do stuff HaoOrlin<SmartDigraph, ArcMap> haoorlin(g, cap); if (s != 0) haoorlin.run(g.nodeFromId(s - 1)); else haoorlin.run(); // Create output if (nlhs > 0) { plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL); double *value = mxGetPr(plhs[0]); value[0] = haoorlin.minCutValue(); } if (nlhs > 1) { NodeMap cutMap(g); haoorlin.minCutMap(cutMap); plhs[1] = mxCreateLogicalMatrix(1, n); bool *cut = mxGetLogicals(plhs[1]); for (mwIndex i = 0; i < n; i++) cut[i] = cutMap[g.nodeFromId(i)]; } return; }
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { // Verify input char* inputError = "Expected at least 3 parameter\n N - number of nodes\n from - 1xN vector of indices\n to - 1xM vector of indices\n cost - (optional) 1xM vector of edge costs (default: 1)\n lower - (optional) 1xM vector of flow lower bound (default: 0)\n upper - (optional) 1xM vector of flow upper bound (default: INF)\n supply - (optional) 1xN vector of node supply (default: 0)\n Example: [value, flow, pot] = lemon_networksimplex(n, from, to, 'cost', cost, 'lower', lower, 'supply', supply);"; if (nrhs < 3 || nrhs % 2 == 0 || !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]); if (mxGetM(prhs[1]) != 1 || mxGetM(prhs[2]) != 1 || mxGetN(prhs[2]) != m) mexErrMsgTxt(inputError); double *c = NULL, *l = NULL, *u = NULL, *s = NULL; for (int i = 3; i < nrhs; i += 2) { mwSize len = mxGetN(prhs[i]) + 1; char* str = (char*) mxCalloc(len, sizeof(char)); mxGetString(prhs[i], str, len); if (strcmp(str, "cost") == 0) { if (!mxIsNumeric(prhs[i + 1]) || mxGetM(prhs[i + 1]) != 1 || mxGetN(prhs[i + 1]) != m) mexErrMsgTxt(inputError); c = mxGetPr(prhs[i + 1]); } else if (strcmp(str, "lower") == 0) { if (!mxIsNumeric(prhs[i + 1]) || mxGetM(prhs[i + 1]) != 1 || mxGetN(prhs[i + 1]) != m) mexErrMsgTxt(inputError); l = mxGetPr(prhs[i + 1]); } else if (strcmp(str, "upper") == 0) { if (!mxIsNumeric(prhs[i + 1]) || mxGetM(prhs[i + 1]) != 1 || mxGetN(prhs[i + 1]) != m) mexErrMsgTxt(inputError); u = mxGetPr(prhs[i + 1]); } else if (strcmp(str, "supply") == 0) { if (!mxIsNumeric(prhs[i + 1]) || mxGetM(prhs[i + 1]) != 1 || mxGetN(prhs[i + 1]) != n) mexErrMsgTxt(inputError); s = mxGetPr(prhs[i + 1]); } else mexErrMsgTxt(inputError); } // Read input SmartDigraph g; g.reserveNode(n); g.reserveArc(m); typedef SmartDigraph::ArcMap<double> ArcMap; typedef SmartDigraph::NodeMap<double> NodeMap; ArcMap lower(g); ArcMap upper(g); ArcMap cost(g); NodeMap supply(g); for (mwIndex i = 0; i < n; i++) { SmartDigraph::Node node = g.addNode(); if (s) supply[node] = s[i]; } for (mwIndex i = 0; i < m; i++) { SmartDigraph::Arc arc = g.addArc(g.nodeFromId(x[i] - 1), g.nodeFromId(y[i] - 1)); if (c) cost[arc] = c[i]; if (l) lower[arc] = l[i]; if (u) upper[arc] = u[i]; } // Do stuff NetworkSimplex<SmartDigraph, double> networksimplex(g); if (c) networksimplex.costMap<ArcMap>(cost); if (l) networksimplex.lowerMap<ArcMap>(lower); if (u) networksimplex.upperMap<ArcMap>(upper); if (s) networksimplex.supplyMap<NodeMap>(supply); networksimplex.run(); // Create output if (nlhs > 0) { plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL); double *total = mxGetPr(plhs[0]); total[0] = networksimplex.totalCost(); } if (nlhs > 1) { ArcMap flowMap(g); networksimplex.flowMap(flowMap); plhs[1] = mxCreateDoubleMatrix(1, m, mxREAL); double *flow = mxGetPr(plhs[1]); for (mwIndex i = 0; i < m; i++) flow[i] = flowMap[g.arcFromId(i)]; } if (nlhs > 2) { NodeMap potMap(g); networksimplex.potentialMap(potMap); plhs[2] = mxCreateDoubleMatrix(1, n, mxREAL); double *pot = mxGetPr(plhs[2]); for (mwIndex i = 0; i < n; i++) pot[i] = potMap[g.nodeFromId(i)]; } return; }