00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 #ifndef __CNBatchMeans_h
00041 #define __CNBatchMeans_h
00042
00043
00044 #include <CNCL/Statistics.h>
00045
00046 #include <math.h>
00047 #include <limits.h>
00048 #include <float.h>
00049
00050 # include <iostream>
00051 # include <iomanip>
00052
00053 #include <CNCL/minmax.h>
00054
00055
00056 extern CNClassDesc CN_BATCHMEANS;
00057
00058
00062 class CNBatchMeans : public CNStatistics
00063 {
00064 public:
00066 CNBatchMeans(double, double, long, long, long,
00067 short = 95, const char* = NIL, const char* = NIL);
00069 CNBatchMeans(double, double, long, long, double,
00070 short = 95, const char* = NIL, const char* = NIL);
00072 CNBatchMeans(CNParam *) {}
00073
00075 ~CNBatchMeans();
00076
00077 private:
00079 CNBatchMeans() {}
00080
00081 public:
00082
00083 void put(double);
00084
00086 unsigned long trials() const { return nrv; }
00088 double minimum() const { return min_val; }
00090 double maximum() const { return max_val; }
00091
00093 double mean() const;
00095 double variance() const;
00097 double sigma() const;
00098
00100 Phase status() const { return phase; }
00102 bool end() const { return end_reached; }
00103
00105 void reset();
00107 void print(CNStatistics::Type = CNStatistics::DF, ostream& = cout) const;
00108
00109 public:
00110
00111 struct resultline
00112 {
00113 double x;
00114 double fx, gx, rh;
00115 double ferr, gerr;
00116 double fconf, gconf;
00117 };
00118
00119 public:
00121 long min_index() const { return 0; }
00123 long max_index() const { return long(intervals - 1); }
00125 long groups_done() const { return long(act_group); }
00126
00128 const struct resultline *get_result(long);
00129
00131 void change_error(double ne) { max_err = ne; }
00132
00134 double p(double);
00135 double f(double);
00136 double g(double);
00137
00138 double bayes_err() const;
00139 double mean_confidence() const;
00140 double correlation() const;
00141
00142 private:
00144 struct Group
00145 {
00147 unsigned long *histo;
00149 unsigned long lower, higher;
00151 double sum_x;
00153 double qsum_x;
00154
00155 unsigned long remaining,
00156 sog, inter;
00157
00159 void reset();
00161 Group(unsigned long, unsigned long);
00163 ~Group();
00164 };
00165
00167 struct Interval
00168 {
00170 unsigned long hits;
00172 double sum_rh, qsum_rh;
00174 double sum_f, qsum_f;
00176 double sum_g, qsum_g;
00177
00179 void reset();
00181 Interval();
00182 };
00183
00184 private:
00185
00186 unsigned long nrv;
00187 double min_val, max_val;
00188
00190 double bottom, top;
00191 unsigned long intervals;
00192 unsigned long size_of_groups,
00193 number_of_groups;
00195 double max_err;
00196 bool fixed_length;
00197 short confidence;
00200 Phase phase;
00202 bool end_reached;
00203
00206 unsigned long wasted_left, wasted_right;
00208 double int_step;
00209
00211 unsigned long act_group;
00213 Group *actual_group;
00215 Interval *result;
00216
00218 double sum_y;
00220 double qsum_y;
00222 double sum_gr_var;
00224 double qsum_gr_var;
00225
00227 double *y_i;
00228 resultline line;
00229
00230 private:
00232 void eval_group();
00234 double calc_confidence(unsigned long, double) const;
00236 double calc_error(unsigned long, double, double) const;
00238 double calc_var(unsigned long, double, double) const;
00239
00240 public:
00241 virtual CNClassDesc class_desc() const
00242 { return CN_BATCHMEANS; }
00243
00245 virtual bool is_a(CNClassDesc desc) const
00246 { return desc == CN_BATCHMEANS ? TRUE : CNStatistics::is_a(desc); }
00247
00249 static CNBatchMeans *cast_from_object(CNObject *obj)
00250 {
00251 # ifdef NO_TYPE_CHECK
00252 return (CNBatchMeans *)obj;
00253 # else
00254 return (CNBatchMeans *)( !obj || obj->is_a(CN_BATCHMEANS)
00255 ? obj : fatal_type(obj->class_desc(), CN_BATCHMEANS) );
00256 # endif
00257 }
00258
00260 static CNObject *new_object(CNParam *param = NIL)
00261 { return param ? new CNBatchMeans(param) : new CNBatchMeans; }
00262
00264 virtual void dump (ostream &strm = cout) const;
00266 virtual void print(ostream &strm = cout) const;
00267 };
00268
00269
00270
00271 ostream &operator << (ostream &strm, const CNBatchMeans &obj);
00272 ostream &operator << (ostream &strm, const CNBatchMeans *obj);
00273
00274 #endif