Multiclass-interface 1.7__tar.gz → 1.9__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {multiclass_interface-1.7 → multiclass_interface-1.9/Multiclass_interface.egg-info}/PKG-INFO +1 -1
- {multiclass_interface-1.7/Multiclass_interface.egg-info → multiclass_interface-1.9}/PKG-INFO +1 -1
- {multiclass_interface-1.7 → multiclass_interface-1.9}/multiclass_interface/mpi_interface.py +14 -14
- {multiclass_interface-1.7 → multiclass_interface-1.9}/multiclass_interface/multiprocess_interface.py +5 -5
- {multiclass_interface-1.7 → multiclass_interface-1.9}/multiclass_interface/tests/test_mpi.py +1 -1
- {multiclass_interface-1.7 → multiclass_interface-1.9}/multiclass_interface/tests/test_multiprocessinterface.py +1 -8
- {multiclass_interface-1.7 → multiclass_interface-1.9}/multiclass_interface/version.py +2 -2
- {multiclass_interface-1.7 → multiclass_interface-1.9}/.gitignore +0 -0
- {multiclass_interface-1.7 → multiclass_interface-1.9}/.gitlab-ci.yml +0 -0
- {multiclass_interface-1.7 → multiclass_interface-1.9}/LICENSE +0 -0
- {multiclass_interface-1.7 → multiclass_interface-1.9}/Multiclass_interface.egg-info/SOURCES.txt +0 -0
- {multiclass_interface-1.7 → multiclass_interface-1.9}/Multiclass_interface.egg-info/dependency_links.txt +0 -0
- {multiclass_interface-1.7 → multiclass_interface-1.9}/Multiclass_interface.egg-info/requires.txt +0 -0
- {multiclass_interface-1.7 → multiclass_interface-1.9}/Multiclass_interface.egg-info/top_level.txt +0 -0
- {multiclass_interface-1.7 → multiclass_interface-1.9}/README.md +0 -0
- {multiclass_interface-1.7 → multiclass_interface-1.9}/multiclass_interface/__init__.py +0 -0
- {multiclass_interface-1.7 → multiclass_interface-1.9}/multiclass_interface/multi_object_list.py +0 -0
- {multiclass_interface-1.7 → multiclass_interface-1.9}/multiclass_interface/tests/__init__.py +0 -0
- {multiclass_interface-1.7 → multiclass_interface-1.9}/multiclass_interface/tests/my_test_cls.py +0 -0
- {multiclass_interface-1.7 → multiclass_interface-1.9}/multiclass_interface/tests/test_multiclass_list.py +0 -0
- {multiclass_interface-1.7 → multiclass_interface-1.9}/pyproject.toml +0 -0
- {multiclass_interface-1.7 → multiclass_interface-1.9}/sequence_diagrams.md +0 -0
- {multiclass_interface-1.7 → multiclass_interface-1.9}/setup.cfg +0 -0
|
@@ -56,6 +56,10 @@ class MPIClassInterface():
|
|
|
56
56
|
class Dummy():
|
|
57
57
|
def close(self):
|
|
58
58
|
pass
|
|
59
|
+
|
|
60
|
+
def __getattr__(self, name):
|
|
61
|
+
raise AttributeError(
|
|
62
|
+
f"rank {rank} trying to access {name}, but only {len(args_lst)} instances of {cls.__name__} exists")
|
|
59
63
|
self.object = Dummy()
|
|
60
64
|
self.closed = False
|
|
61
65
|
|
|
@@ -91,12 +95,6 @@ class MPIClassInterface():
|
|
|
91
95
|
res = None
|
|
92
96
|
elif method == 'setattr':
|
|
93
97
|
name, value = args
|
|
94
|
-
if hasattr(value, '__call__'):
|
|
95
|
-
def wrap(*args, func=value, **kwargs):
|
|
96
|
-
if inspect.getfullargspec(func).args[:1] == ['self']:
|
|
97
|
-
args = (self.object,) + args
|
|
98
|
-
return func(*args, **kwargs)
|
|
99
|
-
value = wrap
|
|
100
98
|
res = setattr(self.object, name, value)
|
|
101
99
|
else:
|
|
102
100
|
res = getattr(self.object, method)
|
|
@@ -124,11 +122,15 @@ class MPIClassInterface():
|
|
|
124
122
|
|
|
125
123
|
def get_input(self, name, i, args, kwargs):
|
|
126
124
|
use_rank = self.use_rank
|
|
127
|
-
|
|
125
|
+
if COLLECTIVE_MPI:
|
|
126
|
+
N = np.sum(use_rank)
|
|
127
|
+
j = sum(use_rank[:i])
|
|
128
|
+
else:
|
|
129
|
+
N = 1
|
|
128
130
|
if use_rank[i]:
|
|
129
131
|
def get_arg(arg):
|
|
130
132
|
if isinstance(arg, list) and len(arg) == N:
|
|
131
|
-
return arg[
|
|
133
|
+
return arg[j]
|
|
132
134
|
else:
|
|
133
135
|
return arg
|
|
134
136
|
return (name, [get_arg(arg) for arg in args], {k: get_arg(v) for k, v in kwargs.items()})
|
|
@@ -141,22 +143,20 @@ class MPIClassInterface():
|
|
|
141
143
|
elif COLLECTIVE_MPI and rank > 0:
|
|
142
144
|
self.work_loop()
|
|
143
145
|
return lambda *args, **kwargs: 1
|
|
144
|
-
elif not self.use_rank[rank]:
|
|
145
|
-
raise ChildProcessError('MPI worker not used')
|
|
146
|
+
elif rank > 0 and not self.use_rank[rank]:
|
|
147
|
+
raise ChildProcessError(f'MPI worker {rank} not used')
|
|
146
148
|
|
|
147
149
|
def wrap(*args, **kwargs):
|
|
148
150
|
if COLLECTIVE_MPI:
|
|
149
151
|
inp = [self.get_input(name, i, args, kwargs) for i in range(size)]
|
|
150
152
|
return self.run_task(inp)
|
|
151
153
|
else:
|
|
152
|
-
|
|
153
|
-
|
|
154
|
+
method, args, kwargs = self.get_input(name, 0, args, kwargs)
|
|
155
|
+
return [self.do_task(name, args, kwargs)]
|
|
154
156
|
if hasattr(getattr(self.object, name), '__call__'):
|
|
155
157
|
res = wrap
|
|
156
158
|
else:
|
|
157
159
|
res = wrap()
|
|
158
|
-
if not COLLECTIVE_MPI:
|
|
159
|
-
res = [res]
|
|
160
160
|
return res
|
|
161
161
|
|
|
162
162
|
def __setattr__(self, name, value):
|
{multiclass_interface-1.7 → multiclass_interface-1.9}/multiclass_interface/multiprocess_interface.py
RENAMED
|
@@ -28,9 +28,8 @@ def run(cls, inputQueue, outputQueue, cls_args, **kwargs):
|
|
|
28
28
|
if inspect.getfullargspec(func).args[:1] == ['self']:
|
|
29
29
|
args = (o,) + args
|
|
30
30
|
return func(*args, **kwargs)
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
outputQueue.put(setattr(o, name, value))
|
|
31
|
+
value = wrap
|
|
32
|
+
outputQueue.put(setattr(o, name, value))
|
|
34
33
|
elif method == 'iscallable':
|
|
35
34
|
name = args[0]
|
|
36
35
|
outputQueue.put(hasattr(getattr(o, name), '__call__'))
|
|
@@ -92,8 +91,9 @@ class ProcessClass():
|
|
|
92
91
|
def wrap(*args, wait_for_result=True, **kwargs):
|
|
93
92
|
self.inputQueue.put((name, args, kwargs))
|
|
94
93
|
if wait_for_result:
|
|
95
|
-
return self.get_result(
|
|
96
|
-
|
|
94
|
+
return self.get_result(
|
|
95
|
+
raise_exception=True,
|
|
96
|
+
cmd=lambda: f'executing {name}({", ".join(list(map(str, args)) + ["%s=%s" % (k, v) for k, v in kwargs.items()])})')
|
|
97
97
|
return wrap
|
|
98
98
|
else:
|
|
99
99
|
self.inputQueue.put(('getattr', (name,), {}))
|
{multiclass_interface-1.7 → multiclass_interface-1.9}/multiclass_interface/tests/test_mpi.py
RENAMED
|
@@ -53,7 +53,7 @@ def mpitest_non_collective_mpi():
|
|
|
53
53
|
with MPIClassInterface(MyTest, [(i + 10,) for i in range(N)]) as m:
|
|
54
54
|
|
|
55
55
|
try:
|
|
56
|
-
assert m.get_id() == rank + 10
|
|
56
|
+
assert m.get_id()[0] == rank + 10, m.get_id()
|
|
57
57
|
assert rank < N # rank > N will fail with ChildProcessError
|
|
58
58
|
except ChildProcessError:
|
|
59
59
|
pass
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from numpy import testing as npt
|
|
2
2
|
import pytest
|
|
3
3
|
|
|
4
|
-
from multiclass_interface.multiprocess_interface import MultiProcessClassInterface, MultiThreadClassInterface
|
|
4
|
+
from multiclass_interface.multiprocess_interface import MultiProcessClassInterface, MultiThreadClassInterface, \
|
|
5
5
|
ProcessClass
|
|
6
6
|
from multiclass_interface.tests.my_test_cls import MyTest
|
|
7
7
|
from threading import Thread
|
|
@@ -45,10 +45,6 @@ def get_process_id():
|
|
|
45
45
|
return os.getpid()
|
|
46
46
|
|
|
47
47
|
|
|
48
|
-
def get_name(self):
|
|
49
|
-
return self.name
|
|
50
|
-
|
|
51
|
-
|
|
52
48
|
def test_setattr_method(mpri):
|
|
53
49
|
mpri.get_process_id = get_process_id
|
|
54
50
|
main_id = get_process_id()
|
|
@@ -61,9 +57,6 @@ def test_setattr_method(mpri):
|
|
|
61
57
|
assert pid1 != pid2
|
|
62
58
|
assert pid2 != pid3
|
|
63
59
|
|
|
64
|
-
mpri.get_name = get_name
|
|
65
|
-
assert mpri.get_name() == mpri.name
|
|
66
|
-
|
|
67
60
|
|
|
68
61
|
def test_str(mpri):
|
|
69
62
|
assert str(mpri).startswith(
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{multiclass_interface-1.7 → multiclass_interface-1.9}/Multiclass_interface.egg-info/SOURCES.txt
RENAMED
|
File without changes
|
|
File without changes
|
{multiclass_interface-1.7 → multiclass_interface-1.9}/Multiclass_interface.egg-info/requires.txt
RENAMED
|
File without changes
|
{multiclass_interface-1.7 → multiclass_interface-1.9}/Multiclass_interface.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{multiclass_interface-1.7 → multiclass_interface-1.9}/multiclass_interface/multi_object_list.py
RENAMED
|
File without changes
|
{multiclass_interface-1.7 → multiclass_interface-1.9}/multiclass_interface/tests/__init__.py
RENAMED
|
File without changes
|
{multiclass_interface-1.7 → multiclass_interface-1.9}/multiclass_interface/tests/my_test_cls.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|