Skip to content

Commit

Permalink
Added evaluate option to parameter() method.
Browse files Browse the repository at this point in the history
Also changed name of argument `desc` to `description` to be in
line with nomenclature of named tuple returned by `parameters()`.
Made setting the value optional when changing the description.
Updated doc-string. Added test coverage.
  • Loading branch information
john-hen committed Feb 18, 2021
1 parent b65fda5 commit 15a68ea
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 19 deletions.
34 changes: 22 additions & 12 deletions mph/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -144,31 +144,41 @@ def rename(self, name):
"""Assigns a new `name` to the model."""
self.java.name(name)

def parameter(self, name, value=None, unit=None, desc=None):
def parameter(self, name, value=None, unit=None, description=None,
evaluate=False):
"""
Returns or sets the parameter of the given `name`.
If no `value` is given (the default `None` is passed), returns
the value of the named parameter. Otherwise sets it.
Numerical values are accepted, but will be converted to strings.
An optional `unit` may be specified, unless it is already part
of the value string itself, inside square brackets.
Values are accepted as expressions (strings) or as numerical
values (referring to default units). An optional `unit` may be
specified, unless it is already part of the expression itself,
inside square brackets.
Values are always returned as strings, i.e. the expression as
entered in the user interface. That expression may include the
unit, again inside brackets.
By default, values are always returned as strings, i.e. the
expression as entered in the user interface. That expression
may include the unit, again inside brackets. If the option
`evaluate` is set to `True`, the numerical value that the
parameter expression evaluate to is returned.
A parameter `description` can be supplied and will be set
regardless of a value being passed or not.
"""
if description is not None:
value = self.parameter(name)
self.java.param().set(name, value, description)
if value is None:
return str(self.java.param().get(name))
if not evaluate:
return str(self.java.param().get(name))
else:
return self.java.param().evaluate(name)
else:
value = str(value)
if unit:
value += f' [{unit}]'
if desc is not None:
self.java.param().set(name, value, str(desc))
else:
self.java.param().set(name, value)
self.java.param().set(name, value)

def load(self, file, interpolation):
"""
Expand Down
21 changes: 14 additions & 7 deletions tests/test_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,13 +122,20 @@ def test_rename():


def test_parameter():
name = 'U'
old_value = model.parameter(name)
new_value = '2[V]'
model.parameter(name, new_value)
assert model.parameter(name) == new_value
model.parameter(name, old_value)
assert model.parameter(name) == old_value
value = model.parameter('U')
model.parameter('U', '2[V]')
assert model.parameter('U') == '2[V]'
model.parameter('U', '2', 'V')
assert model.parameter('U') == '2 [V]'
model.parameter('U', '2')
assert model.parameter('U') == '2'
assert model.parameter('U', evaluate=True) == 2
model.parameter('U', value)
assert model.parameter('U') == value
model.parameter('U', description='test')
names = [p.name for p in model.parameters()]
descriptions = [p.description for p in model.parameters()]
assert descriptions[names.index('U')] == 'test'


def test_load():
Expand Down

0 comments on commit 15a68ea

Please sign in to comment.