From 6f0dcf2decd280ae236d69e0c3afd0a311252755 Mon Sep 17 00:00:00 2001 From: "Corey R. Randall" Date: Fri, 13 Sep 2024 15:02:36 -0600 Subject: [PATCH 1/3] loadfns, get_colors, and cleanup --- .github/ISSUE_TEMPLATE/bug_report.yml | 12 +- .github/ISSUE_TEMPLATE/documentation.yml | 31 +++++ .github/ISSUE_TEMPLATE/feature_request.yml | 8 +- README.md | 12 +- images/dark.svg | 126 ----------------- images/favicon.ico | Bin 4286 -> 0 bytes images/favicon.png | Bin 1240 -> 0 bytes images/light.svg | 152 --------------------- images/single_RC.png | Bin 60431 -> 0 bytes images/tests.svg | 8 +- src/thevenin/__init__.py | 2 +- src/thevenin/_model.py | 15 +- src/thevenin/loadfns/_steps.py | 4 +- src/thevenin/plotutils/_colors.py | 2 +- tests/test_model.py | 48 +++++-- 15 files changed, 101 insertions(+), 319 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/documentation.yml delete mode 100644 images/dark.svg delete mode 100644 images/favicon.ico delete mode 100644 images/favicon.png delete mode 100644 images/light.svg delete mode 100644 images/single_RC.png diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 78e2f7f..0e8294d 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -6,8 +6,7 @@ labels: ["bug"] body: - type: markdown attributes: - value: | - Thanks for taking the time to fill out this bug report! + value: Thanks for taking the time to fill out this bug report! - type: input id: version @@ -40,11 +39,7 @@ body: attributes: label: Steps to Reproduce description: | - Provide clear steps to reproduce the bug. Ideally, include a code block - that demonstrates the issue. Aim for a minimal, easy-to-understand example - by simplifying or removing unnecessary parts of your code. Only include - code leading up to where the error occurs—for instance, if the error is - thrown on line 30, do not include any lines after that. + Provide clear steps to reproduce the bug. Ideally, include a code block that demonstrates the issue. Aim for a minimal, easy-to-understand example by simplifying or removing unnecessary parts of your code. Only include code leading up to where the error occurs—for instance, if the error is thrown on line 30, do not include any lines after that. validations: required: true @@ -53,6 +48,5 @@ body: attributes: label: Relevant log output description: | - Copy and paste any relevant log output. Your log will automatically be - formatted into code, so there is no need for backticks. + Copy and paste any relevant log output. Your log will automatically be formatted into code, so there is no need for backticks. render: shell \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/documentation.yml b/.github/ISSUE_TEMPLATE/documentation.yml new file mode 100644 index 0000000..4196481 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/documentation.yml @@ -0,0 +1,31 @@ +name: Documentation +description: File a bug report +title: "[docs]: " +labels: ["documentation"] + +body: + - type: markdown + attributes: + value: Thanks for taking the time to fill out this report! + + - type: radio + id: problem-type + attributes: + label: Problem/request type + description: What are you trying to get fixed or added? + options: + - label: typo + - label: example request + - label: broken link + - label: other + validations: + required: true + + - type: textarea + id: detailed-explanation + attributes: + label: Detailed explanation + description: | + On what page is the typo or link broken? Include the page url and refer to a specific section when possible. If you are requesting an example, what would you like to see demonstrated? For anything else, be concise, but provide enough detail to make sure the issue/request can be further investigated. + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index d62d4d3..f90d9ea 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -5,8 +5,7 @@ labels: ["feature"] body: - type: markdown attributes: - value: | - Thanks for taking the time to fill out this form! + value: Thanks for taking the time to fill out this form! - type: textarea id: description @@ -20,8 +19,9 @@ body: id: motivation attributes: label: Motivation - description: | - How does the feature improve the package? What is the expected outcome? + description: How does the feature improve the package? What is the expected outcome? + validations: + required: true - type: textarea id: additional-context diff --git a/README.md b/README.md index e5d99ec..5522861 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ - - thevenin logo @@ -22,7 +22,7 @@ [pep-l]: https://www.python.org/dev/peps/pep-0008 ## Summary -This package is a wrapper for the well-known Thevenin equivalent circuit model. The model is comprised of a single series reistor followed by any number of parallel RC pairs. Figure 1 below illustrates a circuit with 2 RC paris; however, the model can be run with as few as zero, and as many as $N$. +This package is a wrapper for the well-known Thevenin equivalent circuit model. The model is comprised of a single series reistor followed by any number of parallel RC pairs. Figure 1 below illustrates a circuit with 2 RC pairs; however, the model can be run with as few as zero, and as many as $N$.

