Bug in get_edges_prob for layered SBM

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Bug in get_edges_prob for layered SBM

anatolweg

Hi,

 

There seems to be problem with get_edges_prob for the layered SBM. Here is a minimal example:

 

import graph_tool.all as gt

import numpy as np

gr=gt.generate_sbm(b=np.array([0]*500+[1]*500),probs=np.array([[10000,200],[200,10000]]))

etype=gr.new_edge_property('int')

gr.ep.etype=etype

t=0

for e in gr.edges():

    gr.ep.etype[e]=t%4

    t+=1

state = gt.minimize_nested_blockmodel_dl(gr, deg_corr=True,layers=True,state_args=dict(ec=gr.ep.etype,layers=True))

print(state.get_edges_prob(missing=[[2,32,0]],spurious=[]))

print(state.get_edges_prob(missing=[[2,32,0],[3,4,2]],spurious=[]))

print(state.get_edges_prob(missing=[[2,32,0],[3,4,2],[36,7,0]],spurious=[]))

pr=state.get_edges_prob(missing=[[2,32,0],[3,4,2]],spurious=gr.get_edges([gr.ep.etype])[:3])

 

Output:

0.0

-7.883180576649465

-7.883180576649465

---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-11-1f73a43d95dd> in <module>

     12 print(state.get_edges_prob(missing=[[2,32,0],[3,4,2]],spurious=[]))

     13 print(state.get_edges_prob(missing=[[2,32,0],[3,4,2],[36,7,0]],spurious=[]))

---> 14 pr=state.get_edges_prob(missing=[[2,32,0],[3,4,2]],spurious=gr.get_edges([gr.ep.etype])[:3])

 

/usr/lib/python3/dist-packages/graph_tool/inference/nested_blockmodel.py in get_edges_prob(self, missing, spurious, entropy_args)

    499                     lstate._state.clear_egroups()

    500

--> 501             L += lstate.get_edges_prob(missing, spurious, entropy_args=eargs)

    502             if isinstance(self.levels[0], LayeredBlockState):

    503                 missing = [(lstate.b[u], lstate.b[v], l_) for u, v, l_ in missing]

 

/usr/lib/python3/dist-packages/graph_tool/inference/layered_blockmodel.py in get_edges_prob(self, missing, spurious, entropy_args)

    896                 if e is None:

    897                     raise ValueError("edge not found: (%d, %d, %d)" % \

--> 898                                      (int(u), int(v), l[0]))

    899

    900                 if state.is_weighted:

 

ValueError: edge not found: (3, 4, 2)

 

The error occurs only when spurious edges are included but even without spurious edges the outputs above seem to be inaccurate.  I tried to resolve the issue myself but couldn’t make it work.

 

Best wishes,

Anatol


_______________________________________________
graph-tool mailing list
[hidden email]
https://lists.skewed.de/mailman/listinfo/graph-tool
Reply | Threaded
Open this post in threaded view
|

Re: Bug in get_edges_prob for layered SBM

Tiago Peixoto
Administrator
Hi,

Thanks for the bug report, and the succinct example!

Could you please open an issue for it in gitlab, so we can keep track of
this more easily?

Thanks!

Best,
Tiago

Am 28.04.20 um 15:26 schrieb [hidden email]:

> Hi,
>
>  
>
> There seems to be problem with get_edges_prob for the layered SBM. Here
> is a minimal example:
>
>  
>
> import graph_tool.all as gt
>
> import numpy as np
>
> gr=gt.generate_sbm(b=np.array([0]*500+[1]*500),probs=np.array([[10000,200],[200,10000]]))
>
> etype=gr.new_edge_property('int')
>
> gr.ep.etype=etype
>
> t=0
>
> for e in gr.edges():
>
>     gr.ep.etype[e]=t%4
>
>     t+=1
>
> state = gt.minimize_nested_blockmodel_dl(gr,
> deg_corr=True,layers=True,state_args=dict(ec=gr.ep.etype,layers=True))
>
> print(state.get_edges_prob(missing=[[2,32,0]],spurious=[]))
>
> print(state.get_edges_prob(missing=[[2,32,0],[3,4,2]],spurious=[]))
>
> print(state.get_edges_prob(missing=[[2,32,0],[3,4,2],[36,7,0]],spurious=[]))
>
> pr=state.get_edges_prob(missing=[[2,32,0],[3,4,2]],spurious=gr.get_edges([gr.ep.etype])[:3])
>
>  
>
> Output:
>
> 0.0
>
> -7.883180576649465
>
> -7.883180576649465
>
> ---------------------------------------------------------------------------
>
> ValueError                                Traceback (most recent call last)
>
> <ipython-input-11-1f73a43d95dd> in <module>
>
>      12 print(state.get_edges_prob(missing=[[2,32,0],[3,4,2]],spurious=[]))
>
>      13
> print(state.get_edges_prob(missing=[[2,32,0],[3,4,2],[36,7,0]],spurious=[]))
>
> ---> 14
> pr=state.get_edges_prob(missing=[[2,32,0],[3,4,2]],spurious=gr.get_edges([gr.ep.etype])[:3])
>
>  
>
> /usr/lib/python3/dist-packages/graph_tool/inference/nested_blockmodel.py
> in get_edges_prob(self, missing, spurious, entropy_args)
>
>     499                     lstate._state.clear_egroups()
>
>     500
>
> --> 501             L += lstate.get_edges_prob(missing, spurious,
> entropy_args=eargs)
>
>     502             if isinstance(self.levels[0], LayeredBlockState):
>
>     503                 missing = [(lstate.b[u], lstate.b[v], l_) for u,
> v, l_ in missing]
>
>  
>
> /usr/lib/python3/dist-packages/graph_tool/inference/layered_blockmodel.py in
> get_edges_prob(self, missing, spurious, entropy_args)
>
>     896                 if e is None:
>
>     897                     raise ValueError("edge not found: (%d, %d,
> %d)" % \
>
> --> 898                                      (int(u), int(v), l[0]))
>
>     899
>
>     900                 if state.is_weighted:
>
>  
>
> ValueError: edge not found: (3, 4, 2)
>
>  
>
> The error occurs only when spurious edges are included but even without
> spurious edges the outputs above seem to be inaccurate.  I tried to
> resolve the issue myself but couldn’t make it work.
>
>  
>
> Best wishes,
>
> Anatol
>
>
> _______________________________________________
> graph-tool mailing list
> [hidden email]
> https://lists.skewed.de/mailman/listinfo/graph-tool
>

--
Tiago de Paula Peixoto <[hidden email]>


_______________________________________________
graph-tool mailing list
[hidden email]
https://lists.skewed.de/mailman/listinfo/graph-tool

signature.asc (849 bytes) Download Attachment
--
Tiago de Paula Peixoto <tiago@skewed.de>