1 /*
2  *   Copyright (C) 1989-1991 Yale University
3  *
4  *   This work is distributed in the hope that it will be useful; you can
5  *   redistribute it and/or modify it under the terms of the
6  *   GNU General Public License as published by the Free Software Foundation;
7  *   either version 2 of the License,
8  *   or any later version, on the following conditions:
9  *
10  *   (a) YALE MAKES NO, AND EXPRESSLY DISCLAIMS
11  *   ALL, REPRESENTATIONS OR WARRANTIES THAT THE MANUFACTURE, USE, PRACTICE,
12  *   SALE OR
13  *   OTHER DISPOSAL OF THE SOFTWARE DOES NOT OR WILL NOT INFRINGE UPON ANY
14  *   PATENT OR
15  *   OTHER RIGHTS NOT VESTED IN YALE.
16  *
17  *   (b) YALE MAKES NO, AND EXPRESSLY DISCLAIMS ALL, REPRESENTATIONS AND
18  *   WARRANTIES
19  *   WHATSOEVER WITH RESPECT TO THE SOFTWARE, EITHER EXPRESS OR IMPLIED,
20  *   INCLUDING,
21  *   BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
22  *   PARTICULAR
23  *   PURPOSE.
24  *
25  *   (c) LICENSEE SHALL MAKE NO STATEMENTS, REPRESENTATION OR WARRANTIES
26  *   WHATSOEVER TO
27  *   ANY THIRD PARTIES THAT ARE INCONSISTENT WITH THE DISCLAIMERS BY YALE IN
28  *   ARTICLE
29  *   (a) AND (b) above.
30  *
31  *   (d) IN NO EVENT SHALL YALE, OR ITS TRUSTEES, DIRECTORS, OFFICERS,
32  *   EMPLOYEES AND
33  *   AFFILIATES BE LIABLE FOR DAMAGES OF ANY KIND, INCLUDING ECONOMIC DAMAGE OR
34  *   INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER YALE SHALL BE
35  *   ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT SHALL KNOW OF THE
36  *   POSSIBILITY OF THE FOREGOING.
37  *
38  */
39 
40 /* -----------------------------------------------------------------
41 FILE:	    stat.c
42 DESCRIPTION:utility routines to calculate min, max, mean, and variance.
43 CONTENTS:   DOUBLE Ystat_min( array, number_ele, size_ele  )
44 		char *array ;
45 		INT  num_ele, INT  size_ele ;
46 	    DOUBLE Ystat_max( array, number_ele, size_ele  )
47 		char *array ;
48 		INT  num_ele, INT  size_ele ;
49 	    DOUBLE Ystat_mean( array, number_ele, size_ele  )
50 		char *array ;
51 		INT  num_ele, INT  size_ele ;
52 	    DOUBLE Ystat_var( array, number_ele, size_ele, mean  )
53 		char *array ;
54 		INT  num_ele, INT  size_ele ;
55 		DOUBLE mean ;
56 DATE:	    Mar  7, 1989
57 REVISIONS:  Sun Apr 21 21:21:58 EDT 1991 - renamed to Ystat_
58 ----------------------------------------------------------------- */
59 
60 #include <yalecad/base.h>
61 
62 
63 /* Given an array of number_elements of size_element, calculate min */
Ystat_min(array,number_elements,size_element)64 DOUBLE Ystat_min( array, number_elements, size_element  )
65 char *array ;
66 INT  number_elements ;
67 INT  size_element ;
68 {
69 
70     INT i ;
71     DOUBLE min = DBL_MAX ;
72     SHORT  *sarray ;
73     INT    *iarray ;
74     DOUBLE *darray ;
75 
76     switch( size_element ){
77     case 1:
78 	for( i=0;i<number_elements;i++){
79 	    if( (DOUBLE) array[i] < min ){
80 		min = (DOUBLE) array[i] ;
81 	    }
82 	}
83 	break ;
84     case 2:
85 	sarray = (SHORT *) array ;
86 	for( i=0;i<number_elements;i++){
87 	    if( (DOUBLE) sarray[i] < min ){
88 		min = (DOUBLE) sarray[i] ;
89 	    }
90 	}
91 	break ;
92     case 4:
93 	iarray = (INT *) array ;
94 	for( i=0;i<number_elements;i++){
95 	    if( (DOUBLE) iarray[i] < min ){
96 		min = (DOUBLE) iarray[i] ;
97 	    }
98 	}
99 	break ;
100     case 8:
101 	darray = (DOUBLE *) array ;
102 	for( i=0;i<number_elements;i++){
103 	    if( darray[i] < min ){
104 		min = darray[i] ;
105 	    }
106 	}
107 	break ;
108     default: fprintf( stderr, "Unsupported element size:%d\n",
109 	size_element ) ;
110     }
111 
112     return(min);
113 } /* end Ystat_min */
114 
115 /* Given an array of number_elements of size size_element,calculate max */
Ystat_max(array,number_elements,size_element)116 DOUBLE Ystat_max( array, number_elements, size_element  )
117 char *array ;
118 INT  number_elements ;
119 INT  size_element ;
120 {
121 
122     INT i ;
123     DOUBLE max = DBL_MIN ;
124     SHORT  *sarray ;
125     INT    *iarray ;
126     DOUBLE *darray ;
127 
128     switch( size_element ){
129     case 1:
130 	for( i=0;i<number_elements;i++){
131 	    if( (DOUBLE) array[i] > max ){
132 		max = (DOUBLE) array[i] ;
133 	    }
134 	}
135 	break ;
136     case 2:
137 	sarray = (SHORT *) array ;
138 	for( i=0;i<number_elements;i++){
139 	    if( (DOUBLE) sarray[i] > max ){
140 		max = (DOUBLE) sarray[i] ;
141 	    }
142 	}
143 	break ;
144     case 4:
145 	iarray = (INT *) array ;
146 	for( i=0;i<number_elements;i++){
147 	    if( (DOUBLE) iarray[i] > max ){
148 		max = (DOUBLE) iarray[i] ;
149 	    }
150 	}
151 	break ;
152     case 8:
153 	darray = (DOUBLE *) array ;
154 	for( i=0;i<number_elements;i++){
155 	    if( darray[i] > max ){
156 		max = darray[i] ;
157 	    }
158 	}
159 	break ;
160     default: fprintf( stderr, "Unsupported element size:%d\n",
161 	size_element ) ;
162 
163     }
164     return(max);
165 } /* end Ystat_max */
166 
167 /* Given an array of number_elements of size size_ele, calculate mean */
Ystat_mean(array,number_elements,size_element)168 DOUBLE Ystat_mean( array, number_elements, size_element  )
169 char *array ;
170 INT  number_elements ;
171 INT  size_element ;
172 {
173 
174     INT i ;
175     DOUBLE sum = 0.0 ;
176     SHORT  *sarray ;
177     INT    *iarray ;
178     DOUBLE *darray ;
179 
180     switch( size_element ){
181     case 1:
182 	for( i=0;i<number_elements;i++){
183 	    sum += (DOUBLE) array[i] ;
184 	}
185 	break ;
186     case 2:
187 	sarray = (SHORT *) array ;
188 	for( i=0;i<number_elements;i++){
189 	    sum += (DOUBLE) sarray[i] ;
190 	}
191 	break ;
192     case 4:
193 	iarray = (INT *) array ;
194 	for( i=0;i<number_elements;i++){
195 	    sum += (DOUBLE) iarray[i] ;
196 	}
197 	break ;
198     case 8:
199 	darray = (DOUBLE *) array ;
200 	for( i=0;i<number_elements;i++){
201 	    sum += (DOUBLE) darray[i] ;
202 	}
203 	break ;
204     default: fprintf( stderr, "ERROR:Unsupported element size:%d\n",
205 	size_element ) ;
206     }
207 
208     if( number_elements ){
209 	return( sum / number_elements ) ;
210     } else {
211 	fprintf( stderr, "ERROR:number of elements zero\n" ) ;
212 	return( 0.0 ) ;
213     }
214 
215 } /* end Ystat_mean */
216 
217 
218 /* Given an array of number_elements of size size_ele, calculate var */
219 /* NOTE also need to give mean calculated from above */
Ystat_var(array,number_elements,size_element,mean)220 DOUBLE Ystat_var( array, number_elements, size_element, mean )
221 char *array ;
222 INT  number_elements ;
223 INT  size_element ;
224 DOUBLE mean ;
225 {
226 
227     INT i ;
228     DOUBLE sum ;
229     DOUBLE sum2 = 0.0 ;
230     DOUBLE var ;
231     SHORT  *sarray ;
232     INT    *iarray ;
233     DOUBLE *darray ;
234 
235     switch( size_element ){
236     case 1:
237 
238 	for( i=0;i<number_elements;i++){
239 	    sum = (DOUBLE) array[i] ;
240 	    sum2 += sum * sum ;
241 	}
242 	break ;
243     case 2:
244 	sarray = (SHORT *) array ;
245 	for( i=0;i<number_elements;i++){
246 	    sum = (DOUBLE) sarray[i] ;
247 	    sum2 += sum * sum ;
248 	}
249 	break ;
250     case 4:
251 	iarray = (INT *) array ;
252 	for( i=0;i<number_elements;i++){
253 	    sum = (DOUBLE) iarray[i] ;
254 	    sum2 += sum * sum ;
255 	}
256 	break ;
257     case 8:
258 	darray = (DOUBLE *) array ;
259 	for( i=0;i<number_elements;i++){
260 	    sum = (DOUBLE) darray[i] ;
261 	    sum2 += sum * sum ;
262 	}
263 	break ;
264     default: fprintf( stderr, "ERROR:Unsupported element size:%d\n",
265 	size_element ) ;
266 
267     }
268     if( number_elements > 1 ){
269 	var = (sum2 - number_elements * mean * mean)/(number_elements-1) ;
270 	return(ABS(var));
271     } else if( number_elements == 1 ){
272 	return( 0.0 ) ;
273     } else {
274 	fprintf( stderr, "ERROR:number of elements zero\n" ) ;
275 	return( 0.0 ) ;
276     }
277 
278 } /* end Ystat_variance */
279