Skip to content

Commit 632b2b7

Browse files
committed
Support constant expressions in EquationFactory.
Avoid errors for expressions that evaluate to numbers instead of BaseBuilder instances.
1 parent 9352698 commit 632b2b7

File tree

2 files changed

+21
-2
lines changed

2 files changed

+21
-2
lines changed

Diff for: diffpy/srfit/equation/builder.py

+8-2
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@
8989
_builders = {}
9090

9191

92+
import numbers
9293
import numpy
9394

9495
import diffpy.srfit.equation.literals as literals
@@ -145,8 +146,13 @@ def makeEquation(self, eqstr, buildargs = True, argclass =
145146
"""
146147
self._prepareBuilders(eqstr, buildargs, argclass, argkw)
147148
beq = eval(eqstr, {}, self.builders)
148-
eq = beq.getEquation()
149-
self.equations.add(eq)
149+
# handle scalar numbers or numpy arrays
150+
if isinstance(beq, (numbers.Number, numpy.ndarray)):
151+
lit = literals.Argument(value=beq, const=True)
152+
eq = Equation(name='', root=lit)
153+
else:
154+
eq = beq.getEquation()
155+
self.equations.add(eq)
150156
return eq
151157

152158
def registerConstant(self, name, value):

Diff for: diffpy/srfit/tests/testbuilder.py

+13
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,19 @@ def testParseEquation(self):
201201
self.assertTrue(noObserversInGlobalBuilders())
202202
return
203203

204+
205+
def test_parse_constant(self):
206+
"""Verify parsing of constant numeric expressions.
207+
"""
208+
factory = builder.EquationFactory()
209+
eq = factory.makeEquation('3.12 + 2')
210+
self.assertTrue(isinstance(eq, builder.Equation))
211+
self.assertEqual(set(), factory.equations)
212+
self.assertEqual(5.12, eq())
213+
self.assertRaises(ValueError, eq, 3)
214+
return
215+
216+
204217
def testBuildEquation(self):
205218

206219
from numpy import array_equal

0 commit comments

Comments
 (0)