Multiclass-interface 1.8__tar.gz → 1.10__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.8 → multiclass_interface-1.10/Multiclass_interface.egg-info}/PKG-INFO +1 -1
  2. {multiclass_interface-1.8/Multiclass_interface.egg-info → multiclass_interface-1.10}/PKG-INFO +1 -1
  3. {multiclass_interface-1.8 → multiclass_interface-1.10}/multiclass_interface/mpi_interface.py +9 -11
  4. {multiclass_interface-1.8 → multiclass_interface-1.10}/multiclass_interface/multiprocess_interface.py +5 -5
  5. {multiclass_interface-1.8 → multiclass_interface-1.10}/multiclass_interface/tests/test_multiprocessinterface.py +1 -8
  6. {multiclass_interface-1.8 → multiclass_interface-1.10}/multiclass_interface/version.py +2 -2
  7. {multiclass_interface-1.8 → multiclass_interface-1.10}/.gitignore +0 -0
  8. {multiclass_interface-1.8 → multiclass_interface-1.10}/.gitlab-ci.yml +0 -0
  9. {multiclass_interface-1.8 → multiclass_interface-1.10}/LICENSE +0 -0
  10. {multiclass_interface-1.8 → multiclass_interface-1.10}/Multiclass_interface.egg-info/SOURCES.txt +0 -0
  11. {multiclass_interface-1.8 → multiclass_interface-1.10}/Multiclass_interface.egg-info/dependency_links.txt +0 -0
  12. {multiclass_interface-1.8 → multiclass_interface-1.10}/Multiclass_interface.egg-info/requires.txt +0 -0
  13. {multiclass_interface-1.8 → multiclass_interface-1.10}/Multiclass_interface.egg-info/top_level.txt +0 -0
  14. {multiclass_interface-1.8 → multiclass_interface-1.10}/README.md +0 -0
  15. {multiclass_interface-1.8 → multiclass_interface-1.10}/multiclass_interface/__init__.py +0 -0
  16. {multiclass_interface-1.8 → multiclass_interface-1.10}/multiclass_interface/multi_object_list.py +0 -0
  17. {multiclass_interface-1.8 → multiclass_interface-1.10}/multiclass_interface/tests/__init__.py +0 -0
  18. {multiclass_interface-1.8 → multiclass_interface-1.10}/multiclass_interface/tests/my_test_cls.py +0 -0
  19. {multiclass_interface-1.8 → multiclass_interface-1.10}/multiclass_interface/tests/test_mpi.py +0 -0
  20. {multiclass_interface-1.8 → multiclass_interface-1.10}/multiclass_interface/tests/test_multiclass_list.py +0 -0
  21. {multiclass_interface-1.8 → multiclass_interface-1.10}/pyproject.toml +0 -0
  22. {multiclass_interface-1.8 → multiclass_interface-1.10}/sequence_diagrams.md +0 -0
  23. {multiclass_interface-1.8 → multiclass_interface-1.10}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: Multiclass_interface
3
- Version: 1.8
3
+ Version: 1.10
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.8
3
+ Version: 1.10
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)
@@ -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[np.where(use_rank)[0][i]]
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:
@@ -170,7 +168,7 @@ class MPIClassInterface():
170
168
 
171
169
  def __getitem__(self, slice):
172
170
  use_rank = np.full_like(self.use_rank, False)
173
- use_rank[slice] = True
171
+ use_rank[np.where(self.use_rank)[0][slice]] = True
174
172
  if np.all(self.use_rank == use_rank):
175
173
  return self
176
174
  return SubsetMPIClassInterface(self.cls, self.object, use_rank)
@@ -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,), {}))
@@ -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.8'
16
- __version_tuple__ = version_tuple = (1, 8)
15
+ __version__ = version = '1.10'
16
+ __version_tuple__ = version_tuple = (1, 10)