Result Evaluations
This covers the workings of the ‘result_evaluate’ system in depth.
Contents
Type Conversion
Variable values are automatically treated as the type they most resemble. This conversion is applied both to constants and the contents of variables.
3.59 -> float
3 -> int
True -> boolean ‘True’
“hello” -> string
hello -> variable
Complex Variable References
The result JSON isn’t necessarily a flat dictionary. It may contain lists, other dictionaries, lists of dicts containing lists, and so on. To get to deeper keys, you simply provide each step in the path in a dot-seperated name.
For example, given a result structure that looks like:
{
"name": "example_results",
"table": {
"node1": {"speed": 30.0, "items": 5},
"node2": {"speed": 50.0, "items": 4},
"node3": {"speed": 70.0, "items": 3}
},
"sched":{
"test_nodes": 3,
"test_node_list": ["node1", "node2", "node3"],
}
}
“table.node1.speed” - Would refer to the ‘speed’ key of the ‘node1’ dict which is itself a key in the ‘table’ dict. (It has value
30.0
).“sched.test_node_list.1” - Would refer to the second item in the node list. (‘node2’ in this case)
Pulling Lists of Values
You can also use a single ‘*’ in a variable name to return a list of every matching value.
“table.*.speed” -> [30.0, 50.0, 70.0]
“test_node_list.*” -> [“node1”, “node2”, “node3”]
Which is the same as “test_node_list” by itself, actually.
To get the keys of a dictionary, use the keys
function. The keys are
guaranteed to be in the same order as the values produced when using a ‘*’.
String Expressions in Result Evaluations
Pavilion variables and string expressions (‘{{ stuff }}’) can be used, carefully, in result evaluations. Keep in mind that they are evaluated as a separate step (using pavilion variables), and will become the string that is later evaluated in result evaluations.
expr_eval:
variables:
num_var: 'num'
num: 8
base: 2
message: "Hiya"
result_evaluate:
# Set the result 'num' key to 52
num: '50'
half_num: '{{num_var}}/2'
# After strings are resolved, this will become:
# 'num/2'
# This will then be evaluated, and the 'num' result value will be
# used (50).
# The result 'half_num' key will thus be 25. (ie: ``50/2`` )
# If we want to include a Pavilion variable as a string, it must
# be put in quotes.
msg_len: 'len("{{message}}")'
# This will become: 'len("Hiya")'
# Which will evaluate to ``4``.
# WITHOUT QUOTES - it would be 'len(Hiya)', and the evaluation
# step would try to look up 'Hiya' as a variable.
# You can actually include more complex expressions in both
# the string expression and the evaluation, but this should be
# avoided
complicated: '(num * {{ base^10 }})/100'
# The value string resolves to: '(num * 1024)/100'
# Which evaluates to: ``(50 * 1024)/100`` -> ``512.0``