modelbase2 0.1.78__py3-none-any.whl → 0.2.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. modelbase2/__init__.py +138 -26
  2. modelbase2/distributions.py +306 -0
  3. modelbase2/experimental/__init__.py +17 -0
  4. modelbase2/experimental/codegen.py +239 -0
  5. modelbase2/experimental/diff.py +227 -0
  6. modelbase2/experimental/notes.md +4 -0
  7. modelbase2/experimental/tex.py +521 -0
  8. modelbase2/fit.py +284 -0
  9. modelbase2/fns.py +185 -0
  10. modelbase2/integrators/__init__.py +19 -0
  11. modelbase2/integrators/int_assimulo.py +146 -0
  12. modelbase2/integrators/int_scipy.py +147 -0
  13. modelbase2/label_map.py +610 -0
  14. modelbase2/linear_label_map.py +301 -0
  15. modelbase2/mc.py +548 -0
  16. modelbase2/mca.py +280 -0
  17. modelbase2/model.py +1621 -0
  18. modelbase2/npe.py +343 -0
  19. modelbase2/parallel.py +171 -0
  20. modelbase2/parameterise.py +28 -0
  21. modelbase2/paths.py +36 -0
  22. modelbase2/plot.py +829 -0
  23. modelbase2/sbml/__init__.py +14 -0
  24. modelbase2/sbml/_data.py +77 -0
  25. modelbase2/sbml/_export.py +656 -0
  26. modelbase2/sbml/_import.py +585 -0
  27. modelbase2/sbml/_mathml.py +691 -0
  28. modelbase2/sbml/_name_conversion.py +52 -0
  29. modelbase2/sbml/_unit_conversion.py +74 -0
  30. modelbase2/scan.py +616 -0
  31. modelbase2/scope.py +96 -0
  32. modelbase2/simulator.py +635 -0
  33. modelbase2/surrogates/__init__.py +32 -0
  34. modelbase2/surrogates/_poly.py +66 -0
  35. modelbase2/surrogates/_torch.py +249 -0
  36. modelbase2/surrogates.py +316 -0
  37. modelbase2/types.py +352 -11
  38. modelbase2-0.2.0.dist-info/METADATA +81 -0
  39. modelbase2-0.2.0.dist-info/RECORD +42 -0
  40. {modelbase2-0.1.78.dist-info → modelbase2-0.2.0.dist-info}/WHEEL +1 -1
  41. modelbase2/core/__init__.py +0 -29
  42. modelbase2/core/algebraic_module_container.py +0 -130
  43. modelbase2/core/constant_container.py +0 -113
  44. modelbase2/core/data.py +0 -109
  45. modelbase2/core/name_container.py +0 -29
  46. modelbase2/core/reaction_container.py +0 -115
  47. modelbase2/core/utils.py +0 -28
  48. modelbase2/core/variable_container.py +0 -24
  49. modelbase2/ode/__init__.py +0 -13
  50. modelbase2/ode/integrator.py +0 -80
  51. modelbase2/ode/mca.py +0 -270
  52. modelbase2/ode/model.py +0 -470
  53. modelbase2/ode/simulator.py +0 -153
  54. modelbase2/utils/__init__.py +0 -0
  55. modelbase2/utils/plotting.py +0 -372
  56. modelbase2-0.1.78.dist-info/METADATA +0 -44
  57. modelbase2-0.1.78.dist-info/RECORD +0 -22
  58. {modelbase2-0.1.78.dist-info → modelbase2-0.2.0.dist-info/licenses}/LICENSE +0 -0
