pypharm 1.2.7__tar.gz → 1.2.8__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.
- {pypharm-1.2.7 → pypharm-1.2.8}/PKG-INFO +69 -1
- pypharm-1.2.8/PyPharm/__init__.py +1 -0
- {pypharm-1.2.7 → pypharm-1.2.8}/PyPharm/models.py +167 -30
- pypharm-1.2.8/README.md +188 -0
- {pypharm-1.2.7 → pypharm-1.2.8}/pypharm.egg-info/PKG-INFO +69 -1
- {pypharm-1.2.7 → pypharm-1.2.8}/setup.py +1 -1
- pypharm-1.2.7/PyPharm/__init__.py +0 -1
- pypharm-1.2.7/README.md +0 -121
- {pypharm-1.2.7 → pypharm-1.2.8}/PyPharm/country_optimization.py +0 -0
- {pypharm-1.2.7 → pypharm-1.2.8}/PyPharm/country_optimization_v2.py +0 -0
- {pypharm-1.2.7 → pypharm-1.2.8}/pypharm.egg-info/SOURCES.txt +0 -0
- {pypharm-1.2.7 → pypharm-1.2.8}/pypharm.egg-info/dependency_links.txt +0 -0
- {pypharm-1.2.7 → pypharm-1.2.8}/pypharm.egg-info/requires.txt +0 -0
- {pypharm-1.2.7 → pypharm-1.2.8}/pypharm.egg-info/top_level.txt +0 -0
- {pypharm-1.2.7 → pypharm-1.2.8}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: pypharm
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.8
|
|
4
4
|
Summary: Module for solving pharmacokinetic problems
|
|
5
5
|
Home-page: https://github.com/Krash13/PyPharm
|
|
6
6
|
Author: Krash13
|
|
@@ -136,3 +136,71 @@ model.optimize(
|
|
|
136
136
|
)
|
|
137
137
|
```
|
|
138
138
|
|
|
139
|
+
При оптимизации, вектор неизвестных это
|
|
140
|
+
x = [configuration_matrix (неизвестные), outputs(неизвестные), volumes(неизвестные)]
|
|
141
|
+
|
|
142
|
+
**4) Модель MagicCompartmentModel**
|
|
143
|
+
|
|
144
|
+
Данная модель необходима нам для тех случаев,
|
|
145
|
+
когда мы не знаем как именно стоит переводить входные
|
|
146
|
+
единицы измерения в выходные.
|
|
147
|
+
|
|
148
|
+
В модель добавляется 2 дополнительных параметра:
|
|
149
|
+
|
|
150
|
+
* magic_coefficient - множитель преобразования входных единиц в выходные;
|
|
151
|
+
* exclude_compartments - список номеров камер, которые не
|
|
152
|
+
подвергнутся преобразованию.
|
|
153
|
+
|
|
154
|
+
```python
|
|
155
|
+
from PyPharm import MagicCompartmentModel
|
|
156
|
+
|
|
157
|
+
model = MagicCompartmentModel([[0, 0.4586], [0.1919, 0]], [0.0309, 0], volumes=[228, 629], magic_coefficient=None, exclude_compartments=[2])
|
|
158
|
+
|
|
159
|
+
res = model(90, d=5700, compartment_number=0)
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
Параметр magic_coefficient может быть задан None,
|
|
163
|
+
в таком случае он будет подвергнут оптимизации, в таком
|
|
164
|
+
случае он будет браться из последнего значения в векторе
|
|
165
|
+
переменных.
|
|
166
|
+
Если оба параметра не заданы, то модель выраздается
|
|
167
|
+
в простую BaseCompartmentModel.
|
|
168
|
+
|
|
169
|
+
**5) Модель MagicCompartmentModel**
|
|
170
|
+
|
|
171
|
+
Данная модель учитывает поправку на высвобождение
|
|
172
|
+
ЛВ в модель вводятся дополнительные параметры:
|
|
173
|
+
* v_release - Объем гепотетической камеры из которой происходит высвобождение
|
|
174
|
+
* release_parameters - Параметры функции высвобождения
|
|
175
|
+
* release_compartment - Номер камеры в которую происходит высвобождение
|
|
176
|
+
* release_function - Функция высвобождения по умолчанию f(t,m,b,c) = c0 * c * t ** b / (t ** b + m)
|
|
177
|
+
|
|
178
|
+
При этом d и c0 теперь везде носят характер параметров камеры,
|
|
179
|
+
из которой происходит высвобождение
|
|
180
|
+
```python
|
|
181
|
+
from PyPharm import ReleaseCompartmentModel
|
|
182
|
+
import matplotlib.pyplot as plt
|
|
183
|
+
|
|
184
|
+
model = ReleaseCompartmentModel(
|
|
185
|
+
6.01049235e+00,
|
|
186
|
+
[4.56683781e-03, 1.36845756e+00, 5.61175978e-01],
|
|
187
|
+
0,
|
|
188
|
+
configuration_matrix=[[0, 1.18292665e+01], [3.02373800e-01, 0]],
|
|
189
|
+
outputs=[5.00000000e+00, 0],
|
|
190
|
+
volumes=[1.98530383e+01, 3.81007392e+02],
|
|
191
|
+
numba_option=True
|
|
192
|
+
)
|
|
193
|
+
teoretic_t = [5/60, 0.25, 0.5, 1, 2, 4, 24, 48]
|
|
194
|
+
teoretic_c = [[3558.19, 508.49, 230.95, 52.05, 44.97, 36.52, 17.89, 10.36]]
|
|
195
|
+
d = 5 * 0.02 * 1000000
|
|
196
|
+
res = model(48, d=d)
|
|
197
|
+
plt.plot(teoretic_t, teoretic_c[0], 'r*')
|
|
198
|
+
plt.plot(res.t, res.y[0])
|
|
199
|
+
plt.grid()
|
|
200
|
+
plt.show()
|
|
201
|
+
```
|
|
202
|
+
Параметры release_parameters и v_release могут подвергаться оптимизации
|
|
203
|
+
в таком случае, искомое нужно просто задать как None. Тогда вектор неизвестных это
|
|
204
|
+
x = [configuration_matrix (неизвестные), outputs(неизвестные), volumes(неизвестные), release_parameters(неизвестные), v_release]
|
|
205
|
+
|
|
206
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from .models import BaseCompartmentModel, MagicCompartmentModel, ReleaseCompartmentModel
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import numpy as np
|
|
2
|
-
from scipy.integrate import solve_ivp
|
|
2
|
+
from scipy.integrate import solve_ivp, RK45
|
|
3
|
+
from scipy.integrate._ivp.rk import rk_step, SAFETY, MAX_FACTOR, MIN_FACTOR
|
|
3
4
|
from scipy.optimize import minimize
|
|
4
5
|
from .country_optimization import CountriesAlgorithm
|
|
5
6
|
from .country_optimization_v2 import CountriesAlgorithm_v2
|
|
@@ -236,7 +237,7 @@ class BaseCompartmentModel:
|
|
|
236
237
|
return x
|
|
237
238
|
|
|
238
239
|
|
|
239
|
-
class
|
|
240
|
+
class MagicCompartmentModel(BaseCompartmentModel):
|
|
240
241
|
|
|
241
242
|
need_magic_optimization = False
|
|
242
243
|
|
|
@@ -274,49 +275,185 @@ class MagicCompartmentModelWith(BaseCompartmentModel):
|
|
|
274
275
|
|
|
275
276
|
class ReleaseCompartmentModel(BaseCompartmentModel):
|
|
276
277
|
|
|
277
|
-
|
|
278
|
+
need_v_release_optimization = False
|
|
279
|
+
|
|
280
|
+
class ReleaseRK45(RK45):
|
|
281
|
+
|
|
282
|
+
def __init__(self, fun, t0, y0, t_bound, release_function, compartment_number, c0, max_step=np.inf,
|
|
283
|
+
rtol=1e-3, atol=1e-6, vectorized=False,
|
|
284
|
+
first_step=None, **extraneous):
|
|
285
|
+
super().__init__(fun, t0, y0, t_bound, max_step=max_step,
|
|
286
|
+
rtol=rtol, atol=atol, vectorized=vectorized,
|
|
287
|
+
first_step=first_step, **extraneous)
|
|
288
|
+
self.release_function = release_function
|
|
289
|
+
self.compartment_number = compartment_number
|
|
290
|
+
self.c0 = c0
|
|
291
|
+
self.old_release_correction = 0
|
|
292
|
+
|
|
293
|
+
def _step_impl(self):
|
|
294
|
+
result = super()._step_impl()
|
|
295
|
+
release_correction = self.release_function(self.t, self.c0)
|
|
296
|
+
self.y[self.compartment_number] += release_correction - self.old_release_correction
|
|
297
|
+
self.old_release_correction = release_correction
|
|
298
|
+
return result
|
|
299
|
+
|
|
300
|
+
def __init__(self, v_release, release_parameters, release_compartment, release_function=None, *args, **kwargs):
|
|
301
|
+
"""
|
|
302
|
+
Камерная модель с высвобождением для описания фармакокинетики системы
|
|
303
|
+
|
|
304
|
+
Неизвестные параметры при необходимости задаются как None
|
|
305
|
+
например configuration_matrix = [[0, 1], [None, 0]]
|
|
306
|
+
|
|
307
|
+
Args:
|
|
308
|
+
configuration_matrix: Настроечная матрица модели, отображающая константы перехода между матрицами
|
|
309
|
+
outputs: Вектор констант перехода во вне камер
|
|
310
|
+
volumes: Объемы камер
|
|
311
|
+
v_release: Объем гепотетической камеры из которой происходит высвобождение
|
|
312
|
+
release_parameters: Параметры функции высвобождения
|
|
313
|
+
release_compartment: Номер камеры в которую происходит высвобождение
|
|
314
|
+
release_function: Функция высвобождения по умолчанию f(t,m,b,c) = c0 * c * t ** b / (t ** b + m)
|
|
315
|
+
"""
|
|
278
316
|
super().__init__(*args, **kwargs)
|
|
279
317
|
self.release_parameters = np.array(release_parameters)
|
|
280
318
|
self.release_parameters_target_count = 0
|
|
281
319
|
if np.any(self.release_parameters == None):
|
|
282
320
|
self.release_parameters_target = np.where(self.release_parameters == None)
|
|
283
321
|
self.release_parameters_target_count = np.sum(self.release_parameters == None)
|
|
284
|
-
self.
|
|
322
|
+
self.v_release = v_release
|
|
323
|
+
if self.v_release is None:
|
|
324
|
+
self.need_v_release_optimization = True
|
|
325
|
+
self.release_compartment = release_compartment
|
|
326
|
+
self.release_function = release_function
|
|
285
327
|
|
|
286
|
-
def
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
328
|
+
def load_data_from_list(self, x):
|
|
329
|
+
super().load_data_from_list(x)
|
|
330
|
+
s = self.configuration_matrix_target_count + self.outputs_target_count + self.volumes_target_count
|
|
331
|
+
if self.release_parameters_target:
|
|
332
|
+
self.release_parameters[self.release_parameters_target] = x[s:s + self.release_parameters_target_count]
|
|
333
|
+
if self.need_v_release_optimization:
|
|
334
|
+
self.v_release = x[s + self.release_parameters_target_count]
|
|
292
335
|
|
|
293
|
-
def
|
|
336
|
+
def _default_release_function(self, t, c0):
|
|
294
337
|
"""
|
|
295
338
|
Функция для поправки на высвобождение
|
|
296
339
|
"""
|
|
297
|
-
m, b, c = self.
|
|
340
|
+
m, b, c = self.release_parameters
|
|
298
341
|
return c0 * c * t ** b / (t ** b + m)
|
|
299
342
|
|
|
300
|
-
def
|
|
343
|
+
def get_release_function(self):
|
|
344
|
+
if self.release_function is not None:
|
|
345
|
+
return lambda t, c0: self.release_function(t, c0, *self.release_parameters)
|
|
346
|
+
else:
|
|
347
|
+
return self._default_release_function
|
|
348
|
+
|
|
349
|
+
def __call__(self, t_max, c0=None, d=None, max_step=0.01, t_eval=None, **kwargs):
|
|
350
|
+
"""
|
|
351
|
+
Расчет кривых концентраций по фармакокинетической модели
|
|
352
|
+
|
|
353
|
+
Args:
|
|
354
|
+
t_max: Предельное время расчета
|
|
355
|
+
c0: Начальная концентрация в камере из которой высвобождается вещество
|
|
356
|
+
d: Вводимая доза
|
|
357
|
+
max_step: Максимальный шаг при решении СДУ
|
|
358
|
+
t_eval: Временные точки, в которых необходимо молучить решение
|
|
359
|
+
|
|
360
|
+
Returns:
|
|
361
|
+
Результат работы решателя scipy solve_ivp
|
|
362
|
+
"""
|
|
301
363
|
if not self._optim:
|
|
302
364
|
assert (not any([self.configuration_matrix_target, self.outputs_target, self.volumes_target])), \
|
|
303
365
|
"It is impossible to make a calculation with unknown parameters"
|
|
304
|
-
assert any([c0 is not None, d
|
|
366
|
+
assert any([c0 is not None, d]), "Need to set c0 or d and compartment_number"
|
|
305
367
|
if c0 is None:
|
|
368
|
+
assert d, "Need to set d"
|
|
369
|
+
c0 = d / self.v_release
|
|
370
|
+
ts = [0, t_max]
|
|
371
|
+
y0 = np.zeros(self.outputs.shape)
|
|
372
|
+
self.last_result = solve_ivp(
|
|
373
|
+
fun=self._сompartment_model if
|
|
374
|
+
not self.numba_option
|
|
375
|
+
else lambda t, c: self._numba_сompartment_model(t, c,
|
|
376
|
+
self.configuration_matrix.astype(
|
|
377
|
+
np.float64),
|
|
378
|
+
self.outputs.astype(
|
|
379
|
+
np.float64),
|
|
380
|
+
self.volumes.astype(
|
|
381
|
+
np.float64)),
|
|
382
|
+
t_span=ts,
|
|
383
|
+
y0=y0,
|
|
384
|
+
max_step=max_step,
|
|
385
|
+
t_eval=t_eval,
|
|
386
|
+
method=self.ReleaseRK45,
|
|
387
|
+
release_function=self.get_release_function(),
|
|
388
|
+
compartment_number=self.release_compartment,
|
|
389
|
+
c0=c0
|
|
390
|
+
)
|
|
391
|
+
return self.last_result
|
|
392
|
+
|
|
393
|
+
def _target_function(self, x, max_step=0.01, metric='R2'):
|
|
394
|
+
"""
|
|
395
|
+
Функция расчета значения целевой функции
|
|
396
|
+
|
|
397
|
+
Args:
|
|
398
|
+
x: Значение искомых параметров модели
|
|
399
|
+
max_step: Максимальный шаг при решении СДУ
|
|
400
|
+
|
|
401
|
+
Returns:
|
|
402
|
+
Значение целевой функции, характеризующее отклонение от эксперементальных данных
|
|
403
|
+
"""
|
|
404
|
+
self.load_data_from_list(x)
|
|
405
|
+
c0 = self.c0
|
|
406
|
+
if c0 is None:
|
|
407
|
+
c0 = self.d / self.v_release
|
|
408
|
+
self(
|
|
409
|
+
t_max=np.max(self.teoretic_x),
|
|
410
|
+
c0=c0,
|
|
411
|
+
t_eval=self.teoretic_x,
|
|
412
|
+
max_step=max_step
|
|
413
|
+
)
|
|
414
|
+
target_results = self.last_result.y[tuple(self.know_compartments), :]
|
|
415
|
+
if metric == 'R2':
|
|
416
|
+
return np.sum(np.sum(self.w * ((target_results - self.teoretic_y) ** 2), axis=1) / np.sum((self.teoretic_avg - self.teoretic_y) ** 2, axis=1))
|
|
417
|
+
elif metric == 'norm':
|
|
418
|
+
return np.linalg.norm(target_results - self.teoretic_y)
|
|
419
|
+
else:
|
|
420
|
+
return np.sum(np.sum(self.w * ((target_results - self.teoretic_y) ** 2), axis=1) / np.sum((self.teoretic_avg - self.teoretic_y) ** 2, axis=1))
|
|
421
|
+
|
|
422
|
+
def load_optimization_data(self, teoretic_x, teoretic_y, know_compartments, w = None, c0=None, d=None, compartment_number=None):
|
|
423
|
+
"""
|
|
424
|
+
Функция загрузки в модель эксперементальных данных
|
|
425
|
+
|
|
426
|
+
Args:
|
|
427
|
+
teoretic_x: Вектор временных точек теоретических значений
|
|
428
|
+
teoretic_y: Матрица с теоретическими значениями
|
|
429
|
+
know_compartments: Вектор с номерами камер, по которым есть данные
|
|
430
|
+
c0: Начальная концентрация в камере из которой высвобождается вещество
|
|
431
|
+
d: Вводимая доза
|
|
432
|
+
|
|
433
|
+
Returns:
|
|
434
|
+
None
|
|
435
|
+
"""
|
|
436
|
+
self.teoretic_x = np.array(teoretic_x)
|
|
437
|
+
self.teoretic_y = np.array(teoretic_y)
|
|
438
|
+
self.know_compartments = know_compartments
|
|
439
|
+
self.teoretic_avg = np.average(self.teoretic_y, axis=1)
|
|
440
|
+
self.teoretic_avg = np.repeat(self.teoretic_avg, self.teoretic_x.size)
|
|
441
|
+
self.teoretic_avg = np.reshape(self.teoretic_avg, self.teoretic_y.shape)
|
|
442
|
+
assert any([c0, d, compartment_number is not None]), "Need to set c0 or d and compartment_number"
|
|
443
|
+
if not c0:
|
|
306
444
|
assert all([d, compartment_number is not None]), "Need to set d and compartment_number"
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
return result_x, result_y
|
|
445
|
+
self.d = d
|
|
446
|
+
self.c0 = None
|
|
447
|
+
else:
|
|
448
|
+
self.c0 = np.array(c0)
|
|
449
|
+
self.w = np.ones(self.teoretic_y.shape) if w is None else np.array(w)
|
|
450
|
+
|
|
451
|
+
def optimize(self, method=None, max_step=0.01, **kwargs):
|
|
452
|
+
x = super().optimize(method, max_step, **kwargs)
|
|
453
|
+
s = self.configuration_matrix_target_count + self.outputs_target_count + self.volumes_target_count
|
|
454
|
+
if self.release_parameters_target:
|
|
455
|
+
self.release_parameters[self.release_parameters_target] = x[s:s + self.release_parameters_target_count]
|
|
456
|
+
if self.need_v_release_optimization:
|
|
457
|
+
self.v_release = x[s:s + self.release_parameters_target_count + 1]
|
|
458
|
+
self.need_v_release_optimization = False
|
|
459
|
+
return x
|
pypharm-1.2.8/README.md
ADDED
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
PyPharm
|
|
2
|
+
----------
|
|
3
|
+
**1) Установка пакета**
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
pip install pypharm
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
**2) Пример использования пакета для модели, где все параметры известны**
|
|
10
|
+
|
|
11
|
+
Задана двухкамерная модель такого вида
|
|
12
|
+
|
|
13
|
+
```mermaid
|
|
14
|
+
graph LR
|
|
15
|
+
D((Доза D)) --> V1[Камера V1]
|
|
16
|
+
V1 -- k12 --> V2[Камера V2]
|
|
17
|
+
V2 -- k21 --> V1
|
|
18
|
+
V1 -- k10 --> Out(Выведение)
|
|
19
|
+
```
|
|
20
|
+
При этом, нам известны параметры модели
|
|
21
|
+
| V1|V2 |k12 |K21 | K10
|
|
22
|
+
|--|--|--|--|--|
|
|
23
|
+
| 228| 629 |0.4586|0.1919|0.0309
|
|
24
|
+
|
|
25
|
+
Создание и расчет модели при помощи пакета PyPharm
|
|
26
|
+
```python
|
|
27
|
+
from PyPharm import BaseCompartmentModel
|
|
28
|
+
|
|
29
|
+
model = BaseCompartmentModel([[0, 0.4586], [0.1919, 0]], [0.0309, 0], volumes=[228, 629])
|
|
30
|
+
|
|
31
|
+
res = model(90, d=5700, compartment_number=0)
|
|
32
|
+
```
|
|
33
|
+
res - Результат работы решателя scipy solve_iv
|
|
34
|
+
|
|
35
|
+
**3) Пример использования пакета для модели, где все параметры неизвестны**
|
|
36
|
+
|
|
37
|
+
Задана многокамерная модель такого вида
|
|
38
|
+
|
|
39
|
+
```mermaid
|
|
40
|
+
graph LR
|
|
41
|
+
Br(Мозг) --'Kbr-'--> Is[Межклетачное пространство]
|
|
42
|
+
Is --'Kbr+'-->Br
|
|
43
|
+
Is--'Kis-'-->B(Кровь)
|
|
44
|
+
B--'Kis+'-->Is
|
|
45
|
+
B--'Ke'-->Out1((Выведение))
|
|
46
|
+
B--'Ki+'-->I(Печень)
|
|
47
|
+
I--'Ki-'-->Out2((Выведение))
|
|
48
|
+
B--'Kh+'-->H(Сердце)
|
|
49
|
+
H--'Kh-'-->B
|
|
50
|
+
```
|
|
51
|
+
При этом, известен лишь параметр Ke=0.077
|
|
52
|
+
|
|
53
|
+
Создание и расчет модели при помощи пакета PyPharm, используя метод minimize:
|
|
54
|
+
```python
|
|
55
|
+
from PyPharm import BaseCompartmentModel
|
|
56
|
+
import numpy as np
|
|
57
|
+
matrix = [[0, None, 0, 0, 0],
|
|
58
|
+
[None, 0, None, 0, 0],
|
|
59
|
+
[0, None, 0, None, None],
|
|
60
|
+
[0, 0, 0, 0, 0],
|
|
61
|
+
[0, 0, None, 0, 0]]
|
|
62
|
+
outputs = [0, 0, 0.077, None, 0]
|
|
63
|
+
|
|
64
|
+
model = BaseCompartmentModel(matrix, outputs)
|
|
65
|
+
|
|
66
|
+
model.load_optimization_data(
|
|
67
|
+
teoretic_x=[0.25, 0.5, 1, 4, 8, 24],
|
|
68
|
+
teoretic_y=[[0, 0, 11.2, 5.3, 5.42, 3.2], [268.5, 783.3, 154.6, 224.2, 92.6, 0], [342, 637, 466, 235, 179, 158]],
|
|
69
|
+
know_compartments=[0, 3, 4],
|
|
70
|
+
c0=[0, 0, 20000, 0, 0]
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
x_min = [1.5, 0.01, 0.5, 0.0001, 0.1, 0.1, 4, 3]
|
|
74
|
+
x_max = [2.5, 0.7, 1.5, 0.05, 0.5, 0.5, 7, 5]
|
|
75
|
+
x0 = np.random.uniform(x_min, x_max)
|
|
76
|
+
bounds = ((1.5, 2.5), (0.01, 0.7), (0.5, 1.5), (0.0001, 0.05), (0.1, 0.5), (0.1, 0.5), (4, 7), (3, 5))
|
|
77
|
+
|
|
78
|
+
model.optimize(
|
|
79
|
+
bounds=bounds,
|
|
80
|
+
x0=x0,
|
|
81
|
+
options={'disp': True}
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
print(model.configuration_matrix)
|
|
85
|
+
```
|
|
86
|
+
Или же при помощи алгоритма взаимодействующих стран
|
|
87
|
+
```python
|
|
88
|
+
from PyPharm import BaseCompartmentModel
|
|
89
|
+
import numpy as np
|
|
90
|
+
matrix = [[0, None, 0, 0, 0],
|
|
91
|
+
[None, 0, None, 0, 0],
|
|
92
|
+
[0, None, 0, None, None],
|
|
93
|
+
[0, 0, 0, 0, 0],
|
|
94
|
+
[0, 0, None, 0, 0]]
|
|
95
|
+
outputs = [0, 0, 0.077, None, 0]
|
|
96
|
+
|
|
97
|
+
model = BaseCompartmentModel(matrix, outputs)
|
|
98
|
+
|
|
99
|
+
model.load_optimization_data(
|
|
100
|
+
teoretic_x=[0.25, 0.5, 1, 4, 8, 24],
|
|
101
|
+
teoretic_y=[[0, 0, 11.2, 5.3, 5.42, 3.2], [268.5, 783.3, 154.6, 224.2, 92.6, 0], [342, 637, 466, 235, 179, 158]],
|
|
102
|
+
know_compartments=[0, 3, 4],
|
|
103
|
+
c0=[0, 0, 20000, 0, 0]
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
model.optimize(
|
|
107
|
+
method='country_optimization',
|
|
108
|
+
Xmin=[0.5, 0.001, 0.001, 0.00001, 0.01, 0.01, 1, 1],
|
|
109
|
+
Xmax=[5, 2, 2.5, 0.3, 1, 1, 10, 10],
|
|
110
|
+
M=10,
|
|
111
|
+
N=25,
|
|
112
|
+
n=[1, 10],
|
|
113
|
+
p=[0.00001, 2],
|
|
114
|
+
m=[1, 8],
|
|
115
|
+
k=8,
|
|
116
|
+
l=3,
|
|
117
|
+
ep=[0.2, 0.4],
|
|
118
|
+
tmax=300,
|
|
119
|
+
printing=True,
|
|
120
|
+
)
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
При оптимизации, вектор неизвестных это
|
|
124
|
+
x = [configuration_matrix (неизвестные), outputs(неизвестные), volumes(неизвестные)]
|
|
125
|
+
|
|
126
|
+
**4) Модель MagicCompartmentModel**
|
|
127
|
+
|
|
128
|
+
Данная модель необходима нам для тех случаев,
|
|
129
|
+
когда мы не знаем как именно стоит переводить входные
|
|
130
|
+
единицы измерения в выходные.
|
|
131
|
+
|
|
132
|
+
В модель добавляется 2 дополнительных параметра:
|
|
133
|
+
|
|
134
|
+
* magic_coefficient - множитель преобразования входных единиц в выходные;
|
|
135
|
+
* exclude_compartments - список номеров камер, которые не
|
|
136
|
+
подвергнутся преобразованию.
|
|
137
|
+
|
|
138
|
+
```python
|
|
139
|
+
from PyPharm import MagicCompartmentModel
|
|
140
|
+
|
|
141
|
+
model = MagicCompartmentModel([[0, 0.4586], [0.1919, 0]], [0.0309, 0], volumes=[228, 629], magic_coefficient=None, exclude_compartments=[2])
|
|
142
|
+
|
|
143
|
+
res = model(90, d=5700, compartment_number=0)
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Параметр magic_coefficient может быть задан None,
|
|
147
|
+
в таком случае он будет подвергнут оптимизации, в таком
|
|
148
|
+
случае он будет браться из последнего значения в векторе
|
|
149
|
+
переменных.
|
|
150
|
+
Если оба параметра не заданы, то модель выраздается
|
|
151
|
+
в простую BaseCompartmentModel.
|
|
152
|
+
|
|
153
|
+
**5) Модель MagicCompartmentModel**
|
|
154
|
+
|
|
155
|
+
Данная модель учитывает поправку на высвобождение
|
|
156
|
+
ЛВ в модель вводятся дополнительные параметры:
|
|
157
|
+
* v_release - Объем гепотетической камеры из которой происходит высвобождение
|
|
158
|
+
* release_parameters - Параметры функции высвобождения
|
|
159
|
+
* release_compartment - Номер камеры в которую происходит высвобождение
|
|
160
|
+
* release_function - Функция высвобождения по умолчанию f(t,m,b,c) = c0 * c * t ** b / (t ** b + m)
|
|
161
|
+
|
|
162
|
+
При этом d и c0 теперь везде носят характер параметров камеры,
|
|
163
|
+
из которой происходит высвобождение
|
|
164
|
+
```python
|
|
165
|
+
from PyPharm import ReleaseCompartmentModel
|
|
166
|
+
import matplotlib.pyplot as plt
|
|
167
|
+
|
|
168
|
+
model = ReleaseCompartmentModel(
|
|
169
|
+
6.01049235e+00,
|
|
170
|
+
[4.56683781e-03, 1.36845756e+00, 5.61175978e-01],
|
|
171
|
+
0,
|
|
172
|
+
configuration_matrix=[[0, 1.18292665e+01], [3.02373800e-01, 0]],
|
|
173
|
+
outputs=[5.00000000e+00, 0],
|
|
174
|
+
volumes=[1.98530383e+01, 3.81007392e+02],
|
|
175
|
+
numba_option=True
|
|
176
|
+
)
|
|
177
|
+
teoretic_t = [5/60, 0.25, 0.5, 1, 2, 4, 24, 48]
|
|
178
|
+
teoretic_c = [[3558.19, 508.49, 230.95, 52.05, 44.97, 36.52, 17.89, 10.36]]
|
|
179
|
+
d = 5 * 0.02 * 1000000
|
|
180
|
+
res = model(48, d=d)
|
|
181
|
+
plt.plot(teoretic_t, teoretic_c[0], 'r*')
|
|
182
|
+
plt.plot(res.t, res.y[0])
|
|
183
|
+
plt.grid()
|
|
184
|
+
plt.show()
|
|
185
|
+
```
|
|
186
|
+
Параметры release_parameters и v_release могут подвергаться оптимизации
|
|
187
|
+
в таком случае, искомое нужно просто задать как None. Тогда вектор неизвестных это
|
|
188
|
+
x = [configuration_matrix (неизвестные), outputs(неизвестные), volumes(неизвестные), release_parameters(неизвестные), v_release]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: pypharm
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.8
|
|
4
4
|
Summary: Module for solving pharmacokinetic problems
|
|
5
5
|
Home-page: https://github.com/Krash13/PyPharm
|
|
6
6
|
Author: Krash13
|
|
@@ -136,3 +136,71 @@ model.optimize(
|
|
|
136
136
|
)
|
|
137
137
|
```
|
|
138
138
|
|
|
139
|
+
При оптимизации, вектор неизвестных это
|
|
140
|
+
x = [configuration_matrix (неизвестные), outputs(неизвестные), volumes(неизвестные)]
|
|
141
|
+
|
|
142
|
+
**4) Модель MagicCompartmentModel**
|
|
143
|
+
|
|
144
|
+
Данная модель необходима нам для тех случаев,
|
|
145
|
+
когда мы не знаем как именно стоит переводить входные
|
|
146
|
+
единицы измерения в выходные.
|
|
147
|
+
|
|
148
|
+
В модель добавляется 2 дополнительных параметра:
|
|
149
|
+
|
|
150
|
+
* magic_coefficient - множитель преобразования входных единиц в выходные;
|
|
151
|
+
* exclude_compartments - список номеров камер, которые не
|
|
152
|
+
подвергнутся преобразованию.
|
|
153
|
+
|
|
154
|
+
```python
|
|
155
|
+
from PyPharm import MagicCompartmentModel
|
|
156
|
+
|
|
157
|
+
model = MagicCompartmentModel([[0, 0.4586], [0.1919, 0]], [0.0309, 0], volumes=[228, 629], magic_coefficient=None, exclude_compartments=[2])
|
|
158
|
+
|
|
159
|
+
res = model(90, d=5700, compartment_number=0)
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
Параметр magic_coefficient может быть задан None,
|
|
163
|
+
в таком случае он будет подвергнут оптимизации, в таком
|
|
164
|
+
случае он будет браться из последнего значения в векторе
|
|
165
|
+
переменных.
|
|
166
|
+
Если оба параметра не заданы, то модель выраздается
|
|
167
|
+
в простую BaseCompartmentModel.
|
|
168
|
+
|
|
169
|
+
**5) Модель MagicCompartmentModel**
|
|
170
|
+
|
|
171
|
+
Данная модель учитывает поправку на высвобождение
|
|
172
|
+
ЛВ в модель вводятся дополнительные параметры:
|
|
173
|
+
* v_release - Объем гепотетической камеры из которой происходит высвобождение
|
|
174
|
+
* release_parameters - Параметры функции высвобождения
|
|
175
|
+
* release_compartment - Номер камеры в которую происходит высвобождение
|
|
176
|
+
* release_function - Функция высвобождения по умолчанию f(t,m,b,c) = c0 * c * t ** b / (t ** b + m)
|
|
177
|
+
|
|
178
|
+
При этом d и c0 теперь везде носят характер параметров камеры,
|
|
179
|
+
из которой происходит высвобождение
|
|
180
|
+
```python
|
|
181
|
+
from PyPharm import ReleaseCompartmentModel
|
|
182
|
+
import matplotlib.pyplot as plt
|
|
183
|
+
|
|
184
|
+
model = ReleaseCompartmentModel(
|
|
185
|
+
6.01049235e+00,
|
|
186
|
+
[4.56683781e-03, 1.36845756e+00, 5.61175978e-01],
|
|
187
|
+
0,
|
|
188
|
+
configuration_matrix=[[0, 1.18292665e+01], [3.02373800e-01, 0]],
|
|
189
|
+
outputs=[5.00000000e+00, 0],
|
|
190
|
+
volumes=[1.98530383e+01, 3.81007392e+02],
|
|
191
|
+
numba_option=True
|
|
192
|
+
)
|
|
193
|
+
teoretic_t = [5/60, 0.25, 0.5, 1, 2, 4, 24, 48]
|
|
194
|
+
teoretic_c = [[3558.19, 508.49, 230.95, 52.05, 44.97, 36.52, 17.89, 10.36]]
|
|
195
|
+
d = 5 * 0.02 * 1000000
|
|
196
|
+
res = model(48, d=d)
|
|
197
|
+
plt.plot(teoretic_t, teoretic_c[0], 'r*')
|
|
198
|
+
plt.plot(res.t, res.y[0])
|
|
199
|
+
plt.grid()
|
|
200
|
+
plt.show()
|
|
201
|
+
```
|
|
202
|
+
Параметры release_parameters и v_release могут подвергаться оптимизации
|
|
203
|
+
в таком случае, искомое нужно просто задать как None. Тогда вектор неизвестных это
|
|
204
|
+
x = [configuration_matrix (неизвестные), outputs(неизвестные), volumes(неизвестные), release_parameters(неизвестные), v_release]
|
|
205
|
+
|
|
206
|
+
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
from .models import BaseCompartmentModel, MagicCompartmentModelWith
|
pypharm-1.2.7/README.md
DELETED
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
PyPharm
|
|
2
|
-
----------
|
|
3
|
-
**1) Установка пакета**
|
|
4
|
-
|
|
5
|
-
```
|
|
6
|
-
pip install pypharm
|
|
7
|
-
```
|
|
8
|
-
|
|
9
|
-
**2) Пример использования пакета для модели, где все параметры известны**
|
|
10
|
-
|
|
11
|
-
Задана двухкамерная модель такого вида
|
|
12
|
-
|
|
13
|
-
```mermaid
|
|
14
|
-
graph LR
|
|
15
|
-
D((Доза D)) --> V1[Камера V1]
|
|
16
|
-
V1 -- k12 --> V2[Камера V2]
|
|
17
|
-
V2 -- k21 --> V1
|
|
18
|
-
V1 -- k10 --> Out(Выведение)
|
|
19
|
-
```
|
|
20
|
-
При этом, нам известны параметры модели
|
|
21
|
-
| V1|V2 |k12 |K21 | K10
|
|
22
|
-
|--|--|--|--|--|
|
|
23
|
-
| 228| 629 |0.4586|0.1919|0.0309
|
|
24
|
-
|
|
25
|
-
Создание и расчет модели при помощи пакета PyPharm
|
|
26
|
-
```python
|
|
27
|
-
from PyPharm import BaseCompartmentModel
|
|
28
|
-
|
|
29
|
-
model = BaseCompartmentModel([[0, 0.4586], [0.1919, 0]], [0.0309, 0], volumes=[228, 629])
|
|
30
|
-
|
|
31
|
-
res = model(90, d=5700, compartment_number=0)
|
|
32
|
-
```
|
|
33
|
-
res - Результат работы решателя scipy solve_iv
|
|
34
|
-
|
|
35
|
-
**3) Пример использования пакета для модели, где все параметры неизвестны**
|
|
36
|
-
|
|
37
|
-
Задана многокамерная модель такого вида
|
|
38
|
-
|
|
39
|
-
```mermaid
|
|
40
|
-
graph LR
|
|
41
|
-
Br(Мозг) --'Kbr-'--> Is[Межклетачное пространство]
|
|
42
|
-
Is --'Kbr+'-->Br
|
|
43
|
-
Is--'Kis-'-->B(Кровь)
|
|
44
|
-
B--'Kis+'-->Is
|
|
45
|
-
B--'Ke'-->Out1((Выведение))
|
|
46
|
-
B--'Ki+'-->I(Печень)
|
|
47
|
-
I--'Ki-'-->Out2((Выведение))
|
|
48
|
-
B--'Kh+'-->H(Сердце)
|
|
49
|
-
H--'Kh-'-->B
|
|
50
|
-
```
|
|
51
|
-
При этом, известен лишь параметр Ke=0.077
|
|
52
|
-
|
|
53
|
-
Создание и расчет модели при помощи пакета PyPharm, используя метод minimize:
|
|
54
|
-
```python
|
|
55
|
-
from PyPharm import BaseCompartmentModel
|
|
56
|
-
import numpy as np
|
|
57
|
-
matrix = [[0, None, 0, 0, 0],
|
|
58
|
-
[None, 0, None, 0, 0],
|
|
59
|
-
[0, None, 0, None, None],
|
|
60
|
-
[0, 0, 0, 0, 0],
|
|
61
|
-
[0, 0, None, 0, 0]]
|
|
62
|
-
outputs = [0, 0, 0.077, None, 0]
|
|
63
|
-
|
|
64
|
-
model = BaseCompartmentModel(matrix, outputs)
|
|
65
|
-
|
|
66
|
-
model.load_optimization_data(
|
|
67
|
-
teoretic_x=[0.25, 0.5, 1, 4, 8, 24],
|
|
68
|
-
teoretic_y=[[0, 0, 11.2, 5.3, 5.42, 3.2], [268.5, 783.3, 154.6, 224.2, 92.6, 0], [342, 637, 466, 235, 179, 158]],
|
|
69
|
-
know_compartments=[0, 3, 4],
|
|
70
|
-
c0=[0, 0, 20000, 0, 0]
|
|
71
|
-
)
|
|
72
|
-
|
|
73
|
-
x_min = [1.5, 0.01, 0.5, 0.0001, 0.1, 0.1, 4, 3]
|
|
74
|
-
x_max = [2.5, 0.7, 1.5, 0.05, 0.5, 0.5, 7, 5]
|
|
75
|
-
x0 = np.random.uniform(x_min, x_max)
|
|
76
|
-
bounds = ((1.5, 2.5), (0.01, 0.7), (0.5, 1.5), (0.0001, 0.05), (0.1, 0.5), (0.1, 0.5), (4, 7), (3, 5))
|
|
77
|
-
|
|
78
|
-
model.optimize(
|
|
79
|
-
bounds=bounds,
|
|
80
|
-
x0=x0,
|
|
81
|
-
options={'disp': True}
|
|
82
|
-
)
|
|
83
|
-
|
|
84
|
-
print(model.configuration_matrix)
|
|
85
|
-
```
|
|
86
|
-
Или же при помощи алгоритма взаимодействующих стран
|
|
87
|
-
```python
|
|
88
|
-
from PyPharm import BaseCompartmentModel
|
|
89
|
-
import numpy as np
|
|
90
|
-
matrix = [[0, None, 0, 0, 0],
|
|
91
|
-
[None, 0, None, 0, 0],
|
|
92
|
-
[0, None, 0, None, None],
|
|
93
|
-
[0, 0, 0, 0, 0],
|
|
94
|
-
[0, 0, None, 0, 0]]
|
|
95
|
-
outputs = [0, 0, 0.077, None, 0]
|
|
96
|
-
|
|
97
|
-
model = BaseCompartmentModel(matrix, outputs)
|
|
98
|
-
|
|
99
|
-
model.load_optimization_data(
|
|
100
|
-
teoretic_x=[0.25, 0.5, 1, 4, 8, 24],
|
|
101
|
-
teoretic_y=[[0, 0, 11.2, 5.3, 5.42, 3.2], [268.5, 783.3, 154.6, 224.2, 92.6, 0], [342, 637, 466, 235, 179, 158]],
|
|
102
|
-
know_compartments=[0, 3, 4],
|
|
103
|
-
c0=[0, 0, 20000, 0, 0]
|
|
104
|
-
)
|
|
105
|
-
|
|
106
|
-
model.optimize(
|
|
107
|
-
method='country_optimization',
|
|
108
|
-
Xmin=[0.5, 0.001, 0.001, 0.00001, 0.01, 0.01, 1, 1],
|
|
109
|
-
Xmax=[5, 2, 2.5, 0.3, 1, 1, 10, 10],
|
|
110
|
-
M=10,
|
|
111
|
-
N=25,
|
|
112
|
-
n=[1, 10],
|
|
113
|
-
p=[0.00001, 2],
|
|
114
|
-
m=[1, 8],
|
|
115
|
-
k=8,
|
|
116
|
-
l=3,
|
|
117
|
-
ep=[0.2, 0.4],
|
|
118
|
-
tmax=300,
|
|
119
|
-
printing=True,
|
|
120
|
-
)
|
|
121
|
-
```
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|