Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update/network tests #396

Merged
merged 2 commits into from
Jan 29, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .coveragerc
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
[report]
exclude_lines =
# Have to re-enable the standard pragma
pragma: no cover

# Don't complain if tests don't hit defensive assertion code:
raise NotImplementedError
27 changes: 14 additions & 13 deletions bmtk/builder/network_adaptors/dm_network.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,10 +62,10 @@ def _add_nodes(self, nodes):
def edges_table(self):
return self.__edges_tables

def _save_nodes(self, nodes_file_name, compression='gzip'):
def _save_nodes(self, nodes_file_name, mode='w', compression='gzip'):
if not self._nodes_built:
self._build_nodes()
if compression == 'none':
if compression is None or (isinstance(compression, str) and compression.lower() == 'none'):
compression = None # legit option for h5py for no compression

# save the node_types file
Expand Down Expand Up @@ -100,7 +100,7 @@ def _save_nodes(self, nodes_file_name, compression='gzip'):
prop_ds.append(node.params[key])

if mpi_rank == 0:
with h5py.File(nodes_file_name, 'w') as hf:
with h5py.File(nodes_file_name, mode) as hf:
# Add magic and version attribute
add_hdf5_attrs(hf)

Expand All @@ -116,7 +116,7 @@ def _save_nodes(self, nodes_file_name, compression='gzip'):
for key, dataset in props.items():
try:
model_grp.create_dataset(key, data=dataset, compression=compression)
except TypeError:
except TypeError: # pragma: no cover
str_list = [str(d) for d in dataset]
hf.create_dataset(key, data=str_list, compression=compression)
barrier()
Expand All @@ -127,8 +127,8 @@ def nodes_iter(self, node_ids=None):
else:
return self._nodes

def _process_nodepool(self, nodepool):
return nodepool
# def _process_nodepool(self, nodepool):
# return nodepool

def import_nodes(self, nodes_file_name, node_types_file_name, population=None):
sonata_file = sonata.File(data_files=nodes_file_name, data_type_files=node_types_file_name)
Expand Down Expand Up @@ -217,9 +217,9 @@ def _add_edges(self, connection_map, i):
self.__edges_tables.append(edges_table)

def _get_edge_group_id(self, params_hash):
return int(params_hash)
return int(params_hash) # pragma: no cover

def _save_gap_junctions(self, gj_file_name, compression='gzip'):
def _save_gap_junctions(self, gj_file_name, compression='gzip', **opts):
source_ids = []
target_ids = []
src_gap_ids = []
Expand Down Expand Up @@ -255,7 +255,7 @@ def _save_gap_junctions(self, gj_file_name, compression='gzip'):
f.create_dataset('trg_gap_ids', data=np.array(trg_gap_ids), compression=compression)

def _save_edges(self, edges_file_name, src_network, trg_network, pop_name=None, sort_by='target_node_id',
index_by=('target_node_id', 'source_node_id'), compression='gzip'):
index_by=('target_node_id', 'source_node_id'), compression='gzip', sort_on_disk=False, **opts):
barrier()

if compression == 'none':
Expand All @@ -282,10 +282,10 @@ def _save_edges(self, edges_file_name, src_network, trg_network, pop_name=None,

# Try to sort before writing file, If edges are split across ranks/files for MPI/size issues then we need to
# write to disk first then sort the hdf5 file
sort_on_disk = False
# sort_on_disk = opts.get('sort_on_disk', False)
edges_file_name_final = edges_file_name
if sort_by:
if merged_edges.can_sort:
if merged_edges.can_sort and not sort_on_disk:
merged_edges.sort(sort_by=sort_by)
else:
sort_on_disk = True
Expand All @@ -297,6 +297,7 @@ def _save_edges(self, edges_file_name, src_network, trg_network, pop_name=None,
if mpi_rank == 0:
logger.debug('Unable to sort edges in memory, will temporarly save to {}'.format(edges_file_name) +
' before sorting hdf5 file.')

barrier()

if mpi_rank == 0:
Expand Down Expand Up @@ -351,8 +352,8 @@ def _save_edges(self, edges_file_name, src_network, trg_network, pop_name=None,
try:
logger.debug('Deleting intermediate edges file {}.'.format(edges_file_name))
os.remove(edges_file_name)
except OSError as e:
logger.warning('Unable to remove intermediate edges file {}.'.format(edges_file_name))
except OSError as e: # pragma: no cover
logger.warning('Unable to remove intermediate edges file {}.'.format(edges_file_name))

if index_by:
index_by = index_by if isinstance(index_by, (list, tuple)) else [index_by]
Expand Down
52 changes: 26 additions & 26 deletions bmtk/builder/network_adaptors/dm_network_orig.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,31 +20,31 @@
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
import os
import numpy as np
import h5py
import six
import csv

from .network import Network
from bmtk.builder.node import Node
from bmtk.builder.edge import Edge
from bmtk.utils import sonata

try:
from mpi4py import MPI
comm = MPI.COMM_WORLD
mpi_rank = comm.Get_rank()
mpi_size = comm.Get_size()
barrier = comm.barrier

except ImportError:
mpi_rank = 0
mpi_size = 1
barrier = lambda: None


class DenseNetworkOrig(Network):
import os # pragma: no cover
import numpy as np # pragma: no cover
import h5py # pragma: no cover
import six # pragma: no cover
import csv # pragma: no cover

from .network import Network # pragma: no cover
from bmtk.builder.node import Node # pragma: no cover
from bmtk.builder.edge import Edge # pragma: no cover
from bmtk.utils import sonata # pragma: no cover

try: # pragma: no cover
from mpi4py import MPI # pragma: no cover
comm = MPI.COMM_WORLD # pragma: no cover
mpi_rank = comm.Get_rank() # pragma: no cover
mpi_size = comm.Get_size() # pragma: no cover
barrier = comm.barrier # pragma: no cover

except ImportError: # pragma: no cover
mpi_rank = 0 # pragma: no cover
mpi_size = 1 # pragma: no cover
barrier = lambda: None # pragma: no cover


class DenseNetworkOrig(Network): # pragma: no cover
def __init__(self, name, **network_props):
super(DenseNetworkOrig, self).__init__(name, **network_props or {})

Expand Down Expand Up @@ -530,7 +530,7 @@ def __getitem__(self, item):
return self._prop_array[indicies]


def add_hdf5_attrs(hdf5_handle):
def add_hdf5_attrs(hdf5_handle): # pragma: no cover
# TODO: move this as a utility function
hdf5_handle['/'].attrs['magic'] = np.uint32(0x0A7A)
hdf5_handle['/'].attrs['version'] = [np.uint32(0), np.uint32(1)]
20 changes: 10 additions & 10 deletions bmtk/builder/network_adaptors/network.py
Original file line number Diff line number Diff line change
Expand Up @@ -462,7 +462,7 @@ def filter_edges(e):
src_gids, src_net = nodes2gids(source_nodes, source_network)

# use the iterator to get edges and return as a list
if properties is None:
if not properties:
edges = list(self.edges_iter(trg_gids=trg_gids, trg_network=trg_net, src_network=src_net))
else:
# filter out certain edges using the properties parameters
Expand Down Expand Up @@ -552,7 +552,7 @@ def __get_path(self, filename, path_dir, ftype):
else:
return os.path.join(path_dir, filename)

def save(self, output_dir='.', force_overwrite=True, compression='gzip'):
def save(self, output_dir='.', force_overwrite=True, mode='w', compression='gzip', **opts):
"""Used to save the network files in the appropriate (eg SONATA) format into the output_dir directory. The file
names will be automatically generated based on the network names.

Expand All @@ -561,10 +561,10 @@ def save(self, output_dir='.', force_overwrite=True, compression='gzip'):
:param output_dir: string, directory where network files will be generated. Default, current working directory.
:param force_overwrite: Overwrites existing network files.
"""
self.save_nodes(output_dir=output_dir, force_overwrite=force_overwrite, compression=compression)
self.save_edges(output_dir=output_dir, force_overwrite=force_overwrite, compression=compression)
self.save_nodes(output_dir=output_dir, force_overwrite=force_overwrite, mode=mode, compression=compression, **opts)
self.save_edges(output_dir=output_dir, force_overwrite=force_overwrite, mode=mode, compression=compression, **opts)

def save_nodes(self, nodes_file_name=None, node_types_file_name=None, output_dir='.', force_overwrite=True, compression='gzip'):
def save_nodes(self, nodes_file_name=None, node_types_file_name=None, output_dir='.', force_overwrite=True, mode='w', compression='gzip', **opts):
"""Save the instantiated nodes in SONATA format files.

:param nodes_file_name: file-name of hdf5 nodes file. By default will use <network.name>_nodes.h5.
Expand All @@ -589,10 +589,10 @@ def save_nodes(self, nodes_file_name=None, node_types_file_name=None, output_dir
os.makedirs(ntf_dir)
barrier()

self._save_nodes(nodes_file, compression=compression)
self._save_nodes(nodes_file, mode=mode, compression=compression)
self._save_node_types(node_types_file)

def _save_nodes(self, nodes_file_name, compression='gzip'):
def _save_nodes(self, nodes_file_name, mode='w', compression='gzip'):
raise NotImplementedError

def _save_node_types(self, node_types_file_name):
Expand All @@ -611,7 +611,7 @@ def import_nodes(self, nodes_file_name, node_types_file_name):
raise NotImplementedError

def save_edges(self, edges_file_name=None, edge_types_file_name=None, output_dir='.', src_network=None,
trg_network=None, name=None, force_build=True, force_overwrite=False, compression='gzip'):
trg_network=None, name=None, force_build=True, force_overwrite=False, **opts):
"""Save the instantiated edges in SONATA format files.

:param edges_file_name: file-name of hdf5 edges file. By default will use <src_network>_<trg_network>_edges.h5.
Expand Down Expand Up @@ -654,14 +654,14 @@ def save_edges(self, edges_file_name=None, edge_types_file_name=None, output_dir
os.mkdir(output_dir)
barrier()

self._save_gap_junctions(os.path.join(output_dir, self._network_name + '_gap_juncs.h5'), compression=compression)
self._save_gap_junctions(os.path.join(output_dir, self._network_name + '_gap_juncs.h5'), **opts)

for p in network_params:
if p[3] is not None:
self._save_edge_types(os.path.join(output_dir, p[3]), p[0], p[1])

if p[2] is not None:
self._save_edges(os.path.join(output_dir, p[2]), p[0], p[1], name, compression=compression)
self._save_edges(os.path.join(output_dir, p[2]), p[0], p[1], name, **opts)

def _save_edge_types(self, edge_types_file_name, src_network, trg_network):
if mpi_rank == 0:
Expand Down
6 changes: 3 additions & 3 deletions bmtk/builder/network_adaptors/nxnetwork.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,12 @@
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
import networkx as nx
import networkx as nx # pragma: no cover

from .network import Network
from .network import Network # pragma: no cover


class NxNetwork(Network): # pragma: no cover
class NxNetwork(Network): # pragma: no cover
def __init__(self, name, **network_props):
super(NxNetwork, self).__init__(name, **network_props or {})

Expand Down
10 changes: 10 additions & 0 deletions tests/builder/test_densenetwork.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,16 @@
from bmtk.builder.network_adaptors.dm_network import DenseNetwork
# from bmtk.builder.network_adaptors.dm_network_orig import DenseNetworkOrig

#########
pytest.skip(allow_module_level=True)
#########

def test_basics():
dn = DenseNetwork(name='test')
dn.add_nodes(N=100)
print(dn.edges_table)



@pytest.mark.parametrize('network_cls', [
(DenseNetwork),
Expand Down
Loading
Loading