Skip to content

Commit c1127d5

Browse files
authored
Add try..except around singularity detection (#73)
1 parent f77930e commit c1127d5

File tree

2 files changed

+23
-10
lines changed

2 files changed

+23
-10
lines changed

odetoolbox/singularity_detection.py

+13-3
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,13 @@
2424
import sympy.parsing.sympy_parser
2525

2626

27+
class SingularityDetectionException(Exception):
28+
"""
29+
Thrown in case an error occurs while detecting singularities.
30+
"""
31+
pass
32+
33+
2734
class SingularityDetection:
2835
r"""Singularity detection for generated propagator matrix.
2936
@@ -147,8 +154,11 @@ def find_singularities(P: sympy.Matrix, A: sympy.Matrix):
147154
A : sympy.Matrix
148155
system matrix
149156
"""
150-
conditions = SingularityDetection._generate_singularity_conditions(P)
151-
conditions = SingularityDetection._flatten_conditions(conditions) # makes a list of conditions with each condition in the form of a dict
152-
conditions = SingularityDetection._filter_valid_conditions(conditions, A) # filters out the invalid conditions (invalid means those for which A is not defined)
157+
try:
158+
conditions = SingularityDetection._generate_singularity_conditions(P)
159+
conditions = SingularityDetection._flatten_conditions(conditions) # makes a list of conditions with each condition in the form of a dict
160+
conditions = SingularityDetection._filter_valid_conditions(conditions, A) # filters out the invalid conditions (invalid means those for which A is not defined)
161+
except Exception as e:
162+
raise SingularityDetectionException()
153163

154164
return conditions

odetoolbox/system_of_shapes.py

+10-7
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030

3131
from .config import Config
3232
from .shapes import Shape
33-
from .singularity_detection import SingularityDetection
33+
from .singularity_detection import SingularityDetection, SingularityDetectionException
3434
from .sympy_helpers import _custom_simplify_expr, _is_zero
3535

3636

@@ -195,12 +195,15 @@ def generate_propagator_solver(self):
195195
if sympy.I in sympy.preorder_traversal(P):
196196
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.")
197197

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

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

0 commit comments

Comments
 (0)