Changeset 5fbda58 in tol for toltcl/generic


Ignore:
Timestamp:
Jan 6, 2012, 12:07:51 PM (15 years ago)
Author:
Jorge Pérez <josp.jorge@…>
Branches:
1941-docker-image-to-test, devel, master
Children:
a49be3d
Parents:
5f521b1
Message:

refs #1388, Se implementa el metodo stats para el comando seriegrp. El grupo de series precalcula los estadísticos.

git-svn-id: ​https://www.tol-project.org/svn/tolp/trunk@3990 be4846ae-f051-483a-831f-b64e7d08527f

Location:
toltcl/generic
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • toltcl/generic/tolsergrp.cpp

    r5f521b1 r5fbda58  
    8181#define TICK_TOL  2
    8282#define GROW_TICK_DATA 10
     83
     84typedef BDat (*StatFunc)(BSyntaxObject *);
     85
     86struct SerieStats {
     87  const char * name;
     88  StatFunc func;
     89};
     90
     91static SerieStats
     92stats_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
     107static
     108Tcl_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
     148int 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}
    83205
    84206struct Tol_TicksData {
    … …  
    411533    Tcl_Obj ** X, ** Y;
    412534#endif
     535  Tcl_Obj *stats;
    413536  char * name;
    414537  /* name of the syntax object, may be equal to name */
    … …  
    419542                  Tcl_Interp * interp,
    420543                  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  }
    421554};
    422555
    … …  
    761894{
    762895  int tcl_code;
    763   Tol_SerieGroup * sgrp;
     896  Tol_SerieGroup * sgrp = NULL;
    764897  Tcl_CmdInfo cmd_info;
    765898  char * sgrp_name = Tcl_GetString(series[0]);
    … …  
    860993}
    861994
     995
    862996/*
    863997 *  Tol_CreateSerieGrp --
    … …  
    9701104 *                             with corresponding values.
    9711105 *
    972  *      seriegrp serie idx reference -> return 
     1106 *      seriegrp serie idx reference -> return
     1107 *
     1108 *      seriegrp serie idx stats -> return the statistics for the serie
    9731109 *
    9741110 *      seriegrp format ?strfmt?
    … …  
    10731209      if (!strcmp(arg,"reference")) {
    10741210        Tcl_AppendResult(interp,sdata->name,NULL);
     1211        return TCL_OK;
     1212      }
     1213      if ( !strcmp(arg,"stats") ) {
     1214        Tcl_SetObjResult( interp, sdata->stats );
    10751215        return TCL_OK;
    10761216      }
    … …  
    12021342    tsd->obj_name = NULL;
    12031343    tsd->tms_obj = NULL;
     1344    tsd->stats = Tcl_NewObj();
     1345    Tcl_IncrRefCount( tsd->stats );
    12041346  }
    12051347  return tsd;
    … …  
    12271369    if (tsd->obj_name)
    12281370      Tcl_Free(tsd->obj_name);
     1371    Tcl_DecrRefCount( tsd->stats );
    12291372    Tcl_Free((char*)tsd);
    12301373  }
    … …  
    16471790      return TCL_ERROR;
    16481791    }
     1792    tsd->ComputeStats( uts );
     1793
    16491794    if ( flagDating == 0 ) {
    16501795      flagDating = 1;
    … …  
    18662011    tsd->tms_obj = uts;
    18672012
     2013    tsd->ComputeStats( uts );
     2014
     2015
    18682016    /* then alloc corresponding cursor */
    18692017   
    … …  
    20382186  char * type_name;
    20392187  int acf_type;
    2040   char * valid_types[] = { "ACF", "PACF", "IACF", "IPACF" };
     2188  const char * valid_types[] = { "ACF", "PACF", "IACF", "IPACF" };
    20412189#define NTYPES sizeof(valid_types)/sizeof(valid_types[0])
    20422190  size_t i;
    … …  
    21642312}
    21652313
    2166 typedef BDat (*StatFunc)(BSyntaxObject *);
    2167 
    2168 struct SerieStats {
    2169   char * name;
    2170   StatFunc func;
    2171 };
    2172 
    2173 static SerieStats
    2174 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 serieref     
    2198  *           -> {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  
    281281extern
    282282int 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));
    285285extern
    286286int Tol_StopEvaluation _ANSI_ARGS_(());
Note: See TracChangeset for help on using the changeset viewer.