46
46
#include "EST_TKVL.h"
47
47
#include "EST_simplestats.h"
49
/* We share ints and pointers for two types of probability distributions */
50
/* The know discrete sets can be indexed by ints which is *much* faster */
51
/* the indices pass around a pointers but the lower part contain ints in */
52
/* the discrete case */
53
/* On 64bit architectures this is a issue so we need have some macros */
54
/* to help us here. */
56
const int est_64to32(void *c)
57
{ /* this returns the bottom end of the pointer as an unsigned int */
58
/* I believe this is a safe way to do it, we check the bits in the */
59
/* 64 bit int and multiply them out in the 32 bit one */
60
/* there might be better ways, but I think you'd need to think about */
68
for (i=0,d=0,x=1; i<24; i++)
78
/* #define tprob_int(X) ((sizeof(void *) != 8) ? est_64to32(X) : (int)X) */
79
#define tprob_int(X) (est_64to32(X))
49
82
EST_DiscreteProbDistribution::EST_DiscreteProbDistribution(const EST_Discrete *d,
50
83
const double n_samples, const EST_DVector &counts)
274
328
cerr << "ProbDistribution: can't access string type pd with int\n";
331
void EST_DiscreteProbDistribution::override_frequency(EST_Litem *i,double c)
333
if (type == tprob_discrete)
334
icounts[tprob_int(i)] = c;
336
cerr << "ProbDistribution: can't access string type pd with int\n";
277
339
double EST_DiscreteProbDistribution::entropy() const
279
341
// Returns the entropy of the current distribution
307
369
// For iterating through members of a probability distribution
308
int EST_DiscreteProbDistribution::item_start(void) const
310
if (type == tprob_discrete)
313
return (int)scounts.list.head();
316
int EST_DiscreteProbDistribution::item_end(int idx) const
318
if (type == tprob_discrete)
319
return (idx >= icounts.length());
321
return ((EST_Litem *)idx == 0);
324
int EST_DiscreteProbDistribution::item_next(int idx) const
326
if (type == tprob_discrete)
329
return (int)next((EST_Litem *)idx);
332
const EST_String &EST_DiscreteProbDistribution::item_name(int idx) const
334
if (type == tprob_discrete)
335
return discrete->name(idx);
337
return scounts.list((EST_Litem *)idx).k;
340
void EST_DiscreteProbDistribution::item_freq(int idx,EST_String &s,double &freq) const
342
if (type == tprob_discrete)
344
s = discrete->name(idx);
349
s = scounts.list((EST_Litem *)idx).k;
350
freq = scounts.list((EST_Litem *)idx).v;
354
void EST_DiscreteProbDistribution::item_prob(int idx,EST_String &s,double &prob) const
356
if (type == tprob_discrete)
358
prob = probability(idx);
359
s = discrete->name(idx);
363
s = scounts.list((EST_Litem *)idx).k;
364
prob = (double)scounts.list((EST_Litem *)idx).v/num_samples;
370
EST_Litem *EST_DiscreteProbDistribution::item_start(void) const
372
if (type == tprob_discrete)
375
return scounts.list.head();
378
int EST_DiscreteProbDistribution::item_end(EST_Litem *idx) const
380
if (type == tprob_discrete)
381
return (tprob_int(idx) >= icounts.length());
386
EST_Litem *EST_DiscreteProbDistribution::item_next(EST_Litem *idx) const
388
if (type == tprob_discrete)
389
return (EST_Litem *)(((unsigned char *)idx)+1);
394
const EST_String &EST_DiscreteProbDistribution::item_name(EST_Litem *idx) const
396
if (type == tprob_discrete)
397
return discrete->name(tprob_int(idx));
399
return scounts.list(idx).k;
402
void EST_DiscreteProbDistribution::item_freq(EST_Litem *idx,EST_String &s,double &freq) const
404
if (type == tprob_discrete)
406
s = discrete->name(tprob_int(idx));
407
freq = icounts(tprob_int(idx));
411
s = scounts.list(idx).k;
412
freq = scounts.list(idx).v;
416
void EST_DiscreteProbDistribution::item_prob(EST_Litem *idx,EST_String &s,double &prob) const
418
if (type == tprob_discrete)
420
prob = probability(tprob_int(idx));
421
s = discrete->name(tprob_int(idx));
425
s = scounts.list(idx).k;
426
prob = (double)scounts.list(idx).v/num_samples;
368
430
ostream & operator<<(ostream &s, const EST_DiscreteProbDistribution &pd)
370
432
// Output best with probabilities