Commit 5908da56 authored by Tiago Peixoto's avatar Tiago Peixoto
Browse files

Implement "block_list" parameter in mcmc_sweep()

parent dfd68d0d
......@@ -236,18 +236,20 @@ struct move_sweep_dispatch
{
move_sweep_dispatch(Eprop eweight, Vprop vweight, boost::any egroups,
VEprop esrcpos, VEprop etgtpos, Vprop label,
vector<int64_t>& vlist, vector<int64_t>& target_list,
bool deg_corr, bool dense, bool multigraph, double beta,
bool sequential, bool parallel, bool random_move,
double c, bool verbose, size_t max_edge_index,
size_t nmerges, size_t niter, Vprop merge_map,
partition_stats_t& partition_stats, rng_t& rng,
double& S, size_t& nmoves, GraphInterface& bgi)
vector<int64_t>& vlist, vector<int64_t>& block_list,
vector<int64_t>& target_list, bool deg_corr, bool dense,
bool multigraph, double beta, bool sequential,
bool parallel, bool random_move, double c, bool verbose,
size_t max_edge_index, size_t nmerges, size_t niter,
Vprop merge_map, partition_stats_t& partition_stats,
rng_t& rng, double& S, size_t& nmoves,
GraphInterface& bgi)
: eweight(eweight), vweight(vweight), oegroups(egroups), esrcpos(esrcpos),
etgtpos(etgtpos), label(label), vlist(vlist), target_list(target_list),
deg_corr(deg_corr), dense(dense), multigraph(multigraph), beta(beta),
sequential(sequential), parallel(parallel), random_move(random_move),
etgtpos(etgtpos), label(label), vlist(vlist), block_list(block_list),
target_list(target_list), deg_corr(deg_corr), dense(dense),
multigraph(multigraph), beta(beta), sequential(sequential),
parallel(parallel), random_move(random_move),
c(c), verbose(verbose), max_edge_index(max_edge_index),
nmerges(nmerges), niter(niter), merge_map(merge_map),
partition_stats(partition_stats), rng(rng), S(S),
......@@ -262,6 +264,7 @@ struct move_sweep_dispatch
Vprop label;
size_t n;
vector<int64_t>& vlist;
vector<int64_t>& block_list;
vector<int64_t>& target_list;
bool deg_corr;
bool dense;
......@@ -405,8 +408,9 @@ struct move_sweep_dispatch
wr.get_unchecked(num_vertices(bg)),
b.get_unchecked(num_vertices(g)),
cv, vmap,
label.get_unchecked(num_vertices(bg)), vlist, deg_corr,
dense, multigraph, beta,
label.get_unchecked(num_vertices(bg)),
vlist, block_list,
deg_corr, dense, multigraph, beta,
eweight.get_unchecked(max_edge_index),
vweight.get_unchecked(num_vertices(g)),
g, sequential, parallel, random_move, c,
......@@ -438,7 +442,9 @@ boost::python::object do_move_sweep(GraphInterface& gi, GraphInterface& bgi,
boost::any cavity_sampler, boost::any omrs,
boost::any omrp, boost::any omrm,
boost::any owr, boost::any ob,
boost::any olabel, vector<int64_t>& vlist,
boost::any olabel,
vector<int64_t>& vlist,
vector<int64_t>& block_list,
vector<int64_t>& target_list,
bool deg_corr, bool dense, bool multigraph,
boost::any oeweight, boost::any ovweight,
......@@ -480,7 +486,8 @@ boost::python::object do_move_sweep(GraphInterface& gi, GraphInterface& bgi,
run_action<graph_tool::detail::all_graph_views, boost::mpl::true_>()
(gi, std::bind(move_sweep_dispatch<emap_t, vmap_t, vemap_t>
(eweight, vweight, oegroups, esrcpos, etgtpos,
label, vlist, target_list, deg_corr, dense, multigraph,
label, vlist, block_list,
target_list, deg_corr, dense, multigraph,
beta, sequential, parallel, random_move, c, verbose,
gi.GetMaxEdgeIndex(), nmerges, niter, merge_map,
partition_stats, rng, S, nmoves, bgi),
......
......@@ -2644,11 +2644,12 @@ template <class Graph, class Vprop, class VVprop, class VLprop,
class Eprop, class RNG, class BlockState, class MEntries>
void move_sweep(vector<BlockState>& states, vector<MEntries>& m_entries_r,
Vprop wr, Vprop b, VLprop cv, VVprop vmap, Vprop clabel,
vector<int64_t>& vlist, bool deg_corr, bool dense, bool multigraph,
double beta, Eprop eweight, Vprop vweight, Graph& g,
bool sequential, bool parallel, bool random_move, double c,
size_t nmerges, Vprop merge_map, size_t niter, size_t B,
bool verbose, RNG& rng, double& S, size_t& nmoves)
vector<int64_t>& vlist, vector<int64_t>& block_list,
bool deg_corr, bool dense, bool multigraph, double beta,
Eprop eweight, Vprop vweight, Graph& g, bool sequential,
bool parallel, bool random_move, double c, size_t nmerges,
Vprop merge_map, size_t niter, size_t B, bool verbose, RNG& rng,
double& S, size_t& nmoves)
{
typedef typename graph_traits<Graph>::vertex_descriptor vertex_t;
......@@ -2684,7 +2685,7 @@ void move_sweep(vector<BlockState>& states, vector<MEntries>& m_entries_r,
if (nmerges > 0 || parallel)
best_move.resize(num_vertices(g), make_pair(vertex_t(0), numeric_limits<double>::max()));
std::uniform_int_distribution<size_t> s_rand(0, B - 1);
std::uniform_int_distribution<size_t> s_rand(0, block_list.size() - 1);
vector<MEntries> m_entries = m_entries_r;
......@@ -2734,7 +2735,7 @@ void move_sweep(vector<BlockState>& states, vector<MEntries>& m_entries_r,
past_moves.clear();
// attempt random block
vertex_t s = s_rand(*rngs[tid]);
vertex_t s = block_list[s_rand(*rngs[tid])];
if (!random_move && total_degreeS()(v, g) > 0)
{
......
......@@ -56,6 +56,7 @@ struct cov_move_sweep_dispatch
vector<std::reference_wrapper<VEprop>>& esrcpos,
vector<std::reference_wrapper<VEprop>>& etgtpos,
Vprop& label, vector<int64_t>& vlist,
vector<int64_t>& block_list,
vector<int64_t>& target_blocks, bool deg_corr,
bool dense, bool multigraph, double beta,
bool sequential, bool parallel, bool random_move,
......@@ -76,7 +77,7 @@ struct cov_move_sweep_dispatch
: ce(ce), cv(cv), vmap(vmap), eweight(eweight), vweight(vweight),
oegroups(egroups), esrcpos(esrcpos), etgtpos(etgtpos), label(label),
vlist(vlist), target_blocks(target_blocks),
vlist(vlist), block_list(block_list), target_blocks(target_blocks),
deg_corr(deg_corr), dense(dense), multigraph(multigraph), beta(beta),
sequential(sequential), parallel(parallel), random_move(random_move),
node_coherent(node_coherent), confine_layers(confine_layers),
......@@ -102,6 +103,7 @@ struct cov_move_sweep_dispatch
Vprop& label;
size_t n;
vector<int64_t>& vlist;
vector<int64_t>& block_list;
vector<int64_t>& target_blocks;
bool deg_corr;
bool dense;
......@@ -333,7 +335,7 @@ struct cov_move_sweep_dispatch
cv.get_unchecked(num_vertices(g)),
vmap.get_unchecked(num_vertices(g)),
label.get_unchecked(B),
vlist, deg_corr,
vlist, block_list, deg_corr,
dense, multigraph, beta,
eweight[0].get().get_unchecked(max_edge_index[0]),
vweight[0].get().get_unchecked(num_vertices(g)),
......@@ -407,29 +409,35 @@ struct cov_move_sweep_dispatch
{
if (!node_coherent)
{
move_sweep_overlap(states, m_entries, overlap_stats[0].get(),
move_sweep_overlap(states, m_entries,
overlap_stats[0].get(),
wr[0].get().get_unchecked(B),
b.get_unchecked(num_vertices(g)), cv,
vmap, label.get_unchecked(B),
vlist, deg_corr, dense, multigraph, beta,
vweight[0].get().get_unchecked(num_vertices(g)), g,
sequential, parallel, random_move, c, niter,
B, verbose, rng, S, nmoves);
b.get_unchecked(num_vertices(g)),
cv, vmap, label.get_unchecked(B),
vlist, block_list, deg_corr, dense,
multigraph, beta,
vweight[0].get().get_unchecked(num_vertices(g)),
g, sequential, parallel, random_move,
c, niter, B, verbose, rng, S,
nmoves);
}
else
{
vector<EntrySet<Graph>> m_entries;
for (auto& state : states)
m_entries.emplace_back(num_vertices(state.bg));
coherent_move_sweep_overlap(states, m_entries, overlap_stats[0].get(),
coherent_move_sweep_overlap(states, m_entries,
overlap_stats[0].get(),
wr[0].get().get_unchecked(B),
b.get_unchecked(num_vertices(g)), cv,
vmap, label.get_unchecked(B),
vlist, deg_corr, dense, multigraph, beta,
vweight[0].get().get_unchecked(num_vertices(g)), g,
sequential, random_move, c,
confine_layers, niter,
B, rng, S, nmoves);
b.get_unchecked(num_vertices(g)),
cv, vmap,
label.get_unchecked(B),
vlist, block_list, deg_corr,
dense, multigraph, beta,
vweight[0].get().get_unchecked(num_vertices(g)),
g, sequential, random_move,
c, confine_layers, niter, B,
rng, S, nmoves);
}
}
else
......@@ -438,7 +446,7 @@ struct cov_move_sweep_dispatch
wr[0].get().get_unchecked(B),
b.get_unchecked(num_vertices(g)), ce, cv,
vmap, label.get_unchecked(B), vlist,
deg_corr, dense, multigraph, g,
block_list, deg_corr, dense, multigraph, g,
random_move, confine_layers, nmerges, niter,
B, rng, S, nmoves);
}
......@@ -586,7 +594,8 @@ boost::python::object do_cov_move_sweep(GraphInterface& gi,
auto slave = from_list<bool>(oslave);
vector<int64_t>& vlist = boost::python::extract<vector<int64_t>&>(ovlist[0]);
vector<int64_t>& target_blocks = boost::python::extract<vector<int64_t>&>(ovlist[1]);
vector<int64_t>& block_list = boost::python::extract<vector<int64_t>&>(ovlist[1]);
vector<int64_t>& target_blocks = boost::python::extract<vector<int64_t>&>(ovlist[2]);
bool node_coherent = python::extract<bool>(onode_coherent[0]);
bool confine_layers = python::extract<bool>(onode_coherent[1]);
......@@ -594,9 +603,9 @@ boost::python::object do_cov_move_sweep(GraphInterface& gi,
run_action<graph_tool::detail::all_graph_views, boost::mpl::true_>()
(gi, std::bind(cov_move_sweep_dispatch<emap_t, vmap_t, vvmap_t, emap_t, bmap_t>
(ce, cv, vmap, eweight, vweight, egroups, esrcpos, etgtpos,
label, vlist, target_blocks, deg_corr, dense, multigraph, beta,
sequential, parallel, random_move, node_coherent,
confine_layers, c, verbose,
label, vlist, block_list, target_blocks, deg_corr, dense,
multigraph, beta, sequential, parallel, random_move,
node_coherent, confine_layers, c, verbose,
gi.GetMaxEdgeIndex(), eidx, nmerges, niter, merge_map,
partition_stats, overlap_partition_stats, overlap_stats,
master, slave, rng, S, nmoves, bgi, bmap, brmap, free_blocks, B),
......
......@@ -52,6 +52,7 @@ struct move_sweep_overlap_dispatch
boost::any egroups, VEprop esrcpos,
VEprop etgtpos, Vprop label,
vector<int64_t>& vlist,
vector<int64_t>& block_list,
vector<int64_t>& target_blocks,
bool deg_corr, bool dense, bool multigraph,
bool parallel_edges, double beta,
......@@ -65,11 +66,11 @@ struct move_sweep_overlap_dispatch
GraphInterface& bgi)
: eweight(eweight), vweight(vweight), oegroups(egroups), esrcpos(esrcpos),
etgtpos(etgtpos), label(label), vlist(vlist), target_blocks(target_blocks),
deg_corr(deg_corr), dense(dense), multigraph(multigraph),
parallel_edges(parallel_edges), beta(beta), sequential(sequential),
parallel(parallel), random_move(random_move), c(c),
node_coherent(node_coherent), verbose(verbose),
etgtpos(etgtpos), label(label), vlist(vlist), block_list(block_list),
target_blocks(target_blocks), deg_corr(deg_corr), dense(dense),
multigraph(multigraph), parallel_edges(parallel_edges), beta(beta),
sequential(sequential), parallel(parallel), random_move(random_move),
c(c), node_coherent(node_coherent), verbose(verbose),
max_edge_index(max_edge_index), nmerges(nmerges),
niter(niter), merge_map(merge_map), overlap_stats(overlap_stats),
partition_stats(partition_stats), rng(rng), S(S), nmoves(nmoves), bgi(bgi)
......@@ -83,6 +84,7 @@ struct move_sweep_overlap_dispatch
Vprop label;
size_t n;
vector<int64_t>& vlist;
vector<int64_t>& block_list;
vector<int64_t>& target_blocks;
bool deg_corr;
bool dense;
......@@ -222,7 +224,8 @@ struct move_sweep_overlap_dispatch
wr.get_unchecked(num_vertices(bg)),
b.get_unchecked(num_vertices(g)), cv,
vmap, label.get_unchecked(num_vertices(bg)),
vlist, deg_corr, dense, multigraph, beta,
vlist, block_list, deg_corr, dense,
multigraph, beta,
vweight.get_unchecked(num_vertices(g)), g,
sequential, parallel, random_move, c, niter,
num_vertices(bg), verbose, rng, S, nmoves);
......@@ -234,7 +237,8 @@ struct move_sweep_overlap_dispatch
wr.get_unchecked(num_vertices(bg)),
b.get_unchecked(num_vertices(g)), cv,
vmap, label.get_unchecked(num_vertices(bg)),
vlist, deg_corr, dense, multigraph, beta,
vlist, block_list, deg_corr,
dense, multigraph, beta,
vweight.get_unchecked(num_vertices(g)), g,
sequential, random_move, c,
false, niter,
......@@ -245,11 +249,12 @@ struct move_sweep_overlap_dispatch
{
merge_sweep_overlap(states, m_entries, overlap_stats,
wr.get_unchecked(num_vertices(bg)),
b.get_unchecked(num_vertices(g)), ce, cv, vmap,
label.get_unchecked(num_vertices(bg)), vlist,
deg_corr, dense, multigraph, g, random_move,
false, nmerges, niter,
num_vertices(bg), rng, S, nmoves);
b.get_unchecked(num_vertices(g)), ce, cv,
vmap,
label.get_unchecked(num_vertices(bg)),
vlist, block_list, deg_corr, dense,
multigraph, g, random_move, false, nmerges,
niter, num_vertices(bg), rng, S, nmoves);
}
}
else
......@@ -276,8 +281,8 @@ do_move_sweep_overlap(GraphInterface& gi, GraphInterface& bgi, boost::any& emat,
boost::any sampler, boost::any cavity_sampler,
boost::any omrs, boost::any omrp, boost::any omrm,
boost::any owr, boost::any ob, boost::any olabel,
vector<int64_t>& vlist, vector<int64_t>& target_blocks,
bool deg_corr, bool dense,
vector<int64_t>& vlist, vector<int64_t>& block_list,
vector<int64_t>& target_blocks, bool deg_corr, bool dense,
bool multigraph, bool parallel_edges, boost::any oeweight,
boost::any ovweight, boost::any oegroups,
boost::any oesrcpos, boost::any oetgtpos, double beta,
......@@ -317,11 +322,11 @@ do_move_sweep_overlap(GraphInterface& gi, GraphInterface& bgi, boost::any& emat,
run_action<graph_tool::detail::all_graph_views, boost::mpl::true_>()
(gi, std::bind(move_sweep_overlap_dispatch<emap_t, vmap_t, vemap_t>
(eweight, vweight, oegroups, esrcpos, etgtpos,
label, vlist, target_blocks, deg_corr, dense, multigraph,
parallel_edges, beta, sequential, parallel, random_move,
c, node_coherent, verbose, gi.GetMaxEdgeIndex(), nmerges,
niter, merge_map, overlap_stats, partition_stats, rng, S,
nmoves, bgi),
label, vlist, block_list, target_blocks, deg_corr, dense,
multigraph, parallel_edges, beta, sequential, parallel,
random_move, c, node_coherent, verbose, gi.GetMaxEdgeIndex(),
nmerges, niter, merge_map, overlap_stats, partition_stats,
rng, S, nmoves, bgi),
mrs, mrp, mrm, wr, b, placeholders::_1,
std::ref(emat), sampler, cavity_sampler, weighted))();
return boost::python::make_tuple(S, nmoves);
......
......@@ -1302,11 +1302,11 @@ void move_sweep_overlap(vector<BlockState>& states,
vector<MEntries>& m_entries_r,
overlap_stats_t& overlap_stats, Vprop wr, Vprop b,
VLprop cv, VVprop vmap, Vprop clabel,
vector<int64_t>& vlist, bool deg_corr, bool dense,
bool multigraph, double beta, Vprop vweight, Graph& g,
bool sequential, bool parallel, bool random_move,
double c, size_t niter, size_t B, bool verbose,
RNG& rng, double& S, size_t& nmoves)
vector<int64_t>& vlist, vector<int64_t>& block_list,
bool deg_corr, bool dense, bool multigraph, double beta,
Vprop vweight, Graph& g, bool sequential, bool parallel,
bool random_move, double c, size_t niter, size_t B,
bool verbose, RNG& rng, double& S, size_t& nmoves)
{
typedef typename graph_traits<Graph>::vertex_descriptor vertex_t;
......@@ -1339,6 +1339,8 @@ void move_sweep_overlap(vector<BlockState>& states,
rngs.push_back(&rng);
}
std::uniform_int_distribution<size_t> s_rand(0, block_list.size() - 1);
half_edge_neighbour_policy<Graph> npolicy(g);
vector<MEntries> m_entries = m_entries_r;
......@@ -1362,7 +1364,6 @@ void move_sweep_overlap(vector<BlockState>& states,
typedef std::uniform_real_distribution<> rdist_t;
auto rand_real = std::bind(rdist_t(), std::ref(*rngs[tid]));
std::uniform_int_distribution<size_t> s_rand(0, B - 1);
vertex_t v;
if (sequential)
......@@ -1380,7 +1381,7 @@ void move_sweep_overlap(vector<BlockState>& states,
continue;
// attempt random block
vertex_t s = s_rand(*rngs[tid]);
vertex_t s = block_list[s_rand(*rngs[tid])];
if (!random_move && total_degreeS()(v, g) > 0)
{
......@@ -1550,18 +1551,20 @@ void coherent_move_sweep_overlap(vector<BlockState>& states,
vector<MEntries>& m_entries,
overlap_stats_t& overlap_stats, Vprop wr,
Vprop b, VLprop cv, VVprop vmap, Vprop clabel,
vector<int64_t>& vlist, bool deg_corr, bool dense,
bool multigraph, double beta, Vprop vweight,
Graph& g, bool sequential, bool random_move,
double c, bool confine_layers, size_t niter,
size_t B, RNG& rng, double& S, size_t& nmoves)
vector<int64_t>& vlist,
vector<int64_t>& block_list, bool deg_corr,
bool dense, bool multigraph, double beta,
Vprop vweight, Graph& g, bool sequential,
bool random_move, double c,
bool confine_layers, size_t niter, size_t B,
RNG& rng, double& S, size_t& nmoves)
{
typedef typename graph_traits<Graph>::vertex_descriptor vertex_t;
typedef std::uniform_real_distribution<> rdist_t;
auto rand_real = std::bind(rdist_t(), std::ref(rng));
std::uniform_int_distribution<size_t> s_rand(0, B - 1);
std::uniform_int_distribution<size_t> s_rand(0, block_list.size() - 1);
nmoves = 0;
S = 0;
......@@ -1599,7 +1602,7 @@ void coherent_move_sweep_overlap(vector<BlockState>& states,
continue;
// attempt random block
vertex_t s = s_rand(rng);
vertex_t s = block_list[s_rand(rng)];
if (!random_move && total_degreeS()(v, g) > 0)
{
......@@ -1689,7 +1692,7 @@ void coherent_move_sweep_overlap(vector<BlockState>& states,
double dS = virtual_move(vs, s, b, cv, vmap, states, m_entries,
dense, deg_corr, multigraph, npolicy);
assert (!std::isinf(dS) && !std::isnan(dS));
assert(!std::isinf(dS) && !std::isnan(dS));
bool accept = false;
if (std::isinf(beta))
......@@ -1752,10 +1755,11 @@ void merge_sweep_overlap(vector<BlockState>& states,
vector<MEntries>& m_entries,
overlap_stats_t& overlap_stats, Vprop wr, Vprop b,
EVprop ce, VLprop cv, VVprop vmap, Vprop clabel,
vector<int64_t>& vlist, bool deg_corr, bool dense,
bool multigraph, Graph& g, bool random_move,
size_t confine_layers, size_t nmerges, size_t ntries,
size_t B, RNG& rng, double& S, size_t& nmoves)
vector<int64_t>& vlist, vector<int64_t>& block_list,
bool deg_corr, bool dense, bool multigraph, Graph& g,
bool random_move, size_t confine_layers,
size_t nmerges, size_t ntries, size_t B, RNG& rng,
double& S, size_t& nmoves)
{
typedef typename graph_traits<Graph>::vertex_descriptor vertex_t;
......@@ -1799,7 +1803,7 @@ void merge_sweep_overlap(vector<BlockState>& states,
}
}
std::uniform_int_distribution<size_t> s_rand(0, B - 1);
std::uniform_int_distribution<size_t> s_rand(0, block_list.size() - 1);
nmoves = 0;
S = 0;
......@@ -1838,7 +1842,7 @@ void merge_sweep_overlap(vector<BlockState>& states,
else
{
// attempt random block
s = uniform_sample(blocks[clabel[r]], rng);
s = block_list[s_rand(rng)];
}
if (s == r)
......
......@@ -201,6 +201,7 @@ class BlockState(object):
self.egroups = None
self.nsampler = None
self.sweep_vertices = None
self.block_list = None
self.overlap_stats = libcommunity.overlap_stats()
self.partition_stats = libcommunity.partition_stats()
self.edges_dl = False
......@@ -994,6 +995,7 @@ def mcmc_sweep(state, beta=1., c=1., niter=1, dl=False, dense=False,
merge_map = kwargs.get("merge_map", None)
coherent_merge = kwargs.get("coherent_merge", False)
edges_dl = kwargs.get("edges_dl", False)
block_list = kwargs.get("block_list", None)
if state.B == 1:
return 0., 0
......@@ -1018,6 +1020,12 @@ def mcmc_sweep(state, beta=1., c=1., niter=1, dl=False, dense=False,
else:
target_blocks = libcommunity.get_vector(0)
if block_list is not None:
state.block_list = libcommunity.get_vector(len(block_list))
state.block_list.a = block_list
elif state.block_list is None or len(state.block_list) != state.B:
state.block_list = libcommunity.get_vector(state.B)
state.block_list.a = arange(state.B)
random_move = c == numpy.inf
......@@ -1098,6 +1106,7 @@ def mcmc_sweep(state, beta=1., c=1., niter=1, dl=False, dense=False,
_prop("v", state.g, state.b),
_prop("v", state.bg, bclabel),
state.sweep_vertices,
state.block_list,
target_blocks,
state.deg_corr, dense, multigraph,
_prop("e", state.g, state.eweight),
......@@ -1126,6 +1135,7 @@ def mcmc_sweep(state, beta=1., c=1., niter=1, dl=False, dense=False,
_prop("v", state.g, state.b),
_prop("v", state.bg, bclabel),
state.sweep_vertices,
state.block_list,
target_blocks,
state.deg_corr, dense, multigraph,
multigraph,
......@@ -1175,7 +1185,7 @@ def mcmc_sweep(state, beta=1., c=1., niter=1, dl=False, dense=False,
[state.master for state in states],
[state.slave for state in states],
_prop("v", None, bclabel),
[main_state.sweep_vertices, target_blocks],
[main_state.sweep_vertices, main_state.block_list, target_blocks],
main_state.deg_corr, dense, multigraph,
[_prop("e", state.g, state.eweight) for state in states],
[_prop("v", state.g, state.vweight) for state in states],
......
......@@ -212,7 +212,8 @@ class CovariateBlockState(BlockState):
self.total_state.clear_cache()
self.sweep_vertices = self.total_state.sweep_vertices
self.sweep_vertices = None
self.block_list = None
self.emat = None
self.overlap_stats = self.total_state.overlap_stats
self.__layer_entropy = None
......
......@@ -223,6 +223,7 @@ class OverlapBlockState(BlockState):
self.egroups = None
self.nsampler = None
self.sweep_vertices = None
self.block_list = None
self.partition_stats = libcommunity.overlap_partition_stats()
self.edges_dl = False
self.emat = None
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment