Multiclass-interface 1.8__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.8 → multiclass_interface-1.9/Multiclass_interface.egg-info}/PKG-INFO +1 -1
- {multiclass_interface-1.8/Multiclass_interface.egg-info → multiclass_interface-1.9}/PKG-INFO +1 -1
- {multiclass_interface-1.8 → multiclass_interface-1.9}/multiclass_interface/mpi_interface.py +8 -10
- {multiclass_interface-1.8 → multiclass_interface-1.9}/multiclass_interface/multiprocess_interface.py +5 -5
- {multiclass_interface-1.8 → multiclass_interface-1.9}/multiclass_interface/tests/test_multiprocessinterface.py +1 -8
- {multiclass_interface-1.8 → multiclass_interface-1.9}/multiclass_interface/version.py +2 -2
- {multiclass_interface-1.8 → multiclass_interface-1.9}/.gitignore +0 -0
- {multiclass_interface-1.8 → multiclass_interface-1.9}/.gitlab-ci.yml +0 -0
- {multiclass_interface-1.8 → multiclass_interface-1.9}/LICENSE +0 -0
- {multiclass_interface-1.8 → multiclass_interface-1.9}/Multiclass_interface.egg-info/SOURCES.txt +0 -0
- {multiclass_interface-1.8 → multiclass_interface-1.9}/Multiclass_interface.egg-info/dependency_links.txt +0 -0
- {multiclass_interface-1.8 → multiclass_interface-1.9}/Multiclass_interface.egg-info/requires.txt +0 -0
- {multiclass_interface-1.8 → multiclass_interface-1.9}/Multiclass_interface.egg-info/top_level.txt +0 -0
- {multiclass_interface-1.8 → multiclass_interface-1.9}/README.md +0 -0
- {multiclass_interface-1.8 → multiclass_interface-1.9}/multiclass_interface/__init__.py +0 -0
- {multiclass_interface-1.8 → multiclass_interface-1.9}/multiclass_interface/multi_object_list.py +0 -0
- {multiclass_interface-1.8 → multiclass_interface-1.9}/multiclass_interface/tests/__init__.py +0 -0
- {multiclass_interface-1.8 → multiclass_interface-1.9}/multiclass_interface/tests/my_test_cls.py +0 -0
- {multiclass_interface-1.8 → multiclass_interface-1.9}/multiclass_interface/tests/test_mpi.py +0 -0
- {multiclass_interface-1.8 → multiclass_interface-1.9}/multiclass_interface/tests/test_multiclass_list.py +0 -0
- {multiclass_interface-1.8 → multiclass_interface-1.9}/pyproject.toml +0 -0
- {multiclass_interface-1.8 → multiclass_interface-1.9}/sequence_diagrams.md +0 -0
- {multiclass_interface-1.8 → 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)
|
|
@@ -126,12 +124,13 @@ class MPIClassInterface():
|
|
|
126
124
|
use_rank = self.use_rank
|
|
127
125
|
if COLLECTIVE_MPI:
|
|
128
126
|
N = np.sum(use_rank)
|
|
127
|
+
j = sum(use_rank[:i])
|
|
129
128
|
else:
|
|
130
129
|
N = 1
|
|
131
130
|
if use_rank[i]:
|
|
132
131
|
def get_arg(arg):
|
|
133
132
|
if isinstance(arg, list) and len(arg) == N:
|
|
134
|
-
return arg[
|
|
133
|
+
return arg[j]
|
|
135
134
|
else:
|
|
136
135
|
return arg
|
|
137
136
|
return (name, [get_arg(arg) for arg in args], {k: get_arg(v) for k, v in kwargs.items()})
|
|
@@ -144,8 +143,8 @@ class MPIClassInterface():
|
|
|
144
143
|
elif COLLECTIVE_MPI and rank > 0:
|
|
145
144
|
self.work_loop()
|
|
146
145
|
return lambda *args, **kwargs: 1
|
|
147
|
-
elif not self.use_rank[rank]:
|
|
148
|
-
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')
|
|
149
148
|
|
|
150
149
|
def wrap(*args, **kwargs):
|
|
151
150
|
if COLLECTIVE_MPI:
|
|
@@ -154,7 +153,6 @@ class MPIClassInterface():
|
|
|
154
153
|
else:
|
|
155
154
|
method, args, kwargs = self.get_input(name, 0, args, kwargs)
|
|
156
155
|
return [self.do_task(name, args, kwargs)]
|
|
157
|
-
|
|
158
156
|
if hasattr(getattr(self.object, name), '__call__'):
|
|
159
157
|
res = wrap
|
|
160
158
|
else:
|
{multiclass_interface-1.8 → 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,), {}))
|
|
@@ -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.8 → multiclass_interface-1.9}/Multiclass_interface.egg-info/SOURCES.txt
RENAMED
|
File without changes
|
|
File without changes
|
{multiclass_interface-1.8 → multiclass_interface-1.9}/Multiclass_interface.egg-info/requires.txt
RENAMED
|
File without changes
|
{multiclass_interface-1.8 → multiclass_interface-1.9}/Multiclass_interface.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{multiclass_interface-1.8 → multiclass_interface-1.9}/multiclass_interface/multi_object_list.py
RENAMED
|
File without changes
|
{multiclass_interface-1.8 → multiclass_interface-1.9}/multiclass_interface/tests/__init__.py
RENAMED
|
File without changes
|
{multiclass_interface-1.8 → multiclass_interface-1.9}/multiclass_interface/tests/my_test_cls.py
RENAMED
|
File without changes
|
{multiclass_interface-1.8 → multiclass_interface-1.9}/multiclass_interface/tests/test_mpi.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|