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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pypharm
3
- Version: 1.2.7
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 MagicCompartmentModelWith(BaseCompartmentModel):
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
- def __init__(self, release_parameters, v, *args, **kwargs):
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.v = v
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 _runge_kutta(self, y, x, dx):
287
- k1 = dx * self._сompartment_model(x, y)
288
- k2 = dx * self._сompartment_model(x + 0.5 * dx, y + 0.5 * k1)
289
- k3 = dx * self._сompartment_model(x + 0.5 * dx, y + 0.5 * k2)
290
- k4 = dx * self._сompartment_model(x + dx, y + k3)
291
- return y + (k1 + 2 * k2 + 2 * k3 + k4) / 6
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 release_function(self, t, c0):
336
+ def _default_release_function(self, t, c0):
294
337
  """
295
338
  Функция для поправки на высвобождение
296
339
  """
297
- m, b, c = self.release_parametrs
340
+ m, b, c = self.release_parameters
298
341
  return c0 * c * t ** b / (t ** b + m)
299
342
 
300
- def __call__(self, t_max, c0=None, d=None, compartment_number=None, max_step=0.01, t_eval=None):
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, compartment_number is not None]), "Need to set c0 or d and compartment_number"
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
- c0 = d / self.v
308
- t = 0
309
- old_release_correction = 0
310
- result_x = np.array([])
311
- result_y = np.array([])
312
- y = np.zeros(self.outputs.size)
313
- while t <= t_max:
314
- np.append(result_x, t)
315
- np.append(result_y, y)
316
- release_correction = self.release_function(t + max_step, c0)
317
- y = self._runge_kutta(y, t, max_step)
318
- y[compartment_number] += release_correction - old_release_correction
319
- #y[0] = breeding_function(dx, t12, y[0]) # делаем поправочку на распад
320
- old_release_correction = release_correction
321
- t += max_step
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
@@ -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.7
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
+
@@ -6,7 +6,7 @@ def readme():
6
6
 
7
7
  setup(
8
8
  name='pypharm',
9
- version='1.2.7',
9
+ version='1.2.8',
10
10
  author='Krash13',
11
11
  author_email='krasheninnikov.r.s@muctr.ru',
12
12
  description='Module for solving pharmacokinetic problems',
@@ -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