Skip to content

[Bug]: Serialization with keyword args #5273

@valentinsulzer

Description

@valentinsulzer

PyBaMM Version

21.10

Python Version

3.11

Describe the bug

If a function has (optional) keyword arguments, roundtrip serialization does not work

Steps to Reproduce

import pybamm


def func_correct(x):
    return 2 * x


def func_incorrect(x, y=1):
    return 2 * x


x = 2
func_param = pybamm.FunctionParameter("func", {"x": x})

parameter_values = pybamm.ParameterValues({"func": func_correct})
print("Original with correct function: ", parameter_values.evaluate(func_param))
# 4

serialized = parameter_values.to_json()
parameter_values = pybamm.ParameterValues.from_json(serialized)
print("Deserialized with correct function: ", parameter_values.evaluate(func_param))
# 4

parameter_values = pybamm.ParameterValues({"func": func_incorrect})
print("Original with incorrect function: ", parameter_values.evaluate(func_param))
# 4

serialized = parameter_values.to_json()
parameter_values = pybamm.ParameterValues.from_json(serialized)
print("Deserialized with incorrect function: ", parameter_values.evaluate(func_param))
# fails


### Relevant log output

```shell
Original with correct function:  4.0
Deserialized with correct function:  4.0
Original with incorrect function:  4.0
Traceback (most recent call last):
  File "/Users/vsulzer/Code/PyBaMM/src/pybamm/parameters/parameter_values.py", line 680, in process_symbol
    return self._processed_symbols[symbol]
           ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^
KeyError: FunctionParameter(-0x53a3f9a2a9835e97, func, children=['2.0'], domains={})

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/vsulzer/Code/PyBaMM/.local/serialization_bug_example.py", line 30, in <module>
    print("Deserialized with incorrect function: ", parameter_values.evaluate(func_param))
                                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/vsulzer/Code/PyBaMM/src/pybamm/parameters/parameter_values.py", line 947, in evaluate
    processed_symbol = self.process_symbol(symbol)
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/vsulzer/Code/PyBaMM/src/pybamm/parameters/parameter_values.py", line 685, in process_symbol
    processed_symbol = self._process_function_parameter(symbol)
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/vsulzer/Code/PyBaMM/src/pybamm/parameters/parameter_values.py", line 871, in _process_function_parameter
    inputs = {
             ^
  File "/Users/vsulzer/Code/PyBaMM/src/pybamm/parameters/parameter_values.py", line 871, in <dictcomp>
    inputs = {
             ^
ValueError: zip() argument 2 is shorter than argument 1

Metadata

Metadata

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions