Skip to content
Snippets Groups Projects
Commit 187d6a24 authored by akuesters's avatar akuesters Committed by Benjamin Cumming
Browse files

Clean up Python config feature (#709)

Remove old code and comments from Python config code.
parent 7c0b8236
No related branches found
No related tags found
No related merge requests found
#include <pybind11/pybind11.h> #include <arbor/version.hpp>
#include <sstream>
#include <iomanip>
#include <ios>
#include "config.hpp" #include <pybind11/pybind11.h>
#include <pybind11/stl.h>
namespace pyarb { namespace pyarb {
// Returns a python dictionary that python users can use to look up
// which options the Arbor library was configured with at compile time.
pybind11::dict config() {
pybind11::dict dict;
#ifdef ARB_MPI_ENABLED
dict[pybind11::str("mpi")] = pybind11::bool_(true);
#else
dict[pybind11::str("mpi")] = pybind11::bool_(false);
#endif
#ifdef ARB_WITH_MPI4PY
dict[pybind11::str("mpi4py")] = pybind11::bool_(true);
#else
dict[pybind11::str("mpi4py")] = pybind11::bool_(false);
#endif
#ifdef ARB_WITH_GPU
dict[pybind11::str("gpu")] = pybind11::bool_(true);
#else
dict[pybind11::str("gpu")] = pybind11::bool_(false);
#endif
dict[pybind11::str("version")] = pybind11::str(ARB_VERSION);
return dict;
}
void print_config(const pybind11::dict &d) {
std::stringstream s;
s << "Arbor's configuration:\n";
for (auto x: d) {
s << " "
<< std::left << std::setw(7) << x.first << ": "
<< std::right << std::setw(10) << x.second << "\n";
}
pybind11::print(s.str());
}
// Register configuration
void register_config(pybind11::module &m) { void register_config(pybind11::module &m) {
m.def("config", &config, "Get Arbor's configuration.") m.def("config", &config, "Get Arbor's configuration.")
......
#pragma once
#include <arbor/version.hpp>
#include <sstream>
#include <iomanip>
#include <ios>
#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
namespace pyarb {
// Create and return a dictionary
pybind11::dict config() {
pybind11::dict dict;
#ifdef ARB_MPI_ENABLED
dict[pybind11::str("mpi")] = pybind11::bool_(true);
#else
dict[pybind11::str("mpi")] = pybind11::bool_(false);
#endif
#ifdef ARB_WITH_MPI4PY
dict[pybind11::str("mpi4py")] = pybind11::bool_(true);
#else
dict[pybind11::str("mpi4py")] = pybind11::bool_(false);
#endif
#ifdef ARB_WITH_GPU
dict[pybind11::str("gpu")] = pybind11::bool_(true);
#else
dict[pybind11::str("gpu")] = pybind11::bool_(false);
#endif
dict[pybind11::str("version")] = pybind11::str(ARB_VERSION);
return dict;
}
void print_config(const pybind11::dict &d) {
std::stringstream s;
s << "Arbor's configuration:" << std::endl;
for (auto x: d) {
s << " "
<< std::left << std::setw(7) << x.first << ": "
<< std::right << std::setw(10) << x.second << "\n";
}
pybind11::print(s.str());
}
} // namespace pyarb
...@@ -19,30 +19,6 @@ ...@@ -19,30 +19,6 @@
namespace pyarb { namespace pyarb {
// Some helper functions to determine how Arbor was compiled
bool mpi_compiled() {
#ifdef ARB_MPI_ENABLED
return true;
#else
return false;
#endif
}
bool mpi4py_compiled() {
#ifdef ARB_WITH_MPI4PY
return true;
#else
return false;
#endif
}
void register_queryenvvars(pybind11::module& m) {
using namespace std::string_literals;
m.def("mpi_compiled", &mpi_compiled, "Check if Arbor was compiled with MPI.");
m.def("mpi4py_compiled", &mpi4py_compiled, "Check if Arbor was compiled with MPI4PY.");
}
#ifdef ARB_MPI_ENABLED #ifdef ARB_MPI_ENABLED
#ifdef ARB_WITH_MPI4PY #ifdef ARB_WITH_MPI4PY
......
...@@ -8,7 +8,6 @@ namespace pyarb { ...@@ -8,7 +8,6 @@ namespace pyarb {
void register_config(pybind11::module& m); void register_config(pybind11::module& m);
void register_contexts(pybind11::module& m); void register_contexts(pybind11::module& m);
void register_queryenvvars(pybind11::module& m);
#ifdef ARB_MPI_ENABLED #ifdef ARB_MPI_ENABLED
void register_mpi(pybind11::module& m); void register_mpi(pybind11::module& m);
#endif #endif
...@@ -20,7 +19,6 @@ PYBIND11_MODULE(arbor, m) { ...@@ -20,7 +19,6 @@ PYBIND11_MODULE(arbor, m) {
pyarb::register_config(m); pyarb::register_config(m);
pyarb::register_contexts(m); pyarb::register_contexts(m);
pyarb::register_queryenvvars(m);
#ifdef ARB_MPI_ENABLED #ifdef ARB_MPI_ENABLED
pyarb::register_mpi(m); pyarb::register_mpi(m);
#endif #endif
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
# test_contexts_arbmpi.py # test_contexts_arbmpi.py
import unittest import unittest
from collections import namedtuple
import arbor as arb import arbor as arb
...@@ -15,33 +16,27 @@ try: ...@@ -15,33 +16,27 @@ try:
except ModuleNotFoundError: except ModuleNotFoundError:
from test import options from test import options
# check Arbor's configuration of mpi
dict = arb.config()
mpi_check = dict["mpi"]
""" """
all tests for distributed arb.context using arbor mpi wrappers all tests for distributed arb.context using arbor mpi wrappers
""" """
@unittest.skipIf(arb.mpi_compiled() == False, "MPI not enabled!") @unittest.skipIf(mpi_check == False, "MPI not enabled!")
class Contexts_arbmpi(unittest.TestCase): class Contexts_arbmpi(unittest.TestCase):
# Initialize mpi only once in this class (when adding classes move initialization to setUpModule() # Initialize mpi only once in this class (when adding classes move initialization to setUpModule()
@classmethod @classmethod
def setUpClass(self): def setUpClass(self):
#print("setUp --- TestContextMPI class")
self.local_mpi = False self.local_mpi = False
if not arb.mpi_is_initialized(): if not arb.mpi_is_initialized():
#print(" Initializing mpi")
arb.mpi_init() arb.mpi_init()
self.local_mpi = True self.local_mpi = True
#else:
#print(" mpi already initialized")
# Finalize mpi only once in this class (when adding classes move finalization to setUpModule() # Finalize mpi only once in this class (when adding classes move finalization to setUpModule()
@classmethod @classmethod
def tearDownClass(self): def tearDownClass(self):
#print("tearDown --- TestContextMPI class")
#print(" Finalizing mpi")
#if (arb.mpi4py_compiled() == False and arb.mpi_is_finalized() == False):
if self.local_mpi: if self.local_mpi:
#print(" Finalizing mpi")
arb.mpi_finalize() arb.mpi_finalize()
#else:
#print(" No finalizing due to further testing with mpi4py")
def test_initialized_arbmpi(self): def test_initialized_arbmpi(self):
self.assertTrue(arb.mpi_is_initialized()) self.assertTrue(arb.mpi_is_initialized())
...@@ -51,7 +46,6 @@ class Contexts_arbmpi(unittest.TestCase): ...@@ -51,7 +46,6 @@ class Contexts_arbmpi(unittest.TestCase):
# test that by default communicator is MPI_COMM_WORLD # test that by default communicator is MPI_COMM_WORLD
self.assertEqual(str(comm), '<mpi_comm: MPI_COMM_WORLD>') self.assertEqual(str(comm), '<mpi_comm: MPI_COMM_WORLD>')
#print(comm)
# test context with mpi # test context with mpi
alloc = arb.proc_allocation() alloc = arb.proc_allocation()
...@@ -59,7 +53,6 @@ class Contexts_arbmpi(unittest.TestCase): ...@@ -59,7 +53,6 @@ class Contexts_arbmpi(unittest.TestCase):
self.assertEqual(ctx.threads, alloc.threads) self.assertEqual(ctx.threads, alloc.threads)
self.assertTrue(ctx.has_mpi) self.assertTrue(ctx.has_mpi)
#print(ctx)
def test_finalized_arbmpi(self): def test_finalized_arbmpi(self):
self.assertFalse(arb.mpi_is_finalized()) self.assertFalse(arb.mpi_is_finalized())
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
# test_contexts_mpi4py.py # test_contexts_mpi4py.py
import unittest import unittest
from collections import namedtuple
import arbor as arb import arbor as arb
...@@ -15,14 +16,19 @@ try: ...@@ -15,14 +16,19 @@ try:
except ModuleNotFoundError: except ModuleNotFoundError:
from test import options from test import options
if (arb.mpi4py_compiled() and arb.mpi_compiled()): # check Arbor's configuration of mpi
dict = arb.config()
config_mpi = dict["mpi"]
config_mpi4py = dict["mpi4py"]
if (config_mpi and config_mpi4py):
import mpi4py.MPI as mpi import mpi4py.MPI as mpi
""" """
all tests for distributed arb.context using mpi4py all tests for distributed arb.context using mpi4py
""" """
# Only test class if env var ARB_WITH_MPI4PY=ON # Only test class if env var ARB_WITH_MPI4PY=ON
@unittest.skipIf(arb.mpi_compiled() == False or arb.mpi4py_compiled() == False, "MPI/mpi4py not enabled!") @unittest.skipIf(config_mpi == False or config_mpi4py == False, "MPI/mpi4py not enabled!")
class Contexts_mpi4py(unittest.TestCase): class Contexts_mpi4py(unittest.TestCase):
def test_initialize_mpi4py(self): def test_initialize_mpi4py(self):
# test mpi initialization (automatically when including mpi4py: https://mpi4py.readthedocs.io/en/stable/mpi4py.run.html) # test mpi initialization (automatically when including mpi4py: https://mpi4py.readthedocs.io/en/stable/mpi4py.run.html)
...@@ -33,7 +39,6 @@ class Contexts_mpi4py(unittest.TestCase): ...@@ -33,7 +39,6 @@ class Contexts_mpi4py(unittest.TestCase):
# test that set communicator is MPI_COMM_WORLD # test that set communicator is MPI_COMM_WORLD
self.assertEqual(str(comm), '<mpi_comm: MPI_COMM_WORLD>') self.assertEqual(str(comm), '<mpi_comm: MPI_COMM_WORLD>')
#print(comm)
def test_context_mpi4py(self): def test_context_mpi4py(self):
comm = arb.mpi_comm_from_mpi4py(mpi.COMM_WORLD) comm = arb.mpi_comm_from_mpi4py(mpi.COMM_WORLD)
...@@ -44,7 +49,6 @@ class Contexts_mpi4py(unittest.TestCase): ...@@ -44,7 +49,6 @@ class Contexts_mpi4py(unittest.TestCase):
self.assertEqual(ctx.threads, alloc.threads) self.assertEqual(ctx.threads, alloc.threads)
self.assertTrue(ctx.has_mpi) self.assertTrue(ctx.has_mpi)
#print(ctx)
def test_finalize_mpi4py(self): def test_finalize_mpi4py(self):
# test mpi finalization (automatically when including mpi4py, but only just before the Python process terminates) # test mpi finalization (automatically when including mpi4py, but only just before the Python process terminates)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment