Skip to content

Commit

Permalink
Add try..except around singularity detection (#73)
Browse files Browse the repository at this point in the history
  • Loading branch information
clinssen committed Sep 26, 2023
1 parent f77930e commit c1127d5
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 10 deletions.
16 changes: 13 additions & 3 deletions odetoolbox/singularity_detection.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,13 @@
import sympy.parsing.sympy_parser


class SingularityDetectionException(Exception):
"""
Thrown in case an error occurs while detecting singularities.
"""
pass


class SingularityDetection:
r"""Singularity detection for generated propagator matrix.
Expand Down Expand Up @@ -147,8 +154,11 @@ def find_singularities(P: sympy.Matrix, A: sympy.Matrix):
A : sympy.Matrix
system matrix
"""
conditions = SingularityDetection._generate_singularity_conditions(P)
conditions = SingularityDetection._flatten_conditions(conditions) # makes a list of conditions with each condition in the form of a dict
conditions = SingularityDetection._filter_valid_conditions(conditions, A) # filters out the invalid conditions (invalid means those for which A is not defined)
try:
conditions = SingularityDetection._generate_singularity_conditions(P)
conditions = SingularityDetection._flatten_conditions(conditions) # makes a list of conditions with each condition in the form of a dict
conditions = SingularityDetection._filter_valid_conditions(conditions, A) # filters out the invalid conditions (invalid means those for which A is not defined)
except Exception as e:
raise SingularityDetectionException()

return conditions
17 changes: 10 additions & 7 deletions odetoolbox/system_of_shapes.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@

from .config import Config
from .shapes import Shape
from .singularity_detection import SingularityDetection
from .singularity_detection import SingularityDetection, SingularityDetectionException
from .sympy_helpers import _custom_simplify_expr, _is_zero


Expand Down Expand Up @@ -195,12 +195,15 @@ def generate_propagator_solver(self):
if sympy.I in sympy.preorder_traversal(P):
raise PropagatorGenerationException("The imaginary unit was found in the propagator matrix. This can happen if the dynamical system that was passed to ode-toolbox is unstable, i.e. one or more state variables will diverge to minus or positive infinity.")

condition = SingularityDetection.find_singularities(P, self.A_)
if condition:
logging.warning("Under certain conditions, the propagator matrix is singular (contains infinities).")
logging.warning("List of all conditions that result in a singular propagator:")
for cond in condition:
logging.warning("\t" + r" ∧ ".join([str(k) + " = " + str(v) for k, v in cond.items()]))
try:
condition = SingularityDetection.find_singularities(P, self.A_)
if condition:
logging.warning("Under certain conditions, the propagator matrix is singular (contains infinities).")
logging.warning("List of all conditions that result in a singular propagator:")
for cond in condition:
logging.warning("\t" + r" ∧ ".join([str(k) + " = " + str(v) for k, v in cond.items()]))
except SingularityDetectionException:
logging.warning("Could not check the propagator matrix for singularities.")

logging.debug("System of equations:")
logging.debug("x = " + str(self.x_))
Expand Down

0 comments on commit c1127d5

Please sign in to comment.