/****************************************************************************** # # ## ##### # # # # ##### #### ## ## # # # # # # # # # # # # ## # # # # ###### # # ##### # # # ###### # # # # # # # ### # # # # # # # # # # # # ### # # # # # # # # # ###### # ##### ### #### ******************************************************************************/ /* This file is part of MAPMAKER 3.0b, Copyright 1987-1992, Whitehead Institute for Biomedical Research. All rights reserved. See READ.ME for license. */ #define INC_MATH #define INC_MEM #define INC_MSG #define INC_STR #define INC_IO #define INC_MISC #define INC_HELP_DEFS #include "system.h" real sq(r) real r; { return(r*r); } real rmaxf(r,s) real r,s; { return(r>=s ? r : s); } real rminf(r,s) real r,s; { return(r<=s ? r : s); } long lpow2(i) /* Return 2 to the i-th power for 0<=i<=LONGBITS (31) */ int i; { long result; int j; if (i<0 || i>LONGBITS) send(CRASH); for(result=(long)1, j=0; jINTBITS) send(CRASH); for(result=1, j=0; jLONGBITS) send(CRASH); for(result=(long)1, j=0; jINTBITS) send(CRASH); for(result=1, j=0; jn || n<1 || k<1) send(CRASH); Ln= (long)n; Lk= (long)k; Lx= (long)(n-k+1); L1= (long)1; for (a=L1; Ln>=Lx; Ln--) a*=Ln; /* is product of n...n-k+1, or n!/(n-k)! */ for (b=L1; Lk>L1; Lk--) b*=Lk; return((int)(a/b)); } int imaxf(r,s) int r,s; { return(r>=s ? r : s); } int iminf(r,s) int r,s; { return(r<=s ? r : s); } long lmaxf(r,s) long r,s; { return(r>=s ? r : s); } long lminf(r,s) long r,s; { return(r<=s ? r : s); } /*** Compare Functions for Array Sort Routines ***/ int icomp(x,y) QSORT_COMPARE_PTR_TO(int) *x, *y; { return( (*(int*)y) - (*(int*)x) ); } int lcomp(x,y) QSORT_COMPARE_PTR_TO(long) *x, *y; { long a, b; a= *(long*)x; b= *(long*)y; if (ab) return(-1); else if (a==b) return(0); else return(1); } /* this needs work */ int rhistogram(data,length,min_num_buckets, scale_quantization,scale_limit_quantization) /* return T or F */ real *data; int length, min_num_buckets; real scale_quantization; /* for present, ignored */ real scale_limit_quantization; /* for present, ignored */ { int i, j, index, stars, max_stars; int *bucket, num_buckets, largest_bucket; real max_data, scale, min_data; real stars_per; num_buckets= min_num_buckets; for (i=0, max_data= -VERY_BIG, min_data= VERY_BIG; imax_data) max_data=data[i]; if (data[i]largest_bucket) largest_bucket=bucket[j]; if (largest_bucket<=max_stars) stars_per=REAL(max_stars/largest_bucket); else stars_per=REAL(max_stars)/REAL(largest_bucket); for (j=0; j0 && stars<1) print(":"); else for (i=0; ilargest) largest=data[i]; return(largest); } real rmedian(data,length) real *data; int length; { real *copy, median; if (length==0) return(0.0); array(copy, length, real); rcopy(copy, data, length); rsort(copy,length); median= rmiddle(copy,length); unarray(copy, real); return(median); } real rmiddle(data,length) real *data; int length; { if (length==0) return(0.0); if (length<3) return(data[0]); return(data[(length-1)/2]); } void rcopy(to,from,length) real *to, *from; int length; { int i; for (i=0; i=length) send(CRASH); deviation[i]= d+mean; total_prob+= prob[i]= (*prob_func)(d); } cum_prob= 0.0; for (j=0; jentries= i; dist->start= deviation[0]; dist->increment= inc; dist->mean= mean; dist->deviation= deviation; dist->prob= prob; } when_aborting { unsingle(dist, DISTRIBUTION); unarray(prob, real); unarray(deviation, real); relay; return((DISTRIBUTION*)NULL); /* never reached */ } return(dist); } real pick_from_distribution(dist,prob) DISTRIBUTION *dist; real *prob; /* may be NULL */ { real p, *probs; int i, last; p= randnum(); probs= dist->prob; last= dist->entries-1; for (i=0; probs[i]deviation[i]); } void eliminate(); /* defined below */ void mat_invert(m,size,m_inverse) /* Invert square matrix by Gauss' method */ real **m; int size; real **m_inverse; /* m_inverse should be 2*size columns (2nd index) by size rows (first index) its left square will be left with the result (ignore the right side) */ { int row, col, c, twice_size; real diff, value; twice_size= 2 * size; for (row=0; rowmat_tolerance) { MATINV_diff= diff; send(MATINV); } OLD */ } void eliminate(row,col,row_to_sub,m,n_cols) int row, col, row_to_sub; real **m; int n_cols; { int j; real value; /* Get m[row][col]=0 by subtracting the row with a 1 in col from m[row], where the row is scaled appropriately */ if (m[row][col]==0.0) return; if (m[row_to_sub][col]==0.0) send(CRASH); /* used to send(SINGMAT) */ /* but SINGMAT was undefined */ value= m[row][col]/m[row_to_sub][col]; for (j=0; j