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.
Files changed (23) hide show
  1. {multiclass_interface-1.7 → multiclass_interface-1.9/Multiclass_interface.egg-info}/PKG-INFO +1 -1
  2. {multiclass_interface-1.7/Multiclass_interface.egg-info → multiclass_interface-1.9}/PKG-INFO +1 -1
  3. {multiclass_interface-1.7 → multiclass_interface-1.9}/multiclass_interface/mpi_interface.py +14 -14
  4. {multiclass_interface-1.7 → multiclass_interface-1.9}/multiclass_interface/multiprocess_interface.py +5 -5
  5. {multiclass_interface-1.7 → multiclass_interface-1.9}/multiclass_interface/tests/test_mpi.py +1 -1
  6. {multiclass_interface-1.7 → multiclass_interface-1.9}/multiclass_interface/tests/test_multiprocessinterface.py +1 -8
  7. {multiclass_interface-1.7 → multiclass_interface-1.9}/multiclass_interface/version.py +2 -2
  8. {multiclass_interface-1.7 → multiclass_interface-1.9}/.gitignore +0 -0
  9. {multiclass_interface-1.7 → multiclass_interface-1.9}/.gitlab-ci.yml +0 -0
  10. {multiclass_interface-1.7 → multiclass_interface-1.9}/LICENSE +0 -0
  11. {multiclass_interface-1.7 → multiclass_interface-1.9}/Multiclass_interface.egg-info/SOURCES.txt +0 -0
  12. {multiclass_interface-1.7 → multiclass_interface-1.9}/Multiclass_interface.egg-info/dependency_links.txt +0 -0
  13. {multiclass_interface-1.7 → multiclass_interface-1.9}/Multiclass_interface.egg-info/requires.txt +0 -0
  14. {multiclass_interface-1.7 → multiclass_interface-1.9}/Multiclass_interface.egg-info/top_level.txt +0 -0
  15. {multiclass_interface-1.7 → multiclass_interface-1.9}/README.md +0 -0
  16. {multiclass_interface-1.7 → multiclass_interface-1.9}/multiclass_interface/__init__.py +0 -0
  17. {multiclass_interface-1.7 → multiclass_interface-1.9}/multiclass_interface/multi_object_list.py +0 -0
  18. {multiclass_interface-1.7 → multiclass_interface-1.9}/multiclass_interface/tests/__init__.py +0 -0
  19. {multiclass_interface-1.7 → multiclass_interface-1.9}/multiclass_interface/tests/my_test_cls.py +0 -0
  20. {multiclass_interface-1.7 → multiclass_interface-1.9}/multiclass_interface/tests/test_multiclass_list.py +0 -0
  21. {multiclass_interface-1.7 → multiclass_interface-1.9}/pyproject.toml +0 -0
  22. {multiclass_interface-1.7 → multiclass_interface-1.9}/sequence_diagrams.md +0 -0
  23. {multiclass_interface-1.7 → multiclass_interface-1.9}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: Multiclass_interface
3
- Version: 1.7
3
+ Version: 1.9
4
4
  Summary: Multiclass interface
5
5
  Author-email: "Mads M. Pedersen" <mmpe@dtu.dk>
6
6
  Project-URL: Homepage, https://gitlab.windenergy.dtu.dk/DYNAMIKS/multiclass_interface
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: Multiclass_interface
3
- Version: 1.7
3
+ Version: 1.9
4
4
  Summary: Multiclass interface
5
5
  Author-email: "Mads M. Pedersen" <mmpe@dtu.dk>
6
6
  Project-URL: Homepage, https://gitlab.windenergy.dtu.dk/DYNAMIKS/multiclass_interface
@@ -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
- N = np.sum(use_rank)
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[np.where(use_rank)[0][i]]
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
- return self.do_task(name, args, kwargs)
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):
@@ -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
- outputQueue.put(setattr(o, name, wrap))
32
- else:
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(raise_exception=True,
96
- cmd=lambda: f'executing {name}({", ".join(list(map(str,args))+["%s=%s"%(k,v) for k,v in kwargs.items()])})')
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,), {}))
@@ -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(
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '1.7'
16
- __version_tuple__ = version_tuple = (1, 7)
15
+ __version__ = version = '1.9'
16
+ __version_tuple__ = version_tuple = (1, 9)