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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pypharm
3
- Version: 1.2.6
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
- 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))
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 MagicCompartmentModelWith(BaseCompartmentModel):
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
- 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
+ """
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.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
279
327
 
280
- def _runge_kutta(self, y, x, dx):
281
- k1 = dx * self._сompartment_model(x, y)
282
- k2 = dx * self._сompartment_model(x + 0.5 * dx, y + 0.5 * k1)
283
- k3 = dx * self._сompartment_model(x + 0.5 * dx, y + 0.5 * k2)
284
- k4 = dx * self._сompartment_model(x + dx, y + k3)
285
- 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]
286
335
 
287
- def release_function(self, t, c0):
336
+ def _default_release_function(self, t, c0):
288
337
  """
289
338
  Функция для поправки на высвобождение
290
339
  """
291
- m, b, c = self.release_parametrs
340
+ m, b, c = self.release_parameters
292
341
  return c0 * c * t ** b / (t ** b + m)
293
342
 
294
- 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
+ """
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, 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"
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
- c0 = d / self.v
302
- t = 0
303
- old_release_correction = 0
304
- result_x = np.array([])
305
- result_y = np.array([])
306
- y = np.zeros(self.outputs.size)
307
- while t <= t_max:
308
- np.append(result_x, t)
309
- np.append(result_y, y)
310
- release_correction = self.release_function(t + max_step, c0)
311
- y = self._runge_kutta(y, t, max_step)
312
- y[compartment_number] += release_correction - old_release_correction
313
- #y[0] = breeding_function(dx, t12, y[0]) # делаем поправочку на распад
314
- old_release_correction = release_correction
315
- t += max_step
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
@@ -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.6
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.6',
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.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