instantiate new objects

F

Felix Steffenhagen

Hello @ all,

i'm a newbie in python and have written a module for computations in a
bayesian network.

The module can be found at:
http://www.informatik.uni-freiburg.de/~steffenh/bayes.py

In this module i define four classes.
- cdp (conditional probability [distribution]) consisting of cdp_entry
objects
- graph ( a graph class )
- bayesNet ( the bayesian network, a subclass of graph )


My problem is the following:
I have a global method test() in the module, where i want to test my
implementation of the em-learning algorithm, for learning parameters in
a bayesian network.
When I import this module in the python environment and then run the
test method, everything seems to be ok, and the calculations that are
hardcoded in this method seems to be correct.
In the test method i instantiate a bayesNet object for the further
calculations.
The results that are computed and printed are probability distributions
in the bayesian network, but this is not important for the problem.
The problem comes when i want to run the test method again for a second
time. What happens is that the "same" expressions/computations listed
in the test method leads to another results, even if the commands are
the same.
I can only imagine that this comes out of some objects that are not
destroyed and influence the new bayesNet object that is created there.

If there is a problem with the instantiations, it is in the test method
which is at the end of the file bayes.py (see above)
Does someone see the problem there???

If you need some more information about what happens in the module
please write me a mail, but i hope the comments are enough to understand
the problem.

If you think this is too much off-topic we can discuss the problem out
of the newsgroup.

thanks in advance,
Felix Steffenhagen
 
M

Michael Spencer

Felix Steffenhagen wrote:
[snip]
> In:

> [bayes.test gives different results each time it is called]

Without looking in the slightest at what you are implementing or how, this
implies that state is maintained between calls to test

The question is where/how is the state maintained?

1) global module variables? - you don't have any
2) attributes of global objects?

I used: ... return dict((name,getattr(obj,name)) for name in dir(obj) if not
callable(getattr(obj, name)) and name not in ("__doc__","__module__"))

to verify that the classes are not gaining (non-callable) attributes

3) as mutable default parameters?

See:
line 135: def __init__(self,V,E,p=[]):
line 150: def generate_cpd(self,node, rest, values={}):
line 360: def computeJPD(self, rest, values={}):

I guess one (or more) of these is the culprit

Before running:

Python 2.4 (#60, Nov 30 2004, 11:49:19) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> bayesNet.generate_cpd.func_defaults ({},)
>>> bayesNet.__init__.func_defaults ([],)
>>> bayesNet.computeJPD.func_defaults ({},)
>>> test()
V = {'a': [0, 1], 'b': [0, 1]}
[snip results]

After test:
>>> bayesNet.generate_cpd.func_defaults ({'a': 1, 'b': 1},)
>>> bayesNet.__init__.func_defaults ([],)
>>> bayesNet.computeJPD.func_defaults ({'a': 1, 'b': 1},)
>>>

HTH

Michael
 
F

Felix Steffenhagen

The default mutual parameters in the method bayes.generate_cpd(...)
was the problem, thanks alot for the hint and for this code snippet
to find such problems :).

Greetings,
Felix

Michael said:
Without looking in the slightest at what you are implementing or how,
this implies that state is maintained between calls to test

The question is where/how is the state maintained?
.
>.
>.
3) as mutable default parameters?

See:
line 135: def __init__(self,V,E,p=[]):
line 150: def generate_cpd(self,node, rest, values={}):
line 360: def computeJPD(self, rest, values={}):

I guess one (or more) of these is the culprit

Before running:

Python 2.4 (#60, Nov 30 2004, 11:49:19) [MSC v.1310 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
bayesNet.generate_cpd.func_defaults ({},)
bayesNet.__init__.func_defaults ([],)
bayesNet.computeJPD.func_defaults ({},)
test()
V = {'a': [0, 1], 'b': [0, 1]}
[snip results]

After test:
bayesNet.generate_cpd.func_defaults ({'a': 1, 'b': 1},)
bayesNet.__init__.func_defaults ([],)
bayesNet.computeJPD.func_defaults ({'a': 1, 'b': 1},)

HTH

Michael
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,057
Latest member
KetoBeezACVGummies

Latest Threads

Top