20 #ifndef _HAVE_SCOTCH_ //only works if scotch library has been compiled in.
21 _error_(
"Scotch not available! Cannot carry out Scotch partitioning!");
26 int nvert =0,nedge2=0,napar =0;
27 mwIndex *ir=NULL,*jc=NULL;
28 int *adjir=NULL,*adjjc=NULL;
29 double *vld=NULL,*vwd=NULL,*ewd=NULL,*apd=NULL;
30 int *vli=NULL,*vwi=NULL,*ewi=NULL,*api=NULL;
32 int (*maptabi)[2]=NULL;
34 int i,j,k,imi=0,imo=0,isi=0,ierr;
38 if (nrhs == 0 && nlhs == 0) {
42 else if (nrhs < 6 || nlhs > 1) {
50 argvm = (
char **) calloc(nrhs,
sizeof(
char *));
52 if (!(mxIsNumeric(prhs[imi]) &&
53 (mxGetM(prhs[imi]) == 1 && mxGetN(prhs[imi]) == 1))) {
54 argvm[isi] = (
char *) calloc(4+1,
sizeof(
char));
55 strcpy(argvm[isi],
"gmap");
56 mexPrintf(
"%s -- Using \"%s\" entry point.\n",
61 argvm[isi] = (
char *) calloc(5+1,
sizeof(
char));
62 strcpy(argvm[isi],
"gpart");
63 mexPrintf(
"%s -- Using \"%s\" entry point.\n",
67 argvm[isi] = (
char *) calloc(17,
sizeof(
char));
68 sprintf(argvm[isi],
"%d",(
int)mxGetScalar(prhs[imi]));
69 mexPrintf(
"%s -- Number of parts is %s.\n",
75 if (!mxIsNumeric(prhs[imi]) || (!mxIsEmpty(prhs[imi]) && !mxIsSparse(prhs[imi]))) {
76 mexPrintf(
"%s -- Adjacency matrix must be numeric and sparse.\n",
__FUNCT__);
80 nvert =mxGetM(prhs[imi]);
81 nedge2=mxGetNzmax(prhs[imi]);
82 if (mxGetNzmax(prhs[imi])) {
83 ir =mxGetIr(prhs[imi]);
84 adjir = (
int *) malloc(mxGetNzmax(prhs[imi])*
sizeof(int));
85 for (i=0; i<mxGetNzmax(prhs[imi]); i++)
88 if (mxGetN(prhs[imi])) {
89 jc =mxGetJc(prhs[imi]);
90 adjjc = (
int *) malloc((mxGetN(prhs[imi])+1)*
sizeof(int));
91 for (i=0; i<(mxGetN(prhs[imi])+1); i++)
94 mexPrintf(
"%s -- Adjacency matrix is of size %d by %d with %d non-zeroes.\n",
95 __FUNCT__,mxGetM(prhs[imi]),mxGetN(prhs[imi]),mxGetNzmax(prhs[imi]));
99 if (!mxIsNumeric(prhs[imi])) {
100 mexPrintf(
"%s -- Vertex label vector must be numeric.\n",
__FUNCT__);
104 if (mxGetM(prhs[imi])*mxGetN(prhs[imi])) {
105 vld=mxGetPr(prhs[imi]);
106 vli = (
int *) malloc(mxGetM(prhs[imi])*mxGetN(prhs[imi])*
sizeof(int));
107 for (i=0; i<mxGetM(prhs[imi])*mxGetN(prhs[imi]); i++)
110 mexPrintf(
"%s -- Vertex label vector is of size %d by %d.\n",
111 __FUNCT__,mxGetM(prhs[imi]),mxGetN(prhs[imi]));
115 if (!mxIsNumeric(prhs[imi])) {
116 mexPrintf(
"%s -- Vertex weight vector must be numeric.\n",
__FUNCT__);
120 if (mxGetM(prhs[imi])*mxGetN(prhs[imi])) {
121 vwd=mxGetPr(prhs[imi]);
122 vwi = (
int *) malloc(mxGetM(prhs[imi])*mxGetN(prhs[imi])*
sizeof(int));
123 for (i=0; i<mxGetM(prhs[imi])*mxGetN(prhs[imi]); i++)
126 mexPrintf(
"%s -- Vertex weight vector is of size %d by %d.\n",
127 __FUNCT__,mxGetM(prhs[imi]),mxGetN(prhs[imi]));
131 if (!mxIsNumeric(prhs[imi]) || (!mxIsEmpty(prhs[imi]) && !mxIsSparse(prhs[imi]))) {
132 mexPrintf(
"%s -- Edge weight matrix must be numeric and sparse.\n",
__FUNCT__);
136 if (mxGetM(prhs[imi])) {
137 ewd=mxGetPr(prhs[imi]);
138 ewi = (
int *) malloc(mxGetM(prhs[imi])*
sizeof(int));
139 for (i=0; i<mxGetNzmax(prhs[imi]); i++)
142 mexPrintf(
"%s -- Edge weight matrix is of size %d by %d with %d non-zeroes.\n",
143 __FUNCT__,mxGetM(prhs[imi]),mxGetN(prhs[imi]),mxGetNzmax(prhs[imi]));
147 if (!((strlen (argvm[0]) >= 5) &&
148 (strncmp (argvm[0] + strlen (argvm[0]) - 5,
"gpart", 5) == 0))) {
149 if (!mxIsChar(prhs[imi])) {
150 mexPrintf(
"%s -- Architecture type must be character.\n",
__FUNCT__);
154 if (mxGetM(prhs[imi])*mxGetN(prhs[imi])) {
155 archtyp = (
char *) calloc(mxGetM(prhs[imi])*mxGetN(prhs[imi])+1,
sizeof(char));
156 mxGetString(prhs[imi],archtyp,mxGetM(prhs[imi])*mxGetN(prhs[imi])+1);
158 mexPrintf(
"%s -- Architecture type is \"%s\".\n",
163 if (!mxIsNumeric(prhs[imi])) {
164 mexPrintf(
"%s -- Architecture parameter vector must be numeric.\n",
__FUNCT__);
168 napar =mxGetM(prhs[imi])*mxGetN(prhs[imi]);
169 if (mxGetM(prhs[imi])*mxGetN(prhs[imi])) {
170 apd=mxGetPr(prhs[imi]);
171 api = (
int *) malloc(mxGetM(prhs[imi])*mxGetN(prhs[imi])*
sizeof(int));
172 for (i=0; i<mxGetM(prhs[imi])*mxGetN(prhs[imi]); i++)
175 mexPrintf(
"%s -- Architecture parameter vector is of size %d by %d.\n",
176 __FUNCT__,mxGetM(prhs[imi]),mxGetN(prhs[imi]));
182 if (!mxIsChar(prhs[imi])) {
183 mexPrintf(
"%s -- prhs[%d] must be character.\n",
__FUNCT__,imi);
187 argvm[isi] = (
char *) calloc(mxGetM(prhs[imi])*mxGetN(prhs[imi])+1,
sizeof(char));
188 mxGetString(prhs[imi],argvm[isi],mxGetM(prhs[imi])*mxGetN(prhs[imi])+1);
194 mexPrintf(
"argcm=%d\n",argcm);
195 for (i=0; i<argcm; i++)
196 mexPrintf(
"argvm[%d]=\"%s\"\n",i,argvm[i]);
200 mexPrintf(
"Gmapx:\n");
214 mexPrintf(
"%s -- Error %d from Gmapx.\n",
__FUNCT__,ierr);
223 plhs[imo]=mxCreateDoubleMatrix(nvert, 2, mxREAL);
224 maptabd = mxGetPr(plhs[imo]);
227 for (i=0; i<nvert; i++)
228 maptabd[k++]=(
double)maptabi[i][j];
232 plhs[imo]=mxCreateDoubleMatrix(0, 2, mxREAL);
248 #endif //#ifndef _HAVE_SCOTCH_