pypharm 1.2.6__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.6 → pypharm-1.2.8}/PKG-INFO +69 -1
- pypharm-1.2.8/PyPharm/__init__.py +1 -0
- {pypharm-1.2.6 → pypharm-1.2.8}/PyPharm/models.py +177 -34
- pypharm-1.2.8/README.md +188 -0
- {pypharm-1.2.6 → pypharm-1.2.8}/pypharm.egg-info/PKG-INFO +69 -1
- {pypharm-1.2.6 → pypharm-1.2.8}/setup.py +1 -1
- pypharm-1.2.6/PyPharm/__init__.py +0 -1
- pypharm-1.2.6/README.md +0 -121
- {pypharm-1.2.6 → pypharm-1.2.8}/PyPharm/country_optimization.py +0 -0
- {pypharm-1.2.6 → pypharm-1.2.8}/PyPharm/country_optimization_v2.py +0 -0
- {pypharm-1.2.6 → pypharm-1.2.8}/pypharm.egg-info/SOURCES.txt +0 -0
- {pypharm-1.2.6 → pypharm-1.2.8}/pypharm.egg-info/dependency_links.txt +0 -0
- {pypharm-1.2.6 → pypharm-1.2.8}/pypharm.egg-info/requires.txt +0 -0
- {pypharm-1.2.6 → pypharm-1.2.8}/pypharm.egg-info/top_level.txt +0 -0
- {pypharm-1.2.6 → 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
|
|
@@ -125,7 +126,7 @@ class BaseCompartmentModel:
|
|
|
125
126
|
if self.volumes_target:
|
|
126
127
|
self.volumes[self.volumes_target] = x[self.configuration_matrix_target_count + self.outputs_target_count:self.configuration_matrix_target_count + self.outputs_target_count + self.volumes_target_count]
|
|
127
128
|
|
|
128
|
-
def _target_function(self, x, max_step=0.01):
|
|
129
|
+
def _target_function(self, x, max_step=0.01, metric='R2'):
|
|
129
130
|
"""
|
|
130
131
|
Функция расчета значения целевой функции
|
|
131
132
|
|
|
@@ -148,7 +149,13 @@ class BaseCompartmentModel:
|
|
|
148
149
|
max_step=max_step
|
|
149
150
|
)
|
|
150
151
|
target_results = self.last_result.y[tuple(self.know_compartments), :]
|
|
151
|
-
|
|
152
|
+
if metric == 'R2':
|
|
153
|
+
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))
|
|
154
|
+
elif metric == 'norm':
|
|
155
|
+
return np.linalg.norm(target_results - self.teoretic_y)
|
|
156
|
+
else:
|
|
157
|
+
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))
|
|
158
|
+
|
|
152
159
|
|
|
153
160
|
def load_optimization_data(self, teoretic_x, teoretic_y, know_compartments, w = None, c0=None, d=None, compartment_number=None):
|
|
154
161
|
"""
|
|
@@ -181,7 +188,7 @@ class BaseCompartmentModel:
|
|
|
181
188
|
self.c0 = np.array(c0)
|
|
182
189
|
self.w = np.ones(self.teoretic_y.shape) if w is None else np.array(w)
|
|
183
190
|
|
|
184
|
-
def optimize(self, method=None, max_step=0.01, **kwargs):
|
|
191
|
+
def optimize(self, method=None, max_step=0.01, metric='R2', **kwargs):
|
|
185
192
|
"""
|
|
186
193
|
Функция оптимизации модели
|
|
187
194
|
|
|
@@ -194,7 +201,7 @@ class BaseCompartmentModel:
|
|
|
194
201
|
None
|
|
195
202
|
"""
|
|
196
203
|
self._optim = True
|
|
197
|
-
f = lambda x: self._target_function(x, max_step=max_step)
|
|
204
|
+
f = lambda x: self._target_function(x, max_step=max_step, metric=metric)
|
|
198
205
|
if method == 'country_optimization':
|
|
199
206
|
CA = CountriesAlgorithm(
|
|
200
207
|
f=f,
|
|
@@ -230,7 +237,7 @@ class BaseCompartmentModel:
|
|
|
230
237
|
return x
|
|
231
238
|
|
|
232
239
|
|
|
233
|
-
class
|
|
240
|
+
class MagicCompartmentModel(BaseCompartmentModel):
|
|
234
241
|
|
|
235
242
|
need_magic_optimization = False
|
|
236
243
|
|
|
@@ -268,49 +275,185 @@ class MagicCompartmentModelWith(BaseCompartmentModel):
|
|
|
268
275
|
|
|
269
276
|
class ReleaseCompartmentModel(BaseCompartmentModel):
|
|
270
277
|
|
|
271
|
-
|
|
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
|
+
"""
|
|
272
316
|
super().__init__(*args, **kwargs)
|
|
273
317
|
self.release_parameters = np.array(release_parameters)
|
|
274
318
|
self.release_parameters_target_count = 0
|
|
275
319
|
if np.any(self.release_parameters == None):
|
|
276
320
|
self.release_parameters_target = np.where(self.release_parameters == None)
|
|
277
321
|
self.release_parameters_target_count = np.sum(self.release_parameters == None)
|
|
278
|
-
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
|
|
279
327
|
|
|
280
|
-
def
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
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]
|
|
286
335
|
|
|
287
|
-
def
|
|
336
|
+
def _default_release_function(self, t, c0):
|
|
288
337
|
"""
|
|
289
338
|
Функция для поправки на высвобождение
|
|
290
339
|
"""
|
|
291
|
-
m, b, c = self.
|
|
340
|
+
m, b, c = self.release_parameters
|
|
292
341
|
return c0 * c * t ** b / (t ** b + m)
|
|
293
342
|
|
|
294
|
-
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
|
+
"""
|
|
295
363
|
if not self._optim:
|
|
296
364
|
assert (not any([self.configuration_matrix_target, self.outputs_target, self.volumes_target])), \
|
|
297
365
|
"It is impossible to make a calculation with unknown parameters"
|
|
298
|
-
assert any([c0 is not None, d
|
|
366
|
+
assert any([c0 is not None, d]), "Need to set c0 or d and compartment_number"
|
|
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
|
|
299
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:
|
|
300
444
|
assert all([d, compartment_number is not None]), "Need to set d and compartment_number"
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
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.6/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
|