{ "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": "2024-06-06T14:44:55.527926Z", "iopub.status.busy": "2024-06-06T14:44:55.527292Z", "iopub.status.idle": "2024-06-06T14:44:59.815071Z", "shell.execute_reply": "2024-06-06T14:44:59.814561Z" } }, "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": "2024-06-06T14:44:59.818272Z", "iopub.status.busy": "2024-06-06T14:44:59.818075Z", "iopub.status.idle": "2024-06-06T14:44:59.826120Z", "shell.execute_reply": "2024-06-06T14:44:59.825771Z" } }, "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": "2024-06-06T14:44:59.828192Z", "iopub.status.busy": "2024-06-06T14:44:59.828089Z", "iopub.status.idle": "2024-06-06T14:45:01.978652Z", "shell.execute_reply": "2024-06-06T14:45:01.977827Z" } }, "outputs": [ { "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": "2024-06-06T14:45:01.981944Z", "iopub.status.busy": "2024-06-06T14:45:01.981264Z", "iopub.status.idle": "2024-06-06T14:45:01.985385Z", "shell.execute_reply": "2024-06-06T14:45:01.984889Z" } }, "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": "2024-06-06T14:45:01.987898Z", "iopub.status.busy": "2024-06-06T14:45:01.987790Z", "iopub.status.idle": "2024-06-06T14:45:01.990889Z", "shell.execute_reply": "2024-06-06T14:45:01.990377Z" } }, "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": "2024-06-06T14:45:01.993066Z", "iopub.status.busy": "2024-06-06T14:45:01.992942Z", "iopub.status.idle": "2024-06-06T14:45:02.001546Z", "shell.execute_reply": "2024-06-06T14:45:02.001179Z" } }, "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": "2024-06-06T14:45:02.003388Z", "iopub.status.busy": "2024-06-06T14:45:02.003294Z", "iopub.status.idle": "2024-06-06T14:45:02.212646Z", "shell.execute_reply": "2024-06-06T14:45:02.212263Z" }, "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:56\u001b[0m, in \u001b[0;36mvalidate_circuit\u001b[0;34m(circuit)\u001b[0m\n\u001b[1;32m 54\u001b[0m components \u001b[38;5;241m=\u001b[39m get_component_labels(circuit)\n\u001b[1;32m 55\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---> 56\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 57\u001b[0m \u001b[38;5;66;03m# Test circuit is not empty\u001b[39;00m\n\u001b[1;32m 58\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": "2024-06-06T14:45:02.214901Z", "iopub.status.busy": "2024-06-06T14:45:02.214750Z", "iopub.status.idle": "2024-06-06T14:45:02.221751Z", "shell.execute_reply": "2024-06-06T14:45:02.221357Z" } }, "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": "2024-06-06T14:45:02.223601Z", "iopub.status.busy": "2024-06-06T14:45:02.223505Z", "iopub.status.idle": "2024-06-06T14:45:02.225503Z", "shell.execute_reply": "2024-06-06T14:45:02.225152Z" } }, "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": "2024-06-06T14:45:02.227375Z", "iopub.status.busy": "2024-06-06T14:45:02.227288Z", "iopub.status.idle": "2024-06-06T14:45:02.237558Z", "shell.execute_reply": "2024-06-06T14:45:02.237199Z" } }, "outputs": [ { "data": { "text/plain": [ "array([1.21883079-2.24443252e+02j, 1.2175161 -4.83386010e+01j,\n", " 1.2507572 -1.03434596e+01j, 1.38312962-2.19648084e+00j,\n", " 1.37171398-5.63043052e-01j, 1.19447804-2.53134306e-01j,\n", " 1.07605597-9.78569732e-02j, 1.03376487-4.21266919e-02j,\n", " 1.01152567-2.01285355e-02j, 1.0002327 -9.77043145e-03j])" ] }, "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.11" } }, "nbformat": 4, "nbformat_minor": 2 }