Multiclass-interface 1.0__py3-none-any.whl → 1.2__py3-none-any.whl

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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: Multiclass_interface
3
- Version: 1.0
3
+ Version: 1.2
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
@@ -0,0 +1,15 @@
1
+ multiclass_interface/__init__.py,sha256=1kI9Vxsap_8eap6kldNHhIWLEVBT2DLWl2UbTOTnVN0,114
2
+ multiclass_interface/mpi_interface.py,sha256=CJCKbRQnE8jDndwjzlIy-0VKplsd4c0IUeT-oXbtbOY,5716
3
+ multiclass_interface/multi_object_list.py,sha256=GmLKWUsu9Vf3Qcy7SlhxqPW_yDw2pzo2EFkkF8R94Dg,2022
4
+ multiclass_interface/multiprocess_interface.py,sha256=S0gO9u4mQrbhpxarKMD0i7M35EVC9vaKjp3Ls4Y26KU,8169
5
+ multiclass_interface/version.py,sha256=ygh-DNoh7nLBcVxwMCbHzWEyaJaMAEWs6Q04Ah2QTz0,406
6
+ multiclass_interface/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
+ multiclass_interface/tests/my_test_cls.py,sha256=KDcM0zcwwFAcXJhHdl0KHd45MaqHvR8mxHdoUqmbC_E,826
8
+ multiclass_interface/tests/test_mpi.py,sha256=aDIvB3o5MNHfkLxCiTl-crIDXyLYbFt9hpRZlop3i7I,2408
9
+ multiclass_interface/tests/test_multiclass_list.py,sha256=W7w5wiA3-_wgL9lOCRDsCijikJiHVrp5RqBYwJzWxp4,515
10
+ multiclass_interface/tests/test_multiprocessinterface.py,sha256=u2BVzoq7YB7L4jwKiveyQheCgQ2O7CGg5nQl9M1rTzM,3165
11
+ Multiclass_interface-1.2.dist-info/LICENSE,sha256=oApPkWzMlqIJF9EOB2gV6yvdsm6a2-AW94wuayHIz70,1094
12
+ Multiclass_interface-1.2.dist-info/METADATA,sha256=HVPvQX8xwZMqsF8wQjK3JPLjLOj5Uv6B3G35Z1pgSSo,1580
13
+ Multiclass_interface-1.2.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
14
+ Multiclass_interface-1.2.dist-info/top_level.txt,sha256=LOL3xjSUkjW6thjDr0IMvgkitnbsNokahxl-HjgOJG4,21
15
+ Multiclass_interface-1.2.dist-info/RECORD,,
@@ -1,27 +1,24 @@
1
1
  import numpy as np
2
2
  import sys
3
- import os
4
- import subprocess
5
3
  import traceback
6
4
  import inspect
7
- from enum import Enum
8
5
 
9
- if 'SLURM_NTASKS' in os.environ:
10
- mpi = int(os.environ['SLURM_NTASKS']) > 1
11
- elif any([k in os.environ for k in ['MPI_LOCALNRANKS', 'OMPI_COMM_WORLD_SIZE']]):
12
- mpi = True
13
- else:
14
- mpi = subprocess.run("python -c 'from mpi4py import MPI'", shell=True,
15
- check=False, stderr=subprocess.PIPE).returncode == 0
6
+ comm = None
7
+ size = 1
8
+ rank = 0
9
+ name = ""
10
+ main = True
16
11
 
17
- if mpi:
12
+
13
+ def activate_mpi():
14
+ global comm, size, rank, name, main
18
15
  from mpi4py import MPI
19
16
  comm = MPI.COMM_WORLD
20
17
  size = MPI.COMM_WORLD.Get_size()
21
18
  rank = MPI.COMM_WORLD.Get_rank()
22
19
  name = MPI.Get_processor_name()
23
- else:
24
- size = 1
20
+ main = rank == 0
21
+
25
22
 
