physioblocks 1.1.0__py3-none-any.whl → 1.1.1__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.
physioblocks/__init__.py CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
  """Physioblocks package definition"""
28
28
 
29
- __version__ = "1.1.0"
29
+ __version__ = "1.1.1"
30
30
  __copyright__ = "INRIA"
31
31
  __license__ = "LGPL-3.0-only"
32
32
  __authors__ = [
@@ -37,6 +37,7 @@ from pathlib import Path
37
37
  from typing import Any
38
38
 
39
39
  import pandas as pd
40
+ from rich.logging import RichHandler
40
41
 
41
42
  import physioblocks.utils.exceptions_utils as exception_utils
42
43
  from physioblocks.configuration import Configuration, load, unwrap_aliases
@@ -64,8 +65,9 @@ from physioblocks.simulation import AbstractSimulation, SimulationError
64
65
  .. note:: When deleting a serie from the launcher folder, or a specific simulation from
65
66
  a serie, the launchers logs are updated the next time any simulation is launched.
66
67
  """
68
+ FILE_LOG_FORMATTER = logging.Formatter(logging.BASIC_FORMAT)
69
+ RICH_LOG_FORMATTER = logging.Formatter("%(message)s", "[%X]")
67
70
 
68
- SIMULATION_LOG_FORMATER = logging.Formatter(logging.BASIC_FORMAT)
69
71
  _root_logger = logging.getLogger()
70
72
  _root_logger.setLevel(logging.DEBUG)
71
73
 
@@ -90,8 +92,10 @@ def run_simulation(config: Configuration) -> pd.DataFrame:
90
92
  return pd.DataFrame(results)
91
93
 
92
94
 
93
- def add_log_handler(handler: logging.Handler, level: str | int) -> None:
94
- handler.setFormatter(SIMULATION_LOG_FORMATER)
95
+ def add_log_handler(
96
+ handler: logging.Handler, level: str | int, formatter: logging.Formatter
97
+ ) -> None:
98
+ handler.setFormatter(formatter)
95
99
  handler.setLevel(level)
96
100
  _root_logger.addHandler(handler)
97
101
 
@@ -132,7 +136,7 @@ def main(
132
136
  # configure the simulation log file (always in DEBUG)
133
137
  log_file_path = sim_folder / str.join(".", [sim_info.reference, "log"])
134
138
  file_handler = logging.FileHandler(log_file_path)
135
- add_log_handler(file_handler, logging.DEBUG)
139
+ add_log_handler(file_handler, logging.DEBUG, FILE_LOG_FORMATTER)
136
140
 
137
141
  # log the current simulation infos
138
142
  _root_logger.info(str(sim_info))
@@ -260,8 +264,8 @@ if __name__ == "__main__":
260
264
 
261
265
  # setup logger when verbose
262
266
  if args.verbose is True:
263
- stdout_handler = logging.StreamHandler(sys.stdout)
264
- add_log_handler(stdout_handler, args.log_level)
267
+ # stdout_handler = logging.StreamHandler(sys.stdout)
268
+ add_log_handler(RichHandler(), args.log_level, RICH_LOG_FORMATTER)
265
269
 
266
270
  # create paths from arguments
267
271
  root_folder_path = Path(args.launcher_directory).absolute()
@@ -37,6 +37,7 @@ from typing import Any, TypeAlias
37
37
 
38
38
  import numpy as np
39
39
  from numpy.typing import NDArray
40
+ from rich.progress import Progress
40
41
 
41
42
  from physioblocks.computing.assembling import EqSystem
42
43
  from physioblocks.computing.models import ModelComponent
@@ -359,77 +360,82 @@ class ForwardSimulation(AbstractSimulation):
359
360
  """
360
361
  # initialize the simulation and save the initial results
361
362
  results = self._initialize()
362
-
363
- try:
364
- while self.time_manager.ended is False:
365
- next_step = self.time_manager.time.new
366
-
367
- self._update_time()
368
-
369
- while (
370
- np.abs(next_step - self.time_manager.time.current)
371
- > self.time_manager.min_step
372
- ):
373
- self.state.reset_state_vector()
374
-
375
- sol = self.solver.solve(self.state, self.eq_system)
376
-
377
- if sol.converged is False:
378
- inter_time = 0.5 * self.time_manager.current_step_size
379
- if inter_time < self.time_manager.min_step:
380
- raise ConvergenceError(
381
- str.format(
382
- "The solver did not converge at {0}s for minimal"
383
- "time step {1}",
384
- self.time_manager.time.current,
385
- self.time_manager.min_step,
363
+ progress_step_update = (
364
+ 100.0 * self.time_manager.step_size / self.time_manager.duration
365
+ )
366
+ with Progress() as progress:
367
+ try:
368
+ sim_task = progress.add_task("Simulation in progress...")
369
+ while self.time_manager.ended is False:
370
+ next_step = self.time_manager.time.new
371
+
372
+ self._update_time()
373
+
374
+ while (
375
+ np.abs(next_step - self.time_manager.time.current)
376
+ > self.time_manager.min_step
377
+ ):
378
+ self.state.reset_state_vector()
379
+
380
+ sol = self.solver.solve(self.state, self.eq_system)
381
+
382
+ if sol.converged is False:
383
+ inter_time = 0.5 * self.time_manager.current_step_size
384
+ if inter_time < self.time_manager.min_step:
385
+ raise ConvergenceError(
386
+ str.format(
387
+ "The solver did not converge at {0}s for "
388
+ "minimal time step {1}",
389
+ self.time_manager.time.current,
390
+ self.time_manager.min_step,
391
+ )
386
392
  )
387
- )
388
393
 
389
- self.time_manager.current_step_size = inter_time
390
- self.time_manager.time.update(
391
- self.time_manager.time.current
392
- + self.time_manager.current_step_size
393
- )
394
- else:
395
- self.state.set_state_vector(sol.x)
396
-
397
- self.time_manager.update_time()
398
- if (
399
- np.abs(next_step - self.time_manager.time.current)
400
- >= self.time_manager.min_step
401
- ):
402
- self.time_manager.current_step_size = (
403
- next_step - self.time_manager.time.current
404
- )
405
- self.time_manager.time.update(next_step)
406
- else:
407
- self.time_manager.time.initialize(next_step)
408
- self.time_manager.current_step_size = (
409
- self.time_manager.step_size
410
- )
394
+ self.time_manager.current_step_size = inter_time
411
395
  self.time_manager.time.update(
412
396
  self.time_manager.time.current
413
397
  + self.time_manager.current_step_size
414
398
  )
399
+ else:
400
+ self.state.set_state_vector(sol.x)
401
+
402
+ self.time_manager.update_time()
403
+ if (
404
+ np.abs(next_step - self.time_manager.time.current)
405
+ >= self.time_manager.min_step
406
+ ):
407
+ self.time_manager.current_step_size = (
408
+ next_step - self.time_manager.time.current
409
+ )
410
+ self.time_manager.time.update(next_step)
411
+ else:
412
+ progress.update(sim_task, advance=progress_step_update)
413
+ self.time_manager.time.initialize(next_step)
414
+ self.time_manager.current_step_size = (
415
+ self.time_manager.step_size
416
+ )
417
+ self.time_manager.time.update(
418
+ self.time_manager.time.current
419
+ + self.time_manager.current_step_size
420
+ )
415
421
 
416
- self.state.set_state_vector(sol.x)
417
- results.append(self._get_current_result())
418
- except Exception as exception:
419
- log_exception(
420
- _logger,
421
- type(exception),
422
- exception,
423
- exception.__traceback__,
424
- logging.DEBUG,
425
- )
426
- raise SimulationError(
427
- str.format(
428
- "An error caused the simulation to stop prematurely",
429
- intermediate_results=results,
430
- ),
431
- results,
432
- ) from exception
422
+ self.state.set_state_vector(sol.x)
423
+ results.append(self._get_current_result())
424
+ except Exception as exception:
425
+ log_exception(
426
+ _logger,
427
+ type(exception),
428
+ exception,
429
+ exception.__traceback__,
430
+ logging.DEBUG,
431
+ )
432
+ raise SimulationError(
433
+ str.format(
434
+ "An error caused the simulation to stop prematurely",
435
+ intermediate_results=results,
436
+ ),
437
+ results,
438
+ ) from exception
433
439
 
434
440
  self._finalize()
435
441
  return results
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: physioblocks
3
- Version: 1.1.0
3
+ Version: 1.1.1
4
4
  Dynamic: Author
5
5
  Dynamic: Author-email
6
6
  Dynamic: License
@@ -31,6 +31,7 @@ Requires-Dist: pandas
31
31
  Requires-Dist: plotly
32
32
  Requires-Dist: pyarrow
33
33
  Requires-Dist: regex
34
+ Requires-Dist: rich
34
35
  Requires-Dist: scipy
35
36
  Provides-Extra: doc
36
37
  Requires-Dist: sphinx; extra == 'doc'
@@ -1,4 +1,4 @@
1
- physioblocks/__init__.py,sha256=NGE_lMcYMiJkOlsYXaUITBFVAdwOmguluAly7DLiZ2k,1169
1
+ physioblocks/__init__.py,sha256=NthjhG_G55GynSs5McIQOqRAVapELOh35oy3nf19u-E,1169
2
2
  physioblocks/base/__init__.py,sha256=2h6bk0fe8pwQvJ15Buytg4SZzYOH-Ep7WqoD6pd1eOQ,986
3
3
  physioblocks/base/operators.py,sha256=uUfswQZsaMNd2bd7wsaxSGFIYLAr1hQCQ6SQfYawdBc,5689
4
4
  physioblocks/base/registers.py,sha256=Cd0hmy1XqojjPQgb_jn4mGeAMTyWWgDkl3qJHCVjCRU,3119
@@ -25,7 +25,7 @@ physioblocks/description/nets.py,sha256=pKG2uB-4dABc-lvGswkybiho18bOkUwsVJYBdlX7
25
25
  physioblocks/io/__init__.py,sha256=bOGWA0hAifT9wHxD4kWFQuAXpAx0GzDmGfmcgNDUCGo,990
26
26
  physioblocks/io/aliases.py,sha256=d_Gqz0-8SVD6tA9N-T9xYL8SRhaSMmIOjqvOKHBb-Yo,2288
27
27
  physioblocks/io/configuration.py,sha256=UY8whA_7KcMwi_gXPIt5h8_gD7TKO2Co5cyf9MHO0yg,3578
28
- physioblocks/launcher/__main__.py,sha256=pLTJzaMZGN7elr8aAvgkjYOhnp6fbGouH5SWq_5bKIg,8811
28
+ physioblocks/launcher/__main__.py,sha256=BMErik5JIbCKmjZecQHMUUq5_GQeRQg8zLwYvHFelxk,8968
29
29
  physioblocks/launcher/configuration.py,sha256=dqHCR_7PSDInA8NC3NFONqK3PPwSQYpLkZgYSyVU1vs,7959
30
30
  physioblocks/launcher/constants.py,sha256=FIBKde1vJrUzMk9dSl4q8f8jqN7bFxYF05EIG2-V0zw,3033
31
31
  physioblocks/launcher/files.py,sha256=zvif_8Woh3vEYCb_K3YnFFZYpgMhdlf4c2OSIVW4jC4,4950
@@ -72,7 +72,7 @@ physioblocks/registers/type_register.py,sha256=JUlrPfP-X_TjIOHewSTkzf7Ck3L0ivVoH
72
72
  physioblocks/simulation/__init__.py,sha256=wqKVI3OLLVWuQoUcWwKSs5ibdkTP3Da_5DOe36v1up4,1504
73
73
  physioblocks/simulation/constants.py,sha256=w9CsB4V7YtvcdW4N1p7Iu6MeV4i-kazcEPAygE7mSx0,1075
74
74
  physioblocks/simulation/functions.py,sha256=c6HFwXK8IAzH7gSkz9aMiXLqnWXn_4_9WsX4jrGN9pY,2307
75
- physioblocks/simulation/runtime.py,sha256=JDRBoN5lSDUmEKohXIWPadxjO6JcFHd7JYzUlkFrzxE,15498
75
+ physioblocks/simulation/runtime.py,sha256=Moa6S1iR7oPuni8yvO7VwmBsubMcJMpIUeowk1BLaC0,16104
76
76
  physioblocks/simulation/saved_quantities.py,sha256=fKWr1wScqxHPhuCE7aDNs8lpm9oWfyLN8NZDus2knPM,4111
77
77
  physioblocks/simulation/setup.py,sha256=UmIklaHmfkxi_BIdYKOhorLoC9QT9D4oEXwC-Xfd6v0,18109
78
78
  physioblocks/simulation/solvers.py,sha256=xztL-QboEO2mgtws13QE0-wHJ22vjQQzAQahYfxXVBQ,7226
@@ -86,8 +86,8 @@ physioblocks/utils/math_utils.py,sha256=w5MDs4cP5WiTPHe8WofFuNZZ20WDNLT0XmFGlbis
86
86
  physioblocks/references/circulation_alone_sim.jsonc,sha256=qv27nzmK7jennhtCJ7wQ_f83mt9_YJSOTABjGCYMcZw,736
87
87
  physioblocks/references/spherical_heart_respiration_sim.jsonc,sha256=kKq5xf94r90O1KpkCHk1qwgy6DJ37ePo3-8buEtcu5Y,1397
88
88
  physioblocks/references/spherical_heart_sim.jsonc,sha256=kGGBqxY8dnmGKmpMv216kbneyJRGz_3VkcYn1OWavIA,1151
89
- physioblocks-1.1.0.dist-info/METADATA,sha256=d7JWdSGdkgL7dx9ExTNXLqB0O1LkIQ-qLpKeGoeHilU,4708
90
- physioblocks-1.1.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
91
- physioblocks-1.1.0.dist-info/licenses/licenses/GPL-3.0-only.txt,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
92
- physioblocks-1.1.0.dist-info/licenses/licenses/LGPL-3.0-only.txt,sha256=46mU2C5kSwOnkqkw9XQAJlhBL2JAf1_uCD8lVcXyMRg,7652
93
- physioblocks-1.1.0.dist-info/RECORD,,
89
+ physioblocks-1.1.1.dist-info/METADATA,sha256=eDM0OMOHOexQxV_g4XMTCVcr9eJQYFoHVkqzSZ4O5Hk,4728
90
+ physioblocks-1.1.1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
91
+ physioblocks-1.1.1.dist-info/licenses/licenses/GPL-3.0-only.txt,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
92
+ physioblocks-1.1.1.dist-info/licenses/licenses/LGPL-3.0-only.txt,sha256=46mU2C5kSwOnkqkw9XQAJlhBL2JAf1_uCD8lVcXyMRg,7652
93
+ physioblocks-1.1.1.dist-info/RECORD,,