pypharm 1.2.10__py3-none-any.whl → 1.3.0__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.
- PyPharm/country_optimization.py +11 -1
- PyPharm/models.py +37 -7
- {pypharm-1.2.10.dist-info → pypharm-1.3.0.dist-info}/METADATA +31 -1
- pypharm-1.3.0.dist-info/RECORD +8 -0
- pypharm-1.2.10.dist-info/RECORD +0 -8
- {pypharm-1.2.10.dist-info → pypharm-1.3.0.dist-info}/WHEEL +0 -0
- {pypharm-1.2.10.dist-info → pypharm-1.3.0.dist-info}/top_level.txt +0 -0
PyPharm/country_optimization.py
CHANGED
|
@@ -2,6 +2,7 @@ import random
|
|
|
2
2
|
import numpy as np
|
|
3
3
|
from operator import attrgetter
|
|
4
4
|
from math import ceil, cos, sin
|
|
5
|
+
from multiprocessing import shared_memory
|
|
5
6
|
|
|
6
7
|
|
|
7
8
|
class Individual:
|
|
@@ -350,7 +351,7 @@ class Country:
|
|
|
350
351
|
|
|
351
352
|
class CountriesAlgorithm:
|
|
352
353
|
|
|
353
|
-
def __init__(self, f, Xmin, Xmax, M, N, n, p, m, k, l, ep, tmax, printing=False):
|
|
354
|
+
def __init__(self, f, Xmin, Xmax, M, N, n, p, m, k, l, ep, tmax, printing=False, memory_list=None):
|
|
354
355
|
self.f = f
|
|
355
356
|
self.Xmin = Xmin
|
|
356
357
|
self.Xmax = Xmax
|
|
@@ -363,6 +364,7 @@ class CountriesAlgorithm:
|
|
|
363
364
|
self.tmax = tmax
|
|
364
365
|
self.countries = []
|
|
365
366
|
self.printing = printing
|
|
367
|
+
self.memory_list = memory_list
|
|
366
368
|
for i in range(M):
|
|
367
369
|
self.countries.append(Country(self.Xmin, self.Xmax, N, self.f))
|
|
368
370
|
|
|
@@ -372,6 +374,8 @@ class CountriesAlgorithm:
|
|
|
372
374
|
trade = 0
|
|
373
375
|
war = 0
|
|
374
376
|
epedemic = 0
|
|
377
|
+
if self.memory_list is not None:
|
|
378
|
+
self.memory_list[0] = False
|
|
375
379
|
while ti <= self.tmax:
|
|
376
380
|
ti += 1
|
|
377
381
|
for country in self.countries:
|
|
@@ -457,6 +461,12 @@ class CountriesAlgorithm:
|
|
|
457
461
|
if self.printing:
|
|
458
462
|
print(f"{ti}) Лучшее решение: {result.x} - {result.f}, Стран осталось: {len(self.countries)}, Движение/Обмен/Войны/Эпидемии: {motion}/{trade}/{war}/{epedemic}")
|
|
459
463
|
print(f"Общее количество особей: {sum([len(country.population) for country in self.countries])}")
|
|
464
|
+
|
|
465
|
+
if self.memory_list is not None:
|
|
466
|
+
self.memory_list[0] = ti
|
|
467
|
+
for i in range(len(result.x)):
|
|
468
|
+
self.memory_list[i + 1] = float(result.x[i])
|
|
469
|
+
self.memory_list[-1] = float(result.f)
|
|
460
470
|
return (result.x, result.f, False, ti)
|
|
461
471
|
|
|
462
472
|
|
PyPharm/models.py
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from multiprocessing import shared_memory
|
|
2
|
+
|
|
1
3
|
import numpy as np
|
|
2
4
|
from scipy.integrate import solve_ivp, RK45
|
|
3
5
|
from scipy.integrate._ivp.rk import rk_step, SAFETY, MAX_FACTOR, MIN_FACTOR
|
|
@@ -16,7 +18,7 @@ class BaseCompartmentModel:
|
|
|
16
18
|
_optim = False
|
|
17
19
|
numba_option = False
|
|
18
20
|
|
|
19
|
-
def __init__(self, configuration_matrix, outputs, volumes=None, numba_option=False):
|
|
21
|
+
def __init__(self, configuration_matrix, outputs, volumes=None, numba_option=False, use_shared_memory=False):
|
|
20
22
|
"""
|
|
21
23
|
Базовая камерная модель для описания фармакокинетики системы
|
|
22
24
|
|
|
@@ -48,8 +50,18 @@ class BaseCompartmentModel:
|
|
|
48
50
|
self.volumes_target_count = np.sum(self.volumes == None)
|
|
49
51
|
self.last_result = None
|
|
50
52
|
self.numba_option = numba_option
|
|
51
|
-
|
|
52
|
-
|
|
53
|
+
self.use_shared_memory = use_shared_memory
|
|
54
|
+
if self.use_shared_memory:
|
|
55
|
+
self.memory_size = 2 + self.configuration_matrix_target_count + self.outputs_target_count + self.volumes_target_count
|
|
56
|
+
self.memory = shared_memory.ShareableList(self.memory_size * [None])
|
|
57
|
+
self.memory_name = self.memory.shm.name
|
|
58
|
+
|
|
59
|
+
def __del__(self):
|
|
60
|
+
if getattr(self, 'memory', None):
|
|
61
|
+
self.memory.shm.close()
|
|
62
|
+
self.memory.shm.unlink()
|
|
63
|
+
|
|
64
|
+
def _compartment_model(self, t, c):
|
|
53
65
|
"""
|
|
54
66
|
Функция для расчета камерной модели
|
|
55
67
|
|
|
@@ -67,7 +79,7 @@ class BaseCompartmentModel:
|
|
|
67
79
|
|
|
68
80
|
@staticmethod
|
|
69
81
|
@njit
|
|
70
|
-
def
|
|
82
|
+
def _numba_compartment_model(t, c, configuration_matrix, outputs, volumes):
|
|
71
83
|
"""
|
|
72
84
|
Функция для расчета камерной модели
|
|
73
85
|
|
|
@@ -110,7 +122,7 @@ class BaseCompartmentModel:
|
|
|
110
122
|
c0 = np.array(c0)
|
|
111
123
|
ts = [0, t_max]
|
|
112
124
|
self.last_result = solve_ivp(
|
|
113
|
-
fun=self.
|
|
125
|
+
fun=self._compartment_model if not self.numba_option else lambda t, c: self._numba_compartment_model(t, c, self.configuration_matrix.astype(np.float64), self.outputs.astype(np.float64), self.volumes.astype(np.float64)),
|
|
114
126
|
t_span=ts,
|
|
115
127
|
y0=c0,
|
|
116
128
|
max_step=max_step,
|
|
@@ -206,6 +218,7 @@ class BaseCompartmentModel:
|
|
|
206
218
|
if method == 'country_optimization':
|
|
207
219
|
CA = CountriesAlgorithm(
|
|
208
220
|
f=f,
|
|
221
|
+
memory_list=getattr(self, 'memory', None),
|
|
209
222
|
**kwargs
|
|
210
223
|
)
|
|
211
224
|
CA.start()
|
|
@@ -266,11 +279,19 @@ class MagicCompartmentModel(BaseCompartmentModel):
|
|
|
266
279
|
|
|
267
280
|
need_magic_optimization = False
|
|
268
281
|
|
|
269
|
-
def __init__(self, configuration_matrix, outputs, volumes=None, magic_coefficient=1, exclude_compartments=[], numba_option=False):
|
|
270
|
-
super().__init__(configuration_matrix, outputs, volumes, numba_option)
|
|
282
|
+
def __init__(self, configuration_matrix, outputs, volumes=None, magic_coefficient=1, exclude_compartments=[], numba_option=False, use_shared_memory=False):
|
|
283
|
+
super().__init__(configuration_matrix, outputs, volumes, numba_option, use_shared_memory)
|
|
271
284
|
self.magic_coefficient = magic_coefficient
|
|
272
285
|
self.exclude_compartments = np.array(exclude_compartments)
|
|
273
286
|
self.need_magic_optimization = self.magic_coefficient is None
|
|
287
|
+
if getattr(self, "memory", None):
|
|
288
|
+
self.memory.shm.close()
|
|
289
|
+
self.memory.shm.unlink()
|
|
290
|
+
self.memory_size += int(self.need_magic_optimization)
|
|
291
|
+
self.memory = shared_memory.ShareableList(
|
|
292
|
+
sequence=self.memory_size * [None]
|
|
293
|
+
)
|
|
294
|
+
self.memory_name = self.memory.shm.name
|
|
274
295
|
|
|
275
296
|
def __call__(self, t_max, c0=None, d=None, compartment_number=None, max_step=0.01, t_eval=None):
|
|
276
297
|
if not self._optim and not self.magic_coefficient:
|
|
@@ -350,6 +371,15 @@ class ReleaseCompartmentModel(BaseCompartmentModel):
|
|
|
350
371
|
self.release_compartment = release_compartment
|
|
351
372
|
self.release_function = release_function
|
|
352
373
|
|
|
374
|
+
if getattr(self, "memory", None):
|
|
375
|
+
self.memory.shm.close()
|
|
376
|
+
self.memory.shm.unlink()
|
|
377
|
+
self.memory_size += self.release_parameters_target_count + int(self.need_v_release_optimization)
|
|
378
|
+
self.memory = shared_memory.ShareableList(
|
|
379
|
+
sequence=self.memory_size * [None]
|
|
380
|
+
)
|
|
381
|
+
self.memory_name = self.memory.shm.name
|
|
382
|
+
|
|
353
383
|
def load_data_from_list(self, x):
|
|
354
384
|
super().load_data_from_list(x)
|
|
355
385
|
s = self.configuration_matrix_target_count + self.outputs_target_count + self.volumes_target_count
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: pypharm
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.3.0
|
|
4
4
|
Summary: Module for solving pharmacokinetic problems
|
|
5
5
|
Home-page: https://github.com/Krash13/PyPharm
|
|
6
6
|
Author: Krash13
|
|
@@ -207,6 +207,22 @@ plt.show()
|
|
|
207
207
|
в таком случае, искомое нужно просто задать как None. Тогда вектор неизвестных это
|
|
208
208
|
x = [configuration_matrix (неизвестные), outputs(неизвестные), volumes(неизвестные), release_parameters(неизвестные), v_release]
|
|
209
209
|
|
|
210
|
+
|
|
211
|
+
**6) Использование shared_memory**
|
|
212
|
+
|
|
213
|
+
Начиная с версии 1.3.0, вы можете использовать **shared_memory** для получения текущих данных
|
|
214
|
+
оптимизации. Имя нужного вам участка памяти хранится в поле **memory_name**.
|
|
215
|
+
|
|
216
|
+
```python
|
|
217
|
+
from multiprocessing import shared_memory
|
|
218
|
+
|
|
219
|
+
c = shared_memory.ShareableList(name='<your model.memory_name>')
|
|
220
|
+
print(c)
|
|
221
|
+
# ShareableList([4, 3.5192100752465563, 1.4158559227257506, 1.7264077213115414, 0.008336751860551, 0.2549196311342251, 0.5160375718404234, 6.915499993374695, 2.944744649331201, 0.5, 1.907294741996761], name='wnsm_0c50aa90')
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
Данные хранятся в формате списка [текущая_итерация, x0, ... , xn, f], работает только для алгоритма country_optimization.
|
|
225
|
+
|
|
210
226
|
**ENG documentation**
|
|
211
227
|
----------
|
|
212
228
|
|
|
@@ -397,3 +413,17 @@ The release_parameters and v_release parameters can be optimized
|
|
|
397
413
|
in this case, you just need to set the desired value as None. Then the vector of unknowns is
|
|
398
414
|
x = [configuration_matrix (unknown), outputs(unknown), volumes(unknown), release_parameters(unknown), v_release]
|
|
399
415
|
|
|
416
|
+
**6) Using shared_memory**
|
|
417
|
+
|
|
418
|
+
Since version 1.3.0, you can use **shared_memory** to get current data
|
|
419
|
+
optimization. The name of the memory location you need is stored in the **memory_name** field.
|
|
420
|
+
```python
|
|
421
|
+
from multiprocessing import shared_memory
|
|
422
|
+
|
|
423
|
+
c = shared_memory.ShareableList(name='<your model.memory_name>')
|
|
424
|
+
print(c)
|
|
425
|
+
# ShareableList([4, 3.5192100752465563, 1.4158559227257506, 1.7264077213115414, 0.008336751860551, 0.2549196311342251, 0.5160375718404234, 6.915499993374695, 2.944744649331201, 0.5, 1.907294741996761], name='wnsm_0c50aa90')
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
The data is stored in list format [current_iteration, x0, ... , xn, f], works only for the country_optimization algorithm.
|
|
429
|
+
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
PyPharm/__init__.py,sha256=hxhMRlWpLMARQV-ZNYkmvhQ9gCYI18an75vlySWjA6s,90
|
|
2
|
+
PyPharm/country_optimization.py,sha256=WsjfAWAWbxRnUUfBiMi1VatCSVbru7F1_G6kQBRVyA0,20452
|
|
3
|
+
PyPharm/country_optimization_v2.py,sha256=3d2mt15DXdr1V3soIJS51xuCv6uzH8pirah1RnI5--8,13156
|
|
4
|
+
PyPharm/models.py,sha256=Lhd_2EUtGQUrratvlqZ115zLeF9fFLDPI1gi-mzjv_o,25663
|
|
5
|
+
pypharm-1.3.0.dist-info/METADATA,sha256=cUh197fi8fP5x7Do-6Is-RpC2X-z6j8ZLo-ZkJOSTrU,14464
|
|
6
|
+
pypharm-1.3.0.dist-info/WHEEL,sha256=OqRkF0eY5GHssMorFjlbTIq072vpHpF60fIQA6lS9xA,92
|
|
7
|
+
pypharm-1.3.0.dist-info/top_level.txt,sha256=yybfSkKw8q1G3aEcnlfVL7_L9ufGFSAYZnpc7q6oYJk,8
|
|
8
|
+
pypharm-1.3.0.dist-info/RECORD,,
|
pypharm-1.2.10.dist-info/RECORD
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
PyPharm/__init__.py,sha256=hxhMRlWpLMARQV-ZNYkmvhQ9gCYI18an75vlySWjA6s,90
|
|
2
|
-
PyPharm/country_optimization.py,sha256=nbg5kuJcOhMMfPR0_1O8KUzyqHApUcnqgs_I2I0Z1Gs,20008
|
|
3
|
-
PyPharm/country_optimization_v2.py,sha256=3d2mt15DXdr1V3soIJS51xuCv6uzH8pirah1RnI5--8,13156
|
|
4
|
-
PyPharm/models.py,sha256=6loQuWoPjSAAzHlERF6Bszjh7iyasX8RMe-cqbq4Fws,24228
|
|
5
|
-
pypharm-1.2.10.dist-info/METADATA,sha256=pAZ6OkaCelCdBSf3LHKdE8dU3_WAbqHqwPjcFhZsuz0,12911
|
|
6
|
-
pypharm-1.2.10.dist-info/WHEEL,sha256=OqRkF0eY5GHssMorFjlbTIq072vpHpF60fIQA6lS9xA,92
|
|
7
|
-
pypharm-1.2.10.dist-info/top_level.txt,sha256=yybfSkKw8q1G3aEcnlfVL7_L9ufGFSAYZnpc7q6oYJk,8
|
|
8
|
-
pypharm-1.2.10.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|