Data Fitting#

examples/pipeline/datafit.py#
import json
import os
import sys
import time

from ionworks import Ionworks

sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")))


# Setup Ionworks client and pipeline
client = Ionworks()

with open("examples/data/Chen2020.json") as f:
    parameter_values = json.load(f)

data_config_05C = "file:examples/data/chen_synthetic_0.5C/time_series.csv"
data_config_1C = "file:examples/data/chen_synthetic_1C/time_series.csv"

# Define entry configuration to provide parameters
entry_config = {"values": parameter_values}

# Define datafit configuration
datafit_config = {
    "objectives": {
        "test_1C": {
            "objective": "CurrentDriven",
            "model": {"type": "SPMe"},
            "data": {"data": data_config_1C},
            "parameters": {"Ambient temperature [K]": 298.15},
        },
        "test_0.5C": {
            "objective": "CurrentDriven",
            "model": {"type": "SPMe"},
            "data": {"data": data_config_05C},
            "parameters": {"Ambient temperature [K]": 298.15},
        },
    },
    "parameters": {
        "Negative particle diffusivity [m2.s-1]": {
            "bounds": [1e-14, 1e-13],
            "initial_value": 2e-14,
        },
        "Positive particle diffusivity [m2.s-1]": {
            "bounds": [1e-15, 1e-14],
            "initial_value": 2e-15,
        },
    },
    "cost": {"type": "RMSE"},
    "optimizer": {"type": "ScipyDifferentialEvolution"},
}

# Create pipeline config
pipeline_config = {
    "elements": {
        "entry": {**entry_config, "element_type": "entry"},
        "fit data": {**datafit_config, "element_type": "data_fit"},
    },
}

# Submit pipeline
pipeline = client.pipeline.create(pipeline_config)
print("Pipeline", pipeline)

# Get job results
while True:
    pipeline = client.pipeline.get(pipeline.id)
    print(f"Pipeline {pipeline.id} status: {pipeline.status}")
    if pipeline.status == "completed":
        result = client.pipeline.result(pipeline.id)
        print("Pipeline completed")
        print("Result:", result.element_results["fit data"])
        break
    elif pipeline.status == "failed":
        print("Pipeline failed")
        print("Error:", pipeline.error)
        break
    time.sleep(1)