mclVector* mcxAttractivityScale ( const mclMatrix* M ) { dim n_cols = N_COLS(M) ; dim d ; mclVector* vec_values = mclvResize(NULL, n_cols) ; for (d=0; d<n_cols; d++) { mclVector* vec = M->cols+d ; double selfval = mclvIdxVal(vec, d, NULL) ; double maxval = mclvMaxValue(vec) ; if (maxval <= 0.0) { mcxErr ( "mcxAttractivityScale" , "encountered nonpositive maximum value" ) ; maxval = 1.0 ; } (vec_values->ivps+d)->idx = d ; (vec_values->ivps+d)->val = selfval / maxval ; } return vec_values ; }
mclMatrix* mclDiagOrdering ( const mclMatrix* M , mclVector** vecp_attr ) { int n_cols = N_COLS(M) ; mclMatrix* diago = mclxAllocZero(NULL, NULL) ; long col ; if (*vecp_attr != NULL) mclvFree(vecp_attr) ; *vecp_attr = mclvResize(NULL, n_cols) ; for (col=0;col<n_cols;col++) { ofs offset = -1 ; double selfval = mclvIdxVal(M->cols+col, col, &offset) ; double center = mclvPowSum(M->cols+col, 2.0) /* double maxval = mclvMaxValue(M->cols+col) */ ; double bar = MCX_MAX(center, selfval) - dpsd_delta ; mclIvp* ivp = (*vecp_attr)->ivps+col ; ivp->idx = col ; ivp->val = center ? selfval / center : 0 ; if (offset >= 0) /* take only higher valued entries */ mclvSelectGqBar(diago->cols+col, bar) ; } ; return diago ; }
void test_cross_ratio ( mclx* mx ) { dim i, j, n = 0 ; for (i=0;i<N_COLS(mx);i++) { mclv* v = mx->cols+i ; double selfv = mclvSelf(v) ; for (j=0;j<v->n_ivps;j++) { mclv* w = mclxGetVector(mx, v->ivps[j].idx, EXIT_ON_FAIL, NULL) ; double arc = v->ivps[j].val ; double selfw= mclvSelf(w) ; double cra = mclvIdxVal(w, v->vid, NULL) ; double s = MCX_MIN(selfv, selfw) ; if (s > arc || s > cra) fprintf ( stdout , "%u\t%u\t%g\t%g\t%g\t%g\n" , (unsigned) v->vid , (unsigned) w->vid , arc , cra , selfv , selfw ) ; n++ ; } } fprintf(stderr, "tested %u entries\n", (unsigned) n) ; }
mclMatrix* mclDag ( const mclMatrix* A , const mclInterpretParam* ipp ) { dim d ; double w_selfval= ipp ? ipp->w_selfval: 0.999 ; double w_maxval = ipp ? ipp->w_maxval : 0.001 ; double delta = ipp ? ipp->delta : 0.01 ; mclMatrix* M = mclxAllocZero ( mclvCopy(NULL, A->dom_cols) , mclvCopy(NULL, A->dom_rows) ) ; for (d=0; d<N_COLS(A); d++) /* thorough clean-up */ { mclVector* vec = A->cols+d ; mclVector* dst = M->cols+d ; double selfval = mclvIdxVal(vec, vec->vid, NULL) ; double maxval = mclvMaxValue(vec) ; double bar = selfval < maxval ? ( (w_selfval * selfval) + (w_maxval * maxval) ) : delta ? selfval / (1 + delta) : selfval ; int n_bar = mclvCountGiven(vec, mclpGivenValGQ, &bar) ; mclvCopyGiven(dst, vec, mclpGivenValGQ, &bar, n_bar) ; } if (0) { dim ne = mclxNrofEntries(M) ; fprintf(stderr, "nroff entries %u\n", (unsigned) ne) ; } return M ; }
double mclvSelf ( const mclVector* vec ) { return vec ? mclvIdxVal(vec, vec->vid, NULL) : 0.0 ; }