Hey Ayrat,

DiscretePDF::choose() is supposed to return nodes uniformly distributed over 
the sum of the weights of all the nodes. That is, a node with weight 2N is 
twice as likely to be chosen as a node with weight N. It's supposed to be 
uniform, however, so the results you report are worrisome.

The class maintains the sum of the weights of the left/right subtrees at each 
node, and choose() uses the random value to guide its traversal of the tree.

Daniel, Christi, et. al, if there is a bug in DiscretePDF, it could explain the 
coverage problems we've been discussing. As I've indicated, I think the problem 
is in the searchers somewhere.

-David

On Jan 31, 2011, at 12:42 PM, Ayrat Khalimov wrote:

> Hi, All, 
> During testing different path exploration strategies (WeightedRandomSearcher 
> with Depth WeightType)
> I have encountered an interesting class - DiscretePDF.
> What is its purpose?
> Ok, the first purpose is clear - it is an associative set (looks like 
> red-black tree).
> But what about its choose method?
> Does it choose states according to some probability distribution of values? 
> If yes - then what distribution does it use? The more weight the greater/less 
> probability? How it take into account states' depth (or states' weight) ?
> (I found no known to me distribution of chosen values during experiments.. 
> please correct if this is wrong)
> 
> Also what is strange is that the location of the node in the DiscretePDF 
> internal tree depends on memory address of inserted value. 
> And child-parent connection depends on these memory addresses. And doesn't 
> depend on weights.
> But the result of choose method depends on the total weight of the node (with 
> kids weights) and hence on the structure of the internal tree. And hence the 
> result of choose method depends on memory addresses of ExecutionState 
> objects..
> 
> I've made an experiment. When tree size reach 30 states, 10000 samples are 
> chosen:
> if(nodesCount > 30) {
>     for(int i = 0; i < 10000; ++i) {
>       ExecutionState* state = states->choose(theRNG.getDoubleL());
>       std::cerr << state->weight << "\t" << states->getFamilyWeight(state) << 
> std::endl;
>     }
> }
> 
> Results:
> here is two distributions of chosen values:
> 1. own node weight (range of own weight, the number of values chosen in this 
> range)
> 0.05    4003
> 0.1     0
> 0.15    0
> 0.2     0
> 0.25    1993
> 0.3     0
> 0.35    0
> 0.4     0
> 0.5     3880
> 
> 2. sum node weight (weight of node + weights of its children):
> 0.1     1784
> 0.2     554
> 0.3     1986
> 0.4     0
> 0.5     0
> 0.6     0
> 0.7     0
> 0.8     4157
> 1.3     1519
> 
> As you can see - quite a strange distribution.
> (Also checked the random generator - it is ok - random distributed).
> 
> Please comment on these questions.
> 
> Thanks!
> 
> --
> Sincerely, 
> Ayrat Khalimov,
> Russia, Uljanovsk
> 
> 
> _______________________________________________
> klee-dev mailing list
> klee-dev at keeda.stanford.edu
> http://keeda.Stanford.EDU/mailman/listinfo/klee-dev

Reply via email to