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