void remapind(SNP **snpmarkers, int numsnps, Indiv **indivmarkers, Indiv **indm2, int numindivs, int numind2) { int *g1, *g2, *w1 ; int *tind, t, i, j, k ; Indiv *indx ; SNP *cupt ; if (numindivs != numind2) fatalx("different remapind sizes %d %d\n", numindivs, numind2) ; ZALLOC(tind, numind2, int) ; ZALLOC(g2, numind2, int) ; ZALLOC(g1, numind2, int) ; ZALLOC(w1, numind2, int) ; for (k=0; k<numind2; ++k) { indx = indm2[k] ; t = tind[k] = indindex(indivmarkers, numindivs, indx -> ID) ; if (t<0) fatalx("bad newindiv: %s\n", indx -> ID) ; } for (i=0; i<numsnps; i++) { cupt = snpmarkers[i] ; for (j=0; j<numind2; ++j) { g1[j] = getgtypes(cupt, j) ; } copyiarr(g1, w1, numind2) ; for (k=0; k< numind2; ++k) { g2[k] = g1[tind[k]] ; } ivclear(g1, -1, numind2) ; copyiarr(g2, g1, numind2) ; for (k=0; k<numind2; ++k) { putgtypes(cupt, k, g1[k]) ; } /** if (i<100) { printf("zzz %s\n", cupt -> ID) ; for (j=0; j<numind2; ++j) { g1[j] = getgtypes(cupt, j) ; } printimat(w1, 1, numind2) ; printimat(g1, 1, numind2) ; } */ } free(w1) ; free(g1) ; free(g2) ; free(tind) ; }
void ipsortitp(int **a, int *ind, int len, int rlen, int *order) /** sort integer array pointers rows of array are sorted in lexicographical order compiarr can be called outside the sort */ { int i,k ; int *inda ; if (len==0) fatalx("(ipsortit) len = 0\n") ; ZALLOC(pttt, len, int *) ; ZALLOC(inda, len, int) ; setorder(order, rlen) ; // order defines order as sorted in ascending order. for (i=0; i<len; i++) { if (a[i] == NULL) fatalx("(ipsortit) array pointer %d NULL\n",i) ; inda[i] = i ; } copyiparr(a,pttt,len) ; qsort((int *) inda, len, sizeof(int), (int (*) (const void *, const void *)) ipcompit); for (i=0; i<len; i++) { k = inda[i] ; a[i] = pttt[k] ; } if (ind != NULL) copyiarr(inda, ind, len) ; free(inda) ; free (pttt) ; }
void mapit(int *a, int *b, int n, int inval, int outval) { int k ; copyiarr(b, a, n) ; for (k=0; k<n; ++k) { if (a[k]==inval) a[k] = outval ; } }
void reviarr(int *b,int *a,int n) { int i ; int *x ; ZALLOC(x, n, int) ; for (i=0; i<n; i++) { x[n-i-1] = a[i] ; } copyiarr(x, b, n) ; free(x) ; }
void isortit(int *a, int *ind, int len) { int i,k ; int *inda ; if (len==0) fatalx("(isortit) len = 0\n") ; ZALLOC(ittt, len, int) ; ZALLOC(inda, len, int) ; for (i=0; i<len; i++) { inda[i] = i ; } copyiarr(a,ittt,len) ; qsort((int *) inda, len, sizeof(int), (int (*) (const void *, const void *)) icompit); for (i=0; i<len; i++) { k = inda[i] ; a[i] = ittt[k] ; } free (ittt) ; if (ind != NULL) copyiarr(inda, ind, len) ; free(inda) ; }
void flipiarr(int *a, int *b, int n) { int *x, k ; ZALLOC(x, n, int) ; for (k=0; k<n; ++k) { x[n-1-k] = b[k] ; } copyiarr(x, a, n) ; free(x) ; }
void ipermute(int *a, int *ind, int len) { int i , k ; int *rrr ; ZALLOC(rrr, len, int) ; copyiarr(a, rrr, len) ; for (i=0; i<len; i++) { k = ind[i] ; a[i] = rrr[k] ; } free (rrr) ; }
void imulmat(int *a, int *b, int *c, int a1, int a2, int a3) /* b is a1 x a2 , c a2 x a3 so a is a1 x a3 */ { int *t ; int i,j,k ; ZALLOC(t, a1*a3, int) ; for (i=0; i<a1; i++) for (j=0; j<a3; j++) for (k=0; k<a2; k++) t[i*a3+j] += b[i*a2+k]*c[k*a3+j] ; copyiarr(t, a, a1*a3) ; free (t) ; }
void invperm(int *a, int *b, int n) { /** a, b can be same */ int i, j ; int *x ; if (n==0) return ; ZALLOC(x, n, int) ; ivclear(x,-1,n) ; for (i=0; i<n; i++) { j=b[i] ; x[j]=i ; } copyiarr(x, a, n) ; free(x) ; }
void setorder(int *pp, int rlen) { int *tt ; if (plen > 0) { if (porder != NULL) free(porder) ; } if (pp==NULL) { porder = NULL ; plen = rlen ; return ; } ZALLOC(porder, rlen, int) ; ZALLOC(tt, rlen, int) ; copyiarr(pp, tt, rlen) ; isortit(tt, porder, rlen) ; free(tt) ; plen = rlen ; }