26
23
  MPIClassInterfaceAttributes = {
27
24
  'close',
@@ -48,8 +48,9 @@ def run(cls, inputQueue, outputQueue, cls_args, **kwargs):
48
48
  class ProcessClass():
49
49
  cls = None
50
50
 
51
- def __init__(self, cls, cls_attrs={}):
51
+ def __init__(self, cls, cls_attrs={}, index=""):
52
52
  self.cls_attrs = cls_attrs
53
+ self.index = index
53
54
  self.cls = cls
54
55
  self.ctx = multiprocessing.get_context('spawn')
55
56
  self.inputQueue = self.ctx.Queue()
@@ -103,7 +104,7 @@ class ProcessClass():
103
104
  return self.get_result(raise_exception=True, cmd=lambda: f"checking if '{name}' is callable")
104
105
 
105
106
  def __setattr__(self, name, value):
106
- if name in {'cls', 'ctx', 'inputQueue', 'outputQueue', 'closed', 'process', 'cls_attrs'}:
107
+ if name in {'cls', 'ctx', 'inputQueue', 'outputQueue', 'closed', 'process', 'cls_attrs', 'index'}:
107
108
  return object.__setattr__(self, name, value)
108
109
  else:
109
110
  self.inputQueue.put(('setattr', (name, value), {}))
@@ -124,7 +125,10 @@ class ProcessClass():
124
125
  else:
125
126
  if hasattr(cmd, '__call__'):
126
127
  cmd = cmd()
127
- e = Exception(f'{self.cls.__name__} process died before or while {cmd}')
128
+ p_id = f'{self.cls.__name__} process'
129
+ if self.index:
130
+ p_id += f" index {self.index}"
131
+ e = Exception(f'{p_id} died before or while {cmd}')
128
132
  if raise_exception:
129
133
  raise e
130
134
  return e
@@ -153,7 +157,8 @@ class ThreadClass(ProcessClass):
153
157
  class MultiProcessClassInterface(MultiObjectList):
154
158
 
155
159
  def __init__(self, cls, args_lst, cls_attrs={}):
156
- MultiObjectList.__init__(self, [ProcessClass(cls, cls_attrs)(*args) for args in args_lst], SubsetProcessWrapper)
160
+ MultiObjectList.__init__(self, [ProcessClass(cls, cls_attrs, i)(*args)
161
+ for i, args in enumerate(args_lst)], SubsetProcessWrapper)
157
162
 
158
163
  def __getattr__(self, name):
159
164
  obj_lst = self.obj_lst
@@ -46,9 +46,9 @@ def mpitest_mpi_ProcessClass():
46
46
 
47
47
 
48
48
  def mpitest_all():
49
+ mpi_interface.activate_mpi()
49
50
  mpi_interface.exit_mpi_on_close = False
50
- from mpi4py import MPI
51
- rank = MPI.COMM_WORLD.Get_rank()
51
+ rank = mpi_interface.rank
52
52
  from multiclass_interface.tests.test_multiprocessinterface import test_attribute, test_missing_attribute, test_execption, test_setattr, test_setattr_method
53
53
  mpi_interface.TERMINATE_ON_CLOSE = False
54
54
 
@@ -79,11 +79,12 @@ def test_subset(mpri):
79
79
  mpri[1].close()
80
80
 
81
81
 
82
- def test_():
83
- pri = ProcessClass(MyTest)(1)
82
+ @pytest.mark.parametrize('index,s', [('', ''), (5, ' index 5')])
83
+ def test_dying_process(index, s):
84
+ pri = ProcessClass(MyTest, index=index)(1)
84
85
 
85
86
  def run():
86
- with pytest.raises(Exception, match="MyTest process died before or while checking if 'work' is callable"):
87
+ with pytest.raises(Exception, match=f"MyTest process{s} died before or while checking if 'work' is callable"):
87
88
  pri.work(5)
88
89
  t = Thread(target=run)
89
90
  t.start()
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '1.0'
16
- __version_tuple__ = version_tuple = (1, 0)
15
+ __version__ = version = '1.2'
16
+ __version_tuple__ = version_tuple = (1, 2)
@@ -1,15 +0,0 @@
1
- multiclass_interface/__init__.py,sha256=1kI9Vxsap_8eap6kldNHhIWLEVBT2DLWl2UbTOTnVN0,114
2
- multiclass_interface/mpi_interface.py,sha256=x-ZQHklNuyzhsnzGMayGaWOkK-RVitT483oZ2FGHeB4,5993
3
- multiclass_interface/multi_object_list.py,sha256=GmLKWUsu9Vf3Qcy7SlhxqPW_yDw2pzo2EFkkF8R94Dg,2022
4
- multiclass_interface/multiprocess_interface.py,sha256=_mgQeX-YJctyPEKyXH_WguUM6FeTJfLc7B0WSTf4MAk,7958
5
- multiclass_interface/version.py,sha256=NqIxvFkGTmjWkkWwq7_lHTaOlQBhNyI1nf75AHO9AOs,406
6
- multiclass_interface/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- multiclass_interface/tests/my_test_cls.py,sha256=KDcM0zcwwFAcXJhHdl0KHd45MaqHvR8mxHdoUqmbC_E,826
8
- multiclass_interface/tests/test_mpi.py,sha256=J-B-_ndKG6z5-uDz-nvA7AyHHK7aBcI5VTHYHGJ33gc,2409
9
- multiclass_interface/tests/test_multiclass_list.py,sha256=W7w5wiA3-_wgL9lOCRDsCijikJiHVrp5RqBYwJzWxp4,515
10
- multiclass_interface/tests/test_multiprocessinterface.py,sha256=JXD3DdB9dV8-m8X0K-DMNIOUW79i01Ex3Z_AAZIMcLc,3062
11
- Multiclass_interface-1.0.dist-info/LICENSE,sha256=oApPkWzMlqIJF9EOB2gV6yvdsm6a2-AW94wuayHIz70,1094
12
- Multiclass_interface-1.0.dist-info/METADATA,sha256=c0heDby7rIcBKtDUjmefmuqBHiTcvlzUk8O7Tw4r9_o,1580
13
- Multiclass_interface-1.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
14
- Multiclass_interface-1.0.dist-info/top_level.txt,sha256=LOL3xjSUkjW6thjDr0IMvgkitnbsNokahxl-HjgOJG4,21
15
- Multiclass_interface-1.0.dist-info/RECORD,,