#include #include "mex.h" #include "graph.h" #include void mexFunction(int nout, mxArray *out[], int nin, const mxArray *in[]) { if (nin != 3) mexErrMsgTxt("Three arguments are required (nNodes,TerminalWeights,EdgeWeights)") ; if (nout > 2) mexErrMsgTxt("Too many output arguments."); int nNodes = (int) *mxGetPr(in[0]); const int* twDim = mxGetDimensions(in[1]) ; int twRows = twDim[0] ; int twCols = twDim[1] ; double* twPt = mxGetPr(in[1]) ; if(twCols!=3) mexErrMsgTxt("The Terminal Weight matix should have 3 columns, (Node,sink,source)."); const int* ewDim = mxGetDimensions(in[2]) ; int ewRows = ewDim[0] ; int ewCols = ewDim[1] ; double* ewPt = mxGetPr(in[2]) ; if(ewCols!=4) mexErrMsgTxt("The Terminal Weight matix should have 4 columns, (From,To,Capacity,Rev_Capacity)."); typedef Graph GraphType; GraphType G(static_cast(nNodes), static_cast(ewRows+twRows)); G.add_node(nNodes); for(int cTw=0;cTw=nNodes) mexErrMsgTxt("index out of bounds in TerminalWeight Matrix."); G.add_tweights(node,twPt[cTw+twRows],twPt[cTw+2*twRows]); } for(int cEw=0;cEw=nNodes) mexErrMsgTxt("From index out of bounds in Edge Weight Matrix."); if(To<0 || To>=nNodes) mexErrMsgTxt("To index out of bounds in Edge Weight Matrix."); G.add_edge(From,To,ewPt[cEw+2*ewRows],ewPt[cEw+3*ewRows]); } double flow=G.maxflow(); std::vector SourceCut; for(int cNode=0;cNode::const_iterator Itt(SourceCut.begin()); for(;Itt!=SourceCut.end();++Itt) { *pOut=*Itt; ++pOut; } if(nout==2) { out[1] = mxCreateDoubleMatrix(1, 1, mxREAL) ; *mxGetPr(out[1])=flow; } }