@@ -1,372 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import itertools as it
4
- import math
5
- import matplotlib.pyplot as plt
6
- import numpy as np
7
- import pandas as pd
8
- from ..types import Axes, Figure
9
- from matplotlib.collections import QuadMesh
10
- from matplotlib.colors import LogNorm, Normalize, SymLogNorm
11
- from matplotlib.colors import colorConverter as _colorConverter
12
- from typing import Any, Iterable, Optional, Sized, Union
13
-
14
-
15
- def _get_plot_kwargs(
16
- figure_kwargs: Optional[dict[str, Any]],
17
- subplot_kwargs: Optional[dict[str, Any]],
18
- plot_kwargs: Optional[dict[str, Any]],
19
- grid_kwargs: Optional[dict[str, Any]],
20
- tick_kwargs: Optional[dict[str, Any]],
21
- label_kwargs: Optional[dict[str, Any]],
22
- title_kwargs: Optional[dict[str, Any]],
23
- legend_kwargs: Optional[dict[str, Any]],
24
- ) -> dict[str, dict[str, Any]]:
25
- """Get default plot kwargs or overwrite them."""
26
- local_figure_kwargs = {"figsize": (10, 7)}
27
- local_subplot_kwargs = {"facecolor": "white"}
28
- local_plot_kwargs = {"linewidth": 4}
29
- local_grid_kwargs = {
30
- "color": (0, 0, 0),
31
- "alpha": 0.33,
32
- "linestyle": "dashed",
33
- "linewidth": 1,
34
- }
35
- local_tick_kwargs = {
36
- "direction": "out",
37
- "length": 6,
38
- "width": 2,
39
- "labelsize": 14,
40
- "color": "0.15",
41
- "pad": 7,
42
- }
43
- local_label_kwargs = {"fontsize": 14}
44
- local_title_kwargs = {"fontsize": 18}
45
- local_legend_kwargs = {
46
- "loc": "upper left",
47
- "bbox_to_anchor": (1.02, 1),
48
- "borderaxespad": 0,
49
- "ncol": 1,
50
- "fontsize": 12,
51
- "numpoints": 1,
52
- "scatterpoints": 1,
53
- "markerscale": 1,
54
- "frameon": False,
55
- }
56
- if figure_kwargs is not None:
57
- local_figure_kwargs.update(figure_kwargs)
58
- if subplot_kwargs is not None:
59
- local_subplot_kwargs.update(subplot_kwargs)
60
- if plot_kwargs is not None:
61
- local_plot_kwargs.update(plot_kwargs)
62
- if grid_kwargs is not None:
63
- local_grid_kwargs.update(grid_kwargs)
64
- if tick_kwargs is not None:
65
- local_tick_kwargs.update(tick_kwargs)
66
- if label_kwargs is not None:
67
- local_label_kwargs.update(label_kwargs)
68
- if title_kwargs is not None:
69
- local_title_kwargs.update(title_kwargs)
70
- if legend_kwargs is not None:
71
- local_legend_kwargs.update(legend_kwargs)
72
- return {
73
- "figure": local_figure_kwargs,
74
- "subplot": local_subplot_kwargs,
75
- "plot": local_plot_kwargs,
76
- "grid": local_grid_kwargs,
77
- "ticks": local_tick_kwargs,
78
- "label": local_label_kwargs,
79
- "title": local_title_kwargs,
80
- "legend": local_legend_kwargs,
81
- }
82
-
83
-
84
- def _style_subplot(
85
- ax: Axes,
86
- kwargs: dict,
87
- xlabel: str | None = None,
88
- ylabel: str | None = None,
89
- zlabel: str | None = None,
90
- title: str | None = None,
91
- legend: bool = False,
92
- grid: bool | None = None,
93
- ) -> None:
94
- """Set style of the subplot."""
95
- if grid:
96
- ax.grid(True, which="major", axis="both", **kwargs["grid"])
97
- if legend:
98
- ax.legend(**kwargs["legend"])
99
- if title is not None:
100
- ax.set_title(title, **kwargs["title"])
101
- if xlabel is not None:
102
- ax.set_xlabel(xlabel, **kwargs["label"])
103
- if ylabel is not None:
104
- ax.set_ylabel(ylabel, **kwargs["label"])
105
- if zlabel is not None:
106
- ax.set_zlabel(zlabel, **kwargs["label"])
107
- ax.tick_params(**kwargs["ticks"])
108
- for axis in ["top", "bottom", "left", "right"]:
109
- ax.spines[axis].set_linewidth(0)
110
-
111
-
112
- def plot(
113
- plot_args: Iterable,
114
- legend: Optional[Iterable[str]] = None,
115
- xlabel: Optional[str] = None,
116
- ylabel: Optional[str] = None,
117
- title: Optional[str] = None,
118
- grid: bool = True,
119
- tight_layout: bool = True,
120
- ax: Optional[plt.Axes] = None,
121
- figure_kwargs: Optional[dict[str, Any]] = None,
122
- subplot_kwargs: Optional[dict[str, Any]] = None,
123
- plot_kwargs: Optional[dict[str, Any]] = None,
124
- grid_kwargs: Optional[dict[str, Any]] = None,
125
- legend_kwargs: Optional[dict[str, Any]] = None,
126
- tick_kwargs: Optional[dict[str, Any]] = None,
127
- label_kwargs: Optional[dict[str, Any]] = None,
128
- title_kwargs: Optional[dict[str, Any]] = None,
129
- ) -> tuple[Figure, plt.Axes]:
130
- """Plot simulation results as a grid."""
131
- kwargs = _get_plot_kwargs(
132
- figure_kwargs=figure_kwargs,
133
- subplot_kwargs=subplot_kwargs,
134
- plot_kwargs=plot_kwargs,
135
- grid_kwargs=grid_kwargs,
136
- tick_kwargs=tick_kwargs,
137
- label_kwargs=label_kwargs,
138
- title_kwargs=title_kwargs,
139
- legend_kwargs=legend_kwargs,
140
- )
141
- ylabel = ylabel if ylabel is not None else "Remember to label your axes"
142
- xlabel = xlabel if xlabel is not None else "Remember to label your axes"
143
-
144
- if ax is None:
145
- fig, ax = plt.subplots(
146
- nrows=1,
147
- ncols=1,
148
- squeeze=True,
149
- subplot_kw=kwargs["subplot"],
150
- **kwargs["figure"],
151
- )
152
- else:
153
- fig = ax.get_figure()
154
- ax.plot(*plot_args, **kwargs["plot"])
155
- if grid:
156
- ax.grid(True, which="major", axis="both", **kwargs["grid"])
157
- if legend is not None:
158
- if isinstance(legend, str):
159
- legend = [legend]
160
- ax.legend(legend, **kwargs["legend"])
161
- ax.set_ylabel(ylabel, **kwargs["label"])
162
- ax.set_xlabel(xlabel, **kwargs["label"])
163
- ax.set_title(title, **kwargs["title"])
164
- ax.tick_params(**kwargs["ticks"])
165
- if tight_layout:
166
- fig.tight_layout()
167
- return fig, ax
168
-
169
-
170
- def plot_grid(
171
- plot_groups: Sized,
172
- legend_groups: Optional[Iterable] = None,
173
- ncols: Optional[int] = None,
174
- sharex: bool = True,
175
- sharey: bool = True,
176
- xlabels: Optional[Union[str, Iterable[str]]] = None,
177
- ylabels: Optional[Union[str, Iterable[str]]] = None,
178
- figure_title: str | None = None,
179
- plot_titles: Optional[Union[Iterable[str], Iterable[None]]] = None,
180
- grid: bool = True,
181
- tight_layout: bool = True,
182
- figure_kwargs: Optional[dict[str, Any]] = None,
183
- subplot_kwargs: Optional[dict[str, Any]] = None,
184
- plot_kwargs: Optional[dict[str, Any]] = None,
185
- grid_kwargs: Optional[dict[str, Any]] = None,
186
- legend_kwargs: Optional[dict[str, Any]] = None,
187
- tick_kwargs: Optional[dict[str, Any]] = None,
188
- label_kwargs: Optional[dict[str, Any]] = None,
189
- title_kwargs: Optional[dict[str, Any]] = None,
190
- ) -> tuple[Figure, Axes]:
191
- """Plot simulation results as a grid."""
192
- if ncols is None:
193
- _, ncols = min(
194
- (
195
- (math.ceil(len(plot_groups) / i) * i - len(plot_groups), i)
196
- for i in range(2, 6)
197
- ),
198
- key=lambda x: (x[0], -x[1]),
199
- )
200
- nrows = math.ceil(len(plot_groups) / ncols)
201
- if figure_kwargs is None:
202
- figure_kwargs = {}
203
- figure_kwargs.setdefault("figsize", (5 * ncols, 4 * nrows))
204
- if legend_kwargs is None:
205
- legend_kwargs = {}
206
- legend_kwargs.setdefault("loc", "best")
207
- legend_kwargs.setdefault("bbox_to_anchor", None)
208
- legend_kwargs.setdefault("borderaxespad", 0.5)
209
- kwargs = _get_plot_kwargs(
210
- figure_kwargs=figure_kwargs,
211
- subplot_kwargs=subplot_kwargs,
212
- plot_kwargs=plot_kwargs,
213
- grid_kwargs=grid_kwargs,
214
- tick_kwargs=tick_kwargs,
215
- label_kwargs=label_kwargs,
216
- title_kwargs=title_kwargs,
217
- legend_kwargs=legend_kwargs,
218
- )
219
-
220
- if legend_groups is None:
221
- legend_groups = it.repeat(None)
222
- if ylabels is None:
223
- ylabels = it.repeat("Remember to label your axes")
224
- else:
225
- if isinstance(ylabels, str):
226
- ylabels = it.repeat(ylabels)
227
- if xlabels is None:
228
- xlabels = it.repeat("Remember to label your axes")
229
- else:
230
- if isinstance(xlabels, str):
231
- xlabels = it.repeat(xlabels)
232
- if plot_titles is None:
233
- plot_titles = it.repeat(None)
234
-
235
- fig, axs = plt.subplots(
236
- nrows=nrows,
237
- ncols=ncols,
238
- sharex=sharex,
239
- sharey=sharey,
240
- squeeze=False,
241
- subplot_kw=kwargs["subplot"],
242
- **kwargs["figure"],
243
- )
244
- for ax, plot_args, legend_args, title in zip(axs.ravel(), plot_groups, legend_groups, plot_titles): # type: ignore
245
- ax.plot(*plot_args, **kwargs["plot"])
246
- ax.set_title(title, **kwargs["title"])
247
- if legend_args is not None:
248
- ax.legend(legend_args, **kwargs["legend"])
249
- ax.tick_params(**kwargs["ticks"])
250
- if grid:
251
- ax.grid(True, which="major", axis="both", **kwargs["grid"])
252
-
253
- if sharey:
254
- for ax, ylabel in zip(axs[:, 0], ylabels): # type: ignore
255
- ax.set_ylabel(ylabel, **kwargs["label"])
256
- else:
257
- for ax, ylabel in zip(axs.ravel(), ylabels):
258
- ax.set_ylabel(ylabel, **kwargs["label"])
259
- if sharex:
260
- for ax, xlabel in zip(axs[-1], xlabels): # type: ignore
261
- ax.set_xlabel(xlabel, **kwargs["label"])
262
- else:
263
- for ax, xlabel in zip(axs.ravel(), xlabels):
264
- ax.set_xlabel(xlabel, **kwargs["label"])
265
- fig.suptitle(figure_title, y=1.025, **kwargs["title"])
266
- if tight_layout:
267
- fig.tight_layout()
268
- return fig, axs
269
-
270
-
271
- def relative_luminance(color: list[float]) -> float:
272
- """Calculate the relative luminance of a color."""
273
- rgb = _colorConverter.to_rgba_array(color)[:, :3]
274
-
275
- # If RsRGB <= 0.03928 then R = RsRGB/12.92 else R = ((RsRGB+0.055)/1.055) ^ 2.4
276
- rsrgb = np.where(rgb <= 0.03928, rgb / 12.92, ((rgb + 0.055) / 1.055) ** 2.4)
277
-
278
- # L = 0.2126 * R + 0.7152 * G + 0.0722 * B
279
- rel_luminance: list[float] = np.matmul(rsrgb, [0.2126, 0.7152, 0.0722])
280
- return rel_luminance[0]
281
-
282
-
283
- def get_norm(vmin: float, vmax: float) -> plt.Normalize:
284
- if vmax < 1000 and vmin > -1000:
285
- norm = Normalize(vmin=vmin, vmax=vmax)
286
- elif vmin <= 0:
287
- norm = SymLogNorm(linthresh=1, vmin=vmin, vmax=vmax, base=10)
288
- else:
289
- norm = LogNorm(vmin=vmin, vmax=vmax)
290
- return norm
291
-
292
-
293
- def heatmap_from_dataframe(
294
- df: pd.DataFrame,
295
- title: Optional[str] = None,
296
- xlabel: Optional[str] = None,
297
- ylabel: Optional[str] = None,
298
- annotate: bool = True,
299
- colorbar: bool = True,
300
- cmap: str = "viridis",
301
- vmax: Optional[float] = None,
302
- vmin: Optional[float] = None,
303
- norm: plt.Normalize | None = None,
304
- ax: Optional[Axes] = None,
305
- cax: Optional[Axes] = None,
306
- sci_annotation_bounds: tuple[float, float] = (0.01, 100),
307
- annotation_style: str = "2g",
308
- figsize: tuple[float, float] = (8, 6),
309
- ) -> tuple[Figure, plt.Axes, QuadMesh]:
310
- data = df.values
311
- rows = df.index
312
- columns = df.columns
313
-
314
- if ax is None:
315
- fig, ax = plt.subplots(figsize=figsize)
316
- else:
317
- fig = ax.get_figure()
318
-
319
- # Create norm
320
- if norm is None:
321
- if vmax is None:
322
- vmax = np.nanmax(data)
323
- if vmin is None:
324
- vmin = np.nanmin(data)
325
- norm = get_norm(vmin=vmin, vmax=vmax) # type: ignore
326
-
327
- # Create heatmap
328
- hm = ax.pcolormesh(data, norm=norm, cmap=cmap)
329
-
330
- # Despine axis
331
- for side in ["top", "right", "left", "bottom"]:
332
- ax.spines[side].set_visible(False)
333
-
334
- # Set the axis limits
335
- ax.set(xlim=(0, data.shape[1]), ylim=(0, data.shape[0]))
336
-
337
- # Set ticks and ticklabels
338
- ax.set_xticks(np.arange(len(columns)) + 0.5)
339
- ax.set_xticklabels(columns)
340
-
341
- ax.set_yticks(np.arange(len(rows)) + 0.5)
342
- ax.set_yticklabels(rows)
343
-
344
- # Set title and axis labels
345
- ax.set_title(title)
346
- ax.set_xlabel(xlabel)
347
- ax.set_ylabel(ylabel)
348
-
349
- if annotate:
350
- text_kwargs = {"ha": "center", "va": "center"}
351
- hm.update_scalarmappable() # So that get_facecolor is an array
352
- xpos, ypos = np.meshgrid(np.arange(len(columns)), np.arange(len(rows)))
353
- for x, y, val, color in zip(
354
- xpos.flat, ypos.flat, hm.get_array(), hm.get_facecolor()
355
- ):
356
- text_kwargs["color"] = (
357
- "black" if relative_luminance(color) > 0.45 else "white"
358
- )
359
- if sci_annotation_bounds[0] < abs(val) <= sci_annotation_bounds[1]:
360
- val_text = f"{val:.{annotation_style}}"
361
- else:
362
- val_text = f"{val:.0e}"
363
- ax.text(x + 0.5, y + 0.5, val_text, **text_kwargs)
364
-
365
- if colorbar:
366
- # Add a colorbar
367
- cb = ax.figure.colorbar(hm, cax, ax)
368
- cb.outline.set_linewidth(0)
369
-
370
- # Invert the y axis to show the plot in matrix form
371
- ax.invert_yaxis()
372
- return fig, ax, hm
@@ -1,44 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: modelbase2
3
- Version: 0.1.78
4
- Summary: A package to build metabolic models
5
- Home-page: https://gitlab.com/qtb-hhu/modelbase-software
6
- License: GPL-3.0-or-later
7
- Keywords: modelling,ode,metabolic
8
- Author: Marvin van Aalst
9
- Author-email: marvin.vanaalst@gmail.com
10
- Maintainer: Marvin van Aalst
11
- Maintainer-email: marvin.vanaalst@gmail.com
12
- Requires-Python: >=3.8,<4.0
13
- Classifier: Development Status :: 5 - Production/Stable
14
- Classifier: Environment :: Console
15
- Classifier: Intended Audience :: Developers
16
- Classifier: Intended Audience :: Science/Research
17
- Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
18
- Classifier: Operating System :: MacOS
19
- Classifier: Operating System :: Microsoft :: Windows
20
- Classifier: Operating System :: OS Independent
21
- Classifier: Operating System :: POSIX
22
- Classifier: Operating System :: Unix
23
- Classifier: Programming Language :: Python :: 3
24
- Classifier: Programming Language :: Python :: 3.8
25
- Classifier: Programming Language :: Python :: 3.9
26
- Classifier: Programming Language :: Python :: 3.10
27
- Classifier: Programming Language :: Python :: 3.11
28
- Classifier: Programming Language :: Python :: 3
29
- Classifier: Programming Language :: Python :: 3.9
30
- Classifier: Topic :: Scientific/Engineering
31
- Classifier: Topic :: Software Development
32
- Requires-Dist: black (>=22.3.0,<23.0.0)
33
- Requires-Dist: ipywidgets (>=8.0.0,<9.0.0)
34
- Requires-Dist: matplotlib (>=3.5.0,<4.0.0)
35
- Requires-Dist: modelbase (>=1.14.0,<2.0.0)
36
- Requires-Dist: numpy (>=1.21.4,<2.0.0)
37
- Requires-Dist: pandas (>=1.3.4,<2.0.0)
38
- Requires-Dist: python-libsbml (>=5.19.2,<6.0.0)
39
- Requires-Dist: scipy (>=1.7.2,<2.0.0)
40
- Requires-Dist: sympy (>=1.9,<2.0)
41
- Requires-Dist: tqdm (>=4.62.3,<5.0.0)
42
- Requires-Dist: typing-extensions (>=4.0.0,<5.0.0)
43
- Project-URL: Documentation, https://modelbase.readthedocs.io/en/latest/
44
- Project-URL: Repository, https://gitlab.com/qtb-hhu/modelbase-software
@@ -1,22 +0,0 @@
1
- modelbase2/__init__.py,sha256=GCnwbRxRzlmpu5f_0oOGUjz4iYDZSClTatvMifM_cf4,723
2
- modelbase2/core/__init__.py,sha256=5XfG_W15BXkIu1oAa8s7VYa5YS7Yb7f2BADPcXGvA7E,690
3
- modelbase2/core/algebraic_module_container.py,sha256=vejOAUlXq7PvkVlJceqw8VSaPDD5ZutDr7DJjq7cG2g,4564
4
- modelbase2/core/constant_container.py,sha256=endFE4d9kaphh6ireQpj5TozwmnrFJg-VfbBZO03DaA,4669
5
- modelbase2/core/data.py,sha256=uOpFNDVRowYBWzvnR1_zVf9wGRjlnpReWmuAj0orJr4,2452
6
- modelbase2/core/name_container.py,sha256=RheHM8Y5OuH8hNzEznbos885P9ANjJHVlDVUI90wiTs,918
7
- modelbase2/core/reaction_container.py,sha256=U_o5LXv_F8Cd0nOzy0sbHF8EBl2L2LtB7OA-MWM4_Es,4860
8
- modelbase2/core/utils.py,sha256=uEJBNUKmFTE_TG9Bj3vKP6JPRPg7DqRwO_szd-Z4JiI,857
9
- modelbase2/core/variable_container.py,sha256=zww22-mW1XxiBel_4pLE1nnu-bPPqtTLN8sP5dvP1Sg,736
10
- modelbase2/ode/__init__.py,sha256=7iAUR7B3nPVZ2YLfkOdEv3IZw-hlh1ogxDyjj6Ra4pA,217
11
- modelbase2/ode/integrator.py,sha256=ZueqzmufHuJYTYGLMQC5KaaGOgjMPB_rkM4ZEMcHQog,2239
12
- modelbase2/ode/mca.py,sha256=5VNSCa28aub-oGw9vctwSON_OYDtupmzZp0r_-XD4Rs,8450
13
- modelbase2/ode/model.py,sha256=RYo3ywCfzoCG72FPun3XTl2Pj6EcCa66bN5eO-KhDUc,15618
14
- modelbase2/ode/simulator.py,sha256=v67OAW8qCdI7iPrr4bTigBbf_lLPUgdcJgIEPpyoWKk,4880
15
- modelbase2/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
- modelbase2/types.py,sha256=-h7uRV5ZC_UiUEH1tTm0SunlyLo7TRK3nwMd4-VuLDM,407
17
- modelbase2/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
- modelbase2/utils/plotting.py,sha256=NxobtfoLwPHYz01Cp4PTEefN6sUqRB1vop_EEkJK0Ac,12357
19
- modelbase2-0.1.78.dist-info/LICENSE,sha256=qvG2VolmSkrcocL34V1ieOx-Rn-fpVcUbb25gHzVgZw,35079
20
- modelbase2-0.1.78.dist-info/WHEEL,sha256=vxFmldFsRN_Hx10GDvsdv1wroKq8r5Lzvjp6GZ4OO8c,88
21
- modelbase2-0.1.78.dist-info/METADATA,sha256=I7M9AHIPmFK3ZbuxC9odM9RJplGY7h_fYPHcQELYBys,1900
22
- modelbase2-0.1.78.dist-info/RECORD,,