void mcxDiagnosticsAttractor ( const char* ffn_attr , const mclMatrix* clus2elem , const mcxDumpParam dumpParam ) { int n_nodes = clus2elem->n_range ; int n_written = dumpParam->n_written ; mclMatrix* mtx_Ascore = mclxAllocZero(n_written, n_nodes) ; mcxIO* xfOut = mcxIOnew(ffn_atr, "w") ; dim d = 0 ; if (mcxIOopen(xfOut, RETURN_ON_FAIL) == STATUS_FAIL) { mclxFree(&mtx_Ascore) ; mcxIOfree(&xfOut) ; return ; } ; for(d=0; d<n_written; d++) { mclMatrix* iterand = *(dumpParam->iterands+d) ; mclVector* vec_Ascore = NULL ; if (iterands->n_cols != n_nodes || iterand->n_range != n_nodes) { fprintf(stderr, "mcxDiagnosticsAttractor: dimension error\n") ; mcxExit(1) ; } vec_Ascore = mcxAttractivityScale(iterand) ; mclvRenew((mtx_Ascore->cols+d), vec_Ascore->ivps, vec_Ascore->n_ivps) ; mclvFree(&vec_Ascore) ; } mclxbWrite(mtx_Ascore, xfOut, RETURN_ON_FAIL) ; mclxFree(mtx_Ascore) ; }
/* current dst content is thrown away if fltbinary not used */ mclv* mclvFromPAR ( mclv* dst , mclpAR* par , mcxbits warnbits , void (*ivpmerge)(void* ivp1, const void* ivp2) , double (*fltbinary)(pval val1, pval val2) ) { mcxbool warn_re = warnbits & MCLV_WARN_REPEAT_ENTRIES ; mcxbool warn_rv = warnbits & MCLV_WARN_REPEAT_VECTORS ; mclp* ivps = par->ivps ; dim n_ivps = par->n_ivps ; mcxbits sortbits = par->sorted ; dim n_old = dst ? dst->n_ivps : 0 ; const char* me = "mclvFromPAR" ; dim n_re = 0, n_rv = 0 ; if (!dst) dst = mclvInit(NULL) ; if (n_ivps) { if (dst->n_ivps && fltbinary) { mclVector* tmpvec = mclvNew(ivps, n_ivps) ; if (!(sortbits & MCLPAR_SORTED)) mclvSort(tmpvec, NULL) ; if (!(sortbits & MCLPAR_UNIQUE)) n_re = mclvUniqIdx(tmpvec, ivpmerge) ; n_rv += tmpvec->n_ivps ; n_rv += dst->n_ivps ; mclvBinary(dst, tmpvec, dst, fltbinary) ; n_rv -= dst->n_ivps ; mclvFree(&tmpvec) ; } else { if (dst->ivps == ivps) mcxErr(me, "DANGER dst->ivps == ivps (dst vid %d)", (int) dst->vid) ; mclvRenew(dst, ivps, n_ivps) ; if (!(sortbits & MCLPAR_SORTED)) mclvSort(dst, NULL) ; if (!(sortbits & MCLPAR_UNIQUE)) n_re += mclvUniqIdx(dst, ivpmerge) ; } } if (warn_re && n_re) mcxErr ( me , "<%ld> found <%ld> repeated entries within %svector" , (long) dst->vid , (long) n_re , n_rv ? "repeated " : "" ) ; if (warn_rv && n_rv) mcxErr ( me , "<%ld> new vector has <%ld> overlap with previous amalgam" , (long) dst->vid , (long) n_rv ) ; if (warnbits && n_re + n_rv) mcxErr ( me , "<%ld> vector went from <%ld> to <%ld> entries" , (long) dst->vid , (long) n_old , (long) dst->n_ivps ) ; return dst ; }