- Timestamp:
- Jan 6, 2012, 12:07:51 PM (15 years ago)
- Branches:
- 1941-docker-image-to-test, devel, master
- Children:
- a49be3d
- Parents:
- 5f521b1
- Location:
- toltcl/generic
- Files:
-
- 2 edited
-
tolsergrp.cpp (modified) (13 diffs)
-
toltclInt.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
toltcl/generic/tolsergrp.cpp
r5f521b1 r5fbda58 81 81 #define TICK_TOL 2 82 82 #define GROW_TICK_DATA 10 83 84 typedef BDat (*StatFunc)(BSyntaxObject *); 85 86 struct SerieStats { 87 const char * name; 88 StatFunc func; 89 }; 90 91 static SerieStats 92 stats_data[] = { 93 {"Count", StatCount}, 94 {"Maximun", StatMax}, 95 {"Minimun", StatMin}, 96 {"Sum", StatSum}, 97 {"Average", StatAverage}, 98 {"Std. Dev.", StatStDs}, 99 {"Varianze", StatVarianze}, 100 {"Asimetry", StatAsimetry}, 101 {"Kurtosis", StatKurtosis}, 102 {"Median", StatMedian} 103 }; 104 105 #define NUMSTATS sizeof(stats_data)/sizeof(stats_data[0]) 106 107 static 108 Tcl_Obj * Tol_GetAllSerieStats( BUserTimeSerie * uts ) 109 { 110 const int listsize = 2*NUMSTATS; 111 Tcl_Obj * stats[listsize]; 112 BDat dat; 113 for ( size_t i = 0; i < NUMSTATS; i++ ) { 114 stats[2*i] = Tcl_NewStringObj(stats_data[i].name,-1); 115 dat = (*(stats_data[i].func))(uts); 116 if ( dat.IsKnown() ) 117 stats[2*i+1] = Tcl_NewDoubleObj(dat.Value()); 118 else { 119 BText name(dat.Name()); 120 stats[2*i+1] = Tcl_NewStringObj(name,-1); 121 } 122 } 123 return Tcl_NewListObj( listsize, stats ); 124 } 125 126 /* 127 *---------------------------------------------------------------------- 128 * 129 * Tol_ComputeSerieStat -- 130 * 131 * Implements the new Tcl "::tol::seriestat" command. 132 * 133 * tol::seriestat serieref 134 * -> {serie-name {list of stats names & values}} 135 * 136 * tol::seriestat serieref statname ?args? 137 * -> return the stat value. (not implemented yet) 138 * 139 * Results: 140 * 141 * 142 * Side effects: 143 * None. 144 * 145 *---------------------------------------------------------------------- 146 */ 147 148 int Tol_ComputeSerieStat(Tcl_Interp * interp, 149 int objc, Tcl_Obj *CONST objv[], 150 Tcl_Obj * obj_result) 151 { 152 BUserTimeSerie * uts; 153 bool found; 154 155 // uts = Tol_GetTimeSerie( interp, objv[0] ); 156 uts = (BUserTimeSerie*)Tol_ResolveObject(interp, objv[0], 157 obj_result/*,GraSerie()*/); 158 if ( !uts ) { 159 return TCL_ERROR; 160 } 161 Tcl_Obj * listv[2]; 162 if ( objc > 1 ) { 163 Tcl_Obj **stats; 164 stats = (Tcl_Obj**)Tcl_Alloc( sizeof(Tcl_Obj*)*2*(objc-1) ); 165 //const int listsize = 2*(objc-1); 166 //Tcl_Obj * stats[listsize]; 167 BDat dat; 168 169 listv[0] = Tcl_NewStringObj(uts->Identify(),-1); 170 for ( size_t i = 0; i < size_t(objc-1); i++ ) { 171 found = false; 172 for ( size_t j = 0; j < NUMSTATS; j++ ) { 173 if (strcmp(Tcl_GetString(objv[i+1]),stats_data[j].name) == 0) { 174 found = true; 175 stats[2*i] = Tcl_NewStringObj(stats_data[j].name,-1); 176 dat = (*(stats_data[j].func))(uts); 177 if ( dat.IsKnown() ) 178 stats[2*i+1] = Tcl_NewDoubleObj(dat.Value()); 179 else { 180 BText name(dat.Name()); 181 stats[2*i+1] = Tcl_NewStringObj(name,-1); 182 } 183 } 184 } 185 if (found == false) { 186 Tcl_AppendStringsToObj(obj_result, "bad statistics name '", 187 Tcl_GetString(objv[i+1]),"'", NULL); 188 Tcl_Free((char*)(stats)); 189 return TCL_ERROR; 190 } 191 } 192 listv[1] = Tcl_NewListObj(2*(objc-1), stats); 193 Tcl_SetListObj(obj_result, 2, listv); 194 Tcl_Free((char*)(stats)); 195 return TCL_OK; 196 197 } else { 198 // {Count 20 ... Median 0.23} 199 listv[0] = Tcl_NewStringObj(uts->Identify(),-1); 200 listv[1] = Tol_GetAllSerieStats( uts ); 201 Tcl_SetListObj(obj_result, 2, listv); 202 return TCL_OK; 203 } 204 } 83 205 84 206 struct Tol_TicksData { … … 411 533 Tcl_Obj ** X, ** Y; 412 534 #endif 535 Tcl_Obj *stats; 413 536 char * name; 414 537 /* name of the syntax object, may be equal to name */ … … 419 542 Tcl_Interp * interp, 420 543 Tol_SerieCursor * tsc); 544 void ComputeStats( BUserTimeSerie * uts ) 545 { 546 if ( uts ) { 547 if ( stats ) { 548 Tcl_DecrRefCount( stats ); 549 } 550 stats = Tol_GetAllSerieStats( uts ); 551 Tcl_IncrRefCount( stats ); 552 } 553 } 421 554 }; 422 555 … … 761 894 { 762 895 int tcl_code; 763 Tol_SerieGroup * sgrp ;896 Tol_SerieGroup * sgrp = NULL; 764 897 Tcl_CmdInfo cmd_info; 765 898 char * sgrp_name = Tcl_GetString(series[0]); … … 860 993 } 861 994 995 862 996 /* 863 997 * Tol_CreateSerieGrp -- … … 970 1104 * with corresponding values. 971 1105 * 972 * seriegrp serie idx reference -> return 1106 * seriegrp serie idx reference -> return 1107 * 1108 * seriegrp serie idx stats -> return the statistics for the serie 973 1109 * 974 1110 * seriegrp format ?strfmt? … … 1073 1209 if (!strcmp(arg,"reference")) { 1074 1210 Tcl_AppendResult(interp,sdata->name,NULL); 1211 return TCL_OK; 1212 } 1213 if ( !strcmp(arg,"stats") ) { 1214 Tcl_SetObjResult( interp, sdata->stats ); 1075 1215 return TCL_OK; 1076 1216 } … … 1202 1342 tsd->obj_name = NULL; 1203 1343 tsd->tms_obj = NULL; 1344 tsd->stats = Tcl_NewObj(); 1345 Tcl_IncrRefCount( tsd->stats ); 1204 1346 } 1205 1347 return tsd; … … 1227 1369 if (tsd->obj_name) 1228 1370 Tcl_Free(tsd->obj_name); 1371 Tcl_DecrRefCount( tsd->stats ); 1229 1372 Tcl_Free((char*)tsd); 1230 1373 } … … 1647 1790 return TCL_ERROR; 1648 1791 } 1792 tsd->ComputeStats( uts ); 1793 1649 1794 if ( flagDating == 0 ) { 1650 1795 flagDating = 1; … … 1866 2011 tsd->tms_obj = uts; 1867 2012 2013 tsd->ComputeStats( uts ); 2014 2015 1868 2016 /* then alloc corresponding cursor */ 1869 2017 … … 2038 2186 char * type_name; 2039 2187 int acf_type; 2040 c har * valid_types[] = { "ACF", "PACF", "IACF", "IPACF" };2188 const char * valid_types[] = { "ACF", "PACF", "IACF", "IPACF" }; 2041 2189 #define NTYPES sizeof(valid_types)/sizeof(valid_types[0]) 2042 2190 size_t i; … … 2164 2312 } 2165 2313 2166 typedef BDat (*StatFunc)(BSyntaxObject *);2167 2168 struct SerieStats {2169 char * name;2170 StatFunc func;2171 };2172 2173 static SerieStats2174 stats_data[] = {2175 {"Count", StatCount},2176 {"Maximun", StatMax},2177 {"Minimun", StatMin},2178 {"Sum", StatSum},2179 {"Average", StatAverage},2180 {"Std. Dev.", StatStDs},2181 {"Varianze", StatVarianze},2182 {"Asimetry", StatAsimetry},2183 {"Kurtosis", StatKurtosis},2184 {"Median", StatMedian}2185 };2186 2187 #define NUMSTATS sizeof(stats_data)/sizeof(stats_data[0])2188 2189 2190 /*2191 *----------------------------------------------------------------------2192 *2193 * Tol_ComputeSerieStat --2194 *2195 * Implements the new Tcl "::tol::seriestat" command.2196 *2197 * tol::seriestat serieref2198 * -> {serie-name {list of stats names & values}}2199 *2200 * tol::seriestat serieref statname ?args?2201 * -> return the stat value. (not implemented yet)2202 *2203 * Results:2204 *2205 *2206 * Side effects:2207 * None.2208 *2209 *----------------------------------------------------------------------2210 */2211 2212 int Tol_ComputeSerieStat(Tcl_Interp * interp,2213 int objc, Tcl_Obj *CONST objv[],2214 Tcl_Obj * obj_result)2215 {2216 BUserTimeSerie * uts;2217 bool found;2218 2219 // uts = Tol_GetTimeSerie( interp, objv[0] );2220 uts = (BUserTimeSerie*)Tol_ResolveObject(interp, objv[0],2221 obj_result/*,GraSerie()*/);2222 if ( !uts ) {2223 return TCL_ERROR;2224 }2225 Tcl_Obj * listv[2];2226 if ( objc > 1 ) {2227 Tcl_Obj **stats;2228 stats = (Tcl_Obj**)Tcl_Alloc( sizeof(Tcl_Obj*)*2*(objc-1) );2229 //const int listsize = 2*(objc-1);2230 //Tcl_Obj * stats[listsize];2231 BDat dat;2232 2233 listv[0] = Tcl_NewStringObj(uts->Identify(),-1);2234 for ( size_t i = 0; i < size_t(objc-1); i++ ) {2235 found = false;2236 for ( size_t j = 0; j < NUMSTATS; j++ ) {2237 if (strcmp(Tcl_GetString(objv[i+1]),stats_data[j].name) == 0) {2238 found = true;2239 stats[2*i] = Tcl_NewStringObj(stats_data[j].name,-1);2240 dat = (*(stats_data[j].func))(uts);2241 if ( dat.IsKnown() )2242 stats[2*i+1] = Tcl_NewDoubleObj(dat.Value());2243 else {2244 BText name(dat.Name());2245 stats[2*i+1] = Tcl_NewStringObj(name,-1);2246 }2247 }2248 }2249 if (found == false) {2250 Tcl_AppendStringsToObj(obj_result, "bad statistics name '",2251 Tcl_GetString(objv[i+1]),"'", NULL);2252 Tcl_Free((char*)(stats));2253 return TCL_ERROR;2254 }2255 }2256 listv[1] = Tcl_NewListObj(2*(objc-1), stats);2257 Tcl_SetListObj(obj_result, 2, listv);2258 Tcl_Free((char*)(stats));2259 return TCL_OK;2260 2261 } else {2262 // {Count 20 ... Median 0.23}2263 const int listsize = 2*NUMSTATS;2264 Tcl_Obj * stats[listsize];2265 BDat dat;2266 2267 listv[0] = Tcl_NewStringObj(uts->Identify(),-1);2268 for ( size_t i = 0; i < NUMSTATS; i++ ) {2269 stats[2*i] = Tcl_NewStringObj(stats_data[i].name,-1);2270 dat = (*(stats_data[i].func))(uts);2271 if ( dat.IsKnown() )2272 stats[2*i+1] = Tcl_NewDoubleObj(dat.Value());2273 else {2274 BText name(dat.Name());2275 stats[2*i+1] = Tcl_NewStringObj(name,-1);2276 }2277 }2278 listv[1] = Tcl_NewListObj(listsize, stats);2279 Tcl_SetListObj(obj_result, 2, listv);2280 return TCL_OK;2281 }2282 2283 } -
toltcl/generic/toltclInt.h
r5f521b1 r5fbda58 281 281 extern 282 282 int Tol_ComputeSerieStat _ANSI_ARGS_((Tcl_Interp * interp, 283 int objc, Tcl_Obj *CONST objv[],284 Tcl_Obj * obj_result));283 int objc, Tcl_Obj *CONST objv[], 284 Tcl_Obj * obj_result)); 285 285 extern 286 286 int Tol_StopEvaluation _ANSI_ARGS_(());
Note: See TracChangeset
for help on using the changeset viewer.
