{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Circuit Models 101\n", "\n", "In this notebook, we will explore the basics of circuit models in AutoEIS. We will start by importing the necessary libraries." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "execution": { "iopub.execute_input": "2025-08-25T23:17:03.780573Z", "iopub.status.busy": "2025-08-25T23:17:03.780464Z", "iopub.status.idle": "2025-08-25T23:17:05.529629Z", "shell.execute_reply": "2025-08-25T23:17:05.528940Z" } }, "outputs": [], "source": [ "import numpy as np\n", "import autoeis as ae\n", "ae.visualization.set_plot_style()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Circuit representation\n", "\n", "In AutoEIS, circuits are represented as strings. Please refer to [circuit notation](../circuit.md) for the syntax of the circuit string. Now, let's create a sample circuit string:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "execution": { "iopub.execute_input": "2025-08-25T23:17:05.533147Z", "iopub.status.busy": "2025-08-25T23:17:05.532743Z", "iopub.status.idle": "2025-08-25T23:17:05.539588Z", "shell.execute_reply": "2025-08-25T23:17:05.538739Z" } }, "outputs": [], "source": [ "circuit = \"R1-[P2,R3]-C4-[[R5,C6],[L7,R8]]-R2\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can visualize the circuit model using the `draw_circuit` function, which requires the `lcapy` package to be installed, and a working LaTeX installation. See [here](https://lcapy.readthedocs.io/en/latest/install.html) for more details." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2025-08-25T23:17:05.542223Z", "iopub.status.busy": "2025-08-25T23:17:05.542031Z", "iopub.status.idle": "2025-08-25T23:17:11.687589Z", "shell.execute_reply": "2025-08-25T23:17:11.686722Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/runner/work/AutoEIS/AutoEIS/.venv/lib/python3.10/site-packages/lcapy/__init__.py:76: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools<81.\n", " import pkg_resources\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Suggestion: add a constraint between nodes (25, 27) and (28, 26) for vertical graph\n" ] }, { "data": { "image/png": "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" }, "metadata": { "image/png": { "height": 688, "width": 1787 } }, "output_type": "display_data" } ], "source": [ "x = ae.visualization.draw_circuit(circuit)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Querying circuit strings\n", "\n", "Once you have the circuit string, you can run different queries on it. We're not going to explore all of available queries here, but we'll show you a few of the most common ones. To see the full list of available queries, check out the [API reference](../modules.rst).\n", "\n", "To get the list of components in the circuit, you can use the `get_component_labels` function:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "execution": { "iopub.execute_input": "2025-08-25T23:17:11.694364Z", "iopub.status.busy": "2025-08-25T23:17:11.693405Z", "iopub.status.idle": "2025-08-25T23:17:11.698471Z", "shell.execute_reply": "2025-08-25T23:17:11.698051Z" } }, "outputs": [ { "data": { "text/plain": [ "['R1', 'P2', 'R3', 'C4', 'R5', 'C6', 'L7', 'R8', 'R2']" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ae.parser.get_component_labels(circuit)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(The impedance of) Each component is represented by one or more parameters. To get the list of parameters that fully describe the circuit, use the `get_parameter_labels` function:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "execution": { "iopub.execute_input": "2025-08-25T23:17:11.700804Z", "iopub.status.busy": "2025-08-25T23:17:11.700645Z", "iopub.status.idle": "2025-08-25T23:17:11.704158Z", "shell.execute_reply": "2025-08-25T23:17:11.703408Z" } }, "outputs": [ { "data": { "text/plain": [ "['R1', 'P2w', 'P2n', 'R3', 'C4', 'R5', 'C6', 'L7', 'R8', 'R2']" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ae.parser.get_parameter_labels(circuit)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that components and parameters are not the same, despite the fact that for single-parameter components they're represented by the same string. For instance, `R1` is both a parameter and a component, but `P2` is a component, which is described by the parameters `P2w` and `P2n`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also validate the circuit using the `validate_circuit` function in case you're not sure if the circuit is valid:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "execution": { "iopub.execute_input": "2025-08-25T23:17:11.706247Z", "iopub.status.busy": "2025-08-25T23:17:11.706132Z", "iopub.status.idle": "2025-08-25T23:17:11.709790Z", "shell.execute_reply": "2025-08-25T23:17:11.708985Z" } }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ae.parser.validate_circuit(circuit)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's try to validate an invalid circuit string:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "execution": { "iopub.execute_input": "2025-08-25T23:17:11.720279Z", "iopub.status.busy": "2025-08-25T23:17:11.720056Z", "iopub.status.idle": "2025-08-25T23:17:12.054314Z", "shell.execute_reply": "2025-08-25T23:17:12.053001Z" }, "tags": [ "raises-exception" ] }, "outputs": [ { "ename": "AssertionError", "evalue": "Duplicate elements found: {'R1'}", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mAssertionError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[7], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mae\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mparser\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvalidate_circuit\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mR1-[R2,P3]-R1\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m~/work/AutoEIS/AutoEIS/src/autoeis/parser.py:58\u001b[0m, in \u001b[0;36mvalidate_circuit\u001b[0;34m(circuit)\u001b[0m\n\u001b[1;32m 56\u001b[0m components \u001b[38;5;241m=\u001b[39m get_component_labels(circuit)\n\u001b[1;32m 57\u001b[0m duplicates \u001b[38;5;241m=\u001b[39m [e \u001b[38;5;28;01mfor\u001b[39;00m e \u001b[38;5;129;01min\u001b[39;00m components \u001b[38;5;28;01mif\u001b[39;00m components\u001b[38;5;241m.\u001b[39mcount(e) \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m1\u001b[39m]\n\u001b[0;32m---> 58\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m duplicates, \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mDuplicate elements found: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mset\u001b[39m(duplicates)\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 59\u001b[0m \u001b[38;5;66;03m# Test circuit is not empty\u001b[39;00m\n\u001b[1;32m 60\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(circuit) \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m0\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCircuit string is empty.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n", "\u001b[0;31mAssertionError\u001b[0m: Duplicate elements found: {'R1'}" ] } ], "source": [ "ae.parser.validate_circuit(\"R1-[R2,P3]-R1\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Another useful query is to compare two circuits to see if they are structurally equivalent. For instance, one would expect that `R1-R2` and `R2-R1` and `R5-R0` are equivalent, i.e., neither the order of appearance of the components nor the labels matter. This is useful for filtering out duplicate circuits, which may (and will) arise during circuit generation using evolutionary algorithms. You can do this using the `are_circuits_equivalent` function:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "execution": { "iopub.execute_input": "2025-08-25T23:17:12.059008Z", "iopub.status.busy": "2025-08-25T23:17:12.058838Z", "iopub.status.idle": "2025-08-25T23:17:12.069806Z", "shell.execute_reply": "2025-08-25T23:17:12.069198Z" } }, "outputs": [], "source": [ "circuit1 = \"R1-[P2,R3]-C4\"\n", "circuit2 = \"C4-R1-[R3,P2]\"\n", "circuit3 = \"C0-R5-[R9,P0]\"\n", "\n", "assert ae.utils.are_circuits_equivalent(circuit1, circuit2)\n", "assert ae.utils.are_circuits_equivalent(circuit1, circuit3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Evaluating circuit strings\n", "\n", "Once you have a valid circuit string, you can calculate the EIS spectra of the circuit model by evaluating it at the frequency range of interest. To do this, you need to convert the circuit string to a function using the `generate_circuit_fn` function:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "execution": { "iopub.execute_input": "2025-08-25T23:17:12.071939Z", "iopub.status.busy": "2025-08-25T23:17:12.071817Z", "iopub.status.idle": "2025-08-25T23:17:12.077977Z", "shell.execute_reply": "2025-08-25T23:17:12.077351Z" } }, "outputs": [], "source": [ "circuit_fn = ae.utils.generate_circuit_fn(circuit)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, let's calculate the EIS spectra for a few frequencies. For this, we also need to pass the parameters of the circuit model, for which we can use random values:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "execution": { "iopub.execute_input": "2025-08-25T23:17:12.080831Z", "iopub.status.busy": "2025-08-25T23:17:12.080468Z", "iopub.status.idle": "2025-08-25T23:17:12.088948Z", "shell.execute_reply": "2025-08-25T23:17:12.088003Z" } }, "outputs": [ { "data": { "text/plain": [ "array([2.47101063-1.90324214e+02j, 2.45090467-4.10119181e+01j,\n", " 2.45102511-8.82122947e+00j, 2.47344142-1.90984378e+00j,\n", " 2.45028677-4.44860703e-01j, 2.40214456-1.54854868e-01j,\n", " 2.31473269-8.41415766e-02j, 2.26697117-4.92385197e-02j,\n", " 2.22847868-4.17354044e-02j, 2.18939631-4.07371620e-02j])" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "freq = np.logspace(-3, 3, 10)\n", "num_params = ae.parser.count_parameters(circuit)\n", "p = np.random.rand(num_params)\n", "Z = circuit_fn(freq, p)\n", "Z" ] } ], "metadata": { "kernelspec": { "display_name": ".venv", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.18" } }, "nbformat": 4, "nbformat_minor": 2 }