2RC Thevenin circuit. - - - diff --git a/images/favicon.ico b/images/favicon.ico deleted file mode 100644 index 8f0a623512adb3882edb248bc7201e1dfe455f2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4286 zcmcJTYe-Z<6vrnbvMB3Q^r^QIMB(nHy~r#v+q-KPrQu`E0tJaEdQk*=%}07yEfuRx zqE9_O6@6%-bRXigcV+}Vs6{X{3!>CqOQ&;o_b%7#-n+AW$=^`T|cl{kUgi_$a;f!XmNTzM?5d{)%_KrDG1yxY|f^XCarV$6H&J|uPjgN>@AajL3+!gY;Pq2mn$==Bax#q`sK{3p_EGcUv$>^v(=He+ zz^AC&dGSujBO?qxSU75ZuHYQBRwmB??st)orL`oXy>OpyaFS!_$2@5_b171`Sg$YD zzbxLr=G$b(P+-y}JIsa}kvXmuxGr<{TGyn-kfFT{%=U3y-&(+So7wQSDtFxrc?`!7 zC()zFQar-C+|Kk2=NK@$)%ZT!(3K;b9!Y&}zu)A~16Y^ZLa6tG|3L;m?v2qKr?Kl9@oaeq!Azb_O%_O%voZ`0pz9uaf#f6RZ6!^}Mj#=lv2kQQ36 zjZx~;j{cbTH=`KCmZna+ucl;-jvd{_vL;$=g0U_bzw-8Z8rwt1$@sSSPh3;SZ*d-^ zWp>#~2EOi+t(;5!S3btH&Gln6!TIEul#O*3enEz2x3yXy4*UVN7?i%hI45!4Zkp(P z_){7K1OI2)fsM2A46v6QuB!1HDw62Es=Z^B^7^CyePG>My?3OJPij7s9YaxhS<%7f z-y)vD4HevS;Qv;OL2gTZ{oc>Vx@f<{Go7DqINz3vd@OB(p-KEcs6?zS841t*PHk+CIb|H6tr{_+e6&WdIDb;=R z&?)!zug?%eiy&KXN^G$m?`6I<8PdLx#W-v;8~G;|-89i}sHJCbdh>&7j*@YIz@4@d z@71C5l=@?y#9WQ%h40M5bvg_hfc*8*E*RTv0(Ze7a7IUMGW*}(&Z)5S3H?LJ<{?5B mekWv(i;(F~LZ+g4`1b*dg!mE1IemUy;1hi#16jzV!2Syo5VpF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H11Z7D? zK~z|UwU=FNR7DtupE>8qw%yHApi+tkELdV9g8Y?0O!$$QNW+aGhQwI(MiUYgFOU#_ zY7r2lsakGL1Y?a>^a7HS5QtDIZP(HwR7zMVg|@a`*mleAw)=Nxyr6Bi-Q}FM)Hm6S z^S$4E@4Iu(d^01IQe=Y7hflgi%u%9AHcFu_6{x3xTp*6XCnUWR)d<>Yr<1eQJJyFX zsVnRZlvJEqB$T!X#Wo-(BexJl@vSD!uaEE9bZ1fqUj3>*dnhsdDMGvp7#RvrL|mW_ z_PD1XXnJc!JYxe}zNjry!u$KC2!yJHp@h0sBk27 zPn!DLmZ}fEqd8+Uu%Y~HmJ;SKnTP|-at4{>3NXhNV3sqO!b_R>+t=3UN)iXi(+u<1 zqIV8EQVckAWsSv*6yhGLPI3{A38iOGrkf-bYSZ&(#fAI_T0culBH#>mEE znRvrrz>$_0$HkWCUkzu)yL0kf3DF;NaN^RualE(BZEHZm5<{R0?Gifz`E&&G$DYkt zq@if#h2p%~2>}ooa&XLJTP7VAXn?)dB*a32+Pl|0#R`?u#wURp1|+Q~YpCJ=-r7Ld z^>tGqJO%?80IZq@K=gk1jmu&GKT|3W3>rWuF!$j(%I|M)?TUp4RwYNjtXYi1c+hO3 ziAlZgi38zCM4i;C-&-?`;^)z5EEqU&dkfkLf0dAn8c9c1Pvj zXlUS|)u`<+c-dNf%d+w@Pa#Lo7g^>gIMn=o*3{ z#9O&DTKro1R#WFZP>^n9*MO6zjy%iiT?0-lx>MJA#ap>EIvPm17p&M`zCf&fMVnuB - - - diff --git a/images/single_RC.png b/images/single_RC.png deleted file mode 100644 index 48b8e97c6e6b92431df0f58f14cff30070c1e255..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60431 zcmZVm2RxVk`#z4py1R>}Q79ErA&N3XMn;H?LLsz_%Z=tUx} z-$A|+KXG7p>2m>s#AhvD72k+1YX4Ff+Eg zcIBoXr@5s;_~=P`5@|n4PU@7ZeZ+8w!=>P!mDO?MjrZ1_I!1NMLY|7|0`E}%m~m3i zjm(kj4>cocn=i>vM!YCB>p7Pj%5YRf)A7Z5Z>Ldx&cpw4{Kt0rNamYkRU&0#HQ$yz zcjdb|(VFShmUo{lt#;O)6=7UduPpAHEU;EjQA-qObx-7QC#RK|+rqTuPMLF;awC(w zimw3H{OeERsZ%zVE~RKq`v2WxyP6i4`_G&I&(|nQC|`H9sQvxg%h;`sOzxfk&rhcQ=OFkf|8M`q zw@JzVU6k_r0^y=xmx*zf@!MO__x07CZP%_{8)7+hXuhYn*Ri*+&ndsCh|bZ;sgI0| zEWu{5;qZ+g9|H5j`HUZOO;)8`$Y`P$Fl(2Ljg8%8+?+0AG^UHKcWa`g{$*p0ktZzT zYLeAbUe`v6w6XK^=SsV{l;%}A2eB%t|M%a2-&^y{T^)wMWE#A`zdJ~|wRCRIzSd=V zp(HFIpe|LX#8J30je$gp(XZ1;YkCx^{cG)sD_5^xE$(z(T~>6O87>gxv zP;hl!eY-eTw%UGPNyKKwi#00$+Ob`!d-zQZPh#z52U%IkwlKZT();*ODeC0BW}_=% zj(l5wZ&2ccYvq284wKaa9#KLz$>Hy=9uLk

d8R<2Ua-`3%1lz@;8j?b`Kt$KJgW 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

    s`-@7}2UC000UbC}?H*y1XL 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 diff --git a/images/tests.svg b/images/tests.svg index 320f899..282c9bb 100644 --- a/images/tests.svg +++ b/images/tests.svg @@ -1,5 +1,5 @@ - - tests: 29 + + tests: 31 @@ -15,7 +15,7 @@ tests - - 29 + + 31 diff --git a/src/thevenin/__init__.py b/src/thevenin/__init__.py index 44d5995..1bc844b 100644 --- a/src/thevenin/__init__.py +++ b/src/thevenin/__init__.py @@ -25,7 +25,7 @@ from . import loadfns from . import plotutils -__version__ = '0.0.1' +__version__ = '0.1.0' __all__ = [ 'IDASolver', diff --git a/src/thevenin/_model.py b/src/thevenin/_model.py index e5b3df8..b56b076 100644 --- a/src/thevenin/_model.py +++ b/src/thevenin/_model.py @@ -566,7 +566,7 @@ def _yaml_reader(file: str) -> dict: templates = here + '/templates' if file in os.listdir(templates): - warnings.warn(f"Using the default parameter file '{file}'.") + short_warn(f"Using the default parameter file '{file}'.") file = templates + '/' + file def eval_constructor(loader, node): @@ -585,9 +585,14 @@ def eval_constructor(loader, node): return data -def _showwarning(message, category, filename, lineno, file=None, line=None): - file = file or sys.stderr - print(f"\n[thevenin {category.__name__}]: {message}\n", file=file) +def formatwarning(message, category, filename, lineno, line=None): + return f"\n[thevenin {category.__name__}]: {message}\n\n" -# warnings.showwarning = _showwarning +def short_warn(message, category=None, stacklevel=1, source=None): + original_format = warnings.formatwarning + + warnings.formatwarning = formatwarning + warnings.warn(message, category, stacklevel, source) + + warnings.formatwarning = original_format diff --git a/src/thevenin/loadfns/_steps.py b/src/thevenin/loadfns/_steps.py index 1347be5..5f72569 100644 --- a/src/thevenin/loadfns/_steps.py +++ b/src/thevenin/loadfns/_steps.py @@ -134,7 +134,9 @@ def __init__(self, tp: np.ndarray, yp: np.ndarray, t_ramp: float, See also -------- - StepFunction + StepFunction : + Uses hard discontinuous steps rather than ramped steps. Generally + non-ideal for simulations, but may be useful elsewhere. """ diff --git a/src/thevenin/plotutils/_colors.py b/src/thevenin/plotutils/_colors.py index c959fbf..85f615a 100644 --- a/src/thevenin/plotutils/_colors.py +++ b/src/thevenin/plotutils/_colors.py @@ -32,7 +32,7 @@ def get_colors(size: int, data: ndarray = None, norm: ndarray = None, Returns ------- - list + colors : list A list of (r, g, b, a) color codes. Raises diff --git a/tests/test_model.py b/tests/test_model.py index 37f863a..fef58fe 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -284,18 +284,44 @@ def test_isothermal_flag(model_2RC, constant_exp): assert np.allclose(sol.vars['temperature_K'], model_2RC.T_inf) -def test_custom_showwarning(): - from thevenin._model import _showwarning +def test_mutable_warning(): + from thevenin._model import short_warn - warnings.simplefilter('always') + with warnings.catch_warnings(record=True) as report: + warnings.simplefilter('ignore') + short_warn("This is a test warning.") - # Redirect stderr to capture print statements - captured_output = io.StringIO() - with contextlib.redirect_stderr(captured_output): - warnings.showwarning = _showwarning - warnings.warn("This is a test warning.", UserWarning) + assert len(report) == 0 - # Get the captured output - output = captured_output.getvalue().strip() - assert output == "[thevenin UserWarning]: This is a test warning." +def test_detected_warning(): + from thevenin._model import short_warn + + with pytest.warns(UserWarning): + short_warn("This is a test warning") + + +def test_custom_format(): + from thevenin._model import formatwarning, short_warn + + with warnings.catch_warnings(record=True) as report: + warnings.simplefilter('always') + short_warn("This is a test warning.", Warning) + + args = ( + report[0].message, + report[0].category, + report[0].filename, + report[0].lineno, + report[0].line, + ) + + # ensure the same inputs, remove any \n, \t, etc. + custom = formatwarning(*args).strip() + original = warnings.formatwarning(*args).strip() + + # custom format works + assert custom == "[thevenin Warning]: This is a test warning." + + # warnings from warnings.warn not impacted by custom format + assert original != "[thevenin Warning]: This is a test warning." \ No newline at end of file From f26ac005d1f5830a2c52265b2dc32975337b073b Mon Sep 17 00:00:00 2001 From: "Corey R. Randall" Date: Fri, 13 Sep 2024 15:07:09 -0600 Subject: [PATCH 2/3] forgot pre-commit --- src/thevenin/_model.py | 1 - src/thevenin/loadfns/_steps.py | 2 +- tests/test_model.py | 6 ++---- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/thevenin/_model.py b/src/thevenin/_model.py index b56b076..19fb52d 100644 --- a/src/thevenin/_model.py +++ b/src/thevenin/_model.py @@ -2,7 +2,6 @@ from typing import TYPE_CHECKING import os -import sys import time import warnings diff --git a/src/thevenin/loadfns/_steps.py b/src/thevenin/loadfns/_steps.py index 5f72569..304d4a5 100644 --- a/src/thevenin/loadfns/_steps.py +++ b/src/thevenin/loadfns/_steps.py @@ -134,7 +134,7 @@ def __init__(self, tp: np.ndarray, yp: np.ndarray, t_ramp: float, See also -------- - StepFunction : + StepFunction : Uses hard discontinuous steps rather than ramped steps. Generally non-ideal for simulations, but may be useful elsewhere. diff --git a/tests/test_model.py b/tests/test_model.py index fef58fe..e7fee2b 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -1,8 +1,6 @@ -import io -import pytest import warnings -import contextlib +import pytest import thevenin import numpy as np @@ -324,4 +322,4 @@ def test_custom_format(): assert custom == "[thevenin Warning]: This is a test warning." # warnings from warnings.warn not impacted by custom format - assert original != "[thevenin Warning]: This is a test warning." \ No newline at end of file + assert original != "[thevenin Warning]: This is a test warning." From 735fb7a9a50746513d97f5617a0f804036bade5d Mon Sep 17 00:00:00 2001 From: "Corey R. Randall" Date: Mon, 16 Sep 2024 14:26:11 -0600 Subject: [PATCH 3/3] Cleanup license, changelog, images, etc. --- .github/pull_request_template.md | 14 ++++----- CHANGELOG.md | 2 +- LICENSE.txt | 28 ++++++++++++++++++ README.md | 25 ++++++++-------- ...evenin_circuit.png => example_circuit.png} | Bin 5 files changed, 46 insertions(+), 23 deletions(-) create mode 100644 LICENSE.txt rename images/{thevenin_circuit.png => example_circuit.png} (100%) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 5b2c93c..24e962e 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,27 +1,23 @@ # Description - Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change. Fixes # (issue) ## Type of change - -Please add a line in the relevant section of [CHANGELOG.md](https://github.com/ROVI-org/thevenin/blob/dev/CHANGELOG.md) to document the change (include PR #) - note reverse order of PR #s. If necessary, also add to the list of breaking changes. +Please add a line in the relevant section of [CHANGELOG.md](https://github.com/ROVI-org/thevenin/blob/main/CHANGELOG.md) to document the change (include PR #) - note reverse order of PR #s. If necessary, also add to the list of breaking changes. - [ ] New feature (non-breaking change which adds functionality) - [ ] Optimization (back-end change that improves speed/readability/etc.) - [ ] Bug fix (non-breaking change which fixes an issue) # Key checklist: - -- [ ] No style issues: `$ nox -s linter [-- format]` (the `format` option will try to fix errors) -- [ ] Docstrings/comments are free of misspellings: `$ nox -s codespell [-- write]` (the `write` option will try to fix errors) +- [ ] No style issues: `$ nox -s linter [-- format]` +- [ ] Code is free of misspellings: `$ nox -s codespell [-- write]` - [ ] All tests pass: `$ nox -s tests` -- [ ] New badges have been generated: `$ nox -s badges` +- [ ] Badges are updated: `$ nox -s badges` -You can also run all of the above checks using `$ nox -s pre-commit` instead of running them individually. +The optional `-- format` and `-- write` arguments (see above) attempt to correct formatting issues prior to running the linter, and spelling mistakes prior to running the spellcheck, respectively. You can also run all of the above checks using `$ nox -s pre-commit` instead of running them individually. ## Further checks: - - [ ] Code is commented, particularly in hard-to-understand areas - [ ] Tests are added that prove fix is effective or that feature works diff --git a/CHANGELOG.md b/CHANGELOG.md index 42c588d..5345fdd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # thevenin Changelog -## Unreleased +## [Unreleased]() ### New Features diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..8252495 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,28 @@ +BSD 3-Clause License + +Copyright (c) 2024, National Renewable Energy Laboratory + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md index 5522861..459cc93 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,9 @@ - - - thevenin logo - +Logo +Logo -


    +
    [![CI][ci-b]][ci-l]   ![tests][test-b]   @@ -15,8 +13,8 @@ [ci-b]: https://github.com/ROVI-org/thevenin/actions/workflows/ci.yaml/badge.svg [ci-l]: https://github.com/ROVI-org/thevenin/actions/workflows/ci.yaml -[test-b]: ./images/tests.svg -[cov-b]: ./images/coverage.svg +[test-b]: https://raw.githubusercontent.com/ROVI-org/thevenin/1f2d5c206f2656163823352cbbf4459c4cb327ec/images/tests.svg +[cov-b]: https://raw.githubusercontent.com/ROVI-org/thevenin/1f2d5c206f2656163823352cbbf4459c4cb327ec/images/coverage.svg [pep-b]: https://img.shields.io/badge/code%20style-pep8-orange.svg [pep-l]: https://www.python.org/dev/peps/pep-0008 @@ -25,8 +23,9 @@ This package is a wrapper for the well-known Thevenin equivalent circuit model. The model is comprised of a single series reistor followed by any number of parallel RC pairs. Figure 1 below illustrates a circuit with 2 RC pairs; however, the model can be run with as few as zero, and as many as $N$.

    - 2RC Thevenin circuit.
    + 2RC Thevenin circuit. +
    Figure 1: 2RC Thevenin circuit.

    @@ -65,7 +64,7 @@ We recommend using [Anaconda](https://anaconda.com) to install this package due After cloning the repository, or downloading the files, use your terminal (MacOS/Linux) or Anaconda Prompt (Windows) to navigate into the folder with the `pyproject.toml` file. Once in the correct folder, execute the following commands: -```cmd +```command conda create -n rovi python=3.12 scikits_odes_sundials -c conda-forge conda activate rovi pip install . @@ -75,7 +74,7 @@ The first command will create a new Python environment named `rovi`. The environ If you plan to make changes to the package, you may also want to consider installing in "editable" mode using the `-e` flag, and including the optional developer dependencies, using `[dev]`, as shown below. If you plan to push any changes back into this repository, you should see the [contributing](#contributing) section first. -```cmd +```command pip install -e .[dev] ``` diff --git a/images/thevenin_circuit.png b/images/example_circuit.png similarity index 100% rename from images/thevenin_circuit.png rename to images/example_circuit.png