From 88d6401002dd804526e0edbb2164f02ea89a292d Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 14 Jul 2023 13:51:45 +0100 Subject: [PATCH 001/210] Updt. Readme & add architecture diagrams --- README.md | 26 + assets/BayOpt_Arch.pdf | Bin 0 -> 85508 bytes assets/BayesOpt_Arch.svg | 1731 ++++++++++++++++++++++++++++++++++++++ assets/PyBOP_Arch.pdf | Bin 0 -> 110377 bytes assets/PyBOP_Arch.svg | 74 ++ 5 files changed, 1831 insertions(+) create mode 100644 assets/BayOpt_Arch.pdf create mode 100644 assets/BayesOpt_Arch.svg create mode 100644 assets/PyBOP_Arch.pdf create mode 100644 assets/PyBOP_Arch.svg diff --git a/README.md b/README.md index 2f0a61069..3d7a2d4f7 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,28 @@ # PyBOP - A *Py*thon toolbox for *B*attery *O*ptimisation and *P*arameterisation +PyBOP aims to be a modular library for the parameterisation and optimisation of battery models, with a particular focus on classes built around [PyBaMM](https://github.com/pybamm-team/PyBaMM) models. The figure below gives the current conceptual idea of PyBOP's structure. This will likely evolve as development progresses. + +<p align="center"> + <img src="assets/PyBOP_Arch.svg" alt="Data flows from battery cycling machines to Galv Harvesters, then to the Galv server and REST API. Metadata can be updated and data read using the web client, and data can be downloaded by the Python client." width="600" /> +</p> + +The living software specification of PyBOP can be found here; however, an overview is introduced below. + +- Provide both frequentist and bayesian parameterisation and optimisation methods to battery modellers +- Provide workflows and examples for parameter fitting and grouping +- Create diagnostics for end-users to convey parameter and optimisation fidelity + +**Community and values** + +PyBOP aims to foster a broad consortium of developers and users, building on and +learning from the success of the PyBaMM community. Our values are: + +- Open-Source (code and ideas should be shared) + +- Inclusivity and fairness (those who want to contribute may do so, + and their input is appropriately recognised) + +- Inter-operability (aiming for modularity to enable maximum impact + and inclusivity) + +- User-friendliness (putting user requirements first, thinking about user- assistance & workflows) \ No newline at end of file diff --git a/assets/BayOpt_Arch.pdf b/assets/BayOpt_Arch.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5332b82b2e7ce3e923a2a2f1fc1bd261389f9d56 GIT binary patch literal 85508 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 literal 0 HcmV?d00001 diff --git a/assets/BayesOpt_Arch.svg b/assets/BayesOpt_Arch.svg new file mode 100644 index 000000000..e9340ab6d --- /dev/null +++ b/assets/BayesOpt_Arch.svg @@ -0,0 +1,1731 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + width="602pt" + height="291pt" + viewBox="0 0 602 291" + version="1.2" + id="svg1079" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs536"> + <g + id="g482"> + <symbol + overflow="visible" + id="glyph0-0"> + <path + style="stroke:none" + d="M 1.625,0 V -8.109375 H 8.109375 V 0 Z M 1.828125,-0.203125 H 7.90625 V -7.90625 H 1.828125 Z m 0,0" + id="path362" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-1"> + <path + style="stroke:none" + d="m 1.0625,0 v -9.296875 h 6.265625 v 1.09375 H 2.296875 V -5.3125 H 6.65625 v 1.09375 H 2.296875 V 0 Z m 0,0" + id="path365" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-2"> + <path + style="stroke:none" + d="m 0.4375,-3.359375 c 0,-1.25 0.34375,-2.175781 1.03125,-2.78125 0.582031,-0.5 1.289062,-0.75 2.125,-0.75 0.925781,0 1.679688,0.308594 2.265625,0.921875 0.582031,0.605469 0.875,1.4375 0.875,2.5 0,0.875 -0.132813,1.5625 -0.390625,2.0625 C 6.082031,-0.914062 5.703125,-0.53125 5.203125,-0.25 4.710938,0.0195312 4.175781,0.15625 3.59375,0.15625 2.644531,0.15625 1.878906,-0.144531 1.296875,-0.75 0.722656,-1.351562 0.4375,-2.222656 0.4375,-3.359375 Z m 1.171875,0 c 0,0.855469 0.1875,1.5 0.5625,1.9375 0.375,0.429687 0.847656,0.640625 1.421875,0.640625 0.5625,0 1.03125,-0.210938 1.40625,-0.640625 0.375,-0.4375 0.5625,-1.097656 0.5625,-1.984375 C 5.5625,-4.238281 5.375,-4.867188 5,-5.296875 4.625,-5.722656 4.15625,-5.9375 3.59375,-5.9375 c -0.574219,0 -1.046875,0.214844 -1.421875,0.640625 -0.375,0.429687 -0.5625,1.074219 -0.5625,1.9375 z m 0,0" + id="path368" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-3"> + <path + style="stroke:none" + d="M 0.84375,0 V -6.734375 H 1.875 V -5.71875 C 2.132812,-6.1875 2.375,-6.5 2.59375,-6.65625 2.8125,-6.8125 3.054688,-6.890625 3.328125,-6.890625 c 0.382813,0 0.773437,0.125 1.171875,0.375 l -0.390625,1.0625 c -0.28125,-0.164063 -0.5625,-0.25 -0.84375,-0.25 -0.25,0 -0.476563,0.078125 -0.671875,0.234375 -0.199219,0.148438 -0.339844,0.351562 -0.421875,0.609375 -0.125,0.40625 -0.1875,0.851563 -0.1875,1.328125 V 0 Z m 0,0" + id="path371" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-4"> + <path + style="stroke:none" + d="m 2.09375,0 -2.0625,-6.734375 h 1.1875 l 1.0625,3.890625 0.40625,1.4375 c 0.019531,-0.070312 0.132812,-0.535156 0.34375,-1.390625 l 1.078125,-3.9375 H 5.28125 l 1.015625,3.90625 0.328125,1.28125 0.390625,-1.296875 1.15625,-3.890625 H 9.28125 L 7.171875,0 h -1.1875 L 4.90625,-4.03125 4.65625,-5.1875 3.296875,0 Z m 0,0" + id="path374" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-5"> + <path + style="stroke:none" + d="M 5.25,-0.828125 C 4.820312,-0.472656 4.410156,-0.21875 4.015625,-0.0625 3.628906,0.0820312 3.210938,0.15625 2.765625,0.15625 2.023438,0.15625 1.457031,-0.0234375 1.0625,-0.390625 0.664062,-0.753906 0.46875,-1.21875 0.46875,-1.78125 c 0,-0.320312 0.070312,-0.617188 0.21875,-0.890625 0.15625,-0.28125 0.351562,-0.5 0.59375,-0.65625 0.238281,-0.164063 0.515625,-0.289063 0.828125,-0.375 0.21875,-0.0625 0.554687,-0.117187 1.015625,-0.171875 0.914062,-0.113281 1.59375,-0.242188 2.03125,-0.390625 0,-0.15625 0,-0.257813 0,-0.3125 0,-0.457031 -0.105469,-0.78125 -0.3125,-0.96875 C 4.550781,-5.804688 4.113281,-5.9375 3.53125,-5.9375 c -0.53125,0 -0.929688,0.09375 -1.1875,0.28125 -0.25,0.1875 -0.4375,0.523438 -0.5625,1 L 0.671875,-4.8125 c 0.09375,-0.476562 0.253906,-0.863281 0.484375,-1.15625 0.238281,-0.289062 0.578125,-0.515625 1.015625,-0.671875 0.4375,-0.164063 0.945313,-0.25 1.53125,-0.25 0.570313,0 1.035156,0.070313 1.390625,0.203125 0.363281,0.136719 0.628906,0.308594 0.796875,0.515625 0.175781,0.210937 0.296875,0.46875 0.359375,0.78125 0.039062,0.1875 0.0625,0.539063 0.0625,1.046875 v 1.515625 c 0,1.0625 0.019531,1.734375 0.0625,2.015625 C 6.425781,-0.53125 6.523438,-0.257812 6.671875,0 h -1.1875 C 5.359375,-0.238281 5.28125,-0.515625 5.25,-0.828125 Z M 5.15625,-3.375 c -0.417969,0.167969 -1.039062,0.308594 -1.859375,0.421875 -0.46875,0.074219 -0.804687,0.152344 -1,0.234375 -0.199219,0.085938 -0.351563,0.210938 -0.453125,0.375 -0.105469,0.15625 -0.15625,0.335938 -0.15625,0.53125 0,0.3125 0.113281,0.574219 0.34375,0.78125 0.226562,0.199219 0.566406,0.296875 1.015625,0.296875 0.4375,0 0.828125,-0.09375 1.171875,-0.28125 0.34375,-0.195313 0.59375,-0.460937 0.75,-0.796875 0.125,-0.257812 0.1875,-0.640625 0.1875,-1.140625 z m 0,0" + id="path377" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-6"> + <path + style="stroke:none" + d="m 5.21875,0 v -0.84375 c -0.429688,0.667969 -1.054688,1 -1.875,1 -0.542969,0 -1.039062,-0.1484375 -1.484375,-0.4375 C 1.410156,-0.582031 1.0625,-1 0.8125,-1.53125 c -0.25,-0.53125 -0.375,-1.140625 -0.375,-1.828125 0,-0.675781 0.109375,-1.285156 0.328125,-1.828125 0.226563,-0.550781 0.566406,-0.972656 1.015625,-1.265625 0.445312,-0.289063 0.953125,-0.4375 1.515625,-0.4375 0.40625,0 0.765625,0.089844 1.078125,0.265625 0.3125,0.167969 0.566406,0.390625 0.765625,0.671875 v -3.34375 H 6.28125 V 0 Z M 1.609375,-3.359375 c 0,0.867187 0.179687,1.511719 0.546875,1.9375 0.363281,0.429687 0.796875,0.640625 1.296875,0.640625 0.5,0 0.921875,-0.203125 1.265625,-0.609375 C 5.070312,-1.804688 5.25,-2.429688 5.25,-3.265625 5.25,-4.179688 5.066406,-4.851562 4.703125,-5.28125 4.347656,-5.71875 3.910156,-5.9375 3.390625,-5.9375 c -0.5,0 -0.921875,0.210938 -1.265625,0.625 -0.34375,0.40625 -0.515625,1.058594 -0.515625,1.953125 z m 0,0" + id="path380" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-7"> + <path + style="stroke:none" + d="" + id="path383" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-8"> + <path + style="stroke:none" + d="M 0.96875,0 V -9.296875 H 2.8125 l 2.203125,6.578125 c 0.195313,0.617188 0.34375,1.074219 0.4375,1.375 0.113281,-0.332031 0.28125,-0.828125 0.5,-1.484375 l 2.21875,-6.46875 h 1.65625 V 0 h -1.1875 V -7.78125 L 5.953125,0 H 4.84375 L 2.15625,-7.90625 V 0 Z m 0,0" + id="path386" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-9"> + <path + style="stroke:none" + d="m 5.46875,-2.171875 1.171875,0.15625 c -0.1875,0.6875 -0.53125,1.226563 -1.03125,1.609375 -0.5,0.375 -1.140625,0.5625 -1.921875,0.5625 C 2.695312,0.15625 1.910156,-0.144531 1.328125,-0.75 0.753906,-1.363281 0.46875,-2.21875 0.46875,-3.3125 c 0,-1.132812 0.289062,-2.015625 0.875,-2.640625 0.582031,-0.625 1.34375,-0.9375 2.28125,-0.9375 0.894531,0 1.628906,0.308594 2.203125,0.921875 0.570313,0.617188 0.859375,1.480469 0.859375,2.59375 0,0.0625 -0.00781,0.164062 -0.015625,0.296875 H 1.65625 c 0.039062,0.742187 0.25,1.308594 0.625,1.703125 0.375,0.398438 0.84375,0.59375 1.40625,0.59375 0.414062,0 0.769531,-0.109375 1.0625,-0.328125 0.300781,-0.226563 0.539062,-0.582031 0.71875,-1.0625 z m -3.75,-1.84375 H 5.484375 C 5.429688,-4.578125 5.285156,-5 5.046875,-5.28125 4.679688,-5.726562 4.210938,-5.953125 3.640625,-5.953125 c -0.53125,0 -0.976563,0.179687 -1.328125,0.53125 -0.355469,0.355469 -0.554688,0.824219 -0.59375,1.40625 z m 0,0" + id="path389" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-10"> + <path + style="stroke:none" + d="M 0.828125,0 V -9.296875 H 1.96875 V 0 Z m 0,0" + id="path392" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-11"> + <path + style="stroke:none" + d="M 0.578125,-2.984375 1.75,-3.09375 c 0.050781,0.46875 0.175781,0.855469 0.375,1.15625 0.195312,0.292969 0.507812,0.53125 0.9375,0.71875 0.425781,0.1875 0.898438,0.28125 1.421875,0.28125 0.46875,0 0.878906,-0.066406 1.234375,-0.203125 0.363281,-0.144531 0.632812,-0.335937 0.8125,-0.578125 0.175781,-0.25 0.265625,-0.515625 0.265625,-0.796875 0,-0.289063 -0.085937,-0.546875 -0.25,-0.765625 C 6.378906,-3.5 6.097656,-3.679688 5.703125,-3.828125 5.453125,-3.929688 4.898438,-4.082031 4.046875,-4.28125 3.191406,-4.488281 2.59375,-4.6875 2.25,-4.875 1.8125,-5.101562 1.484375,-5.390625 1.265625,-5.734375 1.046875,-6.078125 0.9375,-6.460938 0.9375,-6.890625 c 0,-0.46875 0.128906,-0.90625 0.390625,-1.3125 C 1.597656,-8.609375 1.988281,-8.914062 2.5,-9.125 c 0.507812,-0.21875 1.078125,-0.328125 1.703125,-0.328125 0.695313,0 1.304687,0.117187 1.828125,0.34375 0.53125,0.21875 0.9375,0.542969 1.21875,0.96875 0.28125,0.429687 0.429688,0.917969 0.453125,1.46875 L 6.53125,-6.59375 C 6.457031,-7.175781 6.238281,-7.617188 5.875,-7.921875 5.507812,-8.222656 4.972656,-8.375 4.265625,-8.375 c -0.75,0 -1.296875,0.140625 -1.640625,0.421875 -0.335938,0.273437 -0.5,0.601563 -0.5,0.984375 0,0.335938 0.117188,0.605469 0.359375,0.8125 0.238281,0.21875 0.859375,0.445312 1.859375,0.671875 1,0.230469 1.679688,0.429687 2.046875,0.59375 0.539063,0.25 0.941406,0.570313 1.203125,0.953125 0.257812,0.375 0.390625,0.8125 0.390625,1.3125 0,0.492188 -0.148437,0.953125 -0.4375,1.390625 -0.28125,0.4375 -0.6875,0.78125 -1.21875,1.03125 -0.523437,0.2382812 -1.117187,0.359375 -1.78125,0.359375 -0.84375,0 -1.554687,-0.1210938 -2.125,-0.359375 C 1.859375,-0.453125 1.414062,-0.820312 1.09375,-1.3125 0.769531,-1.800781 0.597656,-2.359375 0.578125,-2.984375 Z m 0,0" + id="path395" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-12"> + <path + style="stroke:none" + d="M 5.265625,0 V -0.984375 C 4.742188,-0.222656 4.03125,0.15625 3.125,0.15625 2.726562,0.15625 2.359375,0.0820312 2.015625,-0.0625 1.671875,-0.21875 1.414062,-0.410156 1.25,-0.640625 1.082031,-0.878906 0.96875,-1.164062 0.90625,-1.5 0.851562,-1.71875 0.828125,-2.070312 0.828125,-2.5625 V -6.734375 H 1.96875 V -3 c 0,0.59375 0.023438,0.996094 0.078125,1.203125 0.070313,0.304687 0.222656,0.542969 0.453125,0.71875 0.226562,0.167969 0.515625,0.25 0.859375,0.25 0.34375,0 0.664063,-0.085937 0.96875,-0.265625 0.300781,-0.175781 0.507813,-0.414062 0.625,-0.71875 0.125,-0.300781 0.1875,-0.738281 0.1875,-1.3125 v -3.609375 h 1.15625 V 0 Z m 0,0" + id="path398" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-13"> + <path + style="stroke:none" + d="M 0.640625,0.5625 1.75,0.71875 c 0.050781,0.34375 0.179688,0.59375 0.390625,0.75 0.28125,0.207031 0.664063,0.3125 1.15625,0.3125 0.53125,0 0.9375,-0.105469 1.21875,-0.3125 C 4.804688,1.257812 5.003906,0.960938 5.109375,0.578125 5.171875,0.347656 5.195312,-0.132812 5.1875,-0.875 4.6875,-0.289062 4.066406,0 3.328125,0 2.398438,0 1.679688,-0.332031 1.171875,-1 c -0.5,-0.664062 -0.75,-1.46875 -0.75,-2.40625 0,-0.644531 0.113281,-1.238281 0.34375,-1.78125 0.226563,-0.539062 0.5625,-0.957031 1,-1.25 0.445313,-0.300781 0.96875,-0.453125 1.5625,-0.453125 0.800781,0 1.457031,0.324219 1.96875,0.96875 v -0.8125 h 1.0625 V -0.90625 C 6.359375,0.132812 6.25,0.875 6.03125,1.3125 5.820312,1.75 5.484375,2.09375 5.015625,2.34375 4.554688,2.601562 3.988281,2.734375 3.3125,2.734375 2.507812,2.734375 1.859375,2.550781 1.359375,2.1875 0.867188,1.820312 0.628906,1.28125 0.640625,0.5625 Z M 1.59375,-3.484375 c 0,0.886719 0.171875,1.53125 0.515625,1.9375 0.351563,0.40625 0.796875,0.609375 1.328125,0.609375 0.519531,0 0.957031,-0.203125 1.3125,-0.609375 0.351562,-0.40625 0.53125,-1.039063 0.53125,-1.90625 0,-0.820313 -0.183594,-1.441406 -0.546875,-1.859375 -0.367187,-0.414062 -0.804687,-0.625 -1.3125,-0.625 -0.511719,0 -0.945313,0.210938 -1.296875,0.625 -0.355469,0.40625 -0.53125,1.015625 -0.53125,1.828125 z m 0,0" + id="path401" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-14"> + <path + style="stroke:none" + d="m 3.34375,-1.015625 0.171875,1 C 3.191406,0.0546875 2.90625,0.09375 2.65625,0.09375 2.238281,0.09375 1.914062,0.03125 1.6875,-0.09375 1.457031,-0.226562 1.296875,-0.398438 1.203125,-0.609375 1.109375,-0.828125 1.0625,-1.28125 1.0625,-1.96875 v -3.875 H 0.234375 V -6.734375 H 1.0625 V -8.40625 l 1.140625,-0.671875 v 2.34375 H 3.34375 V -5.84375 H 2.203125 v 3.9375 c 0,0.324219 0.019531,0.53125 0.0625,0.625 0.039063,0.09375 0.101563,0.171875 0.1875,0.234375 0.09375,0.054687 0.222656,0.078125 0.390625,0.078125 0.125,0 0.289062,-0.015625 0.5,-0.046875 z m 0,0" + id="path404" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-15"> + <path + style="stroke:none" + d="m -0.015625,0 3.5625,-9.296875 H 4.875 L 8.671875,0 H 7.28125 L 6.1875,-2.8125 H 2.3125 L 1.28125,0 Z M 2.65625,-3.8125 H 5.8125 L 4.84375,-6.390625 C 4.550781,-7.171875 4.332031,-7.8125 4.1875,-8.3125 c -0.125,0.59375 -0.292969,1.183594 -0.5,1.765625 z m 0,0" + id="path407" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-16"> + <path + style="stroke:none" + d="m 5.25,-2.46875 1.125,0.140625 C 6.25,-1.546875 5.929688,-0.9375 5.421875,-0.5 4.921875,-0.0625 4.300781,0.15625 3.5625,0.15625 2.644531,0.15625 1.90625,-0.144531 1.34375,-0.75 0.78125,-1.351562 0.5,-2.21875 0.5,-3.34375 0.5,-4.070312 0.617188,-4.707031 0.859375,-5.25 c 0.25,-0.539062 0.617187,-0.945312 1.109375,-1.21875 0.488281,-0.28125 1.023438,-0.421875 1.609375,-0.421875 0.726563,0 1.320313,0.1875 1.78125,0.5625 0.46875,0.367187 0.769531,0.890625 0.90625,1.578125 L 5.15625,-4.578125 C 5.050781,-5.035156 4.863281,-5.378906 4.59375,-5.609375 4.320312,-5.835938 4,-5.953125 3.625,-5.953125 c -0.574219,0 -1.042969,0.210937 -1.40625,0.625 C 1.863281,-4.910156 1.6875,-4.257812 1.6875,-3.375 c 0,0.90625 0.171875,1.570312 0.515625,1.984375 C 2.546875,-0.984375 3,-0.78125 3.5625,-0.78125 c 0.445312,0 0.816406,-0.132812 1.109375,-0.40625 C 4.972656,-1.46875 5.164062,-1.894531 5.25,-2.46875 Z m 0,0" + id="path410" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-17"> + <path + style="stroke:none" + d="M 5.140625,2.578125 V -0.71875 c -0.179687,0.25 -0.429687,0.460938 -0.75,0.625 -0.3125,0.1640625 -0.648437,0.25 -1,0.25 -0.804687,0 -1.496094,-0.316406 -2.078125,-0.953125 C 0.738281,-1.441406 0.453125,-2.320312 0.453125,-3.4375 c 0,-0.664062 0.113281,-1.269531 0.34375,-1.8125 0.238281,-0.539062 0.582031,-0.945312 1.03125,-1.21875 0.445313,-0.28125 0.9375,-0.421875 1.46875,-0.421875 0.832031,0 1.488281,0.355469 1.96875,1.0625 v -0.90625 h 1.03125 v 9.3125 z M 1.625,-3.390625 c 0,0.875 0.179688,1.53125 0.546875,1.96875 0.363281,0.429687 0.800781,0.640625 1.3125,0.640625 0.476563,0 0.894531,-0.203125 1.25,-0.609375 0.351563,-0.414063 0.53125,-1.046875 0.53125,-1.890625 0,-0.894531 -0.1875,-1.566406 -0.5625,-2.015625 -0.367187,-0.457031 -0.796875,-0.6875 -1.296875,-0.6875 -0.5,0 -0.921875,0.214844 -1.265625,0.640625 C 1.796875,-4.925781 1.625,-4.273438 1.625,-3.390625 Z m 0,0" + id="path413" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-18"> + <path + style="stroke:none" + d="m 0.859375,-7.984375 v -1.3125 H 2 v 1.3125 z M 0.859375,0 V -6.734375 H 2 V 0 Z m 0,0" + id="path416" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-19"> + <path + style="stroke:none" + d="m 0.40625,-2.015625 1.125,-0.171875 c 0.0625,0.449219 0.234375,0.796875 0.515625,1.046875 0.289063,0.242187 0.695313,0.359375 1.21875,0.359375 0.53125,0 0.921875,-0.101562 1.171875,-0.3125 0.25,-0.21875 0.375,-0.472656 0.375,-0.765625 0,-0.257813 -0.109375,-0.460937 -0.328125,-0.609375 C 4.328125,-2.570312 3.9375,-2.703125 3.3125,-2.859375 2.476562,-3.066406 1.898438,-3.25 1.578125,-3.40625 1.253906,-3.5625 1.007812,-3.773438 0.84375,-4.046875 c -0.167969,-0.269531 -0.25,-0.566406 -0.25,-0.890625 0,-0.300781 0.066406,-0.578125 0.203125,-0.828125 0.132813,-0.257813 0.320313,-0.476563 0.5625,-0.65625 0.175781,-0.125 0.414063,-0.234375 0.71875,-0.328125 0.3125,-0.09375 0.640625,-0.140625 0.984375,-0.140625 0.53125,0 0.992188,0.078125 1.390625,0.234375 0.40625,0.15625 0.703125,0.367188 0.890625,0.625 0.1875,0.25 0.316406,0.59375 0.390625,1.03125 L 4.625,-4.84375 C 4.570312,-5.1875 4.421875,-5.457031 4.171875,-5.65625 3.929688,-5.851562 3.59375,-5.953125 3.15625,-5.953125 c -0.53125,0 -0.914062,0.089844 -1.140625,0.265625 -0.21875,0.179688 -0.328125,0.382812 -0.328125,0.609375 0,0.148437 0.046875,0.28125 0.140625,0.40625 0.09375,0.117187 0.238281,0.214844 0.4375,0.296875 0.113281,0.042969 0.453125,0.140625 1.015625,0.296875 0.800781,0.210937 1.363281,0.386719 1.6875,0.53125 0.320312,0.136719 0.570312,0.335937 0.75,0.59375 0.175781,0.261719 0.265625,0.585937 0.265625,0.96875 0,0.386719 -0.109375,0.746094 -0.328125,1.078125 C 5.4375,-0.570312 5.113281,-0.3125 4.6875,-0.125 4.269531,0.0625 3.800781,0.15625 3.28125,0.15625 c -0.875,0 -1.542969,-0.1796875 -2,-0.546875 -0.460938,-0.363281 -0.75,-0.90625 -0.875,-1.625 z m 0,0" + id="path419" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-20"> + <path + style="stroke:none" + d="m 0.859375,0 v -6.734375 h 1.03125 v 0.953125 c 0.488281,-0.738281 1.203125,-1.109375 2.140625,-1.109375 0.40625,0 0.773438,0.074219 1.109375,0.21875 0.34375,0.148437 0.597656,0.339844 0.765625,0.578125 0.164062,0.242188 0.285156,0.523438 0.359375,0.84375 0.039063,0.210938 0.0625,0.578125 0.0625,1.109375 V 0 H 5.1875 V -4.09375 C 5.1875,-4.5625 5.140625,-4.910156 5.046875,-5.140625 4.960938,-5.367188 4.804688,-5.550781 4.578125,-5.6875 4.347656,-5.820312 4.082031,-5.890625 3.78125,-5.890625 c -0.480469,0 -0.898438,0.15625 -1.25,0.46875 C 2.175781,-5.117188 2,-4.535156 2,-3.671875 V 0 Z m 0,0" + id="path422" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-21"> + <path + style="stroke:none" + d="m 0.625,-4.53125 c 0,-1.539062 0.410156,-2.742188 1.234375,-3.609375 0.832031,-0.875 1.90625,-1.3125 3.21875,-1.3125 0.851563,0 1.625,0.203125 2.3125,0.609375 0.695313,0.40625 1.222656,0.980469 1.578125,1.71875 0.363281,0.730469 0.546875,1.558594 0.546875,2.484375 0,0.949219 -0.195313,1.796875 -0.578125,2.546875 -0.375,0.742188 -0.914062,1.304688 -1.609375,1.6875 -0.699219,0.375 -1.449219,0.5625 -2.25,0.5625 -0.875,0 -1.664063,-0.2070312 -2.359375,-0.625 C 2.03125,-0.894531 1.507812,-1.472656 1.15625,-2.203125 0.800781,-2.929688 0.625,-3.707031 0.625,-4.53125 Z M 1.890625,-4.5 c 0,1.117188 0.300781,1.996094 0.90625,2.640625 0.601563,0.648437 1.359375,0.96875 2.265625,0.96875 0.925781,0 1.6875,-0.320313 2.28125,-0.96875 C 7.945312,-2.515625 8.25,-3.441406 8.25,-4.640625 8.25,-5.398438 8.117188,-6.0625 7.859375,-6.625 c -0.25,-0.5625 -0.625,-1 -1.125,-1.3125 -0.492187,-0.3125 -1.042969,-0.46875 -1.65625,-0.46875 -0.867187,0 -1.617187,0.304688 -2.25,0.90625 -0.625,0.59375 -0.9375,1.59375 -0.9375,3 z m 0,0" + id="path425" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-22"> + <path + style="stroke:none" + d="m 0.859375,2.578125 v -9.3125 h 1.03125 v 0.875 c 0.25,-0.34375 0.523437,-0.597656 0.828125,-0.765625 0.3125,-0.175781 0.6875,-0.265625 1.125,-0.265625 0.570312,0 1.078125,0.152344 1.515625,0.453125 0.445313,0.292969 0.78125,0.710938 1,1.25 0.226563,0.542969 0.34375,1.132812 0.34375,1.765625 0,0.6875 -0.125,1.308594 -0.375,1.859375 -0.25,0.554688 -0.609375,0.980469 -1.078125,1.28125 -0.46875,0.2890625 -0.964844,0.4375 -1.484375,0.4375 -0.375,0 -0.71875,-0.078125 -1.03125,-0.234375 C 2.429688,-0.242188 2.1875,-0.453125 2,-0.703125 v 3.28125 z m 1.03125,-5.90625 c 0,0.867187 0.171875,1.507813 0.515625,1.921875 0.351562,0.417969 0.78125,0.625 1.28125,0.625 0.507812,0 0.941406,-0.210938 1.296875,-0.640625 0.363281,-0.4375 0.546875,-1.101563 0.546875,-2 C 5.53125,-4.273438 5.351562,-4.914062 5,-5.34375 4.644531,-5.769531 4.222656,-5.984375 3.734375,-5.984375 c -0.480469,0 -0.90625,0.230469 -1.28125,0.6875 -0.375,0.449219 -0.5625,1.105469 -0.5625,1.96875 z m 0,0" + id="path428" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-23"> + <path + style="stroke:none" + d="M 0.859375,0 V -6.734375 H 1.875 v 0.953125 c 0.207031,-0.332031 0.488281,-0.597656 0.84375,-0.796875 0.351562,-0.207031 0.753906,-0.3125 1.203125,-0.3125 0.5,0 0.90625,0.105469 1.21875,0.3125 0.320313,0.210937 0.546875,0.5 0.671875,0.875 0.539062,-0.789063 1.238281,-1.1875 2.09375,-1.1875 0.664062,0 1.175781,0.1875 1.53125,0.5625 0.363281,0.367187 0.546875,0.933594 0.546875,1.703125 V 0 H 8.84375 v -4.234375 c 0,-0.457031 -0.039062,-0.785156 -0.109375,-0.984375 -0.074219,-0.207031 -0.210937,-0.367188 -0.40625,-0.484375 -0.1875,-0.125 -0.417969,-0.1875 -0.6875,-0.1875 -0.46875,0 -0.859375,0.15625 -1.171875,0.46875 C 6.15625,-5.109375 6,-4.601562 6,-3.90625 V 0 H 4.859375 v -4.375 c 0,-0.507812 -0.09375,-0.890625 -0.28125,-1.140625 -0.1875,-0.25 -0.492187,-0.375 -0.90625,-0.375 -0.324219,0 -0.625,0.085937 -0.90625,0.25 -0.273437,0.167969 -0.46875,0.417969 -0.59375,0.75 C 2.054688,-4.566406 2,-4.101562 2,-3.5 V 0 Z m 0,0" + id="path431" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-24"> + <path + style="stroke:none" + d="m 0,0.15625 2.6875,-9.609375 h 0.921875 l -2.6875,9.609375 z m 0,0" + id="path434" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-25"> + <path + style="stroke:none" + d="M 0.40625,-2.796875 V -3.9375 h 3.515625 v 1.140625 z m 0,0" + id="path437" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-26"> + <path + style="stroke:none" + d="m 1.90625,0 h -1.0625 v -9.296875 h 1.140625 v 3.3125 c 0.488281,-0.601563 1.101563,-0.90625 1.84375,-0.90625 0.414063,0 0.804687,0.085937 1.171875,0.25 0.375,0.167969 0.679688,0.402344 0.921875,0.703125 0.238281,0.304688 0.425781,0.667969 0.5625,1.09375 0.132813,0.429688 0.203125,0.886719 0.203125,1.375 0,1.15625 -0.289062,2.054688 -0.859375,2.6875 -0.5625,0.625 -1.246094,0.9375 -2.046875,0.9375 -0.792969,0 -1.417969,-0.332031 -1.875,-1 z M 1.890625,-3.421875 c 0,0.8125 0.109375,1.398437 0.328125,1.75 0.363281,0.59375 0.851562,0.890625 1.46875,0.890625 0.5,0 0.925781,-0.210938 1.28125,-0.640625 0.363281,-0.4375 0.546875,-1.085937 0.546875,-1.953125 0,-0.875 -0.179687,-1.519531 -0.53125,-1.9375 -0.34375,-0.425781 -0.761719,-0.640625 -1.25,-0.640625 -0.5,0 -0.933594,0.21875 -1.296875,0.65625 -0.367188,0.4375 -0.546875,1.0625 -0.546875,1.875 z m 0,0" + id="path440" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-27"> + <path + style="stroke:none" + d="m 1.171875,0 v -1.296875 h 1.3125 V 0 Z m 0,0" + id="path443" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-28"> + <path + style="stroke:none" + d="M 0.8125,2.59375 0.671875,1.515625 C 0.921875,1.585938 1.140625,1.625 1.328125,1.625 1.585938,1.625 1.789062,1.582031 1.9375,1.5 2.09375,1.414062 2.21875,1.296875 2.3125,1.140625 2.382812,1.023438 2.5,0.742188 2.65625,0.296875 2.675781,0.234375 2.710938,0.140625 2.765625,0.015625 l -2.5625,-6.75 H 1.4375 l 1.40625,3.90625 c 0.175781,0.492187 0.335938,1.007813 0.484375,1.546875 0.132813,-0.519531 0.289063,-1.03125 0.46875,-1.53125 l 1.4375,-3.921875 H 6.375 L 3.8125,0.109375 C 3.539062,0.847656 3.328125,1.359375 3.171875,1.640625 2.972656,2.015625 2.738281,2.289062 2.46875,2.46875 2.207031,2.644531 1.898438,2.734375 1.546875,2.734375 1.328125,2.734375 1.082031,2.6875 0.8125,2.59375 Z m 0,0" + id="path446" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-29"> + <path + style="stroke:none" + d="M 0.859375,0 V -9.296875 H 2 v 3.34375 c 0.53125,-0.625 1.203125,-0.9375 2.015625,-0.9375 0.5,0 0.929687,0.101563 1.296875,0.296875 0.363281,0.199219 0.625,0.476562 0.78125,0.828125 0.164062,0.34375 0.25,0.84375 0.25,1.5 V 0 H 5.203125 v -4.265625 c 0,-0.570313 -0.125,-0.988281 -0.375,-1.25 -0.25,-0.257813 -0.601563,-0.390625 -1.046875,-0.390625 -0.34375,0 -0.667969,0.089844 -0.96875,0.265625 -0.292969,0.179687 -0.5,0.417969 -0.625,0.71875 C 2.0625,-4.617188 2,-4.207031 2,-3.6875 V 0 Z m 0,0" + id="path449" /> + </symbol> + <symbol + overflow="visible" + id="glyph1-0"> + <path + style="stroke:none" + d="M 1.484375,0 V -7.4375 H 7.4375 V 0 Z m 0.1875,-0.1875 H 7.25 V -7.25 H 1.671875 Z m 0,0" + id="path452" /> + </symbol> + <symbol + overflow="visible" + id="glyph1-1"> + <path + style="stroke:none" + d="m 0.921875,0 v -8.515625 h 3.21875 c 0.5625,0 0.992187,0.027344 1.296875,0.078125 0.414062,0.0625 0.765625,0.195312 1.046875,0.390625 0.28125,0.199219 0.503906,0.476563 0.671875,0.828125 0.175781,0.355469 0.265625,0.742188 0.265625,1.15625 0,0.730469 -0.230469,1.34375 -0.6875,1.84375 -0.460937,0.5 -1.292969,0.75 -2.5,0.75 h -2.1875 V 0 Z m 1.125,-4.46875 H 4.25 c 0.726562,0 1.242188,-0.132812 1.546875,-0.40625 0.3125,-0.269531 0.46875,-0.648438 0.46875,-1.140625 0,-0.363281 -0.09375,-0.671875 -0.28125,-0.921875 -0.179687,-0.25 -0.414063,-0.414062 -0.703125,-0.5 -0.1875,-0.050781 -0.542969,-0.078125 -1.0625,-0.078125 H 2.046875 Z m 0,0" + id="path455" /> + </symbol> + <symbol + overflow="visible" + id="glyph1-2"> + <path + style="stroke:none" + d="M 0.765625,0 V -6.171875 H 1.71875 v 0.9375 C 1.957031,-5.671875 2.175781,-5.957031 2.375,-6.09375 2.582031,-6.238281 2.804688,-6.3125 3.046875,-6.3125 c 0.351563,0 0.710937,0.117188 1.078125,0.34375 L 3.765625,-5 C 3.515625,-5.15625 3.257812,-5.234375 3,-5.234375 c -0.230469,0 -0.4375,0.074219 -0.625,0.21875 -0.179688,0.136719 -0.304688,0.324219 -0.375,0.5625 -0.125,0.375 -0.1875,0.78125 -0.1875,1.21875 V 0 Z m 0,0" + id="path458" /> + </symbol> + <symbol + overflow="visible" + id="glyph1-3"> + <path + style="stroke:none" + d="M 0.796875,-7.3125 V -8.515625 H 1.84375 V -7.3125 Z m 0,7.3125 V -6.171875 H 1.84375 V 0 Z m 0,0" + id="path461" /> + </symbol> + <symbol + overflow="visible" + id="glyph1-4"> + <path + style="stroke:none" + d="m 0.390625,-3.09375 c 0,-1.132812 0.316406,-1.976562 0.953125,-2.53125 0.53125,-0.457031 1.179688,-0.6875 1.953125,-0.6875 0.84375,0 1.535156,0.28125 2.078125,0.84375 0.539062,0.554688 0.8125,1.320312 0.8125,2.296875 0,0.792969 -0.121094,1.417969 -0.359375,1.875 -0.242187,0.460937 -0.589844,0.8125 -1.046875,1.0625 -0.460938,0.25 -0.953125,0.375 -1.484375,0.375 C 2.429688,0.140625 1.726562,-0.132812 1.1875,-0.6875 0.65625,-1.238281 0.390625,-2.039062 0.390625,-3.09375 Z m 1.078125,0 c 0,0.792969 0.171875,1.386719 0.515625,1.78125 0.34375,0.398438 0.78125,0.59375 1.3125,0.59375 0.507813,0 0.9375,-0.195312 1.28125,-0.59375 0.351563,-0.394531 0.53125,-1 0.53125,-1.8125 0,-0.757812 -0.179687,-1.335938 -0.53125,-1.734375 -0.34375,-0.394531 -0.773437,-0.59375 -1.28125,-0.59375 -0.53125,0 -0.96875,0.199219 -1.3125,0.59375 C 1.640625,-4.460938 1.46875,-3.875 1.46875,-3.09375 Z m 0,0" + id="path464" /> + </symbol> + <symbol + overflow="visible" + id="glyph1-5"> + <path + style="stroke:none" + d="M 0.359375,-1.84375 1.40625,-2 c 0.050781,0.40625 0.207031,0.726562 0.46875,0.953125 0.269531,0.21875 0.644531,0.328125 1.125,0.328125 0.476562,0 0.832031,-0.097656 1.0625,-0.296875 0.238281,-0.195313 0.359375,-0.425781 0.359375,-0.6875 0,-0.238281 -0.105469,-0.425781 -0.3125,-0.5625 -0.148437,-0.09375 -0.5,-0.207031 -1.0625,-0.34375 -0.773437,-0.195313 -1.308594,-0.363281 -1.609375,-0.5 -0.292969,-0.144531 -0.515625,-0.34375 -0.671875,-0.59375 -0.148437,-0.25 -0.21875,-0.523437 -0.21875,-0.828125 0,-0.28125 0.0625,-0.535156 0.1875,-0.765625 0.125,-0.238281 0.296875,-0.4375 0.515625,-0.59375 0.15625,-0.113281 0.375,-0.210937 0.65625,-0.296875 0.28125,-0.082031 0.582031,-0.125 0.90625,-0.125 0.488281,0 0.914062,0.074219 1.28125,0.21875 0.363281,0.136719 0.628906,0.324219 0.796875,0.5625 0.175781,0.230469 0.300781,0.546875 0.375,0.953125 L 4.234375,-4.4375 c -0.042969,-0.320312 -0.179687,-0.570312 -0.40625,-0.75 -0.21875,-0.175781 -0.53125,-0.265625 -0.9375,-0.265625 -0.480469,0 -0.824219,0.085937 -1.03125,0.25 -0.210937,0.15625 -0.3125,0.339844 -0.3125,0.546875 0,0.136719 0.046875,0.257812 0.140625,0.359375 0.082031,0.117187 0.210938,0.210937 0.390625,0.28125 C 2.179688,-3.972656 2.488281,-3.882812 3,-3.75 c 0.738281,0.199219 1.253906,0.367188 1.546875,0.5 0.300781,0.125 0.535156,0.308594 0.703125,0.546875 0.164062,0.242187 0.25,0.539063 0.25,0.890625 0,0.34375 -0.105469,0.671875 -0.3125,0.984375 -0.199219,0.3125 -0.492188,0.554687 -0.875,0.71875 -0.386719,0.1640625 -0.824219,0.25 -1.3125,0.25 -0.804688,0 -1.414062,-0.1640625 -1.828125,-0.5 -0.417969,-0.332031 -0.6875,-0.828125 -0.8125,-1.484375 z m 0,0" + id="path467" /> + </symbol> + <symbol + overflow="visible" + id="glyph1-6"> + <path + style="stroke:none" + d="m 0.953125,0 v -8.515625 h 1.125 v 3.5 h 4.4375 v -3.5 h 1.125 V 0 h -1.125 v -4.015625 h -4.4375 V 0 Z m 0,0" + id="path470" /> + </symbol> + <symbol + overflow="visible" + id="glyph1-7"> + <path + style="stroke:none" + d="M 0.734375,2.375 0.625,1.390625 c 0.226562,0.0625 0.425781,0.09375 0.59375,0.09375 0.226562,0 0.410156,-0.042969 0.546875,-0.125 C 1.910156,1.285156 2.03125,1.179688 2.125,1.046875 2.1875,0.941406 2.289062,0.679688 2.4375,0.265625 2.457031,0.210938 2.488281,0.128906 2.53125,0.015625 l -2.34375,-6.1875 h 1.125 l 1.296875,3.578125 c 0.164063,0.449219 0.3125,0.921875 0.4375,1.421875 0.125,-0.476563 0.269531,-0.945313 0.4375,-1.40625 l 1.3125,-3.59375 H 5.84375 L 3.5,0.109375 C 3.25,0.785156 3.050781,1.25 2.90625,1.5 2.726562,1.84375 2.515625,2.09375 2.265625,2.25 2.023438,2.414062 1.738281,2.5 1.40625,2.5 1.207031,2.5 0.984375,2.457031 0.734375,2.375 Z m 0,0" + id="path473" /> + </symbol> + <symbol + overflow="visible" + id="glyph1-8"> + <path + style="stroke:none" + d="m 0.78125,2.359375 v -8.53125 H 1.734375 V -5.375 C 1.960938,-5.6875 2.21875,-5.921875 2.5,-6.078125 2.78125,-6.234375 3.125,-6.3125 3.53125,-6.3125 c 0.519531,0 0.984375,0.136719 1.390625,0.40625 0.40625,0.273438 0.707031,0.65625 0.90625,1.15625 0.207031,0.492188 0.3125,1.027344 0.3125,1.609375 0,0.636719 -0.117187,1.210937 -0.34375,1.71875 -0.21875,0.5 -0.546875,0.886719 -0.984375,1.15625 -0.429688,0.26953125 -0.882812,0.40625 -1.359375,0.40625 -0.34375,0 -0.65625,-0.0742188 -0.9375,-0.21875 -0.28125,-0.144531 -0.511719,-0.332031 -0.6875,-0.5625 v 3 z m 0.953125,-5.40625 c 0,0.792969 0.160156,1.382813 0.484375,1.765625 0.320312,0.375 0.710938,0.5625 1.171875,0.5625 0.457031,0 0.851563,-0.195312 1.1875,-0.59375 0.332031,-0.394531 0.5,-1.003906 0.5,-1.828125 0,-0.78125 -0.164063,-1.367187 -0.484375,-1.765625 C 4.269531,-5.300781 3.882812,-5.5 3.4375,-5.5 2.988281,-5.5 2.59375,-5.289062 2.25,-4.875 1.90625,-4.457031 1.734375,-3.847656 1.734375,-3.046875 Z m 0,0" + id="path476" /> + </symbol> + <symbol + overflow="visible" + id="glyph1-9"> + <path + style="stroke:none" + d="m 5.015625,-1.984375 1.078125,0.125 C 5.925781,-1.222656 5.609375,-0.726562 5.140625,-0.375 4.679688,-0.03125 4.09375,0.140625 3.375,0.140625 2.46875,0.140625 1.75,-0.132812 1.21875,-0.6875 0.695312,-1.25 0.4375,-2.03125 0.4375,-3.03125 c 0,-1.039062 0.265625,-1.847656 0.796875,-2.421875 C 1.773438,-6.023438 2.46875,-6.3125 3.3125,-6.3125 c 0.832031,0 1.507812,0.28125 2.03125,0.84375 0.519531,0.5625 0.78125,1.355469 0.78125,2.375 0,0.0625 0,0.15625 0,0.28125 H 1.515625 C 1.554688,-2.132812 1.75,-1.613281 2.09375,-1.25 c 0.34375,0.355469 0.773438,0.53125 1.296875,0.53125 0.375,0 0.695313,-0.097656 0.96875,-0.296875 0.269531,-0.207031 0.488281,-0.53125 0.65625,-0.96875 z M 1.578125,-3.6875 h 3.4375 C 4.972656,-4.195312 4.84375,-4.582031 4.625,-4.84375 4.289062,-5.25 3.859375,-5.453125 3.328125,-5.453125 c -0.480469,0 -0.886719,0.164063 -1.21875,0.484375 -0.324219,0.324219 -0.5,0.75 -0.53125,1.28125 z m 0,0" + id="path479" /> + </symbol> + </g> + <clipPath + id="clip1"> + <path + d="M 0,0 H 601.94141 V 290.05078 H 0 Z m 0,0" + id="path484" /> + </clipPath> + <clipPath + id="clip2"> + <path + d="m 258,257 h 59 v 31.96875 h -59 z m 0,0" + id="path487" /> + </clipPath> + <clipPath + id="clip3"> + <path + d="m 314,257 h 59 v 31.96875 h -59 z m 0,0" + id="path490" /> + </clipPath> + <clipPath + id="clip4"> + <path + d="m 529,162 h 72.94141 v 43 H 529 Z m 0,0" + id="path493" /> + </clipPath> + <clipPath + id="clip5"> + <path + d="m 529,202 h 72.94141 v 43 H 529 Z m 0,0" + id="path496" /> + </clipPath> + <image + id="image69049" + width="60" + height="56" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA4CAAAAACEBsS4AAAAAmJLR0QA/4ePzL8AAAPgSURBVEiJvZddTJZlGMf/PLwvsgQlCHMaI4xyBYMUSxdNLeHgreY8ybXqoI/ZScVWzQOnba2I6qBlWm2uxlbJUrdoszkB5wFhZc0Q7AuFEA1F4iOSZXz/Ongenve+X94vOug6uv//6/o99/3cz/3xvtL/GDVXvs/7r2zeNDzpq0C0krS8mR6iwtc5Uo6vnDn57O2nx7q6R7/ZHA3ul/RnzHE5VcN4Ub/A8NdvDkqSRiEkSVq7NTeSzWkEht5YX1QH7A/71fBTmST9CqWSFn0I51Nt9qZu4GyhpNQ2YJufaAUmXw1KxyFXqrwAUGD3+wvQer07TuCiP/B9ALSVaD8TKZmu6kgx2YzvgJEVnhrA+CrBbacBJna9w4WKHoD+l7NMNq0JYMusbAIOGOl76sbdiZwBTj6eZr/wboDPfPk20G+NbMnOiwCMf7JGEVE+DYwu9/VOgGKrpPA9AE7cF8mmdwDsCBsvAFSFdUroyMzsEvj52UwLfgtgMCNsPAdQN6syqjoB2o9wqRZg9IOicOmaKYBdxtO2AzR74sEh3C9dy7BCvVgPVgvAyGIDfgWg00yfWS01wAItrgVgmZfcAMCb5nvsA7jsiQaYrE6T1A43SwpdgqsLveQxAG4z4UaAc55YWfd5mSTpDyiXpNz3v3jAy60F4FtrBs+ZPc9GcAYe8ZW7n92J+tgsSy+QpOEIeGmKtMxXjiSVPCRJkwfNsuKAJA1GwFmSwp/YkaQnJEkt1hFxp6LBnZdFva8CkpytkqQvrbJVkqSBCHjsjrs7frecje6au8UyWwF4TfHCkeRO39nfTD+jRJLUGxeWFBwEYK9lbnJHsypRz5XuQXzM8sslSdd+jAsHpE1u6+mHTf9eSdIPU4ngdW4r2iF/Mi4rR8HVsbMJ4IBK0yVJL7aZds26ZGDvxGBqkWWeirJT5objvXL7VdPNchfngbn1EbB7QH5luZWpkjRzKCHsXnYtlutehM19CWDJvQeWm1ZKHwDPJGQzAbC3nnuwTOTEQPxwbpAknbHMRyVJnw4l7PkuAHabVuoVgOlbE7JOtiSpy/QqbpSkQ51RyiPgcUmSdTo8JUnUJGSlIgDM9V0wBXA4CVZLAMg3nD0A02XJwKnTAMbPouy/58xg7BgAyA7r1wG6F8YGzPgaYKkv8/8BqEiO1Q6Alb48CFCbJKtigPtn1UaArqx4gBXngZe8dm4v0Lcibr0Ve4DjbtNpAv4qTZ5V4RhMZEtS8CNgbMM8WKkaaAxIuc3ASGherAL1wKl3j14D2hPvpYgI7p10r6aB56P+bYgV3o/Lwsduzx/paTg6Ma9O/wXNplI0oH+TPgAAAABJRU5ErkJggg==" /> + <mask + id="mask0"> + <use + xlink:href="#image69049" + id="use500" /> + </mask> + <image + id="image69048" + width="60" + height="56" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA4CAIAAAAuDwwzAAAABmJLR0QA/wD/AP+gvaeTAAAAIUlEQVRoge3BMQEAAADCoPVPbQlPoAAAAAAAAAAAAICXASeYAAHo8ixnAAAAAElFTkSuQmCC" /> + <image + id="image69055" + width="434" + height="84" + xlink:href="data:image/png;base64,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" /> + <mask + id="mask1"> + <use + xlink:href="#image69055" + id="use505" /> + </mask> + <image + id="image69054" + width="434" + height="84" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAbIAAABUCAIAAABoeyVgAAAABmJLR0QA/wD/AP+gvaeTAAAAgUlEQVR4nO3BMQEAAADCoPVPbQdvoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+A6ubAAGkC+bNAAAAAElFTkSuQmCC" /> + <image + id="image69061" + width="262" + height="74" + xlink:href="data:image/png;base64,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" /> + <mask + id="mask2"> + <use + xlink:href="#image69061" + id="use510" /> + </mask> + <image + id="image69060" + width="262" + height="74" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQYAAABKCAIAAADWum3IAAAABmJLR0QA/wD/AP+gvaeTAAAAT0lEQVR4nO3BAQ0AAADCoPdPbQ43oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+DXjfgABR7xffwAAAABJRU5ErkJggg==" /> + <image + id="image69067" + width="34" + height="48" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAAwCAAAAABRMveOAAAAAmJLR0QA/4ePzL8AAAKqSURBVDiNfZRdaJZlGMd/7/sWuhlbSrXQGTRTNyfOycKjcIGxGIZH0ZkHebKW4Ece6BACP0AUFF3RwaAIsaycjfW5DA3RyBkK+XEiKKvEcN/q2trXz4Pn2Z77fSZdR/f1v3/Pdf2f637uJwcAufLVuV7+J0o++Vft+eLplF62eUdVtKofUP9TrzybR6x9qCOVAK+NOLFvUe5T9caTIfK36iZg4aD9dUC96lsBUanqO2RpKaKxA5gN8GqArAHgEqzTrwFoUv0uQE6oDuSg0wclALSpngqQu6rfAHoUgKJh1QMJUa7qNsjCBwCsnw3we4LUAvAL4OVI6VB9OCdlpT8LuBOA+ROqH6ettAPcnw/AdlVfSVvZChDP8w/VW5kEaVC1OhGqVN2dnkpfNhH2qro4baUtEG6o/hYIkZUtAFGligqAcLTJVOJoUrUibaU3sP+z6s2AiKxE55sFeGI1QHjKS59P+mQBqp4C+HWGlbMJUg7AxTTSezVBSgC6u9LIORPkOYA/Z1iJ+kTIOEB3gLxO4jZCbgNMJsSs9wB6rgXIreluUTQvDKxEMXdIHX1mKm3UqUuWxOH4SwbI7ZmIkOV5yIJudfQNgLJzEeC9TB7Cih517PzBfacntF3Vr0hF2WeT8dODG9ap+u7UVlJtUU3lstK+v858O/RRA0DZ7XSZILpUL02n2ZnEqhcAvgyluhOdJ+uD/Jjqg/CH9b7qZM10Xjqavi/V46rumhZaVLuLEyJblwMgNyXUbgTG3hwMqhyPplEbpwU3Vd/O89+q6k9xlcznqvvzX3GbOnwkbp05otqaOp2Ven1WvC5uU/2hMJ8gc1q/XwJQ0Nilju9M1QDmnNexC4eaf+xRPfPyDAAo/nAoPuTh9rWP2c8AzFv/0ouF/9y53jH0uBKPAOB/qpReYq3OAAAAAElFTkSuQmCC" /> + <mask + id="mask3"> + <use + xlink:href="#image69067" + id="use515" /> + </mask> + <image + id="image69066" + width="34" + height="48" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAAwCAIAAAD7Oz8FAAAABmJLR0QA/wD/AP+gvaeTAAAAHElEQVRYhe3BgQAAAADDoPlTX+EAVQEAAAAArwETUAABpThf7wAAAABJRU5ErkJggg==" /> + <clipPath + id="clip6"> + <path + d="m 372.42187,208.87891 h 23.82032 v 23.8125 h -23.82032 z m 0,0" + id="path519" /> + </clipPath> + <image + id="image69073" + width="752" + height="752" + xlink:href="data:image/png;base64,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" /> + <mask + id="mask4"> + <use + xlink:href="#image69073" + id="use523" /> + </mask> + <image + id="image69072" + width="752" + height="752" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAvAAAALwCAIAAAB+xNYtAAAABmJLR0QA/wD/AP+gvaeTAAAGhElEQVR4nO3BMQEAAADCoPVPbQ0PoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODHAOdnAAEk0J4tAAAAAElFTkSuQmCC" /> + <clipPath + id="clip7"> + <path + d="m 55.214844,208.87891 h 28.148437 v 27.77343 H 55.214844 Z m 0,0" + id="path527" /> + </clipPath> + <image + id="image69079" + width="752" + height="752" + xlink:href="data:image/png;base64,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" /> + <mask + id="mask5"> + <use + xlink:href="#image69079" + id="use531" /> + </mask> + <image + id="image69078" + width="752" + height="752" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAvAAAALwCAIAAAB+xNYtAAAABmJLR0QA/wD/AP+gvaeTAAAGhElEQVR4nO3BMQEAAADCoPVPbQ0PoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODHAOdnAAEk0J4tAAAAAElFTkSuQmCC" /> + <image + id="image69083" + width="267" + height="189" + xlink:href="data:image/png;base64,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" /> + </defs> + <g + id="surface69043"> + <rect + x="0" + y="0" + width="602" + height="291" + style="fill:#ffffff;fill-opacity:1;stroke:none" + id="rect538" /> + <g + clip-path="url(#clip1)" + clip-rule="nonzero" + id="g542"> + <path + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="M 0,0 H 601.94141 V 290.05078 H 0 Z m 0,0" + id="path540" /> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" + d="m 187.99928,188.00165 h 31.63243" + transform="matrix(1.082626,0,0,1.082281,0.541313,0.5411)" + id="path544" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="m 244.00391,204.01172 -7.58204,3.78515 1.89844,-3.78515 -1.89844,-3.78906 z m 0,0" + id="path546" /> + <path + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" + d="m 224.88153,188.00165 -6.99976,3.49739 1.74994,-3.49739 -1.74994,-3.50099 z m 0,0" + transform="matrix(1.082626,0,0,1.082281,0.541313,0.5411)" + id="path548" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="m 95.269531,204.01172 v 3.24609 H 94.1875 v -3.24609 z m 0,6.49219 V 213.75 H 94.1875 v -3.24609 z m 0,6.49218 v 3.2461 H 94.1875 v -3.2461 z m 0,6.4961 v 3.24609 H 94.1875 v -3.24609 z m 0,6.49218 v 3.2461 H 94.1875 v -3.2461 z m 0,6.49219 v 3.25 H 94.1875 v -3.25 z m 0,6.4961 v 3.24609 H 94.1875 v -3.24609 z m 0,6.49218 v 3.2461 H 94.1875 v -3.2461 z m 0,6.4961 v 1.08203 H 94.730469 V 256.5 h 2.164062 v 1.08203 H 94.1875 v -1.62109 z M 100.14453,256.5 h 3.2461 v 1.08203 h -3.2461 z m 6.49219,0 h 3.25 v 1.08203 h -3.25 z m 6.49609,0 h 3.25 v 1.08203 h -3.25 z m 6.4961,0 h 3.25 v 1.08203 h -3.25 z m 6.49609,0 h 3.25 v 1.08203 h -3.25 z m 6.49609,0 h 3.25 v 1.08203 h -3.25 z m 6.4961,0 h 3.25 v 1.08203 h -3.25 z m 6.49609,0 h 3.24609 v 1.08203 h -3.24609 z m 6.49609,0 h 3.2461 v 1.08203 h -3.2461 z m 6.4961,0 h 3.24609 v 1.08203 h -3.24609 z m 6.49609,0 h 3.2461 v 1.08203 h -3.2461 z m 6.4961,0 h 3.24609 v 1.08203 h -3.24609 z m 6.49609,0 h 3.24609 v 1.08203 h -3.24609 z m 6.49219,0 h 3.25 v 1.08203 h -3.25 z m 6.49609,0 h 3.25 v 1.08203 h -3.25 z m 6.49609,0 h 3.25 v 1.08203 h -3.25 z m 6.4961,0 h 3.25 v 1.08203 h -3.25 z m 6.49609,0 h 3.25 v 1.08203 h -3.25 z m 6.4961,0 h 3.24609 v 1.08203 h -3.24609 z m 6.49609,0 h 3.24609 v 1.08203 h -3.24609 z m 6.49609,0 h 3.2461 v 1.08203 h -3.2461 z m 6.4961,0 h 2.16406 v 0.54297 h -0.54297 v -1.08203 h 1.08594 v 1.62109 h -2.70703 z m 1.62109,-3.78906 v -3.2461 h 1.08594 v 3.2461 z m 0,-6.49219 v -3.24609 h 1.08594 v 3.24609 z m 0,-6.49219 v -3.25 h 1.08594 v 3.25 z m 0,-6.49609 v -3.2461 h 1.08594 v 3.2461 z m 0,-6.49219 v -3.24609 h 1.08594 v 3.24609 z m 0,-6.49609 v -3.2461 h 1.08594 v 3.2461 z m 0,0" + id="path550" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" + d="m 219.99974,194.11938 3.49988,7.00199 -3.49988,-1.7505 -3.49988,1.7505 z m 0,0" + transform="matrix(1.082626,0,0,1.082281,0.541313,0.5411)" + id="path552" /> + <path + style="fill:#fff0cc;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="m 116.70703,181.28125 h 80.54688 c 0.44921,0 0.89062,0.043 1.33203,0.13281 0.4375,0.0859 0.86328,0.21485 1.27734,0.38672 0.41406,0.17188 0.80859,0.38281 1.17969,0.62891 0.375,0.25 0.71875,0.53125 1.03515,0.84765 0.31641,0.31641 0.59766,0.66407 0.84766,1.03516 0.25,0.37109 0.45703,0.76562 0.62891,1.17969 0.17187,0.41406 0.30078,0.83984 0.39062,1.27734 0.0859,0.44141 0.12891,0.88281 0.12891,1.33203 v 31.81641 c 0,0.44922 -0.043,0.89062 -0.12891,1.33203 -0.0898,0.4375 -0.21875,0.86328 -0.39062,1.27734 -0.17188,0.41407 -0.37891,0.8086 -0.62891,1.17969 -0.25,0.37109 -0.53125,0.71875 -0.84766,1.03516 -0.3164,0.3164 -0.66015,0.59765 -1.03515,0.84765 -0.3711,0.2461 -0.76563,0.45703 -1.17969,0.62891 -0.41406,0.17187 -0.83984,0.30078 -1.27734,0.38672 -0.44141,0.0898 -0.88282,0.13281 -1.33203,0.13281 h -80.54688 c -0.44922,0 -0.89062,-0.043 -1.33203,-0.13281 -0.4375,-0.0859 -0.86328,-0.21485 -1.27734,-0.38672 -0.41407,-0.17188 -0.8086,-0.38281 -1.17969,-0.62891 -0.37109,-0.25 -0.71875,-0.53125 -1.03516,-0.84765 -0.3164,-0.31641 -0.59765,-0.66407 -0.84765,-1.03516 -0.2461,-0.37109 -0.45703,-0.76562 -0.62891,-1.17969 -0.17187,-0.41406 -0.30078,-0.83984 -0.38672,-1.27734 -0.0898,-0.44141 -0.13281,-0.88281 -0.13281,-1.33203 v -31.81641 c 0,-0.44922 0.043,-0.89062 0.13281,-1.33203 0.0859,-0.4375 0.21485,-0.86328 0.38672,-1.27734 0.17188,-0.41407 0.38281,-0.8086 0.62891,-1.17969 0.25,-0.37109 0.53125,-0.71875 0.84765,-1.03516 0.31641,-0.3164 0.66407,-0.59765 1.03516,-0.84765 0.37109,-0.2461 0.76562,-0.45703 1.17969,-0.62891 0.41406,-0.17187 0.83984,-0.30078 1.27734,-0.38672 0.44141,-0.0898 0.88281,-0.13281 1.33203,-0.13281 z m 0,0" + id="path554" /> + <path + style="fill:none;stroke:#d4b554;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1" + d="m 107.29995,166.99928 h 74.39954 c 0.41494,0 0.82265,0.0397 1.23037,0.12272 0.40411,0.0794 0.7974,0.19851 1.17986,0.35732 0.38246,0.1588 0.74688,0.3537 1.08965,0.58109 0.34638,0.23099 0.6639,0.49086 0.95616,0.78321 0.29225,0.29235 0.55204,0.61358 0.78296,0.95646 0.23092,0.34288 0.42215,0.70742 0.58091,1.09 0.15875,0.38258 0.27782,0.77599 0.36081,1.18023 0.0794,0.40785 0.11907,0.8157 0.11907,1.23077 v 29.39754 c 0,0.41507 -0.0397,0.82292 -0.11907,1.23077 -0.083,0.40423 -0.20206,0.79765 -0.36081,1.18023 -0.15876,0.38258 -0.34999,0.74712 -0.58091,1.09 -0.23092,0.34288 -0.49071,0.66411 -0.78296,0.95646 -0.29226,0.29235 -0.60978,0.55222 -0.95616,0.78321 -0.34277,0.22738 -0.70719,0.42229 -1.08965,0.58109 -0.38246,0.15881 -0.77575,0.27792 -1.17986,0.35732 -0.40772,0.083 -0.81543,0.12272 -1.23037,0.12272 h -74.39954 c -0.41493,0 -0.82265,-0.0397 -1.23037,-0.12272 -0.40411,-0.0794 -0.79739,-0.19851 -1.17985,-0.35732 -0.38247,-0.1588 -0.74689,-0.35371 -1.08966,-0.58109 -0.34277,-0.23099 -0.66389,-0.49086 -0.95615,-0.78321 -0.29226,-0.29235 -0.55204,-0.61358 -0.78296,-0.95646 -0.22732,-0.34288 -0.42216,-0.70742 -0.58091,-1.09 -0.15876,-0.38258 -0.27783,-0.776 -0.36082,-1.18023 -0.0794,-0.40785 -0.11906,-0.8157 -0.11906,-1.23077 v -29.39754 c 0,-0.41507 0.0397,-0.82292 0.11906,-1.23077 0.083,-0.40424 0.20206,-0.79765 0.36082,-1.18023 0.15875,-0.38258 0.35359,-0.74712 0.58091,-1.09 0.23092,-0.34288 0.4907,-0.66411 0.78296,-0.95646 0.29226,-0.29235 0.61338,-0.55222 0.95615,-0.78321 0.34277,-0.22739 0.70719,-0.42229 1.08966,-0.58109 0.38246,-0.15881 0.77574,-0.27792 1.17985,-0.35732 0.40772,-0.083 0.81544,-0.12272 1.23037,-0.12272 z m 0,0" + transform="matrix(1.082626,0,0,1.082281,0.541313,0.5411)" + id="path556" /> + <g + style="fill:#000000;fill-opacity:1" + id="g560"> + <use + xlink:href="#glyph0-1" + x="113.11753" + y="207.79796" + id="use558" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g564"> + <use + xlink:href="#glyph0-2" + x="121.05274" + y="207.79796" + id="use562" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g570"> + <use + xlink:href="#glyph0-3" + x="128.27863" + y="207.79796" + id="use566" /> + <use + xlink:href="#glyph0-4" + x="132.6048" + y="207.79796" + id="use568" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g574"> + <use + xlink:href="#glyph0-5" + x="141.98726" + y="207.79796" + id="use572" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g580"> + <use + xlink:href="#glyph0-3" + x="149.21315" + y="207.79796" + id="use576" /> + <use + xlink:href="#glyph0-6" + x="153.53932" + y="207.79796" + id="use578" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g584"> + <use + xlink:href="#glyph0-7" + x="160.7652" + y="207.79796" + id="use582" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g590"> + <use + xlink:href="#glyph0-8" + x="164.37424" + y="207.79796" + id="use586" /> + <use + xlink:href="#glyph0-2" + x="175.19617" + y="207.79796" + id="use588" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g594"> + <use + xlink:href="#glyph0-6" + x="182.42204" + y="207.79796" + id="use592" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g598"> + <use + xlink:href="#glyph0-9" + x="189.64793" + y="207.79796" + id="use596" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g602"> + <use + xlink:href="#glyph0-10" + x="196.87381" + y="207.79796" + id="use600" /> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" + d="m 333.99845,188.00165 h 38.6322" + transform="matrix(1.082626,0,0,1.082281,0.541313,0.5411)" + id="path604" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" + d="m 377.88047,188.00165 -6.99977,3.49739 1.74995,-3.49739 -1.74995,-3.50099 z m 0,0" + transform="matrix(1.082626,0,0,1.082281,0.541313,0.5411)" + id="path606" /> + <path + style="fill:none;stroke:#fff0cc;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1" + d="m 248.6699,168.46826 v 0 m 0,0 v 0 m -0.25979,6.39202 c 0.71081,-3.73199 5.83073,-3.9702 5.89929,-6.78904 m -5.89929,6.78904 c 1.23038,-2.73944 3.22928,-3.51182 5.89929,-6.78904 m -5.50961,12.43756 c 0.58091,-7.50008 4.36944,-5.91921 11.15993,-12.82737 m -11.15993,12.82737 c 4.25037,-2.05729 5.6395,-6.59054 11.15993,-12.82737 m -11.41971,19.2194 c 6.68946,-6.52197 14.76084,-9.91107 16.39893,-18.86208 m -16.39893,18.86208 c 6.05082,-5.30925 10.93983,-9.62955 16.39893,-18.86208 m -16.65872,25.26132 c 5.43023,-4.89057 14.16911,-15.49101 21.64875,-24.90039 m -21.64875,24.90039 c 6.75802,-6.28014 11.62899,-12.75879 21.64875,-24.90039 m -21.24825,30.54169 c 8.24096,-10.28283 13.19853,-15.31055 26.88775,-30.94232 m -26.88775,30.94232 c 9.47855,-8.65143 17.16025,-19.43234 26.88775,-30.94232 m -26.49807,36.59083 c 6.85905,-7.22938 11.13828,-12.95008 31.48811,-36.2299 m -31.48811,36.2299 c 10.60067,-16.71816 24.23939,-29.17016 31.48811,-36.2299 m -29.77786,40.35891 c 9.6806,-9.96881 19.79779,-25.75939 35.42097,-40.74871 m -35.42097,40.74871 c 13.10832,-14.37935 24.92854,-28.70817 35.42097,-40.74871 m -30.44175,41.10964 c 13.68922,-14.18806 25.32903,-29.92089 35.43178,-40.74872 m -35.43178,40.74872 c 12.36143,-14.80885 23.78115,-30.27099 35.43178,-40.74872 m -29.78146,40.35892 c 11.03004,-8.56842 23.95073,-27.75894 35.42096,-40.75955 m -35.42096,40.75955 c 11.13828,-15.58846 23.81002,-28.05851 35.42096,-40.75955 m -30.44175,41.12048 c 12.04032,-11.86008 22.02039,-23.81039 35.43179,-40.75955 m -35.43179,40.75955 c 13.60985,-15.81224 25.89191,-29.32175 35.43179,-40.75955 m -29.78146,40.35892 c 10.16048,-10.06988 22.1611,-18.62025 35.42096,-40.74872 m -35.42096,40.74872 c 5.56012,-10.56074 15.38865,-17.99946 35.42096,-40.74872 m -30.44175,41.10965 c 6.40081,-10.18177 24.48113,-27.41967 35.43179,-40.75233 m -35.43179,40.75233 c 10.52129,-12.83098 22.04203,-24.95092 35.43179,-40.75233 m -29.78147,40.36252 c 7.58067,-12.56027 20.10087,-20.30217 34.7715,-40.00159 m -34.7715,40.00159 c 8.98063,-9.01236 17.319,-17.77207 34.7715,-40.00159 m -29.79228,40.35891 c 6.00031,-11.79872 13.25264,-16.68929 35.43178,-40.75954 m -35.43178,40.75954 c 8.54043,-13.24965 18.4303,-20.76055 35.43178,-40.75954 m -30.44175,41.12047 c 9.66256,-8.31938 19.64263,-23.38089 35.43179,-40.75955 m -35.43179,40.75955 c 12.6104,-13.05836 22.94046,-29.71877 35.43179,-40.75955 m -29.78868,40.35892 c 10.0378,-8.46736 24.5569,-24.14966 34.11843,-39.24004 m -34.11843,39.24004 c 7.80798,-9.10981 12.97843,-16.8481 34.11843,-39.24004 m -29.12839,39.60097 c 12.39751,-9.20005 20.15859,-20.96989 30.83864,-35.46835 m -30.83864,35.46835 c 10.6584,-15.98909 24.03011,-26.54983 30.83864,-35.46835 m -25.19914,35.07855 c 3.71997,-7.83935 17.51023,-15.98909 25.58882,-29.43003 m -25.58882,29.43003 c 9.88987,-7.78882 17.95042,-18.75019 25.58882,-29.43003 m -20.59879,29.79095 c 3.92925,-8.9907 5.50961,-12.78044 20.339,-23.40254 m -20.339,23.40254 c 3.46019,-6.86123 9.55793,-12.15965 20.339,-23.40254 m -14.6995,23.00191 c 0.53761,-5.42113 2.74939,-3.99907 14.43972,-16.59905 m -14.43972,16.59905 c 4.7483,-5.29119 11.19962,-12.02971 14.43972,-16.59905 m -9.44968,16.95998 c 0.53039,-3.27 7.8585,-7.31239 9.18989,-10.56074 m -9.18989,10.56074 c 3.86069,-3.57318 4.12048,-7.5109 9.18989,-10.56074 m -4.86014,11.67962 c 2.89011,-1.12971 3.6406,-3.01014 5.24982,-6.04193 m -5.24982,6.04193 c 1.46129,-1.69997 3.3303,-2.85133 5.24982,-6.04193" + transform="matrix(1.082626,0,0,1.082281,0.541313,0.5411)" + id="path608" /> + <path + style="fill:none;stroke:#d4b554;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1" + d="m 253.29912,166.99928 c 24.97184,2.03924 44.56035,3.87997 74.39954,0 m -74.39954,0 c 15.15052,-2.5301 30.62216,0.36093 74.39954,0 m 0,0 c 0.63142,-1.32821 7.82242,4.60183 6.29979,6.3018 m -6.29979,-6.3018 c 2.90094,1.33182 8.06055,-1.15857 6.29979,6.3018 m 0,0 c -2.98753,10.45968 -3.89678,22.44969 0,29.39754 m 0,-29.39754 c 1.09326,6.43894 1.59118,15.76892 0,29.39754 m 0,0 c -3.76688,6.48226 -2.59785,9.38051 -6.29979,6.3018 m 6.29979,-6.3018 c 1.56232,3.22309 1.952,5.63047 -6.29979,6.3018 m 0,0 c -16.99787,-5.16127 -34.17977,-3.95216 -74.39954,0 m 74.39954,0 c -20.40755,1.0503 -39.877,-1.68192 -74.39954,0 m 0,0 c -2.33806,-3.1906 -2.65918,1.15857 -6.29978,-6.3018 m 6.29978,6.3018 c -4.52819,4.28782 -6.18071,2.41821 -6.29978,-6.3018 m 0,0 c 3.22205,-8.38795 -0.79018,-14.52011 0,-29.39754 m 0,29.39754 c -0.49071,-12.13799 -1.9087,-23.64797 0,-29.39754 m 0,0 c -0.7108,-7.96928 0.6206,-5.35978 6.29978,-6.3018 m -6.29978,6.3018 c -3.4205,-5.51137 -1.64892,-3.04262 6.29978,-6.3018" + transform="matrix(1.082626,0,0,1.082281,0.541313,0.5411)" + id="path610" /> + <g + style="fill:#000000;fill-opacity:1" + id="g616"> + <use + xlink:href="#glyph0-11" + x="285.96548" + y="200.22198" + id="use612" /> + <use + xlink:href="#glyph0-12" + x="294.63083" + y="200.22198" + id="use614" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g624"> + <use + xlink:href="#glyph0-3" + x="301.85669" + y="200.22198" + id="use618" /> + <use + xlink:href="#glyph0-3" + x="306.18286" + y="200.22198" + id="use620" /> + <use + xlink:href="#glyph0-2" + x="310.50903" + y="200.22198" + id="use622" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g628"> + <use + xlink:href="#glyph0-13" + x="317.73492" + y="200.22198" + id="use626" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g632"> + <use + xlink:href="#glyph0-5" + x="324.96082" + y="200.22198" + id="use630" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g636"> + <use + xlink:href="#glyph0-14" + x="332.18668" + y="200.22198" + id="use634" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g640"> + <use + xlink:href="#glyph0-9" + x="335.79572" + y="200.22198" + id="use638" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g646"> + <use + xlink:href="#glyph0-8" + x="296.80862" + y="216.45621" + id="use642" /> + <use + xlink:href="#glyph0-2" + x="307.63055" + y="216.45621" + id="use644" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g650"> + <use + xlink:href="#glyph0-6" + x="314.85645" + y="216.45621" + id="use648" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g654"> + <use + xlink:href="#glyph0-9" + x="322.08231" + y="216.45621" + id="use652" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g658"> + <use + xlink:href="#glyph0-10" + x="329.3082" + y="216.45621" + id="use656" /> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" + d="m 253.9991,83.00062 v 0.999769 H 144.49972 v 76.628521" + transform="matrix(1.082626,0,0,1.082281,0.541313,0.5411)" + id="path660" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" + d="m 144.49972,165.88041 -3.49988,-7.002 3.49988,1.7505 3.49988,-1.7505 z m 0,0" + transform="matrix(1.082626,0,0,1.082281,0.541313,0.5411)" + id="path662" /> + <path + style="fill:#e1d4e6;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="m 419.94922,181.28125 h 76 c 0.59765,0 1.1914,0.0586 1.77734,0.17578 0.58594,0.11719 1.15235,0.28906 1.70313,0.51563 0.55468,0.23046 1.07812,0.51171 1.57422,0.83984 0.49609,0.33203 0.95703,0.71094 1.3789,1.13281 0.42188,0.42188 0.79688,0.87891 1.12891,1.37891 0.33203,0.49609 0.61328,1.01953 0.83984,1.57031 0.23047,0.55078 0.40235,1.12109 0.51953,1.70313 0.11719,0.58593 0.17188,1.17968 0.17188,1.77734 v 27.27344 c 0,0.59375 -0.0547,1.1875 -0.17188,1.77343 -0.11718,0.58204 -0.28906,1.15235 -0.51953,1.70313 -0.22656,0.55078 -0.50781,1.07422 -0.83984,1.57422 -0.33203,0.49609 -0.70703,0.95312 -1.12891,1.375 -0.42187,0.42187 -0.88281,0.80078 -1.3789,1.13281 -0.4961,0.33203 -1.01954,0.60938 -1.57422,0.83984 -0.55078,0.22657 -1.11719,0.39844 -1.70313,0.51563 -0.58594,0.11719 -1.17969,0.17578 -1.77734,0.17578 h -76 c -0.59766,0 -1.1875,-0.0586 -1.77344,-0.17578 -0.58594,-0.11719 -1.15234,-0.28906 -1.70703,-0.51563 -0.55078,-0.23046 -1.07422,-0.50781 -1.57031,-0.83984 -0.4961,-0.33203 -0.95703,-0.71094 -1.37891,-1.13281 -0.42187,-0.42188 -0.79687,-0.87891 -1.12891,-1.375 -0.33203,-0.5 -0.61328,-1.02344 -0.84375,-1.57422 -0.22656,-0.55078 -0.39843,-1.12109 -0.51562,-1.70313 -0.11719,-0.58593 -0.17578,-1.17968 -0.17578,-1.77343 V 190.375 c 0,-0.59766 0.0586,-1.19141 0.17578,-1.77734 0.11719,-0.58204 0.28906,-1.15235 0.51562,-1.70313 0.23047,-0.55078 0.51172,-1.07422 0.84375,-1.57031 0.33204,-0.5 0.70704,-0.95703 1.12891,-1.37891 0.42188,-0.42187 0.88281,-0.80078 1.37891,-1.13281 0.49609,-0.32813 1.01953,-0.60938 1.57031,-0.83984 0.55469,-0.22657 1.12109,-0.39844 1.70703,-0.51563 0.58594,-0.11719 1.17578,-0.17578 1.77344,-0.17578 z m 0,0" + id="path664" /> + <path + style="fill:none;stroke:#9473a6;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1" + d="m 387.3987,166.99928 h 70.19968 c 0.55204,0 1.10048,0.0541 1.6417,0.16242 0.54122,0.10828 1.0644,0.26709 1.57314,0.47642 0.51236,0.21295 0.99584,0.47282 1.45408,0.776 0.45823,0.30679 0.88399,0.65689 1.27366,1.04669 0.38968,0.3898 0.73606,0.81208 1.04275,1.27407 0.30669,0.45838 0.56648,0.94202 0.77575,1.45093 0.21288,0.50891 0.37164,1.03586 0.47988,1.57364 0.10824,0.5414 0.16237,1.09001 0.16237,1.64222 v 25.19996 c 0,0.54861 -0.0541,1.09722 -0.16237,1.63861 -0.10824,0.53779 -0.267,1.06474 -0.47988,1.57365 -0.20927,0.50891 -0.46906,0.99255 -0.77575,1.45454 -0.30669,0.45838 -0.65307,0.88066 -1.04275,1.27046 -0.38967,0.3898 -0.81543,0.7399 -1.27366,1.04669 -0.45824,0.30679 -0.94172,0.56305 -1.45408,0.776 -0.50874,0.20933 -1.03192,0.36814 -1.57314,0.47642 -0.54122,0.10828 -1.08966,0.16242 -1.6417,0.16242 H 387.3987 c -0.55204,0 -1.09687,-0.0541 -1.63809,-0.16242 -0.54122,-0.10828 -1.0644,-0.26709 -1.57675,-0.47642 -0.50874,-0.21295 -0.99223,-0.46921 -1.45047,-0.776 -0.45823,-0.30679 -0.88399,-0.65689 -1.27366,-1.04669 -0.38968,-0.3898 -0.73606,-0.81208 -1.04275,-1.27046 -0.30669,-0.46199 -0.56648,-0.94563 -0.77936,-1.45454 -0.20927,-0.50891 -0.36803,-1.03586 -0.47627,-1.57365 -0.10824,-0.54139 -0.16236,-1.09 -0.16236,-1.63861 v -25.19996 c 0,-0.55221 0.0541,-1.10082 0.16236,-1.64222 0.10824,-0.53778 0.267,-1.06473 0.47627,-1.57364 0.21288,-0.50891 0.47267,-0.99255 0.77936,-1.45093 0.30669,-0.46199 0.65307,-0.88427 1.04275,-1.27407 0.38967,-0.3898 0.81543,-0.7399 1.27366,-1.04669 0.45824,-0.30318 0.94173,-0.56305 1.45047,-0.776 0.51235,-0.20933 1.03553,-0.36814 1.57675,-0.47642 0.54122,-0.10828 1.08605,-0.16242 1.63809,-0.16242 z m 0,0" + transform="matrix(1.082626,0,0,1.082281,0.541313,0.5411)" + id="path666" /> + <g + style="fill:#000000;fill-opacity:1" + id="g674"> + <use + xlink:href="#glyph0-15" + x="425.99643" + y="200.22198" + id="use668" /> + <use + xlink:href="#glyph0-16" + x="434.66177" + y="200.22198" + id="use670" /> + <use + xlink:href="#glyph0-17" + x="441.15753" + y="200.22198" + id="use672" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g678"> + <use + xlink:href="#glyph0-12" + x="448.38342" + y="200.22198" + id="use676" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g682"> + <use + xlink:href="#glyph0-18" + x="455.60928" + y="200.22198" + id="use680" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g688"> + <use + xlink:href="#glyph0-19" + x="458.496" + y="200.22198" + id="use684" /> + <use + xlink:href="#glyph0-18" + x="464.99176" + y="200.22198" + id="use686" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g692"> + <use + xlink:href="#glyph0-14" + x="467.87848" + y="200.22198" + id="use690" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g696"> + <use + xlink:href="#glyph0-18" + x="471.48752" + y="200.22198" + id="use694" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g700"> + <use + xlink:href="#glyph0-2" + x="474.37424" + y="200.22198" + id="use698" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g704"> + <use + xlink:href="#glyph0-20" + x="481.60013" + y="200.22198" + id="use702" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g708"> + <use + xlink:href="#glyph0-1" + x="432.49219" + y="216.45621" + id="use706" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g712"> + <use + xlink:href="#glyph0-12" + x="440.42743" + y="216.45621" + id="use710" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g716"> + <use + xlink:href="#glyph0-20" + x="447.65329" + y="216.45621" + id="use714" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g722"> + <use + xlink:href="#glyph0-16" + x="454.87918" + y="216.45621" + id="use718" /> + <use + xlink:href="#glyph0-14" + x="461.37494" + y="216.45621" + id="use720" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g726"> + <use + xlink:href="#glyph0-18" + x="464.98398" + y="216.45621" + id="use724" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g730"> + <use + xlink:href="#glyph0-2" + x="467.8707" + y="216.45621" + id="use728" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g734"> + <use + xlink:href="#glyph0-20" + x="475.09656" + y="216.45621" + id="use732" /> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" + d="m 265.00027,242.99979 v -18.99922 h 25.0007 v -8.62978" + transform="matrix(1.082626,0,0,1.082281,0.541313,0.5411)" + id="path736" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" + d="m 290.00097,210.11929 3.49988,7.002 -3.49988,-1.7505 -3.49988,1.7505 z m 0,0" + transform="matrix(1.082626,0,0,1.082281,0.541313,0.5411)" + id="path738" /> + <path + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="m 268.24219,263.53516 h 38.39062 c 0.46875,0 0.92188,0.0898 1.35547,0.26953 0.43359,0.17968 0.81641,0.43359 1.14844,0.76562 0.33203,0.33203 0.58594,0.71485 0.76562,1.14844 0.17969,0.43359 0.26953,0.88672 0.26953,1.35547 v 16.49609 c 0,0.46875 -0.0898,0.91797 -0.26953,1.35156 -0.17968,0.4336 -0.43359,0.81641 -0.76562,1.14844 -0.33203,0.33203 -0.71485,0.58985 -1.14844,0.76953 -0.43359,0.17969 -0.88672,0.26563 -1.35547,0.26953 h -38.39062 c -0.46875,-0.004 -0.92188,-0.0898 -1.35547,-0.26953 -0.4336,-0.17968 -0.81641,-0.4375 -1.14844,-0.76953 -0.33203,-0.33203 -0.58594,-0.71484 -0.76562,-1.14844 -0.17969,-0.43359 -0.26954,-0.88281 -0.26954,-1.35156 v -16.49609 c 0,-0.46875 0.0899,-0.92188 0.26954,-1.35547 0.17968,-0.43359 0.43359,-0.81641 0.76562,-1.14844 0.33203,-0.33203 0.71484,-0.58594 1.14844,-0.76562 0.43359,-0.17969 0.88672,-0.26953 1.35547,-0.26953 z m 0,0" + id="path740" /> + <g + clip-path="url(#clip2)" + clip-rule="nonzero" + id="g744"> + <path + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1" + d="m 247.26995,242.99979 h 35.46065 c 0.43298,0 0.85152,0.083 1.25202,0.24904 0.4005,0.16603 0.7541,0.40063 1.06079,0.70742 0.30669,0.30679 0.54122,0.6605 0.70719,1.06112 0.16598,0.40063 0.24896,0.81931 0.24896,1.25242 v 15.24197 c 0,0.43312 -0.083,0.84818 -0.24896,1.24881 -0.16597,0.40063 -0.4005,0.75434 -0.70719,1.06113 -0.30669,0.30679 -0.66029,0.545 -1.06079,0.71103 -0.4005,0.16602 -0.81904,0.24904 -1.25202,0.24904 h -35.46065 c -0.43298,0 -0.85152,-0.083 -1.25202,-0.24904 -0.4005,-0.16603 -0.7541,-0.40424 -1.06079,-0.71103 -0.30669,-0.30679 -0.54122,-0.6605 -0.70719,-1.06113 -0.16598,-0.40063 -0.24896,-0.81569 -0.24896,-1.24881 v -15.24197 c 0,-0.43311 0.083,-0.85179 0.24896,-1.25242 0.16597,-0.40062 0.4005,-0.75433 0.70719,-1.06112 0.30669,-0.30679 0.66029,-0.54139 1.06079,-0.70742 0.4005,-0.16603 0.81904,-0.24904 1.25202,-0.24904 z m 0,0" + transform="matrix(1.082626,0,0,1.082281,0.541313,0.5411)" + id="path742" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g752"> + <use + xlink:href="#glyph1-1" + x="271.33313" + y="279.22849" + id="use746" /> + <use + xlink:href="#glyph1-2" + x="279.27637" + y="279.22849" + id="use748" /> + <use + xlink:href="#glyph1-3" + x="283.24203" + y="279.22849" + id="use750" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g756"> + <use + xlink:href="#glyph1-4" + x="285.88818" + y="279.22849" + id="use754" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g762"> + <use + xlink:href="#glyph1-2" + x="292.5119" + y="279.22849" + id="use758" /> + <use + xlink:href="#glyph1-5" + x="296.47757" + y="279.22849" + id="use760" /> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" + d="M 422.49854,166.99928 V 83.00062 h -75.12838" + transform="matrix(1.082626,0,0,1.082281,0.541313,0.5411)" + id="path764" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" + d="m 342.12034,83.00062 6.99976,-3.500997 -1.74994,3.500997 1.74994,3.500997 z m 0,0" + transform="matrix(1.082626,0,0,1.082281,0.541313,0.5411)" + id="path766" /> + <path + style="fill:#e1d4e6;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="m 282.34766,67.640625 h 80.54687 c 0.44922,0 0.89453,0.04687 1.33203,0.132813 0.4375,0.08594 0.86719,0.214843 1.28125,0.386718 0.41406,0.171875 0.80469,0.382813 1.17578,0.632813 0.375,0.246093 0.71875,0.53125 1.03516,0.847656 0.31641,0.316406 0.60156,0.660156 0.84766,1.03125 0.25,0.375 0.46093,0.765625 0.63281,1.179687 0.16797,0.414063 0.30078,0.839844 0.38672,1.277344 0.0859,0.441406 0.1289,0.882813 0.1289,1.332032 v 31.820312 c 0,0.44531 -0.043,0.89063 -0.1289,1.32813 -0.0859,0.4414 -0.21875,0.86718 -0.38672,1.28125 -0.17188,0.41406 -0.38281,0.80468 -0.63281,1.17578 -0.2461,0.375 -0.53125,0.71875 -0.84766,1.03515 -0.31641,0.31641 -0.66016,0.59766 -1.03516,0.84766 -0.37109,0.25 -0.76172,0.45703 -1.17578,0.62891 -0.41406,0.17187 -0.84375,0.30078 -1.28125,0.39062 -0.4375,0.0859 -0.88281,0.12891 -1.33203,0.12891 h -80.54687 c -0.44532,0 -0.89063,-0.043 -1.32813,-0.12891 -0.44141,-0.0898 -0.86719,-0.21875 -1.28125,-0.39062 -0.41406,-0.17188 -0.80469,-0.37891 -1.17969,-0.62891 -0.37109,-0.25 -0.71484,-0.53125 -1.03125,-0.84766 -0.3164,-0.3164 -0.60156,-0.66015 -0.85156,-1.03515 -0.24609,-0.3711 -0.45703,-0.76172 -0.62891,-1.17578 -0.17187,-0.41407 -0.30078,-0.83985 -0.38671,-1.28125 -0.0899,-0.4375 -0.13282,-0.88282 -0.13282,-1.32813 V 74.460938 c 0,-0.449219 0.043,-0.890626 0.13282,-1.332032 0.0859,-0.4375 0.21484,-0.863281 0.38671,-1.277344 0.17188,-0.414062 0.38282,-0.804687 0.62891,-1.179687 0.25,-0.371094 0.53516,-0.714844 0.85156,-1.03125 0.31641,-0.316406 0.66016,-0.601563 1.03125,-0.847656 0.375,-0.25 0.76563,-0.460938 1.17969,-0.632813 0.41406,-0.171875 0.83984,-0.300781 1.28125,-0.386718 0.4375,-0.08594 0.88281,-0.132813 1.32813,-0.132813 z m 0,0" + id="path768" /> + <path + style="fill:none;stroke:#9473a6;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1" + d="m 260.29889,61.998247 h 74.39954 c 0.41493,0 0.82626,0.04331 1.23037,0.122716 0.40772,0.0794 0.801,0.19851 1.18346,0.357318 0.38246,0.158808 0.74328,0.353709 1.08605,0.584702 0.34638,0.227385 0.66389,0.490862 0.95615,0.783213 0.29226,0.292351 0.55565,0.609968 0.78296,0.952849 0.23092,0.34649 0.42576,0.707418 0.58452,1.090001 0.15515,0.382583 0.27783,0.775994 0.3572,1.180233 0.0794,0.407848 0.11907,0.815696 0.11907,1.230763 v 29.401156 c 0,0.411457 -0.0397,0.822914 -0.11907,1.227153 -0.0794,0.407848 -0.20205,0.801259 -0.3572,1.183839 -0.15876,0.38259 -0.3536,0.74351 -0.58452,1.08639 -0.22731,0.3465 -0.4907,0.66411 -0.78296,0.95646 -0.29226,0.29236 -0.60977,0.55222 -0.95615,0.78322 -0.34277,0.23099 -0.70359,0.42228 -1.08605,0.58109 -0.38246,0.15881 -0.77574,0.27791 -1.18346,0.36093 -0.40411,0.0794 -0.81544,0.1191 -1.23037,0.1191 h -74.39954 c -0.41133,0 -0.82266,-0.0397 -1.22676,-0.1191 -0.40772,-0.083 -0.80101,-0.20212 -1.18347,-0.36093 -0.38246,-0.15881 -0.74327,-0.3501 -1.08965,-0.58109 -0.34278,-0.231 -0.66029,-0.49086 -0.95255,-0.78322 -0.29226,-0.29235 -0.55565,-0.60996 -0.78296,-0.95646 -0.23092,-0.34288 -0.42576,-0.7038 -0.58452,-1.08639 -0.15876,-0.38258 -0.27782,-0.775991 -0.3572,-1.183839 -0.083,-0.404239 -0.12268,-0.815696 -0.12268,-1.227153 V 68.300042 c 0,-0.415067 0.0397,-0.822915 0.12268,-1.230763 0.0794,-0.404239 0.19844,-0.79765 0.3572,-1.180233 0.15876,-0.382583 0.3536,-0.743511 0.58452,-1.090001 0.22731,-0.342881 0.4907,-0.660498 0.78296,-0.952849 0.29226,-0.292351 0.60977,-0.555828 0.95255,-0.783213 0.34638,-0.230993 0.70719,-0.425894 1.08965,-0.584702 0.38246,-0.158808 0.77575,-0.277914 1.18347,-0.357318 0.4041,-0.0794 0.81543,-0.122716 1.22676,-0.122716 z m 0,0" + transform="matrix(1.082626,0,0,1.082281,0.541313,0.5411)" + id="path770" /> + <g + style="fill:#000000;fill-opacity:1" + id="g774"> + <use + xlink:href="#glyph0-21" + x="294.28818" + y="94.158447" + id="use772" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g778"> + <use + xlink:href="#glyph0-22" + x="304.39297" + y="94.158447" + id="use776" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g782"> + <use + xlink:href="#glyph0-14" + x="311.61884" + y="94.158447" + id="use780" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g786"> + <use + xlink:href="#glyph0-18" + x="315.22787" + y="94.158447" + id="use784" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g792"> + <use + xlink:href="#glyph0-23" + x="318.11459" + y="94.158447" + id="use788" /> + <use + xlink:href="#glyph0-18" + x="328.93652" + y="94.158447" + id="use790" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g798"> + <use + xlink:href="#glyph0-19" + x="331.82324" + y="94.158447" + id="use794" /> + <use + xlink:href="#glyph0-9" + x="338.319" + y="94.158447" + id="use796" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g802"> + <use + xlink:href="#glyph0-3" + x="345.54489" + y="94.158447" + id="use800" /> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" + d="m 317.00057,242.99979 v -18.99922 h -26.9996" + transform="matrix(1.082626,0,0,1.082281,0.541313,0.5411)" + id="path804" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="m 366.46875,274.79297 h 1.08203 v 1.08203 h -1.08203 z m 3.24609,0 h 1.08594 v 1.08203 h -1.08594 z m 3.25,0 h 1.08203 v 1.08203 h -1.08203 z m 3.2461,0 h 1.08593 v 1.08203 h -1.08593 z m 3.25,0 h 1.08203 v 1.08203 h -1.08203 z m 3.24609,0 h 1.08203 v 1.08203 h -1.08203 z m 3.25,0 h 1.08203 v 1.08203 h -1.08203 z m 3.24609,0 h 1.08204 v 1.08203 h -1.08204 z m 3.25,0 h 1.08204 v 1.08203 h -1.08204 z m 3.2461,0 h 1.08203 v 1.08203 h -1.08203 z m 3.25,0 h 1.08203 v 1.08203 h -1.08203 z m 3.24609,0 h 1.08203 v 1.08203 h -1.08203 z m 3.25,0 h 1.08203 v 1.08203 h -1.08203 z m 3.2461,0 h 1.08203 v 1.08203 h -1.08203 z m 3.24609,0 h 1.08594 v 1.08203 h -1.08594 z m 3.25,0 h 1.08203 v 1.08203 h -1.08203 z m 3.24609,0 h 1.08203 v 1.08203 h -1.08203 z m 3.25,0 h 1.08203 v 1.08203 h -1.08203 z m 3.2461,0 h 1.08203 v 1.08203 h -1.08203 z m 3.25,0 h 1.08203 v 1.08203 h -1.08203 z m 3.24609,0 h 1.08203 v 1.08203 h -1.08203 z m 3.25,0 h 1.08203 v 1.08203 h -1.08203 z m 3.24609,0 h 1.08204 v 1.08203 h -1.08204 z m 3.25,0 h 1.08204 v 1.08203 h -1.08204 z m 3.2461,0 H 445.5 v 1.08203 h -1.08203 z m 3.24609,0 H 448.75 v 1.08203 h -1.08594 z m 3.25,0 h 1.08203 v 1.08203 h -1.08203 z m 3.2461,0 h 1.08203 v 1.08203 h -1.08203 z m 3.25,0 h 0.53906 v 0.53906 h -0.53906 v -0.53906 h 1.08203 v 1.08203 h -1.08203 z m 0,-2.16797 v -1.08203 h 1.08203 v 1.08203 z m 0,-3.24609 v -1.08204 h 1.08203 v 1.08204 z m 0,-3.2461 v -1.08203 h 1.08203 v 1.08203 z m 0,-3.24609 v -1.08203 h 1.08203 v 1.08203 z m 0,-3.2461 v -1.08203 h 1.08203 v 1.08203 z m 0,-3.25 v -1.08203 h 1.08203 v 1.08203 z m 0,-3.24609 v -1.08203 h 1.08203 v 1.08203 z m 0,-3.24609 v -1.08203 h 1.08203 v 1.08203 z m 0,-3.2461 v -1.08203 h 1.08203 v 1.08203 z m 0,-3.24609 v -1.08203 h 1.08203 v 1.08203 z m 0,-3.25 v -1.08203 h 1.08203 v 1.08203 z m 0,-3.24609 v -1.08204 h 1.08203 v 1.08204 z m 0,-3.2461 v -0.0312 h 1.08203 v 0.0312 z m 0,0" + id="path806" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" + d="m 422.49854,210.11929 3.49988,7.002 -3.49988,-1.7505 -3.49988,1.7505 z m 0,0" + transform="matrix(1.082626,0,0,1.082281,0.541313,0.5411)" + id="path808" /> + <path + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="m 324.53906,263.53516 h 38.39063 c 0.46875,0 0.92187,0.0898 1.35547,0.26953 0.43359,0.17968 0.8164,0.43359 1.14843,0.76562 0.33203,0.33203 0.58594,0.71485 0.76563,1.14844 0.17969,0.43359 0.26953,0.88672 0.26953,1.35547 v 16.49609 c 0,0.46875 -0.0898,0.91797 -0.26953,1.35156 -0.17969,0.4336 -0.4336,0.81641 -0.76563,1.14844 -0.33203,0.33203 -0.71484,0.58985 -1.14843,0.76953 -0.4336,0.17969 -0.88672,0.26563 -1.35547,0.26953 h -38.39063 c -0.46875,-0.004 -0.92187,-0.0898 -1.35547,-0.26953 -0.43359,-0.17968 -0.8164,-0.4375 -1.14843,-0.76953 -0.33204,-0.33203 -0.58594,-0.71484 -0.76563,-1.14844 C 321.08984,284.48828 321,284.03906 321,283.57031 v -16.49609 c 0,-0.46875 0.0898,-0.92188 0.26953,-1.35547 0.17969,-0.43359 0.43359,-0.81641 0.76563,-1.14844 0.33203,-0.33203 0.71484,-0.58594 1.14843,-0.76562 0.4336,-0.17969 0.88672,-0.26953 1.35547,-0.26953 z m 0,0" + id="path810" /> + <g + clip-path="url(#clip3)" + clip-rule="nonzero" + id="g814"> + <path + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1" + d="m 299.27025,242.99979 h 35.46065 c 0.43297,0 0.85152,0.083 1.25202,0.24904 0.4005,0.16603 0.7541,0.40063 1.06079,0.70742 0.30669,0.30679 0.54122,0.6605 0.70719,1.06112 0.16597,0.40063 0.24896,0.81931 0.24896,1.25242 v 15.24197 c 0,0.43312 -0.083,0.84818 -0.24896,1.24881 -0.16597,0.40063 -0.4005,0.75434 -0.70719,1.06113 -0.30669,0.30679 -0.66029,0.545 -1.06079,0.71103 -0.4005,0.16602 -0.81905,0.24904 -1.25202,0.24904 h -35.46065 c -0.43298,0 -0.85152,-0.083 -1.25202,-0.24904 -0.40051,-0.16603 -0.7541,-0.40424 -1.06079,-0.71103 -0.30669,-0.30679 -0.54122,-0.6605 -0.70719,-1.06113 -0.16598,-0.40063 -0.24897,-0.81569 -0.24897,-1.24881 v -15.24197 c 0,-0.43311 0.083,-0.85179 0.24897,-1.25242 0.16597,-0.40062 0.4005,-0.75433 0.70719,-1.06112 0.30669,-0.30679 0.66028,-0.54139 1.06079,-0.70742 0.4005,-0.16603 0.81904,-0.24904 1.25202,-0.24904 z m 0,0" + transform="matrix(1.082626,0,0,1.082281,0.541313,0.5411)" + id="path812" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g818"> + <use + xlink:href="#glyph1-6" + x="324.33105" + y="279.22849" + id="use816" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g824"> + <use + xlink:href="#glyph1-7" + x="332.93164" + y="279.22849" + id="use820" /> + <use + xlink:href="#glyph1-8" + x="338.88608" + y="279.22849" + id="use822" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g828"> + <use + xlink:href="#glyph1-9" + x="345.5098" + y="279.22849" + id="use826" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g834"> + <use + xlink:href="#glyph1-2" + x="352.13351" + y="279.22849" + id="use830" /> + <use + xlink:href="#glyph1-5" + x="356.09918" + y="279.22849" + id="use832" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g838"> + <use + xlink:href="#glyph0-13" + x="389.52548" + y="30.303867" + id="use836" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g844"> + <use + xlink:href="#glyph0-3" + x="396.75134" + y="30.303867" + id="use840" /> + <use + xlink:href="#glyph0-5" + x="401.07755" + y="30.303867" + id="use842" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g848"> + <use + xlink:href="#glyph0-6" + x="408.30341" + y="30.303867" + id="use846" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g852"> + <use + xlink:href="#glyph0-18" + x="415.5293" + y="30.303867" + id="use850" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g856"> + <use + xlink:href="#glyph0-9" + x="418.41602" + y="30.303867" + id="use854" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g860"> + <use + xlink:href="#glyph0-20" + x="425.64188" + y="30.303867" + id="use858" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g864"> + <use + xlink:href="#glyph0-14" + x="432.86777" + y="30.303867" + id="use862" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g868"> + <use + xlink:href="#glyph0-7" + x="436.47681" + y="30.303867" + id="use866" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g872"> + <use + xlink:href="#glyph0-24" + x="440.08585" + y="30.303867" + id="use870" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g876"> + <use + xlink:href="#glyph0-7" + x="443.69489" + y="30.303867" + id="use874" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g880"> + <use + xlink:href="#glyph0-20" + x="447.30392" + y="30.303867" + id="use878" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g884"> + <use + xlink:href="#glyph0-2" + x="454.52982" + y="30.303867" + id="use882" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g888"> + <use + xlink:href="#glyph0-20" + x="461.75568" + y="30.303867" + id="use886" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g892"> + <use + xlink:href="#glyph0-25" + x="468.98157" + y="30.303867" + id="use890" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g896"> + <use + xlink:href="#glyph0-13" + x="384.83975" + y="46.538082" + id="use894" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g902"> + <use + xlink:href="#glyph0-3" + x="392.06564" + y="46.538082" + id="use898" /> + <use + xlink:href="#glyph0-5" + x="396.39182" + y="46.538082" + id="use900" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g906"> + <use + xlink:href="#glyph0-6" + x="403.61771" + y="46.538082" + id="use904" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g910"> + <use + xlink:href="#glyph0-18" + x="410.84357" + y="46.538082" + id="use908" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g914"> + <use + xlink:href="#glyph0-9" + x="413.73029" + y="46.538082" + id="use912" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g918"> + <use + xlink:href="#glyph0-20" + x="420.95618" + y="46.538082" + id="use916" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g922"> + <use + xlink:href="#glyph0-14" + x="428.18204" + y="46.538082" + id="use920" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g926"> + <use + xlink:href="#glyph0-7" + x="431.79108" + y="46.538082" + id="use924" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g930"> + <use + xlink:href="#glyph0-26" + x="435.40012" + y="46.538082" + id="use928" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g934"> + <use + xlink:href="#glyph0-5" + x="442.62601" + y="46.538082" + id="use932" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g940"> + <use + xlink:href="#glyph0-19" + x="449.8519" + y="46.538082" + id="use936" /> + <use + xlink:href="#glyph0-9" + x="456.34766" + y="46.538082" + id="use938" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g944"> + <use + xlink:href="#glyph0-6" + x="463.57352" + y="46.538082" + id="use942" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g948"> + <use + xlink:href="#glyph0-27" + x="470.79941" + y="46.538082" + id="use946" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g952"> + <use + xlink:href="#glyph0-27" + x="474.40845" + y="46.538082" + id="use950" /> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" + d="m 349.2103,63.340898 21.78947,-15.33942" + transform="matrix(1.082626,0,0,1.082281,0.541313,0.5411)" + id="path954" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" + d="m 344.90942,66.358252 3.70915,-6.886497 0.59173,3.869143 3.43855,1.847949 z m 0,0" + transform="matrix(1.082626,0,0,1.082281,0.541313,0.5411)" + id="path956" /> + <path + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" + d="m 494.00076,166.99928 h -9.00228 v 21.00237 h -12.62843" + transform="matrix(1.082626,0,0,1.082281,0.541313,0.5411)" + id="path958" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" + d="m 467.12022,188.00165 6.99977,-3.50099 -1.74994,3.50099 1.74994,3.49739 z m 0,0" + transform="matrix(1.082626,0,0,1.082281,0.541313,0.5411)" + id="path960" /> + <path + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="m 539.90625,168.29297 h 55.86328 c 0.60156,0 1.18359,0.11719 1.73828,0.34765 0.5586,0.23047 1.05078,0.5586 1.47656,0.98438 0.42579,0.42578 0.75391,0.91797 0.98438,1.47656 0.23047,0.55469 0.34766,1.13672 0.34766,1.73828 v 21.21485 c 0,0.60156 -0.11719,1.17968 -0.34766,1.73828 -0.23047,0.55469 -0.55859,1.04687 -0.98438,1.47265 -0.42578,0.42579 -0.91796,0.75782 -1.47656,0.98829 -0.55469,0.23046 -1.13672,0.34375 -1.73828,0.34375 h -55.86328 c -0.60547,0 -1.18359,-0.11329 -1.74219,-0.34375 -0.55469,-0.23047 -1.04687,-0.5625 -1.47265,-0.98829 -0.42579,-0.42578 -0.75782,-0.91796 -0.98829,-1.47265 -0.23046,-0.5586 -0.34375,-1.13672 -0.34375,-1.73828 v -21.21485 c 0,-0.60156 0.11329,-1.18359 0.34375,-1.73828 0.23047,-0.55859 0.5625,-1.05078 0.98829,-1.47656 0.42578,-0.42578 0.91796,-0.75391 1.47265,-0.98438 0.5586,-0.23046 1.13672,-0.34765 1.74219,-0.34765 z m 0,0" + id="path962" /> + <g + clip-path="url(#clip4)" + clip-rule="nonzero" + id="g966"> + <path + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1" + d="m 498.20061,154.99844 h 51.5998 c 0.55565,0 1.09326,0.10828 1.60561,0.32123 0.51597,0.21294 0.97059,0.51612 1.36388,0.90953 0.39328,0.39342 0.69637,0.84818 0.90924,1.36431 0.21288,0.51252 0.32113,1.0503 0.32113,1.60613 v 19.60197 c 0,0.55583 -0.10825,1.09 -0.32113,1.60613 -0.21287,0.51252 -0.51596,0.96728 -0.90924,1.3607 -0.39329,0.39702 -0.84791,0.7002 -1.36388,0.91314 -0.51235,0.21295 -1.04996,0.31762 -1.60561,0.31762 h -51.5998 c -0.55926,0 -1.09326,-0.10467 -1.60922,-0.31762 -0.51235,-0.21294 -0.96698,-0.51612 -1.36026,-0.91314 -0.39329,-0.39342 -0.69998,-0.84818 -0.91286,-1.3607 -0.21288,-0.51613 -0.31751,-1.0503 -0.31751,-1.60613 v -19.60197 c 0,-0.55583 0.10463,-1.09361 0.31751,-1.60613 0.21288,-0.51613 0.51957,-0.97089 0.91286,-1.36431 0.39328,-0.39341 0.84791,-0.69659 1.36026,-0.90953 0.51596,-0.21295 1.04996,-0.32123 1.60922,-0.32123 z m 0,0" + transform="matrix(1.082626,0,0,1.082281,0.541313,0.5411)" + id="path964" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g972"> + <use + xlink:href="#glyph0-15" + x="539.48608" + y="187.23462" + id="use968" /> + <use + xlink:href="#glyph0-20" + x="548.15143" + y="187.23462" + id="use970" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g976"> + <use + xlink:href="#glyph0-5" + x="555.37726" + y="187.23462" + id="use974" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g980"> + <use + xlink:href="#glyph0-10" + x="562.60315" + y="187.23462" + id="use978" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g986"> + <use + xlink:href="#glyph0-28" + x="565.48987" + y="187.23462" + id="use982" /> + <use + xlink:href="#glyph0-14" + x="571.98566" + y="187.23462" + id="use984" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g990"> + <use + xlink:href="#glyph0-18" + x="575.59467" + y="187.23462" + id="use988" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g996"> + <use + xlink:href="#glyph0-16" + x="578.48138" + y="187.23462" + id="use992" /> + <use + xlink:href="#glyph0-5" + x="584.97717" + y="187.23462" + id="use994" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g1000"> + <use + xlink:href="#glyph0-10" + x="592.203" + y="187.23462" + id="use998" /> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" + d="m 494.00076,206.00111 h -9.00228 v -17.99946 h -12.62843" + transform="matrix(1.082626,0,0,1.082281,0.541313,0.5411)" + id="path1002" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" + d="m 467.12022,188.00165 6.99977,-3.50099 -1.74994,3.50099 1.74994,3.49739 z m 0,0" + transform="matrix(1.082626,0,0,1.082281,0.541313,0.5411)" + id="path1004" /> + <path + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="m 539.90625,208.33984 h 55.86328 c 0.60156,0 1.18359,0.11328 1.73828,0.34375 0.5586,0.23047 1.05078,0.5586 1.47656,0.98828 0.42579,0.42579 0.75391,0.91797 0.98438,1.47266 0.23047,0.55859 0.34766,1.13672 0.34766,1.73828 v 21.21485 c 0,0.60156 -0.11719,1.18359 -0.34766,1.73828 -0.23047,0.55859 -0.55859,1.05078 -0.98438,1.47656 -0.42578,0.42578 -0.91796,0.75391 -1.47656,0.98437 -0.55469,0.23047 -1.13672,0.34766 -1.73828,0.34766 h -55.86328 c -0.60547,0 -1.18359,-0.11719 -1.74219,-0.34766 -0.55469,-0.23046 -1.04687,-0.55859 -1.47265,-0.98437 -0.42579,-0.42578 -0.75782,-0.91797 -0.98829,-1.47656 -0.23046,-0.55469 -0.34375,-1.13672 -0.34375,-1.73828 v -21.21485 c 0,-0.60156 0.11329,-1.17969 0.34375,-1.73828 0.23047,-0.55469 0.5625,-1.04687 0.98829,-1.47266 0.42578,-0.42968 0.91796,-0.75781 1.47265,-0.98828 0.5586,-0.23047 1.13672,-0.34375 1.74219,-0.34375 z m 0,0" + id="path1006" /> + <g + clip-path="url(#clip5)" + clip-rule="nonzero" + id="g1010"> + <path + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1" + d="m 498.20061,192.00073 h 51.5998 c 0.55565,0 1.09326,0.10467 1.60561,0.31762 0.51597,0.21294 0.97059,0.51973 1.36388,0.91314 0.39328,0.39341 0.69637,0.84818 0.90924,1.3607 0.21288,0.51613 0.32113,1.0503 0.32113,1.60613 v 19.60197 c 0,0.55583 -0.10825,1.09361 -0.32113,1.60613 -0.21287,0.51613 -0.51596,0.97089 -0.90924,1.36431 -0.39329,0.39341 -0.84791,0.69659 -1.36388,0.90953 -0.51235,0.21295 -1.04996,0.32123 -1.60561,0.32123 h -51.5998 c -0.55926,0 -1.09326,-0.10828 -1.60922,-0.32123 -0.51235,-0.21294 -0.96698,-0.51612 -1.36026,-0.90953 -0.39329,-0.39342 -0.69998,-0.84818 -0.91286,-1.36431 -0.21288,-0.51252 -0.31751,-1.0503 -0.31751,-1.60613 v -19.60197 c 0,-0.55583 0.10463,-1.09 0.31751,-1.60613 0.21288,-0.51252 0.51957,-0.96729 0.91286,-1.3607 0.39328,-0.39341 0.84791,-0.7002 1.36026,-0.91314 0.51596,-0.21295 1.04996,-0.31762 1.60922,-0.31762 z m 0,0" + transform="matrix(1.082626,0,0,1.082281,0.541313,0.5411)" + id="path1008" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g1016"> + <use + xlink:href="#glyph0-11" + x="537.3208" + y="227.27901" + id="use1012" /> + <use + xlink:href="#glyph0-14" + x="545.98615" + y="227.27901" + id="use1014" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g1020"> + <use + xlink:href="#glyph0-2" + x="549.59521" + y="227.27901" + id="use1018" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g1026"> + <use + xlink:href="#glyph0-16" + x="556.82111" + y="227.27901" + id="use1022" /> + <use + xlink:href="#glyph0-29" + x="563.31683" + y="227.27901" + id="use1024" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g1030"> + <use + xlink:href="#glyph0-5" + x="570.54272" + y="227.27901" + id="use1028" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g1036"> + <use + xlink:href="#glyph0-19" + x="577.76862" + y="227.27901" + id="use1032" /> + <use + xlink:href="#glyph0-14" + x="584.26434" + y="227.27901" + id="use1034" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g1040"> + <use + xlink:href="#glyph0-18" + x="587.87341" + y="227.27901" + id="use1038" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g1044"> + <use + xlink:href="#glyph0-16" + x="590.76013" + y="227.27901" + id="use1042" /> + </g> + <use + xlink:href="#image69048" + mask="url(#mask0)" + transform="matrix(0.233306,0,0,0.23327,207.8642,69.26597)" + id="use1046" /> + <use + xlink:href="#image69054" + mask="url(#mask1)" + transform="matrix(0.224508,0,0,0.224573,1.082626,169.91806)" + id="use1048" /> + <path + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" + d="M 37.998694,188.00165 H 94.628217" + transform="matrix(1.082626,0,0,1.082281,0.541313,0.5411)" + id="path1050" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" + d="m 99.881647,188.00165 -7.00337,3.49739 1.74994,-3.49739 -1.74994,-3.50099 z m 0,0" + transform="matrix(1.082626,0,0,1.082281,0.541313,0.5411)" + id="path1052" /> + <use + xlink:href="#image69060" + mask="url(#mask2)" + transform="matrix(0.171443,0,0,0.17141,215.4425,180.24303)" + id="use1054" /> + <use + xlink:href="#image69066" + mask="url(#mask3)" + transform="matrix(0.203152,0,0,0.202928,224.1035,241.34859)" + id="use1056" /> + <path + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" + d="M 225.0006,188.00165 H 245.00044 226.9995 240.631" + transform="matrix(1.082626,0,0,1.082281,0.541313,0.5411)" + id="path1058" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" + d="m 245.88082,188.00165 -6.99976,3.49739 1.74994,-3.49739 -1.74994,-3.50099 z m 0,0" + transform="matrix(1.082626,0,0,1.082281,0.541313,0.5411)" + id="path1060" /> + <path + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1" + d="m 225.0006,188.00165 c 0,0.6605 -0.12628,1.29934 -0.38246,1.91292 -0.25257,0.60997 -0.61338,1.15136 -1.08244,1.62056 -0.46906,0.46921 -1.01027,0.83014 -1.62366,1.08279 -0.60977,0.25626 -1.24841,0.38258 -1.9123,0.38258 -0.6639,0 -1.29893,-0.12632 -1.91231,-0.38258 -0.61338,-0.25265 -1.1546,-0.61358 -1.62365,-1.08279 -0.46906,-0.4692 -0.82987,-1.01059 -1.08244,-1.62056 -0.25618,-0.61358 -0.38246,-1.25242 -0.38246,-1.91292 0,-0.6641 0.12628,-1.30294 0.38246,-1.91652 0.25257,-0.60997 0.61338,-1.15136 1.08244,-1.62057 0.46905,-0.4692 1.01027,-0.83013 1.62365,-1.08278 0.61338,-0.25626 1.24841,-0.38258 1.91231,-0.38258 0.66389,0 1.30253,0.12632 1.9123,0.38258 0.61339,0.25265 1.1546,0.61358 1.62366,1.08278 0.46906,0.46921 0.82987,1.0106 1.08244,1.62057 0.25618,0.61358 0.38246,1.25242 0.38246,1.91652 z m 0,0" + transform="matrix(1.082626,0,0,1.082281,0.541313,0.5411)" + id="path1062" /> + <g + style="fill:#000000;fill-opacity:1" + id="g1066"> + <use + xlink:href="#glyph0-25" + x="236.01247" + y="207.79796" + id="use1064" /> + </g> + <g + clip-path="url(#clip6)" + clip-rule="nonzero" + id="g1070"> + <use + xlink:href="#image69072" + mask="url(#mask4)" + transform="matrix(0.0949987,0,0,0.0949684,348.6126,185.07715)" + id="use1068" /> + </g> + <g + clip-path="url(#clip7)" + clip-rule="nonzero" + id="g1074"> + <use + xlink:href="#image69078" + mask="url(#mask5)" + transform="matrix(0.0733945,0,0,0.0733756,42.14981,194.71589)" + id="use1072" /> + </g> + <use + xlink:href="#image69083" + transform="matrix(0.120265,0,0,0.120253,413.563,93.07611)" + id="use1076" /> + </g> +</svg> diff --git a/assets/PyBOP_Arch.pdf b/assets/PyBOP_Arch.pdf new file mode 100644 index 0000000000000000000000000000000000000000..17d36a9c67f8979280494d3c38c8a9700bbfabb5 GIT binary patch literal 110377 zcmeFZbyQVd*9R&c(jX{ENOy}$9Xge61Oz0dI}ad@(jeU+Ehs46p>#_l-Q5Qca2L<} z#Orsz=Nsexe;s>p&e&(~6?4rs<M*3OIwc7yHZFD^OuF`!!<DW4qs+nfPD~yuPAXd? zOH4sQDh??ND<=~N@M&e}WFlc=Z2Q`TisQM7jhT}<6&EiTm9Q|TqmzS)p*5x(f^{Sp zPAeyt<XP&XfiIthy_#ul`B3NsNl{5TU;5+guSh0Yr$#Wy^e;lx=Yy%Q*^*Cvm+f1S zPPoXbu~fMQ=q17->~V55aT}RZGs1PuQ?#zN!vrs;cV3v8M0DNk7A(Uxb50)S6o0Nz z>~ESodQ3GtDX49vu8-$WCLjN<KyfJ3=S!O*0$=#!I7}0p*ME)+e7l_t*MCh)&D{>n zLdnqVkG~EkHcnLB;Aa&o4iyteTW1Gj6GtlE|J)F_wQ&N!J5t>W1w8P=<h6yNn5`R? zE+@G0n2(Q&o9CGxCJ@7){oKCym++JvY>ib-oTzj`XA)9W9J1D+OR+yc#sB=2rP8C~ z5Vy6mbx^f4G&Z5SmAbei7uDlGIs^@KXek<5nixC%@r$fA7Zu;1zuXG{&t7kD{nhJ# zX7|@i9IDPnPJhhzkKU;`G%a4=uH9oEUMdb56ALqQCn`SPr(iH(q7HVpx9d#h<lt<A z`QL;3&tN#jESwybOdP~*t?g`WZp8-P`%4)(`FOZ_{#S*$mCoNvvYm$FrS_e;lahEQ zPs?{6`7JSvei%{0qRzvxuN^v-)$;ad^U26DcUq9}v+-OJ5Ru2%FI^aFY9<5l7-?Of z{JK8fNf9{f?X9_~tLuZNI@0rfz$KtU_~$wgLe9>~LBn~-X*E&4Ua)Rkjg?RTU%&tN zvogAfLtI=(t9>IQBR#3lj^MDn!!Gupq!4LE{<mwt6rF0ytUvYHGso4JH4ZCZOnMyF z`oqU<zusS?`?oGw5S5jck8WW3N?BsluG@HTY$m_ZDW(g`C$NQwgvhXPRO4Vo-TB|H z=5dDo)xH!zB(!uPPYvOdP(p?voCk;7lRWMW)BpPjMG$qQ?@a2;dMkY6DSY55<BR<N z^%{OBqNFsqF_IsBdNSYQe|+e-74yH2?hb~R9wMc%m)2*aKtDgx6h6pT^P$$k!NIw? z>n-+{$$#s3IIwxSE0)KkJ0NZ5SCbFrHE+FKJhSuWsQbyLdhOFTN!foHbR(u;Vq#*) zJK~!?pBu7g4!OJwKa^>P94EWwHVys%WuhWm=vvy^E4@h-?;9J-GRl_WCE694a8}*g z=l{n`b?Eibt6Iq;Vm$ZN-XxkcFYtFAell*bl4ceAFVZl__Y)7s$*NbJt9KU?5?Zl| zBo`p=RxHzRSpGj=y6ZPyrtfoeb*AKYak521Mo3dbPEJ1iSylQN_dch{=Iei**gN!8 zVQ*3dh+C?ly~^%sh1r1RXaT~C8T|a<5c=)kgjgBaT%epowHL>#yx4Me>5$P-Uw^pT z<*$0QHjr>u@#23|d$1QW?;%qNd8p+C;V-8pOFd>|W&P9+v6-o^dDVh=OhdeWez2rt z&*l{KZ>ylt+}TO*x;vxf7DmEh^ZIqbG5bM*enZguca1%pvzcY_iGSOogP4eQE<10x zW5J#i@;nvvI_Ffos`j~QtgG|f7|ydV(r@tC`_(ia_9iR#-}Zz9qR-U{$#Pn2;9XC5 z&z{TD(o!I<2-P<~OQQdeIkO>4g;QX=qq*zb{%VZBgbzTDh772Dpsr6odUUmv|BI}2 z#4|Pb^p)H^&UWd}&S$5q*mS;0_}pAy<z#0s=l}aWi4naoj{RDBtf$m!+Q!TDdSV$O z)Ahf-OJMK5ocvemP$MpNMg$&KxE&bP473Gd8#hNjME@7#kQt7wQL2LyZFUWZ#T;pV zdMRqXhIx+#85LPB&FX(QL3c3B$^CSzY)rahoCh;STaU~JGHwQ|?STy(NPU*$JT4ae zZ<@A@3^u~ZH|y!QD0gdXYf;hAa<&yey{!3W{foWIFy-GgMINKNrp9@9v_`#HqZIV~ z>r+}@Ufu_N^x1!tfs7m#KR>_7l?cs-_UXS(<Nv?^9|_1HXJ==x_NR^1x$ZS?N<$8O zzKrJz6~%^n5>j@dGFa1dy%>&m^BCJ`r{BzJ*ON_<<)wEw9(t!aX;GL|Esz8YOyI7l z&MLau%1>6|C6MawfA{$ye^H?Tcf~sCUTp^t^!>Tdi>-Duh{tiE;jnvOkP|$*&|bJj z;$eaE4-dk~=j94B8Fq0o9nu4#d4%*Zr!5*)x=jVAsMffy()6j%MpI9>mai3)Wl%LX z+sxesTBQ5*`;5D|lL*%d8V=SLZw!ndYr7I~yj~+n#$fwgzxsJuEnCX6M2+t}!>vdv z-!#hV-dFcl^S;T~A5?gtA?5M4E7;f!U^nvEFSZw~n{N~+V*e8@{3jYXmqMndq1hTM zK7$DV$8QZsiFC!#<xuA|4v`4t|G%7j=$*I>sc_PTwSGA4DDt7O6)Q#X;<drGkG=O7 zRTWjsA3NcMXY|5hJkP(W8WT+9cCro?NT6X5dReANrfNDfq>8aDh*-+$WoOyn-@^rB zYZNEtaQ3RqN>(8);m3;%_;B&`U?D32KjU+ZWwyjo0geQk{+OfOn~uqjtBl&|^C&0U z$7*eaI04#nWvy^y8nvr0jw(E#vfNp#)Y+KR#?6cS=>!+c#B9<yi5oTvhbP;mLx0L7 z@|={O!#dC{?oA?hopdR@af>2-bCMj2wS+@((lvfw?RucG`D_VS1$Hy+pdv1$^pI{> zK9Q@D@`m!)^QTNYUB?XdNsq%<z7LC7I22}a$13!E|50axYEB{S<u*IzeBS+-lT+kJ z-m!Ww>i>*ryl4=Wprm|OAsLT=BY;WC+v)sg8A3(OWeSv_)P-;vrHTKJ&cOF`Q{>TZ zMI<;@jq~NtC%OTI|M9-<`1?mk#=W?|u>Xh2w~)Hit>}-+ys~z>Gi~vWk%StAWqw%l zzTJvJ4JY+>zb(8B2^i64aXcj%Gi1X7shSZZN(7ZADidDb>WEr*QvdRQKFz$65A|+` zPfSeYzC(H$cWc79iTsdPf}Nq<qv2~EzXeJn{P-auAq56Eo}l%Bj2`gg>!*kq-MGe3 z?wP(dl;7eA5q>=1!=tM+=9TY1JNd{zti{|;EUE>amJ#wE*7d3?Jwg6A*SsM{B?|kT zcNoj=>ih1tX;wrvDEH5+)v@0P;X&wos9KiJy!ySrpS{6*;o`R4%u8h26^0ltNUcwm zd*E*(jJm!RxKR9|v2Din+#u4e2nL-IV-5)=SER@H9+yS_X1L=-fV^jG!LZZ2BMElV zy#MpK8r10u=jh_M5Ku(>wq-qLNOvvEaS*bMh%1H?Y-rZAhlS?1(3y?^j5yzhJpRye zErQ@GNAZsl>mn1xQSNSj(sliyDgK)zx@j|2pqmA883Jn1IQQW7dl*r^Huy41P^~rT zs$JGH(A9qhlyS0D)QjS2{9m)+PnBTGtK`|5p#54&-|k48Sw(&9-?Wx7?T!)Da$JK2 zf`cP>7JnTLLO<VA!l*w+a`hxu6Ug$vE*%lj3h@kWtqc&cI1q7gUG3JO-b&tY&d1jQ zLj+c+E`RT6X??xmCCA2t+dkJZ5tt#h4h-((|J@>OCONXO*SQjKh0l|?m0?2>WKtZ! z;Z~-Kygh7dXsCp14152kr6632Ib2#^&b@~-BKybUS>Ed0+3D~mne5tczFI^c9SlUf zg5C&P05|U<&q)DYPrU$haQOxCQ2cFbQ&J)-(A2cluYIl;e<<RVbo0PCZr&Ic7M9k6 z_N5Jl(C_Y<jrPvU_a8sdxgh=hYS7C4>md^`8f%*7L`v&A<Ku+i7Ns)9R|(3k3LDy; zmf5?VUeKL*%F-Hjr$4sX-^=Ip7Fb=<$Cgy9-#a=a8Q4QeL~jQfMh~{Eoh^stFGhap z-$u<ZMx_AjdcGnpZNta`0%?(jKlI+ylL@XdB=o!7Fn}#6(kzQ+a-`SP)J&_U(nr2s z7sh1YT)2d!B=eN=|7e^xlkirdPkNJhz{o={yWRoaSK>!VIwZ_<GT5N}O_OfbMu`a$ z6r=>*oogt*(rjY^Pg5b}5oR9d91BR?{5{FrFCtZ7Ww>$=b9B$*ZnZu0HQ3y7Uasq8 zzcso};dcfGt=<#!?5Lsc%xQ1aP4ZTIGI?(wcadJl{rz!11V+eMk-GS|@di(@LoYRs zHbHMhqF}|TZIIIb7|>rr@xv0Izq&jVgV{Se_HdH)-Mw{zeoi!0Opuu|q1jyolHb<b z@4W;t1fX&JBk>gmnpqcp7GO+k@iPx&ZPsfze;dbZ8ALIdXd0!fYbX5m57#>!$;dKP z))+F~ifTlz&WgInFT;_IjE#+qfJ@HFF-HHd42T;COhLU!4Y=laApY;HvD9a}Z9A6) z?4AwDbdai|v+CDR{P<zM7=ZD%vn!SXIQ8*D)qI8p#UH`{D4kP0SXQ@c&-Km6hqZr* z{24O*>gwjK=_Z~{laHTX=b8QxA;AwSkOGhf;=Z~(-RU^_q+5p*9Ef=j6C2}-7#ZZ` zd@BP?NN70q_E#5Gi5ZUnSY8p!+pYDohT8}#C|Cf`MZIqgIx+gy=s~$`|Epzl?nL#J z*wZ%krO(2I<&p85UiGq~HCQ#D$FibfMJK#qlqo!Huca`@KDIsbUNE=6gk$HxM^Z*B zf@ubB;vQMk1IJeS7CL9$C8cDEISywE-JHg`<&Wx<KS<Q4A8L7+b~Z~o2A2xfG9$!U zuF`&3fBp?(V-bG^drJ1X7Jko6^NoJO4CPpFk>rv$UhxuVS9A5s;&xz0k+OYbsNZ3p z`bg(5;X+6wL%-pP;S5&H3(WAbRWm+=dOLteRN(ZF3sRgz!p`x!BB?RF5d1zbb&76o zjMl{7_k_2H?rn{2&D0#lGW?=lWqA6u8sGz3_FF$o4d&T`|1pHknvcM)byI=Cm?fTJ zV63zHo!LUFr(wx^HH|(k8z-@+W#m<^v*+Gh^xHSCt=A`n>H|JabE?LC;cXmRGRCO( z1w$~D5u*@Z+2Ln-s)tGAiu~oy-O+5SIPz&-DOYHThZsX2a3po-V!z-nmhish{_rHX zVtDzmqR>K~$E*9k?KkhO&OJRIn}Lsz@bH9WePK&NyC<|kD7sFkENdw*6N3&3$q5PZ zL%mNM)rU%@BPrsUR8hMJz_K@Xo!F`TwNVfVWKe)o#xtvn^+x9Bn=$uVhyl-ykC91V z6sbBNt-eNeQgUUz_rW4KvP96e>-@ush4l21YZ|*}wf<4-2wnU@F=f?zNFG;8r{UpU zLo4_`vi~{7_<7J%I{N2hm51--1Vb&0iuH?<#;#=7-lsq|3fdhl&p*r?!h10iXebNx zg@%~I0~Z@&*a^d{^Mg#jRB_Bnk*06!3~O5)N|-tXFENaAMw!ZtX0%VVbkDA)ZiSEF zp!4wP8-3Y`^nc?sU12zkFk-EN3#T+|kIegEz(XAl@F{2bx&50rZ{l8dj!_A&USBCa zYMqZHBq1STV93YCFA5H<>4+c~ctxehJ7qSIKKspkIwDQr#q;M%!t(rdw)O5ut5aX! ze2*lDxNqhb7qcjYQ$j>3j*b>P?!vE@DDm!`NDJ@J*16tyn{W1O@H|aSNeK=P?itA5 z+1atSHDjO-v}2QwcsSQ+efin=yO)<2t$eOaI*$N@5!7@beP@1t|9C@n!|F?Tb8~ZB zFm9RtR}Wx*f^o<@vx1V!%E}rVytO81j*Z38<;Ec~(x<0=y3*3pFTWNQI7`s>zN&vS z&VE<^oo1Q7#q)RK<+XMTtpI<~EYb3N^ZD!7v2u6#IoF5N!$UEMZ(>sN&P<Ktug0q? z+u2S6(oR9zzXBE|BEPe}UmZ*keKjbNv)MWp24i4z-4jYy+!=`|+}9c2H>r&dqy0M{ zZ08%$9;HXV6>42f-!*KJ%~-VhawRJui5uj#O?1&Q898arns3M&9z!}DMk<uyBx2+H zd68*v)I49%2eVD}X&_y@Hf;Iu8|UD@1b<v-SkNd3sS!o^q@5fo-4tmKZ>L;aET77K z#y-%*`z1}>1FR$08r-BG4tss%JdxsIGlC~kr8V+Syj%24EAliZkaUO-9~ABu_tOv2 zUmBoW)0Gy+R#q>+sCDr>Zw3Seyn4Eff=(~_j>xZm<m;O!hM{~4qM3;Y;|6(h@dRm$ zCv|&`WKV2TgEH-5-SMc{q_3ccu}^I0FqXcbQ4UfDGj6b^&Qy3l5iHazJ_XA|S5?Zc z``B`nQFZnCFu^?*jhS*o@i?8Vw+{j$Ty~~bx|1A%O?O=DXVWUre63w#J`_&&B&4v` zWh3U9{LH2ujqW!qkg<Ny7&4cTmMjCyC=p69tY$uM2QZ+)Mp|RHbQaA|f$xafbic8J z^rHNMpj(ua#$5T=uK-6;gdMIZrU_1dd!Y-fY<Ae26RJ4??So{5v8pSYMtX0q!T;@B z+6r*bXya$8uK0YBsX60=EtB!BUri8R-maK`GR8doW=OGmiJJ1gqnvB$hj}&9KESjO zCp3?glYAf7rmi+xD<RYfw)T4He^4hdarG#UQdpL%0UfzU$QLWHD!VTHrY3D1F922h zuvK*H%vLyeZ!NIcC+1G8=f&{`jRevaw+Zxo0WHfJ9Y4o>C_5y!g?5)>7ocCgF^}ap zhV3yU)6*%aRqQZZc#Pauy47o)w|+Kwy2h~(2{qju)Gars3Alz4F;QQDpb=ABoHbg= z)5S@yd!X|LnLRrB#`V>uQAuE+<eZoLP?DbFUNHTOWIk)1YCA(Nfao{|V8>;EJDEH_ z*KoIv-s&i@iSNcUNuO?`qrF`L!0j!_*n-CQ19owJxd+~$aW5FsDu3mth0+g)9}QGj z0#H0G9pK0Et)@L6*oF$r$~Y7joW<b6CZvSaiI`>wX!^S|?t`41jN<@`9nO=_376i= zfW{!xk&%(%Cn9U6@LB(?FjJHfZ^hD?@khgL?=99WlVTux)Eg>Qn*7*)40e|Y?}Jh^ z@5A{=e+3r44(K2Q2vdT7@o;x%`Oe}2Y;YzrVpgN!<!Xl1^NxeZ#1!8U&a=purTT(n z65fL4fMA_sIo2$Onpb{ZI!!$vKQuXiL+9nP-u4|mmEW0Pm0q2-uliSK;9L{#0fM_O zjZ_5QCW2a~ukW4rlGj9w>JkjR#Hxg`Kr5-I&~#1I3zQJ9@VuhDXf;HUR5199)k`l< zcXXY^7+@<227~_h<DG9liCYp}Px&<}m)YoX<*O~YkF55s`?1o*WqgmM&@9xsCxp6! z#mdH(rMlpk=VN||#Q(@+qL7Z95u&8rt_HNz#m=cYkZKX#{;76_spQRD*wF%N=Y`v4 z$bRmNlqW4{vd#GE@?}4=TbJ*LSTro%(BZu1ci9e6=yl(jQa6MzMMA=yv&N{fFfi;5 z4Go6{4?6+G7C`3<){)Rui`?B>OaM_I{}ib#xyl@;2NC5i6^xx(CH^Gn^^@EblaUee zoAyw`j!J-=;uEg+B%Ea)v?OpCEEeIjs=Xx7SF2JWe@^G>YyG!xT)}JhnK_VF`^l=^ zPzYyS`!q;MpmfKNAxqJ9K*%q-){IXVRujP4&(N@_TfNJG5#Sc!K6Cm+-}Ia5%-qr& zwy2B(UtByrnV>syQIxu0-+CxDLA`6_d|j40!v{H-AiD?Mk<rokVYKp&qF9B$GKG!e zZD;BqIcI-%-P6aCrhSiRN0m$U8eK^B<MZegQ8<1yB<8Tf{fItMwtE10FZ+;8@@Q@P zaA#Ln5@oIm(>}5MTsYOh-IEYno|iIx$&b0(2D8K^8Q}N_&j1P?*Bisv8A1L|83l7W zVE~nfgF_L&hS#+BK3CCK9hl$qfK4gcwdgYt$*!G`^4SxcyelWBNMP3!8;EDolqeX^ zmVCF;HYD|$sJA<wjYWb_7AA_AJmb*$zDdn=rCWAL^swR|dV$eTB=s;h{x+>f1!;92 zp4-tOx#d%uskLp>;^w+DeC>lSgI~NLD5v#Z=GYVPo7lf=tJ8D!B%50MNSeuj-T|T{ zFa4Uc^kt38TqK|64-p}dxH7GxJ&<ycAN7$^HYv>Q1*pHW@`JoYWoNWDx)tf(AS&W; zOFktlox(f@S**#_r>oKunCd(wL3h%B$OKfj3vnvRuv<@m3j}f;$&)9k@icF{lTM{6 zf1G0#tprud(rHuS_qy5jp7l84l<O9aRmk$AmU%js3H4?T6URRqsaB?`dGW<s7WT~h zB5tO+V@$oB1jG5wLAGQf<pXP3*9#GR+Eg*j`$RmwRB@EAmn}v|<{CV4djW00&V9nJ zUmMaraTuIYmNA3y563Z_4$|SJKC80I?*sQ_MM9C4%#UY26;D)>FGiNBqMKwm5%E?# zZDNSP?JG`aA73I{UQg)I1{g9P@O)7A7MoIwcvuAZXZj+YzC*O4txQPaq2tA|MNN{q z_~wJhmaiK;PLvw8^!2p!-~mP5Cvaf-60ym&L`aA4gY4WcHHMd%Y5MK~bCiZsHL4jt zhuZ95dGfY$jt4f_7<CHdCjs`8`b}4-DV^}0F?Tb)I+uG_7~KQ?k<1XSspjT8TXN0; z%Z?GGk1_MHu(1uAG)%ZLSIqV^TO3kePsbek2e8&4jB*myb*5&o50)FY4N4Wn$i&6! z>Nk2l$lq^vd9_Z`tq2@*2JPGi7B#Mw(raBtF>F%WBBF5BsPW~IFMm@NQK!h6@Hpvj znm<bpy=6w`us_{m6%P^9PoXyo6IEurvbbbE+m-Pb8FQ7ie#dlpiwEodC{-Y;wob7} z-U#c4Js%<zod>KWGx>tgO`Y38HY%Y#GmzJ+Rd&pe^Bfd+#exRbRnbW^bNY}lQF7B` z87_#B$8mF3v~oBuC9mquHT+01Rqn^>6p`i{+JQ{S9!#Iy(|?<R2>tD~zx2!v;OaPR z=e%HtfKC*1n=2_S>L19Jjpb#}^}ak^SCoRm+<Fz2UMY3O6p8(OGyZ8T5j&VhI-;HF zbweopX%<|hNzSrxh$fEm<y|?U9>v+Z6d70xs(xaVVNQ?(+0eHyUs{<2CG-=4wz89r zeOT_iJlhKn&xJef4x?mZwhLiqV_V4B4DkKsT12L9GxwDqRhX>j;mc^`INABOx{$V> zzD)Rx;Eu2N^vGGTpeBRg0G)3##B^F6|IH7W%BnOgjb|Wv*{E3SjY67SoDVX60o!}k zm_wQ|*w6$P7`C1fY8;c)7lN2p2@F!>CGqv|riR)5ks&bA2W|WL$%vT~+RwvalMl<_ zA&Hc6Z#o5?H-Dahe;N?4_Tos~(<iuCSVSpJ#a|kPRbi7b`xP`XOfir0-EHlP*hV1< zYO+t7sRZ4)h|V!OmdCj&FnpE!ae2915Hwth0L>^Hypq5!)j~McHfA2p!CvU%!pcgx z&LC;yLDXMKGF3RhskoF_Am=m;;R&k_09nAKo%b3e@8S;rkbF@W0NstWnTi#uB@}VU zzGS;0_o1AI=i3)39(qzR?K>ujzHBuhrGEAXut1~<f<^(Bo*c5U=uNmeBZN8;&0e_R zlqO>#19rsqkP9-wfpwMbfs5$E+o~7ENyp5|zz7N5f;;UEkspb0dt6<_dqFE7@joK# zX&)uBF6>v_G={oB1*h*;JXYV5LDwIifZru^*ho;eo)<RlHD6GyKRlu|f)bc{VrYa6 z+B-XsRWBQig}z$B!lEdwQkKs<%;Cbo{TmI76A{US-@gxVrSZs<vp75PbtH^j2EP#8 z=z{1v=rF?c(Wi+vp;@1f5r9Y|BL0AVnXxU!yqx@Ao^cEpmaXMGj8EoO&NIpCcNEFA zJaah^Dbj2~L>bIbgFW-4SN=9WK+fM>0=TyWarGO@heQEHw8zHp*zplxzj^acg6$ZK zLhz}M-hJ%}5Qyq-Gi7AL+rPs@US*{TsC#<0n2vmWaY)C?#@f;R_04#ufeMtKA$BKk z%0SrS8%Y2SEP!+egj>c$UY#0;hpLQr;ZS(Asi`Ubg^yL~)YuiI15T>}Rcg>C^7>hz z9pE6sIQ9N(ly=Zo$7amokzj`vN6pQDd7S`XIT%yE3Y6EyQYpmK34kwDY#0G3LX*e& z2fH;4SE=HNvlLz}kv2Gw{G1r@wyy_If}YHEfiP<oXU_tL5|jK@;>G=S3@}tFG8CWk zfdr-dgGp+zp%7ToGe`Pfr8%>?8Fv|aG5Vj4-j^Vn^ivSTQ+f@Zd*~;m#4J_hA3`<$ zs?BLxsHUc-^jEpQ8eh=L_tR4`#%Od*u`oh4lGo1+A!i_L`M|19kW-{q=x_sNWLH&z z3O_jVXWNKYjr>e5;KKWu=W3#H?NQ64Jh?)-t2lN&Qq6!U1~ap@$8W}84}4+{3BUT0 zO`U^0cb=GW6SWhs1@q$$5?cQ(_kmUW<MX7&`T6;k6%$L-AhH03(XTEJ4g~T(&tcD^ zs{0i!=TIvj{gnaA7$fe@HG<sZ<xeX$=<t2P1R4Z7f@;SFcD@e2S&zU=_q;kUQMATH zk*H~L$l9R)yBB;4!g$*-k<g4vtZl+CNyHpFSb8W$Z;yS2Y2<jtVWMp0^L|Q5j}TGw z73ho51AOwt4x{gDRm&JIGiHS^hzDVb%9>U_!VL9jML_TqYZGNSr6XZkv`XW59vt}w zf_%cCH+2-j6NQ4jYIGa(2uU&qO<4Q~&5WOsrzXx`67dIt5dQ*uGskhJ+I~|MgTrXt zZPcAuuX-+Hx;Wdn9f?}yt;OQc#s*KxR07t!#LS5TiZ)!xe$PQ#6>TLsINB_Vl$Rd) zIM-u})YJ1(@!gxb;4Z~<ex}X~7));Sft)T0vziQRxNf;o2c`wIawrl)njs{wCS(Dy zll6fF2;~;4Ov&FwPaeM8<*weO!^*yNbW=vtuvZQQSQ-o2J546NE-$s8K=(>3`k$X% z7)|;i#f#kO=o;9m{${#OAs}zFm;T`wb)jBQf4|LQdnn|q#Rxzh44|-%(b45|F7-e& ze}@%`T4JX}1SHhVB3v;gUV3MH`;Ey8hQp4-<$nKGVUQ|yM(i_-S{xX?_ERs@pH<Tf zL(6&V@Bf*LIF9-?k7%Fy&yu9j&@R}~8rKfUY}zYH*tJgA=ZufnhYqib@Z<uB^26>i zn+`;i8;Z%$iPOhz%}SWqnf9fRHAv%zP>}9|g!ax6he6}ZP3b8$Pz*xKYwpXo)YsRS zcb$u!>v08lMEhYd`NdSS9Q!A^uu(ule*TQZ?o3Uh&(R0Pz1WCiU%GwjAZcMFzGTX$ zc2u9H`sWljad9vnK%jzelQV@EY+GaK<Uw4}6>C2n#VOwTfWAF^qyWYH>caWh|2|@B zF2>~F$gUC*!fVfk0S36HaPuz%<%ppN0MzBB$AdlETrYA=x#o1KJVZZz6-`NBXTjz7 zYM{LM`?gXsd^k(j0{(2#fr$`U`$ZT1hOpuc)_c4`Hb^V^$yp1Rw3p=!0*_87T2GaY z^4YrXc*-=m9f+yNNS*p($K)d-A_64WWH!S_?EC)lv4q0p$iBoQ_6&-oRFvzP3q1Vj znFoEs=o;wmhli&)xVYnjXW@~bso5W3*eC@z9;l?I|Lu}q0F*eg$w#cTgZISu9iU?v z{hKeV@GnWyC%Jd_8&ZUOPgTU`F}=@?5Tn>_Q=Z)j7-mfNvvi-k4ZVAc*x-4_u2G@| z0{NWmMa=Q}_LL{KjW^exj1X~DTzaOzvlbweG6mof;+S&6U>KQ)M`IffVg!Tqh_?C- z(_BZ4-`Y-H&?WNXIIf5K{Ai<gk>Ad?;njYF4qq>Au~u$~Cn9*ImCZrPsc{|Nl@}9H zKUWe&6R^%g^9jqGcSL>FEdMutMCDgW@B7-C2v>~-Qj{F#1@O_=T8L#CO_I$6{gdCX zUW$!eB?ypH`Q3=!nf9D**r+o+^b_xS&a=&+lSC5HS1|=2Mdin(V5CZg_&|rG`W8^` zk}!^#c}V`lgG?!il)~4yOnT^DMg~uNvTnfkGI%b+2&pT8&x|Zy@ZCtV4ds0X#Dp>o zwz&7!R&c-Lh-7QL%yzcc*;!m13CSNo45u3-Xn_e$2VeeK4M2Xf1LX4}@1$Zw8P-+3 zhoJuq10Au<puiYvN`7Y6i`zlT#vrmH&C>W2z)cZp^-9aqEcJQ+Ri=~ag?Qex2_OmC ztAIn*S|<xeh^VNj?10f3_O<K>qPw0lA`BSqOpuB~IOnSL79b2|7X&c#;@jFXUiq^D zYYqxT^s3zs00-0A*$IGyR{gaJUazT23&PIG@AR`*0Mi3_4nPILt?455V$&BXe8A@b z$O(N&))1P0OAr5b$#5Xz*#Rhv*R%g&cp85eJdRmUM^RBx9Ok!L0YDaDMdmY>hkMLE z0R}AU19GkvM<;w;WlpuTo|qYOz6tCY+j811D)!VKF{VF}%edBc?^-;T9^jHA<Kr9v zB{|)mlnhTB@P5q8`@E-&{?mUg6K#|SV!lFJtAXper)|qyl$dK8CP+(5ixIQAFwodm z$YzV%RnwL#1j2U9kR{&%H1bE8>{!h-u6Rm#!tG2w&vt<mu&n!L%>vXsQ^YT~2<N(V zt#0v`da2G=<)u#RsY<_xyiT{af?*&<!1g5haR_`8xZ&N|I^2g(-Ijkut1>7iB_}4Q zq!^Ev0@y|8SG@%g^U6xz*e_?Nzc->UvQwgngoH%#2euAMzd@hX0Rub&Qc^-fe=80+ zdB_f*eiO9ejalj{QpM(2u{g@GAyqvukn}TzpRgfWY+7S|HB@D&ev>=Eaqaf!TV!MD z0XSF=;4X(WP$${?_{~qN>5qM&{&1}~$=_$>b7f_KkW&gME?gT(Un)a{J-PE+jZ>{? z^JqIQfXIdof=s&OIt=_f!tROxI0KfkyeY^D6Z^I2MyL7_GeGK8#6_mY(kAsEr~<7o z4m!+ftE&wT3``UD_Gk~mk7rRI9_gXK3a+#KYANJ-&Fy)*4XXMke|?rFcya@iS}Nw? z<~{^~=J^wj@atot_Yq-1ngva9jW%9CH(%X9SU~D%8+a>a{HIpQ@F1SsI`wF<<uwtg znvWJJ`}=Txob+B0y9K8J1t)v)V}3k4wi~w{frW(yT^QtWG1o`o1?h%OIO2kl05;z` z%!5k;U~mM~GiVm;jJ39kY2lFZVcj8Nf0=mLZ0qd;in-K_)yaiCMyvGKS^90?82i6f z2GGS_91K|4hy(Lq3hq}X+1%c)MsZ4Wby6_&3edNR{q8a%y69BXZ?-Di1Zt`hKG>S4 zw>+k_hw*>d2`qgEmjCMN?AN;+m9>EkN?n^$gC>d;$Ae$yDmN&XjN8hSUrbu?PTr~I z7#X1qiz1=rL1PBKNVx9+g;Gd-$_3vTAwrFK_>4gRtIaGw3RzxSt<wg97rR<P6u{^I zbo94;r3fNb=BLvUIrz!>XH8W2eyJGZgQz<!f~q`24-olt;DP|C2J0zS*6j1e=X@a; zn~d-L^3trCqu>VG1=6?^()*y+lHL?-y_cW_E`d$&;unLWOHi7Ci&0IhWEe6kD*YQO z{?9w4y#UQjcpE;f@Cc42>~l8j+Smw{I|{%4o0mdIqz^5=ns1sVjVzu177c0%M5Jh% ztvJ$#gxnt0M(=<!RoU%~h#L{JzT|tN!mDcoGz%;_-W=W?TiEY3p%E0}s!*j8)W<H3 ziv*;q<WKGHRF$c1sNhlxk3OY?JQUDKiKm1xLk?5A{>m>ILqxjAp!fH4GIb?2WvH<K zFn19ZtvvCB)(n|DT#$kZ9+&M2K>v$A5n=q%m-1v}KV?3J;{+%~PXY%ex3JUVIfkpN zYsnd)R%o#eBb7h%VIG1Sl}rbGoUEk#WMsw(?p6?H_toX)fPP@d0GTn;J4!@X252)W z-=>=l)qF$u(-I8s)$*_q*fWpq0#0%KZD363;!OsPjU0&UruQZr&|28+w1nAk06p`N z{2{2YK0q5=VbKIb`)tw!fKb)K(P5BDr=_MTS(CYz%S2NHRtSV!exJQ43WYStk4Cb@ z(T*pkr;UqNdJ>jmP#$(Yw>*cz$RSX#woYt-?+d#h=0-+FI?2s73)`TbQfk#W&@Hz2 zrwK5?=&MA@p7~$mJ`{<7h=9bvA~hZdl*vZZxvocX`Oa@f{Rom5?~SB1hSEy?Rmtdk zh@OjgT4BwC1dVfTTgS)n@<i-C9d@blzm`X?)PdDddfen^KwAek7dzhNI30aoertOZ zzyCs`{9EH#file_%LP*93iHj;LLSrJX1<&s4FvKO0#HFfN-?$~HHb+Ffq5t{R|g7V zZH?pu!pxmh!y}GK)f5)CGH6H}iU06q0CFRe5H-#Eva&#BrF;F^M-6Csi{|$T@`c+H z=sdp=#Hnig96vulUOen=FH1{H=1CFdu6Py_V#%NP!;XHi0h|C^9rMGS{+whOakRpM z2LJ#b@yf>jAQOXG4Ci)H`oN=k%oHrtTEtMy`jat|B)OrmL%MntmM+wAfHsOT#A$lH z{lR0j`~%dh_w*_CkiJdfy+^9lhKlnr>WQs>SBZ!pA~0~+vM(!PE&gZ)8nk8+C2e`~ z39sVhV1~VssZ4(v+DuNwbNMgo#jlI5?%T_A1kN(miX&P`f#QK&vhu7Q<VsDLC|n9S zp#2om6Ei%z7*oodO6?zGW0ESyzzK{O7>Y9rR!^kXs5zi5qb#7h<b8jX8w5&nbNtYZ zoT*gnZ}zjKBX_gW7Lm5=oOg7xB`}5vHLJ9RIzUt}Vb)mhe!IVmHQ4ME*>w4M0}hee zKE6m<v^(El7+&Gfsg%(Yb9poU5nF<J!4UXa#Z<vZy;j!NhOu<=#On}qwF0Gu@031q z?b)V%DaI9!Aq+cHRU~OzL}5w*p^ZT$3B~wcP|?u7OQu!e{%#fUNCC8Tg4&-Q@|Neo zs!A}lR(PK5jsdtIgb`usOse^qJli-N^Z~(9c%p>>5?y4@6qbF&AKBX4Sf;7?9)&XC zgStkK(YoL2>G}{2*E9$=X`PEf>B2;BF<6XpQB-Pu`zPL@>a8mHFM3Id7C}`tHaEq~ z+BlF>a*mZ>64BzesOVb{`LO|YW?naLE1wRptsmv+`3}d`v4Z~qbcz-K!Glmc@|Sub zXoxO3UhUgD+ndwY)s_G9926Y~G6dsN1|_+@zt08#Svrk=E-EtsSl2AmOv=l0dAi7% z-PvNbLIQp?02c;%dV1bt*1{7C8T(x0O~%E89xtk|HCGR7PyN2Q1?RP$dnh!aBaaop z<1u*xa!qS8MMVxLqwS8nB=T{Lq5aJ9EP%qz8R_p===GPOSa!_9d_o;abt3Xg6tYZZ z#$cAX;8A5e9g!YGCnq-8mZe3vQ5*tOW>e1F1o$}B?7UH_?Ho~!1)banBKyZbf<`!U za4Vo!7qW%A>jCEe3ZNVWu&ss;<;*W7@_-V2d#=;7ysd36xBl{rQ|NjsCsYt;sK%=U zb6=F<<HhA(Q-?v2IeG<v4O_5q=dm%d+SRG5cB>AWLKT=H1crRKbsx9YHlLBz3?XcU zfma30@OrO2t>BIO7*Wkn=s@T?j6E^vf~Zpj?^Q_%^dpEl)KL0$>^VRE!p7_k2cl%T zZj#qMwfFcfJhJf_VEgp2mFd-?av?jsI46upq!B{Jx_{>p*oUjxW}B6TPkYlCBGXFK zUi)_%_*~H)V_Mj9V6T_~{+m<e)pI+$axbd5Y+&e@h`3jV0J|YW9Gemv-fw7XW5a%N zwmbW-O(jn*Fn~5$Nf^`ma}~*9Ju55QO8&f==}GPM*bOrY9v-OC_P10oZbhhhaNUPf zOw}keDo|^$s_ut|8^Y&Mu`%)ycrXh9D6JpkqT?N?<w!?<n9iKdGM0W{s-MH({Xq0w zY?KfOKbXF(A^<`aoe~69|3<O}H^*E4i)&+yyi<hV-FEA;>UAX|WvF)0%Udh{)X?y5 z+^{WTMlC$ZjqPk>ybI+e?@J4yhJ%<&b)6$4s*S9OraA@2w!Co}RvweQa=PMnA_r#6 zUWQNKDn<zgG7q9tG8;4sn%Yce(_P@R9f`+M+7&$NnI{qpa#+)dZ+u4DRP0%Q$b)E> zA>^Z9s`EHCkZg!+2v4XTsYMcRQ7(Z!TvdMTvPr%h_d}=1hMxc<EvuRyaa!Hkc1wW@ zoxFERYa}OOm$tLz_=g1MR;HI$dEG^JADc|!f#O!;z-&}J*_0diC8oG;Z);luj)6_L zXt5ouJAtGdckvybdLYH<ji}w|&UDoZoo{>C{zKFd?YA;0F$d!p!raU%>oS9Zc;*4m z*`u9;jHZk-kHfe}6GiWVnkebFt$$U-GRFHdZ!<Jb;Z_~1Z0cnj&_+oi-#?<+K(#U# zKqys(?u%cK8#XQGAD<r(4zD9+toCFsbF-I&Lo$c!_zRMN0kf9_IZ2UkJ012DE|;}W zdVrrO(kZnB4EoARlrkAwr_2wrej-!x1@rLFxNQ_+tpZ)l5WMG@_m~6xQ0@|ob)<yF z<LT#mh%!Hj%L63rLR<j~8x!P5Zwv<lxzsu>gF?GH@)V#YRq_xaD%09nVD^{@U1s8B zdze`-7CiD)LG*c_+l{mPaZY<>{ZpP)qHf$}8g$_#ZnL*-ZkesPpAd#rJJG@)(S^F> zxdf_~H`7*6$Q8X)zrx*#*{qfQQPh@hFk$$jq3NX<QS5S1ULKuk<{=Hj-^X}}6z)u` zhm>cOmh9*3>q?%<%##t~bq{=+oEf|F`?f`KY_JuV0if(fX<llTc8%3v=N0L~BQ&4U zbr7zTn5bntQVe|53-w966@gHAzs%u1qlt-p^&X8cyVdII;;h)>bwC@j<qDd(QtE?X zyky=_gtgM@&T0cg%bV~_eI=U{Q?2tH^f0;f`U1{0>60+ix%!Z7zaoDxu3jb}DB)O+ z1Fn_)WrldllTW*(h1N!^ls;C0Z}7VZw#IFPupUrzuMQ^hn6aZjMz<ClGkGZ2jf>jZ z-kDADIG5HB(X0b0G{9)<bB*I#7{%yM4ZV^Ju@1Vmo(x=jZOM1{#6#kel9D(_2CK{4 zPqxPGFl}{AJ-dD({e{x{8ez=ia&C+JH9XQUTnfIo#Xt^9XwQElFM`?_@-s(_JST7t z?8Tk#f!UNsGJ49Vm8^z5yS7&t7aT_h)out)Ib?j61<`v)2CHgQT2|T-ZzNuYs-<Zi z;vJ$WfE0Y9QeGVPfY0iFFO~NzLPs^@PHpAn`yS{Qx|QaB7#Ts3QjHh)j(9AFX)T~b zzIJLa8wTnMjtB_}$uf5GiuT_pX0!&Xb3p*%MaH~IH6!Ek>d`i95NUtw(SQ=vWv?Zm z;3(GNTSCG9d$B%JoF>nkMjO4cQ(ZB8kfhU0xmDW!nrm%s9Us?h-w*jgU2{m&=l@o+ zJeALy^xGDJ@n`G@{YFik4_CXBwm|VcDG3?DLk9>^f+wZ+D{yQ^T<SjSi@x66XOc_D zg(K^lOb}=zX}%kvx&FvBYG2H^y(2Mn;oGfqeadR!a9L*Y1e$UG3{KPNM^V{f=(X1O zx^FZMBcGOxOPm>pu(OjR*Fmb})2^Ric@6A)ZY<IT#qL<!#ei(N?EU+IYVv50x76uQ zh{#}z2)$4;xshJHr%FL!Cb;nPeWB|I_S!1rEq~o7bA?Z)26w86%Oa46gFxzDsk4=N z<bbF{a#Z2oV+xN5T8-kPJay7Gxe7X|?gZr5Gk*SV^6Hy;zk=*o2^bTTCKQ}=(r%E# z?i~ch9x%H~-J4O;E9zCW;iM2hQLfjyl|5`(4k1)))tCdJ@stJp+5L)<6hg~6gU|zb z$J@ZWrtrr|7)npyt3tU=<V<>T<1$8Hdm2_9gTlyVd73+{2Et==yVKunrJDx7N3q}L z5;c>*e2SShfhlEo>>gzTP)q#uE5}p(w&1oBt0eB~;gNjxT5Pp6aFnXMZ?F-1#UJny z9NNiBk5S_`2PrG5sgaNS*TbcJ`>^2u2%k2y7<o<@^Jt>!th->rG|h)^V-U4$t=2_w ze5V*9khT?+pQvF;>zU|efqf}~N-R{Tb3ObRx+;+`JjUd@QGp5_eu@$-fKW#2tUIEx zQyPR@Q{~;W6@{ng?RrovL)C{~-XHmr|CMerhI!f{k6HgiIDxeL2j0v2{422u3l?2I z^{=TQwT=zu%c8>NKakOewXALwNFY^k<$V8<R>fI`w_>AHn4@in*^1JOM@qXh7ok98 zDOK>^GU?`OZ{l-~QBZYa2EKh=?YoIAFZZLl+W3MW-{QyuuU5D?MPW79p;l!ex-x!- z%<(8iu_ST3xZudYTX0Z!8C409>tU#-uy9dzat8DQBRFI(diwnQ0)(XqS8n$niLi_v z2zJO5`5doD&p7mLKIUXG$Pz@%dn^9--945d@ofo?@$a1CC!5UfrS?mm(aOqzD-zdw ziqjJZ4yg3J!vN>_lwM<8g=EECG}JfXhoERHCgbslu+&*t@9gffp9TC?l`$xV_(-#) zBnbC0tR~zf!@w&4dZE!pebBGL&`c5X^=YJ;8(eiRVyp7`Q<kK_Vu4t$hzw~HCNjn< zqMZQEL~Z)RM>bY)JJ<v=+UVVdxYfyXWl|h-EO>jC6+t+iS`VGGmT3lO#R^QC-s~;z z?wMB8Pn*uTcSskB*E6e&^9TqZ=^29x!fhX2JV(TQM0I*<ltx*qA-G;omFe6)5Q0y$ zFW^zfUn%~`0Nr3Vyx>OxK=e@(LeVUVXr`7+y0jmC3+cbUx_BoElIr*A1b`-#kd(d| z)wwsVnk$39{N#~zS4)c_2!^SdQLhSMUT1T9jDj*6%sFL|>8+BOwiD$D@zy1_I^r5) zk#6lKo*nevr>(<@N+B{z%JWFam?45A`7g#tM%tPIj)B?2d@`vIia$F<%#{WsN=iz~ z12w*=1s)>xfLLK5O#t@-!(}^})9`JG(#6pLq@%#XG8C)7H{}V*)ZLjjGE|g;4#@?h zfs~XSM7~NA<#SRw5<clR9P_M4S>T9rv&~6)9QDTl;h=I#BDq@oB~*IAOh>g+4W>PF z)L{*?j4C*N?{~5}Cg8cc4d81fINHhE_UuD`$ZV}^@Qp|?5f9g?tXs7*cFwlP<TU(P z^$SVA!k>r_I0~S=_p5Gi&i#|;+R?0lK=1WsXh#jM0#5X&etdQX{Qd~abGRw8FG-Yo zK^l36-WMnR^T=mLA8K8kw42x$$5=|;js|53l&BCo;Yxe}i_yu4JMB!}gXAfu@#i($ z29>R=n42?p<J=t*@d$KL7A5cHv6~n9{1ZgNcEl*DNN}X(;tYrnyJml?(W@b9$p9+< z`PfI|!C?y9lI#RuaLBod$*OZ8uIV#kVq7H}FVqBuz1E{VrtZHEXt}c)TiFdtKa_X1 zdQs7+OhWjW<%0v-F-Rv4<eV%=g@TB3^7An*-_Fy}OGLl^JRrb-mzWXne&V`At|UN+ zaFE&uLh=HKsXv$x=VIiN8E$MXseZH49*PVb5zBomhcw9v%)@$cyVG)r<pzj|(JQPb zzfg~toVymqjJr`~J;!Wn(b$`<JHxxu`W)p!<M#0FJtyX_Cn0)+nE?;<qe~d3us6r0 zk%U9sXeW$qA0N+iBOxMo>`Ma_!r95Pok=#f;*aAA!1U>eP|>5xN_`}s(qA8EdG%`- zS0O^_(VW1<QBo&zX1OQ|rjV7F#Vd$}{<BY7q~s3@QT8aoA(CzyyfS#|zFFX!=ggdZ z9fo<rq5rRWDJiM*4)3K4=M`@*FYn0r;o-ONcCGUp<h;ytyH`rDs%&O6ai53$8Ujb< zr@@(0(Fbe$3=5<^IU(4VL<y|gm|xy!Wi3?OFV#0R{A%=mw>a<^)cjaa5#?F5<5>yJ zfvh^aBaHeE>SMbgT*`?0TtI%EZOpEH3um^ti@SXj80fOCq&^f)0g7iOU%iJ~cy9+s z#1#MldLT(?t!pU&6O_EqR4E#4OYCiIFolaP-Rc7p;ndVr7}TmK;+^D%DY`WJ1F_cR z8GXyWsjp-?RQ!6iPKA2Y-wHg`D$R!gN|#d`(TN9&jkk{idq9b*X1kK8cPsNdVvbL` zRqSH+<!b^TCGCa)BR5|&VM1~79PAMQ%wT8?g8*-5>MMW<k)JcFMa9oszQm_ZB9{}Q zal+ihChkzvLW%W1ipmlPb^Ryj_AeDC!&X@A?p4z)9H87k=)4AaCxRCssK3A_{$gpY zspoxG<Fv<dh`l|6D1-v$W6vU7hqVso9UKtxKlMlUr`GZoWN5FQQe3($l~GxH@C<1Z zD4`-m?|hA|t5rQ6f`X$ZmFBh_=qOR%Sltgo_}RM8h0ibaMIwA(QpE>GUkhLxA|y#D zL5V+p>Qz=#BXUU>J1`3u`~FlykF@4jh-S-29W6C+Nc6N<3HAdtr08m7?G0nTLU0V8 z9VS?o%hN9L{gp+@<>rdCaiVfFT9-{^2JLXPzVW-C?J1Rw-bcjL_uhK#Cp$qNTUdy+ zSxqppva&wkd_E--ZayRM97TxXpM$f$3IuMuJ0?R_YcPs5?<(6+JNpmvcvkr&elnT~ z^Wtc|p3ab86+JluF8r|0CCO-zCgYJDwdu`%H8>kg$}Qz+#M=pjJ%H%PzwqZww7o!3 zJnIq?6q4ZW0VL9Lf1++8O(EtK3F&V~)Tz8No|fu|3e`Vc>oW?{^w<#W`t<HchG$Pg zvXl860aw%KYHAmaveo>zr;*RC%9fzLr`hK@E6A0Mt7s>|(W3q_j|=XUI2({=tn6<+ zDT{7F4!>LYobko`yWfqEKCtDT$mdiT`Ug!oZdTCea{X1=1O5jC0mL$~w;WjOj#)k& z+kBEM4B9C44gAW6mnh$K$he!~2{wwevyHQ!zC5u&GErX|3gBM$1sG_|0lweb;UZh+ zW1G_J6i8^;z3A@U6JIdD;C>>(RU2v%uT=ih`IG(=UxWg*?lAjLqyg|Y5h77}&$8uq zdy_>c85)SviGE6cU90OM&Ka#pI6x@%d^2Q7AY%YXw0gj3mVf#Q!*K9CAH3W^+S|vA zly2EIbPMtjhGy=z6qXfezPgr%4zzh?+?-i(wbA@qOT>1BO5*ags_A6GGws4AEFY%m zqMTpm?|p~#X`JovpDztS%01lx9|bV1AnYtaQwLfKTCCpr<Cr8k=tqZ$fUBRZb6E=6 zt={&XZ58@<_l*ANW$tEWv_c`SiRq!TrxkIF%Fi5&)ERhD5|;!YGnDNlJM;pwD+TZU za*y!+%C&rKn|jjc?XcWJ0yb+h+md9y#<X5Wt{VpI58G9Gp6v&T@d=*IBL$3w9vSQn zHAZO~Wt=;sIQO7xfoU~K39aav+bTb@{7v=vC;HRw5%vXeq+P5Z7&SgdV49XcJ3aN7 zzqh+YWL|%?UX4#URkbl#aE%*I#=9|<HC@@|lg7=5UF~|)I3CL}A}%IGMHwhALD2Sy zaZ=yqWs}3vPiKMIZLjNh=l-85T;Y6WlYWyn2DRb`YZW$8hw+p|8#}}5Uz?t}7}P?q zI;*aoSgfIH&d}5C2i-V1FDw4xEObPv&WDQ0>0KE<HE>&fUMW~1`Cd}ZtKspfo|jnB zp7C*Rg*ojs)06Ypy1i6={y}bGekwN%YqCE@gw?;GGC4tiY8j@I+Adj@(Ehk1>;cPL zkY|6dXYuu-+`rhMl|E7D;2M@2%QZAqW%^v;SHlra?8tkVa^`+uKv_OX@8`9tuNcNT za|}~UOR-N9P{Bb_P^&dr^o|RnWZIury)WMOF^SuRppfoRb5s*nV=c`xLdJQ?YK_o2 z=>93?m+<Este|(F(OIS{P03aVVjgeN#lDH5KCa<uqcFDBnn2eaXP@?+&)`U;ZNrIX zf|z2$UkW^Z%4;)o{|QM-PzJ<R!H;5??$0<wi5o$;Dp-|IpRBR{aNuN|FWo`F>})@1 z`e<68!`AaUKmWzz0!Hv~uZs8=iO71@xerz`)-oSdXta5ppuHlSB-k7K#z*GIZNgo6 zFCALdi+3L5ETMZg)Nh=^-?lBKt<~R5dAw;KzS~q<Yh}7aa<5dN1u_&JJ>D59`5?(G zf%OqLqY@y}*uCxQk2WvH?p}EsPzcjfADn)ayWY*Vz2(|s4s+z4p;R5If_C3z7O2I< zx-yzXicKLn+dR3yIFOS0EI$AoeaN6T_Zmh>0(o+{mbF(gCv*Wy*mu4YLomWodaSkU z$Q@Vv<1d?7AWzt=D@?n>Ca?7xL%Rpe3bnXbzN=wSvUj0br3wKWQqcWq@!QV=<+lC^ z0cAO>zlvS_)bPvgJ)c5POxj^3&sL3=PP+H(vC<nOv%SxsizD9Iy?okvBU|D)U#GWL zp9z1j<8m;no^fAq2%1ep{ptNf)1l(ao;L}gl3Llsq5f#~+ewG0HwV@>S&N>S%E_!O z4M7MEp5}u4Py4j4Q!(ZbJNNRxT&(P~kVUeS*Xr>#MD#OUb5LG3N$|%{a`n)MCx=$3 zvuHXttoU)J=VBtU4rTB<v-F;6S1AZ_KBOj)La8at_TB#U)LO63ar~qA?rEcJa6umh z{f;Kv!UuDUW4F13>Cc9HAHE7iixMxU7mP-B>+6*=Zm2ojbW}1;qkD2?d6j5X-7A2D z6D1`tYY6DP_k+5UA8)M>8B@&oG}}`CO->F_&)>|WEP6?CG*xfaSDm#n{*va>$IUr^ zE{%vcLxqsm;Ox_y%<==J!lmIx`-$4;PEfqI$Q)1Uxxx%Vx-`1^8j`?4bSaf>Oq(f! zXzvVlk^#ll<NKmCf#oArW;Y^LXpHAHT~y|R$L^apYpVGgLWW1<lohRB>7oa|1rEQC zFb+$V^w88ZLD5BO>8ubrT)biMfhInBTLyCD=Fkesd+TfQcX*NCvo`sA%>^;sQ0y^c zUoj^dQv7&<=Q5AWFSLDC{}5>~l<rmLuGg~R-j+?iO4xiBZ4Giwpb&;z=;SL_=T?Mv zdRSf1)4A%qW$?W@>C9*?`7feKd~U6d&$pHy20Y*$o>Yr)FJM=Cy1GW{Fz}PCqKjc@ z?wdng#(JXpn>Sm4D353Te+c`^sH)m7T0t75yAC0OfP{cF2T(#<KtSn`l<qpTfV6a{ zlnN5kjevBCbeD7->c|1^<M+ON_xpA47z~C3$JqPXdq1((TyxI#O1)`NZJbh9@8Kbh zKi6MT@?TwY2lg|$p0{FKku#5Pvg&ZBdssO|=*S4T9<lmAhK7DYB|PKvZanQ5gpgj# zDnxm!!MHw|0^u*)i!-TuD<XKlI*bw?pXSbQE6)%B<hX8wzv5CLXuVVVu3WDRC}DQY zyO>PjdeAujduA{87TvI@ba_5$O^?j-5~>fkeCd|Q3?f`}fiGOVh-cUStX}%8#OY1n z>D8OIt}5-EVxv-xZu5DOGq#tN{21iyI>n}!L*uMBQP*%*?y~~{%kN90?q&7TvyKg0 zXNt8FnST4`j(ygPHBTR<RdePW*66*ui^lLOs|7FDYPPlUHNS1h(BqH&d6c6`0<$5J zLE0C{oi?H??|b~>)&Vjvy`ncsIO2EidJ&Xrwy1}%uq?l{%@^UjPC*})Wk;cNQDuRo zW;gNIEsiLVv75dIG%;_tEmzA)M|p8VA07f^Fcb_xq~NC9-L{E*$RIG5RjfR9@tqS( z`{;sf0|zuN?nN|yG|iK@mJ4~FfG`-mF<zsuOF|M41pmRRbh`hd9g?Ue50<=dgpZpF z-`3e}!qY}2oR(SUX9-v44&=C|Y+}-&+H^r0zKV%9^6PTBficxxl!=ganAh*rG3@VM z$lvde@1kJly}#(Xx~zLRWiI}T?ydqBKa(Z**8xx@{F!1QWp5PI$t3gsSNW{u07J91 zf{16^n$^;dfa0WLW*&+u8c{gTu$R~Li%rZ9eCyM&szK`79~r_`KJo}BGTD1{%m-4U z&KsQRTJ}LMcO4((cEHtNhHPFMEL-5GVn0$e)!a$41spd@Mm^^4GTj<R!v!DeCxEPW zX}g9-S<DpC)ah<7d?yHrz;W66si9-un{nEa`bkIdmD<ciDpwytP08``u?XN$R9lUM zLTWm*H$F-Y$g_ZaqY-xH<>FF3){6f7Rw~Vw;-C5r>UKQi^owr&&6xg9&RuFW2Mrb7 zP-(=pOP}!T%l@nTX5JM;G52fON~PB2+7~BWl$X(5ln|b~=T37!urIcv!XkoZW5hIz z99cLFb2f&58?SzkInk#%Z^840x~||khE1yMHPTM|uI$FaSLIau68R{+wts%!TqQMg z@A5n^yt>zFADqRWSZYG!{+5tn9rNDF+F<%{--$>9WCz#n1FHX>Tm&Bl<FTA3W?*XH zW7QT%=I(=eCx`8V*5l3om@Kbvt>>*YIOrIqFF-wEv<lX>(R0lm+b~h^LW9<%zFC*R zK-ir`TJ3=Ts?tm=B!M%lk=DvE)<uP$zc=;i%lg-?E~#D4Npy>T=3RjTvJ;UbL6|cR z#OB_$R1x$|8@=(hdog=Gcr=?HS9W9HE6j2qHu2deK-h$@udn6j0fagZ6av=2KEKM5 zL<zSBa%E72GJ5MnNK?mwtWrI{EqZZay%k%I>=@d73&|^}dbiuw>B8zC2z_F}&0600 zKDb=)fa%)`U1DH7*k?bu!bn*z<cI#!ulD*i?#D8r(Dk2r?VhhB+ch8Y(T;K_E87<k z_6150_HUFEL#HM=5$6+ESkDnwi-mWY%ovs!VjqYtP0VfGd{6)4w|2hbc{rP;@10vD zGoGZTANxLJ^2?4}4r|<T{8O^a7j;IA@OX+BwVQE^&OaBV=*dNZGN;C?x3zffuE55t zk=f-Sxe`uX3aLWM?^KD$`4mM+qtjU}_h<JBntZPqq`zehYq0U$+ZOm<49>k(>gBzd zLB9@0r*^J1y`W<B;UjCm2`Vq5KXIe)Dxs8h?lu|6aQ)F0R{V^R#~3D*We(3-6Zd^x z*Ea##0?^UU+|CLM3q{>_Q$UE&3cIqVoM6)|CM;Hn$&-0seO+<7=y&4_a!yv&4h>}6 z(f!->qHU8%$7=*O@LqAMjgCg~W8;VvCO?)(sLbNMYaUzpAav5u_gY~`@rq|QV%i}4 z{PdX(@d!PtBe3OAUq<Ar)?s~l7~9HlpR@!|MSbgz(_kydlW@qvCyMf*Vy1-b&(oFk z3%;n8F_eK+diLH)9Hw{rbML-;`Xa#WXLA+%%hG9r!H|1}GkIDthEdD!NIW_orSEi7 z`citzJLK%X80cX>89`lT2F4P@$%BSbL#PN`J-$|!$6dq;*=>`*DE8uFFz!CPW+1{7 zAwbLEX{D&;n#mS^YyMHIwk)fP90kf(G~ju~KrC#xy~$Ut{m3A+V#@BiBb8$$@T{u` zIgly=sZ>|zd_5lz?A8RInhk+M^a6m?j@SDwRI|lBkJpTKbmZkNjf`@#vmwV-bMy21 z`ueuEwty`A*2Ki?_ed_Ns)H);+wFvhK^XU}fo5Vb?OSXGdYl}yA%U1;BKri;g@7w^ z>D3*Mv2eUyBFn#89-M)Hlu`YM+W(k1AY}@@(YCv+y7CAXa!7n{Iv`YmVaXACT>j`6 z$uB*8zay2|#WY}0@eHxm1N=0us$_4*v;3p?wxh9<7UnNkYCVC~RfTtBacsutG?ad; z_?veu^s|!(FseUNY|!H3AnJbgGZIpo-Mv%ibbKD0`Mi7hjHUNq!ajr}UQBww67qhS z=eu+VL;9KZWP|vIRJ(;0pS!#`2Su3-t5ZvC@5fvu!)*VeK(+o(wz0olJ8H;GwY8|t z_T1{_a2~s>N1Kf%inJB;E-E)3#wlH;)94HfJc&E2)~C0Lte@gDJ>QC8Mqk3i@$0?N z7e(^lk!FA&w@c*woq|PC)>||eS+|IPVR4bB-gN@X{OT1ZUEuX6bLiGYwn$W`5wj?e zK6+gZw9oQGed&VSC;Vm;Z~8Kx=P3RuEh;+KKRUp>_sLk7D@;tINEx6u8X8sJc6LBH z_<1Vh%uox6VgBwW45q|k8n7l1O1LlsuNwtz#RAQTbe4cj!DVb;9xyk{VS0@jpnbKD z7JQt~=j~mxjf|w^hIJjx)e#&CL&ka4#OmE^CB8nBqW=k(!cSI%eNClM*pV!b!(i&f zrEzVq^qQa^G3McM?TcYIwHYt9&FiaHgUysCW=HRdDE1LE1#0=|A=+P03D9?i!0g7K z?>>9Lbq`^JvCf_&OZX%+H29mCgspOh@|o+-Oy&<xl0E{Hc(rhm5KW=2nQxy^)_Ydn z+A?xER<O*ZP4s{53OlU<){)^g5^SFDE=<+RXrJZ2{$?#;Ig$fpmtlK=LB0uOfqz~5 z{5A$bU1T0uG=fREw7s&jvvUbpixk`jU!TE~{aPJvcLSsaD()E|#ug*R3Xb8~i%QvP z3}r*A2m5mq`ngWzJ4l~x@d5b#Lta$%5DRFs+TNek?9a9GO&`wAsD;g{*}~(05-$rz z3+^XzeIy9KLzYs}g&?^}mPV8qskILaXsW|TB&{;>ZAIIOLo#_^;`GIc%_?eIEmXS6 zJ?>MTRrzon?=(R0EAZ~ufX>Zm!<3`T0f=t(!&glO1$%hE`6#o>b&C5ao*JnZx#`1b zgdGRIF8&;LEM5?EyYM)Pga{vf*m8YF*u?=wxV}U<Hf}ZAb!5Htvy*yEq2A!r<QqFn zMo36VNg15+87y-N81e#uhUJE>u$yb~n)N?Zn}JvV4T^9Wfe8#tfy>9GAodLlj;iKe zGWNvZk{K~bVlao+yi@Hg8Bv}ijwZ3!F>%7@$%^tqBBZgU?0();)LnbZ@)D+YWWK!1 zA`PXQvo9{CuUy3Stf4sbp~(Mg(NM0THvihycy4{uE(OXs`^ix{GrM5g;2|4yByO!w z6^9pki1YGYEV|ol9|{F3BNo1pp8I^g6$CYQiMWrde$J_f-q`XfV!C#M@?$Ac!Tqc{ zrKwp1x9ZmIK*_?;saZw+<yT~IXDvZf*#7*<JP%@NG;!ng#jAq;|2|$XAuv4&+|CQu z03g*yyc=3E@;;odmy1}Q42AB~AznR(F|-w*mQgd4KGPdx?w-tA3~A@xUi4h<$pQPF zWcIr>q~5}QD@=VTxzxj?pu9YVPyfb`P#!4S<k{rTvxrl*z|I?T7KlX~w>Q!B9GCZz zmeLEvi#HkV#7vPt&c@VW>cwz4)0(&&3IH~&U*d@$TwpdriQx=_wmpC54<Vve`GqH6 zBHYy`u|j>l&q8@vnmRZVvZ1U>96C8hAx>obdaeO*?7o<2bMKPG?7N{!sfF9~s?4{^ z8cG+5THWy~T<FQ6=i8BpsWyuWiI~SLEpQ-!Q8|y5YxS9MtFF@c{Hcmu4=WMU<!3rB z)kO@%r}IC~0=tP<jwp?xfBvu=W5zsz)`)s8eNKLQhaVyafSFi)tqN%tN4M<)s=N{2 z1PBp42(}vl+e1D&S@oP>aT}!mHj>Kfo~39}&IHFzl1A`;R-cDQL-K+Onw!@e8~ROP zAK0LK#3uiF1qbg3hXWV0#4MTgGWqr(732l1#Uicvl+o8FGOdj^tKsj(>1N%#jmt9X zpOh_-ZzIrNDE*$RcjOKX99b;!)sB>TWQm5pObFYyuAu<W0h<`%{r4SQJVv!%-~13Y zsffP6w+^AVSv@;k+>_hjyms$z(HMep`(%G-XT)cH<U7K<zS;M~n7rAgXlNL-M|6}+ zg|}?TLq_zKEo(<_`_=_7{89Si%<Kc3oE$()GCULLdvTwT=9B5P0h1c$`#~$y@eeF3 z+skJCg`u|7G(T;0YPG~)%wle1(lcYk5RVFZByvE7UKTjS(P#Q?O|>Wzxvo%pJ%~c+ z?~=a5<0KuHBB=a?*Ovsj+R^z=YWu2|MBHgzPF3~g@+<vK*6?F^#ar&Gy5{DS$}QvF zKV<1y7p;;>S`md`9KxErMlXElvawc63~N!m4pWNHaH3zO>fMz6cK_X*B%s@G{)O=L zXQ`(RQK@F>v#n2?_ELm*0TmuO@?UQ=OA3@X-AEAgTtdU=o6a@KI@8_>?3~evHMqPA z%ARqrIQLq)6f%{$##*<?E8E>JQ|wbss9J3lJsV<;PPbif*!*pbB}(Xdp9*tts*&q! zxSK2W#7=VGn|_HVFX6Fi-m^02got>v!p|6qki9>D3TqXZ2x~uG?yfex*py>~ddSe? zuSL`Ad#w+|DSnB&?^U8#fm2x=xG$cty$5vKM<y(P&Z*H-WvFAh4X?5DS@U<Rcw{*T zL-@3T;+PRn?To6AfcQHDy0OJszque`yz@?8v&a=Y$x1{4&TuY$%<NV0)ij^0^`gvc zitbP3<xg4F8_Ke3yK_&`8#9Ds8xpNL`yNq7urUJ!PIkgZ;W`YX=045XjW$t#@Q#dF zOm7_gTa>j;%EaSR=d&NemJ-(K4!e70XH|D_BzD#o3;^mkR*UQVuih-+MuFkM6So$o z^D`U|>PEMnWnkGLXg#xCsOa!}XR6DlW_9@M;?3)&8-CM}tKT{U!*BG%5mFg32cA^{ znIc*v-1C)ESH~X}V|HfG5ns}!k?o&ayAY3@%`a24V@{7RoPR9Myew_1u0I`GaJ%`? zrR{bQj8?!oC}&m+)FI`ICA8U&*g(-M62He14joZaqr`mUkaSh$^gWh$Ui9X1&N;(w zFw9|d)VpTkcm+zy^blHnv${j<)HmhQ4dLs-zp({@3&pTrh!gQH`Gdj83#tUYg>R0F zHLjxES<R?aJ@Z4DxccJm<2}MyB|0r!?QH##^d}LeqLdLB?;qup^jaRP>~a=TdoRpr zN4iGS?3nL78jx<zYFoCw*{2t@HUVkXI|BM|4rl7|`5W7~N{2X91_0{)ntTP22|_sE z)p_f=t!OZPNw<J`XYP!u4TLo@dyH&L_AaQ^02RyPn<l4!7C9YDPMiLG?%u8_jL|P3 zkVRoj_jMz>ScJ^XWW5cSCw#s9Rc%Yv%_qE<hjN06**3}0A04I%#Q_C6o0#?bSf{+4 zhAj>OsH~G;Ja;@St`_~IQuPE}aYz~URCdKDS8cR%ixldeHf!F#7PDFz9!wL-7W?%r zk$uug`UX~Uu9x630Tco!-dV|s82@4RY`q?ciG9pq$54qLz%M^4U2po+O_nrDq1#cF zP$`%t0rFy*D!u7a2(uFdu)r3mOyi@Xr0UIsrx_~cGrFWlj7P|waPq=OWMken1itwF z{ga+m0AF}_sjqB|o=xDrq@egZoMp1dP5cjfGO*337C7oTCJr_B-{Du6APd?BF_QmP z$^gMw4*z=3rekF0=Bmgk^)lx10J@FZ0+o!b52VMSan-QYWg3{irt3SN^~+DdTr?2% zrCnfMN95P0KEI+C`06~kOxABYzu#Rag07S1r(Nf8`ku^iYVN&5Q&1Xo__O`4Ze^X~ zCoQs*(<pXr_Hx6SuhJnHva*VP*|Z+*(peOR4A^0Ps?>frPQr9d3@<%?RlF@9p5P^Z z2yLJwfY(b_j{-YFd|$pJ^?%b{hG_q>Z6rg7#aOjxsZqGKEdGM3%u5IxR2#^AcmX8R zzad@}i<^`rkTmZ8sEZv+L==~O`S5*oSXlqr*h~sUUc`QH@6S~vG06?hc#(GXCq6HR z)nNTbz48XeYKBYZP#G#nQ@59wM|$d+-6Vduha{r@t0_%Kz@cXB40DX#hlK0^UuJ_A z<lLpAH}Q`jXayqBhUC4|S2O5|*~1+ll}y>8RESTJlPdoqDgmMlz<+hE-mHd@mi|6T z6#6O>=*hKkHemRb5cXjBb=?zrx<lqa!}`vTJ}=mro^IToS{9$zSLVYc{e-M*tRGJ0 z>*?uXJ%vP}t;^Y%!qlogCj${v;f2penf41UV$aa;VfGE@?`YFZXp-U2i&>BdXUemN zE=5pWQ;J~)NWQ#>2eX?gfJJRX1*{XeRq5~h%um%)BxWbFUCZ|k-(iQA_!*9WK+{As zX!WRiGqapo6|I3tl|b10JU4-JXMPUISNgKC<0Z2mYH0m$Xq4lPMp}sc9(iGl1CyY5 zWYDqlE<Ir)gdzKil^b}AbVA~HYUuKg^MlWgU0hr?x%2^Fk>9r)&(Lu3XWjjWQ0{LU zhyXnjpV3MaD&Hm<)_b&sdn;^iPNB!nH^(gbeTkzt!}hBt^9NE$;cs@2T<8=0&#Hu4 z&5pm<K#_#7)juD4<KL5Wo?PZgsl@_Qwhi&8G{ht1AmHA_%i0S;6&ezp=T2X!vxA8) z?O&CDl6R=7W@ONS4OFk+m52UUEUx~5FnMo1^O_ebztyl$s@a``3X`bao9bM>#yt31 zcW*8i$*K2^>}uM1ZOZs<_uKM>1FN*mW?R#E0UNEk<b(IVg3M%p2ofM)7AEK>(vy)A zRFmo4?slK_XJvRTu!N?H`!AcUj+kT|tgkN?bC8lmIIW)ZM;D`$HMNcxx~(l?NKdC# z>UVXS!ch(kj8qR*kj4Y5X}%tHu|q`u$5k)s;PLH=5P1@|7~0aZv5Y5=(X|oVXl8ve zB}2aIo>KpQ4d775X07f1TX@HvR_Y@u(kH9gL;pv=j-`~xAMt3J*x}eXl2Jh3XgA%o zGx=1`uUMmS9zvSF$0EVwdwJ6COB7?$_5S1Mn_?4~?7gbr6IUVR-AIN2j-T5mQ3_;^ z70Nq5J<aKA14MtOQ&JT5H@a=V>3;{@9|Y(GvPZFPG3$*0wIvWbHPP(&WhSOfzx_TN z;g^x)A+`&WBIHS9+uQQU3kaG4+>faZXV_5RZz*^Sm~;;N{oz_N`ZowuV+csmL4WCi zAF<76i3Sth{1NAT6`lX9OiG&$dDOH|=&)R4aV0zGP?{mtMKjbM8#JaL`<xFG0368& zq!;*=74@0G9BGbv3+2iJ5Y~D({GRv4JTdoX)Wf8y+bJ>4D8#=c3x%xMFf-TMtbT4q z2inVItKBJlY_^}<A8J!mSD1WOu2dZ&`(jX`rY_GFvE+fUtZ7KqE1XR4oP!v6JF+Z_ zxWxafUzG^*mv(bK_arqvII1hnEtR#~;7nEAN#@Ybb*ev3{7&-F$jjO@7ZI~J|8#*F z7jK2Y4F!Iar`*!inMY(8e6><xnT9Q7*rXPC43`e?BUrHZH8X}j+<~fRLTn=u;SLRa z4cgp#MsDKb<H|HdQ$cs=C&s6FyC>f0obL;LEK1%R8tu&6bq>tP<3jl|@?nU2g`lcg zVzn{8@P2HVe|0TIRdY)oT6@V@2=G&>%9u6?m)H=y)ki*J$>}?rvE|c3@%Bc9^rRWM z4a5sVU=kqwupS<D7L8P{h44?q+RTPW;mqAv5ATPJk`z6y03;f6!TIhRVT%La{^6JQ z43~B2t-4KKm({}kyW-iFyOtP&Mu%POgSC{!>ad#EsyfcXdL?}^QBhH{Q!#a~JYKH* z^{)5<bqUdB&E#i2Y>Gq{#SQb*?W?)ZRBpT0i=Urg7AlMK+h`R?qGXin6ym){unDFr zKHYro^&<uH=!(5)7Kec$AzQyH23UAdR0KxAWPl~=@MCr;&V^Gh?!W8dFdLLmU&x18 zXdX}3UDm1LnRDq}9qMy-IDLm-r%xUE4XEF&3|ag9!IAbQJRJ94l0Qjc`)I$3xTyNj zs>b}g;G?acK&}inP0!Qnqb3N-!``9Q(aqB5i_(X28wm;7tiy}lKHH27M0H=Rkd!<| z{&nuXEq(CTvM8$DQn>TpF(xafr)FfwEY_-{7>v_?f38ll6K9>3fI2L1a7EZ^Niqz& z(&1f$z<wc#^JO7JbMyHOa~BeCt!&>4NwwniT2->|Ebkaj#)74i$OV#4%d2xD?tc^x z{%9Wv)#Nj?b0{1e-QNslAcDJWOWswnKVx0fk4ker>Tl4>#BdK<kW6Z~JE)>48%*cE ziLn)J#Ax~RnT_r{u71TiAAhNSvHYklrV;}esD_Tuc#1vYFLfU4zyOv?hadLu#bCzy z**6Qgb)n~r+~eqivTK*<4Sr3_%{6vC%?D%~KwAQ;&d(uodpA|?^oK7r_hw;Ik_Dw< zIbrIgL}cxOIsWhS{QXbz<jG{b;+dEj<dYY?4>Ac+gZZVg3be=W2BQ(9K9`qQz1Ziu z-qdxEAAFlV-Ml#uIRO1IEQa(n9JsRJ8RuyNHfJ#S2Bhic8dFCCxztGjMPeyNkVBxa zUW3X5;613m_C4N;|0t03<O?vp`)g1?EOEIDAC~Aj?xHZPwwc`T=Wa!oS|W&VILr~P z9e_k-I@u)xndqRfnMmVzTp3!J=RVoXts6CvpRckXm0ot(h^9IfV#4!G4;fxP-03e; zA%e~D@2IA#OqM<LeE*1OkbqCjMvVOxu-C<Qs7{ulMR&KxLFI?e*t=aT{7Xz$xPJ%E z=TtKO4GVX8JDOK7-h7~E$N5XLK|QgP9Nwx_Fu{rsyCz#7qZs@kk?@%sZ(KNHL`wd0 zmj)qeTbD%oB8Xo~JMcirTjrCNET$W+$hl8cTF<ayd@|xW+hZs*d3L$x7t1jR8SaTv zt*iAb^UcdMO}%#(W~Z-2>Meg5*B50uEwm`hA4K8}%Pfma7-Y_ne}woUy3&k`RM?rb zRV!vNLumIteh(G8<Rk!tFH|FZJI;h=30pf-Gv@v`&T30RGb4rvO{K??m@l2yBjmmW z+P`_f`h^e)UmY1`v%ipC?GLEUkB=B2Xd;vi?fOV|50hl?p36OAiF}x*`ipIIWbg=s z&sV0JcYRod(%*DTWFQr^Uqa@*PF{u{08snw0kwx{z9q+~M0n%ZAMazAJx?C9+TV<X zu_{_xTFT4IJIM1S<*+Im85v1R`nR^WF2;9FPELYgXm)mXr`Kt3MxbEj=;Wm7*zD-= zu+9fjdHLpCQI%X!P!QPu0>YVvPex{DMh2I}D_S}_Zh76Wd!U@+5M9mr&3b}8?T~|M zWh^Xvh{Hk4ePH4A@-Q!a)4*#vM3-WS`BN2-*uDI=z-Y*)m-!el>Jh{&CxjcF;PlVU zMiIoqRdC~JlI=7GO7vM}SpJfVvXuWu&lCFBVhaBpXR}NUB=DfvbSvkimDBq9$xL1b zManjG`=Gd2t_GfD>l)@<oYbgEI{t<+!X7H=&1Q4<RYk~p9v<>hg^*=;C&4}8kb=S1 z=o{a`nog7of@J%t%kkpHcUK}-y=j>;xl-rv3y-9$P<X9ylk5?;8-dw9O5&F8&#?}s zeRoYlhr}zAE!bbu3ooCyCfok8IcnhJLdm1941*K7u@CJfp0TNBC2s(|5YIl|$$NdY zO%fU!4wnVbi;+ArXjxxBobR}o)Ev@!Y4<*~F{KmXsMhx0O6F-ZI}|<;GDt&&dmkPw z^U)<Hzj@6wrb1hRK@x6?gWmq+k+lDY9Ci%t**{=1P?j_QeGgc)Y}8Fsepj~c-`B7< zFiS0tAu><f7HrQLH+(|j0eDi&eae@MK09;?rZw&dVP<Hk`Z2=@SL8{uL0Lox_l)0c zg<?7PjC)qI<wQ)UEI4E7wR)f;WYn0Dfz62u8*XFbis^`7CKoyvnN7?2em1lFG^9x! z+WV`j5;lt^v&oAt0SfP**C4A8@(^)*a|S>RkKs0mK4byV_B?pIYsp-Fb8PcwE#p&% z$V{jWt|t@PS=)`#gYqX3QkL95W%CrN3IrEGL1{Ov^6Nps4Pg$V;`Xy|LeHPH{;N6m ze@Pe{jtEzV`5*(e5jbS8zuB^)ZMNMA)rJ0qm8c|^PPo%bgrdAMS-J-kIdHrRN&9B- z=|*Hg^=ETlHjjkO;IGab4h@V_i^E}4=KZxUaZc*JiM*GykKgp|iZAPtK0dj>%PLau z@Pm8xs3y9No|2W6>6mp*%Y3zVF$h`Vd=`q|@h<Lp(xk-i^npQD1qGZjl}}dLfP!iI zR$ECaa^_K<5uAj&$!zQy;GgX3qudNFpwqcHY<+NA&+16n*CyE2@M$9$jF~y@E5DzE zi;@P>V8g1hA_7}P!`z?Gx3=|t41YhXB`x0QpPa6uVR6GwzBMj$CxS3#o7pl`V9=Rd zHjO@U7n2DV8_>hdc0DmkU7QAqqzGDgs9Ok(jJQShBZ$Qau4#GJw41(`&-oBq%Uhyw zkQ5GT2teb`=`p({e5#&nq-4ia_<qk}c8np{i>pVxz`Y>Kh_TLy*|yEmgKJRII+)K> z>+yvldXG+}1_;!z=30G9x*8Ai2%WtjdMj`XL6$p54N50DCZ9`EfF~e#B%LdHh&6)z z?X*+H^>1a5Ey!PKfZ!(%=iv62P{OnE%gbC{f{Z@}%Ay`Atx2DQHi<C&!vCPN?4vlk z8h$CahVkG|?dMY*QD0xneaUeQCKb1Y_Za8DUl<hJB^e~Z=~2DH4KW!Y=<trc*)#;U z@KJ;eyDu!I=1M+lt-Xb5-i1|*LYB?d$`HNq^X9#^i*3bki=WSDg8GwV52-dRI@(a` z-piis#c%m4Plsn(!4i(D&AHzwgZ+gRC(!nF@SVY!&)EXIwEvF(w~VC324*FCHW|%1 z<BQ>*Y}i88%~I!Cva!|AY684SH~4s|a$`<9)w>kPE@@C}*}Df!=&>JzW9kfr)3ZVS z=&7%~qeREI5<U3cilEOD&az}(F^nCoYd^z#gD?^w>AK0+9uOj!RZd?jT${c4`ok@R z7wRQ0Q%{8L4~FvJ<Ikt?mb-FF6dQvG*zsR$m**(3!EcJgZ_a=6LotDIW>B^Nmm#Gk zEOvAAJ9@dqT^LS798s#}@>^)705m*292i@qiFrCbH*Ms%Ctpv4ux08&voY!STW^r# zqV`P-O^&OoX@axIle;H2S-<jqm+~!P{N=BcV*UC5_Y5nTKlyxX#-YH(zyW8jqq~4S z+qHc6Cu{?AD>-hnXg^*I+VX;cr<MZ7-UoM{qhh2ALtuyZ2h*{$D|w1pUQm*j&ACX* zZ*Y>TWEdoDS}cs+bF`9~$Z=<gh+VE%UuSoas2ztKh&e5f54Yg7AbzZvwwT$#R#sMk zJ&tR`FEU%$`?Z)>dzimrAiV2$)tOZmz5Es)UBQJAWa7^KG)N|wrPc!!vj3fy#dFho zx6Mg77#W_z?}8dAiI?b3LcIMTh0WyW)3Fc^<CJdP)6Nw>UUfW)&CGKN2Y4eDc{WK> z><%PztV9<=I+W5Vc400eYoE)*@WgfGu!4<N&{ai8y6|gxaY10Yh>OfJ*ilya=vDt* z9qjvJ%1U5A9b2H%xMA0Y=l9&pae?3MjbGh~%77k1e{J}n-8=<<elw^nzl8n2+ksE% z|NY)-83?Ji;S3oYn&wlL3F`^qp!MghanPM!BIZZNaz4!a8|>-*5ZD=l`k;9c74DPi ziYuM=d(-CUvt^F*UpsTn*?un6>QDU^u4i9=+tDmjCtI;xQZ<!ctt2!IHYdn%^8RKJ zl)U|O@8=ip*HeCdWFdv*q91Ei;ifO81WHk!Jk~2hRJ6#6#r)6%Aq?jVTb+gm*rItS zO@l6P&As46V3gqsoDQeq;$CO(n{Ae;lKq)2%8kf9E=WQZ+d*_y<&G<|O6~BoeOy#* znp=d7qbT!g$N)!T>vt3nqZy&}wz+0!L$mJE5!}E+?=BJg{ofQGS&A@0ZF_Ox1@0B9 z$k^dgp*|Q{!ZCszL8ioj<$<7Yo{RrR1jZ5)Xp~OQ2+m2{7*_gQFMl!EXCe6AarFcw z;@UKfTB$XfjFF6>@(QVYVTNAf{hrBFZSTe!2SuzjMB4YIYfuuesF*rNFXN2dZ%T0S zrck^fhk-ekG|2TwNz^~Y|8pwIE%w~0z3s(;AXdvmyl@rJYE^+hg_}x%Nq6k4Nt0^< z+!waCwy3D6(9zLlEu)o@$zaS6NzrDju~5>oZx-f|x83u8NrIDoV?S)8$7i8)0KD=! zy1^I$v7a|Lyk-^_mk7ijkaqy%E;<nxVEiHjI38)hK^jo{LGd*Pw0Qu|J;jnlCpU3a zUuEH@L~`w!X@THgD5|J-w?Xq`7RkS(t5F=s**L3ox+eqvo!;(GM@CNW<>h7m=8cur zD)9dSSGok=#5TZe?ji0s&f*c^Zvc#i3kwP?tzw~x3jecFs+OFKa@-!xD`4XXUu7@v zBO<O*C=bCqJ7_c&{nsK0*j^x!K7;1KI7iU$8u{)Xjdg{18uYJ4e1#<NPU_L&8GQ1J zDdc~*J9RtHU$;~14fwvf;Cf_={~3S8V1qk9kj_k{10~A(`g#d{Nqqb`uq*id(5)|# z1C!!pt0=n$R#|O5u?@P=`Tf}{60m_?ola8Te4KeO$pSv(e`gExQJICnEkZ&F)?XT= zO23RB$`3Vfocio72OgZfU=Uaupdo@7jVKpRcdLd=`!Yag#FRY@*a3iqVZYE6eljHe zZWGjUO@t`lMSjt#$OFzvhtj3G&B)_^;0^N4&c9GdBn=WFgtPyX6f7a7qcEet4MhI_ z7`+11<?sDatzee00k?`*=h4sLcTIzSWLH;L16^#=BV8?0A<)PHs7$9OK50(`2J%-J zc_ahVb|6}0*DPkRyB^>h<^&S|s>h1ee;4NMV#r@t+5AsS7;v8)HB?-8@2iHNy{lfY zHPr(K=)&%~aUa{ke(YtG>~O2<tfzg*`Z8jpwEJWbL?|A-4qb$(r5l?iMOhs@W#CyO z7BKF%fH>dP8uBnmB|~Tw_<mFn@i&4{Ka;xRsPBIQfT@e|$k2b9q8KHjX+iE?ygBNE zw>%$x9`dAE%MA7-E*yQ~1r>>Q<KWa<TwLm>6OP!8&<(k*$*)R(Kn(CqoB8tzNL3#` zeBKI^efG@fsEfiR2(%3lfg$T)%F|0)G4$rPSuo4~$j(uiqu|qnloj6$+YkPpSZzqO z2HDT_t(zm2RZl#);j#Z>k!|eQw65XQHA_gh(Bc%cv}~XH@SGIy5Q}CKKZCWpl^jC@ zSngQ4<liaq(XjLJmf!OYi#C6hAIqlltU#_S>biZuFB|AGKyFSwmb3RZJu|h+d%rhI zgTSDb+MDB~%yVI+o`RSMJ)rLEGyBk`m!|Hswr(|<x+!wEEAW>x!~G{zyimWlXL#@X z!<7;;|HP)h=XLhuL9_3Q%gKcg&w75>X?K<XJI~RRD`@d^@5A|wJJ1Teo_q~;KUlDx zuKdX6_vie;aQEa0W54Uqli~hBIsfks&oA%JGZ8&Det+&*^Bi@9@eX_y*5SUMqOXEk zrnC5^kNMWSYxaI@W_+t<%=uvm#hHF&lrrqCc~$$o6{Ej@Hg3zg?A0p2XO!+rkerr- z?-*FmI_+;bL!Yws0)ICR^X^EhcM;S8Vg|qg&M_uc@K83CJ2XGZ6S6d?Vp~_|HD`AK zXY_D<GE5_KE{$5q;2<j2>v)j3&g^a=yvhx~jGn*UGKphV7=#{p{(M|i(XT(G*BHcW z_~TK&jNBnBoG|P;Y?mnMiEZclGA`X-`F90qx>MP6@J^UFcQmAYIeL*;W!-GYm?SL` z#?Tb%1&8zkh9)ofiM`^<<2X^;a}Tf$Ny~jzh7(~mJA2f3_Pr48Y&Jb@p{u*KWr+31 z!_IJv2{5K?>{$1QN9`QdV_mlkG2>r9j#(o*M_n4R!#WL@AE-TVh<Moi?or*><!5Sk z1_5~GRN@WKz(~M}-KorvZ7B%ldGf9wGH`ai916iXE&?#Gfq_BVyiquH08Q?ZP4~gH z=*>yg5*oa@Ae1MaADc4%PNgQJ_C%o-X6?1(+VYjlw}=eG|KjDO$_%YJhhH_mhp|w^ z!7cVx4&v#L3|>$%);f0{tc4tza-rtdI{TVFrfVWero*8{#Eh%ra(@=z&Q6QV|E;L_ z4UX>VX_pTZp8TZS*98~8ZgHAqXj!QF)kzD@c5xT%Ik?oL6=M)&etJ6RsIP_g*F2w> zp{O7cn4Ceq%tqKo0gW#rN;O*o{O8(q>aLt{<F!bI-I&Bc1Sv(gCbat}5x<o=vwyBZ za`a^xZS&4gSys;l%iY8UG#nfp!nV|&u1GXW-cRT2efPjqDJir~9Gv}h-G@G^yR*sT zc>2+bMhv#-vVI<gObKs0xkn#AS@*Ps@guyBj7u(q+1UxM?A1Lu=V2@ruz8>{<aY4E z<&T+)fA$woG6aO%WiAMJbLf0;>xsD;Oe-msn_yo>Bml5y0IjG&xfd7KWny8$+N?a7 zCV#5e=w>T*4SZO{09sLnulN&7i0<&ae|h{)rX6oDUr=0vJj01f<jvl^U-oNZFN-kD z%~OrW*2F&o0s?=VxuzhGfW8eVV2#DO%<qo?_8dUJ0KW|m{CO0b{ip1~vBAL-n~~<Z ztv*nBw`KfSV~p<BW3N;`D0n}kZW_M~UVojnX*KnDE1mYzzyzj9k-0U;=ysXZlye7> zPN=(MY?tHLv3&Pz(bwB`;~)f~^@i@tu3aB+gi%%P@#lPm%WlMb*yermn=vIDpgF;z zp)^xzkKSfw#8!I#VGO>y5Dnp-jhXJytYbDMs-w&L?e(1o1&W!J(K}R`6>F;NaY5=G ziFG^;#yxA_`Uu0psY@LVoEIa2YXlmBm<*HR{+)Pj>S#O{9D6T@f<j;QmVmgb?W&qH za<8&d2=dM5;@y17INj{!U>0_-k&S`Obx%6QZ%D)2qpfJekiEGwx0Q>DC)k{Nb!rze zW&_l2zzKXdIA`ZYWA@=IUZ<YrH~4~q#IcXNbjsJ>hN3AcGwger)J;b1RYiZHZWQe} ze^;h0vC|)QN7@&J1rNkJiE4$x7XuDmLP$#R+V4y_1M^U+APnF)O1GH@T!DdbF>dx_ z$E^#Q|0s5Wj9li<?6}p^xfPd+(kU|sMeuzn75#o$XK2>m=z3Ob_Nb~jjV4pTYEMij z0*f0TL^v8Nj47?d;1JorzFh0$ZKQRp>oFeCW*eW6^+&~OQ}4#;HdQEJ&v%=#b$j@u z_CpEFzzte#FFhY0ALworQREH)E^sctyYnK|Wx%`<1^r~Nc5x-rXe^k7Rb`43lV0c_ zok0{~8zobDtNFC+9}$-=Cj5&JiHP>Cu$j7{GUw3#R^@@=p_(|{51}QQ{zXMaIlhOR zKq>uAd!w8wU^dQOP#Ie7HAjz^5ss_M?^=v8%ZhRrTk>+rw6^z6*YC_r@+{bef0ATV zdSb)zX13o-y*>bsaVfaiPANZ^Ey^bgf*v9n6l){6*w_^ftE(vgW)y9HSaSsUBD0@n z5wPa{ETN?Sx6tDhDNeyQ=ydz_O3c+>qif5mBLd1AX}BiWHamNHxZH`w0Cn9ay*8e7 zp=<Jln`cY-#_kn?*arLv%twDNU*{=L`9^Zav>elK%x&hq@s<1T1e%~A9g1Fd*qLxu z7g<nK&5+m!kDZp&`Is8FXJ2tBbu~eUQ_weScBY~q>EZ0;1lliPA%cQuLqb9xA3SQj z?N5e5T-W0JX})%`4v*%f?TFT?{|Ea?7lvq1h9bed-kjXE$@$(S3deOj>068}LpwWb zR1mgx`w5zq0JEkw;4IN|cFMf8>EpZiz4=qmo<!r|qbF>@n?re%YpOB}P5QtH{~W74 zJybj6sn+HrzUa9o`trqzp)Y1KOSOxzPD4VTv&wBUQD(xn)_Kh@ugTyK^jcw=O1CI( z1NNGQg?>7mRb9Lh5Awm|Sg4zdcQZyNlEmqfVR!pl*!%oNs}a`1dM}AHy+rlC&9F%H zezGCVlL_{IfZ%5Q#n2|Hl~XO!vCguvpv%IC_9>Ab%8heGs$YW8e7)-_m6WA}guFBi zQLq?2-J>1(oq@ZtQ80epN3g=47+cKi1gol+S!NdaqujUaur_}%@<mq=$uhL-Y2H0F z|Ia7a36?Zh|FC)TFbpZY*y=vj_hxI~E=;T)69-GAgNgdPmfQB`-5;oXc*FfKXnvW* zQsnt^MbTu!;^XUe*6c<+i~O!mlZ{|~Nso4xmU7@{b8V4m`wQ~2E2K@Y$}{T@zRyG) zLPxJ_dBcedhr6>?F#;blT$N`rviy3ZNO~`qEq<8fC=8c?BThn4d=C|$v!Vx!JEeD= zCUZ<9Wws}B7+qtZot+)$=>A{JKqV#qb=XwRHQKK-{fO4@L@l5ENak*vB_}*(5WLF0 zfkx~#x=CvpZ|2?&A|Hr=)<L_D#LQFrj$688!m-Ts>NA{<d^+NuGAfeSU5l+LO-5TZ zxSXVkigKjh%zR2o|4T^?M6_o|P;hH0wc38m2U~$>#@Xzjo;VP!e5Pu(==r>A@ubl! z3meY?zjdGLE|Ckf5XvY8GS+_!>ltDJ=QQlh9jDQ!<KTi?PA}?H_rA2mrZ`*`y)I;P zbA5Ju-YTSrj*!s5l^QgRNy{D{XCH@qZwydn<f~+g^j7=rlK+b@QKsKf@0)A+{aeB~ z5=e-7FL1X)=vog}`91Ea-+B0ZRpjm0Krh^;Xy}RfY(9s7_SQ_V?awe83l)mB4eHCe zN^uh6u<&rHq&rgAz^gR3&Hty;51w!$6tE5GmASsEH0uTVo05n8lM$Eg=9B&+pL6cY zr!$*m`EF&j`lRU9z}0%~=e)!YC3FmXH^Ue8ZbHGNg)*Tees+`wKEuw%`#4dDJ=+wg zr5}CHu%X=P7@_$5%4`Xb$Dl;;iT>``k0tw10*MRBZ?QX-OiSC_@11|v*y_GIeV=)o zzG;yB=<jRtUUypBCM#q1bECbuTX^O4dtU!xHs5^XjO$M1bYH^Qva_$Z2tIPb^}Fiz z4QIH!Yp=4Z;3?wGr7Wv|sxcI?M$(Q1`-LzY+mBd%U{d+SZcfKixj!2;EP7(bJ*UMG zo1PhQWT;JtO6O)E(z4O9fG84Fg;v9kVX*teQ(~uwDF)*f_y$c@IQ3f&(+oc>ZcG~E zceo9voTnGp{{%IbAUu^e$}f7xz(K_G71s~9ScOOh&U^z`0Kc5S)Bn@3E+yd(=d-h* z%U9?7ZyvBP5yc{*TkganK7XvfC?w9&(XK7dvWhDWG$f<_s2^B+JEk~&62+__SItlI zK#9j8RG#E&zwzMxJ@Q5XIg{Q!?--oGB3+{}v)C{zFqiO&ZI5||dVWyYbg43qa^>ff zkjCOjqIEYw&MH;-RecD0hRo|dF3s&ppb!LS;_|Dgl39y^lq0qE1D7-iB3twCFXpq` zt^}IcYZT-)mea&HTkFePC9j8EiFpJ9fY~L5frpeDKd9t=4lsuPwzae@c0+)SW81m! z>?5I&*Y59|K4iJq>9+B*vHEruKDG`71(bXWj@sd^;I?jVZq}Ic@O+GC?+mSAW*+KO zx8l|jX$EfY@{dNKk6*Rss_K0s98^#PAs-;P-ktbFQ6_u$92Ef{5<LjBE&ZaDDKgP^ zRxgZADbFA(s!O{m<g_M#S9f*eevS|-<#xp9>tQiCUe+*ZV-C)n!VSg|q~+r{UF^Y_ zxgo5}+peZF*x=8borcN^cQnqyexZB92f#6YANN=&aCIe_)zk;T0WG&KPiz}#UG?3D z*ce);ckgX%dc1!iRvX;qV1cgo4)G=D>+0fyl15OT^HZ?`zoMs}-hu)EG|5*8+Sy>e zGt1n9Wm;1X{A_6!FwLCE|G9X^BVC?gf9tjwhc}ORdkC}Uv|gd{5M0pMHwAD&I-T_O z^r~I5Hso+=Q<2Z$%<&}ccDI1ZGm!TaOI4(WV=d{|0oRngY|s7r%^Lf~vhx-vC#UP{ zOM7G5fT_Z|4l$@#(E2-B#yb@c4Wc>}K<q(zW=dM~_Sq2HV?I7$9jXt^I`qy!cSR)y zg|P+QG{~OM+9Aha4DAr=<v%EcB<dJ=Rq_^HX%CnPA&|v98Qi0&I_VIcl<ggWEH&(N z0jpl%0!T62t^n*~U$%|`MP0&al)NP0l3bk-)tTwDA8!@jp#iU{7Q_aP-X5^)6x(p% z=H&Es17_<~S#saFMv=uR%i90GxL9F;rle*w&}<n1?_>DJ;LAt%^hUx-SP!|o)Uk|2 zmVmh`05ep-g@6qa7&x_Doz0ps%6UHz=oNXultXpMte1*+$xGz$gaZ>5n09!9&QOje zekY@HK-v;N1u(hr98R66jh?{6dYgamIT8dQB>IuM@P}ANAI{5L{wP%Q>qs4{0<Y`8 z!P<Gq$%)HgX5PsBJY8pFFk(xyR^~8<Cx-zvUIbdv4pn|=8r~}tdQ=v4Bo>IlTCc6M z>>Rl78$CfSDJcPg9ch_^(rU_w4@|z3m5-rVlJggS5v{F$&*kEhlHTR^Nq2#|7tRE| zn8#Pw9WBxo`@9cNNc)ZsNN;N6iEki#`BHm(DSO%gV#?i!zKtH(02~w<7#Bqua_2go z+#V<Gl~*jX2q0T2L>R3@ew9jT{Mc1(ruf|VL$t^wbo|byEr8T2l)|<`F%OxGAWC)U z8bDLPxgaVtcz2b8aB*-ie6R$B6#xTUIqu$#0`b{|t2-DjJw5%(;$zV6fpbd-baQ&3 zMZ;$vsdkSxSX#+UYwVqLJr9G*+uQ;&2n6!~8fKh-W@e^2p6c@(s?V>ZPjZ3b(3=X4 zZm=W$EI0H6T@qw>S<{(N!qKWRkyw*Fov`~IW&#Kj$ppnHY5@o1THw<9QzzMkKu&9; z2Y4JJBQSc%NJuo^W@F+}GH7+SDr314GHbT@cqTA=e4G06y`xOOG4FM~(>jmPe&R|J zXt>93{Zn27d)W&1-MNSCcA27q*(Q_mKzHYUH#!3moB9>j%^>IXrpt2<tW-c#hmYpV zeOp8Ci2d8|Vv71XeK{?bB>{M8*6*%<EGtzIU=X)a&Kh^VTmAssE-4~3Em;rv>?;S# zCPLL9Berq72H+)_v1B*z#%7TWymW<PZ5Nd$$!lwCf1%B0-Gbna9;T^!joX=+4rb!Q z@4DO)YzF0E08aw)#34aX*i?!7$M-xBd9HV;Il%0vc<28JbYSi8$JKT!xr$RS`YEdu zfab!)z_KLgVZ3(VP$b~Zn|h+Q;^Ol~KL`cihrMhu&#~D3-jTm}j4Y*IB#L3$cs!l3 z6B=gpoC^TRI^HjAU_MP*Uv;a_mioI7T!7xP{}Da^hyp|UyLaY4XW-!2>5ig7K|uj- zu9da5Q13HNVo_5<DHD@C^EaT}^BJoc{qJc@g)N@L71xXtM1sD_jO_gid6g;TCMyyU z7#IlJ5-!bjCn7=KBP%2Ge6eOK?U)}5oYgx~R)(S?BQ<y2fR*JDN%zC2^F}iEa5x~S ztgo#V3vdmW19)7Fdl&dc|7Tzc&-^!v?my;a{p&4%7rPh($>1tnnDNwS1~e`qgn}MU zPn%XUC48wFZ9QI+lAB-h5()_lLIdjRgrvfkaOB*4^MkeeMvzPR`ap1KQ{MdGbFq_( zyu73deFF0xvY>>DyjnznP@t@atzOLzKeSR@U>A6n{^#DLis0TloSgr$uj$0574sl0 z4+w-4v3f;EMaeK?@Zgktcwj|bZ-V6{`^2g9yq{dYO$-g-UW;{(rh3Ej5<bfv=%#y` zSsR<6?WHvJ-&X3M{!lGHDF?lx8*GgR2#kQeJKghwd;#)j>Tk@<C?mcu?~NcShhiVy z9t6T*XHJQKat>;0MxtnA<KwLtD-poKE__H%$gSxY_J*85E+%~!Fub=OFTB?Q(==qa z#iWSQe1%3h{0<9ZR@2@US)uYn@$L8P{&A$FEgcj_+Y`a*e8{(Q1cpNq0(^!$9>tIj z>P(7mV5U}#UR1Ggf-RNU-TH_Opwii>ZnxAY7bbArk#K>^8Tc0AXop;%H++KcMF>DU zR6#AnBfH}=|GWNIYHXe0JE-amB50VE=7ZGvjS8M=kb)HN!zC1R{homG*WVNvVrG#a zlMSS?H=={@@r@vJ=pOZhZm^tA4H5GX2URP8n(<#QPbD~EnP)XRqd}^o!-Dc?qlY~v z8S~8>GypLNOgA#H@x)JpGODtp3z%P&iQz$e<3$9~SHM4v!sHA*UT8Vxwkv!?IkNll z2(sz=&rS-U<$tq@?M}mOihpRiGx=aJ1~ylBJKJ>LgJtmXhjS~y-a%6|z$zJTB%>9` z8wHJQP)7sSK_1=WcheG%uP_7_Qkla=%Cf$EZ^&}S#SCcSmLspMEHHv(P>v0crEY$e z2FYiB6LbsYtAhjmL05nGUr<Hz?`oqaguO&V3Bxz0Z=f*rah$EOeXv)RF$kQ{+_!&y z!JQ34F?{~~IcWaVE%MF_C2V;kw5lQfq`_qM_KN-BaCnQ@g-?M?4yb~`A_wZ_?qcuG z)mH&1M2%KndjH_S-pJ;o9hU_>Xy~uVPV#6%+YktBaXHkC1?}b}g$GqjERx9nJ#PHb zIAy?P)Ys|_!3PFz)o|1FP5oRsK;nr+Y%B=^z6PJ;$}@NYB)J|TRmgnjZ%7iGgvqh! zd!Fgw^erVD>{>RhcN*OG-WP%jR9SPH4{Y6%8<Bx~7W^-Bvj9{e;-te}|K74q=kM_* z^I<O~?al|hTFX&X*_A|X10Wg<D{*J7;dX{Q18Y9uhIKdM>n`Z$^t+xM&Ih{0f$p;d zxaBoM!ouP{7li4!8<>MLv$GVsBs5u~?)Z)54_~>3Z1hwj>)mfR+(huc%f9Pm{~ZM0 z-#Q?cxSb6>Du5CI+ylCMQm=IjF8Yv=lbdH<;dleKgA{8hupYI9tRcc9B1jtU!N&`p zlO!+;DX_KwsB>EH!xreb=ETY`)u~`IKbC&87Dis0tCqjgihhB;EGykleiOgZvr^<w zcT4%q{7ZZYj!66uq$UZb0tV{ZM&SbxY~6rXlG4u-xD8=IXf7-)T)2?``VyST04Y|5 zz5<XU^BEk#KGMcu`}*EdUClq>5_1f?RN;mIxAPQqJQgx`%{xkipx*(zkd7ueh-ycS zo(ohwf{6eV_&U-4G62&jLC^mo!%LzzfCATOBIORy70EOD*LG<XsVu*g|5gclfO~k< zS%+s#@)9zOh`jz58W$JG#l=<1;`MnP`5PrFJtgYS!tX`TO*%`+{fhP<%vF2Zu5w_Y zVCjc#w|_`XWN~{8h2DTg$41(1jlGVQ&;Yu`;B;-$*N~Nx*&5CT8ot0xUu^Yjty`Sv z*SutK>t^BrWuf+=%zv_{SpNkuA5LU@{$j(`gz`#CZ>PTI&hSeD6lgMQOVh`6Y^-t` zwmns`3U2b!y%yLX0Q9mn>34++JRg(a&IAKhjS!@^-!GUgv%wY#x~}x&i9T|p0Hf?W ziw)t2Hevib)g@nnTP3)*Oz9G<;h-RA1qWiXv$L&3jsJdy{MUI6EdZ<s_|7cwPW?6# zxC1sxbv~$K5~tOC!?yr^P{1T)5EMj58BmNCE?x5BxyG6lHhHa7K@n~{hLlHp({2r( zEO=P|U-_0l{og0^?^Xu4S75mV4;p2%-q-{YHFqzPf&BNN;36%LQJb!PGZ`tVruC(H z@gX=lOH;E!c3xvO-rc4@j-<qjO{d9h17CjGD%Tg_2HP7O<|k*awy_&>+9n(2pdJs~ zm}9;L4geRdhtO*-2~9rdKB`D+HfVXu#8=A0k7xb6`FsKQ-n~a9Z>kc<ktz2C+|3@M z0+(FBYXs|qsK7HSe#=;;2lqfx|K}-#Z!14^>{Z2s+b|&jETn((hF@}$tnj~{;$dM} zL>;+LL(2@B*<s&);{3CLZZJB4;~spcP6TMyVG4Y*<<;J1T_rV8q-CoUy=p=ojOkKE z5xvbnL_igH6q|zM@3g$16OV|SDop(}icFyra<@=H1@^=~TOX5id|y{vqKumi=_faE z|Nk$;Fp6aOX)#gy668QHZEJFJ?!b#o4Ll~KSIcInrx~jVD`!fd0FCiorAp4E5o8!! zoryA<y1III41{1a=*>V1F9__NL_uk`K9gwh`frM9jD7neQo)PJ7{<SpMeSo@=t2S; zdUUrppxG24ydHy~^m`DPd^^s=;-P}L72oSPfRhmwXmHsUa5r7R<{b<t%2Z(opH8Iu z?et@i-?D)`l*_H=0Vb-1gaqK>1i}HM1N8D)A7L4k_<yFhV5OWetCb>pfBg78_Aw$N z0(T>(?ByqN^8|AD;NHbJCoTC4PI79SuJ-m^5bRHFfdzATZDViGU7Zmddk8AS413s2 z(ZR%N5K~?Y(Z`HmLAP;m%F!oZ0T7akn3yTvz{)LXLoPmiP61@VZn9IiPD3LqfRrE# z`AfUafdr@z5+o=B+;`;SZx+WcV)KjBSPsw|QWly)3a2w_KRHt?T|Er)Y_%fOo@h1k z<>h7RE0C1t(A*&5F?IE%@E}Gj%F-H8s{!_$CJk<mx{o+ACiHP>ug#cH0Y3?}YilRF z{;8p=oGl^F!O{Or^szz}KUB8ea!eK!&EF?S-7dCK5HeBHJ){9~+Z`}4&`Z9ks*2D0 z46q5nmeJDEf+`p(+kUwfM#LOkZtW+HX-u5QqL?H(YWYgd7$EpqyDw&G4T1PN17vPk z*`TEJN%jJdPJ}c-c7K0=<-y0a?1F*<kPlp)jH^<9{Z;R5p%h!~vZd|_|L}jP`U<Eh z+pcRt8k8>S29XpHL>NLk6hT5dq#LEXJ0+wWR8o-cPU(>D?j9K6zsC1@-tYa_a<N=4 znS1Ul&)H|6y;V&;Wog^(@o`(;&o{U@%&7v31OMlpFCiBO9mZy!;b>#86~MYidzSJq z*$5v_P{CE_lSAZF%v3q0I}&AX3*%^-t~68T%6N{)u}b(EXiIh?HhA3&%gcfMw%$ye zGZO2Y#j!hU6)u6;h#rSDGrfw)AfRU$Qe$1yS-<-Z{R+A<K>gppw(Qsh{PuDrQW^ta zcCFZHPOm=$BkcodEf@)KWh|R_E6{K~8+@G>v+!&%>XT~1cbQW|mXkS-e-`?d6qsd* z^;{^3S_Bb7Hc)Z-otZk%bPOyY_ps+MbXu<tyqwaOQN2Q9ouHiTZ2zv+l@;J6cme_q z^e0lx&n95hQap7}H{=97Vf>LFk5@Wp1m#b2(y+aFiF`oEf2-t5az|d1UMnIS?YO!d zkE$RKq>I+9&JoOMcLLkLa|&k;Ciy;{1#=p0>Unpyirw(_rGNl>2c@w4^igl@*RN(T z14+0qCN*t%0r;2Ng&9YlMJ7F!Q#S^dW}BO8i53)?N9g|mG8maLK-97j3<tP2z;FNz zQGNsDpKZuM0T&3>OWG{vKBBD`bd7u~!Zlwf<J8@CPVJ3}wTX60vs2FY;$P?zj}rp& z%G2kYlrk+uXwp0o00O-3`_s}Q;uDgRLbkvN42~_{y=Gxy0lDGr^=@frqaM=N53y7* zmG4m87u^^z?04TlUJMZy*7>F7kOnpxx?H&QgFh+v;6H;PV_6mM3?4Ju7aWmN@U5q( z2M}1AuXld*_V#Z4p}WjxMHs*j!n6cV1$EXv*Z+itB8Y#9PPlt>Ea>V&@EQB+cyw)h zvL=I7(YC7tf}Nw!z&C|)JuW5X2D+Is^+OH&Tlz89+%F4ao#(pF%g7V-kS%Y;4HMYa zF*wbBn)`0WKKA*WguO_8fWk?O_3*_=#gK3q3E#v>Sl|omDk7YlO8{K9p^GD@SQX60 zDE_S+YZ>>@=8dTq$^R3|)9bN-xF>;j=r-2-Gd`HaBeW+%uAhLjxfgVuc#U3^SrMp2 z0E;{MN2vAQAH_V4<$ni|HXUJ%0h#V!X|f=`k3IpVN{^#fRG=kenl<iZl}yF^8)p6t z5xkJw{;w%pu2u5}`}NTB<X_T)&3D(VkCCE~!}ihyClnuGa~W-PSIhtpzsgIW=6@oN z2k2WMzm#Iqf`3cu7;kV083_Ybj-(09_~WNOp9f0LkGrXe1<C3=Ze_nY-dtFP_qJsw z0hCnG=>V-F1Q-A*TWJC(=oyoZfv@1)>O$kTjP#cPbx0)(seJ&lfheCh^?|PuaDqpA z@B0xLV_{Ri;%rdpuUgvP4(S*NGT)7WI{(qFt<eIng*TA(QAOw1YmMSsi-dnNK=2*^ zcMrl(+Enxt=+e5P3PaK|rVTzYQkh)%>C<c=uK~neaGucAJee+t629Jwc(EW7H1UCb z0;V@U4Ilx|XPpZRlz-AeiV;-Cu;!xre_t{Bf$t#b-FQAH2=K$1CXafb;$9Pn@XQX; zM(9S0ZQIE<p_?zR4nGHo@Vf~tbN|)jrOzY)lPW8qyvKyj947K@1C=F)YxgY(m;B4M zub4bxH+MiDSC)e9BQ<JxaI1wJNc#gQ^fQSrG%Y>T-wh6p=E;qy0Q;*LiYKh<(W+DZ z{c>*D!0YmKx%4Hj_s%zvD3=KJP;n{ODYErc*_)ex*Q?Al2NVRhS<e~8?jsc`#XF{` zx_hg+ni0pxssClur~=AdH-;iDwhxk#G&olMgbigc!QJxb&mRD)klg>oM)!-+%@-yL zKNSni0C<H6!XwI8aHJ17ba6Nq<Rw!{Np%Cy0GpXgbPiE<&J01s1lhExbbtuVJR6UH zu+ex8cF*yX$Cvy-fG0d0OItJA%Okv-U=4fC9QbqE4FS8}=R!ghPNc*YxGnJ;o0~xe zJO*@jjWmrzz^iB7>$vP+F?SKf?;t)@F|$qkn-uAJa%N*3Vt#)FtO8Be`{E5`933x! z@-Oi-^)h#;y{@iq`P?|`$jAtZ1|Oiz0TA5uE8ml`Cc_=BiQmsOey+v65msUwF$5<H zw&~pKhzAC1!muOphCl$~U*Y`HE#79O^^%Mvhl1-1GYf92CvL4DZn0{>hX}mmy!Uah z#7C%r3tBQeCne@T_rNsZBvO$HjJ%S^<9v>=_C}H<JXuY^ZpGhs!&ks|$$RFA)XVE0 z_#cr<$8L0sc=I(0NV1e@RG^3x95XJI8+L;*QS*WCtDz%Ev^L3%YPo?#Fd94HLWDi? z#pR0bIm)?^t`4w>>i#$L@1ynh(!@qbAK9yLJoO{B#lyqnsW$je{N?Ql52shVibWoH zvD_cEW7`Tl?`AwVd2Am(OF(pGl!Q9a-QAgrgolqG;C{vTx%^lUo_N7C?<^$Fh{yT8 zTT`WrAhlM(1{|t~%cp<{2%OcDH>3!Or~W5JtNb&_<uwP+oJad(fX{}Cikh<C^6)Pd z^>1b=2FHhi%K%y&CFn%k^5Pl9R>2<CrT$5L?*b<)usu3q`p^H>22shDZ1{N$lzh9) zU+aZ*0wFQ66ytx7ZTMf_;`snS8$w}JOxREq<c|4@ivF1ddaMm~Ch_kAuzKHohXLbL zSMp(PJedUe)%edy7*}X6`vL_X);k@^x_FQ^(E3gpD;>4`^VWagJr@V<(Idi9F$`;| z;QLnjM@jfZ6=YMTy1LB7cWXsy@1lP`hR^js2O^&ibo`q#2wqxr`#`b8!O5xG?#V0n ze_s1<S{s7YQAYK?H>dWuH&w_hjR^Pv{{s=F0H4f}9LU|3_|>dSPc#iy>#skoKB)gD zq2N_raYUxyfU}0@ebk3u;Olc{nws*T1J9HRpiCe<0LfM7pAv0BSYx=%0Lb;k{{NxM zWc7LX*E)yw-Q?dH2?1+@-uLGpbKso@yo2~E-+-$n#&^hA;Qt>7ESk6G)7TF^v0D4B z;Nv3#Z?s^uwS*ObG$WisP!+9}0@!1H_>dg&aC!Nk_~S1gNFpX8_xCpu{`pNo@SFSY zmKSO^HiuxkNM-;E_Y#QFmuWnn!G0wuDERz2zD#sYQiO=As;aeh$;D~g|FOB&WZ<7x za2C7CVps}>t_WVA_?#-WO4$kE*9^A<0n-eSKLO>R`I-n#Q40VD0gMP<j{%y0x~|)K z#I;E=EdbHHXho%xPvUF^M;k^710~|WJNAhWh_*3k*1vmkFLh6{KcoaPo%dHboJd+T z;N%2skl<xPjujAT3?^|s<YMDKEc;p?WD2^gC()E={oVoLTR;dp;vs&H*AmYH3!+_e z+MhWG@R@NFN{!%umx4GN0og@679@~*z3T5GehTQz?{NPp2FN9{gJjdqx!4*c@}M%X zPhQhO*XVSp18xE2{UZRImZ+Bldy*II?2qfh!~USXmXHwO=MR6vi}8GLS&N$A3WU3O zL)1V1;if!5@A2{eP(_6T>sih%!v+tVgtunY4V8A}^bZZ`0$0T6L$CbQwhx<b*!lQW zR|2b)*}xHu%ebVRBl##iu)nvrJk2n1GX~H`&kp9vOme~2m6u=`a_G?c=NZ7mYP=0t zGATb}Ac98;-nj5=0ykeQ1(*s19-(M|d&jUg>4*Go%O|OFRykkZ$EfiAkA(XAdKssV zt~`8ZX6B?<F5JKSF*zER4i7mz#3%pa$ME4QdxpTZ7lZ&w5W<}k1Ros%Z)J+X*B;de z=;sBvu3PFI;usZ@xU1=9%P>G_AR(Ipcu9#WLF+^`(TRyufV`pA0)*&&(0)o&)%;se zphnO}_Yc%51vu6nif*N8dCBZg;lHcEy9CL=!0@Q2Sgn~-H~Eu9!P#{Zg&P2s#G2-S z2`d1lrM9Jv>h7YbAe7ZIAW=}L#;huO;p6S?4YD3!#SLad{ZR71)JPJs%(Ak~GU@_q zND5U55+(7*-PzbMSP}Db;fXcqKYT>=Jr(t7R!<+*YSb3T<9Ijq^bZd8_pVCO`t$@B zVytIapIxW?`T7U%g+4D%&rpB&;!$6tRW#lDZfSGipos4rxN%u8MFxgX!^6V?jUBYW zT!4_=c$&f~3)Kf4eai;m$1loRd;EXa-*AwKzNoeFJ9Ai`AkFNm`+cq5N8{YnE!*yl zs~BnO8JDZxh{Zw5o8w1QxPPA-{E3oqmy7PVNpIQ`8;jj<0aEm`$ZM^Zxj>{Zk`KOb zw$4|+9b%rMoBD0-AXIlUS5nJVHT1F%)ZR7k_$y62t{HOptZw3lKT(&N+<h~&VCUa! zSo3US8a<SB?aL8cch01fifjO3y0h{fxSE87gyJ2?QtF!lo)*mX4P-p;-o@5l4&KVp zJ#Y)zbpg@)==X|$2_IW;s3A=Io<;MIh6MCCQBX2=p16OP3)YT$d$TY#bWwjWoI$mX z)HZaBv*C@MwJo+}3DL5wS+m_oPTRqAv=%Aqrn=0IT>r?h>!sizhZp_Ar}Acd>Nhfl zhMo0lr5~&0zLtRNRPwRgq~culUG*(lKKYW=OP|59$2RGX(yktpNIvIrmw>h7bY3GQ zF}0ASt!Ydy{A+}zM~Ie5c~V(8FE39al^^%8M;!zZUqQ9=uwIL(Q9PDv$$X}gMe23m ziaWs+I<UX{%Vi<Fr0a)YyWmfYG!h2pJDYmR+Q@b?r=#t|HV&*h4=ZEYj>&LMsS3Q` zYm5Tx^G>Va+rVzDucS+dk|mH11We}3hk^x@@qW=QSUCEx4(ruhi!upHy}Z3%3Vawy z{$%@u$#Z&YOvG9Nmpk?;rvc$AgSE(sRYyAY^>GxYC}q#4$SFT|i9p?Y+--+ADm+dW zAI_m^ktwtc%q(lE#;D?#&CpBnBM7V1;j6MW`7ieh8goof(nMZ<0X_~($hE-V7=-%c zS82$d_(vBPD3yTDl6jS(@$?~LNl6L66cAR77uB6c{?BUMrH{@yJ*qmiN278#(2^>U z-1q+FoC?IK>6YvQbw^}Jx`V)1;6hlIJ#|Z6zUQCkxc71UFp#c(iQeiskBj{2bVdv1 zULDY_7^9x@3fx}JV4_uu_z$(_U8oJANZfRG1~4o<mJ6>>ciz38*USQhBLTDy?PkqS z%K=Qwv0+C|F587eV8t$bsYcE3e`<No#HyzHVhf-?oTt1CksxPxU~HS%9*3jR{j~9B zp3i*K1pgutvoz6hxKz7bw=zbZN2tpw81IC_{IOpRiQ9Nex5OgZ;u>EO=WEMF%#iML z<Bgb(SmSdm(^+jUti^m_^|{*W07O|aqt1oqH*Pb?b7)O|YBmi{i&(Yo*y!rf57^sg zmqP#rEDc*{mhY5#U@hcxq*?E_eGNYF1$hA=eSWGn=5+3l7$=1NS!x(N4+o=QZ-~H; zAzZh=0bw6QG?e<;$_iS8@?rxwVY^jm>X7(Ls;3+pxXdRIC=2EBLIo}q-_g_7HM`pW zkpChTiT2jUIysVyxBiWdeI$BtcUTqj;u&BA4AUQV+|vhWhY6K+cy<<2^dP1YT(<ml zDhUee28b;7{^^WGX&S#>+s`zmtpzyYW5x0hjDUy;VCzmAX8qt!uK4*g-1%vHTU*%> z=;Z)Kh~ePDPz6w6oX_146I{W7pS`9`(Q$TUGpKY8D~+230oQuc#H;SoBI!t@9+*_F z^XIw*22*T%u*?C}<(X0|fTEqy;}F|9jg9+RbnOdNpPmd33x=PLj6Z%BgN_jXvIDIn z=g03-l1BWK&1H}Nj%jKNF2>rDcX=3<*xZW-zE52iW=;+X;X@X~mXa|yHwS`<RlcdF z@gj{=@XaM(#lMxArps>(i;N^ne)Q;(5KtBbl{1>0PxCP~#Wl--12HU|u2)`OZa|~< zcf$@Koj8mca@<q8|8$u9_0_o`|03%=R?sI~Ub)E$26TIw`aWt|Gj8Vbo<8@hfBr>8 z_T7^Wb19T~2f_Imt$-OR#!$a`=8y*^qth+U@~^7N+nXkJdAxpS)YQ}faC5bB8w3EL zV#B`h=usoOm9rb1pyW>W0wSiR3(6TffL0jT$p%lsrb^~P4Isk#DXuA;6$;Ay!N$gI z{^-sd?y%!-7Z;bh15<!jOjm&`bEOL8!;&|p4JUnrDcpl!OLw{8mm%=5B_Qg!DHXHM zn3h|OkxHDAIv5pCx8vV9d|&rQbZ0^{UBc{}wN8qfdgiHaUtj(EKZX`G-d`Ici-n^) zSh}b9Y0HO--{zmuARyz2{5+OEOsU^Y>&V-6Jxdm_kz!&hs9tczELE}r1Q<ZJ9H_PU zF-Htv#jJzCxe5F$%EQu7?a|TE=q0(Rx8!UE!U6(Nko<x&4~W~ucw1q>t%Vi>(d`fH zyrWOb0MijVODp<y*i$ibLh)_bbRo>QZLYz0Z_eG*GC@Sq+Ed3<)aM|^zH>qL84tV9 z8T}$oeL5~N$|k)|3%%?aC4D9d;&ziuZ;8_HW~7XR1iVelxf|c&7{E|OstEv``t;^E z63|YrnSxwu{Dl7K2cuD_brP1Tj;6P{9_S+*XjL7oqd<>WJ4+0?0R>>EhhX97*K=7F ze1y-FMKaag2`E*vpUb!YKnpWg2*>X9)qU?JhK`8FMS$sL{s!OwQFjDckaY{J1zBHw z!jU@dow716g+HzdC^meD=u^xBq6yJ#8_d-DhbpP=h|25NNUrhG(V5>W-ukxCl*2&A z3z++D8Oi(V-`A8>t!?E`xTXq!N!=13p5Hn2$A8<Mhn8y~KIhX;Z{D5h6Zdrct=&vy z&m=IB1g&}YIYzVF6BE<kP{^3}hlBlA9TQ91$N1lgX*52gXhukSRUAnfrc>xpm#CuE zk~Jmu7d``LMf0bMMU>T>Gk>V_KP6<%=_OX;w@A2oPJQ&hrDm(0`4K&GsAV+U@`Gw2 z{kv*$=s@90Sk#D<k;S7?SkHa<7;LHQ{$kcfPDmNh;K0pr3tHs>1uyHvpTWULG~&SP zQnyUcNBv-F$vYOrSBB&oAOnh4FkNm72xh^1suu^qT~HMupzNBOx&#<-AxLBDd<I?t zw|P<_*GlFX#q?KyKz0XO`j(g~11(SKB*TwRPw{8KHI-b$maaYR2&xuW=$k60RILz$ z#3frC3YBVW?KNW8jjtx@9v2#w?#C+<<%p_`imAbdbIo3mgE<gSH6FELZoRqysfCkW z!T0mQ+Vtdfhd!Z=%ZNlTZF{>d*eP9t7WsM9>GV4Ls%qVdVFglGi7iFr0CXx(v7JbZ zq^ZYl)V!L_vGv7aGQC}$K&d0^w3>N?=7?s+X|V5?e)7${Bz59b?Bdu%N)OJ7n@5)+ z(pPch9-|o6GL*g(_%*J4I5vYpiGrqH%^Rik)Nc?;P6?MiEM_yL)S?#g$&A|2$OmQv zR4ASI%@-O3xQjmA#<ivbo}r=Q%=LcQ2I{3Sx%9U)knh9GD?rmQK?q>(Z>e@92MCZd z=m<)5n{|RIUw`CJC`fn3U{#0vN@6w7lpCTpwKY;7b&ZUaZ@q{|j)91|a#ezuo)qQ_ zLDr@l7xSeCjHkW+g$13D_1W)@FvM!3MXzf&)A3Ky0)m2oFXOD($1??K-KbJ^-CySM z!&b16L8V|i-~Cn$SN2a2c7d6apCFz^vdg;cQ5uBL1y;F)XgQ=i+gLRtHSIS4`H|vr zXdhb5*UqRxyrT%0HOgeyh0BGeu=21=C}_GvLFTaz=*Qjc8L%|o<UF<dURU2X&FW<! zT#AaTNd;*mKgjD;D?>!@i53a;x{mOpah%VYXQT~OIKSR_iQW?-;;70#np>1sHZ{dX z@X%xpYCfbB<L!u8-5!^UtrO7ls-m-#pn4kcFg@>Yof^jVKo?<>U0h9ac6+FWGB9Na zm&iRqHFd`>s9Xh`yv00gV|B2bnCO2cBoq(_@3)3k0geY7F`h4vzd4*-dGJZeRhNth zQge&T=J$1y3q{rn9UZ+DYkNhV4K!|av}AgMHUxj$WKhT?781U@grur26KFNM5-z`B z7NwA%3aALjOUh&Vb>{?1W-8(+#_q+Sp2gmOc6J6npSlHwL7F=dlZBZX?K3F1`4J2< z!vKu6{H06~OEe%)bPXE=4kwTMIJH%Qoa!|I^c2dhY;8IFoDSwf@H%j_Jls1;xR9u` zkkU;+t(Tv+G7u-<Y0-l?0DyoUc3Dq|Y(>zC3bR0OW%j1DN1!)zmMzd!5aV^Y3y~Kl znLY214MRK8sGJ%SSn^aC(-~+KbI*>&$i~B@g_c_()?j7FVHn0?(j9ELN#xtSq6kD| zzRDm(z2(2^Pp$sG(_~M{VDN6Q%;DilY#Qm2_;H>JqVzdz$-bjgKg;CCB(JkjXIYC0 zp%yndN>NMD?(lcBVh2j6A*0j&;S?+$X-($Ase6F)>(YCxdqDW7%=^Yv!+Dh7&WeX3 zyA-hjba&>etWtc6?M@BQd%9uN(&El;Y!`2kfQAgI9qx(}HD1wlvUva~`xEj(0f5<= z0i^Zms&eWOYXRQFRGticr*}#dJ`_M(NkvJp13$)Big*W`pq}2Mo8Sn1jgcVD;=c+l z&o*FR2MJ^*lBeWn*4$5?=M!p5k>wvu0ZPxsb${2r23*;XS?$k*1$`q#dmh!TflQdl z;3F_-E({ShF<1r-Q*TdtnKFVI%r{W$&<V>1zCM>K@*{LEh8G{#lLp^16Au8L9zL6e zXOsSnVlCL;X%LdtP1EDg2Id9}d~tT3e@wgi`ornSoXVq=lbef*6~w}fK1@V~ODE@* z$Zqa5UdA@(;f?Jvx*N3`_Z5lbS8^nD4yS$NVx%bcWpeb?X(DwtzC*ea+u!+@b|KaL z%{`GV6BP)ok_Y_t6Kn@BA9^x3eUW`&)@$g8cflcCVZL`jM$<)p6rd4L<9@{MH^mUP zSsFdR+U`sd8wJJH^^CDYF0Bp*vNaX=fX2ME{zMHi0l@Im^2TnU@hR(QJyEyIeX*0B zgucf0+}wxAz5?z1*aTGRLM4LvY3UVlzw3`$ap@FJ_ZhS1g5mes6?r8O#Uq+{9v~vx zO43f$bT%qCO_ask^YvLO2T3~Up3cNEa~%Io%}!|4k2@EZ4;@LJplB5XIMyq#y9RT? zB-0{LYc-|%<J@6Cs4+h=FjT0NQ-<yurZu*r+J=#e?b)Uh2<lVJxC7XdZXx=LV!ZU+ zV!yx@RA^;ATIvD~&{RalPVrif8ce6uH{<G!+IHvBMwR117r_pk`>pYr=c*up*x33) z+P!73h_O*Q%nYX3qdE}m!C}N3<jTT3Cs9XMevll6_>Qi+9o7MT#<n45f{Whc_u%d$ z^h~lK-q2B72tW9k`vhxKuT)wD13|0h@hk@$Rc-s&9pwI~__8=KhQCej<-++<6~l(s zM7^kWVSqQ*AiR(q{aQlnh&HN~H^bwCRL8PBcva)|sUJZ-NtE)a`=UW^(06DnbGpIv zY|Ht&_tThnxzG{&KS}#cS}0-(l%^u#rx?$yTi3Jra)^9wZ9@Z;;c)nmKxbqmBs7*! zoS|>~m4G~J+s0cNG)M}>OL*^*<-7L4M*+7xMxM5xrgwgnHjVD#U58{))5ok+He+lQ zfF4|P-kY;+KXU-${`ycW)0}P_c4wBgdKRHpB9U)snYe)|EC(lKpxvQ2$5o%0;?Q~} z9Gv#{^zm;0>g$?7n>*1Ux3AOua8}YydZ$7~pQ(pPdPiCv=|6oQetwlxb_5x7`mTKn zlSL$=k4}v9vfcjrIqm|PKL|_>L1W9ypA6olO>>dXrR0tMcBQz1U3yO_XaZR9Ovzt< z>hXQ?En@FO;07wA6uvNb1~moyg4J;#E9_}975&mgQK<%P5|w@p&Wz}Azy}I67aHBr zGCELT6DER!|G`3<{@(2hXn-v}Gc*I4e!eKNR~rr+4Fh+qR7gNF>$?H${7c^i+_q4E zkL5R}3^cD5vZ1vur;Hcu^!bt*yly}3Rwa4B!V{Z*2RK*9p8@V+&O2!1DP|BS#s2w8 zbKfAtmhi7PGM;|xAJC{#Ro-e{%%v?vL!{E^CfLn9c^MFLozh7Srs!5DN4iNpF+6vx z4@`+D(+Ci^J^wiEmCjy9*i+~xWf=C=2U^8>-y!{c?%+5mRBpH9^ES#<KAL_u(bX{= z&c6BVG9hd`F|F;Gl6KzAKndw`y98YwN4|cSPr|iC_|(KdtXAQn_W&ZFuNVklc3N3q zl{~__!t(^#)r>9Kpj7}~E35(Fn$j)4jy$M0)cImb9O$JJg(9cQcrp$NVH;9?MF$4m z(U~&*@%&NJojJ*P-GIfbB*Gjti@R%40+y92(Y{`*{6P<GfGN+KQI{<nU{+))Zb%K! zC&#?nA_3a6Pb3TVH@Mvi2Zlhq>BP0A@o8L~rZ@j1`B9Gnp~xAju(_o-Gw6ELi6&R= zGCw#J)VH4`CY3n8Km8GcM$JRp_gQP}>%yOq&7_5|D{_B8))|xcYGC;Wz+xCD;i=Z+ zuU}B7{1Qckx5@)k`2^CS9GEqYvg|jGsUi_Xu#R58zx%xmZ-{GX6FqbztyqIytwuSw ziar5A_mwz#R*sY3+*?|Nyd<i%GQ!b{U=$G^NYboyUn|DOCRipNWG_o9K__@9zBy(J zsG-R?cM>gZnR({E<^4<{G=R;$k4B4JpiXic0Ev03vGp{6vF*z)|40&vT=8jAHU()c z=uiqi0kuwf-k(A_6!JKX;q7>u_ybv>Phw!7;WcyCEWb`Ug?=6Y)TS~03y$LC2Zq*L zkW4dN>KnKsi1QCd?;MA8WkfK2lGfU^H*;_={8E*Wkps-9AkE3X05jCd9V^Yc@UTA= z7=ba*x=DwGmY=*7MrKLmlGC1s0t;f&{2JY9MsyNIYC1ND_Ad`LO(;Vig(vQl2?<If zzC$BWIQ%T&I(Q{?L;Ppk$%5La80WVSedEQ&#WinR@fjVEkXc>IEWxR$s91g&Ao>#C zC1;zP4fQD(^(WEUpCB4|RFFI%#R;hyjowC9d|)%yvqLAw%FK*|cS@VQ0<hVu_zfw4 z!&br(m}!@3{5Y%K6Q?9{d6J;h;EIqq*4)>D?}-|4vYS;Z9@04Qi#ff;|C2QGGarik zlc)Wn1)7Nn8-+KTT!W(A`+fA8RtK#09(jfY%voCP+A_Aj3GP?oFZA(|==8a{?O2Oi zSkR|-Kr3f}y+Be1$Td6N8uUH)N*456qKFDwGjefSk~kKVq~fOPqO=d}nZ9yZf5(2H zTs#IFzEH;nbr5AC=IIhRRxYiCQIvy*2o#Uj7S(?m$$*BD<4HfS8KOJrZ19UGDNp0U z`Hh|3Z2KORGar<;lkE7CmItVP)}l|!mBAVZ5`X#bV#b8>Yq_<0)0xsDoDhX%p4OW? z5TgZ6b{x@+hlGa{NIq#J)Vm__%!A^NXxK{dK+q=J)SsrN84!~g(h$Ci6-GC6Y=WK0 ziJqh3^7CiGDMq%`z7wLoNnD1U`b4=@w0$54@WmUTz{ZU*2Zg_+2?|wIHR?0mSXidq z^ctYw5!s(-QmkbLW{J@x06uM2WSNw{s#6l}s}+B5N#0XGK07NzR^a#3@><#UHHdLR z&0CCyF+Zq;AUW0#8q%D|r60dLex7)1W3=*1yKh!#H`<#BvFD;;MS2+ME2Mf%Y*yj3 zyWN>-feO0nnoxt)ojRby-Z<-7FanBd4q8F0qAX2jHMF%~5!929b^KBbK}RCdVywJ< zfB6U=8aSbrVwoMksg+VLTz9VG3}O>JT6<F-wqqpY3w7Bou3jPwxI6&yl<?E1vZgr4 zG}A06p>)RLNxGor=(SZVVG<S1ja_-7zk0AzcG5ZK7-Cy{W*M;O07V!4ItnT(P<rwp zXxl>%K%>Eb=aO>-C_Mp`1SohbtQ(tnZT0{f4JZw+2GlIv8I5{JHrcYwG~gkVZM!|1 zCx#vv^@yAw=lOTcQ5n-mVq^=F)8wa}n7o}<0jx(LN+tMQ&55RDN~O?Bjn0n7khJpl z6*3yR82YCKb=o3oDV)C9YMWA3>(J5zpJVaO3|%{V{%gu#Z<>g*S~KYJMAoKdqOSBY zIV|~c)q9S0@@vfQX91Oaa2C(v1gwVp#zv?@0w@UPG9ynaAtBrjVC$3wY)2jEGs5WV zpB<{~9)1Cfu#NJi(?NK(@iUTKzr;^ig`!8;Dp@;FFp_wFbd!k6Za>)GBCJ^O@(~PT zi-|@D5_8NuD|dCsT%pqtB|Rq74d{(uN-P5`BH7t@yThN7x*K-lkV9*7k>k?o%q>8A zf)*vJZ6}>MybpSg4Vw61{w-oOYbbwWm(7us{2U^Xr`p3wpL28HQCRva3_qrI_jjhO z^g|L&a-(?o6Neb-7E$?;AChwJ4B7@%%m_D-H1w&AtwPO0Sx6b%6H$vK4Xk}S3^WLO zT8BgpK#xW)&>F?k&9QXaBmG}q;X5Jm0e}-vADK&zxf|hoe9FqMXZKMCk<PReSAuvW zeexsKF-7W^-;Ul%_a&{fJ5=iq4s0|G<kwi-k1@hkUI+m*4LUSG$Z-Ow;Qy}2AJA6y z6ky(>-$v0ev$Vbou*H)G8LM11ZXQT?6cwtwzYdz543iiS1X#B``xa?lYwF3VK+*?L zxk%QxB##53KS3i@WGUPU9Q0IupL^Dno}8SlHREeaRY=ldfljEeG+q~hkqiNNss|_( zf}&?T1CX+uP@oQeOZDhGUw}zsb2H@KaSQXx3c(IgKLWxh$hd+@aqK`5hS{I7ZJNi# z#6-V?6r<A$IUeb2&L83LqDTOI0b)EZB>TZl-x$B+eUS8|v1ESoGz-UT<-4SSC!w5t z^-rkE(NRETK?yzJToONly{AP8zc>l)ORCuzJtSi<_-LzRJT_l{UnPHPD6!C<ob7Zb zNR&(!2jQxD*#3VfA7I-a9odFUwXpKtp;P8CVKv83`vMw@sV9JMSk^ONpXQ7e9gyrZ z(EI<Xcj71!4{vJi=cV;3i}ZoCb^PIhyt}H19K=(19KPJ_j8sJEO^VfA`62Wp1{@zT zPME%{_W4#vB+a7?0&M-phtDb~`2U?OuGu(0!O;v*N2X0h5o8JQ{&ecFHB7Un)XM4@ zM#R?fjQo00Vs4ZK{#|ecY1VtNz`<G4GEJ@(!5J+!NzCO0*t-OGMF8I++CLA3+F>hn zQd6*%p29+qa`Dlc<L<kShm`L58S;!~_R>C9Jp?3S+QTf})No!axL_0$s#7kU6UQR! z^O-<YBox|8f~2ow*kEcn{3y_7%j?uuE(fm+@f1)5X^}(tXXJvRt&E_Yi7Vz2y+g`s zP=pH}pI($>iWrst?3w~_gg<4qCgXvj-Ew-qQ%(5qdyX7(wG<Bku_-BBMZdH!VsL)X z07;vC2U>ZHR<Cj6SWU$!nz|1Z<nWJIyfQ6#i2bpbA0VS7Z=i~r;t03-hO|dBN)(1T zzU{#p$^#Sw?N%htGCLsXBh8STEc{{R7+hnOq(zKrU?@B4hnOc!J&StW)RoU7J-fwD z4Zjp1l5w&9-;35m|I~eE%`a$m`&93^FD51?@1|S+dH!z#PFF&$?+>0r8M<WRuTTkt z&O0rlE9k$ZS8+QXe9@Vd;qQ+$(9LEkXgSSk7ln2wN|SF}2RLl%rmckXo<Vn&R<o17 z9!n*~Q4coy+dl`?c0HyNE{eO)g2u4(s4LTgZ{Z-UZwl0*ih{wn6`-P=OH2nRAHg!u zv<wT9EH@-+9?t0PN<q#)PJa3MX&2F!OSSEDWjr7hSZlkCn4i~W51<wnDffdpfh^&> z4x`1Dx|vW;CBY}Dpd#aWy_FNCvMGVL(bm<W1E|!5PCEd<OeR5O?7|FzXc&Q33)<;o z&jK`ii|H~N$`SQXCqS_Z&kE&-3=@cf{8;W80XxCv#7KU#;DX1SrBfFl^p=^g%R*)0 z+eo~bpVVR|bVG^-n=<8q2`qrTmY1Q_Z)2ev4bEIT%$&iJ@)-tWmknCjI>H-FFJ2Ir zW~*~%RS|qJ@X-Gedq=QgE9GY!Rp>{qyy8B`+>txW-0@}cdz=#{TMj1&#~ax<^4dWg z-Q)gNRkwiRz8P`_y~GZ=1A0<*!+HuKNNdKPlcl<g0FVIH5HBDl#nEu&JCjNPD23v0 znHitHzYP-?jlzX1Ke595pE6CN_8mcB_Rq?rKlM}F1IMAn>(|o<9wq*CiBV7`M7I93 zn2m1kIV-)=;dIa{TK65+>iP}-(Ck4y-fbkKkDhJq?PR>>{-_-32mnSTvknEs>u<u? zoVfHDH|M(r9||)+gD0L)P7*ZcES3+$n795I)@uX#v}^)(DO~uxR=K&c?)1P5RCVy) z<j60x;=jtMMi9-8!T65`pjgP#1Np`0Rx>;`6m#Qf7*-SC39Ul`$`yRc&)o?;xE=%m z<4qjQ_+MghNht}iXuh0Zm5(fp!kF94%HrMu$}RIXizMi9ACrQ&x#!MN3OgSy0iFU* zK-7$E`TxDonxW^(=_wq0B}KJWrfVMpGz?`xl;GgtIHm-4*@bVj5c|Z%#XH457K472 zn9E@f#jfNkpo=%T+AZlOcS<M0QWi=3|2;6rB{Di+Fd~c#jT(0nM8gyQQ8Q}1KoF5m z+q5kIH6m#0kY1&u4^9zqU_1x_)!ITurE>dqSprW$5H-LP7)1RtAot&WF_7_MPX`{S zO7K5&e1`%53uGKVY}Y`=a!3g@yrr)j&?5paoU*b|r)Ot_GvM(6IRV{<p-pfKA7p(4 z@??06yMX3Yi4S%TZU!GHW3;_31tnGGXB{BKxVh|p#0@ra`CB{C)&c^$A{JMvX2UF~ z(j0yd5#T)k&pYD&GpOJlIe#b;vP;sw1x>65fD5%Oc-T+@Bvb&g2*s~?M@l4cqkD0Y zYPI31YLWALAK@{szW^2Jx6+<_LiWO%0F$u#zmrFBiS)Dc@!0=P-v2x&+K8}JPYa7F zIyRQu>&~6GH|OFPSaKkJB1CNfQre#Oewt=~buWiP$Pfg)I#{W&X#v#`O^qZAT-YlX zT3Y1!Todjhy$zt7HMAkf(~f(x5~Rfc9ohe!`ruF=!RCdRh=l(N4y<3`Jl-#^UU;W0 zv@!)6RdpwzXhAZkIh}e(Ot<hDHk?xE$%{6S<i0;V0ElfSjzg39S0Vxec)kg^m}<qD z!C)u+v-^SzB8#13|J{A?XGJ~#-)GqZz&(3YNt<QzKTpY+TT=Z1e+m{UH<A-l?5iIO z^U{ZYZ6IpN;S?5b0+j;5%lJ-609uIt_fD61_1Us94qU}w5O<m3T8Y_ICZI7D;sO65 zg|SbwLbTw1s_=f<?=u@{#FPgNG88|^Hhj8F0L8tA0*JOQ%mdNCF82fGRB-BIR9nqn zoKNX)Zft}Se);*|N&9lLRKD%`|Lr)9|JiZFl;4qIUv}L6+W~s@#@d#Z?eE<^0IyLC zfvg79nX<C7Kwpx}VdG`sV+x?muF(N(OX@*)pEGD>kZrg$gI`@+#7u??njq0VrZIBx z$p7~g0oTMW45%{SZ|8s?0`Cm4agY2yF^IK9z22lF2LUyaUu(wSRMzju{Mc9p$OwST z;ns9H9p2p%tNjg-72E^;Yk--^`!0u-YYDYm;=f196%{q#l*#|M;hO*1aPY%wx*eRx zQY5nhqO9L5h~r(K@j$M7A6e%Gc)uEqvgI&(rJ-^dwzp@QW=%R_wGM*p|D7IzS1Qv% z@bl@PWRnMyH@AOsCqPa8z{U%d<U1iB`|1m-X6q|VhE~XzsnV>75u)a%kz(WGKo?9S zfTDzS^Z?741nVxB3PB)+%5c#=!6pi*40eZtPgTE*X`}q|fAIxq10KK8{!N&joef$W z-hrxQZZ5sR<ygW^;FLoW)vw+FD^j$md0Rwy!^@C%Gw5A7izAzpg)<9pttD^4LH9p# zQqH2Gx8_%POX7d7I?#?dX%bZK6i6&$RQ$S676h+`)q@w|;txU?^*ll2f?4XuGzL0} zBv|fYtxIpN;SD2u`Quig2K&#pnB5<mfz$r~3DUtQ#+U@-I=wU=APEkj5f3COSK#~j z3^7SJANU7=8{q8n@`Y*&(A<JIL+1QvlK_^Rz1&V68;JW|uq{FtMh-zb`pM%#Sral^ z&mwFNqmhg_IT%~jI$$o|;DLHK9|+6Tm(UHywXd(P^jg#aQ5gt9sFX;W7L}FZNIupn z0U^G8hY?byWg7{SWh<<M9@3PiGr)APyqdxim2)68Ny~K=2k(pvx3iG7YH!<Mn%}e& z?OAPmYn9<U+)dgvxnc72A>}4Aq$>kkPL*81=iUH;*8AzV{0?&lD;-NHU32!qI*O1Y zN3C0@b#SpQpPiQ3OKWvYi<iWp3$O85W5^c?=mIaf97qaD2TMnuG!t%6c+3mF96dC4 zzY-!?VG2u$sM!taEyw=lb<mmHoAra1HB&t3xIo?DBfK}!J(k2`3iPh|=@f#c5Bycj zXN&{`@vi_+#7+n2)bI6NV09O0`esHdS^)1yoN9lP_R6qn!{nlkH{~Mr3@tRO@t*(b zx3}1xJ_-g0kf!)+{tJY2r6#oKjc(@4{0_-yW}c%S-1zfqY<E_zdm|r&!|tBAF`cBw z_h$GB62XpV%f^BdAiqyIbhdMEmedgX`#R$)V%do~yeOgCuNrj<tIiIOx6!RT)y8D9 zjG(A4l&JzAr+-56e;&F>+i*hGXR6LChDl!p4Kh$BDhiF%a)XHWCVk?Wj7a(hYT%}% zZCgpi4ax=8iRfw6PUDCBUv=jTZUq|m3lFP`7I5)Nf-o3=5}_~mhA6S1<6i!%#NJ<B zCE~GK3IB#)>9GO3d*L6Sw>Fg4bHg7!tAFnsTAyBNx6b#8<N@0R1DkZj3I1Rd0~Leh z%!{A5?m%WW8Vk<M0Hu9W9RvE3>lY3H492CCTneW~9s_E%=QhEbvEJqA>WxsJgs;E! zcn_Ll6Q1x|L?rW!L0%$fiDuVF*Wi6su^k<8ThG5mRjikwCz77)+X2mjTOKL2@7+{Y z6BJW4M`5o{8p%GFj6NrntE=re>EEmt{yqAHGN*#JO!{?STpFz_(|mzkHy?i;&BHq3 z-`MP3uuR3kH<#=gVMy$$S~n!+LgqnV58@maPaB=cLME&OW`rbbB0unIH*X*x&T*nz zH6688e5=;Zds+P{qli8V<$Oo4y}bE?BNR6BxmmLC4aoB5hx#O`Z9xtTWFXR>#Ad<$ z<2EHSY?}6{h2_Upo30xgt1U8F)`s@Wa-Rnc72leymJ1bB)}Wmotswx}WiwBYI<bHs zicO}<a?1Hv=mtzLIjt8b+xc;bZ~Bi^m=Q{<GTb8-Jx4C&z9bnm6WPRVNENv0R>iNb zt_ps-y1eK{S^<{f=-AlZ?Q8*Ir08=1p8-uoKp?oy(!$wV<-3X*h<JWB8c%c0((7Sv zm>k5Ow|QyvxKz6Uv2b@-uL+gciAx3chbEPRtuBIup{BhpvajSGZ>oE!kYHy!x;*|B z?^7I)1Y*8GoWf|mz`5s{)X~uaxV1N+0tlEncx2^8P?>OH-P3?gTTGQwo%P}uyDzL& z-t3=lkd-#xs`|CCqEeb9;E)+2Y3u1=o^^nay<muR?HEq~Fz}{XN8%oZ=^35Z&Mm)M zJIn~xx&EN!ZC2`A)W>WG*Q7Z~8I777S%Yf3lZs(egRmtd{q|l%uUu%1^TVIXqv+1g z&S%?W-JP8h*FHUiFp;;;wO239U{y!-F5f2Q7B49|H!oeDd#3P~-7h6tG(Y=N4cm%~ zwulKf<SMa}4p-b>sAY0IHtXjzt<9|z<AfAo3xGZv6kgpzrPK4kh$oX?+WTXfI_=mg z)kpONmY##YLMXZs&N=!qK^fe4PWtZTEsoc9a?lgPx=*m*Fm3Jwv!~xcaJ2oRX~4qR z$Ox|ABH-nJ(+IS70C%al3+Q8Jy826zD<W)YRa93eLV4Q{{!k;Na6?e{*(DbHvBQR1 zna&)mbXEGg=9w0(XSAH9FK+FeKiT^vH?~d{=60i@hBjRqy`J`(e~jXCe&@-|cb~hT z_{RKBirj2*GL#O?5td7AI3WD0seoiv5p>dY-uJ*wt%rG^=a?QP&TJ|v^{)G>lmbmd z>V53jI9)OyuL++Mp?@<=pN`K~C_Cw?mJUQ?xKf@VAk<{G%+shaE%20}Dk{8vYE5g@ z*;+cC^T9eB%m4W5?ndTvWCGT(ka^Hfi+;Lzw~2Dgo5M`0t{(aVA~EmTChMK)di8yG zt72HFXbsuoIb`c$GT!62yqLprN#Jf1x7M-#@fs2Bs<k<uj*&`+A1Es4k^2@6V2ddq zZO>)>I3j^=^hc_t!SoDc4MwA%GqJoJoaKFh0BI}5msDuNhh}`?ohCxyJ6`TBBabG# z`cOoB)ogzGR-;()oxFJzd*iU@uBz2B{-`YRtS`K4(qmz8xPDo<+&qIbBMEI$JzPT^ z(^S?<O02?sy-h8P@vehLuZU<b;cfOG{4c9GoUis}e%&v=ClCwcb-h&}M;pL?kj*G; z{a8(L58|+$TJXV7Oz=KKvxnlB2YO1Fhvdyw&s(Yym~`zrp-ML(`BdL`FSxWwDOK8C zDJz-1%X_LI^4j%1QcPqvkA#Q>3nJ}%(bqUQxOwQKf}=4D7Kr{&sB@zq(`WhXh{;h0 zd^!9huO2CfMzj9Y$>q|i*~rG)*m1+F-mQM93Dnv_wA~E!z(Hp5llmfBVZA2<a-U+; z)cbG_j^DN0NYqDQ@vbsQXY~vv?*|Pngd+455|?`*9(M4%>O4I+*6`eY{;{vpzF$<x z0Q>Xr`N-o&63>pCzDPfv8||Sw=pqUNE`hXYN?amUY6JP5S$$+>=a(MAqq`8f<(-@$ ztM*7|-33o-pDMm^kEG=2j4!DoM~^qE{nA47K%WFiDil-iN&I2%Q_!&_5?TQZ9Yyqp zPm&0>Xb#PUTO!m?5^v>T^DkZ_QH;!G%D<H#w<;(j3!<8P^}S~JV>88OL$&`R|3H`s zPySj^GJ!d-0(zJB=22$5vy#N3OK?iC8u_06Zi8ROtZP+I=p_0`)Vb39=Y0ISQMC6- zZd;$bpX;Ppr_NKLntMxRb&Io8)p!~c(?!vq+4-A{_P$A<6X5>n>eDTvsrJToV3~C~ zz)ZCybKVpfTKi#atT8#(zj%1*OsV0cia<$5XPs=3r+~2CCX~eea3c?yAXMOdvH63R zs6z@B$%iDtXOH`{MKX$$1)>dPWl?D$ECSYf#k{QEf3SzT1&nl@mjeLT9q<4dgvrEX zsHA_#*0PTKZCoyVTXlkwtG9m<!>RAu&r}OBU`PUuvH^1x9-r@Qp(;2@>qpj!#TI*2 zrSt2qEvG9XyTe#x8!AmJPN!dX|IpQII~C1(^!yI_e62$7zwsbKmC8$Y(=x4R)Z`U= zGT+pcLhq1nb40xzqk4Hv_r0*#8-#<+Z3QLj#yE$CM8vs=xARo-85cDo1iR1EiMKP% zOHdmxtelV>w;33%IG$T-)ji(h|M~I!x5q5GM=DIo`}oJpLX|orGe+*rp-hoQ)-w@- zF*S|~&#Q5}#M8+M$JwcUd%-P=AG3z~Un-C5QAa~Lw!V<<)Rt)v(J|3jUK1(Y$d`Vm zfrL=)sa~^8MIhbRdfZeYYo{40R|7cR;r`Bpb>75in)I~~mV~FOjl+0r<Zm7Jxd>7L zYn0~mXS$AiqFU6#i1QB|B^8pii;ed!|LD2^aj*)b!4H{w%Ly4?jSIiG_Y~Mzrn4s; z37@JB#V9*`?oAMKs||hMd{;$0;`u=K!)&w3w<-=ZtBR4T_p_xhrm1p@o6Iz|aZlpf zD!Kuj^Q0cqb?b9q^x@Zz46K`at-!5d@<S{KenM=EYvB!pSG};%453SL3$VXBTM7HB zM{%ga(QG>ztgcRwa?jfK&|K-)iKd5ZC1n5C_UUAVeM4-qY$rEGGb~qfqPls1`dtoH zc@p!^?{aGjO(pfi+a3NivwTrYp*DxXQ9A-YE0tY7f7Itm!>jdG1Lo&4jcTVGeX-E> zXBs-c;{-RQA{I4&Ia{W7DwXy7X-YLiS5|l4FX}YI4k>o?RiEA)Us!5*QcO#vC~X}- zU(l>`w0xhfzO1Ixi_&GL(#(ieaBGsxr1q|%acAON*QY|*{tGrk(kb!9O3q8Vdg2EG zz*nGcuMix)=nl=c=2Al?RywSy5XB!wUo9Gy?Rw`RE0%6w#%W5htp#w6>Lq{KqjjS7 zC$b4Fmr`vikVytb#bgYxstxU3uXih6EtYp$YE%%ge~Hqda)Q0-Uz4yA^L*z#C+qOz zz4u(b)r_estGUb5d#=Y&gcKY#=-5Vb#RQ;6)|ijDA`*0)piLoKV_(}zH#I;*3E7$~ z#)Ja`Td1jXE-fYo6L`t2G)~rjkNwoJczP7GgS1LogQ5S`&aW?)f%P*GzdV^t`55%* zn&QkyZv3aqkEd#dv8)$j%oYhngnjS#&OQ>)bX`KZ86aMdslsI5!R)@{wV-8rqP<fX zVkIsai}=C}Y3Q#tU*CEERCT__KyVl(bhN@E<HSad<aU<d7mc@Y7UwWw;A@4^Py)qN z)%tyjD!(*Y6ytbAtuoPg;fFXD&KSUZB4$6EaY}1;aymnQNd{A16#dxWpdcVi)T5he zP%DdnpX_T5IeT(sJ$QM23Dv0nD0YPWJkhuIXV><{yM<S!Rn`k#`n#feWUHU-`E_z; z1P@h9ky**0ySg@wP`;J2d06R2H}2sT4b^H36%9nyZ6Vet3^CiA`Dg$G4N6mmogjdW z(fE7Fqw^_mBjTZtHS?a}(TmTx!C_9nQ)`zXJ63nT0WS_5o7^GBC#f|BmfusEtbajF zkp=`j=<0^vwBuW9W)54VT-2mKb{$|DxVVan&M*;vOl9N!=Zy~{@;H0$y$9Ys7aDYg zM0!AG(5HVdFX*!NkZ7yE*fqX-BHWvkq^?D1d=|mu<?B`lX9?E`vOkG!FJv23YqN>$ zeFD(L<^`*bk*OV)JNP1|=NuY8nM?g9x4YZ>5XnXef!-Y}>hczB+#J3Sso5vMKWH+% z9asBlGUf_hytiL>m#}F=5H#s4eR788*m|(FUtM{{cQ{oNE95pgU3Y&|KBY!7bmeBr zd}D0){si!KzajV;U=X^;x8+7>M5RpL(M{(4P#+OXu8pBpDUUXv&Mf(KVjY1I*M+6G zjtfP2;bK(+<2-p@DLb|kz+a4ly+!_LBs89N<u_MS$`eX2U00cUD}5j6QMG!En4O)c zSX9RO0^&^Q?UC2p>H!W5qQ}o3lq;~_E4{>7)@W#?gb=N3ODa96prSl3^b@;P@V_Ss zg6T!BtgflmeR2HWp^WZFg(KyjjTj`b@6vj+#qzX53^{YK2EvFaGj0^}D0VfT+??W| z+#I)o;rI7~{Q}*>6Cm{fOuJc?^K0Vdqioz_4pN<a`sSo3^eMjN#t_+@>L<l!a5dk1 zupW69{UFdWw&QRnNO)cuu!&=+@tNOnCG`gam?q}M3aIx}T^<vG@UU3Pb6zyvlZbZ$ z4r@lppZspCzQ?heu-`<u5yDz6(TShm(rw&~hS_blbe*Rl#w6wcd9C+RzN{7XgLF0c z7wTX6DT{-UpeQ9GgD)mSiuCa{VeMkbn5DW^r1K;bP5VL6FOT~Zi!)J9PvoL5N{khR zm7a6A>C!+**U6bq36NhS;3G@>0KQdYSs7>CPptB%Yp6$JSQ)Yt3(HeqlZJv`vFi<0 z+!X3YY9({MY0qb?I)EJPc;UZ%oomV-$-H-_-Hh4F#a`gcclg<2SfzfjNIkF1^~TVx zCch51Vz=iTxqySx^j163EM-+^k#u<uyO8HAuc@v<Pk&f0Y);?!qWvH@;p$Eog$7cb zG6gxP#3-O2BVG=hr??M0@3KeOt2FzjE#|-_FMOs<NoJ!v=d{=Ilkw5wdu7d+huDJ; zSw}6}GCt(e{Zc7bF<u)!oGMMO{5X*dv{%#H6j+(eqnX+aXJ=Tx`?qCWdr;tSM{vpa z#6M(^GbM29SUOPO(<4SgT-n#m3!Ak`b~$Z$xYy}<inZ`gy~5QcHCKcynraM5Q}@?R zFw$=K1zQOE>E3V&DKDu*wPG>$p3ai}R`Vi?)9Qk+SOQq(UFVAeRW^1T12Z2Xd=hp# z#w62PPDScX1OZr|^(~*4@Siv=?zd`hZct6E(;Wy&VQn95)}j|j?rF{~`8^@vPI@2K zZF>9Kx#a%PMpix3h)hlX>{Xq4XWNKP!qe{<t35+P)km6ATn^bdJUp;O>xJJI9@>+? z(@$6#<p~T_KOK)hj!py7Ayw@taPiPHzQ~EBzGLk13K#c8Q}ruNFi^G9tX2a85$O+b zM;jBoX&iSi^(fns!iZR^^t$k14RhE~MVJNm1}j06QZ|92erEjVe!k-bYUx|I`|vmT zT+#b{{5;mfU&Jhp%O2Bm4;>8Na8_mcW1TohP|UgTv?74@pFV#*N|eYtHns6y@X~VO z&8)ipN{{5W!(^^Y{#v(wzo?@37sKM*o}r+KN@X6*Rhrwnc}dg(%Ne2E_qR=lUVrWx zd5p(G_tod$?hnS=u%}eV{?X4K%l|k#oqwOgWmna$ulp=Nw4o&JRWmgEc@Nqq$ADWh z&+rL@$M}`u_(PoKg?P4<iw+;X@h}sPg5SsD3#*cf18J<-0Uu=(C20Aoy}EJJp6R3V z+RU^yYGSh`{|Z-CF)YM-NAnHo*H5FYXew5rkG*9QK3|xD!04nd-Upy#)C}<LlovMn zxu*qH=SN3+s{nH~`C!A`8dIcMUE;9$yF;0QSs6e8npKv)dOZP&dLL(52~Kh}wvjsB z=jwzY-8d;iig(1~1{=54=YaP<6fekOGqgxkRY9}{HLx8BDo1~|!)q>CNrj=$zyI=6 zp8h`e6J;?9v4?}&RROGVS}r=D`H3>C0|<DbK-^_9vzKYSBW2)1-s6mPdu_8T4J+uK z@-Bg>d5<qLZ$$)BV)vd`Hr?%o`(Z_~RmZsyS8F-tn?CFwM6bizo!Z74+3r}RvZLwU zPU6#zUY9>!Ok6?OhaWP%WeyK#%*GMNsIk;&U!kY_-Q$iGY1Yej6z6b_EWCua8nOnf z^C$_wP0Ms}`|>p+!4abee;J)~q|@wewQH{N@+yL%{sXLy!uISW+aWR&NByz3<6u+` z`S4O>8}ZC6l4gxKl(B>&BTEWQ+BDd(?X|yXG6I&sAYG$2Hc-_FOkUI<c}>$1(yX*# zXjmM}{00NsI*Zw(d^0aQet#Vn#U&nED`!M`>F0RLwThsF(7o|yst9Sd=S}X^-M$0i zcpCx6_DZGelFJ{Pg1)+iLY=|F`rkbP1!RwWw22k1r;J1=n5l-^S-+SmlS4z!d{e&7 z=8e#~cD~Ost{e)yzmsHl_5Q@gAs&;lC2g1Rrg$vmERG&Il2WLTO&~}d7Vt3sb+0Qd z!_7(D<hH@!u8j9hsF`88pc6GZTEH^bhVbI8w?v=vi${oUUf;#*ZA^V1g2Svdqt>nU z@(D+3IwOo%Lct4G=yjljMTTe55`K(jx^?|k@QN9Ch_oo?Z~}G}JeXGJ-In4*gOSy6 zuOl>X&2+~p-;4dQEBVO{c?B|rTRwKnUtMTO+B3bKAn3S)FnAb!69}Jcj7d^)al9Sa zES}-w=xQ)q|9@n?WmHvR+paC0(jeVPcZ0By2I($oQIJwVdeI=#-5?>I(%mH`-6h>! zvViY)zt4F0v&Z+-F&M5nuX)Fn$N7cLy+i1OjF)x7aEWrs7q_g8&%&DdHQOno4NsNd zojR3>++EJQ4F{t3Q5<-PU%=Iz1?RrnwH?^S-AJ(4>>Dv97P+GtBc-&NRbBm2^4*CB z<2{G=wACZ;3*Dc$Ec$KI1FEs3SQ-ihmF!3!m%G`cGG|Yp8}&-{xN+0~jF?o}0~By< zU!dqgAnkk$(*DcF&0ivJ7tacm6hH`q7Lkdo<QoX<V3puD`7(j!x8#0)>>{pA@Ih`Y z>>|;DhL-P>Uxz51pt*{XhvU=^dgEG=EV>&t_9e1q-p+Lnl_IP{M%bgLmLX5oXmO~f z)u_lud11z3NvU>PIP|D&ceDR#i7@mw@fFh7p@LYis<Btr>M%yySA3_YQ~|MBNtCf! zOj+vPo;)#!^FRNJRD_~MJZH<Dn?m4J^1a<nIMlCA-{x-n23ynJs&S3!`>IvzY0pxl z((S=di?&RDi23k+`aL_Dxk>=pi%}Eq@ixtV>^wl5Q#6Gk?9eQo9gpw=tWI`s4Dxnh zqui=Xo9hLWbdZf+i;?I9@m<lqG2w6^AAPSZm0JX9end*(Rl(AX_3+NRynXuO+fA1d z3Qp$Doqz>xI3Ay;A0#}u28>@j#(x)}s;1X5b^c)e+qPIbD5V$009lj}?6zp__%7I! zJ7XHTV1F2me0`sq+UV4Z=WJgeHE9DIbrZdgY9k#RFA4JWdMYETK?EY;1YxJU)5@MT zZ(H=ta`ZlmNW{5~(=Tnby0V_D-;bs8bXFe7o?V|W-zopT3L6ytl9#{~{R#;nX~plP z!y2ygWX`C-aI!7b3fsV%@BBh)3{HUt(t)030sZFYHPt|(Bh?f@jMIHEFql*Ek%{tz z5fz!ztkj9l_jL@NA9^c?nP0a~<<qCnj-q=W!F73^6HcCR9DnZJnN!VVp>B$%!QO6Z zw&$Ar5gMlCThYDS#Fk-JWyE)))2l%+9Nk9gPa|3NX03h0>IJL~Ez0C#K}F9=xWaAR zy7wAeFH4WXQT5n=af(LB)V$SSrp*3j_u}?7RSt4hXvLx{;vUYh{yfZ-6^T{T5b+U* z;XYyRHykSKCS#`|FY`aI2!rW&y@Sc9Zn}#CLch~<JfojeV5CefTQa@`sXLjEmIjQ_ z^k`jyIwZvVZw=DR5`ov0V;~n(RMZO4>prkE6y`YqNv+^)yOnfZ19EbOy?t@UWO(NY zZg6W}#A$IgfL$(fXLQw0`EeZ|uX=22*yL&WXsUIUv21bH>m<PIZo`%fj|O7kpobzh zQ}=enfU4zhrClElWHoB_!QhN16}!bOF}(^Sl<_%lP7kuAT2MorL(Y?pR)v7Ip7-j} z5!I5Tyj)tAsv+O0<6BSI@6VG-i`iS5a=LgBl4eqWG+yjKu)t-<@S&6+@-lfziqb&| z7y<%_7#f>9SF`9#;_ZT1T|JUfjhZ17Qf%c_{W>8DNyfiweEN;vVblZ->&F<|LF|+= zKx7>t%7-V(m7a{>nRM-N>+omoF#`>5s>ZBrf+37a2JOmL7TR{QARD${%I|D7EFGQy z@+^nnG>6f$V61ucmjZj}CZot)@1iwfcEqk7f209+%Yd`$DeVeRaWe5!N|k{8r%lGo z26Lm6>C!^-ElQdUd50XcNpvZS_KgEq`{dwNgeHogX-}w1+_y|8`f+^m(luGlN!M{3 zn9X!6v;?SyW3ES(tsXVH<z`n0I&>8zjeX%bJ3H|Yf+`;kUT`EcR&`5><0DN-_%Y7I z9B+3q>X?*Cp+eprKYc<flwH%Pk^_#9WOhyG{3H2?b@<*hv{N6sunc^f<tF@M)f25Q zlJvbzQsQdWp~DhwR%%DuKnF`L{xnWnZ{tMd#)$7@;~2Nk?l)TYL25{A^UY%Q74>|N zlF8!C!iHZjS8{Ll0xWuHg<#KgdNMyDxVc2TJQ9VRJa`w<5_D>cYgvq0R+Chb=s+P? zCOv>1tP##KiD3ZIyG`DcZ8=ytX&aM!F8(2KV1dXYK;~ne81^7GnMmENn2-2Tk>5<f z94v1(Bg$5nVBi#;={&&cwS>eoT!$(D80=%+&3I;gjf*$$NO-N34CH$!?SR}g0I-~% zp4RL_I>n>Ng>xiZUG^q|P$Bs)KwdCA`h|Zw#AoG_Zqe|?c|dmL*xhfQD)n0yZSVej zn0MFXX}w{EpRhRsa&bmhyO2-JFTVuv$O4d+ofDU%yGd5n4{6y0sxgAUSmw;5+kbhy z0_y9?B&vV9sS$s)oiO~=C{Q_?&rQt}{TJc-<7V<#a6C__`TE>wvQ)vY)Si#J+vLh) zt#Q2_O)1);AMHh1$R-L`&U^{e1)0qXB(h3vrZknaZ^h1uyw1i<hC8`4=3C2K0<6E; z7J9#9W=)31nq+ke?izi(#?xb1&at;_1~d7?iixsdmk0C4yrH2KH1v6&5ZGb5lffr8 z^D9@})t|?%4z3LxL+N9)1`Oo}k)B>>6!YEvJPOgfBA*jJ3EIi(50to23=`(Rpc=Wy zJkRZ|!1{7msm{K_!>KId-5kE}w^J-*ar@Qto2LCisM?6gOVt9SS!?x*giKh(sZq0* zlbG5jBkiu^UHt~Mhgr$7Nd3r;DGp?k4}wgTVb5YzW&E^spKV+qV&hCoVl5I;)u*0K zex{42atm6darj)z+a+?+hTWv_dlNZPaxL{smbb#Qbc%y7dq(dTR;!&kvInp+5zA#9 zHv77|c6f081P-mWDipSpYMm+!gl_OCKHPp^tsP+)0wwWNuSap?w^p1o<(bk@j^3ua zDwkk0qMZVn>KRpf2xA4l)=uM-b(y1Cx6DvHtdRNirf74g_(^##Uc+=W-sfspN>R|G z&_tKc%H`uMF9SsS)-Sw>9sRDV)srbDhRO5?Sb+$~LaxU~FlOI(K<ls{?K$4(YtZ$D zZc4k9&o$c!ATn|1Sd)R|H$qO0&CMn)Zn&Og)hd~n*PzeD8H-f068^z7IM0JlWED_V zR5L_+xnd`t0QEf?*Z3`3Q}X(9zRF3Hq2T0HGnmYmK>;Fq((w4|DKYoAx75r|s*bSY zQ!pzIaJ-13O#rzXSIn*a2bwPIg#2-naazH+F`CNj=giToRN-rnlLHQr#pzMwS(}AS zW2yZu``r2$`@!??pDnT*kvn6%X;~*cg+SOE#f;A>)AaR7{jVF+(?Ywjv9`Qd8_`+D z_}7St##?LrqZ$>)Vr~9l{GRN+yecVLL7TYu-$IH#1s~8fCQn|6f@>ywdhMa8bAvOB zbtG<1`}|;f3jREKBAm$~!JoYUNA*e?_qe(M#GzFm#(geze3d5mQHNEIk<RDnwGpX~ zi0cP9fjiImx<|8(n``^Dh$!MZiPW7JG~QjWuI;j<E@{L^Zfwd|#1_U<L<mGvB%U&y z@@<Cc+v;^!PpD$3P_>8j^0iJLY`&+-S<E1xOu*=l&g}69qpX_n_r$DA6FW*w{aWVM zF+*LhigkXlRU*yg#bsTz8Eo@>p4W^^9^Q^;`}O{B&ucGfmFvY9*Blx5C<kiPv`DY} zC}XnZPki2gC_>|RsCaWf?~$PBa7L6YE0K*<Ez6dCm-d*0&(phTmpoe6@j<roPPnQX zVZ~U`!N_A`oMtOW!horRkV5u^oLSYt&FFUieHMjKWtI>G`Rp2ANP=+1=LDfo=}#Gg zXcUW^Il7=8BdO{tC8XHh&d|cgIVz3EKI?SWQWH<op+Jmds<=od;Hk8CCmP*@4jo4; z@Pnk!g8){4;VgQ4`2nx>As>?*k1Z5$Y~NlHYNeW4!Ak@y`>L2{_t3aAJb*p8i%$bd z#w(I*RqA9*d!?yqAeI1I+mQ9LZlGF>Vz7!r)u8UIjLIr8{((&8J-*F~T)GHDy;E3e z4XwdLlJ?`%mSBXObw)0fQ+_fB0+0E0pwZtB4Dh-gb_L*Ns^Pnu1E1ImhQc%j&_so} zRyDAhHJjH$@5~hs9)yI19Oe2>n19Q1_Wb>-BlC?Q+YpcZpW^DX!d2+~bIwE1sZ(SF zsEIFMUcl}yZcbKL0rb=Z<R6|uOQsLN5qapMm1C0Ty@dc(ix=s5?fwM?J1A6Mr$8>C z2ztEQ9%YRa0LlV8U~{nQlnw+ZtAJ5@lI{dn-C+;C21hdh;Uz&cwk0O!x&ib8Dli0B zN@}GNFO}8cESCb9y|^Z%7W9)gb94ZYTn;!`bMq5~2=>#()4*#|I>@sW3joNNhK>Cn zZdmu-u`bODhg+UBrBi9|+zqooyA<FjaV|yBsPW1(o_<lv#WvJ<q(7H(5P#97*e8oh zzc^ckuX|Z14YemuLt+DUom?5W?ct8uf{mqkav|$wB6D&`m1ux&n7Q~TwgqC`%q&SL z?W^F&rG(BTCLJMx>c&t%#Rj>P<D=WJOnkq?lZmqe!Sep~hnuY~?&b3p?HQp4@z>w5 z=AXhCd^-Ir@I+IgT&&;T;81O!NsVzbb=LKNnr%1GOPd=ING4Rizkjc7zkPJ|6;|2k zc=OoWo<j<K-;*@sf5DVX8i#2<CIRhQQWdJu7I<@!|6CjGzz5U_!s_w2>?EOe=hr(_ zHESgfiEQ7p7U)VC>nOKXzHy7Qy#2WwkS531O>-o$+4w{R3ljcKcYe|F(eX(|D=h2+ zpS-`w(Qr~J!12B2C#bogGAf<iy^pG=y}3W$x^P+4$Gz17bfBy7o2^O|CB}f@VqHTs zVpRw?Gn<I`2y?frSJ2|F?W2Px8D%e@1nr6nlp!oBr;Ch15xF7jM&vVkF2%|pmmh|C zYWgHU3NMYlJz>5+_$zvrT_Qghk-DVDw5Vl&r!!;3Cye(ir&-V;?z+tgK@=Dvn*C!_ z`p=Km@gLKBD!K0!MDEOn`>}BY<q&k1MFH$JDmJLSG>RC85<2)dx{@#f@9NrL6n9x3 z>0)oy^ZRJ-E{c{6@%ulf)uC|SD9b`*Y@7W9a!ujN1UN{Uicl^^^>UOz>6tB3Zu7wN z%rzsFBsHSsQrF$zuWz!tz9ZSZros4%(2zY-)b7q3<y!l0FqVO!%MSMNppBN#(-cM` zFKxF~J8PVaVk0T3#V>*Hu<CKZ{u`eaX35%aFw<zQ_zE%$`c9?z69HJ{rFc`e&n@Aj zeKKCv=!GkPCORQYp*2f!t_QVHY!Ne7x8@dRFkDHMy8m)~Zf-8Aun!=yg%M3p$o>4C zc03QKe13keG3^FF4OD-$Q7EV(HWa&jK!2*WB)-&=>Abpg<?c@_F}%=)|EcdgmA9e9 zTyF6Toi?*}n@(qx>K>79Z&`>vV}2JIu9lb?(7!h}rSgZAIEt~<zX+<r%@n=(5xs~( z#Z4<C>hYFE?UY|p#OJ0vx6ajk;Nr@r)X6pACDr@%CF5Cp5>`=Fz@!^W;`F&aU5_W{ zNwmJd7$Z&n+AgtBbuoT~O%ne4XA>j{_Ue?@T68kB)tm}#WnAflTToLRv}EAG0Fj** zNye-YpD<~0Xla`<5r$JjQj!Uh-=|4>f{bUM(VhDF3P0Fl3xEDFnrtC=O|urY|5Tlr zdiNkYJ@nCG&uH<_S)u6;HkmbcEr=W+hV4ziW-cCZ|69+-ww5$DkD?Yr>$%!l$-AZc zJUSVCnSQXq20YOw^@r3;WW}xyG=r^{te!K2pOyUssx_Qxxuj_w^=~f3H4TCqP0kke z3w;xv?!p9=(MG)<d+LmY`I9<S#l1|VL@JB)6dW=aHFJ``5c$KFIxRRR$XJ<IVh!!a z67@;%)G1`$@W23J+bf`}wB*q4EXM~DJp*5HhR8quBvgNfRC%ynMH&)1Z{Ft>uhTcU zU+y>(BgTO~yXnTz@AFjNr-(x2hl|1a^|?~+(CqS53-S#W`f*1@iM`#3QlZ;89%4O> z9`}rR3u+Ya^^MT#qE7*5a1CGaDq_o$Utw>7Ly5@cmmSFuC92{-+%sGcGB4UB`DLJ7 zVt*zt#6RiqiI}Rh=7Zx)5&HGz!{<_;c~x&Ha$cpimGlk^@;Gk{)dJ6|NbNq)nz>Ba z!3D!gO#eE*jPYc7x2Wqb`r!EB80SL>kI9rpu1DZ|Nwci87GHewtI#O#F5zdo{6El| z9=I<#f8CiG@a#ZVVi(^mM|}nCbz^Bb^$uV3R|zm6E0n9neB}Nba4M&jQD(${?c&0I zdfwQF2XQTrb0e*2*rb9hD~FKW3e0Z{iM^Kpnj`h-jQ+2S+Sa<T4j@%m;AJZ>*4f+J zliSqbF=?jn&o=t261hjj1%TegbfbsAs`4(nVUOC*T$P0*qoUr2l46G27fm_5B&I{U zCf@um`&z@_d|#a%XzJCKS^*ubHEzAGYRo6L9ODv6c<B-y4-P9y%SkfLzL1YVpdA2X zv#r3Coi@LS<==QNIbtj?OhzFcf~QU#dF{z%v9|kTQICM|GW}{<Z(KEMp6EWR{pv)p z880qQt3Z+|v(~Nqkb$gV#6-+;GtkxCF7J-^^VTTXs%Vf3P2HMG$gl04vU=8ICozh& zIaaSDtbUg1+BGt^+7$=K^UsKzD8ZAD2gmX89v5~fJI}H(Zmdgefq-L4&1#<A*8alm zh(@!$lq0^K9p{fEaXPX3r11glm>!`W$6)uF?w+nIZfPy7I-4wYpAB9rewG7j2u(Tl zSH-P2yf1{tGRvxIk42;;%QKfBter-1Fm5GSoY?I=@@Dbvppr%oS+390m|hp_GKaaw zTH%4xLP^~xang?Gl1lws-RMpsn`$Y;CSS-3;v`u`=I+ABX3AH4mRDnx+0-t|MKZbW z8h1zuKov6O&!vP4M{~qvmpzrI<Luq{2QRjyDPpiEpBYlRF`KYY*I8YCUbiIAT?&T< zHm+hitDONwNA?z<ou#kM{lE9mt?yOM-wqET`MBM{KPL&I)Gca5C6N}XTq_BYzf!5K zs~R=8Wr&0Yx~Dtpmz=jG`83Bbt`iQ^o|jigEs79&FnQLoWy<MHfYdt%)!t9x4JKbP z?6KLYs-nj(uZ0@x+{L?OtZB7Plyd)1qbE`|VRnhY<-pzrYDab<UQu@zSyFfxL{z;Q zXEs`8?!T_sERp*eXr~MRjzDbJzx+N(pM7^a@C)gq!mNsL<Qq839U6JD=Id>{QF390 zH5Eh}JruY&!Lqr0B@++ly}|sd!MoC}9WBpXx54h_j5ALj3-K{U=zw^zwnnJA!|(Uw zvtjl|RnJ8kT;*0znm!B?>1T$*DqTP&>17@B*`#<c;%@0|??y<AVSoPhnlW<oOOO`d z)CCbj(Y5|iU0|j7(WjMo*falK6bR=ucID7RG-pQESyPSkv7*e%SKo+mE)E(<et%f0 zp)s8ObmJub5Y0=(pL$AgOVKWqFNS>f#%g*CVyQ|^inS+W157Ww@=!%{JCLBN5;We1 zzF6sbTD8$QM}8E~0_$%T_FVKjNzgH<P-RU`sU1cJu-k~y6D$%f78Lubtu{lle33AS zcKPS0hvJ#LWk2CeV&EI;*V(3|K#+8#dc$7ypJ1XQd>c31+YB*FBgHg*5tu}>*yVxZ zA?3}1*I?kwY*v>i`2Gi=V`w307fCjdIOq?&v@%e3pI+Yxj=lUY5j`5FrHu2tq{1f3 z`z)B(F0JJ%TmmW^nTE@HjsHZze2ok>u9{=S^UChMBf)#I!)W3s83D0DyPzRuJtCZ5 zSJx^Nd4AoT(TqcWG5LGEc-3~^*cv$4N}+!tEzgEbzB}43x{fTit)BWWHu{o{i?CEx z5q8IBZBo!BI=r(wMY!-2NLv64h<SMsJCT<h9;6z>72+XU{yucCW}j~A6)XKahno3W z@h%F~{95);_ZF(O2{2JG@%FB63ZVqCPWx3tkm9j>dx`~qO=Uh-x`Yd{i8nuf=Ct5( zXH|#|QxI*pIrJM5?w|;k<VV=7zeGmT$hdG!OejuRU1+msX{=|7pQN-~<0N{qu5ZU7 z8CIxt&L;kc)6Cswwm4l_AjYGuCG}z7H3Kqz81`o@DKxO5P}<^Twz#zSE_?Iw)6)hS zmtGFd(5Xq2wXtqZ#Caz7*$c&8{h^OkX%}x-IaDTUSBj=U0TJo^V-&WY#}_;NGNZBM z=C{|Y`uXwOwVmg(XS1YGwT)WIJ3YoDQC#J0%TzG38{8Ntl)0)X{_9M!uBo<Urou2o z#Gv}=;UsJP0Ze2E$`{D%KCMttPSQLgP8Rnt?9b5rfu&a-FbP2NLmEp9ir}q~A)#DU z{Fu2hRBWoJP5T$i*!y3%IpI=14gAXDggB`Oy<25_lT4Zrmj0I-!>e{mZi+rmcMDy6 zsunPb^b<!6ktn+Q`o>rEg}=m1qB|w28rFa^Qp``tSlW%YNMJ;VlBser>*3vNT4zeg zZ@x5SsUn-);D~YWhC=cuB(?oBJ5Fs9+K`Bm68G8zW2?LzN6yR(D*Yxt9(=N>rd~OA zlCl+S9YJ(i?IOJd$#=n1`xYZAp<B}}cQ#r@`fFx=(<&w|e)~8jA*sIzzKJwCZ9O{O z63^-8A}hNs){M(dt;=9l^gXY+Cr#`^!m!xZs`7fr@VTyZUWeTvDuyuEA66K$fy29; z6^R?W7*;l^6DCC8*gA1pI9iy2&+6-?wB#Dclh&+mPyene8Gb3#g36zJ5XhMfORf^z z`FOG1nRWcCMW1E2m+-~@MYcfDSg25D+?wh{+K!RjqXrLMXJ1kJr@ZPCN}Gor7TX&R z!z2?3f9cS27Oda10aOy0hDdnNr3$I4oi9exK0@9HcDWUgzB0_>GLr<Y$&N!By1jf_ z7`I4*eA59c&{RHa^O=HFPOCc=6&0_ZWNsUti0J?$0+tK<4BvH^E*-a02O<r!H}pc- zRRL=?EXe%LCC7*b4hCDf{f{hL^S^B~VZP>l%5Rf-b?t$=)HaVdA**_^{X>30aFp0C z)VN<<g1G&oy0IS(z0(+8+Tfcb?A}!-F|)o{yL+(?X|H8i{)y0T1jZb6wt9M{C{Fl| z4oAv9|KG1_AVnx8^5x{?%9m}8g*M|FY1>65QS7@lW-E&hxva=&ss}aYK6FNgpfB@h zc<;rFFD~i9Re5WZz@g3OT22nRhVhson}0(+ZieIg6(31QxId6{#Q7i^WF(sBZlO-n zos1U1RH|JqdAfxVCDXV*iK<GAcfnkdfFalauZt>BsE;kA3pCF35EdV;xEgXf^?VGf zEts?M(|rC|H01u2K_yrg;D-}b&G_`~4AU&#THID`w*Qu}arvZ?J@caZ{H3Otgi7Dz z_|0rqQ;*#!Uq__4K51}+^T|@G2t9vT3nAH*$Xp83udI3-X|qR|J7v(j$V*yN+#rdx zxw)w-6~mjQ#1X0=jNfNbR2%Z{XBD`qN(j?1oNmPHf;&r^F^kQfq%<lCF=Tgq_yx(? zI5cpUnCqkxy5C;)nV60r4ocOm6yhA>eOazjDN_u$-26=$wfB9DbwoE1M!%6xqpVTv z>tWT8+sXcF>=Cc#f_pi5d>{&0kdNb&-F3VV_pCa};<VXlg5An1_hy&<^_DS&r<WNK z5;Uitf49R%SuBc*VO<xT@tlUx&S8eR>%vq%{niiODHHFe5lS0uI9q)0elPqWBb3W2 zq4P9?qkcu;$vqkNe8oY25piH_kZg0#zi@Ln<={j;PHAIvH+Moe8B0g-2y)N!F|mOO z#mIcRV$pG{%jI9o7TZUi$_}%1JA=9(-4zQ^J4Gm};ls#_45ot6{Ww)_|NXzpH@ZLj zaUD4N(21CCFR%ktn=<{<)FTGXVHbZt%HTwgJioIhMns#Ffn?R&k3|<sLG-A+@7z(4 zzB|8WNvr@jEjk10CW-_9&-zK69nQX@sLproJ829<YT}<R394b|#gSW2nK!L}yqQcF zu-`n9HTOC*Cb^VoK1=)3Rf%JubCkGLU{U@I7Sn5v?l@N7jVReUx4205h0}xO&W{U> zHU)WyhH_zOw3a-e*MC^J_Gq{~m{oO+??Vbt1>=TO&p)6|O*XlFEH(N{YPs(SN?r@K zlR3_KNDE3FU#!_8ZwJC*J@rR^b?VB3mD~r6kA}zy!GADF#XR^@C~p5u9ST*QEWhbd zXCI9^za|y;YS4GmdoD+GweI;>?$)cbhimQbPZ%ece^;84OJQ7=K`mc9O%LDnYlm_j zAOUN*|7--6BcgRuD#DWn)F1h8QFECmLQ-lyX6gl0p&htjH@<za@AGK{h3h{Wh*e2w z<GGp`weTI;jtAmV%uc%DX-%ekO=5hEA~@>4Snfu8P0$+;QAWT5ZU|N%xiA{IMldEj zjH0-13M8BDt~-v?UcB-&`c$H8x6H}*wqPN6zOp+Bbhn9NDjzrzZSAU{U#OQ&#KD$a zBHNt857k{c4qLIC{3z*Fkk@F;DC^-V<SUUJQuwV;`v~#jz3Xg7^+kT6enD&hl#JCW zKJH3s1r^*Q`qov@QbTTrJydH31nX(+sK|orWL!0VIOvOo+Umes-9D3b2F;ldY#~H8 z6Oq@XRRkqqeOYH8c}>O5=RQ|f*Ok|`#9gLeZwnh%2+(Dx#9yn5!Q&rLvzv*U6}0wz z+Nb&3;<~k#i<Qk<RXwTn=`yu*v>{DBPVyz5E@cT}%n#SntYT|^_ksKbe6+)hWS!!W z-y4`#tJjTA1z2yn4(fBUFlxy!X*h;44lO3KF-DyQ5jI4O`0j6(4Xw^~E-HEN{`_(N zZRz!=g)+h@OR~5O^^RMNWT1(GVC{^&4~#G|-hJt%3WOWP?s@ixk~-k&tmEk5i}I7_ zbyj;s#_cRYsjJbArzAb9riCn_FL4Wb9c2!Wna#jOt<_*3K1V^70e2Z1_SvU%lWMna zQ0E`qR2kU18WPNM7Pc^mfHKWDLdRzKzm%iAN>GlmX0)LIdJ*`X$ai@n9;^~Xl}Poq zGSx|($&K-)mzxv_#cOdg*rg?@jBiygh&*xyErUi$u(ue~RS&k-C{n3@Lh3%u{G5;5 zt}tl}%I3ica@OMantvvW!?F$U@$HDQ&L>Ikfmgq;?){Kok<XZPeW;JJalI`s0v92o z15b`kTBPPx6eqE{Mmh6ZnZEIl`!@rsFoY%2Hw|Y~n)pxvtaYo6J|e9kH<Guk3Wsm- zSbq#S>OX0JGA>QN{)*2_d}tirC<^klIDK-$vPGz4V2063Hk8xjnxoXbl3;>e#Tp5N z)-F*}3e{W|8c(GU02vz}uK;rHH;8n+K(n(I|G!Xt5p$?ZLmtUdzz*vh&0En<e}Y<s z<<lY+=&(lG87{K$-Ni@jc#v1^H(dGyCP#~H<D9+a2Y&2E(?V=(G=3<0eJhLE%O9E1 zuB2;?yJdaGpqa#1y{+JthC2|I!~Kk;I%#!!SNiM?K{`qaWx`HI9Xh(72Nw=)7xtW7 z!f$MT=Ck&E{Jgw6ema%9Go1ldyr{O@>4Ct3qNvLt)$^lotMuN3QOIzTr?%htNfrJa zK@u!B?mnc{InGWvS?!I$;Z9{6w)Qw9(Pn%9BBGMR55<(a$eN%<wf4ChQO{BnZkY<6 zl2s-iurTbW49zZv!+(=<MsIBLT&Po|IQk4Cz|6nZk5MF1+fzFs*dv`xeQZ%$sQ-bb zcT(*nI`z_4029<aZtYS>X$fb7U_FqYAM|#F)K|#Z<XJX579yw?u~fY{zJz*RYi5C> zgpbk<$|<oCx9M=ilJCMTYkn2@!{dJ&Q^NL=4snC1r?Basl~lcLg6C#v6Bgf+*}A0* zHOcwgbAp*8vr|l1ZkV6;ovRZoOAD($Tk6m*8R;40qwJnC#`{Z0C$wv+>>~Rr|Kzc+ zQ1gD0idSD?mpDF?dm6Nx{g=P%CS3l^nR0e|)4n8Ha_(=hubpt$KdFTKB)z*u2KN%Q z5BK}xyR+QsSD6RVV$<8bhtX^3I%Java=x^WYGX5Qxov-XL=Z5S$sOb4<BMk+5u!B5 zMMPG&J9Fvs3lp*0l$-C4ZhZ?5SYH+#`i0aODxoO-5fG-?S5%^QDcb@OKP$UwLvxZC zo^ZR)RMXczY#IU(H`A2q{xjuyFIrqGxSOfN508M~pM#u)ueV)DAyI#)?i|*yWYwC| zhV*ls(8@C~Qvg3@_?&6@h^8x5K%vh=mKsv$r&;=eD3}4_Xn>_BVb2puFvMqOYt>ew zx@`Y9E=#Ln)hB&jK7>RUjs~JC_9wy+&dHt^<;zCow58<|AA`BKoyOUCam=7<({F_N z!YdZ)&7E;SyV{RngnTm?R}?>%R{x0J)^Uwxh_H?-|FtP5&sfhOHgO)H79DCKcB}8z z%MX;__JOj%NdB|1H8^zUA#GBM29!E6mIYq^^=KR#9y8__T)i>F15rO+Xuk6m_SZOZ z#VDd@v24nvY<U4S)%-NBw;>Z;axX_2UOPHg(n8$crp%bV?X~Gki~UGxRRF6zRYbT+ znbG1>WQ4H5k(^bHnES?+W6+6F{<X*!bX=1__BD&L#<ZJe%#fOBX>C;&jA;SW4?5CX zrSA%XY4qkl6&?ds7k88}ZbN`79(H@V!Gpi}{k<eK+&$I(Zy|VkIbWVkn-uXYPY>RM zQku<vkJlmLOG?0KGwygEd^X4ART8E&uP1Uf^m%>ZpCP*3tHRdv49^X%*1o}>k^FhG zL=d}N+7e;xw320@=wn~74ea6Qdkd5_CVH6qUW5t_w(v*zNqIY>z@>MRep^qDq4GaE zRfmz)0Pzs@(b&)D2nn>Wc;1?+TO<a)Q4T>XUVBANs_5*%`7?OE|Gmh&gceMWp1eZY zLy9K;p}wHvUmL2}V$usd#p`f#LLVkq;-?UiQN9<=jcaw+kJexvf1{=|pX_yY;w?+; z0k)X&2g@WK*h1QS$M<Iyl^hL35^5_C-cJFxC!oVmDH9_X%t~IG;clGx8RBfA%(?O* z5SBcS;Qp}{w6}-4dKv2b@!YOIj{oY*;0_L(MsHIASQvp+;Y3<UPa87Nnv}GjRU)Vu z0X9e$OC@jpn+|eK4#cJJIFlKlHu~VixLi9cLtg0*M}GE?KTn8ldeg{n)*(f2dBq_0 z)@n4psJO_Gi}yT$8G|kx|JeW#@_0s}TVc$=QNx3u^J;4|BxV=uBbbd|tTaRT9X#G; zIMCg@bfr%Rp8&epX4>zz$@&nQ5#S!qhd6PF(Sdf2DnB|HjT$w4Ha-}~$lPhW2Xc<T zyuN-WpHCLw0+Jjw-YvzU-UN>nJrys%;tVHBN=j*>U|7EU5V-hKavaC)Yb|zmNMZNS zcW+pF)?b`k$Vm4Z1l#DHOU+qgk<&l~5YcVBf6G{9vr=z{Q2DSLR$kL!(ce(KVgh&| zhzGoIsxgPbyjLuj5imZ6h~=ggFrz{juEP?`5?vCf2_-(pXm=mQyFN;iFQiKz67rY~ z2-ZFP@u!<ej4yc?i8J>Kl??g*Fk|O)u3=5XrOT-fv;jo0_SXVpsM0?!=C=tYni#M6 z3VfQ6ZW#EQ<(5pmKrFIX;%hkKjasHY&;rxcuXjF|T3{nBrXJ4sU=ipl$PcnQ;7S3Q zfugFj7ir`?cDQo#uNk$m<g~xbGD5yxaM6o!s^<h2Bait_6h0OxrR1Pjh1!hgAk9MZ zg7XmDdQ8>`4bLtva(M>ZwQ#JdiN6)0Ptn}+S}I%x%S59;SC$HoZ*XAODvaKzYOmHp zTW8qpH*ow$7@;{3H9!ASdG*^!lrI~ZhQxqsY9_lzyA!1WuKr~~7IXq3{>-!lK!y>J zG36g3Nb<q@w7Qg7F{pr-gkm}wD~w9WugSnOADadE`^QciFXXktOV_QBQap>jPV)$6 z#|a~D$|1suFp%K(l|HZRW*Rn1*P3mR#tqWbKVc$=6QDtA#BwY|&gfu5J#o-}{SdV8 zd^o2b6&S!toQ6yu^ID1O5)4znmii@)z7{~p-5GTHIR~X7x>#1+m9*>qrH&0!1>djG zmv%b#*F<z#0J>cL*0gBvG+7;p2vuE=XPi5qBRGJIR-AuaE{1$sIPb&hS||E!q4?Ry zdoVv(6aW`xBQH&@opL+o7Q&n={VsnnGCMrzGTZzL@nXDQo}aQjf?Swqt14sqWgtus zSG_7Rn=}!|bkGdo@caEq&r4D7s%Vb0)7mWO2*J_zMWu`24%}KWehR^;>?@2{lb_S{ z!76S2E+uQ9?;A~3BF?!k)e}J@fMCUFR+1SX@tl$stBsD$5|f{ka_01nU7fFJtpAIp z<>e$ceaTUtbITMSoJllfWaK~UGUjX(T2+7c_N@OhBL*v5Fp~SUGc<71Bi_?eV;)F9 zmlQkvs^vr}FwXTz&75sSLXcw5)amkl27u3LJ_Dhh{#Eq%g24s6RMXOoke(g0Xz5AX z=9yycl4MW+V8Mnf+&hv=gnF8lnEgOZlb&Xss*0<aN*DAZC1v?kWBaBqzM=q6QpC^) zMwf`fAebJ8N>$D$V2sP%afCO$-67a%lqNH69Gh|jQO}vFH~SY<<w?w8lF;E@zm{5K zBw)TP;jlEt<FGUGs(t;r>$Oik8=}RaQQJ<Hm!aCp(a|?NW_@Vt%U7(byUt4_PnvU{ zg1jfon(0AoXC{)7h$ZO(z-%M@NK$Mzhz+zH)^7vn2jq4&`(JMM2RFzC^IwfKa%}Dt z$+h^goJM0@9NzB9k<do1I6rYBL<l7W1Bc^(Z;v8p9r-MKFzpa^JoZx?T*2C5r8gbi zMCP<bdcTYy(Zc>8Bnf7UH2cq!@Fk(8LBaz<5#N2y2FEm2#b@+h4@5;%{o5`;&?-=3 zm;RjE@Q)mocTX*e?uY!1m$@jfvCf+Na~5lstbp_Nzo&K8{zYsw)rOC^BsB9c1ul!+ z7@caSnxvCyU;ZC@{8q-dIZ0AbEtritk(diCvBEc(e8p~Xv3w3j43{uB2S!QhPfV4J zS-~OKBj!ArgxO5H$>?4H_olw<G3C{Z+f0j#ZaU%c8f81?{%{g08Y5KRH*cbbX&3ST zYyE|#^G?{%NkS(S=cf*I2UIm`0&BvFxpTlEE&8n^+G}%8O7<VRzF2rO7tg{RClTQl zf8DYhg?v2@T(GhYzt9(C-|X)z48zT*+uYH|?v9^&aZU%!Pk?hC7aQjnw1C$d?VA%B z8EG4}7GabfQ==6XDSs-(A<qN@d}ua4>M#e{fhZEO==zxwup7d%AR0~qU?NU)q-GBU z5)&>+9~v4P!Kf(iYH~6pUo}2<MZsnovDj4CVh%;mvS~*$tn@Ol82a)N{3>c;PhTJP zCS$FNsKVaARre_h^W%Q5su6fCtiR6XPJs9|hgBF7L|$s-8BL`_g|ABu<OTAhYsx&b zBR~{aW&E3lPEZqkNA0YPKp64U0WcNpWPnsoK9XxI>bevL{?`cg7j#Pfm75`(0iZ)E znZRI!`!SCj;|}-SLJHg+?h}6Y-#^<z9nZ}rfc7q6sneYxqp4n<ePWDd*31Vbk-Pi* zgCK!Au>8U)2MiCi|9?NHC?^CcR+Uk0^y81<2XWOxBO*F0H&LR-lZ-vAK_N}YBb-sl z_W$|row-ZjgZ7I9ENd;#Cqi!fseBwMBzdsd{4XWR48f!Q*MTF7cE|lV%edKpyBd=a ziBnCL@Te35DSegj1T4V4ZyvZu42sF0;sfAOG+4#@@X70<!62PLo^Ny(V$^3kqCdW? zrTV<1h2JT?y$ImvM$oTR?W|<}>nnmY?Z1BFD)RU6VMqyQEq#{{u<8F<x|naEK-8fJ z7dUXi60d`6BdVrDG485TF`|KnT8uqme>sp!-VJC2e5)$+-b~NqMj%FW5L8$H-+NZa z+aC{no(k20sIzvu0}2{AB>;Q4iM~mGQjPxKcLDFTDJ*RZMYNoc2A33@`?>sh9XUC9 z!vK?BCAFE)Wh5ZNODWFK%6yAHeal(X3Xbjnz0ykmBEBO(2Y{+=xT>LO8Ywr9Q+n;Y z2(@VdBPSpxPByIt7=t1aRS$oOufp1$hbKTcfZNZv=9Swib!X<}548bRulY}!O&o7* zm?Q*hKoi4c`t7U7m2mKQ-0+|V!VOG4RiYb}Yqm3*aW*D7V+h_bxFMv>;GEvu7@RcQ zS~V^QIw}QVXoa`6k5c$Eeb7jnpdfoqDl>!ockl-<oCgL*{%yC-jg_y25mHdl<li}H z!hW$m@<y$6cXu~mIZeFu3Zm($-YPDD$s$TWy+2!_ivK|8{SHJs9*k$YmD0UkS(|Gf z50_x(7vIFE?R)9ZyiEABDF0gq2S95(oUhK!q3vgP-4nN;eVw%kH=AP@4jFKscmoGY zI3Sd71MxF}KSlZw{agXv(EssRb(~me0aNk<pcsooT(_sbq2bJuf$*$(T8T~{f$-cy z7JIYoUnIk*zw<1Yj|b~+Z?V1tTCGr1kBEehirOKkr|r2O^x~gHNPDVB{`Y;$u}pwv z;)Q1X>!d;ly@flkyZf<|0K;`_G{ewa3#=93OZGW@yaP{h#?L5E?di`}l=G}eYg#<( zcJ-g^!N;cE!op8O=|Ql(7c^DVN8r8!QxJhcLAU{YkNN{1ZvtU+I5+Z5cHw0+1m_m~ z1+*%8fOWQ`m<znzxy>jF(L`3e6>-3#GHNm$;fv*0`)|K-M!171B3uD_zCChqazbT7 zr-XHxHpv*1^{>PHArgl(GU1<2FBAegaFBATz1L}}8W2%54DSG8XQRH>D>ORmHgy%~ zl;|Z+srkw|uw)lQEqhJeLG%T-JsBlsc^m54^-pbBY~%$G+g+&7d6nP)HTaCP3ax{v z&O?^ZqcAcI0z2&ns+5h%J23}A7%xh#Nyo%>{%dV#J|LQYCz7Ru=<RI|!~}S%Qb(mI zy<)osB5rp~KxY-E91Tks^VIQPXm)itbT8Ba;w`^_t5t)6(CT+XMAcDlVPY)#1T|ar z%#Q_$oZyUcAK@J(3cb)Q)?&WCMts4$oofkZ$Rh)LbpG8Eu{;0V@g6bT=~%|S3$Sws z<K)ik3Gwj!&7$l>#^QAT?gP-)EG2NHw$W_Qo9luT|7&?$JTFLRj2!>48S)h!0Fu{3 zeA}%8kOxkUp1sKg-D~H9ug`fc`Y;#p9(xuSJ$HX+mu_fc3UeQTP&6<>;Qnj9o`zPT znqS>X%Y_O|mE8nvv-8yV>FnlnedUxs3ek5=`rym6Ko$Dk(f*wn;N1PsmCm3_Ik-e* zih@DKvFuJdbn$XJEF=UaO8-nyP{nA(QiT(3<i8@Y{|Oy{RbfoS>B4dMYSd#Ou2Bxs z)Izxr1Vvmm8u7bzv@X!q*CFS!Keet4#8_gKVp@)7E3&L1rHm@j0X7Aw0x1xNUnn(e zY9Tz2<M{bLFd~+`)N(NPa6kVI?Xa9RxacX+Ld)z82BH{Lg}{FM>Pf#W(5LeewDE2Z z(xohRRkVOkAS3HjE!`m3mvJv<=i(hlvW8X4ic_Mg4v;8#KJ)%_z@{7fy(+=Of`F~t zsK9Z(3r4P#CH|I*qulrx5o*A{*%9#wRcJCGuIb-?_!ZC0*E5I_*<*NY=dj%L!?pLD z3Uv2ZO}dLlz&f)mYa$3BQ@m3-9KhxZJ0vm71wN*3bJO2@t?gVsus%v|87Ow%>76_6 zPZfbu^m3z9f1(PiBp5QC`*$>#u5C)YWvPnaA(lLXs+psh4-lCKoBz}?kt;xl>+ckC zPBay-2em_)t{-Cz)p2debF$zN6&rHy2{{91Q@-<mN;Y4W0p+EE&<-eY9^VZ`1$}!8 zNIL}!<d#qT?w<e%bN?5uC@i31=BQZ7xm;-$P~;Ehr>bTF=3U-^I}tSf{=+uy7a^7@ z#xwbyMOl|z8oW4<Gyb)B{e}D1eIr6}Zd%_|9AKO#Erb}wKhZ$;<mGK$CPB!KnAH6) znJS|P8~xy~)<5q9+pu<1;cpADbN?QI@&vWCKFb0DbF6$lNG5<ZW_4tCK_3(FoH=)+ zW73#UK{uregFRD2^;ZX-7}Eae%NP-K;%J!Ty~6p2FPWhK+59PYTNpIoD1IYi_W-y% z0Qs%9mxVI<0QxnP!(v?-M?_MRZk_Es6a9LU@c{Tbw_pkhv}=PnThJ~x@&NdG>Rx0k zmp~U|?hd>|n)7z<RC3Kk+5OyGEXvn#v$=MJ(gQ7QMZT-k@>v+`0q;d0x!g}87PsN< zCU1y0;SfVYGcw-(#iDbm|6j+R(M1*8dd^T!kN7pzeyPFF?pY$lx`AQC1#J5N@o?4@ zHg`bZ>aWiMj?Li9PDKcYy9!zD;*vze*5JLs;sb)j83#uot~|RkeOb)WF6y%1V~F?p zEQaK6+-y{E)k}){yN|^SNd)HpDt{yl5dG}0))+SeEhkH&HIhJs52BU>IH};D+7;=? ztl%vlSSwrMDnl&R>p+_;J!mXo;qnP{t><p86M0K?ZlUnXynFGyopj6N?~3XqHdc!F z?s2Q*WCr{4ETELqgDaTn^#r>@UVbeTxSp0(<9K`vKmy@E@xs5=hlOB27aE_FbND$4 zZrl5B6%9XIi7(t>)VIQa!Y7|wm3yo%JEjj3bdA@`J})RngX2IxgYn<3Jo#gKP}N_5 z`N{@aA8d+f&aT8@IFnYNC+N9VjZKuvEcbQE4N4|aS{7@J0H!6I0RPiR^$^viJwf-? ztgv*+Zo0U7!+dq%_WOHF!&!jGVvJCMPT1LioAf{Srp7(bjU*u#4kKjkdvF8i_8Ml9 zJGFudvrb3l=KG_C+C$#?>i5{FsA~GH-(GO4SmIfcXTfmTjsf!ghq#Nc3?jQaMkX6j zjMg#BLc=K|%iIG)SEa|yMEnV&z}5KWujtCG*)e`FQJ;HMP;mn+$}M2NNM<g#u<cBe zF60`g>+JmNdUVP@;w@7<8&H%~I*OdEhMZmV2>hxfvLFix*Bnsw$W*diRL}zM@0C9m zNn;AUDg%U^z_MQrd-Qx~tQ{P8^pr0(M&QwbkF*w%<4dy_^0jKP_NIOnT7np=3I&dh zEEw(Zq09^TK{7}?oip=qthYe#IqtRG6|e<-bE0jR4q*eibH&q?cffmL59HwW0*gg8 zNvrp8Nbuz{s;g_0cHs}u8w^=d8&p{XKn?<0ro?up%p~CO|BuTXpN^SV76cru|F|pB z1n1qK2+7HTnwXD$hrXUdU9Mjc);MN0Np~z&8(hwDWxWIj+LaQNW0`j-9EMYv2L{fj z=(~7@=Qn&@I%MtY?^mB>qbSS734yQ0z>JF&TPUHWb$PqRvD|;W0zE8Fe$aasK6m{R zRxaC^(fD)`9^lP*gv9dl6Jw1YKPBxce(qwJfo-#O6V3m*PchBi;v&1jSIK{mvG>a5 z-;@52vo8Ur14KR(aTp~FIv5{!a>I4uFu7nc?lB;t6Q{s-y@Dz7fsF+nR<!W>=^&ul z03-_YM}Y^6uk{D?r%Su#!#@UF5`B+csdn>ZC`=~!1|Q1mIIy8nU)3zj{`tC<pfjV{ zE*CB3Z7R#NS4It!R8O6aX|Mdgg`T*bTNi_!^DhPikw2sMDEfrL!v9^LYbgWR{Rv@V z7=mj{!AVT&=72tI?U|==qN>>;wE0h1=8zCbB5L4fk_f4Le_fQKc>`KyuZny>YORCx z53^RCC1>kpENJgF?zi2l9uv=1$X7}MPW|l%kmo5z!HL#aMrca_GYBvZp4;dyTH1a# zVOjf|1g!VHhm6XdU+r8+N1cA}Tt{hMUp>4(nICfHxix!NwI?ShcX#qM{@yU{lvUKi z|E(P=d|vKWsI5o_0qPfTM~l@^3X_bbW%m8oJd;Fvhri>VztclHUVWZ%bFl9&rE}k$ ziGA5<-s<|m^I3hZ<wX0Ym9gO3@TZlA1~(RsQ9K=Xwkvp5GD5-xGgYKL@lRj^#jHDc zeGV`PPl5sicYgwWTSyl?5;`bT9|VD$EGOFe2nes@;^KnIlpS{KRs2EKR*+xZ-yBMc zdWe7?9v-?4b$weYGXot2#MdQ*0|-vypRSreHTxvjILw|M!28&yjpdCW%I|G`;<&s) zQdy0xGyK^tNJpidm~}r-N7qvC<#7UQO2!eSf#moSvf><)etFk?QuhV!9z|L%$na4u zmi-&Nf;u$}+A{$W9HFe~+8NlB0C0+=pe(%#_#IUvvASg^#jM`N?UOgZMl1H$_#tLp zfk`G%l1Yqn*KYsV6&;)W9C$Dk=}49wrT>gcl23EMoYd+yXCR4&3e<*$NwA!eS*mu< z9^`hVigIr{e#NB{7Z?pheQLuX2`ztyvdYtp|5k4CiD&3+pr{$%X96{9&Zgcp3qOex zR=p4qZ=6d+*-BA*xBknV8;PUgVWYNjdU^7Vg=D1R+1saO=byYWN2GFoIQ5=8vz`tQ zn8_sg>_9j43wq3RF~IA<jVXDW=eFqheB)ifl~TFV3?*q~a$N734mdD+d1HK7xt|he zvUVf`BU)1h%kt~YxvgBxl*)4?fNapP5U86EiKbeF8JGF!+;mea8EnZ0CU#b1pIo)L zZ_9@Fz^b&>;+ih}@td+RGAbup7n9#26i^9y3i}PfkcGtoB!93s^f<saTK$I?aZ>Bk z)zYm(^jLVZ=dmPI8je+my653bhk3;a`)IR@{M{!Sv9IvfKO~%ow}r7Z|8jKd{pkWD zz2+Adz34_l?j!bR**+c|ubP&{Nc!JMNJs#hryoQbnhEiN@_0nQWL5_`UB#(tB|{oW z;<$cYEGClwaiEIP`nP%6C+2(I6O7AN;!fq()#-sLB&3NnJEk>P2A(wof*El))W_=z z{N|DGBq%NL_VgD0)p~K*Ajkmf7JM#(b#wWX&QkSbCud7juTBTncAGi47v6-wmxepg zqMo~oJz(P6c4?os_85@g$&o-ObX+?8HF6$_gyNWp+l;H;p-4!rIIUmthPBV3dy%z6 zj0?1ZtcV04Ki9x@1)ffruFCn}7@a{i@c2B^)sA4!hlt2X;6@332_r(UWjX1?Sl|Om z<8Swn3+-MX35f-}$7v=^zs&?QLQ|AySBOSY;@)(~&@Hz=qw%%It&Ae3EY~}<1sx@Q zwb$x$aJZWdLRH_sI*vKd$u2d2?ke9vYsSJAyjF~U4`(t{EK&Jpb3_W-+<rCxD6^a4 z`(6Yw?<bR~84|}|lZ+Lg`9BbW^s@%H(f)7B;-v)o1C^RGaO_n{79GQWPweDX$152G zNYg;Bof*!pvB&23cev|mB5_LI!|i`LrV@}2hMh14L`5e<n$r<{QrvM^BQt$Y?(Eto zm&zFHMc&TuxL+ijphCs^$9}N}u&m)ZMjgKWQa+n_EF$KS^09sJ{_As@mz<I!hBCHU zfOtDkf43g*a=k0>Woe(0%86w%^GmEpgLTvGbe?d<&;W&;n3&=Uv?bsST|O_Dkk;$@ zIi6PV&@k+hRFV9UhaMEI!dCID+}Kk`M0vmV!@d6lGvtr_v=)$*FaHUE>UDs(5%0<* z_DcI-tuldWnH5w_ZYm^@qY02sVFvB1RF9JuuwxFNc{BJaCx59dpX=+i8dYNw9ly4? z>+96r(}!Cz;yY(D3sv|VVKOmQlbTe-V*w?oJ<@`woegef{rf3)IqrMhTZ<s{2I<vL zBA$g1XxOYu*&n%YmKD+wLf(I!HK3JwkxZuUNLcoco$DV*@-h<J&62=L#jNXF;|%5S z!+;vf^{_x@tBXD(0%?s_K>z5Vnt*~f8b!Ref^Ws4&LD`w{e*cQ6HOK1h07D3$K<$U z+|aywb#)JWU+P3vKYUm39^#YYqW15}vz^H0IE4k?)h<qCw1u>Cn4mQ!#kUR!x$IAu z^dk)dmTLrW-V~|ARKR@!HrD0R6zza(KDfzgZYoDBUln~QAov5_xzsorDT9%Fh@-ZT zeBuU<eB{jEtAo|HvepC{0<Khe*8s_ekD1rq6BeQ^l^ODP84Z`z=z1D(UkvVlgmB;L zLq^2UUl+gYe+hR30RBAhM~Bf`-Zp;$RWj~{n2&EZfIA6u05u$t4kI!1Ldwatpv}#p zqm&K;LglR8EFD-lB!d+m&M>ha7DbP%eQn?w(#d5CyA){;A0KaZF9~HWObf#n%9Bk6 zv#D}?r<rgL|5EQt_;%mSl_6y;=VR4_=8VrZ#hxKR@uNft`CT-LGThEv<0YYuYr?fJ zex{9yEp|zEq43P=&tAw>1Ux#0l%_sz{OrI_(s&qH270S0Jnw}3bW8Qd$H%#+?~||+ zK-?GJ&Iqz$kFNA||7QBrw5WM_@Lu2@FzAN*FprO`Z+2ZTT@I!oKya9Kz1m8HJ@az5 z!uh`t9^!f5e^`s5$-5Ns+^pX%l#2$0$$Gc5KTD$jSn8oCu=66OXb$wi5Sh})_x*V* zVFF64-lGSfzXy6;Cz{Uce3vNAnr-~yWAATxtpADrrCsLs>k|O=??Zb9#54cp&ywh- zwgp*0qSU17U!Go$M^aq^%shoxJj1$j+8##3z?cmAmZsFv`C3}BagFcQ-%)Nq2)s{t zxkM$a=ia+|ZoT_k;Y+Oc_s1_BL7nN9`?=%EDJU}?+&7kfh3`|R-aS7GYOi2qz8;l9 zY0M@X%8Dn>kvGI(a$LD#LED>wRcqe42Q7OdE^0nhHu*d~a<;>|(9(YZS&Gii&Z4$Z z%oWg$zj5*m81ac>5LE^aJResBywU4g+xgg%B0w5W#^Qf<3o8N>1v>}+lUyU`jGGPP zCl6)gN-}-vEa-^MGRxwh2d_9=2vp}>ntU$u_A*N=Dh%r*O|wDH>JJFEE+zGGk-~F3 z?&6Z(V;cz9u1?rJ9YYRW&>k)P?p@~tnW8a~9M8|4gyr<k2V40$Wz4np*MtnJ%w-;7 zca26xpr8{K6@^rn{7C?$dv8~3{~uG9J{ucHO&@R}XyXF>Y<{x+2SY~KwO7>1a0<dh zSNTG3U_(D*GwKs~ggjr2=6APOVmnwCIWvFqym!`0IINnh_7(x&v#K80#Cx%>fl1>3 zBkMZgxn93N-^k1+WM^eZ*%=`_drQbDD|=)__EreV$}F2gNMCzK5fKSlMRrD{|M{ry z?f(Av_3FOvjqmsKe4gh#XS~n*oKuk1Q_q>Og1<{IE#kHIr2ECm@(c&Bp1q0CM1z6I zg%s}q8fDCqH@KgdpMSimT#|Tlbm4n@I+cX8q@<+X@RRl%jY@Y}py;<^)YCCQ4%t~s zf`7$R3tfRv@<hp69kQpIe#^OG^bD?_OFn5@9zJ}!KVQG|*6<VKZoGZp6<HY?sc8Kt zsY|TY<R=|D2wghgaxAtj>onA(IgV}b5WgT_d)xXIgkhm9M<xhmx+wLmN|ywiryM;u z^zMG_2&$0h!0|(n2cNAZziTe<wsd!e>RtB7j{^thHk)WSnS&ZW+>>()Fly(kcbRwU zHQY~S2$PkS1$8iYF7u2Id;db)m2*FIM-mGGx1arN)2$ES_v0D|RS;l#%qy6vj(ej^ zptf#B4wsT-)`QP&Dlzve{atf2^WAmDOITN(vu0l8pC{Elpl^CPEpd9eCvH*V@&h~) zK67TL_ZLKKWH!jK2lX*Mg+v@v8WtG*cMNy+d{YNL`};Qv*UnOUJ8T8N&X)JQ_T#h@ zIa1-XeE=iFmmn8<>zD8cHr!Zw9Jwcyzj|-(TFuJUrDfk)La+4+uTR!;ew38BxJv{+ zk*FI*fvc3;B7_5@>;2wl8<JDCzGKs&r$<Pm{DAVgQ|5_J9II5GYXguHq|!gBO+r)% zW5WvG2{_m^tgNgIT-Y%U#itC(quG{d*H5EAg#P`)%edC&&=HUce>4vTQ1YBb;)@qA zzV$o79X+@M{kpj!kW_Brd9-RKcB^CEp!`)S?*4MaiwieimiZjGjo)5>fqph^@Rea= zl!IT3Nu3h+rOj>dp(QX?%Y4<Pe6I(t#_=}_pAWxuoNo8?cBuawE#i9>r#khXd#z?h zIqHF5Z~v~0?M2R83T&PNbZ~@H*6G8au^%qdQ9gWW^Rv-)IOOYu7vrSggrmp+!{tu| z>_<;olcJciTy?viJKi4}zV_w8-q7vQJ+-g3R;@8tZ2borYs^tvFb|>3YFCx;b~Jsu z@bjF&z(6`N*T(Jl_6B9C3yKxpd&Zyg3N*6%Cnxh&PukNp#uy!m!;)S$#32s@zAi79 zxZ^|hnB{>azsWN@y}?2fdP<j_!RgI1a*dTQQFsXpVK$@2-Zy`|wKXv@OlX9nY5nYs zosogjIY|*aiAm*szM#&IiTWuLN}2~-{)XksQWBIrcRFnYnO>Oc%VWx&AqkL19aj6q zwI1Zyv+o!k4D1k`#d@&)X)sNiH%n|y+J{Xm$mrP5)9%~LSq2sN+Ss*EVA~KH#yJv8 zOt!6_RQqA^xrKD;YYKz-R}UEV<~Ud@y<Z6m`}zE<bhitM(DDW1SSeqeL6*yykEHaA z^-okY76%mE7{9sz42GUEDS(N`GYk4IAH8|*nb$>Hr<d5I0hgNX{E?qxW?b)nV<RM% z@TJ>M)DXC=DU!AsZnSeRSHpE08oE^}lytBUcD670y3ex3(|}V_@78@bvgu0X@-%Q8 z*V=;)V3=N%zc0(hZpBNQOuHj5bjobwopwfle6*lzzJK`aM)S=js+a_WdlZJkc5W&2 zFL1nQpIObalk$GXH+QYEjyq;{rGMMZwvj(1EYD(c+ltW|W?n!#ec?%1qF835{@1W9 z2U6|)=|Ie5uPglbw;vCtyWgwF_xACb>q|@Is42;F8W>Cm>5f1>l9|Cb<ljq!!SzO^ zkQUej*oQ-^ll3-jY_7VyRUI7PQ#~dw7IyJu#&Zqz^<<L|?LUAdu=#|iL_Lxb=axyT z>B6~N7u?Mqi9dl~uUBRDc%;-=Q7S^klKgQP>h4{w&yD3AKAVts(dXC%ZFbcuHj!ui z8s(c4LysW@6uTjd!C=pQb5IwPs2$2VAKE7aqU(I9G32PcaC8MDP&W8T225xzj$Wd# z=ft5Wq)g!iZDz^Y)dY4mt-T)wT2r8H6R#UoXs%OK#7sdAD0%}Q6iGOvRKQ_oQv2YB z+&$icder3PWQfzJXg<@rwfE2Lbzc08d7XogjUgxDzNmRAwOp@{^sNxE&^#TQQlMVL zxINW6;g=S;hq7vKVSZm<#{91QYSsl`&j5)_G1L~SA4B^TD3o$g$iNXuL?JCy)hx=j z>$Gn0!RFrAnu2~8fL?y8jaQH~;>q>7<v0gI$mMZbOtfOwZ*7W(<!9l$)DzFHm@eoF zq(S9mav}5d^rfv;p(M*27pS%IU`on;x0B4YBc&!OBk75UM+Te(dxkr3n$3Vh-^vyG z0ejMg?0uy^cU@CAX?XNzr-7LY9Ga&2!R|U8J@f)#H&Qd+;`fh&v%YmE&|XNf)>vR) z%ym}jR;+xDJq@-Dm7(iKY^~k!7r=Dxj}^Ugn1d<j7}_3<2{=Jr36R3>@;0JUJ%fxf zgfZDJA0~4ZiAm@_Vw-t`9<539S7T>EBq@+H!4rS^<4b86D|g_z^<`L<Wvn2hf3RAQ zdu>QV+9ig9TfeWfv-1fDOYq4f3!@Xv=pn>yBV8{l+}L6rFSvCJCV+)5NH3j?eLMh} zDM~j@#S`nym0}1z-#ok|X@NhdxNUF6Xvg9)|B>)^=uQC}jBD8fK$F&%7Qq5sL3^#K z$N0{rs>||aRa^#TedM);BPsZ>I&(j4wG#nvGm=t&Q2#VhO(wN0xbuqms`$1vob}~o zDIr~s)C>~xD#+zRPE$B15x>h)78^i*trxexK@KxBLa%Phx`<wbo%{FeN@By<_r1NT zo&`Xd2=MTf%{T^CD7u*N6Nn7+zuHgKtpolp)Ky~r;89>H7s<yd#pW!aTaJB6vNkKg zM{oYz{X~q~g?S2J-|O{%0ZNBIJxvhtj&)@=O0p=KQ&0J$LVm%oYl?9Oqrz?ePN70H zm230q{a{WAr9g}|VWw0ZttFT1^YkQkZADO6F^^^Zf*BP8+Lk+0KN`@++Chmgbefnh z=CFGOMZ81Txd%&sedTZSCXaG)cRwe1S<GvN?lQOOmvauI2@WTP_jtSV5HSkWrG@gr zh0)I-_`k&{5SzmLUNdpHa5RK3Q``dm?3W*kYSlVjY1#pAP=!eGlOMkz*^wiR)FkiX zpL2Ylv}O;3U_0o(0I?9}X}(e*(x@vldtuin+fyWu*~%qzt{riHvF>j6Rs<&nMS`%h z;7fK-g@1aW&=){<x1U{lM(fHz=7qg4E{ETtUsrqH5c^B(w4^`plJEuJT&eY2FeD$I z>^$5c>h5}MnLPEB407-rMEN*cOvkt?0)E_DIiY-=g*ZZJs+M1;#uJ-NWcSVMczBI{ zuZJb;0~rz`ig9#)`;5@}3lw4EaQHds`hob&;1UH9<^^8lKF%r~Qsg*NLSt}#R_NR2 zX0OcENHskQB}Z(VzSQQNByIyf9GvjCD<<E`k$xe%OfJEUarRWuQ=yd~jlRMNH6AeA zU>O5wCBU+(4N~NigJ1mfh%Ezj>TLMaV@QJboe)wW2I-pby{xB6uuDvXrdz|^WGK0G zm1gc3?}?mg9gx9iy}lOwW72KlLg%zYz0%Vx!lx#wYTstsqrX_50UsriT|Fu;PIymK z|F_~edXjgZ42X2yt%=HOow<*;%%USA7T-Q5&%O2a*}I1i9}fD8R{3k8sVE|1VwMN< z3BoBaxz9-4Aoy6+$9#;_+-7YPI->0?z6pNqhmB9M2&xGP0Ai1ZS!|?f%)OMnqf7-M zh~|Q1+cMt6S>XARm2u?%R^^D6sH9vRD%5~qfp&~`Bs4HY2tv(vY_%r8J?IZ)pP<z( zAdh)UlZlm8-bb^=mrXtMgkO#z_P9R!?G%!N1j4~M<f|*zr*<j<pYHnr|0Mm47>jpY zC5{|$g18KBiS@^+sQ%&M^Xokj<Q-W$MBc4ru$g#a8oWSU=o(nZI`{4jiCRoKVr%pV zxdMl4_z6tquogN?$MKpI1O(NUW8LoZm?qlh-?u)~J&D>|^t@H5kyTJ3A4z7o{<xd# zFu0m{Zg!)Z4cm%uAP)_B++<2G2x=gHT~~9=ulo1FU<`C+LRp&c_``j?KT!r=c9$sr zLs6GI<CmPs&XyfJuz48StEPa-tu2#ZLnmkz(eL+m>Qf@49?{Qc)$ijsU(RX8QL5{N zJ*dY|p#2oi7%;VUnY9SggrQ+!1x`Qzm~-SMBLLzsZwbLOEo(g3=<U7FtLk%eFc^Ly zsf-EuH3Pm|9Vz{cvPYgNi1naW&=O>p!Tuj&Q0z6AE7tCvEj{**P5RD_$P!x_?86^B zR|yNnT5oT?QCt?F(G0>WB*X##^gRf$b6OH8W*{snH1?8DFz0Ljx+cXKE<BMMN>e>z zZu3@#q*gPJ0^2D@VIbrRGo8!CX+wwHDrUG+U^b_i4qi_B?|i`O*1(rYnHSDQ!x(!| z+JpzpvQKvVKjDbDFTRGM*<dqMI-^Y;5%gBz6Tfzz5~L=9?#N>L-lktbko4$+-YZ47 zgc9uW&Xdi-^-=cZ7(~{SsT{Poxd6PH%{4~O*Fxu$dJqvb!zW219>T^OOg8&&^2U?@ zY7<O?@hvN<vUw#QaNzwZ#O-NbSlvsQ*sEzI!>rK%P^>%JK#7WgOQxR6BQ*Xngl6LD zjYKvtjIsN_&-gLoT(pHWLVNxjIc)EM3-Zbu?<MZFj+n|>Piqr+r~sH;q6>U|F^L~E znkatj6kRQh)(W_WO<RMi4;O&?Veglroo{0Q8H((LxMt65#Vgs#U?@Mb!N$R9y^NHf zLI?+AWjQkC04W(I9y<j=u_JFoLW~Zw`Ix74vLQ+8?FZ?B!rsOj@E%Sp5(N-MTub9S zmJl0-qA|i`kwot9F_L(U<!PZR3PG=<r8sC~@;%kn{mG^GgigY<k9~pqwzhd040YG| zQ4jNE*#fZ7R92wc`1aR38TT$3LN>*6y0mxxx8~A3iVi}C+E4gF59(dh>TjUjRJ%}P zrxb$RwJ=`#GK9HOj}&PIE5&>kJU&+RYtv-jpP5=+E$7>=SThBm`n_Y9=!L|ExR1}E zebN5+@3gkMf@H~k*dm+2^@^bVtwE^tv$b+BeZCmb#iv_gE-U=1ygG!ZVl9O)og7<@ zvJRj}ggVhY3Jf%!X?5v)9=~=P6iT3*1nEuDfok(xLDlgm)V?U|FhyWiTB8X7KK9kl zNJ_cZ=E^*IvA+Z=`wXXU*eEICo?7rZQPXfHE1J!B5j3I1G+eyhspey<P6jn>zr6sy z+0Iw5zJf_w==%wo-S^vb;mZ&_>T$}nWJ7M*MagqzVhoj1qMs8<s7)b|jhf(gX;54< zI~J!NX61)X#cQ0zp}}zZ8?;>7-rN*A3``V3#_<U$9<rDFkeQJ3Vm7s1T&DH!ekdmN zuGY{{{h{dH-9hDLE}CJb$le0H%xfOg=@l})S<=!`&+F<~ugwg~AIX9i(-?lynwNy< zvXUq9!27kfNb=E-8@Us}gg-0bt^X~ri8J96K1uLhhc|SoFJU-1t>eXdO0ZfKTr#hX zJsLPdghN$qM(6wc`|}KEbgz~eR)Rk>o=KF)1Ga_7s23DzYC*M5O%-Q%jakeU!|Bo{ z-D3S$K){OakP$Q$#=2N}iAb%{<+wCt{m+ppB43VJIwj2@XxfH!*o2%SUciGdp{Z0b zdMT1zs^$`88`ZuY=F1_!R)dniHIU4GGJFBR%zGaq&jI`w^i*dGa$s~h;FSRF!jom( zZvZaa*Vj46B(#BqQnz0t?v>N_lBtSPfIsf;)21$6jmths&mnuxNgiZxhzzF9aR40? z)5t?TWSN(;8<@Cr#$<V@kQh(Abe$A&f=L&O%bQdtC-Rej%jpKi)X6M@F5t?|p1)n7 ze{cX~yXb2F3~`T=e#viXHeAV|xb@88Z+krb!Qa;x$EK;_G;f7Qd2&zKAqjiHYhrF^ zx<4J)HkPSc1-MzueZKAp4s@P5{|$fZ;w}yN=%?FP<p-94;nZrbY+qQtYa$YW7k8X< z2wH%BBG$Xa`CHrwv2jBSd9EolTgBEq?oO>bM~Ypd6$GZoP5Hi%?PVMs9DBN#5VcoW z0Dot6EyaHC@z;sxn=qtwDkT2w_M2QqUg^N6qbw^9eYhIMPZuYiYA6K26u)~+mMs<d zx5Y1ABr{<dPZe%sj15!;u&8}8A7)}&nWze|kl;B-wtoPw448Z!N0=-*Jw1I(I^>2i z#65tjs3qn>s|py;3oTcjhbk;uAztek#dT9ZKXbXb2CNLnWAQTsi?Iw!)q|jIzYM)> zzsM)VnuGv=QuKf!9tlSU4fbx@=@{t+i1K>L3(z+6Y~-Zapq`RZ1%SKVIGKxP_efL* z;HNZ@MH(zUWqQ`r`{Kb{j3gx4d;=I11XMf~K}M%S4zg!qG)a#Ke=nE?4~uRG6F?mG z%6^t==ClCGW=ovzgSRW`F{AQq{Rbj987L_7o~UPtCttjbowuXSCTacyh99V>n-3`{ zg#&w0t7yi@a!DZsXL1{~C+=`TvQaq7==dQ_ad>I}YwhR`iaM`Vvvgs{UG+0YRe80w zwXv@*7o5f)%|t<dmJ8$bS^S7s*1qIPG?6I%Co<5;BQ1C>9k>zsAG0yTUn#tY__u@! zBRkN2`Z%4{V7L|ChMcQUK39Q+-GP*p6gXSi0?=x+F8Bv1VQ^8{xJcO&M7+Gb^wdL} zeO8_?C<RJD>4=)UQY13DK_~X6%5a*nBkfH*+q^_Z%7(}m(C6`;BGd$T-(}X?z3C>- zlH%ECtZc$LLAwQGm@7T>B4`W;^Dld<GfQ{hzf21;Bg9Qs*aC7t=F@NP%1&ESHt3ut z*6UygVXQ|1B&bJxr?T_%l4#oZOV$dYb;t}bKAs5BQ_qkhE9cLGw6HElRxa?1T%LuI zlZzQ9j`jo&LsB$hJ^5#?*W|P|#f?TYENpDN<9DK>@FVaxADL6Rjhr{XoJyk5C&tky z#vc`pDchH7)W`JY4kx<+Q&eCSisjCLzt_@a!1rxBjm)&nOs_-H!or3blk>w@ULJla zW=p|3)B6~sJzk{oxPndO>JwpbB4C^lDPg#3&;pc&_PwL`nmF4MT}q@v#Bp{5k1vC~ zhq$;p_+3GwhLo7`&-QL`Z%Csx$~J<h$RGP@NdIt8i0l_%D&ZVDpf5U@jW0c;DuW^` z3PFQ4=nB9R%`IkCE9GC;z8Bgz;qt!5v9}@KxbT`ho>KN2*4kdA0bjsN>V%)$<2OV3 z1I1L}qX{z2xPCB|_teeCv)80HP`<j9JRiTm;=Is9EX5mKoONM)G+2Dbn4^f>p)0w_ zHA~7L9fwIg=}i&=T_-vWOev>%IPoLn+AcYyV(1kenA6Ks2tz$BVLkYJVgnpG2UBdB z!xmaIoT@pWeGE=z^nDEK(KsA^P=&?H6r_T?wLC^npzY~a#;W#}&t-FF_*iXv{(a*w zfNedw!qRas5GzV4@T*JkPYuaSRF%{=yqI`OGAL}OKw9TEQpL5|FwAZQ28)WuAId$b z$l;w|LAOZ@IqtlcBX;S-sg=$O_<rW1=B~3}>j@EOhF-=tk&6so6D~gqc0a054@m7h zFueIhrnz|h?knOH@5z<P7ZO_68{|1Gu#MJECTRv3zRtjX{<UWOUW=LU*JRPG_;N1k zy==P&WC?*-PgpBn36BfBeYw^`pchth1EYqL$=b<k`HbdJU06yWmi9#qucTg{YQmRu zy?hNkYzkG>$j4X{I8a@<xTHV~wHWOrQ15o^c)&1c3!Snout$LOr*Z8BwE#w5@@;_@ zj@h@5b!y++6?-dDIa-Krp^p(yh4Mf3%{yQku~-;-?q=I^)n_g_(rg`!y`{%Me#k~^ z`k1_u85X(P97j-lIr6+Jd8UYiZ)FFjF71>PvUPLoai>-5N}{oP642xtl0gJ2F~?S6 zdVpX_liqz;ou(6(!0-x$V8pHt5}}7zFAi(OZ;;cSZxxWl+uRPhwvuPKQIQ#aq2>|s zRhRL&4@8z)GOzHL6d8O%o*9&!jJ~<io;KCNp&ekz6qaa9wRm^;{5#Xc>u3C0_-iLz zO;tFh3m>|wu;le<pdzlaF=66a#mh(~G1f3ojnphYitZ4p>SGYMXARn54x9(YEmw28 znb>OY?fVBROpaKiZfTF{*fDQ#r_OaVVD>58DW29ZHU8kUkdd$53?qLIbb~(-v5WBR z-<fo*{Sbx<jse5II%U9dIL&p7Xj_un)J4s-?D*7jO<-1Eaalc=;kN{oYJMHX8R^l3 z1JF~l1xvtaj-dQuZJ%uJmA65DcKzs%jFFj>hc8}{c_CA`+O+@LZ#3qfujvcc>nw18 zXmKlk@?67Ce+ko)#ZSyt5|VMsp#aCRneXB$r=YJ$vhYp5l?;@5-+r+LfsIYE!`)9> z%!5~RTezhu1)l@n?Sq3~+hq$?hA$7K6K?nVOU{45*Z8#j^}KEWLvW#|!-L*cMbeL~ zjShjoq>WCBpgTQ>BQ4z}f8o~F6j_a2Wb9AA#<iA&$2}UMuV$5z8)B^xnBSC|I`U3; z<&7evwH~e)jhRLg<t1+Jpg!`cF~PbFtDOWe{w$l{p4}l+V#c%yov;`?rZmS9TADb_ zasl|*j_;r5d~&R8r(*Qq(&{NTGM_7iOhDIpo_>7Bwo14=F^Ws(H;|SSO~);lAB_V@ zFR-x#L+m02sydwv6GB5Ng{7gHsN-6x*BgbC3KpW-W)_<}Q<6d;9ADb?wh2yKtGNNN z(7{P%OfJ#omKoop5z>C_X!)vv4Qf_8#)`NTG51Yfl~?#1nV($KzJy#Wr9cjo3F(bf z3+<NP@6{}rdGBEfsxfg&FL#w}Bu?vJwip%=o#tf@mQL53-s25ri;2=Tp9@!beai7E zDTD7QWyXN9eQ7(5%(_ML1b7CI?zlJuWj$QgzNGTFln;aN@>z;>xKC18Hk8yB-s}i9 zT`bsx@uo@UtuJTveRDQLzL|pT*sVR!00n_bi()#QB6zUi>=4_+zCk^m_@GClky#SC zOH4uaBxpr<0l5p`-s&u=sytEkiQ&e?n+--oL?trrAjEJQbW!KMih}_htf3^CO5CCY zis;5Y!Cgj=w_1dUC5yHvNSm$?cITP*5Ze)-<2qQQbx*nC`S`WaHms0gTRmE_?Hq3F zlL!um`*%DvB?&w02ybnV*~(Qw&3C3y$;&w5tF3hQg&Cgs;u;YVv9B${>BBJE4VG_5 zbZze4S}N^)2P9(ovC!ZOvlt4ph0XQhD<3vxhtDAwlOhZa-_rjf+@$+#Cms1$QKQt7 zR|+UHP6151zN+(hFTEJf=<KguHD|Zs2x=iQ&ta3ku)Y3fzEA-DicJ<nC((SU3Zx`& zXvn)ciLu0GrE6~j0&Hq@bs%>$@8LHXJpN_8mS0$RsjPtyMJi~#LMwhh_{y!%`QwhY z^!Fu;WExiLmyi~{ymY6}KT6nxIpme?u^fjp(fl)(xanD^oa&~3?0n>)Ug{@VVkswr zv;&7_1%H&H)&BAR>OzwPtIRmPfDNn>E97-%)6u@GFT%g^4?M!5ch{Ubp0rw`eidE^ zKZsarmx;Ql;b}GJ!K<eZc-ajs`xX1uJsM-%L5~dlpx}T<f97$#0Y>?YZR0n+iJUUc zNm=qu=YK@)se8aUdb7v<r>O3KIzcbK1)NlMifdg7%ugx!ZO@)mGv%5wNX}wu5wS<4 z`WZWVJY-nkBzC+9%7pe{cSpqOPlFZCR|pgdhUwi?wFo=<zJ51vDV9nKM%mtIgW~x6 zLC0o?B)aIN51!+(>sbvl?}h#NDd!3Ud{NO|*NN!%rzkj8(mqT=#?rpO`lX+TZULud z6R~c<hWh9h^5(iq=3rf7(95El)5AR)mR__}{uR(0Af@M+uO5o5iyCveuadd*p5#h4 z(>0H$;=invD#oc*0P{q=lRtlG*eNlpc5S7YQ}f}H1~&W&lcf#e?R%<x(<_qZXbj2A zr}tl9!c!blxRK&rz$NWM%Yb+#oYX<!+`8(ZrQOusW@87ApK?H7u<qrpZCkyno_op+ z9*q$+Wrd*JFnCzy_>*gttgu|A?C)5k8Bf69m&C6^xj^n<I6n1d!rbEn^d?XbW4E0P z6<Wey7&z}IO22=mYBX2qIT6E#d@c^FX3XZ)3ekDJfPmfU@K+)qA4W84M$}LiT~m(X z!^BHs2?F##BL~Cw>KUJ9euc36Mu-CxNtO!Ttwz^K7jELpDwHdXaY-k1Qv9r6D!azN zd;8!MBa}y;vyuMX$X|Rw@x#^<6E5}!YX!IkBf5JQH%7sm(kOwRu<4~7y@~11;O3(+ zP2=cXyO;@amrAPpVJvMM%aPv#TDi03TKt9k4Kjee4M?mu&V0||vYji`y_M0U@%U-d zTv8yG;HB(>9%845!6q*u<qhy}Crz$}2Rzf5WEXDz9oiTn<#z!isBA4(O?A}rMk~Qd zwh_A-K|^M|iGcmDs(jB`zZ07TOp#<K7<F!H??nzNEmZbsh>y2xE6bqLI4atyOq|mh z&RWWQ*hR^`gd3E##$DbhD50d!5oH0-ab*&KY7amWvYIWj{I@N#Im5Y36!CPkFnnG0 zq@CHAIW#h3Ouj)#RbW?`se-?pU&XQpIBfZ|5#tG5aiGJ`uPQul=+V%sc*m)eoJBh= zSb-?R?<}v&uf9|l`QYA{dRC9UtGMHIyyU%8x1hQJn&_5twVpzRh8qPw+vg|6Wj!P= zGm#u4?<8wWFpS64$f%|Kc5}iRqQ+xQoSw5);@d#&u7R14bu6JbyZVDRjhGaEF6p#o zUYa6`A3pIHwzE?#f4V^y=j5ST_D15NSswgLxGDq=oE^_ur>x&UO#l*-bNWqhwN+n$ zx0)tzkq@gBCzByJ^Bl9L;Y=MEIeR8omFXDPs2a^rgXJ9Oc1nY_2JfjLoJT6_g4PXR zYd+0Fy5&?x$p+XT7|Efz_xN5iW|YDdBo|-q&P1>8$?ZseDau_#>2}=%-G0yW>xTB; zV|tNma1vy|`4j3F4VLhRqBF29k6UK1^TF!Qka=%(bEFtrMgl$V!|k6x@(lxed0_X@ zAzq2<!biasvfT>|x8C0<REVtRWxuHnVWSiv8;e%SI9$?tEP^sBxRT&!Ebl4Rc2+bd z9Ac^{?8)x`fRDM1Cx?A|0}M0k_!_8RVYNs}Eo_3l;izB-+oY7eg2nfImTcui-#m1l zG2VHrCJXmeI0$658X(?R56&0gJu6p}X4oLeie|@khzNA)Z}i!0sd-n2juj=O5ezxC z1cxc&yS<Do=BnR1cIErpo8_-Gl1m6R-BFx)&1tM=C<gznH!Vqpx=D;3;rDq>W@-r1 z(X@A)akH*aB5inX>E3{s4~^9ac$eD3PB-;Ew*Ei+)+G`I(TdAm1*+-EbJt&I`z=_1 zhkX;qHUBbj;GSlE-)H}8ZMD{Ed*+}AWK)iZAY~VM3dFAG9MG)|(6PCWT7<8k5?iVJ z^hjt}46S6IpRE7oO>TIPhKDmv!6H@wbejO;MP^xCg)`XFce#e^2726-a|^A+(x!gv z?aVqu2CP6;9k(kk)i-f`cFXV7sXS^bd&pQX+{Uh97$`n?ds;0KLKjxet5_>9cFfK( zG8lcj$+g7oGISRla+Sc8dmIm)Q3FpUGpOd31&dir4UXe(t$xh<h$7N>R1eO9?FWx{ zb5;pqk2duf)_N^h`o!;Y$<fN7J~KP-eDM0j7fAFHtmdPL`Df;Ac?agI#EB2Mq(Ay? zp6C#h53%#VOQ@{|urz_&OW3vYFd=%x`kZG$&n!V+m$LZHgyGNc?_NUlzLr<k=s?Wp z1{Y2vM^A>@<r@VfNh1TX-8Q_gF4>?eS(gANm78PTbXcQ|4>X9+wcDuAiWCS4*tkFt z=ei|>YG+&PICXRC>q7~YiOjr5ZbBcow2*B-5^pdY#TV>yNw@#-NNqqgKnuyJ=eXl@ z|JgD@8^wEo)41YsNQa(@d=AT_IUShSS49y<I=N{%n^5`Qh#pTj91TDrK%g<jCRBC` z(`Ua;dj%0tlzOqSGgxJ!AvoF@vt_&`6`%6X%$N7L!(NdqSY`;4DF(havgT7E<LnWb z6!Hb9dqY&TB(TaLtVRkHr5Ce<5tkX#key4>2PQeM2B50(HaO^zEVc*bVXnTYXK;mb z=f!59(7;1DT12f<?~LD+rW2gv=Tx~raTZH_>$Ti-d7tA%bcWL%c92Kvr2lwVkwH0? zfUj;UH(m-!AuDU9XGP@UASP8%Is4+=0z`Pkp3i~YaVyj5Ra(dmMCD*%(xsO)eg7h< zy%F-6RRpuMd`^bR+jY{lm-o|;pGi8GrxlyIDqNY&>Dfp~%}Zw}4NRNo<F{^G#p0jn z&qY6z;7r{J?mqDhGG{~9DOac@w=48M!bvMszA+(^+BJV@MaJ~KVyPM8q?102J$eC9 zXVKL=lAucweJtkK8|RiG?=?!sm$$(0!qy!9T2k3TyRJ&-HV<s+n8dbSu8E}F1j#i< zFlc^ydy&B#hKSYN#+~Jo29Jm~j`KP8l#k$H-h&tQCZ|D+Ft7}@X}7oAU)W++2@&As zMPcX&uM{@!#H+M7N!pjc5as~ndU_Fdg_9Ab0lsk$cX^+NIh3n0NO(H@&~F59cSK4T z(>C>Bt~JhAVx{i%{JHBAsS_cI;||p)>PcvCvew9lZ9VTH-j>{LW@j<1V6TU;Of%~K z)c~J<rb8@Z$ruipT|gwfhqN5}v7CDL8ipvS$F;>cF%rJ^GVnG^!tSV(x;!Vq>H2v4 z=Y{^Ai(@q(1ALu&czSGj?L>1obY5P0^A>SO@?vE!?oAVstq3+oTbzFXG<jqLq%~g& zBX`IAk~erWNtS!O)mV1wfj*q%+*F>S6y8~6gaHD?<^xL)*j3$^7oFFQha$pKWS-z= zUvqfzZ3LHSnd7|o+SDx`lb~eAC+M3r$@5TD)_y%aD&*P2htd!%<l=mW#J}f|y2zZ> z)6T198|1>WttuSGf|u+jE(BA)hRB_iv$FOi7r8QGA*KoUR)Dtl5OZFY{{_Y6jU52x zh?iP4gIc;FsC;O?sQT`T*A-6Q1x7GlQ^PuQ92XaYkPE3sHszAkfQ}$NT}021J<4~# zys<P@!pn($$sQ5RM<m{hIpN+SQLTxc48A3t*aA9u6rmWsCf<q~3)1Ut<g0a`h$bt9 zUd%}Ko)a+M(fV<RdA~xt09?dp5hg!O3C{$fNYJ~bH$OHVQ0+c+>7a4I*W^#5GTVC& zNv7O;)$9bljCO7F{*k=PkUV-tpP(xH8RS#*+BRT-Q=*(IBxxelo07Xz!P78WNaxN* z>vqF5p)$5dM6$b9oAc{J4Mx{xz}pFyFc6Yh(@I4v5uOGS4xKZ`f?fdG)&UpjHKuD= z6|(Kv+z*HuX78N+!q>3e@`3r<FyiRSyumYddv#tC^3!8vURVnJG1v$ow&p}HgfU_b z4Hn}+pNcctV_tJBQosZ+L*7)sr|97AolGrlrKzl+2e!rfrHjKnQc(?pWgc1tCD2wX zDp_Ca#@Q}en;h}os*WAOlolKpo3}+;7SlqLnRr>n2lA2TOl>T6kU_7Ww+A2M^m(bf zEJ?)&0#8B&&}~;XfA+f3bxzkrM>FGZLi7`AZE47<;1e2bUI<niJ!63A@-$YoMCb|O z(ZExkV1kl~!+q02Y>*RsK!&?yYN*|ldqe#btr?0<G4Pw|=&>p7^IUsS|A1bOXQS@h zf0Q^ZjoU-4qne!cMNY`72hW_a8t9Jexb;0;#TBhe^r|KhF^?PhjY|b=Sln<+u;e<3 zrYG{~(+e={jdTyT&&Jm&lHarVS&lChm4!ucOiMJeA&dVBMT%~~m(d->)mCEqfdvxT zfMk#6y_QB!EZqFeU%>|Mtx6Ia7%cr^)iJ`}b;AbAk;0GK%h)kZ{ig0DPsXu1QeaD% z^skAyR*_zL(hpdn2PaLzEbbZ;Efrm*9iC9~`yb*LO9{#k+E%So$FLe6Kw{BSYhcJ@ zYnofat+H<u(BXn2yt#0$YgAoRXq<sQ>giQ*<!v*4*!OF2(u-7*7#lB<N0+wMdww;x zC|Kr=XeN%MKTJ9JxJI9}$jl{;#}tr^z;wzeA)7wj%iAN+8EMx(T1|gM1-v!|j=)oD z4++-}y1QCOY8Ck7L0~d*5$tGG0Hy|oef7Rb<=xOSF4QYyGmr_RN{onFZ{qMXzCU<N zlwGN<iV=O%GtbzevVC#dL9n0Q=oz=2OL7(<KlidE_0VplbDbHN;Z;1^GPGVlBkLi) z8hnyz;%3v&!~GD#;Z7A2(nu_Bt$<PSAPo7!m31{ae5KdTpGXYW$u234c!sLJxoY66 zz$tlzGwK1MXZi}O7p7lR=ns}^W1S_4lJdea%DwJBpz#^~Ld%`KMbURpDVqUL;FHAm z=(V%^&54t{>z@Y17U(=D#n#Zre5SRROuc1WwaX!xGMy_NA&gD6K_NWV(X|X;tYWmC z*4r5_X@__+{W1&R#NE49Br#vzEB64EG$=B-xJM&sg}Woa>`4}|wo5zvz;uqo^<8U# zS=*c&#JTJdA0S>y!s>hj{PbpjO_ICRp=8a7!Fts2p8Gd^DJU1XLo`7^{RIj$`{Zue ze6dylG2bFbk6U>+O7G1krZE-1MBmp$J!1+S8-OUx_q8kzv+Lk+TK2FtjVdQb2Sy}~ zH7~vm1zz5Lj4($|R>_R2LcOOsdf!w{Oy|N~Gd)I(C^Ekuuw0YAZ0X%v^ZcPLFEts7 zEm_Y1phI<0>P$FV)`gcdX!|yvZ!PA=hi%>sUl@04;C<M9OW5IkJ8fm%H>n!AW(>UY zjR{*Ck=K4o_~8Sb4qAM4Zeg2T(xl|Xh#9ep#8@4JE9l(eqfdU-|J$(Bd~$xrGd?m- zJQU=H#Mwz=E&>P9N10;uqDuA%R+5N)Y=4BcQlLU}VdgC^FB~b+_LhW#?<7%W2j<2@ zk99ay;szdppBnHwTUK<t`SR-RXL}~2qtRbjlNbqC$9C@taF;$EJRvfH?l4=(@R|f~ zwS#7s=@1;!$?~S}T%>PBe0Xk43(&NT$OYy{yjOc64+F;cy%tk{}x8#qBFg?pWu zuzA#kdG^jKQw^<rdP}mVGp9Nqmo(D`;xB?;^<MDqJKO0TJaq-5mUvmo?FUq&^yn+1 z08tErW#g|u2ZE-<^?NNdMy!b5BIBeALL9Bn`6=@j$r-O)G)-SwQmF0acqg4;W^=M3 z$B!Ir;X7^`d)u(v1E4XBn~W_?Eg{7dIIT2Tj69(;TD!N_+fU-``}N;^`sNZd>u339 z=MD19RjntDb=;-sp4z{2f_@6jGP}|5TPN?Vo6oj1m?vd{=GM(}lYI4np*kcMl^r&G z?$I=Yj3{Ma!t&mv-lm#%3Z1G3tXSya$-&!*oFFzNT6G4axh@%lc>pn<$<-SV;=p3U zK?b71oe&;1KgOU_84}5_`6SPdlPiK6m;Y|!tP1Mg9NDR_AHa!*vlifUcO8PP*L#Si z2M$d|c`Vo8M{;DQdJo#1;S3Yc3yjsI_yJDV>?@voxcf{Mc0AtVmOk%5>Bow?fuA3q z04=v?cApMiZuK1v!6SdP7$QBFq%$f@7<(P=VB>OCuhfsNp+!6QK+#J+qXS5I$lL(D zl^HjN@jNI#z2-=X-TSdwXh2dfy+h<e-&L~$9^|bb;+eX?QHZH+v_;^BX%Z?OjupkZ zzRr4pZLrw`zexm>u}4V8QHk1DCm!LL=g7_7xFxM!;?XQ~QQT!kgWZ&O2zyg1JS@0_ z&b=+><i1dxc*f!hIS(V@&HB&mv|B~FaXpGN1!v%CGN>R7ekO0qmV&gqLz2mi`(Y3m znW7}Sp-eV?LB@}kqT_92-M8~zcyB{74sX8v{-wA+&)gI*i3)Rt)LVu4RMXCv;U$oo z^1K6{!j_p(+Yff{arN#crEJKX*M5Mulkx30GY3VCjs(oSR`KA*T65jGM}S<L2pq&w zpJfqm#necaH0hAW%QZ41&yytN_kY6UX4Z-{WOWIooKHT*zAi}69~LRlBG8Nzucx=c z+&9~um@6+@B#<Fb-84V1*B}sC>gU=kR~6PAv>>&=+-mrAz2nqvNSv*2_sq!+&DJQ~ zVYaxw$Tg%Kk|Uv)Mr1*@s_eEYsCE$6qWQ2_tXV*Wur_rjEYgc1j+;kgx^;>%I9-(X zhGk&Xu^mIO=WAd=a0WUMya*UpSCr}3jr%@Wfq(skH6|rWA<#t9By!q5f>$b9@A&4C zeR4#3Kl<c>$1ht^8S^gb1G%9l-BqjRO{;Js`nnsJ7&C=@oZ>rY&RkgTGWDSzu~x(s zWul+AUw5A$$a*;w#of_5<@7*VC)vUqS0m&G4D^zuryF5wsmK_^=PpUWO<e0Wut-H_ z7-gO`apMC{#=1L3`YD^|bN5w4Eb=`i>CIHxTFyC5h&D~6qeGf4#WF94TC{AR&=TNz zG=_IB^W@N%2?0F0>n$N4q;uV!DN}J<Ej?=jB2dmUscqx669PQER?WVRk|mtP>Ea5? zdemVj&OE}PBRO8Y>MhQrq!H45r4QH@<Q8|LyEq?D2rN6+0#KuXDLPeY1>?@v-Jg($ z<?k$~kZOe6rbEQsG4xoV4?1H|6Sr>stk}Plqzml3V)8Iv>6y=K=a<Jw^IP9d2(U6> zPX!84Fl7=MakOYQ!U_xTW@lHeyUS=PQ@b`xU}B@c5?@o$WqrV2xyPhVUXxwQO86l# zEDn|}qU0^mbwbWdB_yYpZIGFeUet`gUL->(^W=vHaSO6Z=G`-F2W}f~#e#&=<82)x z2M#n?GjrW1T1oEW!XKq@0YcGrcj`EnoxC6nIsIe{>hCSR-#O2ONgW>)ZJiJxtd2zf zxKj_(JpJ@pAdkZ|Z$4~#BmuYeYjC=jBz=psP!xV2X6+MsY9~Ftu<83JSNrl>9nY@o zvw(2DgTHNFcP~nU^ur5DK62E7p>tsCYQ+9Uzkx0JZyc8&b_EVNua91fXXD#@R)<Bc z5ZpXKsz|3baqm}fUP6Yhyq%gl^|iD|d_yvl`88K1F~1QRKAy$vXiHiB$2O@U7h76+ z-ClT$J7}kADsd4eYAWFl<toN|i$for%OTUALlAVy!>?&uq=tNNmcIt^OKf2)!-MA* zYw0Pt@aw72TmagavWXD#?aqAGrJi5C{nJ;nkJi5AuBLHn$y}In5$7;oYa2;ojJz3M zKATA21N*WxO|8^E%NTl%!WIF*{4H42E-El*$fp9_$eoiwa{On)y1Q$ufO03!HA%vL zW^#OGj}|7{62QaP-M!DJDZ$6^D6w-+-@OcdiHgbDbDpkw0KO8N5?=n?LP?So{vyGH zg|NN%gq-!K&m`<Qj{+ZU2uKbOwYIvacdr5zsdDF>Iy{q}mNV19iMk&11U<2wh*A;f zbBo2xkpk||<;CH@Cf%pJ&D>Yz#VNy-Ie8C~cGo+GrWf?BsRQ2Qoe#_MWXXUdCLP9; zb8G8ubxzW}MqLFWEGw8vBzN^<CA<)I*x2tsTOqWq3H?)y1Ke=1VQ{dFc=@3M6EQQN zor_gMruFr#shxZ#=staRUQ&w?h7IEt%_Q1clxNYK96P}j<UnG6z5Sa@o%%!P7Q9Fa z2i;Elvgcs}xZj`=fwuc#@C=zbZhrUmlObDe1amV~eG`Z+v<k!E&S>5L4v^$&3(21b z9<z4^*Sk-o;i3&%+wi(LE;C(br|T>ay9WQ4#LFn$dcxBwb*Xx-r-^ix^3bzq+e>zc z<4flFS;^B#^0r!~Pvz_(opgX-=(9^AQs7IH(s*NB!d7VvD-wv}*i@MUKZKwG@7nt> z`k6iojx!L9jgfhSMsC$kY4YD^pES77OU@0UL|z(3KV8eC3dk&qy_$RKaFm|V<U!Sa zpSICbUNJ1L%HuS|u~<bMgLvBW(9d6LZ$bkTuMvFalIIc-JGM$(zkjg-tNh;OB{sxJ zJY!!QF}aCd&a?b5RUoq5<H03}OIQ<bqJnXVI~0x)St01;FI4eYAYj-tJs~*#>Fjmc zLtaTtzjGFQiQSn<yaidZ6pa4O;LX`%M50X7XCBpI3wa@r&?BpZ<drvHd-Az-8a<j( zjH6XE1>xgOu`fYRde(xP*umwtkqeF~!$KrR+{T)!C!o2NkpdS@Lr?t5;gS^*U~ZpB zle2FYT=DvFemdeAUpK7*g1s~!p@p(BFA~_*QZ*~oUMa!fA_x=4)s(yYbs?X4Ud~5i zpoPX#N|KN;KZyjuX#UaNFd7};t&{K5<>!S^$symAjKy*?gYbIfSM1^#dyFFsio_0x zZzO{<Vndrfb-;>QZl!t}S^Biv*cyo-tdcQ&U*817OL!fC__?cJC)0=PP5A%kv(K@R z(yfCCqrtFKP7zp1r_e&k5>=wn2sRFbtc6OT_9y^!G<Ru>iShq@`kPW<$|s4hPsulP z&yN@eV_*H2TBUr1nX?3ej<1soCn9u$j&R(TXZwtg-u?HI;gv}7`XKED{*jdpAcTeB zhgC$dojppxeY-pbuGm#bG1AN&C#2R~jZDw}^RmAWD2W_RY*%jfB9*){b{`5lbj*yS zIS`+T3X1`pCGaHA*}Ywa(6(5?Js0-q*T;^wi;PnXwcI)i9muS*!0B5vZj`sTs65KR zDNn(fJAkJSxN(-xd>Yp=B-iopPQ$W~;~oGu2;>O-Dh)st%)F;V3Ey^cA&&rhkHX0- zZ4vJPmOXo|Lzk>i^*^5lOj&lSakKv#*;|0(IWoOjPMxo!LVksdxdK?~NXE&f93X$- z;6Gu_OZjK7ew}oZco274-JQ?Gar|L~G}>Q0Di4s)K2bJ@LbZm~CW+jS1?f)Wzz4AF z5KR4_{TgI(1`G@;HArj=fg8(Hdhgd^daw!r;aFXG3~SvM!VeqUR`CKG_y0NO8>a)` zSC3joPk*NP!Qp6KEr~oAU&ef6wj0`9%N~erbe(o_zZyvQ>f-<GmIbaP{7jXn5^IxQ z-<OhI(G8Gw)`W{Fz!nYxH|;c!=&Yuo8el<$=C6G&!p4*o6R{tON$ZE*z8bxF>F9H8 zsO1|G(Y}OCNDD!p;okcHp6s0R6tIl!fO}j;Eb+X$S>5Mi#R&4XGg#1EF{D$-?}POB z#oYDHqrB%|kK^P;feU2=So~f8IH~W8!2eFspN8x%T*?E|y7>q8)Td0IUO($P+jTH! z+4J{G;afHo&6h_JqN}al5EQKemxA{;P1+H2N}JUg)WzA0Wpy)AP<zJN4qe0lv$^2o z$1q9<B<ty0XhZz6Uw7L@YzJ!z^yvX5CJ!^Q_##tBx5v9H0BOJcQEZ+G%!<FoB0(4h zshf6$DdBDd`~hIT>%Wh(^+A3oF9Z#E#bC9q#-(1M*^ImqWQ(;t`}e1rf_m`OfD{gp zt_@2y_~FoAu6hG)hWM?T^H>$z&GX@B-C(QJq1#W|Pz9uK{(8Jj4<2wXh;gOVEQH@* z&xJc&(D;-}1I`h+Hfj$=&+^1y_?(wGsL9a#OHcjt>FkRr>BHS?hBfH@C7_`iP<JFA z{VYLs3P`7hHfh!guORmQGEtm~9Q$9NhRjr*3ql%7t#MzONZWaLgzO;8HO2}fW`yeU zXc4=&kZh98*K<`x5@r9&l~pE2(-|VsDGaNuWPRh$VAp#6{7bWuGxj5?gETR<5>)C7 zTed~`<=uSn&tiXlft{>*^BrtOdJl@~WPq}&%yX#DPy@>XHUt#}iG;vu=&3mZPS*X% z|1225S#m=dqYH$*)WWG8OJFJdv*bZ6YTbB=7186v(9X#p%p%*BlLY+#U2`Bh%{H@} zFdtZ}2%PgL`A(66hURBG6K)z|BXD`GpxWfm*Z#X(J@?U&i0+@jO38y%iQ(AAiWy|R zUoy}!G(y53+;xtR0(?u)Tr@c(BK!AF!KQ&>{9KSuWn@KKlk*%bbTOgBFSAobih2K5 z<rKmCLf7f|0{}McDBhv}XS2R2A$nAPQ+CgS<AFH4^)G!=lz>F!_f4F{+OmMLP}_o$ ziP-ah*UOqfi~^2_IrLjfi!r_Z<J+Fn$0Lf15)+9xY!67`WVY-vYtM#||9ni78U>t^ zo9~~VsTu$UteZ-Q@Lv*S#K>hFIy<U>ngv;WZd;;}D@W(`=ZTycK_|_;gB%+Z{J-z4 z4ve&7cfH{``r#D#l9p4BFvJ+RAABeNXKQ>|pf01!`o2-vSSJAZ<qdBnWrdHT+UHn@ z5FUbKlQ!)I*~;&5JKT<WU;58e6J+S|zy?SF8P|H!1?Ug3xvL&(uNIH?Q1dj3uo0>e z1cIHx35G80+PQVdk2p&IiiM_F5Hv;fSbQBs(}@(p1N-b3Lj+MpvQvOgjX5=ZrH-l{ zvq^_G26LwghW@+HKq-V4XHB5h1mBH9vMJ3gi5asPK^&OaunI0`)PqYT$OO^6JrpLL zIg{M}_pJxtAO#Ikw+J9BHZ&$TUwnf+sA?_CeN$x1g>ltV1u$<)6ZV4DZ~dtu%w^5{ zXTOiW1#%U;D-Ek4vgGp+k9qxs#9x&5aUn$IK!z;{3N^5A?=SBq*UcUw=zmGpFl%5a zaT#lZKZ5jvx-NK7NyvV*E!a$JZR8p}aQmS|>=xwx@e?wP{<`__pERe};4I<A%DSY0 zs{frM%kSP%@)G$OlXEA%7m}ie?E*rz-=ACd&sPN9A%%3y3c#S@%Yci*_-xtcjq{L1 zL##e&5FBTGWj!!qAfZyKC4UTI)%?3>)~bQ8ED^Z0fQ-AOq6Ml{d+!HRB8ogA00q=@ zQD7cWS0e2RrDA@A?|*Gslxm=In@cBsC#&U{bxM2ibr*tbE5BrgEeOh`mO%t!#$ihL z5asRUI>Nth6H|~Nhcje?h5VuMc01&bdgwxjk;iIsVL5jV5XHny?%K-XawS`uT>g)U zXQQzo>3Wf!2<&znfUEcqpN$>aXPGOwY7fpm1`j1>x|7bW4_NX`_mW(WAi6)V47n<5 z0dowUFsKNYhRkbPNp>=lV^45ILGI59NF+4f{Pl~E9NxWs|6ikjp3NBu0U`$<7l1xg zdc(B!Xd8hcQK6ZlJ~{T~2LuD^%6EAHm-_21!6HCMr<S+jX)TED*lIESt)~cr;2u?g zJjHwgH?&k$yyHm5{<%k0vgSYl6WzA(K(nQo-ixI*B0zS*`Z80=By#m31FApIS<>|P z(|R7Fbu=!t*MkXhgCsP_3XdDDKCsggWNdJeG*smacox)xy4Y|b0Qf%-1KFk}^#-)v z`*h#iY{;|0xff}f{*n}#2Y3gd1dwdl=>uS2tpSLi_q^!7`rlGS)`b%Uj<|#arW-J- z1!TJvseZ$D3akjl-?3)w__{5?^~ey8XhX8<|7s0<wW(lYDMJAK(}<Sgd*BRtomXrS zmstiC%6!Bm8Zn7~!?4e&aM&Usa`JD90BZx>D)7=d*iq0odjWuO<E@R~8{Nf-*>S-1 z4MxvP-+rEocs>8Vbpjc}utnytR1E<As(k&n3T?Y3a%;M{k*m)8?5%dp0VD$)&4dJ9 z{(huVb{&?${_05SDdL|%pG}qWzxA)+3!q?^9f2$dT_upT{y&k`pJ#Kj2GI!FI6NEH z?~+>H6twP1x@hBQ_UqQTqYwrj$jk#_M{zLrk4|==kQM!VVZW(PLE_)i=VTQ^LH!0e z@9@o;f?ukJO?K)I0pHXmbVnRqcHT&oiPC?UEsg~pW~(6$yY}>B<uyf9|6gn^*b^pS zEGizu*ARC&;egxR{MBTe>w4^;B_og548t1j*a7<Ztk_H7JR$dmhOFY3yGcSibp;K2 zy+a){{3eiH<=iKaD7gQuJDUP;?bZ(9Mss*C!4*MBkZ1Ip1%F+lA7tp(+iTk|f#D8O zS3>}~$oc;++Z+qX2Hu0p9FQ1JTP5Ic)U5FP9j<C$HXqDW2Bj%35&?9H2k8nus`l%D zuN#S%AA(>=4ui|S{JAizOdycs7jW-@H#PelG~)z2!sDn4HE;i0TWHo}l{J00%Uno5 zcVh#RHus%)d7d9h&}=+<b3l4vJV=4cXcnA_zN>sknE1a3^;RMX(mSP)xB#V(@Cv?M za3Mc3bU}S2)S}KzJ;ddBNG#Z=+Y|No0W*zbY5G!`IGoL#1uHWDk0O%!fQNPJ4X~Wz zXwN@cd7O6VzoKk_BEGOiQto85aNZmp*l1%lbF}pdG$^E(cSj|(ctI*&(;g>L{_V5^ z0YehfU)~N=pMQYe?=|~ca`)F8Mj{E;$zlV3Cq^($hj6_%lcKwiiakIUe%&Gu<~87( zUn?GP+wbPcY6Ks&p4Hm)=;$~_P=NOKf>L~?ZiR5%>L#At^#6Nz6I_v$)h(zl^0t%) zBLj$X*2bW*<k80=^MiyuP`^E|?~2C6F~?47Av6A!{rP<rk~o4OjOBr+NERck5(orL z{zO!)nqDYq#k>kheGy>3h~@vk4TE2Rh{w?J*|4|DM@Y0R^rh+SV5tL54Zgl74dYTC zkRZ<0CIjYG@KDU~2#)z9%y~g*sNWkgvZc=)@B$tf*ya2jrTf1=tCE2RqeLs>)Ch$L zQh*!fo1N_a+ieaSWLpFL0LeUcNdX+S2l(_K4<!(5@X{3cpwov{v-eb+peE!7clz9a z4or+BRoKxOvK~G>AFUGACxU9}j3>mAbKw*Sf*38mK@Fio0!JEU>*)Ds$%uq;x}l_h zY$4c<57X-VXG`FU8O@*jZ9;%f4!sWI#OA42&Lfv8I(qYN=#Bp#_j4>rM!$f3{3hol z#8UvFh>8T-{+5Mr7m+}JIxaZ*Gx+ac*wo4YUN!<EpbNetMx<&$g}ZbMjHn*M3p+Z@ zpn7t2ylJh|hq~2es3MsN{*sw}=I=`(gSxF?4(?t!y(e}2M}P_@kbu*mS@QSB7Ac~j zMA`?MW<1}g^Ifjw!7T1fQdjv~ZIVUc@|f0DXk<xAdIN$v2ws-mKT1lb2@mQn5FcqG zxF2e(|AFm(TMJGNltp|pRBcNGlWR^HZTw4bk>XXnkVtP7x&C@8PGW`ge_^CF)+4TG z!87pj<-!QNt*}cGAPr*QEYPBouc0u-=@P^S8n<uo=KQ%+$d0Ilq9Lg6lo)|{VXGO3 zktbR3w-eOG8nniK$D<Pp9xkzSUq1p5|7?_|Im+vUhXGg}@6I0CplV@>UrJQw4jMLR z42l^0G{-Dmp^!eZ_=ueFuPL;XH-}D8P_R3Xxer+R<A1$G$c{}m`rt5lGwl?78!=gh zeSf9HcSQ31qwJs-#2YxaV6b{}pPhPa)l~W`Y#n4-1KyAWT>goiTieTG;06qGHRk{A z=RhbfxxZYEkk)g)Zw+bKO7EPb=ob9_Ml2|3xnN|Q;ZdhS57lL$EEWGbvEMo<TLty= zaOb5<X7?v|2x7s4LHnFzzdw(!f%J?4REou``0&U6r=Nvu*aC{bHs#mnfy)i`qexAW zq!Od&s0F}2zW<t~G!kktS1W+g>TIt-uH9POy7*Tr@{iP#P>VQCASC0{ThfQ?@!;>i zWjpif_oV>@YP7-vDbPCA1Dsb%CW-3bn(JtJGM~wIXA?DG4%?mOYA}3LlGX0qmfgSX zQVH$^P#jOtp1VF$G8WC>WT;PBTlM!{E|S8u%7VgGs4+0<0j^?FL|6YAaApo6sO$XR zO&9d@U_lzeUXbKhtXW|B*17MLnc{*t!}zi7fzDttftJE4qo`ta)@@#`s^+S7)yct< zb51MjQBuy}J315CkJo&K!_HVF`yW|hLUca7cO6vG0_)8m%L=+>09rl^ti|ULwH;T) zmo(V#W(b1oQr&ZN^~DZ@sPh!CS{@N46dns{%aIFbxV4xAO6C@{a;WYcqQyon69Y)v z32iV|um1dQfXSMTG%SJdL)aq_dQjA`KV=qF4wMbf3I5Rt@ZttoU&U66ao_38vKvDM zJcm)2Z~ZIH$Q5hDtH?iD!#GWto=3<a=^cDRID(xB`hZ{K9sM34sAygac^`{V%GW<G zns_a~o_=p%uCNuo6Z>7<rnv6*;bs>2*PdPWzz%NC*hLacVnzDb{by$Yu?T=Nq!W&@ zSniOQdIjA!n!amG()+#n2vJZGCNuxRi_!9`_t-Ri*C)cDTYpVKI+DlVTo@q!fyulG zJo)&Y6Y+oBLBu^-`$8v?wPyMO8WA0EG{QXt!A}EJD|GsT(IA$$R$R`>A-0FPmfOMQ zgbxCWOKTp8x>)`gA+Uc09pFO)p1~(Rg2sSR5B=ahFHyOE>lI^re3s@X1ha<DA<ScC z4J)+o{Q-ir^uPM!{u-E_F#tK_zDq1u91}-?4+yMjA7g$?&v;Ckg3*c{+slvy!$U;u z6XhCK0ljsv`IF)KN84P)a?U|N;Abctuf2I2(4PZvq1kl3qm8{#r!U2fUeAqP#GrPl zI9{=W7e)c7W$u(xl(jWdCF82&pYI_4nIrJTG*A#Lp%V3VxxSHgvdE-&Zd1<zm<DVe zMjkSw{c3=nzpIS74{8KjV2!^;ie3Ujzp|9&4_>uV<^0!?M_??p<Gf9}V~5Tb1kn=E zjrmbZCkj}GM6O=rjw1D##azxyS9S!=zmn?{v2b1D#$U=TIRoT?62Thq)0htZATaUZ zKL7^htM`m#69E36RVnekQ=l1z<!w^g&7S`HL;}^bgEQ?^Py7D5h@q_LeH}lWFdrHd ze@a37O_ftY5dM2Wq*y34#S8QI0*X}E4Kpgi<4&N^r%@Y5B2v{13~ps385P?_s1%KB zTGFOB)%vzPCglDGRmWDYsui1l6SWx7{Kx?y?~%*rKR!h&jQ;43>^wY4;C6aXSZh3l z7$w<VfyeI!3Hq3Zp`zRW74{ZjQFU9~I3NwuDK#LSLw9#bx75(xAV_z2BO%?5igbg3 zAP5K+IUtBisemBg9^d!9mwWI3|9w6_GIKn0n6uA0d#|;AvA{XJVUo?Yfl68e?ExYN z=&rPR?@BQE$ps{L)#|tu(8t_@!&)Q>t;{-~N4u?NG~Od7il+O|s@2~E3h4iYhgU>a z;KsW+UJ2eQa9H-3sy6IK^(=}Uad_%CQsw-`dFa>Ab-_<yLTE9^9-pF(0Kq|88G4*_ zKGIUNKf;2+c-IdQnBQ=t+1RBGg5ChC1H+{&ps_={k+=)v%`4bVY~@k|fD!0~Lq$<{ zjXm}%WbmsB0<OzqtKNUoFb|%{Sb9qFvAKNS3V${Vjv&<h{Eo!*(3no+p0^uuMV}5n zy=)(STV>UFKq#X!`i|fFI}oH~_PsUvs}l0}04^2}f=ql;Bk|s|&n4Mxwh4nEnvk1V z0cXEjQb+c^8w6hQp@22C#L%q6r-4KT6&nZQNAn)B5}+ti*!B2QPQ}rHswr`#Af`k^ zUTaU9`W;b0_-FbV1Qn0zTPL7&$%PGOArMwP1RRnPQU1>^o4XBxy(4(yuUcpUb=f&q z*tmco;QNwM+shTtk=tHK7O&a2lBBv4!0)MXx%1|5mH7}POuXys7eO1tF{{mWPyX;| z{vI_MF3eUgKKvPt31`ALtdz{*aiu`>To2qGpR8=)?CQXD()x?}-^)8230_Kc^pY6O zJuz+;1h#>ooXZ7D9Kims(fsT96gxt>hNMVnB>hC2q+@FI;mx`SgrOBkODisusf4-3 zwjxj=gCAD|!mKlA`(Fs64R0saNrr|Zcu_#CJST*FDb<!@1=dUFjcv-44p4)%PhiUR z<p1gVAk%d5D@Y@hh+NnDC6BGR%BlXUPX9e@tIPyHzWoL%R=fE<7b88CT47L&LfOBq zS6?_@47>~;xeL3lXg}K!RLna+tQDS=0%ut)>SKS81NZ|pf}}_Y{2;5>xp%@B>_m75 z$`yd`Kl9_O`!@sA+YU}Qrdw=z8F&q}NS&KJr!>>0J(IO{N=sEh?**wYyk@&_2IWR^ zj3hIBN{ikpPuqfBnrYFPNnbywl*qY}h`oMF3rjFp@kSuSDuJ9+I?T_LKy47JR$idi zoDM$n#+FIP3j7vFW}F*g1HhbtmVu%4IM^Um_oEDxsRTHxTUR#ueK-sJw(ZT#HBlXW z*RD&wM?eMT{HVGTr}|iL;bq?2;fBk~r%s$VKr|3X)m~PXk?I<w=aiBNsi7wVmT!cT z28>icRCk4yO!eRM2SgH8KXl<WSsi=AlvaJ=UH%xI^A{R=)%6VQ(sj;wI0#PO-;o`F zZ`h@sTr#q=mEkN*w=>$TYcFjZW%YDva!RuWqHh*nRan3P_&!yiSFbwOJ7u1<Mb;1H zTWwTq0YsAdM}s#@7?lNJSPSph#M|kevoT!aIy3>n?Kqe9l746+=33*8Yqg*y182E% z)6XWVza&8m+Tk}ie-TVfUKPnMtvKXf{jVtz5b5Q>Na>r_55o1&*`SAfFErsb8h5$} zmk@6~|DvD$bzT5VW0$U4vOwc#n$jB5&NEPAm$qAakJiwLc>CzD<oB-tjg3hAoNdgI zL#DtW6dUO|ZU=ZfqQoPUgLu38S1tapky6V8r?mIf+(NziILoNl?ok(zeF}wGaQu18 zj9@bVJ*3+EVDxntBEcf@9V`wAIROZrY?m8N6nSzGLj}n~(>{M;+d<Z+3(nF51?Qi6 z1xzvN_9%Wjp&tXbQi|Cx4!~L;a&h_`IADZ<I(@*0G|`=WpoYBw<%s0cnYAMTerWDJ z{P`7#7Y-!g#~>5W7z4rdSn!W@dAvHz@#_a)7xlD?flYodG#lVc?(eLVxPbQI9B>JP zL5$-D%Cexq<af|EkxC~mMeB_~m}moSRhlgaLJ_g}rL*rPsMMDPAHSfdz`zuluew81 zdGGvuzoF#^Si`T=cCPymKt>AC=&4s_@&E`hsleV52Z=_MkNR{0DEOVVPjd%>MXufw zgm&nJN0nKcYQ81=HR&bkOih;(0KX%B>a@9ysC7cuf#Q$&IX@~FNa8XzGO{Ui!NUFw z)Hr)Ht)BGwf)!UU7O+k#j`<e3kDSMWK#rL;>c&(C$_3r5(lc(?hI=)@^%3FPfSTKa zs!WnNyZwC~tY9n%6R?;0ymz%I%LdcOKsYB1zA|D;)up)ZL!hicNGZ%d<4_ucK+*yl zLG6d}q8msMqydPmV`YDZFj+GKKFVicy->{C#6VP90a_#vZLhF8YFLuid~|#QvN`R~ zn3`XQKu`&!4_f*Ikw@tuWs{Ra;2I!gCYQF%+d@cYpQX<i0Qnk?=O8kO2J1A*Fk=<A zcZt7AEG6U*L&5kIh5T66!7=nk2+zrrFJ&=k6jTvV=Rjtpyee?>B*aF9WN(62(@#|q z&J~TlxZg`WBxG|+MgB7aO^0Zc!!gVmW|;lgLLM;J%oLwPVy&*)!OS104uIoQi9qj3 zfg(nka@@d+#QAylhQ@YaT7jUepHD_Q1prrqx*ZVDC+^K6KyzME5Owxn*M8~%rPDHW zg{%sYtCPJek#Q>aTYe4*kG!M-ASOWcvSKD!d;|nsnE|X4Q^4uJg?jkpCxRK;sw@27 zQ=Y^gG^UzMK8~7~0~FTUJH#`uHN{g(mIuPF5z-a;#~>i&(hme{OaLftag6Got0sG@ zzyP*YKjG&O&@+0cazj|1qR#ctEfF*v0Wn*UaL7l1Fmnr(FAOb&ni*69P=y?o0zmPm zsX;b;?S-j1P@txJ>kBFkwVzmi<8!_`v%)rRHIzv%_W-IcATU(pv$NW87<MdeWo%?r z`_4nZ6IB)T^XvS&;Z@gn#4^&a@;Ax%uW5uCYcc8gWI>&WY5fu?Cqb#&7nFDN3C%o* z&^DZbcBj!0h!vIX3pvBpNLnoV85W@}%KP+52-6W(X&~{F^CPNJ0h2{Q{%?fxCYzt| zGZ<idI5{#vNncy-WoU;A0ZG&Q9J9u!RvX4DxdR3Ip+J6_iOR7Y2wNlVYzOv6VE~~_ zKr#sJ1NZS@OsbJf8K-d4<4Xaj1=Iu{ubfq3bq_iIwzGz*-w8}alF@7W48^*ag~)IW zG`?r|l9tGD@lI3N$vew&c$LZ`jJOGwn#tIupKRH4{%dLj6BS9aOdqQ>0tt4H0FAF7 z0U25D9@kUu4QK7p*0A-@plSvfDQNFIE<s12)F8)=C9b@DW4LA<);LpUO0O!E97Ib3 zzk^$))GFo4C{#2a38gscFtE)+3^v5=03Om?+~T<~YFdw&cHpl1Us@z=9y<a>9`$j# ztL*uZv{tPvJPcHUl8oreude_tuz@nfctSQG(QRvy0Unq9ikLtQ8l}1&ndUeXP4NCz zMSQ+097B;w=kuYUX~OGg9%~9n%)Mtzfj~T4ig0S^0o~ywvBMw6dbpWohvQ_ir&~u8 ze}f)%F%qRwG3jo|R$eLyc^p~!%H`H%?133n2-s$NVi};WCYB;u7Ss%Y!mDxc{JVk= zud_r)0vV1u20!aGhoB8jCTW=slym#;fY~<V_a(TZ%#E>KQywX-8xpJ*q33oo8^au0 zx!$YVp%Ajd#>|0MJ3+b>(iKE-D1aPg5i9}gV_^X_AWAa+aY4#dr=wTIlaUQ&KX;ms zY)>J!i^iwB2tmkKSxzEYK;@iIj!idrX#jULz1ZDdF!#o{QM=H})2Ztx9`jr1OadX1 zjd*sCf)1QTcIJ=e%RdpV3RT1<oAivVp}C*I4kB4{%U8pI?}CN{4qh+$ra4Ed4$E*g zv`{F0=}#FL_-qn8tcQoOak!6!XDait-CBpxuX$3ge^1zNA*4<upMhxs><Uk+s=|pd z4^aq!ZlyA0s$`2J=L^$6Z*^zI4j-T)+Z!dOrx3&K#)d_D6aZDKtRREfzMlU2C~{UK z;AOc3?1UAGexmhl5}XmB74+`S-=~3WV>*y}xOF`>s$DlU9hLX2Y}vQutelJ5aqC<B z$$SlfL^$7-g~@$KkOupoJWsS97vnUvQZ#)J)=g8@_X<Hw{f5n#1ZSWEi>2fxi*wuI z%)Hgx0pZ<%RH-7sBw0!te7X&2bU9EF6&Bo&4FnRzqMHZLKs4IeqJV^(_Yu@XmgDKs zW4p6xT;Q9t6$D9O-IcWF{fQ8A-&NL)-hET(GMzWsMrJv!d|p<~xm&5l$65?7D(G>F z-!vHD4MYumC02A4O~2%k6zJ0`OA?4#_zHP-%Wx1(w~SvrM53GVcQ;E;j=pHDS%o;J z`@V|*H0MjDua;XJ8?TZSA6h$9Non~dhWP0yfm$j;qPzKW3h;WxC~N{QS*nkTS$5j~ zovt9PP#|Gb_}{vsUfbBWmu&)8#5Z<(nZ_*ZTtW@Kvnf|r6-fj?BcF~JmbP^<7xtSt z*>+aqL}RvNfjuB(2nqd~Xl7Zyy)k`QOEVsk&Sa5jLKz-0R9nHYNPS?{gP^K9HqQ+M zJxj-C;*B*Ngw}$6X03FhUhC_osv)F-<Cb|RL`BeTT6<W=vEIuii(1(BaI$#e=P{1^ z8(y|2Bb_)kyb6eFcVsZ(upV$l@uKayE3x6JZ8(Kba9Atfv}ZaKc8fSz63q{7vGGxq zF{AssPXhFm!&X2HiEs}WQ3BM3X@_d#iN0VF<{s8j8OR(kV3($N7o8w|Ve!c{L+cm< z%MdgtSvoE9ncc_->RPE<F_<~kriH|VZj2{)DXxUh>g>PL9lR2GkzML+%|6Z>+zbea z1msb|&J(JYjK7aRLns!ICxQ))VKD&i;Vx1Ckk(OlsXrl3{8samQJEm28-=U<yLnVu zoyzI51?UCZ`lWZ2iY5j#E{nX`DA{;Jt+_u)J10p4jRg`b&a7@JRaE>)=j5VYsJy3o zdxW;%8;j%dtN6(eFib^X>&G%kxONp;3W;<=1+Zva-!ZX_BZ3?@#%cDk$sb@5`Z|E4 z_fN?H5qrv5AeJHGmn3pJ1yO(nL4RyJj4M`zKZQ>m=l-D^wlvt7wS>XBfaODtONBY^ z9c8sTEHpGf6L|s}-$NL(NM<O`5<RH<kNLz*{UeT)@-@mrp*YMMo*yG4l)=d64mXz8 z8Ls#jSZTOL+Kwv3vQiwTbNbMsvi2X#uE0KXYaYuoVX~YDEg2Yj#TtFt(5Sq01u}qq zQc3OkIIgl0z9N;8Ar>uG=WJId3?0r<rcb;HHk!&!6|9Z=*wtzR%IUFF_s*Y#>Gb-I zcGw6lF6ZfpmFTVA$#eV<Nc`-erE0_&P9_fj>H2f>oV2ge7ZV4My2^SM9v^iDGjZo_ za@3bI$J6Q8T|RyrvnNXAXzWdqQ_A^Dy-xAd7uX}{&W>@9ju7*2RGCU^xKZ|9`jHu$ z9v)3yoMB>Ieo->6W6~EfaEa|P)#}S3?)c!lk`Z)x>KmBjg*?8Rkw;~Bl}#3>Wzn<g zMEIXtG3ET?a4>55#G*Qo$Vqh+F_*5w@v0g&7{S#S|HLmj!1yd$^7pGi3Zjh}ZDL!o z$c=Fc%zH=vur_DM)QVKGMCj?^<4ec^RK+_M|Dgy|<@{cQZ8YjsRcmMZ5xe7C+yqWX zyGr<oS|<dF??<MHq#Fo+S!l+WAjv*NOayuinhdsz$9Yp)jyTsh0UXE^)P2QsSn3OE z<kx6Y#vPCYg$}9%g5gFo6d3!<1N3iXgaphTvin0;cZ+PRM`j{PB1s8Y3UUs+3$iG- zA>mLaEMnsyeu)bk;ZAs_7+IY5#=-YkrDYpr0sZ+4!wOh2HKtsHM_f*=m`8)T-1i5g zlT>;AlAo@YOTenfi^NDEx}hrdnOe1kdc)8U)wT2w{eCM=;rmD`L>(R@;K!s*bg$$m zn)!{WvGD3ktJkFKae=&9j`~s;RO<E&YSgc^Fk>ar@pOmJ!|`aC_ZwJ49b-rB#HiE6 zfyw=*^$eM%7co8ojZxjD0>6tu(Yhs*Zs-d0qXr#aKoz8o*B^UPTX<%kFx(m*AIVGS z@SK5Vp6N`@V;6!wg8bAOA<oZJ$!f_smcLg~O0`?Ch!Mm{Mm$#W=1Sz&6#gmu`QdAv zYz8<+3e(5?#$n373KR#P3?&pbUPMnYBI2_$j-$%%fG)TcUr0wa#z!FEFLREgo)}B$ zEv|PRN8Ji+-@*-HQ!9$H@{5J4m>nx>TSI$+|H3BBQ(Q@5o99ATq~(}+ck90<=f@V= zrP#Z&Ghz<_!RE}Dk5yVDn26d~Sq2*+ffGr)Pt|B5Li|#soThK}V<A){F(V%{JOQUa zuz+doHZ<K%PAub?SmW;SFBeY9^3@Q`SlqEq@?-02;+^l6$)Pc31eS@4?en(O(hZH| zHYw;h{&EZ%$0NZ7b(9`2e54!SV0ygJu{Tzh=N|G=S1FqsAmQQ8fSt=@S5o%U!g_`o zGx&{JGxWPm-KX#k4G7kW4KH~G$73-zxLeU6CnomG#?FMy&6lVK1O=>)vC%Bt=EB0< zec4@Luzcuu7UwaPr!wer*mLN-R{_CT<@OksWONHygA8omV?lR;k72v*VR7m-dGoO> zRwYY1$^Dc#ezQ#u!Ngp&n3K!f12pYB`E;5D^s5Ox*n`Me=w5;gyqiX!y^E0HaT&J_ z(lZ!;3eOf;`Jk1noQnd!=jQ0}1!wlV$6GP#D=7088TT|n0QdR0oFtOPM+|At=eQ-C zuCtgG8^d@0@g?eK8V%|fsS2C>1Ve`(g8>nBGlD(2;4~~$7N!9I25?RQdt^a!?&{WE zj$#ENIBI|A`H%<!;#zWe+!Lc-&hh<leD^rf@lTOoBJy1(KGSB?9Z+tvh~hPPc-r2X zy=xbpj(Jzs6)QEV%^}`?^o%*>a+wdq1YmguT5Xc|Y{z7Ez2I?9>Yl<h_fm-MFf9{k zZCR@ogAWNu3k9p?=6$75ZR|%4IQ<#8SV5C8GwbG;(PBS|8Sen+ZJ3%S_BLs8W2*!S z6&AxxFVLd`s#ShOyEZrH+F*|IVHAn0{*>PNa}ceUVUrcvC`-`GKdYqi3YU*ka)GfM zh06KnYL9K9%Vu&iz*#78yqGT({LR4H=^OQGwUrKMAp7y9RVdl>e7rFgR_P+#VLUY} zDA{n2IxAHJ`E#{WEFmX~Sr~I1T<J0@5Wi~7F&YITg=#62EwoMgTS=FQhAp)J>jb5C zC`I5aeA&ETRJ*u`x2jamWsQ=3aNNje$SY1@#ZG4DL$&Bl=wr;-#CVatFVbiTWBGw` zgJeW0Qc~|G;axb(q@YMgIsTz=GS^Xhf=%bWDXo_Ahgl_*&-;zeRl|=PZbm!{8i<GL z{hn%!0p3H+fzT@=qo{A$D(4&f2!i}*^ts?W;)>?hmBbcI*`q-0e)s$|1-u}v!MGUG zjHD8kbC~~(K#HIss>ng>2+?zve(T++tfEQj{cGJTDj&&9cI6%7q2PG)+;VW26KlAa zpM?1l9B}9RVmzZIMc;D!1+uk~h3D(6Y-N`aJX9^36(j=5cyvs)p@)^A7zo9wZj-?v zeuz`3DqvK_rW0h$kG9}Ry%+slNV=AR(^qYDESB9-5Im&*rtuycD<c>Wx-vf3fJX>- zFw$ksao*Z-)U2b^42}UOHVHSC0NTz)fit#Y0;WzW8o|qDxo`I_70DhKT~@zh1(Vs6 zT;Fp1DXo=xRXB_Fu<ZJbb#1HL!%N+-UX_=l7}$|$@VHX{N<uF_qw_N5vJC~if{IhZ zpN`tTW$W6ta`3nxV|IEZF;UUS#NA$SK9M$ez{8kS6)7n1v%!juoC2Ov)GZS?N_9jk zq7e^uLJtW|i=7QE&tba6%pbaJhh|w0WTSpAzBkL?>gW?Ry=^b8;WTo}*d>;bO=rjr zL1`t3YVZnSs~o4M`+)Ap%FV&+vQ;I@204b16J+2sGbzw3Yp|u0GfWH=C1=z5@4n!& z{aOHxVSG7CJ9U%}WUy=3?N<X-6D-+ua<O*glY}!r1Mh0BJC<0)PT}7pSbjy%7%M91 z(vKpuNNacki&nBku{n&;d;U_ZbHYr5`-Sz4QsL<BY1>y=z-5X{!+khzYm&1`4IXEW z`kndhI5(@b@8W3WDA0l<$rg=9rs~F6l3mfC(#=NKNvaP*!!E+AehpmnMh@pDD5g5r zR}xqMV3$5B{b)&}Jf)RRcFk@qV)^_ys_)*XDtb>~)cQ24HeRn-fqSSmWrO#$b3ixr zQ{quPxStGzz5sg)UmNsilg_-T_PDm4+arOUceiOG+n_0m4gpNVQ<xRZy7rYzbN?SB z@5?T&Av64SA5)O?sr8ScYW|EjcF9cnoCxczp<#N0@!1GP<0C;HFyTOlYOsAaCVg2H z6oOzxFBNe2!oOSFlApI=BA+D+qS;|SrIbw{a%5>H0aaGm9n!?9-{J|!(HbUbWFMQ9 zzgGL?(AoR+zIVWmg{ykLo5qu(e@MwLEz(n+a`x&gG73AjWkwXy$>}RzFv)1^%e{Zh z5Q}<FmHR+ZNP7PKebiJAomusIR32w*MSL%of#o@U4+H}ibp)JrUge!d`-PcVzoiwj zvQGNZ)k}b#pib#38W{x3DSaQ?u&qI#Q~J1j{ajS1#ELH(W^BxADh_919M-zqNS53_ zn42t);>@x+hemEDbFE;lmXD97qYr0^+(EdR{A&(h(1H|C;lCela0^aHzm|Z#`94V8 zBF-6OWjI_UteH>gyQ0S#AP#O%Tgu3omR_Z_Z(qjhbJr;-^JZr<qJAY!zVXc#nVy<- z2VA#J+zb4P47xW2%pf4yVNNu7fgG#kTC5=!47lB;1Yrb$!%q*)>|W{w@BnX*!{3q= zq0y%NFVikZY>m%{jx<p?)pH&3D)Bwb<`p$vOlF2DJNvs}xAe?sJ!!u)`{L>*El(-B z=K-TBpmgsaJ4xJZS4*n%`s*o1efIGP$=D_OcF80PIUH1J*`z5vwCzGMDMB*vQbRTw zw9d}0^hn&UX}m$`cj*tTP55SOFBJ|Od<fX2GqBB78^zvUqQWt535A~NaD%EQ?^W(j zsw<95{UvH3)D>U(rwXh3**1%p#$@`Fk>BCA$}9=kGITgFR$BMkk-(on63+tuJ+6Rk z>Pw{3bUbn(f_Y~~;cWet2+HJX(X)jjTXS50o|#qxPs}io6?*f%y#r>*bsY?h0aPpg zyOs2=qMol4-_gw;V)gqDFFqQxW5v=~QOz~(+QXcFxnh!hE~O+gQ#`UWt&;&JHhH|x z!q*%ZML-c(OO{bgM3oz}q`IBDIch4zY_~#wo05;Qaco`U4%!o(=fH%hh^6#8_jg$7 z8JQfVVJH-RgbTkR>ug=K$i(4L<<_m-b=WH+LABOISYje>B=u<A)!Rre%7{G{5gn{T zDz0hD87f3E10?I2ax1cIw0X1?m-k}21PtX`l8$d<fZ`M@j@>s<+r&g0Pb~)q?-@Sq z?>Q$(E5X&68H%EEm>R*j|0Dp}IF{_8`0pYNeA=0kd#4V$BxnF^k%0;T2R`|RV-Z$q zOm`rURcdeeWE3j)l1Aej2<gl0=KTqR9c9P6tyq+l$EHnK-M(bgjV>HE$d1@<!>D=? z1d*jk*g5@G`Y6I|$6J}*L8jsaI@)Hz$68*5fl|S`M*xz>sS=z2Q16lC$(U!;*=K7Y zpE0_6{H|9Tl3{vK`pL?VnA3UFE2`@DUPmW=yFC^%5Vz3wUO;(aLpa!~+bI}=kd*+` zXMG}dR(AK|$Ml(8!xal>;wx-$6Ni)hMv*xke&4SexVoM8ijm5GDtL?wYG>s{F(I;) zFc8n;)sFe`;WgDsi!^736*~D6p^==<1-)*qzR0)%&btZah!+`59%f?O>GI`SjjLE$ zg0peo#W!?~8&QQ1BFhH_#bmzA<(Es$n^x{CD-+4yf9$kEQG3zGj-L=A+q#eC>3zNV zL99zWbs+-bY%ZtL3+o^@6d8ZZPN8o#7v4cLT!E>Gm5H~&;Pa&wgKU@B%Sl0V;eF1T zBg0EXSze9*Cz4{ks_(Y7ST?0NwVd@+l4tGfL=3lf=S4>p#8G!VR%}w$9RWjn)mmyL zjv%}mmv&ZENqA7uP$fE9ZlDhof+}o9AAgVf1`*S}4E~U&BXwR^KCg&ww4~(&fFQ2> zz?Ldy+HNV$;%B-nel!eT3al5hdbLA`@61f5>9NYJ=t#mU6qBL_yv7w;TN}g&9;c&p zG34Z10k<wc{XED6eg?E89z**WUu~yyD0M5`QX*vb@m<9Qv5;_sIC`YiQ~942KIm(X zMKvd_ZAO^k4<5gAV7<?(YHXMgVfKEXvm^*PHACzicKoR6d%RJ&Tw%=3i7`>}G56FQ zqTcT~!t&r&A$G&a_-E8{X{}9XU;rRG_v>`@9MS>(VAaqv%GBR(1p{S&m?p{2-5Klr z2J2E{CqCCOjrM~lBn7JkN#}Sy`&Pa~mw5w?*+URUsd;-g%0xYZ&l9~EU*hxL%C^x% zoi>@7bZ8amt-b1w@jL2Aqw{P7t7dUIW_t5K^EM2ZC%pNZVMTgu9YHaBUxn^gChG$M z>}3HjqBxZ!)Afv;ELhSxt7i({0>~(H2NQeEdS~Pd0`RCs2$r~?MT$(?^=S~uK$3$e z_E{dc<)_+@J@?Y~sO9YNQ;=4m{Sk)GXc_cHP)I&)lkd3_GXr-uAw4&`+;dSShfk%? ztKhf|XoLi<tMM(eIBhDWNUXQEiK<41K)CTTFt|f|_AJmpzntHPP388H`bIt-^YoN4 z-wO{^!Zf@zQA+7|tc-VP5;@oy^*O5#DY86iU20i9`>3-!k57!;uxrmSjI3JA$&Z3| zgM$OvcF&!Bh;SrB=LvPA?`STp4O@I+mHtGbQp^~WLBSP2NEIux>@bE#cIw8!P!qS< zYCKY(qBYD)SbFYw4?IAYxxaPf1enm}l_bWs#&f%N>4;#)@={C>h95KXw`%kJK2|Ri z-}sSOIqVo!4C__WS;F>te5^+?yYrXp=${ZyyBu}D{BpZzYQ`(S?bu#)Cf2)S>pQm| zqkVgR4-~Gtf(DOGn_WN78#B}>BG%huMf&B>d!)>4eYbM|>@=QX`D^%#MF3^QYYcG& zu~Q`&JyCD6u&%myUguX8j-{)?c1Bgo*Ab4k$`y*PgL2OLkttq%pkDL6DR~PLp$TR} zYdCiHp|5#(qfZB`6C8Ak4iqB>GhKJ<GxBzpVgjnC!4#cVT;o<MYbwUsG4&gVaYO0v zbs{#A&#J6$8=pr`NDS3MO>#=H+X8g|4T%G95t+iA()Dpv`8>1Fn2&hYQ28n@x2dxC z-oyi7*UwXNN^5(rMyzd0G<ix(^jW{(4V`0crVMsYsqk8G*2|cqlBoq2so9Wv*U?~9 z0OMj9yw*Rj)1(8Ao_JLOpx*R9z+1W;9H_;I{P4rPEcF!D2(b+9z8k=68Vh@@aty$y zoXHAec@F_^rcN_pr1o+J<3@nOsEq|Wn@AsorA*lTSlS2u%-V#G>Y|Mc%yiG$vSPVC zfrD-RE$RuW0OmE<j+fBi|NqAb_&&7N)*r&|^aKU*VWe%o898_jE>$0rfgyNndy~1y zYL3FDAF4)fpQ{Go?W$!BE%QHw0uuzGAlLNuP1Wn7IG_bQR4z<GH3)5=PjzaDnbLY| z%18wVoC76s(?61yzjA{J2|_Sn#4Ea5hVYuj`_N)I$lDxxvLDug-_?i4HSq5l2$V8G z(*jbDJ?7?Py>7R>olL-oc<!h6%oQN}@BIHrz5bzxA_2G^VD}^l?0(EpJq$qk3u{VM z#&S8Ox~_uLH!^l@C?E!)$(x%})?H>B2IZ(Z0V+pTm0Cm5AHG1Y;lJ+}pg;mg#qHH^ z2MmUsT=pjK`kNo&thw=Bbr5dcXh9c%yPz6Im1B(sj@q^a_-i?(r_VAFR%ZWPQC0>p zRt&>n4FIGI_u>VvM}Ig4g$Pc;&T`vdjs<^(QHm_!$vkCNaR4lfg;nk<3wCfi9z(vl zmT;EhFV=Pc91;|ObpbO1!QFTYxEqyCitReIIi;?hHgBEFj<cSUwf)gb|Gj%118}&l z-%-(m-MpUsl72eps#^DriEb1(NB}iL6;@GMrUJgJW6VL0ESx3CtuXdZ9fF0z8TGG| zN|$j47Ynde67NHEN;i+^oWHV5o4BoRE~_J`EiZ3q9wBg4K!!bjHgM$zD9UU+HDer5 zM5fpeWd11R?+$>_1FVis07d|uSfJ{2F<tB)ZE~`R<@uY^@n4q+$lPO(PXPQvDq`88 zE{e>&16a1Mz$F(Dw0a83z61KYF>vkMGXg%6FyM11^$rz~E*Ah%74QJ)w-!6ALF;b| zr>Y#l<p-_&whPAvgP&pn<!~Dib<l|W7Xg0eQy1qiHwK$g8wUl@ovHXw!7hLC$JT+~ z(!@G}3Bhj!h;Ci=5<tzRK|2PHizT2i_=`9d0o)8qDK8Lm9zeNW>a1QVa|7}K!2i{* zYi8@7iK7$sX1t}DMk@&j>h<rn3LO7RXqO*@I3s#pAb5C>@G)fJY=CVvWj(p`*-# z&Oa_XuWeFAV?P1EcN4D7J4_>}v;phLV&i}hnkZrX+L@>dgrW)qKuqiWhj8Wz@SE4X zsX!L*YV`U)6mXCIQ2_zY>0=qfYrj|P58sb50+38f3KkI}_@1|tKu@Qz21uCByhAPK zspITeC<v`6%@%@DZtev9^SH|aGV=9Fl6zw#(F%|&?oj{^h?OCSW8Z%aA~^~$IJghk zxyE6LbZ?P~X3IVSDOBI{xMPwbY4M@S?fzn~?H(ZcN3`Wrw{286$6QzK2M*vO`;@}& zW?vStk_e7S1pE(H{-OgS=mvZGzFagib}e2_H#t5bgoDjd&#E4|JuR@8{vOl0_<9ex z$(vgPQc82u>tuvjRsn&^fcAX3Vg%EcJg9iUeXV;Ge0d`m&_SrZJWc^*U8N7%G83}J zkh@WnF!qQ5Er;!Uw{hsri?p4F^lM{tGLL1qV^)j<NYT9OfZ09SQ!zjgM>q|C*4;rU z5&$AnVY&CEhMR()_$NS0hn}W?*c?xzv&>V2{pbMJMX+>#P=;Ja3`rD%Px%4@#_ACO zdinlwYxrj<Cy66=OM>uR0-5y?WQvk@=xQbeVGzaNWY0VnT>lk~7WnFAT_H3E0DW!_ za;^q~Cm>1k%5|J?0iGPW-EXYd2O}6`L_~qlD1wq%r5;`quJIBQWntd^q;>mdRR`F# zBi}-Y7Hp0%6q~wk1K6}s2RIr61u|$(pbY36pKc)x^Uaq7$J8m7iTDJ?cZ+;Nfl<pD zQ`&UIAaI-jw`4b<9u<Wm7)Q$wi;W_e*lLR8B4;iTat*+(XKcO@JV8iMLO^F)A?L+- z_raCS^Nas_7;up7FO1CnNOveDR6rk6KOnYmL}|#&zQ+hhC9p*pVzi3lHKp<AKFoGp zA)!6O@Zr<_2<Vq|f!i5-uWM?k<Hs7vQ7|W6X}aLK_ZLosHAOa}!M+69n!sc>-5V%x z+Sm#K_pp!Tor11rIPx|i_x=KW2F=eMyiDzBwEMarZU6WT{5`dUjwAW`Eu9N$FsY?7 zc??%+<7+|Jl~$uG+f;;H6Tubk2tueXC{26qrgIVYeIX{lMt=z<@kP$j@tFdN5+0yw zKXUJOIy>Abh;ojx2m$N_AZ=a-J?S0*AEeU;;45(fxFu;n<1WOiZvi2V*!BWw>{2A% zQFs8n;#w)&mBTkSfvKfZ-dDi1cRT_n0f3^__kAf(1NiLy8z{6>w3^Ch19!j0sV_}Q z+tnjClu16|E1*wf{>|_=|Ih|vk|7LEaG<Jwl7!jmu|}&$7tCk$QF!0`JJ2b70zpWn zk+MlpIt-;ZN90TA>-Qsl+|tzlXd?dHn@9*t%yk+L4nYJ~x?XX2<Rt#M@eVg%fKxv( z5QT|EaO&l|OS`=lIGB2P`YB>LTJPwXvGj}SR!|MVl0gTKdBALrOE$|7{SE@{Hklk! z8C$o3DO-#R6G{Pub3l=357Bd|G{+x14<IyVJPboZ`<8Qv4La-i_<GyH+z_uktevri zAy5e7r-THAM-##i;gNOqwexm|`PxBv6zu$+Z0vNE<sdv7cJ2<oju1W}UOotqk`rPd z@Y5CSreJ5|VQUAGlEVJ`zyZj`xexU9R>|V#`h@#l5ivlRPVYR#f-H!ukfQ1&sD^8! z#6~mwE1)Tn5V9HC>JK6-$1&I_lHf!|TED?MCeR)q(os-^e@J%0`qm_P^0Dx0!eniA z_Zcws`xf%18%g^z5_Q<u7&%;^%$Vfs=OHs9;_1<!C=>+9c*e+s8}|07%4Z5Fi<f<p z1qHP#;~hV~a);aYyyG0uX7*XW4$EK=mS;pq!d6@ok_crchofZcb&OH+U87E&=CJX_ z^74_DVU;&BY>l?K{;1jE=y{Q!$Gly3$7GhWSD+-hNBd(T(?&%yYMEI+)4D@NFos>9 zzG@*7{3q+{*Jni<NKldj%b8u~GS>t?MH0%d3CAc%nAxMEz2109=c0}!NCDLj+li<N zs@BznZ}OespC;`ujym+tt$8`JNA7LJ2WZTlcH*W&$-`Sbaut!8Oxy|_GrlxYfB9mv zyyJL2u)0PYs&^$h`S6#)5%a-ZiEMI-$(rjyBTpY0(ho+{M>HM%IR;3bZs;=bjYh3+ z5Ts)?q|T2;C$zDy7MY`)xGXqH2M4Y`$fYja9G`@Ll}36@4aAE6ESUcK%TT<UTsq>e zDk;C6BD}h$T3umg1{W`H&i3jj!S&XlsME_ABb-I0gXBjspA2+9Wn)DrIQGOyL>Q-Y z+hRwDEp3ER2(e&Lh8DY!IQm&4g~W(zcd24bdPpM4-@V1?F8vTC<nw(3UhK*KUdN`4 z7N0b}hrf3(=y1#u-8VF38T593;HKGnGnI2vR;)$44uOXf!}l?^Km<1wh12RbbvVE0 zt&b3-=x`N+Te-KmRZyH{fM1W)3KF&~?+UVil(Q$&V#LE&sG5;Np6F(%MuWFKad5){ zN*Ft&4n_VL;e;7^NI+UHTc1u=iC-YMOh9Fd87MESEkbf@Og<r<AXDc26>}{GdsKay zytd@&UEe$1nC4Lzk1<|B1kkULL!t@uQC`DtuOK}QUu_kq##A1jURMYpEy5rle7B+2 zMJ9#!Y?yq5>JW)D#&S3dQ)UwL*1VE2Ce@LGT)HtMG9kT7216xEonm1+UM1D@6qO9G z?OW(^Ww3k-vT@3-IFsZJYeU$wwHkCO-zMKsgM3HGo`65%JhIAqsjb?WrBT`+ONj7M z3fHKiRhrfP*1Wb`E3gA`YP^X-%1vs|&@KuyK6k-p)Mxl_l6%5GkKEp1J__h%|48yJ z5`W0&&^nmDA3KaXjCL)JZhU|x9m^EeB@&-L7sBYus84VQa~Ja}ns8V^C!$u%mm!uQ zaMaA2tu1v$wpW#!Su=}7HI|WFmyxZYGeTe0nZcY{lDUsQ>xG!DvNwf^jD=P+V=2Uv z2|rU>JDZi6L`#iYQEpXJRPDJ;piH2AmG13Y_eJCS{O)2?tv-biwGbZVEdIQcysZ~a zSq&L3IiK@_n6$Fr<UPo<<Su2gqz_a3U47YwqBA5jq!&@qYFMVU(K##`qpDa~o?{(v zU1*(P9knSqro+^m8Ik#nNUKg}uXTZ`ivEt=>#D$ouFiX%VsGu<LTQwRD}TMt+8aBi z`_y-eWyfT9AI=J=hTnmAOzENzL#@vEbt$Wovyyv~(@q3-p3iN~y%TD2vbgSL%Q<Iv zXAjO{$g$5s&Pl7+Fz{F+St_n~tJhkDIx{=NoL8NHEpa!b%+<_2D48p^6u92LjN5PR zPI%aL;rxAMUvfX|PT`&YJCt_}?&Jvoa$2E#;fq3e;jX|$r=uy(6I4^U>FyH?XimY` z8GU=EjwI2trsgj-T=P<u9~vZ^Y-&4<9V#?CW{J%+x$g_hJ~Ml!_drfdoyVBRvPI`x znUqdxQ)%UZ^1%JDsliu}w^m8AkA`Z?63Yf)C9sMOo4fTH4fE_3rWNAjA~sLG5|5;| z?lZS06su;cro6bPx3c(A->Q4Aa}L*K$B|i}L9l0{y!E|_Nu$#8W6=?b$>55>N9P<k zl1au%#bh7IEIGe$>T!MMq%&bNK{Iyi+;6=Yc{^I@Vr~;M5$n8V(=l89VdqIx9oL%w zz?Ts5Li5%SWIdWab3gEYF#KZv#fu>s7ZBHn_jAS9pS34CWQp+er;V=JqvS0NmLQh4 z*QzyZ#U`_Cv%rEM2bcVie36U7d){lKi`qMb+m<`oGQhKJ(coRqmg(n<nR{<icKt`) zMn9}bu3mNh;=otO&rnX9$gauSy)%bn5uev$lws8JEc2)JH|K9PQesjGQYliz{r>$8 zAv|ZWE0in$iw`Gn4tFo!{L(@dL2bnPgk6cMgldQ(g~NwMgyx4jGK4(T6G_LjV998< zNQNSJDeoU6fhCA*PI}=(!Obbq$b1mkWe^Y=@Bo#|T2VoMv_~ava$!<ADTPd(?19n? z<uS!2<$H=jig}9adB&V39otIDrpb_MNisSr(jZ2E@4BB0AJpTv4mPp3zH;-M<#rsr z^?m}co1SY<w;VF@VyC5|qgf-kP9PqxgKIROT0VaOM}3pk6Zb1~cbsE4<;eWZ?lJ>4 zFS<Q?ULkMPJi$h_S(Q|E3q?!z$+};=<#EJzU3PkQ1si|eeBDc@=uY5zE5`&&Y~?WL zmt^VV84;*}%6CsWEqyg0E|;0l&|vj3vG2)G{jKp`C7JONQ<Mo#hjaT!2W7j`DV-U@ zozv~YZTD%K7bh=%g$mjWKJats_x~MxIVAYi1+OV)x!LU9bIk|lL){zS`#-0-LEKbU z52ux;Q|zeL+!H@8>O9tI?YDC5__i}H_gqeAqmOI$KA!8CE2-<35B42R&hPRVEatyk zPj4n}YB9af{JdroVs!pt=126GzN#NpzaFgnV?KEQVXyndxWL-PV)a$?x_J|P=D7U$ zS&z{{zai|tmleKKnr&JqUu}DzT8p#tQq6wle#D)$!kxbTpl4r--%h-HGqC0s_8K|m z))<BqEeUmR*yK-bmnK=aG1&W!#*w+t<@?<O4q=vI3SU%?GUk+Hl&dC&)BKji7vBii z3TF!qr(}+|ZFx<2T&;hX4<c^Z)8?;ueugSSFM6~&aYpy81Xp4;FfpWlkL9ZL$J1A) ziKb=C@0SyvRth-<X#}n9g}*MQnWf>9esmptn*5`nuw%+WeJ*2`wCIs&>4VT?x$&5z zqy+LfF(Y58?#}In;^x-okJAx(Efz=5z3blf{kk;BYj9{5H5U&l4(a<6dzG?G+f$Nj zc@XNf_vD*f-=1g3Rqj?(YCl@Y?uGd;o{vAeL*S{`#Z<SF&@aAn_Xk~DyqDYy`FJ&t zQHO6KJ@ZiH%JItPV5^)3TZ_G<Ub^XO>FkYtUEk@!<2P1w9q|rnv0d^!*E#1cS|ez4 zb#oj_ol5)4P0Dl0=gA))ww;b0PABKR-ijGu`~CE1&U`~@=!0K<4%RP54_)Rz7f7pp ztnC-QSpMO*Yx`;Y^#iAG)isG98~UYxL|m2qvN@f|*gMcV)5<ALk$w=2b$J}X>}J2S z_A~nA*Z;<)f`7-Q_aQv0^73*pA3IwJB39LfnEw;H^4$ns^#eUYz^V;%u=9cN+_STF zg2{OVK<-1qE`mZr5I%lUa|n;Tho8GIgcri2?qur&xes3bIUXW*{W}^K`JY3|!+c?` z9uEH;8}U1JZ+t-X#s{>$J#77KKw!-32D8!9gBaR*`#5>HLwNbQ1-N-3W~?@5Y~Wux zKPOjP2p^x4urO4F4{8fG>iEIDeIG)!6_n&X+<ol=eA%#h<Uy3~3qG!Z2*p_y#Q30m z{7_+D0jLN+FCVWd6v_hrvVoKJu>HU9g8lE)3-GqH$A&_9q1e!W{ecJx3i1m=>>>Yb z;{)&h{4d1)uWh_gQDI*G|J;Vyfe#D@;?F<(ftURJU_fqe1D_QV2BUg&8+a`s2(IPL zZM;w+QE;99Yn!OB=>KjL5xDXFe7#{#u6Evk(ic6ahj!rHAUwJr9=;I7rPKvCkGs7G z1aXxRuNA;Wm*5o;6cP}C@$=d7@!7)o?5u6<?f67(goSOOwgSR-)>7F2?_D6~e<eKN Wvi%uTUS24aR}`CxNl{A)`~Lve0B%SC literal 0 HcmV?d00001 diff --git a/assets/PyBOP_Arch.svg b/assets/PyBOP_Arch.svg new file mode 100644 index 000000000..49a7c78c8 --- /dev/null +++ b/assets/PyBOP_Arch.svg @@ -0,0 +1,74 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + version="1.1" + id="svg2" + width="754.66669" + height="318.66666" + viewBox="0 0 754.66669 318.66666" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs6"> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath20"> + <path + d="M 0,0 H 566 V 239 H 0 Z" + id="path18" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath30"> + <path + d="M 0.5,239 H 566 V -2.384186e-6 H 0.5 Z" + id="path28" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath36"> + <path + d="m 0.5,-0.5 h 566 V 239 H 0.5 Z" + id="path34" /> + </clipPath> + </defs> + <g + id="g10" + transform="matrix(1.3333333,0,0,-1.3333333,0,318.66667)"> + <g + id="g14"> + <g + id="g16" + clip-path="url(#clipPath20)"> + <path + d="M 0,239 H 566 V 0 H 0 Z" + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" + id="path22" /> + </g> + </g> + <g + id="g24"> + <g + id="g26" + clip-path="url(#clipPath30)"> + <g + id="g32" + clip-path="url(#clipPath36)"> + <g + id="g38" + transform="matrix(565.5,0,0,239,0.5,-2.384186e-6)"> + <image + width="1" + height="1" + preserveAspectRatio="none" + transform="matrix(1,0,0,-1,0,1)" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABf4AAAKICAYAAAAhJevmAAAABHNCSVQICAgIfAhkiAAAIABJREFUeJzs3Xd4VGXax/HvtEwq6QmQ0HsRRIqAgK6ouIu9rV3UfcWCsoIVyyqKsHYQBdfVtaywKnZAlN4hAgGktwAJEJKQQnqZOe8fkwwJk0ZNJvw+e+0lOeU595yZyUzuc5/7MRmGYSAiIiIiIiINitPp5J577sbHx85H//oIs8Vc1yGJiIiIyFliresARERERERE5PRyGgavvPIKX3/9DSUlJbRs2YoXXni+rsMSERERkbNEiX8REREREZEGxOl08vLLL/PGG2/w2muv4XA4GDt2LHa7D0899VRdhyciIiIiZ4ES/yIiIiIiIg2Ew+HgtXHjmDx5MpPee4+/3X8/AMHBwTzxxBMYGIx6fBQ2m62OIxURERGRM0mJfxERERERkQaisLCQHTt38umnn3L11Ve7lw8fPpzIyEh+/ukncnNzCQkJqcMoRURERORMM2lyXxERERERkYbD6XRiNlc+kW9160RERESk4VDiX0RERERERERERESkAVGrHxERERERkQYoMTGRdevWYTab6d27N40bN67rkERERETkLFHiX0REREREpAEpKipi0qRJfPDBB7Rt24aiomJSU1P5/PPP6dmzZ12HJyIiIiJngVr9iIiIiIiINCCPP/44EydOZMKECYwcOZLcvFz69+uPv78/S5YsITAwsK5DFBEREZEzTLM6iYiIiIiINACGYTD+tfG8++67/O1vf+Opp57CbrcTFhrGoIsHER8fz5rff6/rMEVERETkLFDiX0REREREpAFYtGgRr7z6Cs2bNeOZZ5+psC46KhqAuDgl/kVERETOBUr8i4iIiIiIeLnc3Fxefull8vPzGXbvvbRu1brC+rIOr9u2b6uL8ERERETkLFPiX0RERERExMv9/PPPLFm6hKCgIO644w6P9enp6QDk5OSc7dBEREREpA4o8S8iIiIiIuLFcnNyeeuttzAMg6uuuor27dpVWO90OtmfuB8AHx+fughRRERERM4yJf5FRERERES82Lz581i7di0mk4mbb7oZTKYK648ePcq+vfsACA0NrYsQRUREROQsU+JfRERERETEi82ePRvDMGjSuDH9+vX1WJ+amsq+vXsBiIqKOsvRiYiIiEhdsNZ1ACIiIiIi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HA6ysjLJyjpKdnY2eXl55OTmkpebS25uLpmZme7l+fn55OflkZef7/65qKiI4uISSkqKKSkuprikhIKCAjp06MD//ve/MxZ3cHDwGRtbpD5Q4l9ERESknnn66adp2aoVwx94gJiYGI/1BmCqIiOVk5PDtGnTWLJkCe+///4ZjlREpAEqbemvvL+IiEt+QT7Jh5I5ePAghw8fZteuXSQkJHD48GEOp6SQkZ5OTk4OOTk55OXlUVh4eiZXLioqOi3jiJyrlPgXERERqUf8/f254YYbuP766/n0P//hgQce4N577630AkD5iv+cnBy++eYbJk2axPr163lv0nuqYhIRORllrX7qNgoRkTpx4MABEhIS2LNnD5s2bWLjhg3s3rOHtLQ0MjMzK93Hx8eH0LBQoqOjCQkNJSgwkMDAQIKDgwkJCSEkOIRGIcH42u3YbDasVis2mw82mxUfm49rmc1autyGzWrF5uOj77Iip0iJfxEREZF6ZujQofzpkktYuGgRL7zwAv/617/4v/97gPvuv4+mTZq4q1D9/PzIzc3l66++ZtJ7roQ/QJcuXRh277A6i19EpEFQ5l9EGrjcvFx2bN/B1q1biYuLY/XqVezevYfU1NQK24WFhdO8eXP69O5N4yZNaNmyJS1btiQ2NpaIiAgCAwMJCAggwD8A/wB/bDZbHT0iESlPiX8RERGResZmszF69GgWL1mC0+kkMTGRF198gX//+98MG3YPRUVFmEwmPvroI7755hvWrVtXYf/HHnuMwMDAOopeRMTLlSX81etHxOvoel3NUlJSWLlyJTNnzmTJ4sXs3beXoqJi9/qOnToxaNDFdO7cic6dO9OufTuiIqMIDQ3V98uzpKSkBKfTic1mq3ZOr/rO6XBS4ijBYrFgsVjqOpwzzjAMSoqLwWSqNxe/lPgXERERqYeuGDKEQRcPYtHCRe5l+/fvY+zYse6fn332WY/9unbtyu233342QhQRERERL1BUVMTy5cuZNm0av/zyCwcOHHCv69atG7169mLAwAH07t2bZs2aqcVOHcrIyOD2229n3969vDtxIldccQUA999/P2vWrOGWW27hueeeq+Moa2fca+OYNn0aFw8axNSpH9Z1OGfcmt9/555hw4iIiGDa9OnEVtKq9WxT4l9ERESkHrLZbIwe9QRLFruq/mvr0UcfVTWWiMipMKnY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M4e5c+cyYMAAbDYbq1atIjY2lrCwMO68806ys7PzJEPVqlWZPn063t7eOe68+qNq1arlyfmLKhX+RURERERERERExHQpKSm88847fPDBBwD069ePkSNHUrx4cZOTFXw9e/Zkzpw5bN68mX379lG7dm1Pm59mzZpRoUKFGxqV/1cEBATQqlWrPDm2XJsK/yIiIiIiIiIiImKq3bt3ExUVxYoVKyhZsiTvvfceffv2NTtWodG6dWvKly/P8ePHWb58OWFhYfzyyy8A3H///Xl6bsMwyMrKwsvLK0/PIzmpKZaIiIiIiIiIiIiY5j//+Q/t27dnxYoVtG7dmqVLl6ron8tKlSpF69atAViwYAE//vgjp0+fpmTJkrRr187ccJInVPgXERERERERERGRWy4uLo4BAwbwr3/9i7Nnz/LCCy+wePFi6tevb3a0QqlXr14AbN68mbfffhuA5s2bU7FixRs+xl+ZANhqtWq0vwnU6kdERERERERERERuqY0bNxIVFcXGjRspV64cY8eOzfOWM0Vdy5YtqVSpEjExMcTHxwMXe//fjB07drB8+fJrTtJrs9m4/fbbCQwM9CxLSEjghx9+wMvL67qT+7rdbho1akRoaOhNZZKrU+FfREREREREREREbgnDMJgyZQovv/wySUlJdOrUiXHjxlGjRg2zoxV6oaGhtGvXjpiYGOBi+58/tvm5VJj/Y4H+0uNp06bx6aefXvX4hmHg7e3N6tWradKkiWefmJgYunbtisViuW4+wzCYN28e9957700/N7mSWv2IiIiIiIiIiIhInjt16hT/+te/GDBgAOnp6bzxxhssWLBARf9cZrPZ8Pb2xtvbG6s1Z/m3V69ennXt2rWjXLlynnUWiwUfHx/P+kusViu+vr54e3vj5eWFzWa76pfdbsdut3vOefmxHA7HNfe79OVwOP704oDcOI34FxEREREREbnFsrKyWLJkCW3btqVYsWI51v3666+EhYVRvXp1k9LdGitXrqRixYpUrlw5x/KDBw9y8uRJ2rZta1IyEckLq1ev5plnnuH333+natWqjB8/ns6dO5sdq1CqX78+Bw8eBLiibU7Hjh05dOgQhmEQFBSUY11gYCCLFy/G6XTmeG2qWbMme/bsuW6bnkssFgslS5YEYMqUKYwZM+amsqvNT+5R4V9ERERERETkFktISOD5558n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9+706NGDPn360LhxY4oXL56vRnlL3klLS+P48eMsW7aMadOmceDAAby8vHj77bfp16+f2fGuoMK/iIiIiIiIiAmcTudVl2dnZ+NyuXIse/XVV5k/fz47d+7Ex8eHmTNnmj6h7yVlypRhxowZLFq0iL1793LXXXcxatQoSpQocd39nE4nbrf7iuWGYVzx/Dt06ECHDh1yNbdIUbVhwwYiIyP57bffqFChAmPHjuW+++4zO1a+FhERwfz583nllVf49NNPiY6OJjo6mmLFiuHj42P6BVi5NbKzs0lOTiYrKwuAGjVqMGLECHr06GFysqtT4V9ERERERETkFgsKCuKVV16hfPnyV6x7+OGHr1ju7e1Nr169blW8m1a5cmWioqJuap/HH3+c2rVrX7G8Y8eOVKxYMbeiich/GYbBpEmTGDp0KMnJyXTu3Jlx48Z5WojJ9QUFBTFx4kT69OnDV199xcaNGzl69ChJSUlXvYgphY+3tzelSpWiXr16dOjQgccee+xPL3KbyWJcukdOREREREyXmZnJoUOHrloIgYujTFq3bs369etZu3YtzZs3v+p2J0+exGq1Urp06byMKyIiUqDExMRQuXJlKlWqxIEDB9SeQ4qMkydPMmTIEL766iu8vLwYNmwYQ4cOxeFwmB2twMrIyCA1NfWad29J4WO1WvHy8iI4ONjsKDdEI/5FRERE8hGHw8G0adM4ffo0L7zwAk2aNLmp/WNjY/nkk09YunQpc+bMyQlhOY0AACAASURBVKOUIiIiIlJQ/Pzzz0RGRrJr1y6qV6/O+PHj6dSpk9mxCjwfHx98fHzMjiFyTVazA4iIiIjI/1itVp588kmio6Np06YNjz76KJs2bfrT/WJjYxk5ciTNmjXj9ddf5+6779ZofxEREZEiLCsri/fee4+7776bXbt20atXL5YvX66iv0gRocK/iIiISD5Tp04dnnzySTIyMpgxYwZt2rThscceY9OmTdjtdqzWi2/hvL29OXv2LCNHjqRp06a88sorHDt2jIiICPr372/ysxARERERs8TExPDAAw8wdOhQvLy8GDVqFDNnzqRcuXJmRxORW0StfkRERETyoaioKGbMmEFycjIZGRl8+eWXfPPNN/Ts2ZO4uDisVisff/wxq1atIiYmJse+/fv3z9eTTImIiIhI3lm4cCEDBw7k8OHDNGjQgAkTJtCyZUuzY4nILabJfUVERETyqQEDBjB58uSb2iciIoLffvtNhX8REZGr0OS+UpilpaUxcuRIhg8fDkDfvn358MMP9b5QpIhSqx8RERGRfCoqKopixYrd1D5PP/20PtyJiIiIFDG7d++mW7duDB8+nLCwMD755BM+++wzvS8UKcJU+BcRERHJp2rVqkWfPn1uePuIiAieeOKJPEwkIiIiIvnNrFmz6NChAytWrKBZs2b8+OOPek8oIir8i4iIiORnNzPqX6P9RURERIqO+Ph4nnvuOR566CFOnz7Nc889x5IlS2jUqJHZ0UQkH9DkviIiIiL52KVR/3/W61+j/UVERESKjs2bN/PMM8+wYcMGypYty+jRo3nwwQfNjlXkZGZm4na70RSqRYPVasVms+FwOMyOckNU+BcRERHJ56Kiovjqq69ISkq65jb9+/fXaH8RERGRImDq1Km8/PLLxMfH07FjR8aPH0/NmjXNjlVknDt3ju+//56FCxeyZ88eEhMTcblcZseSW8DX15fQ0FDatGlD9+7dadeundmRrsti6JKUiIiISL73zDPPMGnSpKuui4iI4LffflPhX0RE5E/ExMRQuXJlKlWqxIEDB7DZbGZHErlhZ86cYciQIXzxxRfY7XaGDBnCa6+9hre3t9nRigSn08nUqVMZM2YMhw8fBsBiseBwOLBYLCank1vB5XKRnZ0NXPzed+vWjVdffZUmTZqYnOzqNOJfREREpACIjIxkxowZVx31r97+IiIiIoXbL7/8QmRkJNu3b6dKlSqMGzeOrl27mh2ryDh//jzPPvssM2fOBKBly5Y88MADtGnThrCwsALT+kX+npSUFA4ePMjChQuZM2cOCxYsYM2aNYwbN45HH33U7HhX0Ih/ERERkQJiwIABV/T612h/ERGRG6cR/1LQuFwuxo4dy2uvvUZ6ejr33nsvY8eOJSIiwuxoRUZKSgp9+vRhwYIFlChRghEjRvDvf/8bLy8vs6OJiQ4cOMCwYcP45ptvcDgcfPnll/lung2r2QFERERE5MZERUVRrFixHMs02l9ERESkcDp69CgPPfQQgwYNwmKx8N577xEdHa2i/y32zjvvsGDBAsLDw5k/fz79+vVT0V+oVq0as2bNYtCgQTidTs8dOfmJCv8iIiIiBUStWrXo06eP53FERARPPPGEiYlEREREJC/8+OOP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W2cUlytXToZh6Pjx4/r77781cuRIpaen67PPPpOdnZ1cXV119epVXbt2zfrfN94BMmPGDPXv31+SbjmeJI0YMSJHnmvr1q01dOhQxcbGau/evbJYLLKzs9OVK1d08eJF/fbbb1q9erWio6MlXV/OxdbWVhcuXNDJkyfl6uqqtLQ01a9fX/Hx8UpOTlZ4eLhatWqV6TypqakKCwvT+fPnVbduXZUvX17S9U1VW7durbNnz0qSKlWqJFtbWx0/flw7duxQp06ddPbsWb3zzjuSrt8hdPbsWZ0/f14ffPCBoqKi5ODgoCpVqujKlSs6c+aM9u3bZ/0eK1myZI68bsjava45n56erjNnzujy5cv66KOPFB0dLVdXV1WuXFnHjx9XTEyMhg8frrCwMB04cED29vaqWLGiYmJiFBMTowULFsjT01OTJ0+WjY2NkpKSdPToUVksFnXp0kXR0dHy9fVViRIlFBUVpTNnzujHH39UVFSUwsPDrXnPnTunkydPytfX17oPQXJysqKiomRra6uuXbvq8OHDkq4voeXg4KC4uDgdO3ZMtra2unbtmvU5LVmyREFBQUpISJCjo6OqVasmwzB08OBBHTx4UL169VKJEiWsS/UtWLBA3bp1U1pamtzc3FS5cmXZ29vr9OnTOnnypCZPnqz4+HjNmjWLTXwBAACQa/ibJwCYKKsNetPS0nTw4EG9++671iVrGjdufFNdXFyc6tWrpzVr1mjbtm3aunWrhgwZIjs7O8XExGjRokWSpOeff966MfCSJUusGwlnWLlypa5duyZHR0d17NhRkjR16lQlJCSoTp062rhxozZs2KCtW7fqt99+U9WqVZWamqpx48ZZl/fJaGTcuDTI8ePHNXjwYKWmpqpixYpavny5tm/fru3bt2vevHlyc3PT5cuXrUuwrFu3TuvXr5eTk5NCQkK0bds2bdiwQVu2bLFerPjpp5904MCBTPlXr16t5ORkNWzYUMWLF7/pdTpw4IDmzp2r4ODgW/4zb948Xb16VdL15ubRo0clSZUrV75pWaP7YWNjo5YtW8rW1lY7duy46TkcPHhQO3fulCS1a9fuvpYnws0qVKgg6fqFlX///VfS9c/XhAkTZBiGGjZsqE2bNmnjxo3atGmTNm3apOeee06StHDhQl27dk1Vq1bV5s2bNXDgQEnXNxD9/fffFR4eLhcXF+t4ktSoUaObxsvY7Dk8PNz6HstuHh4e1iVRzpw5o6SkJEn//+cyKipK0dHR6tSpkxYtWqRZs2bJxsbGejHR3t5eaWlpCggIsH7XrFu3znrhMcOBAwe0a9cuSdKrr76qAgUK6MqVK+rbt6/Onj2r4sWLKzQ01Pp9tHLlSgUEBMhiseiTTz7J9L7P+K6IiopSgwYN9Mcff2jr1q3avHmzunXrJkk6ffq0Vq1alSOvGbKWmpqq0NBQhYSE3PL7cvbs2dq9e3emn8u4wBodHa3AwEBt3rxZW7du1fz58+Xm5iaLxaIDBw6oevXqWrFihbZu3aqNGzfqmWeekSTrJunS9e/LjN+N0dHRGjhwoLZu3art27dnen8sW7ZM8+fPvynDjRd7bWxsrO/vw4cP64knntDs2bO1Zs0aVahQQWlpadaajM/DpUuX9PbbbyshIUElS5ZURESEtm/frh07dmjx4sXy8vJSUlKSxo4dK+n6UkfTpk1TWlqaqlatqjVr1mjLli3W318dOnSQJEVERFiXyQIAAAByAzP+AcBEH3zwgTw9Pa3NeMMwrOvqx8XFSbo+m/zVV1+96Wc9PT0VHBxsnXXr4uKiTz75RKGhoTpx4oR1XwB3d3e1aNFC3333nTZu3KiTJ0/Kz89P0vWZmhkzzevVq6eqVavKMAxrU6ds2bLWiwaSVKtWLX300UcaP368ihYtqmvXrmV58UKS5s+fr3PnzsnW1lZjxoyxNngcHBzUpk0b/fHHHxo/frw2b96s5ORk60zMQoUKZVojv3jx4ho8eLD279+vhISETOv3p6ena/HixZKkFi1aZJlj3bp1Wrdu3a3+CKyOHTsmPz8/Xb161XpBw93d/ZbP714kJyfrqaeekq+vr06ePKnw8HDVqlXL+viKFSt09epVlStXTk8++aQiIiIe+JyQtRkuyfp5io2NVVJSkjw9PTVkyJBMm/76+fmpR48e+u2333TmzBnFx8fL09NTbm5u1rswHBwcVLx4cev+FJcvX77teN27d9e6det05swZJSYmZloTP7s4ODiobNmyOnz4sBISErLcb+ONN97QlClTMt05lDErOuPfbWxs1KFDBy1btkz//vuv1q9fr8DAQGvN0qVLlZycLFdXV7Vt21aStHjxYu3evVu2trYaN26cgoKCrPUNGjRQcHCwGjVqpPj4eIWFhenzzz/PlMvT01M//fST9TupcOHCGjVqlCIiIhQbG6tDhw5lz4uEu5KcnKz333//jnUDBw7M9B2Wwd/fXz/88IP1ImyLFi3UsGFDLVq0SI6Ojpo4caKeffZZSde/X3v06KENGzboypUrio6Ovmk/jKefflpjxoyxfg/7+vpq0qRJ2r17t/bu3aupU6fq1VdfvasNt2vUqKElS5ZkukB842cgw4IFC3Ts2DHZ2Nho1KhRatq0qfWxJk2aaODAgRoyZIjWr1+vCxcuyN3dXUlJSfLw8NDbb7+tOnXqWOtLliypt956S/Pnz7fefeDl5XXHrAAAAEB2oPEPACb676zJG9na2qp58+b69ttvs9wEt169etamfwYnJyeVKFFCJ06cUGJiovV469atNXXqVMXFxWn16tV6/fXXJV2fwbtnzx5JUqtWreTg4CDDMOTj46ODBw9q2bJl+vjjj9WpUyeVL19eBQsWVJcuXdSlSxelp6dnuWRBRmNx7dq1kqSAgADrLOob9e/fX2XKlJGLi4tsbW3l6ekpSbp48aK6dOmiDz74QDVq1FCJEiXk6+ur9evXKz09PVPj8vDhw9q9e7eKFSumhg0bZvk6uru7Wzd1vBVnZ2frBqR2dnbWc/z37oj7ZRiGHB0d9corr2jSpElatmyZhgwZIicnJ1ksFoWHh0uSXnzxRRUqVCjbzvuoc3Z2tv57xmfI3d1dK1askJ2dnXx9fSVdn+UcGxurCxcuaNmyZVmOdePFuRvfS0WKFNGKFStkb2+f5XjLly+/aazTp09bL3RlMAzDunn2vbKxsbE+V2dn55uWt3J2dtYHH3yQ5cbe/9W0aVMVL15cFy5c0KJFi6yN/5SUFOtFwpdeekllypSR9P9/zsuXL6927drdNF7t2rVVr149rVq1yjrj/8YcgYGB1qZ/hmLFisnb21uxsbFKSEi4q9cA2cPW1lblypVTgQIFsmyKZ7jxgvCNWrRocdOdV8WKFZMkeXl5qW7dupkey6hNT0/P8o6Y9u3b33Tx1cXFRa+88or27t2rI0eOKDEx8a42gh4wYECWd4VlyHhfrl+/XtL1O2lefvnlm+q6du0qFxcX2dnZyd7eXg4ODgoODpbFYlHp0qWtz+fy5cuKiYnRL7/8Yr2wBgAAAOQmGv8AYKLOnTuratWqmZqKGQ1Jf39/1a1b95Yzzm81azBjRvGNTZunnnpKlStX1r59+7R48WL17t1bNjY2WrVqlRISEuTq6qqWLVtKut78ePfdd7Vp0yYlJibq//7v/zRhwgRVrlxZtWrVUrNmzdSwYUNroz4r6enp1uVyqlSpkuWFi/Lly1vX/JakZs2a6cknn9TWrVu1evVqrV69Wn5+fgoICNCLL76oxo0b39QUXbt2rRITE/XCCy/c8vVo27atJk2adNvGv62trbXx7+zsbH0No6OjlZSUZH3sdtLT060XQ261hnOLFi00ZcoU7d69W/v379fjjz+u/fv3Wy8AZeyZgOxx4cIFSdf/fDPWibe3t1fZsmW1Z88ezZ49W5s3b1Z0dLQuXryoM2fOKCUl5Z7OYW9vLz8/P/355583jXf69OksZ9/PnTtXH3zwwU3HAwMDrc31e2GxWBQVFSXpeiP1v+9XHx+fTHc/3E7JkiXVokUL/fjjj1q7dq1iY2Pl7u6uP//803qRMOMOpLS0NB05ckSSdP78eb344otZNjczZu1fuHBBFotFNjY21u8nHx+fLHNkfAa5CJa7nJ2dtXDhQvn5+d228X/jHiU38vb2vulYxnuiTJkyN83Mv9U5Mhrl1atXz/Lxxx57TJKUkJCg8+fP37bxbxiGbG1tValSpVvW3JjzzJkzkqTq1atbL1rcyMfHR2+99VamY76+vjp9+rS++eYbbdq0SdHR0bpw4YLOnj2bY0t8AQAAAHdC4x8ATNSjRw/r5oD36lZLhmTVSHFyclK7du20b98+bdy4UadOnZKvr6+1ydiwYcNMs26bNWumpUuXaty4cdq6davOnTunP//8U3/++admzpwpf39/ff3119blPm5kY2Oj5ORka8Mzq6Z/Vjw9PRUREaGvv/5aS5cu1eHDh3X8+HEdP35cS5culYuLi7p166axY8daN3PMWOanefPmt5xN6ejoeE+bVdrZ2alMmTI6cuSITp06pYSEhDs2/k+cOKHevXsrMTFRvXv3Vq9evbKsq1+/vsqWLatjx44pPDxcjz/+uJYvX65r166pYsWKqlev3l3nxJ1lNKqdnZ2tF4bS09M1bNgwjRs3LlNDrkiRIqpataoKFCigLVu23PU5MtavnzBhwk3jVa9eXQ4ODtq6dWumnylQoIDs7OwyzcxPT0+/72WAoqOjrRfaSpQocdPFQicnp3uabdyuXTvNnDlTJ06c0MaNG/Xyyy9r6dKlSk1NVYUKFdSkSRNJ1597xhJKcXFx1pnS/2X7/7V351FRnecfwL8zwzhsw4BjGSnIiIhsWjcQhUFINaRal9RgbJKqR7O4G6M9atQsJ4ZiNO5ITVOraWuOSwVbtTGgyGKDS9SqweBRkLIoLiC7zAC+vz843J+ERZDBcfl+zuEch3vneZ+5c+8MPvfe55XLYWVlBblc3uTzqaUCcmtFZ+o8MpkM9vb2je6WaQ9HR8cWlymVyjbvh0IIWFlZwcHBocVYQP1x8+DdbS2Ry+Ut7ms/1RBPq9W2eSLerVu3YuXKldIE1wDg4OCAnj17ws7ODqdPn25THCIiIiIic2Lhn4jIgpq7GrizjB07Fp999hmKi4uRkpKC4OBg6UrzyMjIJgWOsLAwhIWFIScnB//973+RlpaGpKQkXLhwAdnZ2Zg+fToCAgKklh8NhBBQqVRST/R79+41m09D0VAul8PBwQFyuRw6nQ5r167Fhx9+iAsXLuDUqVNITEzEqVOncPfuXcTGxsLX1xdz585FTk4OTpw4ATs7O4wcObLF1/0oBcRhw4YhMTER169fR0JCAl5//fVW1z927BiOHj0KAHj//fdbXM/e3h7jxo3Dhg0bcPjwYSxdulTq5//iiy9K24w6rri4WGqzExgYCDc3NwD1E2xGRUUBqJ+zYtasWfD394dOp4O7uzv27NnTrsL//v37ER0d3Ww8vV6PXbt24eTJk432w1dffRWBgYGNjrn79++32oakNUlJSdLcF82dSGzvMTB8+HD06dMHly9fxoEDB/DSSy9J7ah+/etfS/upQqGQTlYEBARg06ZNTdoMAZDaxtjb20OhUMBoNLYrH3q8Ousui/bshzKZDHV1dS3egdNQYFcoFC2eHGjv+A3LnZycAABlZWXNtui5f/++dMLL0dERp06dwnvvvYfq6mro9XosWLAAgwYNQvfu3eHm5oYLFy4gJCSEJ7OIiIiI6LFj4Z+I6DnRv39/BAQEIDU1FYcOHcLdu3dRUVEBFxcXRERESOvduHED+/fvhxACkydPlib4ffnll2E0GvHnP/8Z7733HsrKynDmzJkmhX+g/upKLy8vZGRkICsrC0ajsclV97t378Ynn3wCV1dX7N27F0ePHsWNGzdgMBgwaNAghIaGIjQ0FIsWLcLZs2fx29/+FleuXEFycjLmzp2LY8eOobS0FC+++GKL/aYf1YgRIxAdHY2amhps3LgRr7zySot3DVRXV+OPf/wjgPqe0EOGDGk19pgxYxATE4OMjAzs2LEDP/zwAwBgwoQJZn0Nz7sNGzYgPz8fQP02b2gxkpCQAABwc3NDXFxck32nsLCwXeMkJiZK8eLj45scDw3xHiwe6nS6NrfeeZiioiKsWbMGQgg4ODhgzJgxHY5pZ2eHyMhIREVFIS0tDQkJCcjMzIRSqcQbb7whrddwd8zJkydRWVmJwMDAZidZPXDgAAoKCuDn59dkXhKi5jQU/i9fvtxosvcGDSete/Xq1WK7qEfV0K4oIyMDpaWlTe5i+Pbbb7Fw4ULY2Njg6NGj+Oabb1BdXQ1bW1vs3r0bQUFBjdYvKChgyyoiIiIisoi23b9KRERPPblcjokTJwKov0J406ZNAICRI0dK/c+B+kLiggULMGfOHKSlpTWKoVKpMG7cuFZbkjRc1WgwGADUF2gaiqMNTCYTtmzZgsuXL0tX/G/duhXvvvsu1qxZ0yTmoEGD4Ofn1yj+oUOHANRPRtpaO4bmCpEPExISIrUzOXXqFJYvX97sVco1NTVYvny51Mbh7bfffmhBd9iwYfD09ITRaMQHH3yA8vJy+Pr6PvSEATXW0vt67949rFu3DqtWrQIAeHl5YcqUKdLyoqIiAPW97H9apC8pKcGuXbsA1BceHxzjwat1H2wZ0hDPxcWl2Xi7d+9uNl57tHTSKSsrC9OnT5daGs2aNUuaYLijfvOb30CpVOLq1av44IMPUFNTg6CgIAwYMEBaRyaTITQ0FACQmY3VlbwAABNVSURBVJkpbbsHnThxApGRkZg1axaOHz9ultyoc7VlTpPH5W9/+1uTO+MyMzOlNnUGg8Fs+TYc4w37dEFBAeLi4pqsFxsbi8zMTNTW1kKj0Uh321hbWzeZh6a2thY7duwA0LHPACIiIiKiR8G/PomIniOjRo2CRqPB7du3pYlPH7yCF6ifdNff3x/nzp3D4sWLoVKpEBAQABsbG+Tl5WHlypUoLS2FjY0N+vfv3+JYU6dOxZYtW3Dt2jXMnDkTmzZtwuDBg1FZWYk1a9bgu+++A1A/UaiVlRUiIiKQlJSEgwcPYt26dXjttdeg1WpRVlaGuLg4qZWOwWDA3bt3kZKSgi5duuBXv/pVq685LS0Ny5Yta3VyXyEENBoN5s+fD7VaDYVCgVWrVuHChQvIz8/H2rVrce7cOUydOhV+fn6Qy+XIzs7Gtm3bpHYyAQEBWLJkyUN7WNva2mL8+PFYvXq11C4iIiIC9vb2rT6PGktISIBSqZTe17q6Oty8eRPp6ek4c+YMgPor19euXduohU6fPn0AAD/88AO2bNmCSZMmAag/QRUVFYXvv/8eQP0JhKysLNjZ2UGlUknF/vz8fOzfvx8DBw6Et7e3FO/ixYuIiYmR4p09e7ZRvKqqKmRlZaFfv37tmnOitrYWa9euRbdu3aTCpNFoxJUrV5CUlCTdURASEoIlS5Y8wpZsXv/+/REUFITjx4/j7NmzAICJEyc2KVxOnDgR69atw7Vr17Bo0SIoFAoMHz4ccrkcp0+fxsKFC2EymeDq6orJkyebLT/qHEajER999BGcnJxabU1TV1eH0aNH45e//GWn5pOcnIzZs2dj0aJFUKvVyMzMxKJFi1BcXAxbW1tpomlzmjRpEmJiYnDmzBksXrwYVlZWCA0NRW1tLWJjY6WTzm+88Qbkcjn8/f0B1M9zERUVhXnz5kGlUiEzMxPr16/HwYMHAdRvs6tXr8LLy+uR51AgIiIiImoXQURErfLx8REAxKVLl8wS7+uvvxYABABx6NChdj/f29tbABDz5s1rdnlwcLAAICZMmNDs8vHjx0vj9+3bV5SXlzdZZ//+/UIulwsAQqFQCD8/PxEQECCcnJyk565cuVLcv39fCCHEZ599JgAIvV4v7ty5I8XZt2+fsLGxkZ7j7Ozc6PHkyZOFyWQSQghx69Yt4evrKy1zd3cXAQEBwtPTU/rd0KFDRXl5udi5c6cAIIYNGyY9/0F37twRWq1Wel5bflQqlcjPz28UJzU1tdH4DT8N26bhJygoqMn+YTKZhIuLiwAgpkyZ0mhZSkqKkMlk0vNTUlIaLZ8xY4b0/lRWVjb7Pj4Ko9Eo3NzchFwuF7m5uR2OV11dLVxdXYVCoRB5eXlmyLB158+fF0qlsk3vZ58+fcTBgwebxLh06ZLQ6XTSer169RI9e/aUHo8ePVpYW1sLAKJr167i73//uxBCiG+//bZJ/Hv37okff/xRODs7txpPpVIJAEKr1YqdO3e26bWuWLGiTa/TyspKREZGips3bzaJERUVJQAILy8vUVFR0WT5kiVLBADh7+8vqqqqmiyPiYmRxtFoNC2+x4mJiaJr167Sum5ubsLd3V16bGtrK+Lj46X1KyoqpOPzk08+aRLPaDSKfv36CQBixowZbdpe5lBWViacnJyEnZ2dKCoq6nC80tJS4ejoKOzt7UVxcbEZMuw8y5Yta9fnJQCxdOlSIYQQJSUlQq1WCwAiNja2SezJkycLAMJgMIiamppGy+Lj46V4J0+eFELUH+fW1tZCoVBIce3s7ISbm1uj8VevXt0o1tSpU6XvhYZxTpw4Ia3/n//8p0luCQkJTcYXQogjR44IjUYjLdNqtcLBwUF6PHbsWOmYunnzpvD392/03dW7d2/p8UsvvSTt72q1Wsp75syZAoAIDAxssl2eRIWFhUKlUglnZ2ezfi8RERERUefhFf9ERI+Zi4sLgoODAeCRJvMMDg6GVquFj49Ps8sDAgIAoEnLgQavvvqqNKHsxIkTm73SfPz48di2bRvWr1+PrKwsXLp0CQCg0WjQr18/zJ07F9OmTZOubtfr9QgODoZer2/UBmXChAk4cOAAoqOjkZGRgbKyMmg0Gvj6+mLatGmYNm0alEqltC327NmDFStWID09Hbm5ucjNzUWXLl2g1+sxduxYLF26FPb29iguLkZwcDAmT54sPf9BKpUKBoNBuquhLbRabZOrMENDQ5GSkoItW7bgX//6F/Ly8lBWVgaZTAatVgt3d3dMmjQJb731FrRabaPnyuVyhIaGIj8/H76+vo2WDRkyBJGRkSgoKECPHj0wePDgRst9fHwQHBwMX1/fZidLfV6p1WqEhYWhqqqqxeUeHh4YOnQoRo8e3ezx5evri3379mHFihXSRNUODg4YOnQo5syZg8jISCxfvhz79u1DTU2NtI+Hh4dLkzEbjUZ4eXmhrq4OPj4+UryLFy9K8YYNG4Y5c+bglVdewfvvv4/4+HjU1NS02pbqQZ6entLnRHNcXFzg7e2NiIgIDB8+vNk7TRqOS09Pz2b3o969eyM4OBg+Pj7NLh87dizi4+Nx7949DB8+XJog+adGjhyJw4cP49NPP0V6ejry8/Mhl8vRvXt3DBgwAEuWLEF4eLi0vpWVFcLCwlBYWAhPT88m8eRyOYKCgqBWq+Ht7d3iNiDz8fLyanV/a07D3S5WVlYIDw9HUVFRs62m/P39ERwcjMGDBzfZT52dnREcHAylUtmol74QAnK5HBs3bsSRI0eQmJiIgoICaDQauLu7Y8GCBY1aeAGAn59fk3EcHR0xfPhw6d8/1a1bNxgMBigUikbLR4wYgcOHD+MPf/gDzp07h+LiYtjb20Ov1+P111/HzJkzYWdnJ72GPXv2YNmyZThx4gTy8vJgY2ODvn374s0338Tbb7+NL7/8Eps3b0ZVVZWUm7e3N4KDgzFw4MCH3ilGRERERPQoZEK0ch8vERHB19cXmZmZuHTpUpMC7tPoL3/5C958802o1Wp8//33UvGmOVVVVbh69SqKi4shl8uh0+ng6ur6SG1pcnJyUF5eDo1Gg+7duzc6QfBT2dnZuH79OoxGI7p16wadTtdoHgJLqKysRE5ODkpKSmBlZQUnJyd4eHg0e+LhSWUymeDp6Ynr168jJyenw/3gjUYjPD09UVhYiJycnBYLw0+impoaXLt2DSUlJXB0dESvXr0atbG5ceMG7t+/D51O1+j35eXlqK6uhkajabQP19TUIDs7W5oMtK3xnjVZWVm4efMmlEolfvazn5l94u3OVF5eDr1eD5PJhNzcXHTt2rVD8crKyqDX61FbW4vc3Fw4OTmZKdNn24ULFzBkyBDU1NQgNTUVISEhuHbtGm7fvg21Wg29Xt/qPDPmlp+fj7t370KtVkOn07XYpuf+/fvIycnBnTt3YG9vDw8Pj0br3r59G9XV1XB2dm5Xu68nxc2bN6HX66HRaHDt2rXH+h4QERER0aN5dv/nSUREzdq+fTuA+n7/Xl5era5ra2uLX/ziF2YZtz0FwF69eqFXr15mGddc7OzspF7O9PRTKpWtnvRycXFp9vdqtRpqtbrZeK1dnd5SvGeNp6dns1fxEz2K2tpaAICHhwc8PDwskoObm1ubTmrK5fJWv7se5Q4/IiIiIqKOYOGfiOg5kJ6ejpKSEiQnJyM9PR0KhQKzZ89mewEiIiIiIiIiomcQC/9ERM+BrVu34q9//av0eNKkSTAYDBbMiIiIqCkhBIxGI4D69jlERERERPRoWPgnInoO+Pj4wN/fHzY2NggNDcUHH3zASWOJiOiJ4+DggPDwcNTV1TWZNJ2IiIiIiNqOhX8ioufA0qVLMX/+fNja2rK9DxERPbE8PDxw7NgxS6dBRERERPTUY+GfiOg5IJPJYGdnZ+k0iIiIiIiIiIjoMZBbOgEiIiIiIiIiIiIiIjIfFv6JiIiIiIiIiIiIiJ4hLPwTERERERERERERET1DWPgnIiIiIiIiIiIiInqGsPBPRERERERERERERPQMYeGfiIiIiIiIiIiIiOgZwsI/EREREREREREREdEzhIV/IiIiIiIiIiIiIqJnCAv/RERERERERERERETPEBb+iYiIiIiIiIiIiIieISz8ExERERERERERERE9Q1j4JyIiIiIiIiIiIiJ6hrDwT0RERERERERERET0DGHhn4joIWQyGQBACGHhTIieXDw+6GnXsA83fOabA78/iIiIiIjIUlj4JyJ6CI1GAwAoKyuzcCZEHVNRUQGj0Qi1Wg2lUtnheAqFAo6Ojqirq+PxQU+98vJymEwmqNVqWFlZdTieQqGAg4MDampqeHzQU6+kpAS1tbXQaDRQKBSWToeIiIiI2oCFfyKih3B2dgYA3Lhxw8KZEHXMnTt3UFlZCa1WC2tr6w7HUygU0vFRWFjY4XhElnT79m1UV1dDq9WiS5cuHY6nVCrh7OwMk8nE44OeeoWFhairq4NOpzPLiTEiIiIi6nws/BMRPYS3tzcA4OTJkxbOhKhjMjIyUFVVBb1eDzs7uw7Hk8lk6NOnDwAeH/T0u3jxIurq6uDh4QGVStXheEqlEl5eXhBC4PTp02bIkMhyTp06BaD+byJe8U9ERET0dGDhn4joIcLCwiCTyXDs2DGYTCZLp0P0yI4cOQIACA0NNUurHwAIDw8HACQlJbGPOT3VEhMTAfz/Z35HyWQy6fg4evRoh+MRWVLDPvzCCy9YOBMiIiIiaisW/omIHiIwMBCurq44c+aMVDgletrk5ORg7969kMvlGDVqlNnihoSEwMnJCWlpaTh+/LjZ4hI9TpcuXcI///lPqFQqREREmC1uWFgYbG1tceTIEZw9e9ZscYkep/T0dCQnJ8PBwQEhISGWToeIiIiI2oiFfyKih3B2dsb06dNRV1eHVatW8ap/eiqtX78et2/fxqhRoxAYGGi2uD169MDUqVNhMpkQHR2N+/fvmy020ePy+eefo6ysDC+//DL69u1rtrheXl547bXXUFlZiejoaLPFJXpchBCIjo6G0WjElClT0LNnT0unRERERERtpPj4448/tnQSRERPOj8/P8TFxeH8+fOoq6vDiBEjLJ0SUZvt2rULK1asgFKpxPbt29GjRw+zxvfz88OePXtw7tw5qFQqhIaGmjU+UWfatm0boqKi4ODggB07dkCn05kttkwmg4+PD77++mucO3cOTk5OCAoKMlt8os62evVqxMbGQqfTYfv27XB0dLR0SkRERETURiz8ExG1gb29Pby9vfGPf/wDqampcHR0xNChQy2dFtFDJSQkYPr06aioqMCnn36KSZMmmX0MjUYDvV6PuLg4pKSkwMXFBYMGDTL7OETmtn//frzzzjswGo1Yu3YtxowZY/YxtFotunfvjvj4eCQnJ8PT0xP9+vUz+zhE5vbVV19h4cKFAIA//elPMBgMFs6IiIiIiNqDhX8iojbq3bs3rK2tkZCQgMOHD6O0tBRDhw6FtbW1pVMjaqK2thZffvkl3nrrLZSWluJ3v/sdVq9eDbm8c7r8+fn5oa6uDseOHcO///1vmEwmBAYGQqVSdcp4RB1hNBqxefNmzJkzB1VVVZg5cyY+/vhjs0zq25wBAwagvLwcaWlpOHDgAORyOQICAsw2yTaROTW0pvr973+PmpoaLFu2DPPnz7d0WkRERETUTiz8ExG1Q1BQEOzs7JCSkoLvvvsOhw8fhr29PXQ6Hezt7S2dHhHKy8uRmpqKefPmYePGjTCZTJg2bRpiYmI6/SSVwWCATCZDamoqUlNTkZiYCEdHR+h0Otja2nbq2ERtUVJSgqNHj2L27Nn44osvUFtbizlz5uDzzz9Hly5dOnXs8PBwVFdXIy0tDUlJSUhJSUHXrl3h7OwMGxubTh2bqC3u3LmDb775BjNmzMDOnTshhMDy5cvx4YcfQqFQWDo9IiIiImonmRBCWDoJIqKnzZ49e7B48WL873//AwB4eHggJCQEAQEBcHd3h5OTk4UzpOdJRUUF8vPzcfHiRaSkpCAjIwMA4OjoiMWLF2Px4sWPtWjz1VdfYdmyZbh+/TqA+rtlDAYDBg0aBHd3d2g0mseWC1F5eTny8vJw/vx5pKWl4ccffwRQ34JnxYoVWLBgwWPNZ+vWrfjoo49w69YtAIC3tzcMBgMGDhyIHj16wMHB4bHmQ8+30tJS5OXl4ezZszh+/DiuXLkCAOjevTuioqIwffp0C2dIRERERI+KhX8iokdUUFCAL774Art27ZL+o0z0JPj5z3+O0aNH491330Xfvn0tkkNubi5iY2Oxd+9eZGdnWyQHoub06NED48aNw/z589GnTx+L5JCdnY2YmBjExcVJJ5CJngQeHh6IjIzE7Nmz0bNnT0unQ0REREQdwMI/EVEHFRUV4fjx49iwYQOuXr2KoqIi3Lt3z9Jp0XPEysoK3bp1g4uLC9555x2MHj0a7u7ulk4LAHDr1i0kJydj8+bNyM7ORlFREYxGo6XToudIly5doNVq4ebmhlmzZiEiIgKurq6WTgsAUFhYiCNHjiAmJga5ubkoLi7m8UGPlUqlglarRc+ePTFv3jy88MIL0Ol0lk6LiIiIiMzg/wAq4SfRnuqw2AAAAABJRU5ErkJggg==" + id="image40" /> + </g> + </g> + </g> + </g> + </g> +</svg> From 0f7356aad7409cbccdaa73c02adf3f6a4dc1e33b Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 14 Jul 2023 16:03:26 +0100 Subject: [PATCH 002/210] Updt. Readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3d7a2d4f7..a6d6db661 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# PyBOP - A *Py*thon toolbox for *B*attery *O*ptimisation and *P*arameterisation +# PyBOP - A *Py*thon package for *B*attery *O*ptimisation and *P*arameterisation PyBOP aims to be a modular library for the parameterisation and optimisation of battery models, with a particular focus on classes built around [PyBaMM](https://github.com/pybamm-team/PyBaMM) models. The figure below gives the current conceptual idea of PyBOP's structure. This will likely evolve as development progresses. From 9399c3a0b6b571ce2777105f97bca27cdc2c2786 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Mon, 17 Jul 2023 10:42:53 +0100 Subject: [PATCH 003/210] Add editable architecture file (fixes #11) --- assets/PyBOP-Architecture.drawio | 154 +++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 assets/PyBOP-Architecture.drawio diff --git a/assets/PyBOP-Architecture.drawio b/assets/PyBOP-Architecture.drawio new file mode 100644 index 000000000..a376dedbd --- /dev/null +++ b/assets/PyBOP-Architecture.drawio @@ -0,0 +1,154 @@ +<mxfile host="app.diagrams.net" modified="2023-07-17T09:39:50.258Z" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/116.0" etag="R1Rc19VzA4c5cRQsho2y" version="21.6.2" type="device"> + <diagram name="Page-1" id="KMmnkO2Ysz7c5i8QPpm3"> + <mxGraphModel dx="1363" dy="423" grid="1" gridSize="1" guides="0" tooltips="1" connect="1" arrows="1" fold="1" page="0" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="hdwB_MQwIhiL4xS-3u5l-1" target="hdwB_MQwIhiL4xS-3u5l-3" edge="1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-1" value="Forward Model" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1"> + <mxGeometry x="272" y="681" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="hdwB_MQwIhiL4xS-3u5l-2" target="hdwB_MQwIhiL4xS-3u5l-6" edge="1"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="462" y="651" as="targetPoint" /> + <Array as="points"> + <mxPoint x="565" y="566" /> + <mxPoint x="332" y="566" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-2" value="Optimiser" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;" parent="1" vertex="1"> + <mxGeometry x="505" y="586" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.583;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitPerimeter=0;" parent="1" source="hdwB_MQwIhiL4xS-3u5l-3" target="hdwB_MQwIhiL4xS-3u5l-2" edge="1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-3" value="Cost Function" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;" parent="1" vertex="1"> + <mxGeometry x="505" y="681" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-7" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="hdwB_MQwIhiL4xS-3u5l-6" target="hdwB_MQwIhiL4xS-3u5l-1" edge="1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-6" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" parent="1" vertex="1"> + <mxGeometry x="297" y="606" width="70" height="40" as="geometry" /> + </mxCell> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-38" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="hdwB_MQwIhiL4xS-3u5l-11" target="hdwB_MQwIhiL4xS-3u5l-6" edge="1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-11" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> + <mxGeometry x="193" y="611" width="70" height="30" as="geometry" /> + </mxCell> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-91" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="hdwB_MQwIhiL4xS-3u5l-13" target="hdwB_MQwIhiL4xS-3u5l-1" edge="1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-92" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;dashed=1;" parent="1" source="hdwB_MQwIhiL4xS-3u5l-13" target="hdwB_MQwIhiL4xS-3u5l-3" edge="1"> + <mxGeometry relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="236" y="711" /> + <mxPoint x="236" y="779" /> + <mxPoint x="565" y="779" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-13" value="Data" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;flipH=1;" parent="1" vertex="1"> + <mxGeometry x="111" y="686" width="100" height="50" as="geometry" /> + </mxCell> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-20" value="" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/png,iVBORw0KGgoAAAANSUhEUgAAACIAAABCEAYAAABiI9jbAAAKqGlDQ1BJQ0MgUHJvZmlsZQAASImVlwdQU+kWgP9700NCS4h0Qm/SWwApIbTQpYOohCRAKCEGgogdWVyBtSAighVdEFFwVYosNkSxLQKKXRdkEVHWxYINlXeBIbj75r0378ycOd899/znP+ef+8+cCwBZniMSpcHyAKQLs8ShPh706JhYOm4YQEANEAAJQBxupogZEhIAEJm1f5f3d5BoRG6ZTeX69/f/VRR4/EwuAFAIwgm8TG46wqcQfcEVibMAQO1H/LrLs0RT3IEwVYwUiPC9KU6a4dEpTphmNJiOCQ9lIUwFAE/icMRJAJDoiJ+ezU1C8pDcEbYU8gRChEUIu6anZ/AQPo6wERKD+EhT+RkJ3+VJ+lvOBGlODidJyjO9TAveU5ApSuOs+D+P439Leppkdg8DREnJYt9QxCoiZ3YvNcNfysKEoOBZFvCm46c5WeIbMcvcTFbsLPM4nv7StWlBAbOcKPBmS/NkscNnmZ/pFTbL4oxQ6V6JYhZzljniuX0lqRFSfzKfLc2fmxweNcvZgsigWc5MDfOfi2FJ/WJJqLR+vtDHY25fb2nv6Znf9StgS9dmJYf7SnvnzNXPFzLncmZGS2vj8T295mIipPGiLA/pXqK0EGk8P81H6s/MDpOuzUI+yLm1IdIzTOH4hcwyYIEMkIaoGNBBAPLkCUAWPydrqhFWhmiFWJCUnEVnIjeMT2cLuebz6daW1jYATN3Xmc/hLW36HkK0a3O+vIMAuLhOTk62zfn8hwA4OQYA8fGczwg5I9leAK6UciXi7Bnf9F3CACKQA1SgAjSBLjACZsAa2ANn4A68gB8IBuEgBiwBXJAM0pHKl4NVYD0oAEVgK9gBKsA+cBAcBsfACdAM2sAFcBlcB92gDzwE/WAIvARj4D2YgCAIB5EhCqQCaUH6kClkDTEgV8gLCoBCoRgoHkqChJAEWgVtgIqgEqgCOgDVQr9Ap6EL0FWoB7oPDUAj0BvoM4yCSTAV1oANYAuYATNhfzgcXgwnwcvgXDgf3gyXw1XwUbgJvgBfh/vgfvglPI4CKBkUDaWNMkMxUCxUMCoWlYgSo9agClFlqCpUPaoV1Ym6hepHjaI+obFoCpqONkM7o33REWguehl6DboYXYE+jG5Cd6BvoQfQY+hvGDJGHWOKccKwMdGYJMxyTAGmDFONacRcwvRhhjDvsVgsDWuIdcD6YmOwKdiV2GLsHmwD9jy2BzuIHcfhcCo4U5wLLhjHwWXhCnC7cEdx53C9uCHcR7wMXgtvjffGx+KF+Dx8Gf4I/iy+Fz+MnyDIE/QJToRgAo+wgrCFcIjQSrhJGCJMEBWIhkQXYjgxhbieWE6sJ14iPiK+lZGR0ZFxlFkoI5BZJ1Muc1zmisyAzCeSIsmExCLFkSSkzaQa0nnSfdJbMplsQHYnx5KzyJvJteSL5Cfkj7IUWXNZtixPdq1spWyTbK/sKzmCnL4cU26JXK5cmdxJuZtyo/IEeQN5ljxHfo18pfxp+bvy4woUBSuFYIV0hWKFIwpXFZ4r4hQNFL0UeYr5igcVLyoOUlAUXQqLwqVsoByiXKIMUbFUQyqbmkItoh6jdlHHlBSVbJUilXKUKpXOKPXTUDQDGpuWRttCO0G7Q/s8T2Mecx5/3qZ59fN6531QVlN2V+YrFyo3KPcpf1ahq3ippKpsU2lWeayKVjVRXai6XHWv6iXVUTWqmrMaV61Q7YTaA3VY3UQ9VH2l+kH1G+rjGpoaPhoijV0aFzVGNWma7popmqWaZzVHtCharloCrVKtc1ov6Ep0Jj2NXk7voI9pq2v7aku0D2h3aU/oGOpE6OTpNOg81iXqMnQTdUt123XH9LT0AvVW6dXpPdAn6DP0k/V36nfqfzAwNIgy2GjQbPDcUNmQbZhrWGf4yIhs5Ga0zKjK6LYx1phhnGq8x7jbBDaxM0k2qTS5aQqb2psKTPeY9szHzHecL5xfNf+uGcmMaZZtVmc2YE4zDzDPM282f2WhZxFrsc2i0+KbpZ1lmuUhy4dWilZ+VnlWrVZvrE2sudaV1rdtyDbeNmttWmxe25ra8m332t6zo9gF2m20a7f7au9gL7avtx9x0HOId9jtcJdBZYQwihlXHDGOHo5rHdscPznZO2U5nXD6y9nMOdX5iPPzBYYL+AsOLRh00XHhuBxw6Xelu8a77nftd9N247hVuT1113XnuVe7DzONmSnMo8xXHpYeYo9Gjw8sJ9Zq1nlPlKePZ6Fnl5eiV4RXhdcTbx3vJO867zEfO5+VPud9Mb7+vtt877I12Fx2LXvMz8FvtV+HP8k/zL/C/2mASYA4oDUQDvQL3B74KEg/SBjUHAyC2cHbgx+HGIYsC/l1IXZhyMLKhc9CrUJXhXaGUcKWhh0Jex/uEb4l/GGEUYQkoj1SLjIusjbyQ5RnVElUf7RF9Oro6zGqMYKYllhcbGRsdez4Iq9FOxYNxdnFFcTdWWy4OGfx1SWqS9KWnFkqt5Sz9GQ8Jj4q/kj8F04wp4oznsBO2J0wxmVxd3Jf8tx5pbwRvgu/hD+c6JJYkvg8ySVpe9JIsltyWfKogCWoELxO8U3Zl/IhNTi1JnUyLSqtIR2fHp9+WqgoTBV2ZGhm5GT0iExFBaL+ZU7LdiwbE/uLqzOhzMWZLVlUZDC6ITGS/CAZyHbNrsz+uDxy+ckchRxhzo0VJis2rRjO9c79eSV6JXdl+yrtVetXDaxmrj6wBlqTsKZ9re7a/LVD63zWHV5PXJ+6/rc8y7ySvHcboja05mvkr8sf/MHnh7oC2QJxwd2Nzhv3/Yj+UfBj1yabTbs2fSvkFV4rsiwqK/pSzC2+9pPVT+U/TW5O3Ny1xX7L3q3YrcKtd7a5bTtcolCSWzK4PXB7Uym9tLD03Y6lO66W2Zbt20ncKdnZXx5Q3rJLb9fWXV8qkiv6Kj0qG3ar7960+8Me3p7eve576/dp7Cva93m/YP+9Az4HmqoMqsoOYg9mH3x2KPJQ58+Mn2urVauLqr/WCGv6D4ce7qh1qK09on5kSx1cJ6kbORp3tPuY57GWerP6Aw20hqLj4Ljk+Itf4n+5c8L/RPtJxsn6U/qndjdSGguboKYVTWPNyc39LTEtPaf9Tre3Orc2/mr+a02bdlvlGaUzW84Sz+afnTyXe278vOj86IWkC4PtS9sfXoy+eLtjYUfXJf9LVy57X77Yyew8d8XlSttVp6unrzGuNV+3v950w+5G4292vzV22Xc13XS42dLt2N3as6DnbK9b74Vbnrcu32bfvt4X1NdzJ+LOvbtxd/vv8e49v592//WD7AcTD9c9wjwqfCz/uOyJ+pOq341/b+i37z8z4Dlw42nY04eD3MGXf2T+8WUo/xn5Wdmw1nDtc+vnbSPeI90vFr0Yeil6OTFa8KfCn7tfGb069Zf7XzfGoseGXotfT74pfqvytuad7bv28ZDxJ+/T3098KPyo8vHwJ8anzs9Rn4cnln/BfSn/avy19Zv/t0eT6ZOTIo6YMz0KoBCFExMBeFMDADkGAEo3Mj8smpmnpwWa+QeYJvCfeGbmnhZ7AOoRMzUWsc4DcBxRA0TJiE6NROHuALaxkers7Ds9p08JFvlj2W87Rb20nHXgHzIzw39X9z8tmMo6vfxv9l8BhAf7uiw5BAAABdxlWElmTU0AKgAAAAgABgEGAAMAAAABAAIAAAESAAMAAAABAAEAAAEaAAUAAAABAAAAVgEbAAUAAAABAAAAXgEoAAMAAAABAAIAAIdpAAQAAAABAAAAZgAAAAAAAACQAAAAAQAAAJAAAAABAAOShgAHAAAFTAAAAJCgAgAEAAAAAQAAACKgAwAEAAAAAQAAAEIAAAAAQVNDSUkAAABBQUFFM25qYWJWTk5iQnRGRkg2ejQ3Wkoyc1NicEQ5cCtyY2xEcVNVbHFRTk5LVDh4R21hTnJSeGY5YU9uY1N1CkdhL0g5amJyWGJNN205YTFJczBCRllUZ3dLblFBNUJFQ0lxQUFpb1ZRaW9JMFFDcVVBUkpCRWdJVU9IUUMrTEEKQmFFS2lWbmJLZ1YxUnF0OTc4MjhlZC83NXB0VXdkQWQxdG01aENUc1c3WjhSVjBzTUVsdFI3Zk0wUUN4dFp3dQp2SENBV1lWWXdFcWRwQnB6bWdDZGZUVXArMFBxSVZxazZXQjEwemMxdFdIYnNoaEhGK1d0SzFlMTMzMVB4N1o3CnQ5KzNZK2Y5RCt4OXVHL2c4VVBIam8rTm55QTBjekpmWUc0a1lMcUdzVmpmNEpkYkE5R1F1bk9DRnAweDhhOFcKR1Fsb0JuR2NDNDFOemF2WHJGM1hzcDVMSEhNZlg4YVg4eFc4aHRmeXVnc2JObTdhdkVYWmVsY2JYOGxYOFFidQo1NDI4bFcvZ20vaG1yc1JTeEtHR2J0S0laaG1XSGM1YmFScGhPak5vckdCVGtrOFpOSkVuV1ZQUDZCcGhvdDF3Cm1qQXEya29SYlNKclc2NlozdWNsamptV2EyczBURSt6TnFpT3hjNHUvNjdkM1pHUWV2eEFmenlrbGplcUJhTFIKd1U1RlRKQVJyMTk0Y0UvUFEyT1ZOa3lTcDdHS1NaMW9OV0dtcHpjV1VvK1UrNVY5Qy81SEhuMXNWQkRnTUZzMwpzMXcrS2c0STlwZDVIbllaRVhqVjhzcHNjSitYVjNFVzkvc0hEeHdjdXVVTE1FRW1ySlRMcU1PYitIcmVuSlFYCjRtbExjL1BVWkdVRTQxMmRCWllvRVp2cG1rR242dUt1UXdYMkNaS2w0OEwwc0RxSlVwbTFLYVZkUk5KS3hyTEYKWnpLbEhMMDlvMFR5amxQTXA4VE9QR0U1NS85clh2Qk9hK011eS9Ra1NycFpFRWhOclZJbzR4b0tzeFJXTEZBbApyZHVDRjZNb0RLTFp1c0NxYURsaUU0MEpkZFo1d2prY09qbzl6RmRQSCtGcmVNdElTQjBVQUpmVWNNUS9FbzJOCkNsL1Z6MUJCVEdiUUlGbEgrQ0hSV0Z0ZlIrVUtaWm12NWV0R2hpMlRhSlpnT3A2b25qQVQ3eFZ1OGduQjVJQ3UKZWNJZ2RuRW02UVZUV2xKdXVvM2dkSVh6bVhUdkhlTnRmZjJWV2d0WmYwNzNOTTUwZ1NCNGRlNlh0MzIvWHVFYgp4WkVUaGlnN0lJUTNNOUhycWNyYzNUM1lwWWdKdk42NzJ5Y1BEdkV0M2kxRzR6bkNTc1Vwa1RONUtpazMzeExGCnZ5Qm5KNU85VUFPTjBBb0IyQWE3WUE4TXdXRTRCaXFjZ2lsNENwNkRjL0F5dkFGdndsdndEcndMNzhNbHVBd2YKd2tkd0ZUNkhMK0VhZkFYejhEVXN3Qko4QzkvRGRiZ0J2OEVmY0JQVm9nYWtvTzJvRysxRlFSUkNFUlJGbytnRQowcEdOenFBcGRCWTlnNTVINTlCTDZEeDZCYjJIUGtBZm96azBqMzVBUDZLZjBYWHBzblJGK2tUNlZQcE1tcE8rCmtPYWw3NlNmcEJ2Uzc5S2YwbC9TVGVsdjdNTzFXTWJOdUFXMzR3NjhBL2ZqL1hnTWF6aUhDN2lJUzVqanAvR3oKK0FYOElqNlBwL0VzZmcyL2ppL2lTL2hhaFdBSlZSL21hZmpQd1BQL0FManprOHM9WVa4nQAAAAlwSFlzAAAWJQAAFiUBSVIk8AAACNtpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDYuMC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHRpZmY6Q29tcHJlc3Npb24+MTwvdGlmZjpDb21wcmVzc2lvbj4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24+MTQ0PC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xNDQ8L3RpZmY6WVJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOlBob3RvbWV0cmljSW50ZXJwcmV0YXRpb24+MjwvdGlmZjpQaG90b21ldHJpY0ludGVycHJldGF0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+MzQ8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpVc2VyQ29tbWVudD5BQUFFM25qYWJWTk5iQnRGRkg2ejQ3Wkoyc1NicEQ5cCtyY2xEcVNVbHFRTk5LVDh4R21hTnJSeGY5YU9uY1N1JiN4QTtHYS9IOWpiclhiTTdtOWExSXMwQkZZVGd3S25RQTVCRUNJcUFBaW9WUWlvSTBRQ3FVQVJKQkVnSVVPSFFDK0xBJiN4QTtCYUVLaVZuYktnVjFScXQ5NzgyOGVkLzc1cHRVd2RBZDF0bTVoQ1RzVzdaOFJWMHNNRWx0UjdmTTBRQ3h0Wnd1JiN4QTt2SENBV1lWWXdFcWRwQnB6bWdDZGZUVXArMFBxSVZxazZXQjEwemMxdFdIYnNoaEhGK1d0SzFlMTMzMVB4N1o3JiN4QTt0OSszWStmOUQreDl1Ry9nOFVQSGpvK05ueUEwY3pKZllHNGtZTHFHc1ZqZjRKZGJBOUdRdW5PQ0ZwMHg4YThXJiN4QTtHUWxvQm5HY0M0MU56YXZYckYzWHNwNUxISE1mWDhhWDh4VzhodGZ5dWdzYk5tN2F2RVhaZWxjYlg4bFg4UWJ1JiN4QTs1NDI4bFcvZ20vaG1yc1JTeEtHR2J0S0laaG1XSGM1YmFScGhPak5vckdCVGtrOFpOSkVuV1ZQUDZCcGhvdDF3JiN4QTttakFxMmtvUmJTSnJXNjZaM3VjbGpqbVdhMnMwVEUrek5xaU94YzR1LzY3ZDNaR1FldnhBZnp5a2xqZXFCYUxSJiN4QTt3VTVGVEpBUnIxOTRjRS9QUTJPVk5reVNwN0dLU1oxb05XR21wemNXVW8rVSs1VjlDLzVISG4xc1ZCRGdNRnMzJiN4QTtzMXcrS2c0STlwZDVIbllaRVhqVjhzcHNjSitYVjNFVzkvc0hEeHdjdXVVTE1FRW1ySlRMcU1PYitIcmVuSlFYJiN4QTs0bWxMYy9QVVpHVUU0MTJkQlpZb0VadnBta0duNnVLdVF3WDJDWktsNDhMMHNEcUpVcG0xS2FWZFJOSkt4ckxGJiN4QTtaektsSEwwOW8wVHlqbFBNcDhUT1BHRTU1LzlyWHZCT2ErTXV5L1FrU3JwWkVFaE5yVklvNHhvS3N4UldMRkFsJiN4QTtyZHVDRjZNb0RLTFp1c0NxYURsaUU0MEpkZFo1d2prY09qbzl6RmRQSCtGcmVNdElTQjBVQUpmVWNNUS9FbzJOJiN4QTtDbC9WejFCQlRHYlFJRmxIK0NIUldGdGZSK1VLWlptdjVldEdoaTJUYUpaZ09wNm9uakFUN3hWdThnbkI1SUN1JiN4QTtlY0lnZG5FbTZRVlRXbEp1dW8zZ2RJWHptWFR2SGVOdGZmMlZXZ3RaZjA3M05NNTBnU0I0ZGU2WHQzMi9YdUViJiN4QTt4WkVUaGlnN0lJUTNNOUhycWNyYzNUM1lwWWdKdk42NzJ5Y1BEdkV0M2kxRzR6bkNTc1Vwa1RONUtpazMzeExGJiN4QTt2eUJuSjVPOVVBT04wQW9CMkFhN1lBOE13V0U0QmlxY2dpbDRDcDZEYy9BeXZBRnZ3bHZ3RHJ3TDc4TWx1QXdmJiN4QTt3a2R3RlQ2SEwrRWFmQVh6OERVc3dCSjhDOS9EZGJnQnY4RWZjQlBWb2dha29PMm9HKzFGUVJSQ0VSUkZvK2dFJiN4QTswcEdOenFBcGRCWTlnNTVINTlCTDZEeDZCYjJIUGtBZm96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;" parent="1" vertex="1"> + <mxGeometry x="462" y="716" width="6.7" height="13" as="geometry" /> + </mxCell> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-23" value="" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/png,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nhZ7AOoRMzUWsc4DcBxRA0TJiE6NROHuALaxkers7Ds9p08JFvlj2W87Rb20nHXgHzIzw39X9z8tmMo6vfxv9l8BhAf7uiw5BAAABeBlWElmTU0AKgAAAAgABgEGAAMAAAABAAIAAAESAAMAAAABAAEAAAEaAAUAAAABAAAAVgEbAAUAAAABAAAAXgEoAAMAAAABAAIAAIdpAAQAAAABAAAAZgAAAAAAAACQAAAAAQAAAJAAAAABAAOShgAHAAAFUAAAAJCgAgAEAAAAAQAAACKgAwAEAAAAAQAAAEYAAAAAQVNDSUkAAABBQUFFNDNqYWJWTmJiQnRGRkwyems3Wkoyc1NicEk4MGZXMkpBeW1seFdrRERTNlBPRTNUaGpadTA3VVRKN0ZyCnh1dXh2ZlY2MSt5TzA3cFdwUGxBQlNINDRLdlFEeUNKRUJRaFhpb1ZJQUZDTklBUUN1QkVnSVFBVlh6MEIvR0IKa0JDcWtKaTFyVkpRWjdUYWUrL01uWHZ1bVRPSnZLRTd6T2RiUmhLdVc3RnlWV1BFTzAxdFI3Zk1DUyt4dFl3dQp2SkNYV2ZtSTEwcWNvaHB6V2dHZGV6RXVlNExxRVZxa3lVQnQwemYxRFNIYnNoaEhiOGpiVjYvcHV2Mk83aDEzCjdyeHIxKzY3NzlsL2YvL2d3MGRHVDB4T25TUTBkU3FYWjRXdzF5d1l4bEpUczBmdThJNEgxZDFaV25RbXhiOVcKWk15ckdjUnhMcmEwdHExZHQzNUQrMFl1Y2N6citBcStrcS9pOWJ5Qk4xN2N0SG5MMW0zSzl0czYrV3EraGpkegpEMi9oSFh3VDM4SzNjaVdTSUE0MWRKT0dOY3V3N0ZET1N0SXcwNWxCSTNtYmtsekNvTEVjU1p0NlN0Y0lFKzJHCmtvUlIwVmFDYU5tMGJSWE01QUUzY2RLeENyWkdRL1FNNjRUYVdQTDFlUGJzN1EwSDFST0hCcUpCdGJKUnpST04KRHZrVU1VRkd2S2w4Nzc2Kyt5YXJiWmdrUnlOVmt6cmp0WVM1UG44a3FCNnI5Q3ZYbFQwUFBQalFoQ0RBWWJadQpwcmw4WEJ3UUdLandQRkpnUk9CVkt5dnpnUU51WHRWWk91Z1pPblI0K0lZdndBU1lzQklGUmgzZXlqZnl0cmhjCmppWXRyWkNqSnFzZ21Pcng1Vm1zUkd5bWF3YWRhWXdXSENxd1owbWFUZ25UeGVyRVNoWFdacFF1RVVrcUtjc1cKbjhtVVN2VG1qQkxKT1U0eGx4QTdjNFJsblArdnVjRmJyVTBWV0tvdlZ0TE52RUJxYXRWQ3FZS2hNRXRoeFR4Vgprcm90ZURHS3dpQ2FyUXVzaXBZaE50R1lVR2VqSzV5andlT3pJM3p0N0RHK2pyZVBCZFVoQVhCWkRZVTlZK09SCkNlR3IrbGtxaUVrTkdTVHRDRDhvR3V2czc2NWVvU3p6OVh6RDJJaGxFczBTVEVkanRSUG1vbjdoeGg4UlRBN3EKbWlzTVloZm40bTR3b2NYbDFwc0lUbFk1bjB2NmJ4bnY3QitvMWlxblBSbmQxVGpUQllMQWxZVmZsSUUvUnZsbQpjV1RXRUdVSGhmRG1zbjVYVmViZTNxRWVSVXpnVGU3ZFBucDRtRzl6YnpFYXpSQldpcklNWldSR0pFNmZqc3R0Ck41VHhMOUw1NmJnZjZxRUZPc0FMTzJBUDdJTmhPQXFqb01KcG1JSEg0Q2s0RDgvREsvQXF2QWF2dzV2d05seUMKeS9BdXZBOVg0RlA0SEw2QUwyRVJ2b1l5TE1PMzhEMWNoV3Z3Sy93TzExRURha1lLMm9sNjBYNFVRRUVVUnVObwpBcDFFT3JMUldUU0R6cUVuME5Qb1BIb09YVUF2b0xmUU8raER0SUFXMFEvb1IvUXp1aXBkbGo2UVBwSStsajZSCkZxVFBwRVhwTytrbjZacjBtL1NuOUpkMFhmb2IxK0VHTE9NMjNJNjdjRGZlaFFmd1FUeUpOWnpCZVZ6RUpjengKNC9oSi9BeCtGbC9BczNnZXY0UmZ4cGZ3ZS9pcktzc1NxcjNPTS9DZmdaZitBWHNVbFRRPcxmgcUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAjfaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+CiAgICAgICAgIDx0aWZmOkNvbXByZXNzaW9uPjE8L3RpZmY6Q29tcHJlc3Npb24+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjE0NDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+MTQ0PC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpQaG90b21ldHJpY0ludGVycHJldGF0aW9uPjI8L3RpZmY6UGhvdG9tZXRyaWNJbnRlcnByZXRhdGlvbj4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjM0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6VXNlckNvbW1lbnQ+QUFBRTQzamFiVk5iYkJ0RkZMMnprN1pKMnNTYnBJODBmVzJKQXltbHhXa0REUzZQT0UzVGhqWnUwN1VUSjdGciYjeEE7eHV1eHZmVjYxK3lPMDdwV3BQbEFCU0g0NEt2UUR5Q0pFQlFoWGlvVklBRkNOSUFRQ3VCRWdJUUFWWHowQi9HQiYjeEE7a0JDcWtKaTFyVkpRWjdUYWUrL01uWHZ1bVRPSnZLRTd6T2RiUmhLdVc3RnlWV1BFTzAxdFI3Zk1DUyt4dFl3dSYjeEE7dkpDWFdmbUkxMHFjb2hweldnR2RlekV1ZTRMcUVWcWt5VUJ0MHpmMURTSGJzaGhIYjhqYlY2L3B1djJPN2gxMyYjeEE7N3J4cjErNjc3OWwvZi8vZ3cwZEdUMHhPblNRMGRTcVhaNFd3MXl3WXhsSlRzMGZ1OEk0SDFkMVpXblFteGI5VyYjeEE7Wk15ckdjUnhMcmEwdHExZHQzNUQrMFl1Y2N6citBcStrcS9pOWJ5Qk4xN2N0SG5MMW0zSzl0czYrV3EraGpkeiYjeEE7RDIvaEhYd1QzOEszY2lXU0lBNDFkSk9HTmN1dzdGRE9TdEl3MDVsQkkzbWJrbHpDb0xFY1NadDZTdGNJRSsyRyYjeEE7a29SUjBWYUNhTm0wYlJYTTVBRTNjZEt4Q3JaR1EvUU02NFRhV1BMMWVQYnM3UTBIMVJPSEJxSkJ0YkpSelJPTiYjeEE7RHZrVU1VRkd2S2w4Nzc2Kyt5YXJiWmdrUnlOVmt6cmp0WVM1UG44a3FCNnI5Q3ZYbFQwUFBQalFoQ0RBWWJadSYjeEE7cHJsOFhCd1FHS2p3UEZKZ1JPQlZLeXZ6Z1FOdVh0VlpPdWdaT25SNCtJWXZ3QVNZc0JJRlJoM2V5amZ5dHJoYyYjeEE7amlZdHJaQ2pKcXNnbU9yeDVWbXNSR3ltYXdhZGFZd1dIQ3F3WjBtYVRnblR4ZXJFU2hYV1pwUXVFVWtxS2NzVyYjeEE7bjhtVVN2VG1qQkxKT1U0eGx4QTdjNFJsblArdnVjRmJyVTBWV0tvdlZ0TE52RUJxYXRWQ3FZS2hNRXRoeFR4ViYjeEE7a3JvdGVER0t3aUNhclF1c2lwWWhOdEdZVUdlaks1eWp3ZU96STN6dDdERytqcmVQQmRVaEFYQlpEWVU5WStPUiYjeEE7Q2VHcitsa3FpRWtOR1NUdENEOG9HdXZzNzY1ZW9Teno5WHpEMklobEVzMFNURWRqdFJQbW9uN2h4aDhSVEE3cSYjeEE7bWlzTVloZm40bTR3b2NYbDFwc0lUbFk1bjB2NmJ4bnY3QitvMWlxblBSbmQxVGpUQllMQWxZVmZsSUUvUnZsbSYjeEE7Y1dUV0VHVUhoZkRtc241WFZlYmUzcUVlUlV6Z1RlN2RQbnA0bUc5emJ6RWF6UkJXaXJJTVpXUkdKRTZmanN0dCYjeEE7TjVUeEw5TDU2YmdmNnFFRk9zQUxPMkFQN0lOaE9BcWpvTUpwbUlISDRDazREOC9ESy9BcXZBYXZ3NXZ3Tmx5QyYjeEE7eS9BdXZBOVg0RlA0SEw2QUwyRVJ2b1l5TE1PMzhEMWNoV3Z3Sy93TzExRURha1lLMm9sNjBYNFVRRUVVUnVObyYjeEE7QXAxRU9yTFJXVFNEenFFbjBOUG9QSG9PWFVBdm9M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;" parent="1" vertex="1"> + <mxGeometry x="462" y="546" width="7" height="14.42" as="geometry" /> + </mxCell> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-30" value="Physics/ECM" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> + <mxGeometry x="185" y="829" width="90" height="40" as="geometry" /> + </mxCell> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-31" value="Empirical" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> + <mxGeometry x="385" y="829" width="90" height="40" as="geometry" /> + </mxCell> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-32" value="Data-Driven" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> + <mxGeometry x="285" y="829" width="90" height="40" as="geometry" /> + </mxCell> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-34" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=0;exitDx=0;exitDy=0;" parent="1" source="hdwB_MQwIhiL4xS-3u5l-30" edge="1"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="212" y="801" as="sourcePoint" /> + <mxPoint x="271" y="738" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-35" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=0;exitDx=0;exitDy=0;" parent="1" source="hdwB_MQwIhiL4xS-3u5l-31" edge="1"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="482" y="849.62" as="sourcePoint" /> + <mxPoint x="393" y="736" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-40" value="" style="endArrow=classic;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" edge="1"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="47" y="699" as="sourcePoint" /> + <mxPoint x="110" y="699" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-41" value="Excitation" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;flipH=1;" parent="1" vertex="1"> + <mxGeometry x="39" y="674" width="60" height="30" as="geometry" /> + </mxCell> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-43" value="" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/png,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nhZ7AOoRMzUWsc4DcBxRA0TJiE6NROHuALaxkers7Ds9p08JFvlj2W87Rb20nHXgHzIzw39X9z8tmMo6vfxv9l8BhAf7uiw5BAAABdRlWElmTU0AKgAAAAgABgEGAAMAAAABAAIAAAESAAMAAAABAAEAAAEaAAUAAAABAAAAVgEbAAUAAAABAAAAXgEoAAMAAAABAAIAAIdpAAQAAAABAAAAZgAAAAAAAACQAAAAAQAAAJAAAAABAAOShgAHAAAFRAAAAJCgAgAEAAAAAQAAACagAwAEAAAAAQAAACIAAAAAQVNDSUkAAABBQUFFMkhqYWJWTmRiQlJWRkQ1MzdnSnRvZDFweTA4cGY0UGRhaEhCTFZTcGl6L2RVZ29WdWxCbXQ5MytMT3ZkCjJidmJvYk16Njh5ZHdySnBjaDhNR0tNUFBxRThxRzFqdE1iVW55Z3hKbXFNQlluUlJ0dEdUWXdhbm5neFB2aGkKRERIeHp1NEcwVEEza3pubjNIUHUrYzUzdjBubERkMWh3ZUFLa3JCdjFlbzFOZkhBSkxVZDNUS0hBOFRXeG5YaApSUVBNeXNjRFZ1b00xWmpUQU9qQ2EwblpIMUdQMFFKTmh5dEozMVZWUjIzTFloeTlJKzljdTY3MTN2dmFkdDIvCis0RTlleDk4Nk9DalhUMVBIaHM0TlRKNm10RE1tVnlldWJHQTZSckdjbTJkWDI0T0RFWFV2Uk8wNEl5SWI2WEoKWUVBemlPUE0xVGMwcnQrd2NWUFRaaTV4ekgxOEZWL04xL0FxWHMxcjVyWnMzYlo5aDdMem5oYStscS9qZGR6UAo2M2t6MzhLMzhlMWNpYWVJUXczZHBESE5NaXc3bXJQU05NWjBadEI0M3FZa2x6Sm9Ja2V5cHA3Uk5jTEV1TkUwCllWU01sU0xhUk5hMlhETjl5Q3NjY1N6WDFtaVVubU10VUhtV2crMytmZnM3WWhIMTFKSHVzWWhhU2xUelJLTzkKUVVVc2tCR3ZYWHI0UU9jakkrVXhUSktqOGJKSm5hRkt3VXhuS0I1UlQ1VG1sWDFML3NjZWYySllFT0F3V3plegpYRDRwRGdoM2wzanVkeGtSZU5YU3ptejRrRmRYZHBZUCszdVBITzI3N1Fzd1lTYXNsTXVvd3h2NFp0NllsSmZHCjBwYm01cWpKU2doRzI0TjVsaWdTbSttYVFhZHF4bHlIQ3V3VEpFdEhoZWxoZFJMRkVtdFRTcXVJcEpXTVpZdlgKWkVvcGVtZEZrZVFjcDVCTGljd2NZZVBPLy9lODROMzJSbDJXNlV3VWRUTXZrSnBhdVZIR05SUm1LYXlRcDBwYQp0d1V2UmtFWVJMTjFnVlhSeG9sTk5DYlVXZU1KNTNqazVIUS9Yejk5Z20vZ1RZTVJ0VmNBWEZHak1mL2dVSHhZCitLcCtuZ3BpTXIwR3lUckNqNGpCV3JyYXlsY295M3dqM3pUWWI1bEVzd1RUWTRuS0NUTmpJZUVtbnhKTTl1aWEKSnd4aUYyYVNYakNsSmVXR093aE9sem1mU1lmdUdtL3A2aTczV3NyNngzVlA0MHdYQ01JTDEzekJiK1puK1ZaeAo1SVFoMnZZSTRjMU1oRHhWbWZzN2V0c1ZzWURYZW5mNzlORSt2c083eFFGWFpFK2VUY3FOdCtYd0w3elp5V1FJCnFxQWVtaUVBdTJBZkhJQStPQTREb01KWm1JSm40SG00QksvQW0vQVd2QTN6OEM2OER4L0FGZmdJUG9ZRnVBYlgKNFN2NEdoYmhXMWlDRmZnZWZvUWJjQk4rZ3ovZ0ZxcEdkVWhCdTFFSE9vakNLSUppYUFnTm85TklSelk2ajZiUQpCZlFzZWdGZFFpK2p5K2hWOUI3NkVIMktycUpGOUJQNkdmMktia2hYcEUra3o2VFBwUytrcTlLWDBxTDBnL1NMCmRGUDZYZnBUK2t1NkpmMk5mYmdheTdnUk4rRlczSWIzNEc1OEdJOWdEWS9qUEM3Z0l1YjRJbjRPdjRoZndwZngKTko3RnIrTTM4QnlleHd0bGFpVlUrU1hQd1g4ZWZQMGYzWnVRT0E9PRrZ8zAAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAjTaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+CiAgICAgICAgIDx0aWZmOkNvbXByZXNzaW9uPjE8L3RpZmY6Q29tcHJlc3Npb24+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjE0NDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+MTQ0PC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpQaG90b21ldHJpY0ludGVycHJldGF0aW9uPjI8L3RpZmY6UGhvdG9tZXRyaWNJbnRlcnByZXRhdGlvbj4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjM4PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6VXNlckNvbW1lbnQ+QUFBRTJIamFiVk5kYkJSVkZENTM3Z0p0b2QxcHkwOHBmNFBkYWhIQkxWU3Bpei9kVWdvVnVsQm10OTMrTE92ZCYjeEE7MmJ2Ym9iTXo2OHlkd3JKcGNoOE1HS01QUHFFOHFHMWp0TWJVbnlneEptcU1CWW5SUnR0R1RZd2Fubmd4UHZoaSYjeEE7RERIeHp1NEcwVEEza3pubjNIUHUrYzUzdjBubERkMWh3ZUFLa3JCdjFlbzFOZkhBSkxVZDNUS0hBOFRXeG5YaCYjeEE7UlFQTXlzY0RWdW9NMVpqVEFPakNhMG5aSDFHUDBRSk5oeXRKMzFWVlIyM0xZaHk5SSs5Y3U2NzEzdnZhZHQyLyYjeEE7KzRFOWV4OTg2T0NqWFQxUEhoczROVEo2bXRETW1WeWV1YkdBNlJyR2NtMmRYMjRPREVYVXZSTzA0SXlJYjZYSiYjeEE7WUVBemlPUE0xVGMwcnQrd2NWUFRaaTV4ekgxOEZWL04xL0FxWHMxcjVyWnMzYlo5aDdMem5oYStscS9qZGR6UCYjeEE7NjNrejM4SzM4ZTFjaWFlSVF3M2RwREhOTWl3N21yUFNOTVowWnRCNDNxWWtsekpvSWtleXBwN1JOY0xFdU5FMCYjeEE7WVZTTWxTTGFSTmEyWEROOXlDc2NjU3pYMW1pVW5tTXRVSG1XZyszK2ZmczdZaEgxMUpIdXNZaGFTbFR6UktPOSYjeEE7UVVVc2tCR3ZYWHI0UU9jakkrVXhUSktqOGJKSm5hRkt3VXhuS0I1UlQ1VG1sWDFML3NjZWYySllFT0F3V3pleiYjeEE7WEQ0cERnaDNsM2p1ZHhrUmVOWFN6bXo0a0ZkWGRwWVArM3VQSE8yNzdRc3dZU2FzbE11b3d4djRadDZZbEpmRyYjeEE7MHBibTVxakpTZ2hHMjRONWxpZ1NtK21hUWFkcXhseUhDdXdUSkV0SGhlbGhkUkxGRW10VFNxdUlwSldNWll2WCYjeEE7WkVvcGVtZEZrZVFjcDVCTGljd2NZZVBPLy9lODROMzJSbDJXNlV3VWRUTXZrSnBhdVZIR05SUm1LYXlRcDBwYSYjeEE7dHdVdlJrRVlSTE4xZ1ZYUnhvbE5OQ2JVV2VNSjUzams1SFEvWHo5OWdtL2dUWU1SdFZjQVhGR2pNZi9nVUh4WSYjeEE7K0twK25ncGlNcjBHeVRyQ2o0akJXcnJheWxjb3kzd2ozelRZYjVsRXN3VFRZNG5LQ1ROakllRW1ueEpNOXVpYSYjeEE7Snd4aUYyYVNYakNsSmVXR093aE9sem1mU1lmdUdtL3A2aTczV3NyNngzVlA0MHdYQ01JTDEzekJiK1puK1ZaeCYjeEE7NUlRaDJ2WUk0YzFNaER4Vm1mczdldHNWc1lEWGVuZjc5TkUrdnNPN3hRRlhaRStlVGNxTnQrWHdMN3paeVdRSSYjeEE7cXFBZW1pRUF1MkFmSElBK09BNERvTUpabUlKbjRIbTRCSy9BbS9BV3ZBM3o4QzY4RHgvQUZmZ0lQb1lGdUFiWCYjeEE7NFN2NEdoYmhXMWlDRmZnZWZvUWJjQk4rZ3ovZ0ZxcEdkVWhCdTFFSE9vakNLSUppYUFnTm85TklSelk2ajZiUSYjeEE7QmZRc2VnRmRRaStqeStoVjlCNzZFSDJLcnFKRjlCUDZHZjJLYmtoWHBF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;" parent="1" vertex="1"> + <mxGeometry x="234" y="696" width="7.85" height="7.02" as="geometry" /> + </mxCell> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-78" value="" style="endArrow=classic;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" edge="1"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="47" y="725" as="sourcePoint" /> + <mxPoint x="110" y="725" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-79" value="Design Space" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> + <mxGeometry x="20" y="700" width="86" height="30" as="geometry" /> + </mxCell> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-81" value="" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/png,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nhZ7AOoRMzUWsc4DcBxRA0TJiE6NROHuALaxkers7Ds9p08JFvlj2W87Rb20nHXgHzIzw39X9z8tmMo6vfxv9l8BhAf7uiw5BAAABehlWElmTU0AKgAAAAgABgEGAAMAAAABAAIAAAESAAMAAAABAAEAAAEaAAUAAAABAAAAVgEbAAUAAAABAAAAXgEoAAMAAAABAAIAAIdpAAQAAAABAAAAZgAAAAAAAACQAAAAAQAAAJAAAAABAAOShgAHAAAFWAAAAJCgAgAEAAAAAQAAAQagAwAEAAAAAQAAAEoAAAAAQVNDSUkAAABBQUFFNjNqYWJWTmRiQlJWRkQ1M2JpbHRvZDFweTA4cGY0UGRhaXNXMjFLbEZuKzZwUlFxZFBtWjNYYmI3ckxlCm5iMjdPK3pzekRwenQ3QnNtOXdIZzhiSUEwOG9EMnJiR01VWS82TEVHSDlDQkRScUdtMGJJU0ZxZU9MRitPQ0wKTWNURU83c2JSTVBjVE9hY2MrODU1enZmL1NhV05YU0hkWFl1SXdsWHJLaGNXUlB5VGxIYjBTMXozRXRzTGFVTApMK0JsVmpia3RXTEhxY2FjQmtDblg0L0tIcjk2Z09acDNGYys5R05WZGNDMkxNYlJlL0syVmF0YjczK2dyZjNCCjdROTE3SGo0a2QyUDl3OCtmZURJMFluSlk0UW1qbWV5TEJmMG1qbkRXS3F0ODhqTjNqRy91aU5OODg2RStKYWIKakhvMWd6ak9oZnFHeGpWcjE2MXYyc0Fsam5rRlg4RXIrVXBleGF0NXpZV05telp2MmFwc3U2K0ZyK0tyZVIzMwo4SHJlekRmeXpYd0xWMEl4NGxCRE4ybFFzd3pMRG1Tc09BMHluUmswbExVcHljUU1Hc21RcEtrbmRJMHdNVzRnClRoZ1ZZOFdJbGs3YVZzNk03M0VUSnh3cloyczBRRSt5RmlnL1M1MWRudTZkUFVHL2VuVGZRTml2RmcrcVdhTFIKb1U1RkxKQVJyMTE4ZEZmdll4T2xNVXlTb2FHU1NaMnhjc0pjYjEvSXJ4NHF6aXRYTEhxZWVQS3BjVUdBdzJ6ZApUSEw1c0NqZ0d5anlQSkpqUk9CVml6dnp2ajF1WHNsWjJ1c1oycmQvK0k0dndQaVlzR0k1UmgzZXdEZnd4cWk4CkdJNWJXaTVEVFZaRU1OblZtV1dSQXJHWnJobDBwaWFjYzZqQW5pWkpPaWxNRjZzVEtSUlptMUZhUlNTdUpDeGIKdkNaVGl0RzdNd29rNHpqNVRFeWN6QkNXY3Y2LzV3YnZ0VGVaWTRuZVNFRTNzd0twcVpVYUpYS0d3aXlGNWJOVQppZXUyNE1YSUM0Tm90aTZ3S2xxSzJFUmpRcDAxcm5BTytnL1BqdkExczRmNFd0NDA2bGVIQk1CbE5SRDBqSTZGCnhvV3Y2cWVvSUNZeFpKQ2tJM3kvR0t5bHY2MTBoYkxNMS9IMW95T1dTVFJMTUIyT2xDdk1oZnVFRzMxR01EbW8KYTY0d2lKMmZpN3JCbUJhVkcrNGlPRjdpZkM3ZWQ4OTRTLzlBcWRkaTBwUFNYWTB6WFNEd1hiNWEyUjYvL2gzZgpKRXFtRGRGMlVBaHZMdDNucXNyYzJUUFVwWWdGdk5hOTIyZjNEL090cFZ0c21KNVd3aW5DQ3ZrWnBVUEpUMDlICnUwV0JxUk5SdWZHT1F2NUZQRDhWN1lNcXFJZG04RUk3ZE1NdUdJYURjQVJVT0FFejhCeThCT2ZnVlhnTDNvWjMKNEYxNEh6NkVqK0FpZkFLZndtVzRDdC9BdC9BOUxNQVBzQWpMOEJOY2g1dHdDMzZEUCtBMnFrWjFTRUhiVVEvYQpqWHpJajRKb0RJMmpZMGhITmpxRlp0QnA5QUk2Zzg2aFY5QjU5QnI2QUgyTXZrQlgwQUs2Z1g1R3Y2S2Iwa1hwCmMrbEw2WkwwbFhSRitscGFrSzVKdjBpM3BOK2xQNlcvcE52UzM3Z0NWMk1aTitJbTNJcmJjQWNld0h2eEJOWncKQ21keEhoY3d4OC9qRi9GWi9ESStqMmZ4UEg0RHY0ay93NWZ3dFJMYkVpci9wU2ZoUHcrKzhROGt4WmEwZJJWPgAAAAlwSFlzAAAWJQAAFiUBSVIk8AAACOhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDYuMC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHRpZmY6Q29tcHJlc3Npb24+MTwvdGlmZjpDb21wcmVzc2lvbj4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24+MTQ0PC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xNDQ8L3RpZmY6WVJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOlBob3RvbWV0cmljSW50ZXJwcmV0YXRpb24+MjwvdGlmZjpQaG90b21ldHJpY0ludGVycHJldGF0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+MjYyPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6VXNlckNvbW1lbnQ+QUFBRTYzamFiVk5kYkJSVkZENTNiaWx0b2QxcHkwOHBmNFBkYWlzVzIxS2xGbis2cFJRcWRQbVozWGJiN3JMZSYjeEE7bmIyN08renN6RHB6dDdCc205d0hnOGJJQTA4b0QycmJHTVVZLzZMRUdIOUNCRFJxR20wYklTRnFlT0xGK09DTCYjeEE7TWNURU83c2JSTVBjVE9hY2MrODU1enZmL1NhV05YU0hkWFl1SXdsWHJLaGNXUlB5VGxIYjBTMXozRXRzTGFVTCYjeEE7TCtCbFZqYmt0V0xIcWNhY0JrQ25YNC9LSHI5NmdPWnAzRmMrOUdOVmRjQzJMTWJSZS9LMlZhdGI3MytncmYzQiYjeEE7N1E5MTdIajRrZDJQOXc4K2ZlREkwWW5KWTRRbWptZXlMQmYwbWpuRFdLcXQ4OGpOM2pHL3VpTk44ODZFK0phYiYjeEE7akhvMWd6ak9oZnFHeGpWcjE2MXYyc0Fsam5rRlg4RXIrVXBleGF0NXpZV05telp2MmFwc3U2K0ZyK0tyZVIzMyYjeEE7OEhyZXpEZnl6WHdMVjBJeDRsQkROMmxRc3d6TERtU3NPQTB5blJrMGxMVXB5Y1FNR3NtUXBLa25kSTB3TVc0ZyYjeEE7VGhnVlk4V0lsazdhVnM2TTczRVRKeHdyWjJzMFFFK3lGaWcvUzUxZG51NmRQVUcvZW5UZlFOaXZGZytxV2FMUiYjeEE7b1U1RkxKQVJyMTE4ZEZmdll4T2xNVXlTb2FHU1NaMnhjc0pjYjEvSXJ4NHF6aXRYTEhxZWVQS3BjVUdBdzJ6ZCYjeEE7VEhMNXNDamdHeWp5UEpKalJPQlZpenZ6dmoxdVhzbFoydXNaMnJkLytJNHZ3UGlZc0dJNVJoM2V3RGZ3eHFpOCYjeEE7R0k1YldpNURUVlpFTU5uVm1XV1JBckdacmhsMHBpYWNjNmpBbmlaSk9pbE1GNnNUS1JSWm0xRmFSU1N1SkN4YiYjeEE7dkNaVGl0RzdNd29rNHpqNVRFeWN6QkNXY3Y2LzV3YnZ0VGVaWTRuZVNFRTNzd0twcVpVYUpYS0d3aXlGNWJOVSYjeEE7aWV1MjRNWElDNE5vdGk2d0tscUsyRVJqUXAwMXJuQU8rZy9QanZBMXM0ZjRXdDQwNmxlSEJNQmxOUkQwakk2RiYjeEE7eG9XdjZxZW9JQ1l4WkpDa0kzeS9HS3lsdjYxMGhiTE0xL0gxb3lPV1NUUkxNQjJPbEN2TWhmdUVHMzFHTURtbyYjeEE7YTY0d2lKMmZpN3JCbUJhVkcrNGlPRjdpZkM3ZWQ4OTRTLzlBcWRkaTBwUFNYWTB6WFNEd1hiNWEyUjYvL2gzZiYjeEE7SkVxbURkRjJVQWh2THQzbnFzcmMyVFBVcFlnRnZOYTkyMmYzRC9PdHBWdHNtSjVXd2luQ0N2a1pwVVBKVDA5SCYjeEE7dTBXQnFSTlJ1ZkdPUXY1RlBEOFY3WU1xcUlkbThFSTdkTU11R0lhRGNBUlVPQUV6OEJ5OEJPZmdWWGdMM29aMyYjeEE7NEYxNEh6NkVqK0FpZkFLZndtVzRDdC9BdC9BOUxNQVBzQWpMOEJOY2g1dHdDMzZEUCtBMnFrWjFTRUhiVVEvYSYjeEE7alh6SWo0Sm9ESTJqWTBoSE5qcUZa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;" parent="1" vertex="1"> + <mxGeometry x="518" y="660" width="41.49" height="11.72" as="geometry" /> + </mxCell> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-82" value="" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/png,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nhZ7AOoRMzUWsc4DcBxRA0TJiE6NROHuALaxkers7Ds9p08JFvlj2W87Rb20nHXgHzIzw39X9z8tmMo6vfxv9l8BhAf7uiw5BAAABdxlWElmTU0AKgAAAAgABgEGAAMAAAABAAIAAAESAAMAAAABAAEAAAEaAAUAAAABAAAAVgEbAAUAAAABAAAAXgEoAAMAAAABAAIAAIdpAAQAAAABAAAAZgAAAAAAAACQAAAAAQAAAJAAAAABAAOShgAHAAAFTAAAAJCgAgAEAAAAAQAAADygAwAEAAAAAQAAADgAAAAAQVNDSUkAAABBQUFFMzNqYWJWTk5iQnRGRkg2ems2Wkoyc1NicEQ5cCtyY2xEcVF0TFVrYmFIRDVpZE0wYldqai9xeWRPSWtUCk0xNlA3YTNYdTJaM25OYTFJczBCdFFqQkFYRW85QURFRVlJaUJBWFJDaUVCUXJRRkZSVEFpUUFKQWVxcEY4U0IKQzBJVkVyTzJWUXJxakZiNzNwdDU4NzczelRleHJLRTdyTHQ3Q1VtNFpsbnQ4b2F3ZDRiYWptNlo0MTVpYXlsZAplRUV2czdKaHJ4VTdRVFhtdEFBNjgxcFU5Z1RVUXpSUDQvN3FwdS9xNm9PMlpUR08zcFczckZqWmVlOTlYVnUzCmJiOS94ODRISHR6N1NQL2dFNGVPSForWW5DWTBjU0tUWmJtUTE4d1p4bUpqazBkdTk0NEYxSjFwbW5jbXhMOWEKWk5TckdjUnhMalMzdEs1YXZXWnQyem91Y2N4citESmV5NWZ6T2w3UEd5NnMzN0J4MDJabHl6MGRmQVZmeVp1NApoemZ6ZHI2ZWIrU2J1QktPRVljYXVrbERtbVZZZGpCanhXbUk2Y3lnNGF4TlNTWm0wS2tNU1pwNlF0Y0lFKzBHCjQ0UlIwVmFNYU9ta2JlWE0rRDQzY2NLeGNyWkdnL1FVNjREcVdPenU4ZXphM1JzS3FNY1BERVFDYW5tam1pVWEKSGVwV3hBUVo4Y2JTUTN2NkhwNm90R0dTREExWFRPcU1WUk9LZmI1d1FEMVM3bGV1S1hrZWZlenhjVUdBdzJ6ZApUSEw1cURqQVAxRG1lU1RIaU1DcmxsZm0vZnZjdklxenVOOHpkT0RnOEcxZmdQRXpZY1Z5akRxOGhhL2pyVkc1CkZJbGJXaTVEVFZaR01OblRuV1ZUQldJelhUUG9iRU1rNTFDQlBVMlNkRktZTGxabnFsQm1iVmJwRkpHNGtyQnMKOFpsTUtVZnZ6Q2lRak9Qa016R3hNME5ZeXZuL21odTgyOXBramlYNnBncTZtUlZJVGExU0tKRXpGR1lwTEorbApTbHkzQlM5R1hoaEVzM1dCVmRGU3hDWWFFK3BzY0lWek9IQjBib1N2bWp2Q1YvTzIwWUE2SkFBdXFjR1FaM1FzClBDNThWVDlOQlRHSklZTWtIZUVIUkdNZC9WMlZLNVJsdm9hdkhSMnhUS0paZ3VuSVZQV0VZc1FuM09pVGdzbEIKWFhPRlFleDhNZW9HWTFwVWJybUQ0SGlGODJMY2Q5ZDRSLzlBcFZZcDZVbnByc2FaTGhENHIxeXJUYjU0UGM0MwppQ1BUaGlnN0tJUlhUUHRjVlptN2U0ZDZGREdCTjdwMys5VEJZYjdadmNWd2hLVW9JOVBiUk5MTXlhamNlbHNWCi82S2NuNG42b0E2YW9SMjhzQlYyd1I0WWhzTndERlE0Q2JQd05Ed0g1K0FWZUJQZWdyZmhIYmdJNzhNSGNCaysKaEkvZ0NseURMK0U2ZkEwTDhDMlVZQW0raHgvaEJ0eUUzK0FQdUlYcVVSTlMwSGJVaS9ZaVB3cWdFQnBENDJnYQo2Y2hHcDlFc09vT2VRYytqYytobGRCNjlpdDVEbDlBbjZDcGFRRCtobjlHdjZJWjBXZnBZK2xUNlRQcGN1aXA5CklTMUlQMGkvU0RlbDM2VS9wYitrVzlMZnVBYlhZeG0zNGpiY2lidndEanlBOStNSnJPRVV6dUk4TG1DT3orSm4KOFF2NEpYd2V6K0Y1L0RwK0ExL0VsL0JYRllZbFZIMlpwK0EvQTMvekQzcVhrcnc9NsYx2QAAAAlwSFlzAAAWJQAAFiUBSVIk8AAACNtpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDYuMC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHRpZmY6Q29tcHJlc3Npb24+MTwvdGlmZjpDb21wcmVzc2lvbj4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24+MTQ0PC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xNDQ8L3RpZmY6WVJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOlBob3RvbWV0cmljSW50ZXJwcmV0YXRpb24+MjwvdGlmZjpQaG90b21ldHJpY0ludGVycHJldGF0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+NjA8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpVc2VyQ29tbWVudD5BQUFFMzNqYWJWTk5iQnRGRkg2ems2Wkoyc1NicEQ5cCtyY2xEcVF0TFVrYmFIRDVpZE0wYldqai9xeWRPSWtUJiN4QTtNMTZQN2EzWHUyWjNuTmExSXMwQnRRakJBWEVvOUFERUVZSWlCQVhSQ2lFQlFyUUZGUlRBaVFBSkFlcXBGOFNCJiN4QTtDMElWRXJPMlZRcnFqRmI3M3B0NTg3NzN6VGV4cktFN3JMdDdDVW00WmxudDhvYXdkNGJham02WjQxNWlheWxkJiN4QTtlRUV2czdKaHJ4VTdRVFhtdEFBNjgxcFU5Z1RVUXpSUDQvN3FwdS9xNm9PMlpUR08zcFczckZqWmVlOTlYVnUzJiN4QTtiYjkveDg0SEh0ejdTUC9nRTRlT0haK1luQ1kwY1NLVFpibVExOHdaeG1KamswZHU5NDRGMUoxcG1uY214TDlhJiN4QTtaTlNyR2NSeExqUzN0SzVhdldadDJ6b3VjY3hyK0RKZXk1ZnpPbDdQR3k2czM3QngwMlpseXowZGZBVmZ5WnU0JiN4QTtoemZ6ZHI2ZWIrU2J1QktPRVljYXVrbERtbVZZZGpCanhXbUk2Y3lnNGF4TlNTWm0wS2tNU1pwNlF0Y0lFKzBHJiN4QTs0NFJSMFZhTWFPbWtiZVhNK0Q0M2NjS3hjclpHZy9RVTY0RHFXT3p1OGV6YTNSc0txTWNQREVRQ2FubWptaVVhJiN4QTtIZXBXeEFRWjhjYlNRM3Y2SHA2b3RHR1NEQTFYVE9xTVZST0tmYjV3UUQxUzdsZXVLWGtlZmV6eGNVR0F3MnpkJiN4QTtUSEw1cURqQVAxRG1lU1RIaU1DcmxsZm0vZnZjdklxenVOOHpkT0RnOEcxZmdQRXpZY1Z5akRxOGhhL2pyVkc1JiN4QTtGSWxiV2k1RFRWWkdNTm5UbldWVEJXSXpYVFBvYkVNazUxQ0JQVTJTZEZLWUxsWm5xbEJtYlZicEZKRzRrckJzJiN4QTs4WmxNS1VmdnpDaVFqT1BrTXpHeE0wTll5dm4vbWh1ODI5cGtqaVg2cGdxNm1SVklUYTFTS0pFekZHWXBMSitsJiN4QTtTbHkzQlM5R1hoaEVzM1dCVmRGU3hDWWFFK3BzY0lWek9IQjBib1N2bWp2Q1YvTzIwWUE2SkFBdXFjR1FaM1FzJiN4QTtQQzU4VlQ5TkJUR0pJWU1rSGVFSFJHTWQvVjJWSzVSbHZvYXZIUjJ4VEtKWmd1bklWUFdFWXNRbjNPaVRnc2xCJiN4QTtYWE9GUWV4OE1lb0dZMXBVYnJtRDRIaUY4MkxjZDlkNFIvOUFwVllwNlVucHJzYVpMaEQ0cjF5clRiNTRQYzQzJiN4QTtpQ1BUaGlnN0tJUlhUUHRjVlptN2U0ZDZGREdCTjdwMys5VEJZYjdadmNWd2hLVW9JOVBiUk5MTXlhamNlbHNWJiN4QTsvNktjbjRuNm9BNmFvUjI4c0JWMndSNFloc053REZRNENiUHdORHdINStBVmVCUGVncmZoSGJnSTc4TUhjQmsrJiN4QTtoSS9nQ2x5REwrRTZmQTBMOEMyVVlBbStoeC9oQnR5RTMrQVB1SVhxVVJOUzBIYlVpL1lpUHdxZ0VCcEQ0MmdhJiN4QTs2Y2hHcDlFc09vT2VRYytqYytobGRCNjlpdDVEbDlBbjZD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;" parent="1" vertex="1"> + <mxGeometry x="328" y="619" width="12.93" height="12.07" as="geometry" /> + </mxCell> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-86" value="" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/png,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nhZ7AOoRMzUWsc4DcBxRA0TJiE6NROHuALaxkers7Ds9p08JFvlj2W87Rb20nHXgHzIzw39X9z8tmMo6vfxv9l8BhAf7uiw5BAAABeRlWElmTU0AKgAAAAgABgEGAAMAAAABAAIAAAESAAMAAAABAAEAAAEaAAUAAAABAAAAVgEbAAUAAAABAAAAXgEoAAMAAAABAAIAAIdpAAQAAAABAAAAZgAAAAAAAACQAAAAAQAAAJAAAAABAAOShgAHAAAFVAAAAJCgAgAEAAAAAQAAAHSgAwAEAAAAAQAAAEAAAAAAQVNDSUkAAABBQUFFNjNqYWJWTnJiQlJWRkQ1M2JxRVBhSGZhOGlqbE5kaXRGaERjUXBXNitPaVdzbENoeTJOMnU5dDJ5M3AzCjl1N3VzTE16Njh6ZHdySnBjbjhZTUFaLytBc2hSRzBib3hqakswcU04UkVpb0RHbTBXMGpKa1FOdi9oai9PRWYKWTRpSmR4OUJOTXpOWk00NTk1NXp2dlBkYitJNVEzZVl4N09JSkZ5M1pHbDlVOFE5UlcxSHQ4d3hON0cxdEM2OApvSnRadVlqYmloK25HblBhQUoxK1BTYTdBdW9CV3FBSlgrM1FEdzJOUWR1eUdFZnZ5WnVXTGU5KzhLR2V6VnUyClByeHQreU9QN241aVlPaVpBMGVPams4Y0l6UjVQSnRqK1pEYnpCdkdRbk9MUys1MGh3UHE5Z3d0T09QaVcyc3kKNnRZTTRqaVhXdHZhVjZ4Y3RicGpEWmM0NW5WOENWL0s2M2tEYitSTmw5YXVXNzlobzdMcGdTNitqQy9uTGR6RgpXM2tuWDh2WDh3MWNpY1NKUXczZHBDSE5NaXc3bUxVU05NUjBadEJJenFZa0d6Zm9aSmFrVEQycGE0U0pjWU1KCndxZ1lLMDYwVE1xMjhtWmlUemx4M0xIeXRrYUQ5Q1RyZ3RxejRPbDE3ZGpaRndxb1IvY05SZ05xNWFDYUl4cjEKZXhTeFFFYTh1ZlRZcnY3SHg2dGptQ1JMSTFXVE91RmF3bXkvTnhKUUQxWG1sZXRLcmllZmVucE1FT0F3V3pkVApYRDRzQ3ZnR0t6eVA1QmtSZU5YS3pweHZUem12Nml6c2RmbjM3UisrNndzd1BpYXNlSjVSaDdmeE5idzlKcGVpCkNVdkxaNm5KS2dnbWVqMDVObGtrTnRNMWcwNDNSZk1PRmRnekpFVW5oRm5HNmt3V0s2eE5LOTBpa2xDU2xpMWUKa3ltVjZMMFpSWkoxbkVJMkxrNW1DVXM3Lzk4ckIrKzNONUZueWY3Sm9tN21CRkpUcXpaSzVnMkZXUW9yNUtpUwowRzNCaTFFUUJ0RnNYV0JWdERTeGljYUVPcHZLd2prWU9Ed3p3bGZNSE9JcmVjZG9RUFVMZ0l0cU1PUWFEVWZHCmhLL3FwNmdnSnVrM1NNb1Jma0FNMWpYUVU3MUNXZWFyK09yUkVjc2ttaVdZams3V0tzeEd2Y0tOUFN1WUhOSzEKc2pDSVhaaU5sWU54TFNhMzNVTndvc3I1Yk1KNzMzalh3R0MxVnlubFN1dGxqVE5kSVBCZHZWNS85bUo0QzE4bgpTbVlNMFhaSUNHODI0eTJyeXR6WjUrOVZ4QUxlWEw3YjUvWVA4NDNWVzJ5THNqUmxKQlpsUW9xQ09KMU5pd0pUCkoySnkrMTJGL0l0NGJpcm1oUVpvaFU1d3cyYllBYnRnR0E3Q0VWRGhCRXpEODNBV3pzR3I4QmE4RGUvQXUvQSsKZkFnZndXWDRCRDZGcTNBZHZvRnY0VHVZaCsraEJJdndJL3dFdCtBMi9BWi93QjNVaUZxUWdyYWlQclFiK1ZBQQpoVkFZamFGalNFYzJPb1dtMFduMEFub0puVVBuMFFYMEd2b0FmWXkrUU5mUVBMcUpma2Evb2x2U1plbHo2VXZwCml2U1ZkRTM2V3BxWGJraS9TTGVsMzZVL3BiK2tPOUxmdUE0M1lobTM0dzdjalh2d05qeUk5K0p4ck9FMHp1RUMKTG1LT3orQVg4Y3Y0Rlh3QnorQTUvQVorRTMrR3IrQWJWYllsVlB0TFQ4Si9Ibnp6SDZnbGx6cz11ijupAAAACXBIWXMAABYlAAAWJQFJUiTwAAAI5GlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNi4wLjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8dGlmZjpDb21wcmVzc2lvbj4xPC90aWZmOkNvbXByZXNzaW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj4xNDQ8L3RpZmY6WFJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOllSZXNvbHV0aW9uPjE0NDwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6UGhvdG9tZXRyaWNJbnRlcnByZXRhdGlvbj4yPC90aWZmOlBob3RvbWV0cmljSW50ZXJwcmV0YXRpb24+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4xMTY8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpVc2VyQ29tbWVudD5BQUFFNjNqYWJWTnJiQlJWRkQ1M2JxRVBhSGZhOGlqbE5kaXRGaERjUXBXNitPaVdzbENoeTJOMnU5dDJ5M3AzJiN4QTs5dTd1c0xNejY4emR3ckpwY244WU1BWi8rQXNoUkcwYm94ampLMHFNOFJFaW9ER20wVzBqSmtRTnYvaGovT0VmJiN4QTtZNGlKZHg5Qk5Nek5aTTQ1OTU1enZ2UGRiK0k1UTNlWXg3T0lKRnkzWkdsOVU4UTlSVzFIdDh3eE43RzF0QzY4JiN4QTtvSnRadVlqYmloK25HblBhQUoxK1BTYTdBdW9CV3FBSlgrM1FEdzJOUWR1eUdFZnZ5WnVXTGU5KzhLR2V6VnUyJiN4QTtQcnh0K3lPUDduNWlZT2laQTBlT2prOGNJelI1UEp0aitaRGJ6QnZHUW5PTFMrNTBod1BxOWd3dE9PUGlXMnN5JiN4QTs2dFlNNGppWFd0dmFWNnhjdGJwakRaYzQ1blY4Q1YvSzYza0RiK1JObDlhdVc3OWhvN0xwZ1M2K2pDL25MZHpGJiN4QTtXM2tuWDh2WDh3MWNpY1NKUXczZHBDSE5NaXc3bUxVU05NUjBadEJJenFZa0d6Zm9aSmFrVEQycGE0U0pjWU1KJiN4QTt3cWdZSzA2MFRNcTI4bVppVHpseDNMSHl0a2FEOUNUcmd0cXo0T2wxN2RqWkZ3cW9SL2NOUmdOcTVhQ2FJeHIxJiN4QTtleFN4UUVhOHVmVFlydjdIeDZ0am1DUkxJMVdUT3VGYXdteS9OeEpRRDFYbWxldEtyaWVmZW5wTUVPQXdXemRUJiN4QTtYRDRzQ3ZnR0t6eVA1QmtSZU5YS3pweHZUem12Nml6c2RmbjM3UisrNndzd1BpYXNlSjVSaDdmeE5idzlKcGVpJiN4QTtDVXZMWjZuSktnZ21lajA1Tmxra050TTFnMDQzUmZNT0ZkZ3pKRVVuaEZuRzZrd1dLNnhOSzkwaWtsQ1NsaTFlJiN4QTtreW1WNkwwWlJaSjFuRUkyTGs1bUNVczcvOThyQisrM041Rm55ZjdKb203bUJGSlRxelpLNWcyRldRb3I1S2lTJiN4QTswRzNCaTFFUUJ0RnNYV0JWdERTeGljYUVPcHZLd2prWU9Ed3p3bGZNSE9JcmVjZG9RUFVMZ0l0cU1PUWFEVWZHJiN4QTtoSy9xcDZnZ0p1azNTTW9SZmtBTTFqWFFVNzFDV2VhcitPclJFY3NrbWlXWWprN1dLc3hHdmNLTlBTdVlITksxJiN4QTtzakNJWFppTmxZTnhMU2EzM1VOd29zcjViTUo3MzNqWHdHQzFWeW5sU3V0bGpUTmRJUEJkdlY1LzltSjRDMThuJiN4QTtTbVlNMFhaSUNHODI0eTJyeXR6WjUrOVZ4QUxlWEw3YjUvWVA4NDNWVzJ5THNqUmxKQlpsUW9xQ09KMU5pd0pUJiN4QTtKMkp5KzEyRi9JdDRiaXJtaFFab2hVNXd3MmJZQWJ0Z0dBN0NFVkRoQkV6RDgzQVd6c0dyOEJhOERlL0F1L0ErJiN4QTtmQWdmd1dYNEJENkZxM0Fkdm9GdjRUdVloKytoQkl2d0kvd0V0K0EyL0FaL3dCM1VpRnFRZ3JhaVByUWIrVkFBJiN4QTtoVkFZamFGalNFYzJPb1dtMFduMEFub0pu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;" parent="1" vertex="1"> + <mxGeometry x="216" y="619.1" width="24.82" height="13.7" as="geometry" /> + </mxCell> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-89" value="" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/png,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nhZ7AOoRMzUWsc4DcBxRA0TJiE6NROHuALaxkers7Ds9p08JFvlj2W87Rb20nHXgHzIzw39X9z8tmMo6vfxv9l8BhAf7uiw5BAAABdRlWElmTU0AKgAAAAgABgEGAAMAAAABAAIAAAESAAMAAAABAAEAAAEaAAUAAAABAAAAVgEbAAUAAAABAAAAXgEoAAMAAAABAAIAAIdpAAQAAAABAAAAZgAAAAAAAACQAAAAAQAAAJAAAAABAAOShgAHAAAFRAAAAJCgAgAEAAAAAQAAACKgAwAEAAAAAQAAADAAAAAAQVNDSUkAAABBQUFFMkhqYWJWTmRiQlJWRkQ1M2JvRzIwTzYwNWFlVXY4RnV0WWpnRnFyVTRrKzNsSVVLWFNpejIyNzNoL1h1CjdOM3QwTm1aZGVadVlXbWEzQWNEeHNpRFR3Z1BhTnNZclRINEV5WEdSSTJ4SURHbTBXMmpKa1lOVDd3WUgzd3gKaHBoNFozZURhSmlieVp4ejdqbjNmT2U3MzZUeWh1NHduMjhaU2JobXhjcFY5Ukh2SkxVZDNUTEh2TVRXeG5YaApoYnpNeWtlOFZ1b1UxWmpURE9qYzYwblpFMVNQMENKTis2dEozOVhXaFd6TFloeTlLMjlmdmFiandZYzZkenk4Cjg1RmR1eDk5YlArVGZRUFBIaGsrRVkyZEpEUnpLcGRuaGJEWExCakdVa09qUjI3empnYlYzUk8wNkVURnQ5cGsKeEtzWnhISG1tNXBiMXE1YnY2RjFJNWM0NWpWOEJWL0pWL0ZhWHNmcjV6ZHQzckoxbTdMOWdYYSttcS9oamR6RAptM2diMzhTMzhLMWNpYVNJUXczZHBHSE5NaXc3bExQU05NeDBadEJJM3FZa2x6Sm9Ja2V5cHA3Uk5jTEV1S0UwCllWU01sU0xhUk5hMkNtYjZnRnNZZGF5Q3JkRVFQY1Bhb2ZvcytibzhlL1oyaDRQcWlVUDk4YUJhVGxUelJLTUIKbnlJV3lJZzNsQjdmMS9ORXRES0dTWEkwVWpHcE0xb3RtTzNwalFUVlkrVjU1WnFTNTZtbm54a1RCRGpNMXMwcwpsNCtMQS96OVpaNkhDb3dJdkdwNVo4NS93SzJyT0VzSFBZRkRod2Z2K2dLTW53a3JWV0RVNGMxOEkyOUp5cVY0CjJ0SUtPV3F5TW9KWWx5L1BFbFBFWnJwbTBPbjZlTUdoQXZzRXlkS1lNRjJzVG1LcXpOcTAwaUVpYVNWajJlSTEKbVZLTzNsc3hSWEtPVTh5bFJHYU9zSEhuLzN0dThINTdzUUxMOUNTbWRETXZrSnBhcFZHbVlDak1VbGd4VDVXMApiZ3RlaktJd2lHYnJBcXVpalJPYmFFeW9zOTRWenRIZzhaa2h2bmJtR0YvSFcwZUNha0FBWEZaRFljL0lhR1JNCitLcCtsZ3BpTWdHRFpCM2hCOFZnN1gyZGxTdVVaYjZlYnhnWnNreWlXWUxwZUtKNndteThWN2pKNXdTVEE3cm0KQ29QWXhkbWtHMHhwU2JuNUhvTFRGYzVuMDczM2piZjM5VmQ2bGJLZWNkM1ZPTk1GQXYvQ0RjLzVDOTRZM3l5TwpuREJFMndFaHZObUpYbGRWNXQ3dVFKY2lGdkFHOTI2ZlB6ekl0N20zT0Z3VTJaT25rM0xMWFRuOEMyOXVNdGtMCnRkQUViZUNGSGJBSDlzRWdISVZoVU9FMFRNTUw4REpjaEN2d0Zyd043OEJWZUE4K2dBL2hHbndNbjhBQzNJQ2IKOERWOEE0dndMWlJnR2I2SEgrRVczSWJmNEErNGcrcFFJMUxRVHRTTjlpTS9DcUl3R2tWajZDVFNrWTNPb21sMApEcjJJTHFDTDZCSzZqRjVENzZPUDBHZm9PbHBFUDZHZjBhL29sblJOK2xUNlhQcEMrbEs2TG4wbExVby9TTDlJCnQ2WGZwVCtsdjZRNzB0KzRCdGRoR2JmZ1Z0eUJPL0V1M0k4UDRpalc4RGpPNHlLZXdoeWZ4eS9oVi9DcitES2UKd1hQNERmd21uc2RYOFVLRldnbFZmOGt6OEo4SDMvd0g4SE9QakE9PS1PM0UAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAjTaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+CiAgICAgICAgIDx0aWZmOkNvbXByZXNzaW9uPjE8L3RpZmY6Q29tcHJlc3Npb24+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjE0NDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+MTQ0PC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpQaG90b21ldHJpY0ludGVycHJldGF0aW9uPjI8L3RpZmY6UGhvdG9tZXRyaWNJbnRlcnByZXRhdGlvbj4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjM0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6VXNlckNvbW1lbnQ+QUFBRTJIamFiVk5kYkJSVkZENTNib0cyME82MDVhZVV2OEZ1dFlqZ0ZxclU0ayszbElVS1hTaXoyMjczaC9YdSYjeEE7N04zdDBObVpkZVp1WVdtYTNBY0R4c2lEVHdnUGFOc1lyVEg0RXlYR1JJMnhJREdtMFcyakprWU5UN3dZSDN3eCYjeEE7aHBoNFozZURhSmlieVp4ejdqbjNmT2U3MzZUeWh1NHduMjhaU2JobXhjcFY5Ukh2SkxVZDNUTEh2TVRXeG5YaCYjeEE7aGJ6TXlrZThWdW9VMVpqVERPamM2MG5aRTFTUDBDSk4rNnRKMzlYV2hXekxZaHk5SzI5ZnZhYmp3WWM2ZHp5OCYjeEE7ODVGZHV4OTliUCtUZlFQUEhoaytFWTJkSkRSektwZG5oYkRYTEJqR1VrT2pSMjd6amdiVjNSTzA2RVRGdDlwayYjeEE7eEtzWnhISG1tNXBiMXE1YnY2RjFJNWM0NWpWOEJWL0pWL0ZhWHNmcjV6ZHQzckoxbTdMOWdYYSttcS9oamR6RCYjeEE7bTNnYjM4UzM4SzFjaWFTSVF3M2RwR0hOTWl3N2xMUFNOTXgwWnRCSTNxWWtsekpvSWtleXBwN1JOY0xFdUtFMCYjeEE7WVZTTWxTTGFSTmEyQ21iNmdGc1lkYXlDcmRFUVBjUGFvZm9zK2JvOGUvWjJoNFBxaVVQOThhQmFUbFR6UktNQiYjeEE7bnlJV3lJZzNsQjdmMS9ORXRES0dTWEkwVWpHcE0xb3RtTzNwalFUVlkrVjU1WnFTNTZtbm54a1RCRGpNMXMwcyYjeEE7bDQrTEEvejlaWjZIQ293SXZHcDVaODUvd0syck9Fc0hQWUZEaHdmditnS01ud2tyVldEVTRjMThJMjlKeXFWNCYjeEE7MnRJS09XcXlNb0pZbHkvUEVsUEVacnBtME9uNmVNR2hBdnNFeWRLWU1GMnNUbUtxek5xMDBpRWlhU1ZqMmVJMSYjeEE7bVZLTzNsc3hSWEtPVTh5bFJHYU9zSEhuLzN0dThINTdzUUxMOUNTbWRETXZrSnBhcFZHbVlDak1VbGd4VDVXMCYjeEE7Ymd0ZWpLSXdpR2JyQXF1aWpST2JhRXlvczk0Vnp0SGc4Wmtodm5ibUdGL0hXMGVDYWtBQVhGWkRZYy9JYUdSTSYjeEE7K0twK2xncGlNZ0dEWkIzaEI4Vmc3WDJkbFN1VVpiNmVieGdac2t5aVdZTHBlS0o2d215OFY3ako1d1NUQTdybSYjeEE7Q29QWXhkbWtHMHhwU2JuNUhvTFRGYzVuMDczM2piZjM5VmQ2bGJLZWNkM1ZPTk1GQXYvQ0RjLzVDOTRZM3l5TyYjeEE7bkRCRTJ3RWh2Tm1KWGxkVjV0N3VRSmNpRnZBRzkyNmZQenpJdDdtM09Gd1UyWk9uazNMTFhUbjhDMjl1TXRrTCYjeEE7dGRBRWJlQ0ZIYkFIOXNFZ0hJVmhVT0UwVE1NTDhESmNoQ3Z3RnJ3Tjc4QlZlQTgrZ0EvaEdud01uOEFDM0lDYiYjeEE7OERWOEE0dndMWlJnR2I2SEgrRVczSWJmNEErNGcrcFFJMUxRVHRTTjlpTS9DcUl3R2tWajZDVFNrWTNPb21sMCYjeEE7RHIySUxxQ0w2Qks2akY1RDc2T1AwR2ZvT2xwRVA2R2YwYS9vbG5STits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;" parent="1" vertex="1"> + <mxGeometry x="551" y="767" width="6.38" height="9" as="geometry" /> + </mxCell> + <mxCell id="BE7m5MwMy8wg7SoJYegb-1" value="MLE" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> + <mxGeometry x="699" y="641" width="70" height="30" as="geometry" /> + </mxCell> + <mxCell id="BE7m5MwMy8wg7SoJYegb-2" value="PEM" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> + <mxGeometry x="699" y="677" width="70" height="30" as="geometry" /> + </mxCell> + <mxCell id="BE7m5MwMy8wg7SoJYegb-4" value="" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0;entryDx=0;entryDy=0;" parent="1" edge="1"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="696" y="646" as="sourcePoint" /> + <mxPoint x="628" y="696" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="BE7m5MwMy8wg7SoJYegb-5" value="" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=1;entryDx=0;entryDy=0;" parent="1" edge="1"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="695" y="780" as="sourcePoint" /> + <mxPoint x="628" y="728" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="BE7m5MwMy8wg7SoJYegb-6" value="MAP" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> + <mxGeometry x="699" y="714" width="70" height="30" as="geometry" /> + </mxCell> + <mxCell id="BE7m5MwMy8wg7SoJYegb-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;curved=1;endArrow=none;endFill=0;" parent="1" source="BE7m5MwMy8wg7SoJYegb-7" target="hdwB_MQwIhiL4xS-3u5l-2" edge="1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="BE7m5MwMy8wg7SoJYegb-7" value="gradient or non-gradient based.." style="rounded=0;whiteSpace=wrap;html=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> + <mxGeometry x="682.5" y="567" width="103" height="60" as="geometry" /> + </mxCell> + <mxCell id="BE7m5MwMy8wg7SoJYegb-11" value="Design related" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> + <mxGeometry x="699" y="751" width="70" height="30" as="geometry" /> + </mxCell> + <mxCell id="ilc09JGzDhpx_nHwKlJr-1" value="" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=https://cdn.onlinewebfonts.com/svg/img_827.svg;flipV=1;" parent="1" vertex="1"> + <mxGeometry x="437" y="632.8" width="20" height="20" as="geometry" /> + </mxCell> + </root> + </mxGraphModel> + </diagram> +</mxfile> From a93e1f5f1d7016c59bf8f0214576aaf4cfab6c03 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Tue, 18 Jul 2023 14:48:25 +0100 Subject: [PATCH 004/210] Rename repo directory --- PyBOP/__init__.py | 0 PyBOP/cost_functions/MLE.py | 18 ---------------- PyBOP/cost_functions/__init__.py | 0 PyBOP/models/base_model.py | 25 ---------------------- PyBOP/optimisation/base_optimisation.py | 28 ------------------------- PyBOP/plotting/quick_plot.py | 28 ------------------------- PyBOP/simulation/base_simulation.py | 26 ----------------------- 7 files changed, 125 deletions(-) delete mode 100644 PyBOP/__init__.py delete mode 100644 PyBOP/cost_functions/MLE.py delete mode 100644 PyBOP/cost_functions/__init__.py delete mode 100644 PyBOP/models/base_model.py delete mode 100644 PyBOP/optimisation/base_optimisation.py delete mode 100644 PyBOP/plotting/quick_plot.py delete mode 100644 PyBOP/simulation/base_simulation.py diff --git a/PyBOP/__init__.py b/PyBOP/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/PyBOP/cost_functions/MLE.py b/PyBOP/cost_functions/MLE.py deleted file mode 100644 index 48f8b48da..000000000 --- a/PyBOP/cost_functions/MLE.py +++ /dev/null @@ -1,18 +0,0 @@ -class CostFunction(): - """ - Base class for cost function definition. - """ - - def __init__(): - """" - - Init. - - """ - - def MLE(self, x0, x_hat, theta): - """ - - Function for Maximum Likelihood Estimation - - """ diff --git a/PyBOP/cost_functions/__init__.py b/PyBOP/cost_functions/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/PyBOP/models/base_model.py b/PyBOP/models/base_model.py deleted file mode 100644 index 46e314ce1..000000000 --- a/PyBOP/models/base_model.py +++ /dev/null @@ -1,25 +0,0 @@ -from pybamm.models.base_model import PyBaMMBaseModel -import numpy as np - -class BaseModel(PyBaMMBaseModel): - """ - - This is a wrapper class for the PyBaMM Model class. - - """ - - def __init__(self): - """ - - Insert initialisation code as needed. - - """ - - self.name = "Base Model" - - - def update(self, k): - """ - Updater - """ - print(k) \ No newline at end of file diff --git a/PyBOP/optimisation/base_optimisation.py b/PyBOP/optimisation/base_optimisation.py deleted file mode 100644 index a77348b2f..000000000 --- a/PyBOP/optimisation/base_optimisation.py +++ /dev/null @@ -1,28 +0,0 @@ -import botorch -import scipy -import numpy - -class BaseOptimisation(): - """ - - Base class for the optimisation methods. - - """ - - def __init__(self): - - """ - - Initialise and name class. - - """ - self.name = "Base Optimisation" - - - - def NelderMead(self, fun, x0, options): - """ - PRISM optimiser using Nelder-Mead. - """ - res = scipy.optimize(fun, x0, method='nelder-mead', - options={'xatol': 1e-8, 'disp': True}) \ No newline at end of file diff --git a/PyBOP/plotting/quick_plot.py b/PyBOP/plotting/quick_plot.py deleted file mode 100644 index f36fe2f31..000000000 --- a/PyBOP/plotting/quick_plot.py +++ /dev/null @@ -1,28 +0,0 @@ -import os -import numpy -import matplotlib - -class QuickPlot(item): - """ - - Class to generate the quick plots associated with PRISM. - - Plots - -------------- - Observability - if method == parameterisation - - Comparison of fitting data with optimised forward model - - elseif method == optimisation - - Pareto front - Alternative solutions - Initial value compared to optimal - - """ - - def __init__(self): - self.name = "Quick Plot" - - diff --git a/PyBOP/simulation/base_simulation.py b/PyBOP/simulation/base_simulation.py deleted file mode 100644 index 0595b6577..000000000 --- a/PyBOP/simulation/base_simulation.py +++ /dev/null @@ -1,26 +0,0 @@ -import pybamm.simulation.Simulation as pybamm_simulation - -class BaseSimulation(pybamm_simulation): - """ - - This class solves the optimisation / estimation problem. - - Parameters: - ================ - pybamm_simulation: argument for PyBaMM simulation that will be updated. - - """ - - def __init__(self): - """ - Initialise and name class - """ - - self.name = "Base Simulation" - - def Simulation(self, simulation, optimise, cost, data): - """ - - - - """ \ No newline at end of file From 6795600404b2a73b15aecc7d8e4562192fc7ceff Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Tue, 18 Jul 2023 14:50:04 +0100 Subject: [PATCH 005/210] Repo rename / Add setup.py / Updt. __init__.py / base SPM class --- pybop/__init__.py | 37 +++++++++++++++++++++ pybop/cost_functions/__init__.py | 0 pybop/cost_functions/mle.py | 18 +++++++++++ pybop/models/base_model.py | 24 ++++++++++++++ pybop/models/spm.py | 21 ++++++++++++ pybop/optimisation/base_optimisation.py | 28 ++++++++++++++++ pybop/plotting/quick_plot.py | 28 ++++++++++++++++ pybop/simulation/base_simulation.py | 26 +++++++++++++++ pybop/version.py | 1 + setup.py | 43 +++++++++++++++++++++++++ 10 files changed, 226 insertions(+) create mode 100644 pybop/__init__.py create mode 100644 pybop/cost_functions/__init__.py create mode 100644 pybop/cost_functions/mle.py create mode 100644 pybop/models/base_model.py create mode 100644 pybop/models/spm.py create mode 100644 pybop/optimisation/base_optimisation.py create mode 100644 pybop/plotting/quick_plot.py create mode 100644 pybop/simulation/base_simulation.py create mode 100644 pybop/version.py create mode 100644 setup.py diff --git a/pybop/__init__.py b/pybop/__init__.py new file mode 100644 index 000000000..b986ffeb0 --- /dev/null +++ b/pybop/__init__.py @@ -0,0 +1,37 @@ +# +# Root of the pybop module. +# Provides access to all shared functionality (models, solvers, etc.). +# +# The code in this file is adapted from pybamm +# (see https://github.com/pybamm-team/pybamm) +# + +import sys +import os + + +# +# Version info +# +from pybop.version import __version__ + + +# +# Constants +# +# Float format: a float can be converted to a 17 digit decimal and back without +# loss of information +FLOAT_FORMAT = "{: .17e}" +# Absolute path to the PyBOP repo +script_path = os.path.abspath(__file__) + +# +# Model Classes +# +from .models.base_model import BaseModel +from .models.spm import BaseSPM + +# +# Remove any imported modules, so we don't expose them as part of pybop +# +del sys \ No newline at end of file diff --git a/pybop/cost_functions/__init__.py b/pybop/cost_functions/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/pybop/cost_functions/mle.py b/pybop/cost_functions/mle.py new file mode 100644 index 000000000..48f8b48da --- /dev/null +++ b/pybop/cost_functions/mle.py @@ -0,0 +1,18 @@ +class CostFunction(): + """ + Base class for cost function definition. + """ + + def __init__(): + """" + + Init. + + """ + + def MLE(self, x0, x_hat, theta): + """ + + Function for Maximum Likelihood Estimation + + """ diff --git a/pybop/models/base_model.py b/pybop/models/base_model.py new file mode 100644 index 000000000..63f31ebda --- /dev/null +++ b/pybop/models/base_model.py @@ -0,0 +1,24 @@ +from pybamm.models.base_model import BaseModel + +class BaseModel(BaseModel): + """ + + This is a wrapper class for the PyBaMM Model class. + + """ + + def __init__(self): + """ + + Insert initialisation code as needed. + + """ + + self.name = "BaseModel" + + + def update(self, k): + """ + Updater + """ + print(k) \ No newline at end of file diff --git a/pybop/models/spm.py b/pybop/models/spm.py new file mode 100644 index 000000000..7d69c1a3f --- /dev/null +++ b/pybop/models/spm.py @@ -0,0 +1,21 @@ +import pybop +import pybamm +from .base_model import BaseModel + +class BaseSPM(): + """ + + Implements base SPM from PyBaMM + + """ + + def __init__(self): + """ + + Insert initialisation code as needed. + + """ + + self.name = "Base SPM" + self.model = pybamm.lithium_ion.SPM() + \ No newline at end of file diff --git a/pybop/optimisation/base_optimisation.py b/pybop/optimisation/base_optimisation.py new file mode 100644 index 000000000..a77348b2f --- /dev/null +++ b/pybop/optimisation/base_optimisation.py @@ -0,0 +1,28 @@ +import botorch +import scipy +import numpy + +class BaseOptimisation(): + """ + + Base class for the optimisation methods. + + """ + + def __init__(self): + + """ + + Initialise and name class. + + """ + self.name = "Base Optimisation" + + + + def NelderMead(self, fun, x0, options): + """ + PRISM optimiser using Nelder-Mead. + """ + res = scipy.optimize(fun, x0, method='nelder-mead', + options={'xatol': 1e-8, 'disp': True}) \ No newline at end of file diff --git a/pybop/plotting/quick_plot.py b/pybop/plotting/quick_plot.py new file mode 100644 index 000000000..f36fe2f31 --- /dev/null +++ b/pybop/plotting/quick_plot.py @@ -0,0 +1,28 @@ +import os +import numpy +import matplotlib + +class QuickPlot(item): + """ + + Class to generate the quick plots associated with PRISM. + + Plots + -------------- + Observability + if method == parameterisation + + Comparison of fitting data with optimised forward model + + elseif method == optimisation + + Pareto front + Alternative solutions + Initial value compared to optimal + + """ + + def __init__(self): + self.name = "Quick Plot" + + diff --git a/pybop/simulation/base_simulation.py b/pybop/simulation/base_simulation.py new file mode 100644 index 000000000..0595b6577 --- /dev/null +++ b/pybop/simulation/base_simulation.py @@ -0,0 +1,26 @@ +import pybamm.simulation.Simulation as pybamm_simulation + +class BaseSimulation(pybamm_simulation): + """ + + This class solves the optimisation / estimation problem. + + Parameters: + ================ + pybamm_simulation: argument for PyBaMM simulation that will be updated. + + """ + + def __init__(self): + """ + Initialise and name class + """ + + self.name = "Base Simulation" + + def Simulation(self, simulation, optimise, cost, data): + """ + + + + """ \ No newline at end of file diff --git a/pybop/version.py b/pybop/version.py new file mode 100644 index 000000000..b3c06d488 --- /dev/null +++ b/pybop/version.py @@ -0,0 +1 @@ +__version__ = "0.0.1" \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 000000000..d360d3035 --- /dev/null +++ b/setup.py @@ -0,0 +1,43 @@ +from distutils.core import setup +import os +from setuptools import find_packages + +# User-friendly description from README.md +current_directory = os.path.dirname(os.path.abspath(__file__)) +try: + with open(os.path.join(current_directory, 'README.md'), encoding='utf-8') as f: + long_description = f.read() +except Exception: + long_description = '' + +setup( + # Name of the package + name='PyBOP', + # Packages to include into the distribution + packages=find_packages('.'), + # Start with a small number and increase it with + # every change you make https://semver.org + version='0.0.1', + # Chose a license from here: https: // + # help.github.com / articles / licensing - a - + # repository. For example: MIT + license='MIT', + # Short description of your library + description='Python Battery Optimisation and Parameterisation', + # Long description of your library + long_description=long_description, + long_description_content_type='text/markdown', + # Either the link to your github or to your website + url='https://github.com/pybop-team/PyBOP', + # List of packages to install with this one + install_requires=[ + "pybamm>=23.1" + "numpy>=1.16", + "scipy>=1.3", + "pandas>=0.24", + "casadi>=3.6.0", + ], + # https://pypi.org/classifiers/ + classifiers=[], + python_requires=">=3.8,<3.12", +) From 5f9b136f0f40ac4ce7690f876ecc159edeed03e3 Mon Sep 17 00:00:00 2001 From: David Howey <david.howey@eng.ox.ac.uk> Date: Wed, 19 Jul 2023 22:10:17 +0100 Subject: [PATCH 006/210] Update README.md minor changes --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index a6d6db661..da868b90f 100644 --- a/README.md +++ b/README.md @@ -6,18 +6,18 @@ PyBOP aims to be a modular library for the parameterisation and optimisation of <img src="assets/PyBOP_Arch.svg" alt="Data flows from battery cycling machines to Galv Harvesters, then to the Galv server and REST API. Metadata can be updated and data read using the web client, and data can be downloaded by the Python client." width="600" /> </p> -The living software specification of PyBOP can be found here; however, an overview is introduced below. +The living software specification of PyBOP can be found [here](https://github.com/pybop-team/software-spec); however, an overview is introduced below. -- Provide both frequentist and bayesian parameterisation and optimisation methods to battery modellers +- Provide design optimisation plus both frequentist and Bayesian parameterisation methods to battery modellers - Provide workflows and examples for parameter fitting and grouping -- Create diagnostics for end-users to convey parameter and optimisation fidelity +- Create diagnostics for end-users to understand parameter identifiability and optimisation fidelity **Community and values** PyBOP aims to foster a broad consortium of developers and users, building on and learning from the success of the PyBaMM community. Our values are: -- Open-Source (code and ideas should be shared) +- Open-source (code and ideas should be shared) - Inclusivity and fairness (those who want to contribute may do so, and their input is appropriately recognised) @@ -25,4 +25,4 @@ learning from the success of the PyBaMM community. Our values are: - Inter-operability (aiming for modularity to enable maximum impact and inclusivity) -- User-friendliness (putting user requirements first, thinking about user- assistance & workflows) \ No newline at end of file +- User-friendliness (putting user requirements first, thinking about user- assistance & workflows) From 93bc3584e80151f9f2452cff4a7c5f3a36ba9295 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 20 Jul 2023 12:52:36 +0100 Subject: [PATCH 007/210] Add simulation class structure / Updt. SPM.py --- pybop/models/spm.py | 15 +++------------ pybop/simulation.py | 25 +++++++++++++++++++++++++ pybop/simulation/base_simulation.py | 26 -------------------------- 3 files changed, 28 insertions(+), 38 deletions(-) create mode 100644 pybop/simulation.py delete mode 100644 pybop/simulation/base_simulation.py diff --git a/pybop/models/spm.py b/pybop/models/spm.py index 7d69c1a3f..65abd2092 100644 --- a/pybop/models/spm.py +++ b/pybop/models/spm.py @@ -1,21 +1,12 @@ -import pybop import pybamm from .base_model import BaseModel -class BaseSPM(): +class BaseSPM(pybamm.models.full_battery_models.lithium_ion.BasicSPM): """ - Implements base SPM from PyBaMM + Inherites from the BasicSPM class in PyBaMM """ def __init__(self): - """ - - Insert initialisation code as needed. - - """ - - self.name = "Base SPM" - self.model = pybamm.lithium_ion.SPM() - \ No newline at end of file + super().__init__() diff --git a/pybop/simulation.py b/pybop/simulation.py new file mode 100644 index 000000000..055e96e56 --- /dev/null +++ b/pybop/simulation.py @@ -0,0 +1,25 @@ +import pybamm + +class BaseSimulation(pybamm.simulation.Simulation): + """ + + This class constructs the PyBOP simulation class + + Parameters: + ================ + + + """ + + def __init__(self): + """ + Initialise and name class + """ + super()__init__() + + def optimize(self): + """ + + Optimize function for the give optimisation problem. + + """ \ No newline at end of file diff --git a/pybop/simulation/base_simulation.py b/pybop/simulation/base_simulation.py deleted file mode 100644 index 0595b6577..000000000 --- a/pybop/simulation/base_simulation.py +++ /dev/null @@ -1,26 +0,0 @@ -import pybamm.simulation.Simulation as pybamm_simulation - -class BaseSimulation(pybamm_simulation): - """ - - This class solves the optimisation / estimation problem. - - Parameters: - ================ - pybamm_simulation: argument for PyBaMM simulation that will be updated. - - """ - - def __init__(self): - """ - Initialise and name class - """ - - self.name = "Base Simulation" - - def Simulation(self, simulation, optimise, cost, data): - """ - - - - """ \ No newline at end of file From f8371f0b79227205edc465e34ddbe0cd7f1d3324 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 20 Jul 2023 16:12:05 +0100 Subject: [PATCH 008/210] Simulation class to inherite Pybamm Simulation class --- pybop/__init__.py | 5 +++++ pybop/simulation.py | 12 +++++------- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/pybop/__init__.py b/pybop/__init__.py index b986ffeb0..5841d37d3 100644 --- a/pybop/__init__.py +++ b/pybop/__init__.py @@ -31,6 +31,11 @@ from .models.base_model import BaseModel from .models.spm import BaseSPM +# +# Simulation class +# +from .simulation import Simulation + # # Remove any imported modules, so we don't expose them as part of pybop # diff --git a/pybop/simulation.py b/pybop/simulation.py index 055e96e56..0d0475fc0 100644 --- a/pybop/simulation.py +++ b/pybop/simulation.py @@ -1,9 +1,9 @@ import pybamm -class BaseSimulation(pybamm.simulation.Simulation): +class Simulation(pybamm.simulation.Simulation): """ - This class constructs the PyBOP simulation class + This class constructs the PyBOP Simulation class Parameters: ================ @@ -11,11 +11,9 @@ class BaseSimulation(pybamm.simulation.Simulation): """ - def __init__(self): - """ - Initialise and name class - """ - super()__init__() + def __init__(self, *args): + super(Simulation, self).__init__(*args) + def optimize(self): """ From aa2c5a9e5104cf50550cc1d3947a14dafb5f38d0 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 27 Jul 2023 17:12:16 +0100 Subject: [PATCH 009/210] Add to simulation.py & integrate pybamm methods --- pybop/cost_functions/rmse.py | 11 + pybop/optimisation/base_optimisation.py | 21 +- pybop/plotting/quick_plot.py | 4 +- pybop/simulation.py | 351 +++++++++++++++++++++++- 4 files changed, 363 insertions(+), 24 deletions(-) create mode 100644 pybop/cost_functions/rmse.py diff --git a/pybop/cost_functions/rmse.py b/pybop/cost_functions/rmse.py new file mode 100644 index 000000000..4b52bf250 --- /dev/null +++ b/pybop/cost_functions/rmse.py @@ -0,0 +1,11 @@ +# Root Mean Square Cost Function + +import numpy as np +import pybop + +def RMSE(x, y, grad, minV, params, model, experiment, observation): + yhat = minV * np.ones(len(y)) + params.update({"Electrode height [m]": x[0], "Negative particle radius [m]": x[1], "Positive particle radius [m]": x[2]}) + yhat_temp = pybop.simulation(model, experiment=experiment, parameter_values=params, observation=observation) + yhat[:len(yhat_temp)] = yhat_temp + return np.sqrt(sum((yhat - y)) ** 2) \ No newline at end of file diff --git a/pybop/optimisation/base_optimisation.py b/pybop/optimisation/base_optimisation.py index a77348b2f..940e168fb 100644 --- a/pybop/optimisation/base_optimisation.py +++ b/pybop/optimisation/base_optimisation.py @@ -1,15 +1,13 @@ -import botorch -import scipy -import numpy +import pybop -class BaseOptimisation(): +class BaseOptimisation: """ Base class for the optimisation methods. """ - def __init__(self): + def __init__(self, Simulation): """ @@ -17,12 +15,13 @@ def __init__(self): """ self.name = "Base Optimisation" + self.Simulation = Simulation.copy() - def NelderMead(self, fun, x0, options): - """ - PRISM optimiser using Nelder-Mead. - """ - res = scipy.optimize(fun, x0, method='nelder-mead', - options={'xatol': 1e-8, 'disp': True}) \ No newline at end of file + # def NelderMead(self, fun, x0, options): + # """ + # PyBOP optimiser using Nelder-Mead. + # """ + # res = scipy.optimize(fun, x0, method='nelder-mead', + # options={'xatol': 1e-8, 'disp': True}) \ No newline at end of file diff --git a/pybop/plotting/quick_plot.py b/pybop/plotting/quick_plot.py index f36fe2f31..3d83c8d3a 100644 --- a/pybop/plotting/quick_plot.py +++ b/pybop/plotting/quick_plot.py @@ -2,10 +2,10 @@ import numpy import matplotlib -class QuickPlot(item): +class QuickPlot(): """ - Class to generate the quick plots associated with PRISM. + Class to generate plots with standard variables and formatting. Plots -------------- diff --git a/pybop/simulation.py b/pybop/simulation.py index 055e96e56..ae9ecdacb 100644 --- a/pybop/simulation.py +++ b/pybop/simulation.py @@ -1,9 +1,32 @@ import pybamm +import numpy as np +import pickle +import sys +from functools import lru_cache +import warnings -class BaseSimulation(pybamm.simulation.Simulation): + +def is_notebook(): + try: + shell = get_ipython().__class__.__name__ + if shell == "ZMQInteractiveShell": # pragma: no cover + # Jupyter notebook or qtconsole + cfg = get_ipython().config + nb = len(cfg["InteractiveShell"].keys()) == 0 + return nb + elif shell == "TerminalInteractiveShell": # pragma: no cover + return False # Terminal running IPython + elif shell == "Shell": # pragma: no cover + return True # Google Colab notebook + else: # pragma: no cover + return False # Other type (?) + except NameError: + return False # Probably standard Python interpreter + +class Simulation: """ - This class constructs the PyBOP simulation class + This class constructs the PyBOP simulation class. It was built off the PyBaMM simulation class. Parameters: ================ @@ -11,15 +34,321 @@ class BaseSimulation(pybamm.simulation.Simulation): """ - def __init__(self): - """ - Initialise and name class - """ - super()__init__() + def __init__( + self, + model, + measured_expirement=None, + geometry=None, + initial_parameter_values=None, + submesh_types=None, + var_pts=None, + spatial_methods=None, + solver=None, + output_variables=None, + C_rate=None, + ): + self.initial_parameters = initial_parameter_values or model.default_parameter_values + + # Check to see that current is provided as a drive_cycle + current = self._parameter_values.get("Current function [A]") + if isinstance(current, pybamm.Interpolant): + self.operating_mode = "drive cycle" + elif isinstance(current, pybamm.Interpolant): + # This requires syncing the sampling frequency to ensure equivalent vector lengths + self.operating_mode = "without experiment" + if C_rate: + self.C_rate = C_rate + self._parameter_values.update( + { + "Current function [A]": self.C_rate + * self._parameter_values["Nominal cell capacity [A.h]"] + } + ) + else: + raise TypeError( + "measured_experiment must be drive_cycle or C_rate with" + "matching sampling frequency between t_eval and measured data" + ) + + self._unprocessed_model = model + self.model = model + self.geometry = geometry or self.model.default_geometry + self.submesh_types = submesh_types or self.model.default_submesh_types + self.var_pts = var_pts or self.model.default_var_pts + self.spatial_methods = spatial_methods or self.model.default_spatial_methods + self.solver = solver or self.model.default_solver + self.output_variables = output_variables + + # Initialize empty built states + self._model_with_set_params = None + self._built_model = None + self._built_initial_soc = None + self.op_conds_to_built_models = None + self.op_conds_to_built_solvers = None + self._mesh = None + self._disc = None + self._solution = None + self.quick_plot = None - def optimize(self): - """ + # ignore runtime warnings in notebooks + if is_notebook(): # pragma: no cover + import warnings + + warnings.filterwarnings("ignore") + + self.get_esoh_solver = lru_cache()(self._get_esoh_solver) - Optimize function for the give optimisation problem. + def set_parameters(self): + """ + Setter for parameter values + + Inputs: + ============ + param: The parameter object to set + """ + if self.model_with_set_params: + return + + self._model_with_set_params = self._parameter_values.process_model( + self._unprocessed_model, inplace=False + ) + self._parameter_values.process_geometry(self.geometry) + self.model = self._model_with_set_params + + + def build(self, check_model=True, initial_soc=None): + """ + A method to build the model into a system of matrices and vectors suitable for + performing numerical computations. If the model has already been built or + solved then this function will have no effect. This method will automatically set the parameters + if they have not already been set. + + Parameters + ---------- + check_model : bool, optional + If True, model checks are performed after discretisation (see + :meth:`pybamm.Discretisation.process_model`). Default is True. + initial_soc : float, optional + Initial State of Charge (SOC) for the simulation. Must be between 0 and 1. + If given, overwrites the initial concentrations provided in the parameter + set. + """ + if initial_soc is not None: + self.set_initial_soc(initial_soc) + + if self.built_model: + return + elif self.model.is_discretised: + self._model_with_set_params = self.model + self._built_model = self.model + else: + self.set_parameters() + self._mesh = pybamm.Mesh(self._geometry, self._submesh_types, self._var_pts) + self._disc = pybamm.Discretisation(self._mesh, self._spatial_methods) + self._built_model = self._disc.process_model( + self._model_with_set_params, inplace=False, check_model=check_model + ) + # rebuilt model so clear solver setup + self._solver._model_set_up = {} + + def setup_for_parameterisation(): + """ + A method to setup self.model for the parameterisation experiment + """ + + def plot(self, output_variables=None, **kwargs): + """ + A method to quickly plot the outputs of the simulation. Creates a + :class:`pybamm.QuickPlot` object (with keyword arguments 'kwargs') and + then calls :meth:`pybamm.QuickPlot.dynamic_plot`. + + Parameters + ---------- + output_variables: list, optional + A list of the variables to plot. + **kwargs + Additional keyword arguments passed to + :meth:`pybamm.QuickPlot.dynamic_plot`. + For a list of all possible keyword arguments see :class:`pybamm.QuickPlot`. + """ + + if self._solution is None: + raise ValueError( + "Model has not been solved, please solve the model before plotting." + ) + + if output_variables is None: + output_variables = self.output_variables + + self.quick_plot = pybop.dynamic_plot( + self._solution, output_variables=output_variables, **kwargs + ) + + return self.quick_plot + + def create_gif(self, number_of_images=80, duration=0.1, output_filename="plot.gif"): + """ + Create a gif of the parameterisation steps created by :meth:`pybamm.Simulation.plot`. + + Parameters + ---------- + number_of_images : int (optional) + Number of images/plots to be compiled for a GIF. + duration : float (optional) + Duration of visibility of a single image/plot in the created GIF. + output_filename : str (optional) + Name of the generated GIF file. + + """ + if self.quick_plot is None: + self.quick_plot = pybamm.QuickPlot(self._solution) + + #create_git needs to be updated + self.quick_plot.create_gif( + number_of_images=number_of_images, + duration=duration, + output_filename=output_filename, + ) + + def solve( + self, + t_eval=None, + solver=None, + check_model=True, + calc_esoh=True, + starting_solution=None, + initial_soc=None, + callbacks=None, + showprogress=False, + **kwargs, + ): + """ + A method to solve the model for parameterisation. This method will automatically build + and set the model parameters if not already done so. + + Parameters + ---------- + t_eval : numeric type, optional + The times (in seconds) at which to compute the solution. Can be + provided as an array of times at which to return the solution, or as a + list `[t0, tf]` where `t0` is the initial time and `tf` is the final time. + If provided as a list the solution is returned at 100 points within the + interval `[t0, tf]`. + + If None and the parameter "Current function [A]" is read from data + (i.e. drive cycle simulation) the model will be solved at the times + provided in the data. + solver : :class:`pybop.BaseSolver`, optional + The solver to use to solve the model. If None, Simulation.solver is used + check_model : bool, optional + If True, model checks are performed after discretisation (see + :meth:`pybamm.Discretisation.process_model`). Default is True. + calc_esoh : bool, optional + Whether to include eSOH variables in the summary variables. If `False` + then only summary variables that do not require the eSOH calculation + are calculated. Default is True. + starting_solution : :class:`pybamm.Solution` + The solution to start stepping from. If None (default), then self._solution + is used. Must be None if not using an experiment. + initial_soc : float, optional + Initial State of Charge (SOC) for the simulation. Must be between 0 and 1. + If given, overwrites the initial concentrations provided in the parameter + set. + callbacks : list of callbacks, optional + A list of callbacks to be called at each time step. Each callback must + implement all the methods defined in :class:`pybamm.callbacks.BaseCallback`. + showprogress : bool, optional + Whether to show a progress bar for cycling. If true, shows a progress bar + for cycles. Has no effect when not used with an experiment. + Default is False. + **kwargs + Additional key-word arguments passed to `solver.solve`. + See :meth:`pybamm.BaseSolver.solve`. + """ + # Setup + if solver is None: + solver = self.solver + + callbacks = pybamm.callbacks.setup_callbacks(callbacks) + logs = {} + + self.build(check_model=check_model, initial_soc=initial_soc) + + if self.operating_mode == "drive cycle": + # For drive cycles (current provided as data) we perform additional + # tests on t_eval (if provided) to ensure the returned solution + # captures the input. + time_data = self._parameter_values["Current function [A]"].x[0] + # If no t_eval is provided, we use the times provided in the data. + if t_eval is None: + pybamm.logger.info("Setting t_eval as specified by the data") + t_eval = time_data + # If t_eval is provided we first check if it contains all of the + # times in the data to within 10-12. If it doesn't, we then check + # that the largest gap in t_eval is smaller than the smallest gap in + # the time data (to ensure the resolution of t_eval is fine enough). + # We only raise a warning here as users may genuinely only want + # the solution returned at some specified points. + elif ( + set(np.round(time_data, 12)).issubset(set(np.round(t_eval, 12))) + ) is False: + warnings.warn( + """ + t_eval does not contain all of the time points in the data + set. Note: passing t_eval = None automatically sets t_eval + to be the points in the data. + """, + pybamm.SolverWarning, + ) + dt_data_min = np.min(np.diff(time_data)) + dt_eval_max = np.max(np.diff(t_eval)) + if dt_eval_max > dt_data_min + sys.float_info.epsilon: + warnings.warn( + """ + The largest timestep in t_eval ({}) is larger than + the smallest timestep in the data ({}). The returned + solution may not have the correct resolution to accurately + capture the input. Try refining t_eval. Alternatively, + passing t_eval = None automatically sets t_eval to be the + points in the data. + """.format( + dt_eval_max, dt_data_min + ), + pybamm.SolverWarning, + ) + + self._solution = solver.solve(self.built_model, t_eval, **kwargs) + + return self.solution + + def save(self, filename): + """Save simulation using pickle""" + if self.model.convert_to_format == "python": + # We currently cannot save models in the 'python' format + raise NotImplementedError( + """ + Cannot save simulation if model format is python. + Set model.convert_to_format = 'casadi' instead. + """ + ) + # Clear solver problem (not pickle-able, will automatically be recomputed) + if ( + isinstance(self._solver, pybamm.CasadiSolver) + and self._solver.integrator_specs != {} + ): + self._solver.integrator_specs = {} + + if self.op_conds_to_built_solvers is not None: + for solver in self.op_conds_to_built_solvers.values(): + if ( + isinstance(solver, pybamm.CasadiSolver) + and solver.integrator_specs != {} + ): + solver.integrator_specs = {} + + with open(filename, "wb") as f: + pickle.dump(self, f, pickle.HIGHEST_PROTOCOL) - """ \ No newline at end of file + def load_sim(filename): + """Load a saved simulation""" + return pybamm.load(filename) \ No newline at end of file From f7acc48d9473791301ad2d0796a21271e107de81 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 28 Jul 2023 10:02:34 +0100 Subject: [PATCH 010/210] Simulation.py bugfix + initial test added --- pybop/simulation.py | 27 ++++++++++++++++++++++++--- tests/Simulation.py | 15 +++++++++++++++ 2 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 tests/Simulation.py diff --git a/pybop/simulation.py b/pybop/simulation.py index ae9ecdacb..c81f4f61b 100644 --- a/pybop/simulation.py +++ b/pybop/simulation.py @@ -37,7 +37,7 @@ class Simulation: def __init__( self, model, - measured_expirement=None, + measured_experiment=None, geometry=None, initial_parameter_values=None, submesh_types=None, @@ -47,7 +47,7 @@ def __init__( output_variables=None, C_rate=None, ): - self.initial_parameters = initial_parameter_values or model.default_parameter_values + self.parameter_values = initial_parameter_values or model.default_parameter_values # Check to see that current is provided as a drive_cycle current = self._parameter_values.get("Current function [A]") @@ -349,6 +349,27 @@ def save(self, filename): with open(filename, "wb") as f: pickle.dump(self, f, pickle.HIGHEST_PROTOCOL) + def _get_esoh_solver(self, calc_esoh): + if ( + calc_esoh is False + or isinstance(self.model, pybamm.lead_acid.BaseModel) + or isinstance(self.model, pybamm.equivalent_circuit.Thevenin) + or self.model.options["working electrode"] != "both" + ): + return None + + return pybamm.lithium_ion.ElectrodeSOHSolver( + self.parameter_values, self.model.param + ) + def load_sim(filename): """Load a saved simulation""" - return pybamm.load(filename) \ No newline at end of file + return pybamm.load(filename) + + @property + def parameter_values(self): + return self._parameter_values + + @parameter_values.setter + def parameter_values(self, parameter_values): + self._parameter_values = parameter_values.copy() \ No newline at end of file diff --git a/tests/Simulation.py b/tests/Simulation.py new file mode 100644 index 000000000..01998fbc8 --- /dev/null +++ b/tests/Simulation.py @@ -0,0 +1,15 @@ +import pybop +import pybamm +import numpy as np + +# Form example measurement data +measured_expirement = np.ones([2,30]) +current_interpolant = pybamm.Interpolant(measured_expirement[:, 0], measured_expirement[:, 1], pybamm.t) + +# Form model +model = pybop.BaseSPM() +param = model.default_parameter_values +param["Current function [A]"] = current_interpolant + +# Form simulation +sim = pybop.Simulation(model, initial_parameter_values=param) \ No newline at end of file From 93f8841b8e0c2065eb7a6f33a8bca51dfd618ae3 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 28 Jul 2023 11:22:40 +0100 Subject: [PATCH 011/210] Add properties to Simulation class, Updt. test --- pybop/simulation.py | 103 +++++++++++++++++++++++++++++++++++++------- tests/Simulation.py | 26 ++++++++--- 2 files changed, 108 insertions(+), 21 deletions(-) diff --git a/pybop/simulation.py b/pybop/simulation.py index c81f4f61b..c261cecd3 100644 --- a/pybop/simulation.py +++ b/pybop/simulation.py @@ -1,5 +1,6 @@ import pybamm import numpy as np +import copy import pickle import sys from functools import lru_cache @@ -26,7 +27,7 @@ def is_notebook(): class Simulation: """ - This class constructs the PyBOP simulation class. It was built off the PyBaMM simulation class. + This class constructs the PyBOP simulation class. It was initially built from the PyBaMM simulation class. Parameters: ================ @@ -320,6 +321,19 @@ def solve( self._solution = solver.solve(self.built_model, t_eval, **kwargs) return self.solution + + def _get_esoh_solver(self, calc_esoh): + if ( + calc_esoh is False + or isinstance(self.model, pybamm.lead_acid.BaseModel) + or isinstance(self.model, pybamm.equivalent_circuit.Thevenin) + or self.model.options["working electrode"] != "both" + ): + return None + + return pybamm.lithium_ion.ElectrodeSOHSolver( + self.parameter_values, self.model.param + ) def save(self, filename): """Save simulation using pickle""" @@ -349,27 +363,86 @@ def save(self, filename): with open(filename, "wb") as f: pickle.dump(self, f, pickle.HIGHEST_PROTOCOL) - def _get_esoh_solver(self, calc_esoh): - if ( - calc_esoh is False - or isinstance(self.model, pybamm.lead_acid.BaseModel) - or isinstance(self.model, pybamm.equivalent_circuit.Thevenin) - or self.model.options["working electrode"] != "both" - ): - return None - - return pybamm.lithium_ion.ElectrodeSOHSolver( - self.parameter_values, self.model.param - ) - def load_sim(filename): """Load a saved simulation""" return pybamm.load(filename) + @property + def model(self): + return self._model + + @model.setter + def model(self, model): + self._model = copy.copy(model) + + @property + def model_with_set_params(self): + return self._model_with_set_params + + @property + def built_model(self): + return self._built_model + + @property + def geometry(self): + return self._geometry + + @geometry.setter + def geometry(self, geometry): + self._geometry = geometry.copy() + @property def parameter_values(self): return self._parameter_values @parameter_values.setter def parameter_values(self, parameter_values): - self._parameter_values = parameter_values.copy() \ No newline at end of file + self._parameter_values = parameter_values.copy() + + @property + def submesh_types(self): + return self._submesh_types + + @submesh_types.setter + def submesh_types(self, submesh_types): + self._submesh_types = submesh_types.copy() + + @property + def mesh(self): + return self._mesh + + @property + def var_pts(self): + return self._var_pts + + @var_pts.setter + def var_pts(self, var_pts): + self._var_pts = var_pts.copy() + + @property + def spatial_methods(self): + return self._spatial_methods + + @spatial_methods.setter + def spatial_methods(self, spatial_methods): + self._spatial_methods = spatial_methods.copy() + + @property + def solver(self): + return self._solver + + @solver.setter + def solver(self, solver): + self._solver = solver.copy() + + @property + def output_variables(self): + return self._output_variables + + @output_variables.setter + def output_variables(self, output_variables): + self._output_variables = copy.copy(output_variables) + + @property + def solution(self): + return self._solution \ No newline at end of file diff --git a/tests/Simulation.py b/tests/Simulation.py index 01998fbc8..60f4364eb 100644 --- a/tests/Simulation.py +++ b/tests/Simulation.py @@ -2,14 +2,28 @@ import pybamm import numpy as np -# Form example measurement data -measured_expirement = np.ones([2,30]) -current_interpolant = pybamm.Interpolant(measured_expirement[:, 0], measured_expirement[:, 1], pybamm.t) +# Form list of applied current +measured_expirement = [np.arange(0,3,0.1),np.ones([30])] +current_interpolant = pybamm.Interpolant(measured_expirement[0], measured_expirement[1], pybamm.t) -# Form model +# Create model & add applied current model = pybop.BaseSPM() param = model.default_parameter_values param["Current function [A]"] = current_interpolant -# Form simulation -sim = pybop.Simulation(model, initial_parameter_values=param) \ No newline at end of file +# Form initial data +sim = pybop.Simulation(model, initial_parameter_values=param) +sim.solve() + +# Method to parameterise and run the forward model +def forward(x): + sim.parameter_values.update( + { "Electrode height [m]": x[0], + "Negative particle radius [m]": x[1], + "Positive particle radius [m]": x[2] + } + ) + sol = sim.solve()["Voltage [V]"].data + return sol + +V_out = forward([0.065, 0.2e-6, 0.2e-5]) From c91d2a8a5759381f89b15f96419b9947187627cb Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Mon, 31 Jul 2023 10:02:17 +0100 Subject: [PATCH 012/210] Black format, Add NLOpt optimisation class & dependancies, Updt. BaseOptimise --- {tests => examples}/Simulation.py | 2 +- pybop/__init__.py | 4 +-- pybop/cost_functions/mle.py | 10 +++--- pybop/models/base_model.py | 8 ++--- pybop/models/spm.py | 1 + pybop/optimisation/base_optimisation.py | 39 +++++++++++++-------- pybop/optimisation/nlopt_opt.py | 46 +++++++++++++++++++++++++ pybop/plotting/quick_plot.py | 19 +++++----- pybop/simulation.py | 36 ++++++++++--------- pybop/version.py | 2 +- setup.py | 1 + 11 files changed, 114 insertions(+), 54 deletions(-) rename {tests => examples}/Simulation.py (95%) create mode 100644 pybop/optimisation/nlopt_opt.py diff --git a/tests/Simulation.py b/examples/Simulation.py similarity index 95% rename from tests/Simulation.py rename to examples/Simulation.py index 60f4364eb..0fdc2bca3 100644 --- a/tests/Simulation.py +++ b/examples/Simulation.py @@ -26,4 +26,4 @@ def forward(x): sol = sim.solve()["Voltage [V]"].data return sol -V_out = forward([0.065, 0.2e-6, 0.2e-5]) +V_out = forward([0.065, 0.2e-6, 0.2e-5]) \ No newline at end of file diff --git a/pybop/__init__.py b/pybop/__init__.py index 5841d37d3..5748ab3e7 100644 --- a/pybop/__init__.py +++ b/pybop/__init__.py @@ -31,7 +31,7 @@ from .models.base_model import BaseModel from .models.spm import BaseSPM -# +# # Simulation class # from .simulation import Simulation @@ -39,4 +39,4 @@ # # Remove any imported modules, so we don't expose them as part of pybop # -del sys \ No newline at end of file +del sys diff --git a/pybop/cost_functions/mle.py b/pybop/cost_functions/mle.py index 48f8b48da..6e2268c15 100644 --- a/pybop/cost_functions/mle.py +++ b/pybop/cost_functions/mle.py @@ -1,18 +1,18 @@ -class CostFunction(): +class CostFunction: """ Base class for cost function definition. """ def __init__(): - """" + """ " + + Init. - Init. - """ def MLE(self, x0, x_hat, theta): """ - + Function for Maximum Likelihood Estimation """ diff --git a/pybop/models/base_model.py b/pybop/models/base_model.py index 63f31ebda..100e99a24 100644 --- a/pybop/models/base_model.py +++ b/pybop/models/base_model.py @@ -1,10 +1,11 @@ from pybamm.models.base_model import BaseModel + class BaseModel(BaseModel): - """ + """ This is a wrapper class for the PyBaMM Model class. - + """ def __init__(self): @@ -15,10 +16,9 @@ def __init__(self): """ self.name = "BaseModel" - def update(self, k): """ Updater """ - print(k) \ No newline at end of file + print(k) diff --git a/pybop/models/spm.py b/pybop/models/spm.py index 65abd2092..a29fa0cba 100644 --- a/pybop/models/spm.py +++ b/pybop/models/spm.py @@ -1,6 +1,7 @@ import pybamm from .base_model import BaseModel + class BaseSPM(pybamm.models.full_battery_models.lithium_ion.BasicSPM): """ diff --git a/pybop/optimisation/base_optimisation.py b/pybop/optimisation/base_optimisation.py index 940e168fb..2fa16d5a7 100644 --- a/pybop/optimisation/base_optimisation.py +++ b/pybop/optimisation/base_optimisation.py @@ -1,27 +1,38 @@ import pybop -class BaseOptimisation: + +class BaseOptimisation(object): """ - + Base class for the optimisation methods. - + """ - def __init__(self, Simulation): + def __init__(self): + self.name = "Base Optimisation" + def optimise(self, cost_function, method=None, x0=None, bounds=None, options=None): """ + Optimise method to be overloaded by child classes. - Initialise and name class. - """ - self.name = "Base Optimisation" - self.Simulation = Simulation.copy() + # Set up optimisation + self.cost_function = cost_function + self.x0 = x0 or cost_function.x0 + self.options = options + self.method = method or cost_function.default_method + self.bounds = bounds or cost_function.bounds + + # Run optimisation + result = self._runoptimise( + cost_function, self.method, self.x0, self.bounds, self.options + ) + return result + def _runoptimise(self, cost_function, method, x0, bounds, options): + """ + Run optimisation method, to be overloaded by child classes. - # def NelderMead(self, fun, x0, options): - # """ - # PyBOP optimiser using Nelder-Mead. - # """ - # res = scipy.optimize(fun, x0, method='nelder-mead', - # options={'xatol': 1e-8, 'disp': True}) \ No newline at end of file + """ + pass diff --git a/pybop/optimisation/nlopt_opt.py b/pybop/optimisation/nlopt_opt.py new file mode 100644 index 000000000..16f88a0f0 --- /dev/null +++ b/pybop/optimisation/nlopt_opt.py @@ -0,0 +1,46 @@ +import pybop +import nlopt + + +class nlopt_opt(pybop.BaseOptimisation): + """ + Wrapper class for the NLOpt optimisation class. Extends the BaseOptimisation class. + """ + + def __init__(self, cost_function, method, x0, bounds, options): + super().__init__() + self.cost_function = cost_function + self.method = method + self.x0 = x0 or cost_function.x0 + self.bounds = bounds or cost_function.bounds + self.options = options + self.name = "NLOpt Optimisation" + + def _runoptimise(cost_function, method, x0, bounds, options): + """ + Run the NLOpt opt method. + + Parameters + ---------- + cost_function: function for optimising + method: optimisation method + x0: Initialisation array + options: options dictionary + bounds: bounds array + """ + if options.xtol != None: + opt.set_xtol_rel(options.xtol) + + if method != None: + opt = nlopt.opt(method, len(x0)) + else: + opt = nlopt.opt(nlopt.LN_BOBYQA, len(x0)) + + opt.set_min_objective(cost_function) + + opt.set_lower_bounds(bounds.lower) + opt.set_upper_bounds(bounds.upper) + results = opt.optimize(cost_function) + num_evals = opt.get_numevals() + + return results, opt.last_optimum_value(), num_evals diff --git a/pybop/plotting/quick_plot.py b/pybop/plotting/quick_plot.py index 3d83c8d3a..e36bed225 100644 --- a/pybop/plotting/quick_plot.py +++ b/pybop/plotting/quick_plot.py @@ -2,27 +2,26 @@ import numpy import matplotlib -class QuickPlot(): + +class QuickPlot: """ - - Class to generate plots with standard variables and formatting. + + Class to generate plots with standard variables and formatting. Plots -------------- Observability - if method == parameterisation - + if method == parameterisation + Comparison of fitting data with optimised forward model - + elseif method == optimisation - + Pareto front Alternative solutions - Initial value compared to optimal + Initial value compared to optimal """ def __init__(self): self.name = "Quick Plot" - - diff --git a/pybop/simulation.py b/pybop/simulation.py index c261cecd3..133a41239 100644 --- a/pybop/simulation.py +++ b/pybop/simulation.py @@ -23,15 +23,16 @@ def is_notebook(): return False # Other type (?) except NameError: return False # Probably standard Python interpreter - + + class Simulation: """ - + This class constructs the PyBOP simulation class. It was initially built from the PyBaMM simulation class. Parameters: ================ - + """ @@ -48,8 +49,10 @@ def __init__( output_variables=None, C_rate=None, ): - self.parameter_values = initial_parameter_values or model.default_parameter_values - + self.parameter_values = ( + initial_parameter_values or model.default_parameter_values + ) + # Check to see that current is provided as a drive_cycle current = self._parameter_values.get("Current function [A]") if isinstance(current, pybamm.Interpolant): @@ -70,7 +73,7 @@ def __init__( "measured_experiment must be drive_cycle or C_rate with" "matching sampling frequency between t_eval and measured data" ) - + self._unprocessed_model = model self.model = model self.geometry = geometry or self.model.default_geometry @@ -98,10 +101,10 @@ def __init__( warnings.filterwarnings("ignore") self.get_esoh_solver = lru_cache()(self._get_esoh_solver) - + def set_parameters(self): """ - Setter for parameter values + Setter for parameter values Inputs: ============ @@ -116,7 +119,6 @@ def set_parameters(self): self._parameter_values.process_geometry(self.geometry) self.model = self._model_with_set_params - def build(self, check_model=True, initial_soc=None): """ A method to build the model into a system of matrices and vectors suitable for @@ -186,7 +188,7 @@ def plot(self, output_variables=None, **kwargs): ) return self.quick_plot - + def create_gif(self, number_of_images=80, duration=0.1, output_filename="plot.gif"): """ Create a gif of the parameterisation steps created by :meth:`pybamm.Simulation.plot`. @@ -204,13 +206,13 @@ def create_gif(self, number_of_images=80, duration=0.1, output_filename="plot.gi if self.quick_plot is None: self.quick_plot = pybamm.QuickPlot(self._solution) - #create_git needs to be updated + # create_git needs to be updated self.quick_plot.create_gif( number_of_images=number_of_images, duration=duration, output_filename=output_filename, ) - + def solve( self, t_eval=None, @@ -334,7 +336,7 @@ def _get_esoh_solver(self, calc_esoh): return pybamm.lithium_ion.ElectrodeSOHSolver( self.parameter_values, self.model.param ) - + def save(self, filename): """Save simulation using pickle""" if self.model.convert_to_format == "python": @@ -366,7 +368,7 @@ def save(self, filename): def load_sim(filename): """Load a saved simulation""" return pybamm.load(filename) - + @property def model(self): return self._model @@ -378,11 +380,11 @@ def model(self, model): @property def model_with_set_params(self): return self._model_with_set_params - + @property def built_model(self): return self._built_model - + @property def geometry(self): return self._geometry @@ -445,4 +447,4 @@ def output_variables(self, output_variables): @property def solution(self): - return self._solution \ No newline at end of file + return self._solution diff --git a/pybop/version.py b/pybop/version.py index b3c06d488..f102a9cad 100644 --- a/pybop/version.py +++ b/pybop/version.py @@ -1 +1 @@ -__version__ = "0.0.1" \ No newline at end of file +__version__ = "0.0.1" diff --git a/setup.py b/setup.py index d360d3035..42d1d101f 100644 --- a/setup.py +++ b/setup.py @@ -36,6 +36,7 @@ "scipy>=1.3", "pandas>=0.24", "casadi>=3.6.0", + "nlopt>=2.6", ], # https://pypi.org/classifiers/ classifiers=[], From 91f4a95b26dacfffa99a6e7943d5621792fb5f5d Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Mon, 31 Jul 2023 17:11:24 +0100 Subject: [PATCH 013/210] Updt. Module API, Refactor cost_function implementaion, Add example API script --- examples/NLOpt_kinetics.py | 39 ++++++++++++ examples/Simulation.py | 2 +- pybop/__init__.py | 29 +++++++-- pybop/cost_functions/mle.py | 18 ------ pybop/cost_functions/rmse.py | 11 ---- pybop/{cost_functions => models}/__init__.py | 0 pybop/models/base_model.py | 24 ------- pybop/models/lithium_ion/__init__.py | 5 ++ pybop/models/lithium_ion/spm.py | 14 ++++ pybop/models/spm.py | 13 ---- pybop/observations.py | 19 ++++++ pybop/optimisation/nlopt_opt.py | 21 +++--- pybop/parameterisation.py | 67 ++++++++++++++++++++ pybop/parameters.py | 19 ++++++ pybop/utils.py | 11 ++++ 15 files changed, 208 insertions(+), 84 deletions(-) create mode 100644 examples/NLOpt_kinetics.py delete mode 100644 pybop/cost_functions/mle.py delete mode 100644 pybop/cost_functions/rmse.py rename pybop/{cost_functions => models}/__init__.py (100%) delete mode 100644 pybop/models/base_model.py create mode 100644 pybop/models/lithium_ion/__init__.py create mode 100644 pybop/models/lithium_ion/spm.py delete mode 100644 pybop/models/spm.py create mode 100644 pybop/observations.py create mode 100644 pybop/parameterisation.py create mode 100644 pybop/parameters.py create mode 100644 pybop/utils.py diff --git a/examples/NLOpt_kinetics.py b/examples/NLOpt_kinetics.py new file mode 100644 index 000000000..85c1c6992 --- /dev/null +++ b/examples/NLOpt_kinetics.py @@ -0,0 +1,39 @@ +import pybop +import numpy as np + +# Form observations +applied_current = [np.arange(0,3,0.1),np.ones([30])] +observation = [ + pybop.Observed(["Current function [A]"], applied_current), + pybop.Observed(["Voltage [V]"], np.ones([30]) * 4.0) +] + +# Create model & initial parameter set +model = pybop.models.lithium_ion.SPM() +param = model.pybamm_model.default_parameter_values # or pybop.ParameterValues("Chen2020") + +# Fitting parameters +param = ( + pybop.Parameter("Electrode height [m]", prior = pybop.Normal(0,1)) + pybop.Parameter("Negative particle radius [m]", prior = pybop.Uniform(0,1)) + pybop.Parameter("Postive particle radius", prior = pybop.Uniform(0,1)) +) + +parameterisation = pybop.Parameterisation(model, observation=observation, parameters=param) + +# get RMSE estimate +parameterisation.rmse() + +# get MAP estimate, starting at a random initial point in parameter space +parameterisation.map(x0=[p.sample() for p in parameters]) + +# or sample from posterior +paramterisation.sample(1000, n_chains=4, ....) + +# or SOBER +parameterisation.sober() + + +#Optimisation = pybop.optimisation(model, cost=cost, parameters=parameters, observation=observation) + + diff --git a/examples/Simulation.py b/examples/Simulation.py index 0fdc2bca3..e991d49f1 100644 --- a/examples/Simulation.py +++ b/examples/Simulation.py @@ -4,7 +4,7 @@ # Form list of applied current measured_expirement = [np.arange(0,3,0.1),np.ones([30])] -current_interpolant = pybamm.Interpolant(measured_expirement[0], measured_expirement[1], pybamm.t) +current_interpolant = pybamm.Interpolant(measured_expirement[0], measured_expirement[1], variable="time") # Create model & add applied current model = pybop.BaseSPM() diff --git a/pybop/__init__.py b/pybop/__init__.py index 5748ab3e7..c109247bb 100644 --- a/pybop/__init__.py +++ b/pybop/__init__.py @@ -2,8 +2,8 @@ # Root of the pybop module. # Provides access to all shared functionality (models, solvers, etc.). # -# The code in this file is adapted from pybamm -# (see https://github.com/pybamm-team/pybamm) +# The code in this file is adapted from Pints +# (see https://github.com/pints-team/pints) # import sys @@ -28,13 +28,30 @@ # # Model Classes # -from .models.base_model import BaseModel -from .models.spm import BaseSPM +from .models import lithium_ion # -# Simulation class +# Parameterisation class # -from .simulation import Simulation + +from .parameterisation import Parameterisation +from .parameters import Parameter + +# +# Observation class +# +from .observations import Observed + +# +# Optimisation class +# +from .optimisation.base_optimisation import BaseOptimisation +from .optimisation.nlopt_opt import nlopt_opt + +# +# Utility classes and methods +# +from .utils import Interpolant # # Remove any imported modules, so we don't expose them as part of pybop diff --git a/pybop/cost_functions/mle.py b/pybop/cost_functions/mle.py deleted file mode 100644 index 6e2268c15..000000000 --- a/pybop/cost_functions/mle.py +++ /dev/null @@ -1,18 +0,0 @@ -class CostFunction: - """ - Base class for cost function definition. - """ - - def __init__(): - """ " - - Init. - - """ - - def MLE(self, x0, x_hat, theta): - """ - - Function for Maximum Likelihood Estimation - - """ diff --git a/pybop/cost_functions/rmse.py b/pybop/cost_functions/rmse.py deleted file mode 100644 index 4b52bf250..000000000 --- a/pybop/cost_functions/rmse.py +++ /dev/null @@ -1,11 +0,0 @@ -# Root Mean Square Cost Function - -import numpy as np -import pybop - -def RMSE(x, y, grad, minV, params, model, experiment, observation): - yhat = minV * np.ones(len(y)) - params.update({"Electrode height [m]": x[0], "Negative particle radius [m]": x[1], "Positive particle radius [m]": x[2]}) - yhat_temp = pybop.simulation(model, experiment=experiment, parameter_values=params, observation=observation) - yhat[:len(yhat_temp)] = yhat_temp - return np.sqrt(sum((yhat - y)) ** 2) \ No newline at end of file diff --git a/pybop/cost_functions/__init__.py b/pybop/models/__init__.py similarity index 100% rename from pybop/cost_functions/__init__.py rename to pybop/models/__init__.py diff --git a/pybop/models/base_model.py b/pybop/models/base_model.py deleted file mode 100644 index 100e99a24..000000000 --- a/pybop/models/base_model.py +++ /dev/null @@ -1,24 +0,0 @@ -from pybamm.models.base_model import BaseModel - - -class BaseModel(BaseModel): - """ - - This is a wrapper class for the PyBaMM Model class. - - """ - - def __init__(self): - """ - - Insert initialisation code as needed. - - """ - - self.name = "BaseModel" - - def update(self, k): - """ - Updater - """ - print(k) diff --git a/pybop/models/lithium_ion/__init__.py b/pybop/models/lithium_ion/__init__.py new file mode 100644 index 000000000..bd2bf037b --- /dev/null +++ b/pybop/models/lithium_ion/__init__.py @@ -0,0 +1,5 @@ +# +# Import lithium ion based models +# + +from .spm import SPM diff --git a/pybop/models/lithium_ion/spm.py b/pybop/models/lithium_ion/spm.py new file mode 100644 index 000000000..367596ddd --- /dev/null +++ b/pybop/models/lithium_ion/spm.py @@ -0,0 +1,14 @@ +import pybop +import pybamm + + +class SPM: + """ + + Composition of the SPM class in PyBaMM. + + """ + + def __init__(self): + self.pybamm_model = pybamm.lithium_ion.SPM() + self.name = "Single Particle Model" diff --git a/pybop/models/spm.py b/pybop/models/spm.py deleted file mode 100644 index a29fa0cba..000000000 --- a/pybop/models/spm.py +++ /dev/null @@ -1,13 +0,0 @@ -import pybamm -from .base_model import BaseModel - - -class BaseSPM(pybamm.models.full_battery_models.lithium_ion.BasicSPM): - """ - - Inherites from the BasicSPM class in PyBaMM - - """ - - def __init__(self): - super().__init__() diff --git a/pybop/observations.py b/pybop/observations.py new file mode 100644 index 000000000..cc0188209 --- /dev/null +++ b/pybop/observations.py @@ -0,0 +1,19 @@ +import pybop +import pybamm +import numpy as np + + +class Observed: + """ + Class for experimental Observations. + """ + + def __init__(self, name, data): + self.name = name + self.data = data + + def Interpolant(self): + if self.variable == "time": + self.Interpolant = pybamm.Interpolant(self.x, self.y, pybamm.t) + else: + NotImplementedError("Only time interpolation is supported") diff --git a/pybop/optimisation/nlopt_opt.py b/pybop/optimisation/nlopt_opt.py index 16f88a0f0..b7817d861 100644 --- a/pybop/optimisation/nlopt_opt.py +++ b/pybop/optimisation/nlopt_opt.py @@ -16,7 +16,7 @@ def __init__(self, cost_function, method, x0, bounds, options): self.options = options self.name = "NLOpt Optimisation" - def _runoptimise(cost_function, method, x0, bounds, options): + def _runoptimise(self): """ Run the NLOpt opt method. @@ -28,19 +28,18 @@ def _runoptimise(cost_function, method, x0, bounds, options): options: options dictionary bounds: bounds array """ - if options.xtol != None: - opt.set_xtol_rel(options.xtol) + if self.options.xtol is not None: + opt.set_xtol_rel(self.options.xtol) - if method != None: - opt = nlopt.opt(method, len(x0)) + if self.method is not None: + opt = nlopt.opt(self.method, len(self.x0)) else: - opt = nlopt.opt(nlopt.LN_BOBYQA, len(x0)) + opt = nlopt.opt(nlopt.LN_BOBYQA, len(self.x0)) - opt.set_min_objective(cost_function) - - opt.set_lower_bounds(bounds.lower) - opt.set_upper_bounds(bounds.upper) - results = opt.optimize(cost_function) + opt.set_min_objective(self.cost_function) + opt.set_lower_bounds(self.bounds.lower) + opt.set_upper_bounds(self.bounds.upper) + results = opt.optimize(self.cost_function) num_evals = opt.get_numevals() return results, opt.last_optimum_value(), num_evals diff --git a/pybop/parameterisation.py b/pybop/parameterisation.py new file mode 100644 index 000000000..60227d87e --- /dev/null +++ b/pybop/parameterisation.py @@ -0,0 +1,67 @@ +import pybop +import pybamm +import numpy as np + + +class Parameterisation: + """ + Parameterisation class for pybop. + """ + + def __init__(self, model, observations, parameters, x0=None): + self.model = model + self.parameters = parameters + self.observations = observations + self.default_parameters = ( + parameters.default_parameters + or self.model.pybamm_model.default_parameter_values + ) + + if x0 is None: + self.x0 = np.zeros(len(self.parameters)) + + # To Do: + # Split observations into forward model inputs/outputs + # checks on observations and parameters + + self.sim = pybop.Simulation( + self.model.pybamm_model, parameter_values=self.default_parameters + ) + + def map(self, x0): + """ + Max a posteriori estimation. + """ + pass + + def sample(self, n_chains): + """ + Sample from the posterior distribution. + """ + pass + + def rmse(self, method=None): + """ + Calculate the root mean squared error. + """ + + def step(x): + self.parameters.update(lambda x: {p: x[i] for i, p in self.parameters}) + y_hat = self.sim.solve()["Terminal voltage [V]"].data + return np.sqrt(np.mean((self.observations["Voltage [V]"] - y_hat) ** 2)) + + if method == "nlopt": + results = pybop.opt.nlopt( + step, self.x0, self.parameters.bounds, self.options + ) + else: + results = pybop.opt.scipy( + step, self.x0, self.parameters.bounds, self.options + ) + return results + + def mle(self, method): + """ + Maximum likelihood estimation. + """ + pass diff --git a/pybop/parameters.py b/pybop/parameters.py new file mode 100644 index 000000000..f7ee3d8a2 --- /dev/null +++ b/pybop/parameters.py @@ -0,0 +1,19 @@ +import pybop +import pybamm + + +class Parameter: + """ "" + Class for creating parameters in pybop. + """ + + def __init__(self, param, prior=None, bounds=None): + self.name = param + self.prior = prior + self.bounds = bounds + + # To Do: + # priors implementation + # parameter check + # bounds checks and set defaults + # implement methods to assign and retrieve parameters diff --git a/pybop/utils.py b/pybop/utils.py new file mode 100644 index 000000000..5312634da --- /dev/null +++ b/pybop/utils.py @@ -0,0 +1,11 @@ +import pybop +import pybamm + + +class Interpolant: + def __init__(self, x, y, variable): + self.name = "Interpolant" + if variable == "time": + self.Interpolant = pybamm.Interpolant(x, y, pybamm.t) + else: + NotImplementedError("Only time interpolation is supported") From 3b7a2dc61d1218ba12bce24458c4c04ffdd8f3a1 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Tue, 1 Aug 2023 13:50:05 +0100 Subject: [PATCH 014/210] Add priors definition, Initial scipy optimisation class --- pybop/__init__.py | 5 +++ pybop/observations.py | 2 +- pybop/optimisation/scipy_opt.py | 39 +++++++++++++++++ pybop/parameterisation.py | 10 ++--- pybop/parameters.py | 3 ++ pybop/priors.py | 76 +++++++++++++++++++++++++++++++++ 6 files changed, 129 insertions(+), 6 deletions(-) create mode 100644 pybop/optimisation/scipy_opt.py create mode 100644 pybop/priors.py diff --git a/pybop/__init__.py b/pybop/__init__.py index c109247bb..827de08b7 100644 --- a/pybop/__init__.py +++ b/pybop/__init__.py @@ -42,6 +42,11 @@ # from .observations import Observed +# +# Priors class +# +from .priors import Gaussian, Uniform, Exponential + # # Optimisation class # diff --git a/pybop/observations.py b/pybop/observations.py index cc0188209..7ac41a801 100644 --- a/pybop/observations.py +++ b/pybop/observations.py @@ -11,7 +11,7 @@ class Observed: def __init__(self, name, data): self.name = name self.data = data - + def Interpolant(self): if self.variable == "time": self.Interpolant = pybamm.Interpolant(self.x, self.y, pybamm.t) diff --git a/pybop/optimisation/scipy_opt.py b/pybop/optimisation/scipy_opt.py new file mode 100644 index 000000000..8c4f98cb6 --- /dev/null +++ b/pybop/optimisation/scipy_opt.py @@ -0,0 +1,39 @@ +import pybop +from scipy.optimize import minimize + + +class scipy_opt(pybop.BaseOptimisation): + """ + Wrapper class for the Scipy optimisation class. Extends the BaseOptimisation class. + """ + + def __init__(self, cost_function, x0, bounds=None, options=None): + super().__init__() + self.cost_function = cost_function + self.method = options.optmethod + self.x0 = x0 or cost_function.x0 + self.bounds = bounds + self.options = options + self.name = "Scipy Optimisation" + + def _runoptimise(self): + """ + Run the Scipy opt method. + + Parameters + ---------- + cost_function: function for optimising + method: optimisation method + x0: Initialisation array + options: options dictionary + bounds: bounds array + """ + + if self.method is not None and self.bounds is not None: + opt = minimize(self.cost_function, self.x0, method = self.method, bounds = self.bounds) + elif self.method is not None: + opt = minimize(self.cost_function, self.x0, method = self.method) + else: + opt = minimize(self.cost_function, self.x0, method = 'BFGS') + + return opt diff --git a/pybop/parameterisation.py b/pybop/parameterisation.py index 60227d87e..0c85679b1 100644 --- a/pybop/parameterisation.py +++ b/pybop/parameterisation.py @@ -8,21 +8,21 @@ class Parameterisation: Parameterisation class for pybop. """ - def __init__(self, model, observations, parameters, x0=None): + def __init__(self, model, observations, parameters, x0=None, options=None): self.model = model self.parameters = parameters self.observations = observations + self.options = options self.default_parameters = ( parameters.default_parameters or self.model.pybamm_model.default_parameter_values ) - - if x0 is None: - self.x0 = np.zeros(len(self.parameters)) - # To Do: # Split observations into forward model inputs/outputs # checks on observations and parameters + + if x0 is None: + self.x0 = np.zeros(len(self.parameters)) self.sim = pybop.Simulation( self.model.pybamm_model, parameter_values=self.default_parameters diff --git a/pybop/parameters.py b/pybop/parameters.py index f7ee3d8a2..06f8748fa 100644 --- a/pybop/parameters.py +++ b/pybop/parameters.py @@ -17,3 +17,6 @@ def __init__(self, param, prior=None, bounds=None): # parameter check # bounds checks and set defaults # implement methods to assign and retrieve parameters + + def __repr__(self): + return f"Parameter: {self.name} \n Prior: {self.prior} \n Bounds: {self.bounds}" diff --git a/pybop/priors.py b/pybop/priors.py new file mode 100644 index 000000000..d8f073da4 --- /dev/null +++ b/pybop/priors.py @@ -0,0 +1,76 @@ +import pybop +import numpy as np +import scipy.stats as stats + + +class Gaussian: + """ + Gaussian prior class. + """ + + def __init__(self, mean, sigma): + self.name = "Gaussian" + self.mean = mean + self.sigma = sigma + + def pdf(self, x): + return stats.norm.pdf(x, loc=self.mean, scale=self.sigma) + + def logpdf(self, x): + return stats.norm.logpdf(x, loc=self.mean, scale=self.sigma) + + def rvs(self, size): + if size < 0: + raise ValueError("size must be positive") + else: + return stats.norm.rvs(loc=self.mean, scale=self.sigma, size=size) + + def __repr__(self): + return f"{self.name}, mean: {self.mean}, sigma: {self.sigma}" + +class Uniform: + """ + Uniform prior class. + """ + + def __init__(self, lower, upper): + self.name = "Uniform" + self.lower = lower + self.upper = upper + + def pdf(self, x): + return stats.uniform.pdf(x, loc=self.lower, scale=self.upper - self.lower) + + def logpdf(self, x): + return stats.uniform.logpdf(x, loc=self.lower, scale=self.upper - self.lower) + + def rvs(self, size): + if size < 0: + raise ValueError("size must be positive") + else: + return stats.uniform.rvs(loc=self.lower, scale=self.upper - self.lower, size=size) + def __repr__(self): + return f"{self.name}, lower: {self.lower}, upper: {self.upper}" + +class Exponential: + """ + exponential prior class. + """ + + def __init__(self, scale): + self.name = "Exponential" + self.scale = scale + + def pdf(self, x): + return stats.expon.pdf(x, scale=self.scale) + + def logpdf(self, x): + return stats.expon.logpdf(x, scale=self.scale) + + def rvs(self, size): + if size < 0: + raise ValueError("size must be positive") + else: + return stats.expon.rvs(scale=self.scale, size=size) + def __repr__(self): + return f"{self.name}, scale: {self.scale}" \ No newline at end of file From bf861d13381c2cc64100f67e74c52b6e02e6bdd7 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Tue, 1 Aug 2023 14:07:21 +0100 Subject: [PATCH 015/210] Add black formatting --- examples/NLOpt_kinetics.py | 8 +++----- pybop/optimisation/scipy_opt.py | 12 +++++++----- pybop/parameterisation.py | 2 +- pybop/priors.py | 12 +++++++++--- 4 files changed, 20 insertions(+), 14 deletions(-) diff --git a/examples/NLOpt_kinetics.py b/examples/NLOpt_kinetics.py index 85c1c6992..f20be1baa 100644 --- a/examples/NLOpt_kinetics.py +++ b/examples/NLOpt_kinetics.py @@ -14,8 +14,8 @@ # Fitting parameters param = ( - pybop.Parameter("Electrode height [m]", prior = pybop.Normal(0,1)) - pybop.Parameter("Negative particle radius [m]", prior = pybop.Uniform(0,1)) + pybop.Parameter("Electrode height [m]", prior = pybop.Gaussian(0,1)), + pybop.Parameter("Negative particle radius [m]", prior = pybop.Uniform(0,1)), pybop.Parameter("Postive particle radius", prior = pybop.Uniform(0,1)) ) @@ -34,6 +34,4 @@ parameterisation.sober() -#Optimisation = pybop.optimisation(model, cost=cost, parameters=parameters, observation=observation) - - +#Optimisation = pybop.optimisation(model, cost=cost, parameters=parameters, observation=observation) \ No newline at end of file diff --git a/pybop/optimisation/scipy_opt.py b/pybop/optimisation/scipy_opt.py index 8c4f98cb6..0073ac3d1 100644 --- a/pybop/optimisation/scipy_opt.py +++ b/pybop/optimisation/scipy_opt.py @@ -28,12 +28,14 @@ def _runoptimise(self): options: options dictionary bounds: bounds array """ - + if self.method is not None and self.bounds is not None: - opt = minimize(self.cost_function, self.x0, method = self.method, bounds = self.bounds) - elif self.method is not None: - opt = minimize(self.cost_function, self.x0, method = self.method) + opt = minimize( + self.cost_function, self.x0, method=self.method, bounds=self.bounds + ) + elif self.method is not None: + opt = minimize(self.cost_function, self.x0, method=self.method) else: - opt = minimize(self.cost_function, self.x0, method = 'BFGS') + opt = minimize(self.cost_function, self.x0, method="BFGS") return opt diff --git a/pybop/parameterisation.py b/pybop/parameterisation.py index 0c85679b1..d0581258a 100644 --- a/pybop/parameterisation.py +++ b/pybop/parameterisation.py @@ -20,7 +20,7 @@ def __init__(self, model, observations, parameters, x0=None, options=None): # To Do: # Split observations into forward model inputs/outputs # checks on observations and parameters - + if x0 is None: self.x0 = np.zeros(len(self.parameters)) diff --git a/pybop/priors.py b/pybop/priors.py index d8f073da4..b23f2c38e 100644 --- a/pybop/priors.py +++ b/pybop/priors.py @@ -24,10 +24,11 @@ def rvs(self, size): raise ValueError("size must be positive") else: return stats.norm.rvs(loc=self.mean, scale=self.sigma, size=size) - + def __repr__(self): return f"{self.name}, mean: {self.mean}, sigma: {self.sigma}" + class Uniform: """ Uniform prior class. @@ -48,10 +49,14 @@ def rvs(self, size): if size < 0: raise ValueError("size must be positive") else: - return stats.uniform.rvs(loc=self.lower, scale=self.upper - self.lower, size=size) + return stats.uniform.rvs( + loc=self.lower, scale=self.upper - self.lower, size=size + ) + def __repr__(self): return f"{self.name}, lower: {self.lower}, upper: {self.upper}" + class Exponential: """ exponential prior class. @@ -72,5 +77,6 @@ def rvs(self, size): raise ValueError("size must be positive") else: return stats.expon.rvs(scale=self.scale, size=size) + def __repr__(self): - return f"{self.name}, scale: {self.scale}" \ No newline at end of file + return f"{self.name}, scale: {self.scale}" From 0fda9f50db707c95859c67d42a5b21cbee1eb87e Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Tue, 1 Aug 2023 14:56:08 +0100 Subject: [PATCH 016/210] Remove duplicate class, typo --- examples/NLOpt_kinetics.py | 2 +- pybop/utils.py | 11 ----------- 2 files changed, 1 insertion(+), 12 deletions(-) delete mode 100644 pybop/utils.py diff --git a/examples/NLOpt_kinetics.py b/examples/NLOpt_kinetics.py index f20be1baa..201e7f6e2 100644 --- a/examples/NLOpt_kinetics.py +++ b/examples/NLOpt_kinetics.py @@ -19,7 +19,7 @@ pybop.Parameter("Postive particle radius", prior = pybop.Uniform(0,1)) ) -parameterisation = pybop.Parameterisation(model, observation=observation, parameters=param) +parameterisation = pybop.Parameterisation(model, observation=observation, parameters=param) # get RMSE estimate parameterisation.rmse() diff --git a/pybop/utils.py b/pybop/utils.py deleted file mode 100644 index 5312634da..000000000 --- a/pybop/utils.py +++ /dev/null @@ -1,11 +0,0 @@ -import pybop -import pybamm - - -class Interpolant: - def __init__(self, x, y, variable): - self.name = "Interpolant" - if variable == "time": - self.Interpolant = pybamm.Interpolant(x, y, pybamm.t) - else: - NotImplementedError("Only time interpolation is supported") From 2bfa33ba11add0d09ac6bcafbe89f9eac8a8fd55 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Tue, 1 Aug 2023 19:32:36 +0100 Subject: [PATCH 017/210] Syntax & bug fixes, Updt. optimiser & parameterisation classes --- .../{NLOpt_kinetics.py => Initial_API.py} | 17 ++++---- pybop/__init__.py | 12 +++--- pybop/optimisation/base_optimisation.py | 8 ++-- pybop/optimisation/nlopt_opt.py | 6 +-- pybop/parameterisation.py | 40 ++++++++++++------- pybop/parameters.py | 4 +- 6 files changed, 51 insertions(+), 36 deletions(-) rename examples/{NLOpt_kinetics.py => Initial_API.py} (62%) diff --git a/examples/NLOpt_kinetics.py b/examples/Initial_API.py similarity index 62% rename from examples/NLOpt_kinetics.py rename to examples/Initial_API.py index 201e7f6e2..40e5179a6 100644 --- a/examples/NLOpt_kinetics.py +++ b/examples/Initial_API.py @@ -8,27 +8,26 @@ pybop.Observed(["Voltage [V]"], np.ones([30]) * 4.0) ] -# Create model & initial parameter set +# Create model model = pybop.models.lithium_ion.SPM() -param = model.pybamm_model.default_parameter_values # or pybop.ParameterValues("Chen2020") # Fitting parameters -param = ( - pybop.Parameter("Electrode height [m]", prior = pybop.Gaussian(0,1)), - pybop.Parameter("Negative particle radius [m]", prior = pybop.Uniform(0,1)), - pybop.Parameter("Postive particle radius", prior = pybop.Uniform(0,1)) +params = ( + pybop.Parameter("Electrode height [m]", prior = pybop.Gaussian(0,1), bounds = (0,1)), + pybop.Parameter("Negative particle radius [m]", prior = pybop.Uniform(0,1), bounds = (0,1)), + pybop.Parameter("Positive particle radius [m]", prior = pybop.Uniform(0,1), bounds = (0,1)) ) -parameterisation = pybop.Parameterisation(model, observation=observation, parameters=param) +parameterisation = pybop.Parameterisation(model, observations=observation, fit_parameters=params) # get RMSE estimate parameterisation.rmse() # get MAP estimate, starting at a random initial point in parameter space -parameterisation.map(x0=[p.sample() for p in parameters]) +parameterisation.map(x0=[p.sample() for p in params]) # or sample from posterior -paramterisation.sample(1000, n_chains=4, ....) +parameterisation.sample(1000, n_chains=4, ....) # or SOBER parameterisation.sober() diff --git a/pybop/__init__.py b/pybop/__init__.py index 827de08b7..ad1e2317d 100644 --- a/pybop/__init__.py +++ b/pybop/__init__.py @@ -48,15 +48,17 @@ from .priors import Gaussian, Uniform, Exponential # -# Optimisation class +# Simulation class # -from .optimisation.base_optimisation import BaseOptimisation -from .optimisation.nlopt_opt import nlopt_opt +from .simulation import Simulation + # -# Utility classes and methods +# Optimisation class # -from .utils import Interpolant +from .optimisation.base_optimisation import BaseOptimisation +from .optimisation.nlopt_opt import nlopt_opt +from .optimisation.scipy_opt import scipy_opt # # Remove any imported modules, so we don't expose them as part of pybop diff --git a/pybop/optimisation/base_optimisation.py b/pybop/optimisation/base_optimisation.py index 2fa16d5a7..fa16ba865 100644 --- a/pybop/optimisation/base_optimisation.py +++ b/pybop/optimisation/base_optimisation.py @@ -11,17 +11,17 @@ class BaseOptimisation(object): def __init__(self): self.name = "Base Optimisation" - def optimise(self, cost_function, method=None, x0=None, bounds=None, options=None): + def optimise(self, cost_function, x0, method=None, bounds=None, options=None): """ Optimise method to be overloaded by child classes. """ # Set up optimisation self.cost_function = cost_function - self.x0 = x0 or cost_function.x0 + self.x0 = x0 self.options = options - self.method = method or cost_function.default_method - self.bounds = bounds or cost_function.bounds + self.method = method + self.bounds = bounds # Run optimisation result = self._runoptimise( diff --git a/pybop/optimisation/nlopt_opt.py b/pybop/optimisation/nlopt_opt.py index b7817d861..987bbf88c 100644 --- a/pybop/optimisation/nlopt_opt.py +++ b/pybop/optimisation/nlopt_opt.py @@ -7,12 +7,12 @@ class nlopt_opt(pybop.BaseOptimisation): Wrapper class for the NLOpt optimisation class. Extends the BaseOptimisation class. """ - def __init__(self, cost_function, method, x0, bounds, options): + def __init__(self, cost_function, x0, bounds, method=None, options=None): super().__init__() self.cost_function = cost_function self.method = method - self.x0 = x0 or cost_function.x0 - self.bounds = bounds or cost_function.bounds + self.x0 = x0 + self.bounds = bounds self.options = options self.name = "NLOpt Optimisation" diff --git a/pybop/parameterisation.py b/pybop/parameterisation.py index d0581258a..a0528acdc 100644 --- a/pybop/parameterisation.py +++ b/pybop/parameterisation.py @@ -8,24 +8,26 @@ class Parameterisation: Parameterisation class for pybop. """ - def __init__(self, model, observations, parameters, x0=None, options=None): + def __init__(self, model, observations, fit_parameters, x0=None, options=None): self.model = model - self.parameters = parameters + self.fit_parameters = fit_parameters self.observations = observations self.options = options - self.default_parameters = ( - parameters.default_parameters - or self.model.pybamm_model.default_parameter_values - ) + # To Do: # Split observations into forward model inputs/outputs # checks on observations and parameters + if options is not None: + self.parameter_set = options.parameter_set + else: + self.parameter_set = self.model.pybamm_model.default_parameter_values + if x0 is None: - self.x0 = np.zeros(len(self.parameters)) + self.x0 = np.ones(len(self.fit_parameters)) * 0.1 - self.sim = pybop.Simulation( - self.model.pybamm_model, parameter_values=self.default_parameters + self.sim = pybamm.Simulation( + self.model.pybamm_model, parameter_values=self.parameter_set ) def map(self, x0): @@ -46,17 +48,25 @@ def rmse(self, method=None): """ def step(x): - self.parameters.update(lambda x: {p: x[i] for i, p in self.parameters}) + for i in range(len(self.fit_parameters)): + self.sim.parameter_set.update( + { + self.fit_parameters[i] + .name: self.fit_parameters[i] + .prior.rvs(1)[0] + } + ) + y_hat = self.sim.solve()["Terminal voltage [V]"].data return np.sqrt(np.mean((self.observations["Voltage [V]"] - y_hat) ** 2)) if method == "nlopt": - results = pybop.opt.nlopt( - step, self.x0, self.parameters.bounds, self.options + results = pybop.nlopt_opt( + step, self.x0, [p.bounds for p in self.fit_parameters], self.options ) else: - results = pybop.opt.scipy( - step, self.x0, self.parameters.bounds, self.options + results = pybop.scipy_opt.optimise( + step, self.x0, [p.bounds for p in self.fit_parameters], self.options ) return results @@ -65,3 +75,5 @@ def mle(self, method): Maximum likelihood estimation. """ pass + + [p for p in self.fit_parameters] diff --git a/pybop/parameters.py b/pybop/parameters.py index 06f8748fa..e0933a6c0 100644 --- a/pybop/parameters.py +++ b/pybop/parameters.py @@ -1,3 +1,4 @@ +from typing import Any import pybop import pybamm @@ -7,9 +8,10 @@ class Parameter: Class for creating parameters in pybop. """ - def __init__(self, param, prior=None, bounds=None): + def __init__(self, param, value=None, prior=None, bounds=None): self.name = param self.prior = prior + self.value = value self.bounds = bounds # To Do: From d0ac5a4decb243a83c13285de09d9cb7881abef7 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Wed, 2 Aug 2023 16:16:26 +0100 Subject: [PATCH 018/210] Initial RMSE optimisation complete, bugfixes, example usage --- examples/Chen_example.csv | 1389 +++++++++++++++++++++++ examples/Initial_API.py | 28 +- pybop/__init__.py | 5 +- pybop/observations.py | 3 + pybop/optimisation/base_optimisation.py | 9 +- pybop/optimisation/nlopt_opt.py | 41 +- pybop/optimisation/scipy_opt.py | 2 +- pybop/parameterisation.py | 69 +- pybop/simulation.py | 6 +- 9 files changed, 1479 insertions(+), 73 deletions(-) create mode 100644 examples/Chen_example.csv diff --git a/examples/Chen_example.csv b/examples/Chen_example.csv new file mode 100644 index 000000000..99d509e37 --- /dev/null +++ b/examples/Chen_example.csv @@ -0,0 +1,1389 @@ +Time [s],Current [A],Terminal voltage [V],Cycle,Step +0.0,2.5,4.160927753511467,0.0,0.0 +1.0,2.5,4.157601075676489,0.0,0.0 +2.0,2.5,4.154490994259158,0.0,0.0 +3.0,2.5,4.151579735777284,0.0,0.0 +4.0,2.5,4.148849144222897,0.0,0.0 +5.0,2.5,4.146282844054771,0.0,0.0 +6.0,2.5,4.143866411877354,0.0,0.0 +7.0,2.5,4.14158685882251,0.0,0.0 +8.0,2.5,4.139432527584678,0.0,0.0 +9.0,2.5,4.1373935777586475,0.0,0.0 +10.0,2.5,4.135460207732003,0.0,0.0 +11.0,2.5,4.133623207865335,0.0,0.0 +12.0,2.5,4.131876288053798,0.0,0.0 +13.0,2.5,4.130210715881797,0.0,0.0 +14.0,2.5,4.128621343373044,0.0,0.0 +15.0,2.5,4.127102372425127,0.0,0.0 +16.0,2.5,4.1256486435085735,0.0,0.0 +17.0,2.5,4.124255949522701,0.0,0.0 +18.0,2.5,4.122920513753348,0.0,0.0 +19.0,2.5,4.121637691133036,0.0,0.0 +20.0,2.5,4.1204045357969346,0.0,0.0 +21.0,2.5,4.11921859787859,0.0,0.0 +22.0,2.5,4.118077799023512,0.0,0.0 +23.0,2.5,4.116977284631903,0.0,0.0 +24.0,2.5,4.115915940608523,0.0,0.0 +25.0,2.5,4.1148922144992515,0.0,0.0 +26.0,2.5,4.113904682884345,0.0,0.0 +27.0,2.5,4.112949360973445,0.0,0.0 +28.0,2.5,4.1120256982856205,0.0,0.0 +29.0,2.5,4.1111323466687715,0.0,0.0 +30.0,2.5,4.11026804945668,0.0,0.0 +31.0,2.5,4.109430366615028,0.0,0.0 +32.0,2.5,4.10861857427313,0.0,0.0 +33.0,2.5,4.1078315059979635,0.0,0.0 +34.0,2.5,4.107068078631514,0.0,0.0 +35.0,2.5,4.106326974076594,0.0,0.0 +36.0,2.5,4.105607359218209,0.0,0.0 +37.0,2.5,4.104908336227618,0.0,0.0 +38.0,2.5,4.1042290586599,0.0,0.0 +39.0,2.5,4.1035685421348544,0.0,0.0 +40.0,2.5,4.1029261716599965,0.0,0.0 +41.0,2.5,4.10230128451634,0.0,0.0 +42.0,2.5,4.101693276866006,0.0,0.0 +43.0,2.5,4.101101600597589,0.0,0.0 +44.0,2.5,4.100525726267815,0.0,0.0 +45.0,2.5,4.099964502197802,0.0,0.0 +46.0,2.5,4.099417847146635,0.0,0.0 +47.0,2.5,4.098885319974872,0.0,0.0 +48.0,2.5,4.098366517541476,0.0,0.0 +49.0,2.5,4.097861072571672,0.0,0.0 +50.0,2.5,4.097368645549943,0.0,0.0 +51.0,2.5,4.09688808870161,0.0,0.0 +52.0,2.5,4.0964195142422435,0.0,0.0 +53.0,2.5,4.095962581548417,0.0,0.0 +54.0,2.5,4.095516971816701,0.0,0.0 +55.0,2.5,4.095082386937095,0.0,0.0 +56.0,2.5,4.094658548400727,0.0,0.0 +57.0,2.5,4.09424471783567,0.0,0.0 +58.0,2.5,4.093840843122007,0.0,0.0 +59.0,2.5,4.093446656829645,0.0,0.0 +60.0,2.5,4.093061889347226,0.0,0.0 +61.0,2.5,4.092686283528498,0.0,0.0 +62.0,2.5,4.092319594146908,0.0,0.0 +63.0,2.5,4.091961442559183,0.0,0.0 +64.0,2.5,4.091611652591053,0.0,0.0 +65.0,2.5,4.091270004239898,0.0,0.0 +66.0,2.5,4.090936275768548,0.0,0.0 +67.0,2.5,4.090610254161096,0.0,0.0 +68.0,2.5,4.090291734778852,0.0,0.0 +69.0,2.5,4.089980493354697,0.0,0.0 +70.0,2.5,4.089676347645338,0.0,0.0 +71.0,2.5,4.089379115842617,0.0,0.0 +72.0,2.5,4.089088619679142,0.0,0.0 +73.0,2.5,4.088804687536027,0.0,0.0 +74.0,2.5,4.088527154174912,0.0,0.0 +75.0,2.5,4.088255804667979,0.0,0.0 +76.0,2.5,4.087990501979117,0.0,0.0 +77.0,2.5,4.087731105819368,0.0,0.0 +78.0,2.5,4.087477471187321,0.0,0.0 +79.0,2.5,4.08722945847457,0.0,0.0 +80.0,2.5,4.086986933232946,0.0,0.0 +81.0,2.5,4.086749765949343,0.0,0.0 +82.0,2.5,4.0865178318285365,0.0,0.0 +83.0,2.5,4.086291010583731,0.0,0.0 +84.0,2.5,4.0860691862348055,0.0,0.0 +85.0,2.5,4.085852132426833,0.0,0.0 +86.0,2.5,4.085639716421859,0.0,0.0 +87.0,2.5,4.085431899989458,0.0,0.0 +88.0,2.5,4.085228574804643,0.0,0.0 +89.0,2.5,4.0850296359704155,0.0,0.0 +90.0,2.5,4.084834981878631,0.0,0.0 +91.0,2.5,4.084644514076079,0.0,0.0 +92.0,2.5,4.0844581371360364,0.0,0.0 +93.0,2.5,4.084275758534926,0.0,0.0 +94.0,2.5,4.084097288534272,0.0,0.0 +95.0,2.5,4.083922580111833,0.0,0.0 +96.0,2.5,4.083751443484631,0.0,0.0 +97.0,2.5,4.083583895147556,0.0,0.0 +98.0,2.5,4.083419848098537,0.0,0.0 +99.0,2.5,4.083259217539309,0.0,0.0 +100.0,2.5,4.083101920805127,0.0,0.0 +101.0,2.5,4.082947877296784,0.0,0.0 +102.0,2.5,4.08279700841526,0.0,0.0 +103.0,2.5,4.0826492374987975,0.0,0.0 +104.0,2.5,4.082504489762482,0.0,0.0 +105.0,2.5,4.0823626853081025,0.0,0.0 +106.0,2.5,4.082223665259328,0.0,0.0 +107.0,2.5,4.082087423199833,0.0,0.0 +108.0,2.5,4.0819538876851205,0.0,0.0 +109.0,2.5,4.081822988827989,0.0,0.0 +110.0,2.5,4.081694658258913,0.0,0.0 +111.0,2.5,4.081568829087869,0.0,0.0 +112.0,2.5,4.081445435866936,0.0,0.0 +113.0,2.5,4.081324414554147,0.0,0.0 +114.0,2.5,4.0812057024784885,0.0,0.0 +115.0,2.5,4.081089238305971,0.0,0.0 +116.0,2.5,4.08097494232456,0.0,0.0 +117.0,2.5,4.080862764679917,0.0,0.0 +118.0,2.5,4.080752650215037,0.0,0.0 +119.0,2.5,4.080644541698893,0.0,0.0 +120.0,2.5,4.080538383064326,0.0,0.0 +121.0,2.5,4.080434119381322,0.0,0.0 +122.0,2.5,4.080331696830786,0.0,0.0 +123.0,2.5,4.080231062679405,0.0,0.0 +124.0,2.5,4.080132165254847,0.0,0.0 +125.0,2.5,4.0800349539220875,0.0,0.0 +126.0,2.5,4.079939376720904,0.0,0.0 +127.0,2.5,4.0798453847155685,0.0,0.0 +128.0,2.5,4.079752931441735,0.0,0.0 +129.0,2.5,4.079661970018632,0.0,0.0 +130.0,2.5,4.079572454489028,0.0,0.0 +131.0,2.5,4.0794843397994525,0.0,0.0 +132.0,2.5,4.079397581781398,0.0,0.0 +133.0,2.5,4.079312137132995,0.0,0.0 +134.0,2.5,4.079227963401337,0.0,0.0 +135.0,2.5,4.079145018965368,0.0,0.0 +136.0,2.5,4.0790632581457285,0.0,0.0 +137.0,2.5,4.078982634181892,0.0,0.0 +138.0,2.5,4.07890311548313,0.0,0.0 +139.0,2.5,4.078824663331393,0.0,0.0 +140.0,2.5,4.078747239768525,0.0,0.0 +141.0,2.5,4.078670807581731,0.0,0.0 +142.0,2.5,4.078595330289514,0.0,0.0 +143.0,2.5,4.078520772128148,0.0,0.0 +144.0,2.5,4.078447098038876,0.0,0.0 +145.0,2.5,4.078374273655544,0.0,0.0 +146.0,2.5,4.078302265292856,0.0,0.0 +147.0,2.5,4.078231039935201,0.0,0.0 +148.0,2.5,4.078160565225972,0.0,0.0 +149.0,2.5,4.078090809457463,0.0,0.0 +150.0,2.5,4.0780217415612645,0.0,0.0 +151.0,2.5,4.077953331099245,0.0,0.0 +152.0,2.5,4.077885548254853,0.0,0.0 +153.0,2.5,4.0778183457825286,0.0,0.0 +154.0,2.5,4.077751683756053,0.0,0.0 +155.0,2.5,4.077685554179354,0.0,0.0 +156.0,2.5,4.077619928841112,0.0,0.0 +157.0,2.5,4.077554780081825,0.0,0.0 +158.0,2.5,4.077490080785911,0.0,0.0 +159.0,2.5,4.07742580437427,0.0,0.0 +160.0,2.5,4.077361924797133,0.0,0.0 +161.0,2.5,4.077298416527288,0.0,0.0 +162.0,2.5,4.077235254553625,0.0,0.0 +163.0,2.5,4.077172414375023,0.0,0.0 +164.0,2.5,4.077109871994523,0.0,0.0 +165.0,2.5,4.077047603913931,0.0,0.0 +166.0,2.5,4.076985587128584,0.0,0.0 +167.0,2.5,4.0769237991225085,0.0,0.0 +168.0,2.5,4.0768622178638925,0.0,0.0 +169.0,2.5,4.076800821800829,0.0,0.0 +170.0,2.5,4.076739567832886,0.0,0.0 +171.0,2.5,4.076678430698656,0.0,0.0 +172.0,2.5,4.076617407022613,0.0,0.0 +173.0,2.5,4.076556476171565,0.0,0.0 +174.0,2.5,4.076495617921502,0.0,0.0 +175.0,2.5,4.076434812452586,0.0,0.0 +176.0,2.5,4.076374040344133,0.0,0.0 +177.0,2.5,4.076313282569893,0.0,0.0 +178.0,2.5,4.076252520493434,0.0,0.0 +179.0,2.5,4.0761917358636595,0.0,0.0 +180.0,2.5,4.076130910810625,0.0,0.0 +181.0,2.5,4.076070027841338,0.0,0.0 +182.0,2.5,4.076009069835855,0.0,0.0 +183.0,2.5,4.075948020043392,0.0,0.0 +184.0,2.5,4.075886862078759,0.0,0.0 +185.0,2.5,4.075825579918716,0.0,0.0 +186.0,2.5,4.075764157898728,0.0,0.0 +187.0,2.5,4.075702566041725,0.0,0.0 +188.0,2.5,4.075640790574839,0.0,0.0 +189.0,2.5,4.075578824437293,0.0,0.0 +190.0,2.5,4.075516652749117,0.0,0.0 +191.0,2.5,4.07545426093731,0.0,0.0 +192.0,2.5,4.075391634731802,0.0,0.0 +193.0,2.5,4.075328760161517,0.0,0.0 +194.0,2.5,4.075265623550525,0.0,0.0 +195.0,2.5,4.0752022115142985,0.0,0.0 +196.0,2.5,4.075138510956072,0.0,0.0 +197.0,2.5,4.075074509063162,0.0,0.0 +198.0,2.5,4.075010193303642,0.0,0.0 +199.0,2.5,4.074945551422783,0.0,0.0 +200.0,2.5,4.074880571439843,0.0,0.0 +201.0,2.5,4.0748152416447745,0.0,0.0 +202.0,2.5,4.074749550595088,0.0,0.0 +203.0,2.5,4.074683487112824,0.0,0.0 +204.0,2.5,4.074617034797386,0.0,0.0 +205.0,2.5,4.074550184650403,0.0,0.0 +206.0,2.5,4.074482928099226,0.0,0.0 +207.0,2.5,4.074415254780117,0.0,0.0 +208.0,2.5,4.074347154566803,0.0,0.0 +209.0,2.5,4.074278617567291,0.0,0.0 +210.0,2.5,4.074209634120945,0.0,0.0 +211.0,2.5,4.074140194795576,0.0,0.0 +212.0,2.5,4.074070290384515,0.0,0.0 +213.0,2.5,4.073999911903955,0.0,0.0 +214.0,2.5,4.0739290505900705,0.0,0.0 +215.0,2.5,4.073857697896411,0.0,0.0 +216.0,2.5,4.073785845491324,0.0,0.0 +217.0,2.5,4.073713485255321,0.0,0.0 +218.0,2.5,4.0736406092786925,0.0,0.0 +219.0,2.5,4.073567209858991,0.0,0.0 +220.0,2.5,4.073493279498674,0.0,0.0 +221.0,2.5,4.073418808567246,0.0,0.0 +222.0,2.5,4.07334379108645,0.0,0.0 +223.0,2.5,4.073268220616229,0.0,0.0 +224.0,2.5,4.07319209037358,0.0,0.0 +225.0,2.5,4.073115393764511,0.0,0.0 +226.0,2.5,4.073038124381744,0.0,0.0 +227.0,2.5,4.072960276002726,0.0,0.0 +228.0,2.5,4.072881842587348,0.0,0.0 +229.0,2.5,4.072802818276068,0.0,0.0 +230.0,2.5,4.072723197387714,0.0,0.0 +231.0,2.5,4.0726429744177235,0.0,0.0 +232.0,2.5,4.072562144036067,0.0,0.0 +233.0,2.5,4.072480701085468,0.0,0.0 +234.0,2.5,4.072398640579519,0.0,0.0 +235.0,2.5,4.072315957700959,0.0,0.0 +236.0,2.5,4.072232647799895,0.0,0.0 +237.0,2.5,4.072148706392074,0.0,0.0 +238.0,2.5,4.072064120134619,0.0,0.0 +239.0,2.5,4.071978890849423,0.0,0.0 +240.0,2.5,4.0718930154476585,0.0,0.0 +241.0,2.5,4.071806489930813,0.0,0.0 +242.0,2.5,4.07171931045325,0.0,0.0 +243.0,2.5,4.071631473320771,0.0,0.0 +244.0,2.5,4.071542974989084,0.0,0.0 +245.0,2.5,4.071453812062383,0.0,0.0 +246.0,2.5,4.071363981291887,0.0,0.0 +247.0,2.5,4.0712734795745265,0.0,0.0 +248.0,2.5,4.0711823039515815,0.0,0.0 +249.0,2.5,4.071090451607358,0.0,0.0 +250.0,2.5,4.070997919867907,0.0,0.0 +251.0,2.5,4.070904706199816,0.0,0.0 +252.0,2.5,4.070810808208975,0.0,0.0 +253.0,2.5,4.070716223639418,0.0,0.0 +254.0,2.5,4.070620950372149,0.0,0.0 +255.0,2.5,4.070524986424056,0.0,0.0 +256.0,2.5,4.07042832994678,0.0,0.0 +257.0,2.5,4.070330979225705,0.0,0.0 +258.0,2.5,4.070232932678884,0.0,0.0 +259.0,2.5,4.070134188856022,0.0,0.0 +260.0,2.5,4.070034746437567,0.0,0.0 +261.0,2.5,4.069934604233671,0.0,0.0 +262.0,2.5,4.069833761183301,0.0,0.0 +263.0,2.5,4.069732216353356,0.0,0.0 +264.0,2.5,4.069629962608646,0.0,0.0 +265.0,2.5,4.069526974796968,0.0,0.0 +266.0,2.5,4.069423277465929,0.0,0.0 +267.0,2.5,4.06931886975559,0.0,0.0 +268.0,2.5,4.0692137509128425,0.0,0.0 +269.0,2.5,4.069107920290343,0.0,0.0 +270.0,2.5,4.069001377345511,0.0,0.0 +271.0,2.5,4.0688941216394525,0.0,0.0 +272.0,2.5,4.068786152836081,0.0,0.0 +273.0,2.5,4.068677470701036,0.0,0.0 +274.0,2.5,4.068568075100781,0.0,0.0 +275.0,2.5,4.068457966001725,0.0,0.0 +276.0,2.5,4.068347143469275,0.0,0.0 +277.0,2.5,4.068235607666899,0.0,0.0 +278.0,2.5,4.0681233588553765,0.0,0.0 +279.0,2.5,4.068010397391818,0.0,0.0 +280.0,2.5,4.067896723728946,0.0,0.0 +281.0,2.5,4.067782338414229,0.0,0.0 +282.0,2.5,4.067667242089039,0.0,0.0 +283.0,2.5,4.067551435487968,0.0,0.0 +284.0,2.5,4.0674349194379875,0.0,0.0 +285.0,2.5,4.067317694857721,0.0,0.0 +286.0,2.5,4.067199762756734,0.0,0.0 +287.0,2.5,4.067081124234777,0.0,0.0 +288.0,2.5,4.066961780481108,0.0,0.0 +289.0,2.5,4.066841732773772,0.0,0.0 +290.0,2.5,4.066720982478961,0.0,0.0 +291.0,2.5,4.0665995265560175,0.0,0.0 +292.0,2.5,4.066477362635106,0.0,0.0 +293.0,2.5,4.066354495157822,0.0,0.0 +294.0,2.5,4.066230925036236,0.0,0.0 +295.0,2.5,4.066106653219106,0.0,0.0 +296.0,2.5,4.065981680690279,0.0,0.0 +297.0,2.5,4.065856008467152,0.0,0.0 +298.0,2.5,4.065729637599162,0.0,0.0 +299.0,2.5,4.065602569166355,0.0,0.0 +300.0,2.5,4.065474804277807,0.0,0.0 +300.000000001,0.0,4.083337104220067,0.0,1.0 +301.0,0.0,4.08411857143703,0.0,1.0 +302.0,0.0,4.084823935791453,0.0,1.0 +303.0,0.0,4.085462722054559,0.0,1.0 +304.0,0.0,4.086043182007179,0.0,1.0 +305.0,0.0,4.0865724051017125,0.0,1.0 +306.0,0.0,4.087056427997617,0.0,1.0 +307.0,0.0,4.087500374077019,0.0,1.0 +308.0,0.0,4.08790902639921,0.0,1.0 +309.0,0.0,4.088286058882586,0.0,1.0 +310.0,0.0,4.088635268080958,0.0,1.0 +311.0,0.0,4.088959341219949,0.0,1.0 +312.0,0.0,4.089261112677142,0.0,1.0 +313.0,0.0,4.089542668887757,0.0,1.0 +314.0,0.0,4.089806112806356,0.0,1.0 +315.0,0.0,4.090053122784463,0.0,1.0 +316.0,0.0,4.090285221354024,0.0,1.0 +317.0,0.0,4.090503745704817,0.0,1.0 +318.0,0.0,4.090710046396893,0.0,1.0 +319.0,0.0,4.090905114792385,0.0,1.0 +320.0,0.0,4.091089906030976,0.0,1.0 +321.0,0.0,4.091265371880813,0.0,1.0 +322.0,0.0,4.0914322422960385,0.0,1.0 +323.0,0.0,4.091591184363877,0.0,1.0 +324.0,0.0,4.0917428222357195,0.0,1.0 +325.0,0.0,4.091887766010014,0.0,1.0 +326.0,0.0,4.092026518729413,0.0,1.0 +327.0,0.0,4.0921594814565765,0.0,1.0 +328.0,0.0,4.092287017515516,0.0,1.0 +329.0,0.0,4.09240944878535,0.0,1.0 +330.0,0.0,4.092527417454655,0.0,1.0 +331.0,0.0,4.092641028661417,0.0,1.0 +332.0,0.0,4.092750526981569,0.0,1.0 +333.0,0.0,4.092856120722325,0.0,1.0 +334.0,0.0,4.092958108470949,0.0,1.0 +335.0,0.0,4.093056869083674,0.0,1.0 +336.0,0.0,4.093152462953598,0.0,1.0 +337.0,0.0,4.09324505576939,0.0,1.0 +338.0,0.0,4.093334793123759,0.0,1.0 +339.0,0.0,4.093421944422245,0.0,1.0 +340.0,0.0,4.093506649887989,0.0,1.0 +341.0,0.0,4.093589011210733,0.0,1.0 +342.0,0.0,4.093669150941425,0.0,1.0 +343.0,0.0,4.093747185325492,0.0,1.0 +344.0,0.0,4.093823278769266,0.0,1.0 +345.0,0.0,4.093897505111239,0.0,1.0 +346.0,0.0,4.09396995992965,0.0,1.0 +347.0,0.0,4.094040730949751,0.0,1.0 +348.0,0.0,4.09410990799957,0.0,1.0 +349.0,0.0,4.094177578696497,0.0,1.0 +350.0,0.0,4.094243806711216,0.0,1.0 +351.0,0.0,4.094308657608522,0.0,1.0 +352.0,0.0,4.094372191189041,0.0,1.0 +353.0,0.0,4.094434507708313,0.0,1.0 +354.0,0.0,4.094495651938244,0.0,1.0 +355.0,0.0,4.094555664953677,0.0,1.0 +356.0,0.0,4.094614591157936,0.0,1.0 +357.0,0.0,4.094672469999011,0.0,1.0 +358.0,0.0,4.094729336096383,0.0,1.0 +359.0,0.0,4.0947852193522305,0.0,1.0 +360.0,0.0,4.094840145048124,0.0,1.0 +361.0,0.0,4.094894277223266,0.0,1.0 +362.0,0.0,4.0949475944493345,0.0,1.0 +363.0,0.0,4.0950000983298045,0.0,1.0 +364.0,0.0,4.095051812803234,0.0,1.0 +365.0,0.0,4.095102758594911,0.0,1.0 +366.0,0.0,4.0951529532665045,0.0,1.0 +367.0,0.0,4.095202411257952,0.0,1.0 +368.0,0.0,4.095251143922228,0.0,1.0 +369.0,0.0,4.095299315797117,0.0,1.0 +370.0,0.0,4.09534688558349,0.0,1.0 +371.0,0.0,4.0953938468241775,0.0,1.0 +372.0,0.0,4.095440216551898,0.0,1.0 +373.0,0.0,4.095486010140206,0.0,1.0 +374.0,0.0,4.095531241327584,0.0,1.0 +375.0,0.0,4.095575922238512,0.0,1.0 +376.0,0.0,4.095620063401408,0.0,1.0 +377.0,0.0,4.095663760543893,0.0,1.0 +378.0,0.0,4.095706993028133,0.0,1.0 +379.0,0.0,4.095749763336209,0.0,1.0 +380.0,0.0,4.095792085594328,0.0,1.0 +381.0,0.0,4.095833973140304,0.0,1.0 +382.0,0.0,4.095875438539559,0.0,1.0 +383.0,0.0,4.09591649359953,0.0,1.0 +384.0,0.0,4.0959571493826985,0.0,1.0 +385.0,0.0,4.095997438202164,0.0,1.0 +386.0,0.0,4.096037362024716,0.0,1.0 +387.0,0.0,4.0960769292507475,0.0,1.0 +388.0,0.0,4.096116150545187,0.0,1.0 +389.0,0.0,4.096155036066913,0.0,1.0 +390.0,0.0,4.096193595477757,0.0,1.0 +391.0,0.0,4.096231837950833,0.0,1.0 +392.0,0.0,4.096269772177853,0.0,1.0 +393.0,0.0,4.096307408860641,0.0,1.0 +394.0,0.0,4.096344754822972,0.0,1.0 +395.0,0.0,4.096381817330585,0.0,1.0 +396.0,0.0,4.096418603484685,0.0,1.0 +397.0,0.0,4.096455119952227,0.0,1.0 +398.0,0.0,4.096491372969539,0.0,1.0 +399.0,0.0,4.096527368345044,0.0,1.0 +400.0,0.0,4.096563111461736,0.0,1.0 +401.0,0.0,4.096598627108964,0.0,1.0 +402.0,0.0,4.09663391003031,0.0,1.0 +403.0,0.0,4.096668963385099,0.0,1.0 +404.0,0.0,4.096703791876213,0.0,1.0 +405.0,0.0,4.096738399802303,0.0,1.0 +406.0,0.0,4.096772791057752,0.0,1.0 +407.0,0.0,4.096806969132171,0.0,1.0 +408.0,0.0,4.096840937109579,0.0,1.0 +409.0,0.0,4.0968746976672685,0.0,1.0 +410.0,0.0,4.096908253074219,0.0,1.0 +411.0,0.0,4.096941605189362,0.0,1.0 +412.0,0.0,4.096974755459436,0.0,1.0 +413.0,0.0,4.097007704916578,0.0,1.0 +414.0,0.0,4.097040480435536,0.0,1.0 +415.0,0.0,4.097073076123438,0.0,1.0 +416.0,0.0,4.097105491844794,0.0,1.0 +417.0,0.0,4.097137731121214,0.0,1.0 +418.0,0.0,4.09716979741555,0.0,1.0 +419.0,0.0,4.0972016941341565,0.0,1.0 +420.0,0.0,4.097233424628999,0.0,1.0 +420.000000001,-2.5,4.115314153407617,0.0,2.0 +421.0,-2.5,4.11580126816336,0.0,2.0 +422.0,-2.5,4.116287981535286,0.0,2.0 +423.0,-2.5,4.116777990744232,0.0,2.0 +424.0,-2.5,4.117273191364564,0.0,2.0 +425.0,-2.5,4.117774915639592,0.0,2.0 +426.0,-2.5,4.118284040604012,0.0,2.0 +427.0,-2.5,4.118801048057358,0.0,2.0 +428.0,-2.5,4.119326515995133,0.0,2.0 +429.0,-2.5,4.119860399527127,0.0,2.0 +430.0,-2.5,4.120403180460219,0.0,2.0 +431.0,-2.5,4.120954562276548,0.0,2.0 +432.0,-2.5,4.121514781148596,0.0,2.0 +433.0,-2.5,4.122083516198534,0.0,2.0 +434.0,-2.5,4.1226607942227185,0.0,2.0 +435.0,-2.5,4.123246364371904,0.0,2.0 +436.0,-2.5,4.123840020969835,0.0,2.0 +437.0,-2.5,4.124441526266611,0.0,2.0 +438.0,-2.5,4.125050951332003,0.0,2.0 +439.0,-2.5,4.125667962076965,0.0,2.0 +440.0,-2.5,4.126292367649658,0.0,2.0 +441.0,-2.5,4.126924195444504,0.0,2.0 +442.0,-2.5,4.127563200844878,0.0,2.0 +443.0,-2.5,4.12820917027299,0.0,2.0 +444.0,-2.5,4.128861945806709,0.0,2.0 +445.0,-2.5,4.129521510767318,0.0,2.0 +446.0,-2.5,4.130187710940636,0.0,2.0 +447.0,-2.5,4.130860241429103,0.0,2.0 +448.0,-2.5,4.131538785425746,0.0,2.0 +449.0,-2.5,4.132223012474197,0.0,2.0 +450.0,-2.5,4.1329137060465575,0.0,2.0 +451.0,-2.5,4.1336100747288285,0.0,2.0 +452.0,-2.5,4.134311816352641,0.0,2.0 +453.0,-2.5,4.135018566209412,0.0,2.0 +454.0,-2.5,4.135730402582563,0.0,2.0 +455.0,-2.5,4.136447738344287,0.0,2.0 +456.0,-2.5,4.137169913020526,0.0,2.0 +457.0,-2.5,4.137896687838134,0.0,2.0 +458.0,-2.5,4.13862779190947,0.0,2.0 +459.0,-2.5,4.139363583911809,0.0,2.0 +460.0,-2.5,4.140103858101116,0.0,2.0 +461.0,-2.5,4.140848348950613,0.0,2.0 +462.0,-2.5,4.1415969032465085,0.0,2.0 +463.0,-2.5,4.142349392150335,0.0,2.0 +464.0,-2.5,4.14310594336973,0.0,2.0 +465.0,-2.5,4.143866307267678,0.0,2.0 +466.0,-2.5,4.144630367242537,0.0,2.0 +467.0,-2.5,4.14539800048952,0.0,2.0 +468.0,-2.5,4.146169135105322,0.0,2.0 +469.0,-2.5,4.1469437054342855,0.0,2.0 +470.0,-2.5,4.147721556947632,0.0,2.0 +471.0,-2.5,4.148502566664649,0.0,2.0 +472.0,-2.5,4.149286603209791,0.0,2.0 +473.0,-2.5,4.150073818632925,0.0,2.0 +474.0,-2.5,4.150864013380658,0.0,2.0 +475.0,-2.5,4.151657032252208,0.0,2.0 +476.0,-2.5,4.152452742603151,0.0,2.0 +477.0,-2.5,4.153250998409786,0.0,2.0 +478.0,-2.5,4.154051639048997,0.0,2.0 +479.0,-2.5,4.154854488114104,0.0,2.0 +480.0,-2.5,4.155659352267687,0.0,2.0 +481.0,-2.5,4.156467062646512,0.0,2.0 +482.0,-2.5,4.157276995734728,0.0,2.0 +483.0,-2.5,4.158088929742623,0.0,2.0 +484.0,-2.5,4.158902722580855,0.0,2.0 +485.0,-2.5,4.159718220883334,0.0,2.0 +486.0,-2.5,4.160535259263556,0.0,2.0 +487.0,-2.5,4.161353659596958,0.0,2.0 +488.0,-2.5,4.162173230329908,0.0,2.0 +489.0,-2.5,4.162995033345934,0.0,2.0 +490.0,-2.5,4.163818275506938,0.0,2.0 +491.0,-2.5,4.1646427911171955,0.0,2.0 +492.0,-2.5,4.165468472838174,0.0,2.0 +493.0,-2.5,4.166295209164681,0.0,2.0 +494.0,-2.5,4.167122884071705,0.0,2.0 +495.0,-2.5,4.16795137667258,0.0,2.0 +496.0,-2.5,4.168780560888696,0.0,2.0 +497.0,-2.5,4.1696110735551075,0.0,2.0 +498.0,-2.5,4.170442384273522,0.0,2.0 +499.0,-2.5,4.171274413467192,0.0,2.0 +500.0,-2.5,4.1721070926304,0.0,2.0 +501.0,-2.5,4.172940353307712,0.0,2.0 +502.0,-2.5,4.173774126914772,0.0,2.0 +503.0,-2.5,4.17460834456357,0.0,2.0 +504.0,-2.5,4.175442940725014,0.0,2.0 +505.0,-2.5,4.176278044626564,0.0,2.0 +506.0,-2.5,4.17711347773185,0.0,2.0 +507.0,-2.5,4.177949187515572,0.0,2.0 +508.0,-2.5,4.178785121997135,0.0,2.0 +509.0,-2.5,4.179621229611505,0.0,2.0 +510.0,-2.5,4.180457459083005,0.0,2.0 +511.0,-2.5,4.181293759302215,0.0,2.0 +512.0,-2.5,4.182130080544206,0.0,2.0 +513.0,-2.5,4.182966395471069,0.0,2.0 +514.0,-2.5,4.1838026396555374,0.0,2.0 +515.0,-2.5,4.184638763875634,0.0,2.0 +516.0,-2.5,4.185474718707162,0.0,2.0 +517.0,-2.5,4.186310454421232,0.0,2.0 +518.0,-2.5,4.187145920884718,0.0,2.0 +519.0,-2.5,4.187981067463743,0.0,2.0 +520.0,-2.5,4.188815859287128,0.0,2.0 +521.0,-2.5,4.1896504023686605,0.0,2.0 +522.0,-2.5,4.190484538000852,0.0,2.0 +523.0,-2.5,4.191318220929476,0.0,2.0 +524.0,-2.5,4.192151405074641,0.0,2.0 +525.0,-2.5,4.1929840434470975,0.0,2.0 +526.0,-2.5,4.19381608806758,0.0,2.0 +527.0,-2.5,4.1946474898890145,0.0,2.0 +528.0,-2.5,4.195478198721599,0.0,2.0 +529.0,-2.5,4.196308163160786,0.0,2.0 +530.0,-2.5,4.197137330518019,0.0,2.0 +531.0,-2.5,4.197965646754283,0.0,2.0 +532.0,-2.5,4.198793056416422,0.0,2.0 +533.0,-2.5,4.1996195697873056,0.0,2.0 +534.0,-2.5,4.200445644043602,0.0,2.0 +535.0,-2.5,4.201270821156214,0.0,2.0 +536.0,-2.5,4.20209506239229,0.0,2.0 +537.0,-2.5,4.202918328424658,0.0,2.0 +538.0,-2.5,4.203740579283007,0.0,2.0 +539.0,-2.5,4.2045617743068116,0.0,2.0 +540.0,-2.5,4.205381872100225,0.0,2.0 +541.0,-2.5,4.206200830488596,0.0,2.0 +542.0,-2.5,4.207018606476822,0.0,2.0 +543.0,-2.5,4.207835156209456,0.0,2.0 +544.0,-2.5,4.208650434932421,0.0,2.0 +545.0,-2.5,4.209464396956459,0.0,2.0 +546.0,-2.5,4.210277075901499,0.0,2.0 +547.0,-2.5,4.211088946655144,0.0,2.0 +548.0,-2.5,4.211899546903226,0.0,2.0 +549.0,-2.5,4.212708850053829,0.0,2.0 +550.0,-2.5,4.213516829576945,0.0,2.0 +551.0,-2.5,4.2143234589756196,0.0,2.0 +552.0,-2.5,4.215128711758133,0.0,2.0 +553.0,-2.5,4.215932561410892,0.0,2.0 +554.0,-2.5,4.216734981372289,0.0,2.0 +555.0,-2.5,4.217535945007451,0.0,2.0 +556.0,-2.5,4.218335425583666,0.0,2.0 +557.0,-2.5,4.219133396246829,0.0,2.0 +558.0,-2.5,4.219929829998552,0.0,2.0 +559.0,-2.5,4.220724737110144,0.0,2.0 +560.0,-2.5,4.221518305656589,0.0,2.0 +561.0,-2.5,4.222310344723525,0.0,2.0 +562.0,-2.5,4.223100839241547,0.0,2.0 +563.0,-2.5,4.223889774647726,0.0,2.0 +564.0,-2.5,4.224677136866221,0.0,2.0 +565.0,-2.5,4.2254629122892915,0.0,2.0 +566.0,-2.5,4.226247087758805,0.0,2.0 +567.0,-2.5,4.227029650547929,0.0,2.0 +568.0,-2.5,4.227810588343391,0.0,2.0 +569.0,-2.5,4.228589889227962,0.0,2.0 +570.0,-2.5,4.229367541663446,0.0,2.0 +570.000000001,0.0,4.210029284710582,0.0,3.0 +571.0,0.0,4.207213583314949,0.0,3.0 +572.0,0.0,4.2045971631097725,0.0,3.0 +573.0,0.0,4.202161839008122,0.0,3.0 +574.0,0.0,4.199890898745848,0.0,3.0 +575.0,0.0,4.197769335614359,0.0,3.0 +576.0,0.0,4.195783879691244,0.0,3.0 +577.0,0.0,4.193922813568967,0.0,3.0 +578.0,0.0,4.19217522692314,0.0,3.0 +579.0,0.0,4.1905311507282805,0.0,3.0 +580.0,0.0,4.1889814120405005,0.0,3.0 +581.0,0.0,4.187518661668531,0.0,3.0 +582.0,0.0,4.186134907137069,0.0,3.0 +583.0,0.0,4.184824930563117,0.0,3.0 +584.0,0.0,4.1835819030923505,0.0,3.0 +585.0,0.0,4.182401580048656,0.0,3.0 +586.0,0.0,4.181278703809178,0.0,3.0 +587.0,0.0,4.180209910457267,0.0,3.0 +588.0,0.0,4.179190532538634,0.0,3.0 +589.0,0.0,4.178216902784102,0.0,3.0 +590.0,0.0,4.177286614461846,0.0,3.0 +591.0,0.0,4.176396007237823,0.0,3.0 +592.0,0.0,4.175542354184778,0.0,3.0 +593.0,0.0,4.17472364073388,0.0,3.0 +594.0,0.0,4.17393750941874,0.0,3.0 +595.0,0.0,4.173181867365283,0.0,3.0 +596.0,0.0,4.172454471651524,0.0,3.0 +597.0,0.0,4.171754031090117,0.0,3.0 +598.0,0.0,4.171079263572318,0.0,3.0 +599.0,0.0,4.17042913754243,0.0,3.0 +600.0,0.0,4.16980120491864,0.0,3.0 +601.0,0.0,4.169194204224323,0.0,3.0 +602.0,0.0,4.168607759644541,0.0,3.0 +603.0,0.0,4.168041150823556,0.0,3.0 +604.0,0.0,4.167493774627918,0.0,3.0 +605.0,0.0,4.166962625224374,0.0,3.0 +606.0,0.0,4.166448148159899,0.0,3.0 +607.0,0.0,4.165949685934117,0.0,3.0 +608.0,0.0,4.165466676378533,0.0,3.0 +609.0,0.0,4.164998206772577,0.0,3.0 +610.0,0.0,4.1645429199915345,0.0,3.0 +611.0,0.0,4.1641007216410015,0.0,3.0 +612.0,0.0,4.1636710663369385,0.0,3.0 +613.0,0.0,4.16325346065624,0.0,3.0 +614.0,0.0,4.1628471299862,0.0,3.0 +615.0,0.0,4.162451571498087,0.0,3.0 +616.0,0.0,4.162066421723589,0.0,3.0 +617.0,0.0,4.16169126270297,0.0,3.0 +618.0,0.0,4.161325704401287,0.0,3.0 +619.0,0.0,4.1609692153506135,0.0,3.0 +620.0,0.0,4.160621529491947,0.0,3.0 +621.0,0.0,4.160282325457457,0.0,3.0 +622.0,0.0,4.159951311130621,0.0,3.0 +623.0,0.0,4.159628069141708,0.0,3.0 +624.0,0.0,4.159312117980469,0.0,3.0 +625.0,0.0,4.159003373346276,0.0,3.0 +626.0,0.0,4.158701613036827,0.0,3.0 +627.0,0.0,4.158406643057931,0.0,3.0 +628.0,0.0,4.158118297327637,0.0,3.0 +629.0,0.0,4.157836437392334,0.0,3.0 +630.0,0.0,4.157560952154421,0.0,3.0 +631.0,0.0,4.157291261979277,0.0,3.0 +632.0,0.0,4.157026688466741,0.0,3.0 +633.0,0.0,4.156767652572423,0.0,3.0 +634.0,0.0,4.156514032810383,0.0,3.0 +635.0,0.0,4.156265726685805,0.0,3.0 +636.0,0.0,4.15602265052153,0.0,3.0 +637.0,0.0,4.155784739291854,0.0,3.0 +638.0,0.0,4.155551946463349,0.0,3.0 +639.0,0.0,4.1553237049393745,0.0,3.0 +640.0,0.0,4.155099377411003,0.0,3.0 +641.0,0.0,4.154879446227916,0.0,3.0 +642.0,0.0,4.154663814247297,0.0,3.0 +643.0,0.0,4.154452393741274,0.0,3.0 +644.0,0.0,4.154245106315513,0.0,3.0 +645.0,0.0,4.154041882830858,0.0,3.0 +646.0,0.0,4.153842663327825,0.0,3.0 +647.0,0.0,4.153647101167119,0.0,3.0 +648.0,0.0,4.153454830558504,0.0,3.0 +649.0,0.0,4.153266067313362,0.0,3.0 +650.0,0.0,4.153080721404211,0.0,3.0 +651.0,0.0,4.152898707130987,0.0,3.0 +652.0,0.0,4.152719943082192,0.0,3.0 +653.0,0.0,4.152544352097112,0.0,3.0 +654.0,0.0,4.152371861229269,0.0,3.0 +655.0,0.0,4.1522023277734,0.0,3.0 +656.0,0.0,4.152035610979901,0.0,3.0 +657.0,0.0,4.1518717097175015,0.0,3.0 +658.0,0.0,4.151710551395647,0.0,3.0 +659.0,0.0,4.151552066364199,0.0,3.0 +660.0,0.0,4.1513961878880865,0.0,3.0 +661.0,0.0,4.15124285212288,0.0,3.0 +662.0,0.0,4.151091998090975,0.0,3.0 +663.0,0.0,4.1509435592345785,0.0,3.0 +664.0,0.0,4.150797472097141,0.0,3.0 +665.0,0.0,4.150653690629847,0.0,3.0 +666.0,0.0,4.150512163297496,0.0,3.0 +667.0,0.0,4.1503728411991965,0.0,3.0 +668.0,0.0,4.15023567804895,0.0,3.0 +669.0,0.0,4.150100630156968,0.0,3.0 +670.0,0.0,4.149967656411437,0.0,3.0 +671.0,0.0,4.1498366540695955,0.0,3.0 +672.0,0.0,4.1497075385471796,0.0,3.0 +673.0,0.0,4.149580332413257,0.0,3.0 +674.0,0.0,4.149454998704056,0.0,3.0 +675.0,0.0,4.14933150294905,0.0,3.0 +676.0,0.0,4.149209813155258,0.0,3.0 +677.0,0.0,4.149089899791887,0.0,3.0 +678.0,0.0,4.148971735775508,0.0,3.0 +679.0,0.0,4.148855296455618,0.0,3.0 +680.0,0.0,4.1487405596006734,0.0,3.0 +681.0,0.0,4.148627505384641,0.0,3.0 +682.0,0.0,4.14851611637379,0.0,3.0 +683.0,0.0,4.148406377514072,0.0,3.0 +684.0,0.0,4.148298213522299,0.0,3.0 +685.0,0.0,4.148191511522451,0.0,3.0 +686.0,0.0,4.148086312994496,0.0,3.0 +687.0,0.0,4.1479825873201,0.0,3.0 +688.0,0.0,4.147880304164437,0.0,3.0 +689.0,0.0,4.147779433472801,0.0,3.0 +690.0,0.0,4.147679945467388,0.0,3.0 +690.000000001,2.5,4.128614765545601,1.0,0.0 +691.0,2.5,4.125806121237927,1.0,0.0 +692.0,2.5,4.123215794986313,1.0,0.0 +693.0,2.5,4.1208229134493735,1.0,0.0 +694.0,2.5,4.118607471025524,1.0,0.0 +695.0,2.5,4.116551784497935,1.0,0.0 +696.0,2.5,4.114640381218213,1.0,0.0 +697.0,2.5,4.112859689636109,1.0,0.0 +698.0,2.5,4.111197424781445,1.0,0.0 +699.0,2.5,4.1096425953611275,1.0,0.0 +700.0,2.5,4.108185319207477,1.0,0.0 +701.0,2.5,4.106817367636223,1.0,0.0 +702.0,2.5,4.105530584404381,1.0,0.0 +703.0,2.5,4.104318858718375,1.0,0.0 +704.0,2.5,4.103175499004113,1.0,0.0 +705.0,2.5,4.102095597490596,1.0,0.0 +706.0,2.5,4.101073956789457,1.0,0.0 +707.0,2.5,4.100106646480028,1.0,0.0 +708.0,2.5,4.099189265075946,1.0,0.0 +709.0,2.5,4.0983181499111465,1.0,0.0 +710.0,2.5,4.0974904450012435,1.0,0.0 +711.0,2.5,4.096702826328648,1.0,0.0 +712.0,2.5,4.095952583807382,1.0,0.0 +713.0,2.5,4.0952374707757215,1.0,0.0 +714.0,2.5,4.094555187694315,1.0,0.0 +715.0,2.5,4.093903667889831,1.0,0.0 +716.0,2.5,4.093280877078022,1.0,0.0 +717.0,2.5,4.092685281272766,1.0,0.0 +718.0,2.5,4.092115414449436,1.0,0.0 +719.0,2.5,4.091569972939239,1.0,0.0 +720.0,2.5,4.09104717147136,1.0,0.0 +721.0,2.5,4.090545739714515,1.0,0.0 +722.0,2.5,4.0900648204169885,1.0,0.0 +723.0,2.5,4.089603449382283,1.0,0.0 +724.0,2.5,4.089160753388908,1.0,0.0 +725.0,2.5,4.088735029900462,1.0,0.0 +726.0,2.5,4.0883258737423,1.0,0.0 +727.0,2.5,4.0879325054599285,1.0,0.0 +728.0,2.5,4.087554207133284,1.0,0.0 +729.0,2.5,4.087190186810957,1.0,0.0 +730.0,2.5,4.086839527158593,1.0,0.0 +731.0,2.5,4.086501759926133,1.0,0.0 +732.0,2.5,4.0861762895157385,1.0,0.0 +733.0,2.5,4.085862558779947,1.0,0.0 +734.0,2.5,4.085559956599416,1.0,0.0 +735.0,2.5,4.08526796397757,1.0,0.0 +736.0,2.5,4.084986129068984,1.0,0.0 +737.0,2.5,4.084713999265481,1.0,0.0 +738.0,2.5,4.084451147597297,1.0,0.0 +739.0,2.5,4.08419712400763,1.0,0.0 +740.0,2.5,4.083951565539416,1.0,0.0 +741.0,2.5,4.083714107407066,1.0,0.0 +742.0,2.5,4.083484404949723,1.0,0.0 +743.0,2.5,4.083262100125357,1.0,0.0 +744.0,2.5,4.083046824275364,1.0,0.0 +745.0,2.5,4.08283832164241,1.0,0.0 +746.0,2.5,4.082636310723714,1.0,0.0 +747.0,2.5,4.0824405255597345,1.0,0.0 +748.0,2.5,4.082250714809793,1.0,0.0 +749.0,2.5,4.082066640890373,1.0,0.0 +750.0,2.5,4.0818880791738374,1.0,0.0 +751.0,2.5,4.08171473227161,1.0,0.0 +752.0,2.5,4.08154625823742,1.0,0.0 +753.0,2.5,4.081382576608256,1.0,0.0 +754.0,2.5,4.081223491802858,1.0,0.0 +755.0,2.5,4.0810688177970835,1.0,0.0 +756.0,2.5,4.080918377636783,1.0,0.0 +757.0,2.5,4.080772002987455,1.0,0.0 +758.0,2.5,4.08062953371918,1.0,0.0 +759.0,2.5,4.080490740915204,1.0,0.0 +760.0,2.5,4.080355347942114,1.0,0.0 +761.0,2.5,4.080223318596588,1.0,0.0 +762.0,2.5,4.080094506404174,1.0,0.0 +763.0,2.5,4.079968770905705,1.0,0.0 +764.0,2.5,4.0798459774126865,1.0,0.0 +765.0,2.5,4.0797259967792545,1.0,0.0 +766.0,2.5,4.079608705189785,1.0,0.0 +767.0,2.5,4.079493948205887,1.0,0.0 +768.0,2.5,4.079381547473939,1.0,0.0 +769.0,2.5,4.079271442100604,1.0,0.0 +770.0,2.5,4.079163519575337,1.0,0.0 +771.0,2.5,4.079057671435461,1.0,0.0 +772.0,2.5,4.078953793119238,1.0,0.0 +773.0,2.5,4.078851783826287,1.0,0.0 +774.0,2.5,4.07875154638534,1.0,0.0 +775.0,2.5,4.0786529792242465,1.0,0.0 +776.0,2.5,4.078555977035114,1.0,0.0 +777.0,2.5,4.078460463561321,1.0,0.0 +778.0,2.5,4.0783663529236325,1.0,0.0 +779.0,2.5,4.078273562173607,1.0,0.0 +780.0,2.5,4.078182011193613,1.0,0.0 +781.0,2.5,4.078091622601979,1.0,0.0 +782.0,2.5,4.078002321662702,1.0,0.0 +783.0,2.5,4.077914035307862,1.0,0.0 +784.0,2.5,4.077826692056932,1.0,0.0 +785.0,2.5,4.0777402258409134,1.0,0.0 +786.0,2.5,4.077654571435659,1.0,0.0 +787.0,2.5,4.077569665857292,1.0,0.0 +788.0,2.5,4.077485448296463,1.0,0.0 +789.0,2.5,4.077401860056638,1.0,0.0 +790.0,2.5,4.077318844495759,1.0,0.0 +791.0,2.5,4.077236341050073,1.0,0.0 +792.0,2.5,4.0771542857423775,1.0,0.0 +793.0,2.5,4.0770726373132895,1.0,0.0 +794.0,2.5,4.076991345937895,1.0,0.0 +795.0,2.5,4.076910363576668,1.0,0.0 +796.0,2.5,4.076829643933492,1.0,0.0 +797.0,2.5,4.076749142416511,1.0,0.0 +798.0,2.5,4.076668816102087,1.0,0.0 +799.0,2.5,4.076588623701528,1.0,0.0 +800.0,2.5,4.07650852553042,1.0,0.0 +801.0,2.5,4.076428483480787,1.0,0.0 +802.0,2.5,4.076348460995688,1.0,0.0 +803.0,2.5,4.076268423046131,1.0,0.0 +804.0,2.5,4.076188320415346,1.0,0.0 +805.0,2.5,4.076108076853919,1.0,0.0 +806.0,2.5,4.076027700246825,1.0,0.0 +807.0,2.5,4.075947158610126,1.0,0.0 +808.0,2.5,4.075866421197667,1.0,0.0 +809.0,2.5,4.075785458480302,1.0,0.0 +810.0,2.5,4.075704242126962,1.0,0.0 +811.0,2.5,4.075622744987126,1.0,0.0 +812.0,2.5,4.07554094107501,1.0,0.0 +813.0,2.5,4.075458805555057,1.0,0.0 +814.0,2.5,4.0753763147289055,1.0,0.0 +815.0,2.5,4.075293446023828,1.0,0.0 +816.0,2.5,4.075210177982228,1.0,0.0 +817.0,2.5,4.075126478009019,1.0,0.0 +818.0,2.5,4.075042268381398,1.0,0.0 +819.0,2.5,4.0749575776201485,1.0,0.0 +820.0,2.5,4.074872385282608,1.0,0.0 +821.0,2.5,4.07478667174869,1.0,0.0 +822.0,2.5,4.074700418206247,1.0,0.0 +823.0,2.5,4.074613606637252,1.0,0.0 +824.0,2.5,4.074526219804822,1.0,0.0 +825.0,2.5,4.07443824124094,1.0,0.0 +826.0,2.5,4.0743496552349345,1.0,0.0 +827.0,2.5,4.07426044682273,1.0,0.0 +828.0,2.5,4.074170601776774,1.0,0.0 +829.0,2.5,4.074080106596522,1.0,0.0 +830.0,2.5,4.073988944409249,1.0,0.0 +831.0,2.5,4.07389706411082,1.0,0.0 +832.0,2.5,4.07380448348669,1.0,0.0 +833.0,2.5,4.073711189875896,1.0,0.0 +834.0,2.5,4.073617171155592,1.0,0.0 +835.0,2.5,4.073522415729633,1.0,0.0 +836.0,2.5,4.073426912517358,1.0,0.0 +837.0,2.5,4.073330650942989,1.0,0.0 +838.0,2.5,4.073233620925456,1.0,0.0 +839.0,2.5,4.073135812868662,1.0,0.0 +840.0,2.5,4.073037217652044,1.0,0.0 +841.0,2.5,4.072937826621785,1.0,0.0 +842.0,2.5,4.072837631582176,1.0,0.0 +843.0,2.5,4.072736624454799,1.0,0.0 +844.0,2.5,4.072634785196609,1.0,0.0 +845.0,2.5,4.07253211599917,1.0,0.0 +846.0,2.5,4.07242860985028,1.0,0.0 +847.0,2.5,4.072324260116496,1.0,0.0 +848.0,2.5,4.072219060535384,1.0,0.0 +849.0,2.5,4.072113005207956,1.0,0.0 +850.0,2.5,4.072006088591653,1.0,0.0 +851.0,2.5,4.07189830549335,1.0,0.0 +852.0,2.5,4.071789651062911,1.0,0.0 +853.0,2.5,4.071680120786833,1.0,0.0 +854.0,2.5,4.071569710482282,1.0,0.0 +855.0,2.5,4.071458416291358,1.0,0.0 +856.0,2.5,4.071346234675647,1.0,0.0 +857.0,2.5,4.071233157910828,1.0,0.0 +858.0,2.5,4.071119185993691,1.0,0.0 +859.0,2.5,4.0710043162925444,1.0,0.0 +860.0,2.5,4.070888546282846,1.0,0.0 +861.0,2.5,4.070771873720951,1.0,0.0 +862.0,2.5,4.0706542966396135,1.0,0.0 +863.0,2.5,4.070535813343663,1.0,0.0 +864.0,2.5,4.070416422405941,1.0,0.0 +865.0,2.5,4.070296122663345,1.0,0.0 +866.0,2.5,4.070174913213193,1.0,0.0 +867.0,2.5,4.070052793409649,1.0,0.0 +868.0,2.5,4.069929762860374,1.0,0.0 +869.0,2.5,4.069805821423346,1.0,0.0 +870.0,2.5,4.069680951292653,1.0,0.0 +871.0,2.5,4.069555163670968,1.0,0.0 +872.0,2.5,4.069428460770549,1.0,0.0 +873.0,2.5,4.069300842934896,1.0,0.0 +874.0,2.5,4.069172310729855,1.0,0.0 +875.0,2.5,4.069042864941206,1.0,0.0 +876.0,2.5,4.06891250657255,1.0,0.0 +877.0,2.5,4.068781236843257,1.0,0.0 +878.0,2.5,4.068649057186542,1.0,0.0 +879.0,2.5,4.06851596924772,1.0,0.0 +880.0,2.5,4.068381974882488,1.0,0.0 +881.0,2.5,4.068247076155449,1.0,0.0 +882.0,2.5,4.06811127533861,1.0,0.0 +883.0,2.5,4.067974574910159,1.0,0.0 +884.0,2.5,4.067836977553112,1.0,0.0 +885.0,2.5,4.067698486154311,1.0,0.0 +886.0,2.5,4.067559103803314,1.0,0.0 +887.0,2.5,4.067418833791489,1.0,0.0 +888.0,2.5,4.067277679611176,1.0,0.0 +889.0,2.5,4.067135644954893,1.0,0.0 +890.0,2.5,4.066992733714616,1.0,0.0 +891.0,2.5,4.066848892267121,1.0,0.0 +892.0,2.5,4.066704158323439,1.0,0.0 +893.0,2.5,4.066558545968444,1.0,0.0 +894.0,2.5,4.066412058590058,1.0,0.0 +895.0,2.5,4.066264699716728,1.0,0.0 +896.0,2.5,4.066116473016315,1.0,0.0 +897.0,2.5,4.065967382294969,1.0,0.0 +898.0,2.5,4.065817431496182,1.0,0.0 +899.0,2.5,4.065666624699817,1.0,0.0 +900.0,2.5,4.065514966121278,1.0,0.0 +901.0,2.5,4.0653624601105625,1.0,0.0 +902.0,2.5,4.065209111151687,1.0,0.0 +903.0,2.5,4.065054923861827,1.0,0.0 +904.0,2.5,4.064899902990779,1.0,0.0 +905.0,2.5,4.064744053420258,1.0,0.0 +906.0,2.5,4.064587380163446,1.0,0.0 +907.0,2.5,4.064429888364402,1.0,0.0 +908.0,2.5,4.06427158329768,1.0,0.0 +909.0,2.5,4.064112470367832,1.0,0.0 +910.0,2.5,4.063952555109091,1.0,0.0 +911.0,2.5,4.063791843184997,1.0,0.0 +912.0,2.5,4.063630277497095,1.0,0.0 +913.0,2.5,4.063467894940995,1.0,0.0 +914.0,2.5,4.063304716928806,1.0,0.0 +915.0,2.5,4.063140748220183,1.0,0.0 +916.0,2.5,4.062975993642285,1.0,0.0 +917.0,2.5,4.06281045808888,1.0,0.0 +918.0,2.5,4.062644146519421,1.0,0.0 +919.0,2.5,4.062477063958197,1.0,0.0 +920.0,2.5,4.062309215493494,1.0,0.0 +921.0,2.5,4.062140606276824,1.0,0.0 +922.0,2.5,4.061971241522149,1.0,0.0 +923.0,2.5,4.061801126505238,1.0,0.0 +924.0,2.5,4.0616302665629105,1.0,0.0 +925.0,2.5,4.061458667092474,1.0,0.0 +926.0,2.5,4.061286333551058,1.0,0.0 +927.0,2.5,4.061113271455032,1.0,0.0 +928.0,2.5,4.060939486379491,1.0,0.0 +929.0,2.5,4.060764983957747,1.0,0.0 +930.0,2.5,4.060589769880763,1.0,0.0 +931.0,2.5,4.060413849896752,1.0,0.0 +932.0,2.5,4.060237229810745,1.0,0.0 +933.0,2.5,4.06005987981483,1.0,0.0 +934.0,2.5,4.0598818196646285,1.0,0.0 +935.0,2.5,4.059703067216386,1.0,0.0 +936.0,2.5,4.059523627666805,1.0,0.0 +937.0,2.5,4.059343506233953,1.0,0.0 +938.0,2.5,4.059162708156519,1.0,0.0 +939.0,2.5,4.058981238693309,1.0,0.0 +940.0,2.5,4.058799103122527,1.0,0.0 +941.0,2.5,4.058616306741245,1.0,0.0 +942.0,2.5,4.058432854864801,1.0,0.0 +943.0,2.5,4.05824875282633,1.0,0.0 +944.0,2.5,4.058064005976207,1.0,0.0 +945.0,2.5,4.057878619681599,1.0,0.0 +946.0,2.5,4.057692599325923,1.0,0.0 +947.0,2.5,4.05750595030854,1.0,0.0 +948.0,2.5,4.0573186780442025,1.0,0.0 +949.0,2.5,4.057130787962739,1.0,0.0 +950.0,2.5,4.056942285508683,1.0,0.0 +951.0,2.5,4.0567531761408,1.0,0.0 +952.0,2.5,4.056563465331922,1.0,0.0 +953.0,2.5,4.056373158568492,1.0,0.0 +954.0,2.5,4.056182249396747,1.0,0.0 +955.0,2.5,4.055990746503981,1.0,0.0 +956.0,2.5,4.055798660633878,1.0,0.0 +957.0,2.5,4.055605997033133,1.0,0.0 +958.0,2.5,4.05541276094956,1.0,0.0 +959.0,2.5,4.055218957631721,1.0,0.0 +960.0,2.5,4.055024592328643,1.0,0.0 +961.0,2.5,4.054829670289562,1.0,0.0 +962.0,2.5,4.054634196763572,1.0,0.0 +963.0,2.5,4.054438176999461,1.0,0.0 +964.0,2.5,4.054241616245413,1.0,0.0 +965.0,2.5,4.054044519748825,1.0,0.0 +966.0,2.5,4.053846892756033,1.0,0.0 +967.0,2.5,4.053648740512184,1.0,0.0 +968.0,2.5,4.0534500682609895,1.0,0.0 +969.0,2.5,4.05325088124461,1.0,0.0 +970.0,2.5,4.053051184703445,1.0,0.0 +971.0,2.5,4.0528509838760245,1.0,0.0 +972.0,2.5,4.052650283998865,1.0,0.0 +973.0,2.5,4.05244909030632,1.0,0.0 +974.0,2.5,4.052247408030486,1.0,0.0 +975.0,2.5,4.052045239239031,1.0,0.0 +976.0,2.5,4.051842589327295,1.0,0.0 +977.0,2.5,4.051639465184019,1.0,0.0 +978.0,2.5,4.051435871888983,1.0,0.0 +979.0,2.5,4.051231814512316,1.0,0.0 +980.0,2.5,4.051027298114285,1.0,0.0 +981.0,2.5,4.0508223277452835,1.0,0.0 +982.0,2.5,4.050616908445679,1.0,0.0 +983.0,2.5,4.050411045245694,1.0,0.0 +984.0,2.5,4.050204743165406,1.0,0.0 +985.0,2.5,4.049998007214599,1.0,0.0 +986.0,2.5,4.0497908423927385,1.0,0.0 +987.0,2.5,4.049583253688934,1.0,0.0 +988.0,2.5,4.049375246081811,1.0,0.0 +989.0,2.5,4.049166824539588,1.0,0.0 +990.0,2.5,4.048957994019945,1.0,0.0 +990.000000001,0.0,4.066274523105717,1.0,1.0 +991.0,0.0,4.067511739204034,1.0,1.0 +992.0,0.0,4.068650009253588,1.0,1.0 +993.0,0.0,4.0696997147561635,1.0,1.0 +994.0,0.0,4.070670124553682,1.0,1.0 +995.0,0.0,4.0715693731808384,1.0,1.0 +996.0,0.0,4.072404508687583,1.0,1.0 +997.0,0.0,4.073181636025303,1.0,1.0 +998.0,0.0,4.0739062339845,1.0,1.0 +999.0,0.0,4.074584320156081,1.0,1.0 +1000.0,0.0,4.075218792981734,1.0,1.0 +1001.0,0.0,4.07581509928771,1.0,1.0 +1002.0,0.0,4.0763762026188575,1.0,1.0 +1003.0,0.0,4.0769049131918,1.0,1.0 +1004.0,0.0,4.077404780641758,1.0,1.0 +1005.0,0.0,4.077877158490983,1.0,1.0 +1006.0,0.0,4.07832509236538,1.0,1.0 +1007.0,0.0,4.0787501488805855,1.0,1.0 +1008.0,0.0,4.079154052977803,1.0,1.0 +1009.0,0.0,4.079538687437624,1.0,1.0 +1010.0,0.0,4.0799050326547475,1.0,1.0 +1011.0,0.0,4.080254786713908,1.0,1.0 +1012.0,0.0,4.080588888736091,1.0,1.0 +1013.0,0.0,4.080908472259136,1.0,1.0 +1014.0,0.0,4.081214603883834,1.0,1.0 +1015.0,0.0,4.081507905298471,1.0,1.0 +1016.0,0.0,4.0817893903723315,1.0,1.0 +1017.0,0.0,4.082059896227781,1.0,1.0 +1018.0,0.0,4.082320048210548,1.0,1.0 +1019.0,0.0,4.082570341984091,1.0,1.0 +1020.0,0.0,4.082811496044326,1.0,1.0 +1021.0,0.0,4.083044069852036,1.0,1.0 +1022.0,0.0,4.083268510883889,1.0,1.0 +1023.0,0.0,4.083485244294439,1.0,1.0 +1024.0,0.0,4.083694693278856,1.0,1.0 +1025.0,0.0,4.08389721605856,1.0,1.0 +1026.0,0.0,4.0840933422143015,1.0,1.0 +1027.0,0.0,4.08428335109877,1.0,1.0 +1028.0,0.0,4.084467487019907,1.0,1.0 +1029.0,0.0,4.084645991753886,1.0,1.0 +1030.0,0.0,4.084819072696092,1.0,1.0 +1031.0,0.0,4.084986904340376,1.0,1.0 +1032.0,0.0,4.085149911007361,1.0,1.0 +1033.0,0.0,4.085308604700753,1.0,1.0 +1034.0,0.0,4.08546285585263,1.0,1.0 +1035.0,0.0,4.0856128132306715,1.0,1.0 +1036.0,0.0,4.08575860412488,1.0,1.0 +1037.0,0.0,4.085900335197976,1.0,1.0 +1038.0,0.0,4.086038098836824,1.0,1.0 +1039.0,0.0,4.08617270770479,1.0,1.0 +1040.0,0.0,4.086303863559995,1.0,1.0 +1041.0,0.0,4.086431684092347,1.0,1.0 +1042.0,0.0,4.086556275849842,1.0,1.0 +1043.0,0.0,4.086677734646073,1.0,1.0 +1044.0,0.0,4.0867961459470274,1.0,1.0 +1045.0,0.0,4.086911791390844,1.0,1.0 +1046.0,0.0,4.08702481724515,1.0,1.0 +1047.0,0.0,4.087135220618481,1.0,1.0 +1048.0,0.0,4.0872430942025275,1.0,1.0 +1049.0,0.0,4.087348524979184,1.0,1.0 +1050.0,0.0,4.087451594413944,1.0,1.0 +1051.0,0.0,4.087552393836369,1.0,1.0 +1052.0,0.0,4.0876510648822855,1.0,1.0 +1053.0,0.0,4.087747639120805,1.0,1.0 +1054.0,0.0,4.08784218853943,1.0,1.0 +1055.0,0.0,4.087934781211356,1.0,1.0 +1056.0,0.0,4.088025481420903,1.0,1.0 +1057.0,0.0,4.088114349783614,1.0,1.0 +1058.0,0.0,4.088201455845237,1.0,1.0 +1059.0,0.0,4.088286851571946,1.0,1.0 +1060.0,0.0,4.088370586763548,1.0,1.0 +1061.0,0.0,4.088452710494326,1.0,1.0 +1062.0,0.0,4.088533268835792,1.0,1.0 +1063.0,0.0,4.088612304946186,1.0,1.0 +1064.0,0.0,4.08868988445602,1.0,1.0 +1065.0,0.0,4.088766078305341,1.0,1.0 +1066.0,0.0,4.0888408949833455,1.0,1.0 +1067.0,0.0,4.088914370653588,1.0,1.0 +1068.0,0.0,4.088986538911817,1.0,1.0 +1069.0,0.0,4.089057430858544,1.0,1.0 +1070.0,0.0,4.089127075168416,1.0,1.0 +1071.0,0.0,4.0891954981568714,1.0,1.0 +1072.0,0.0,4.089262723844032,1.0,1.0 +1073.0,0.0,4.089328774015838,1.0,1.0 +1074.0,0.0,4.089393689368266,1.0,1.0 +1075.0,0.0,4.089457657266609,1.0,1.0 +1076.0,0.0,4.0895205732893665,1.0,1.0 +1077.0,0.0,4.089582460509208,1.0,1.0 +1078.0,0.0,4.089643340419053,1.0,1.0 +1079.0,0.0,4.089703232972178,1.0,1.0 +1080.0,0.0,4.089762156620776,1.0,1.0 +1081.0,0.0,4.089820128353002,1.0,1.0 +1082.0,0.0,4.089877163728433,1.0,1.0 +1083.0,0.0,4.0899332769123,1.0,1.0 +1084.0,0.0,4.089988480708047,1.0,1.0 +1085.0,0.0,4.090042942961702,1.0,1.0 +1086.0,0.0,4.090096605343914,1.0,1.0 +1087.0,0.0,4.09014946085848,1.0,1.0 +1088.0,0.0,4.0902015264805796,1.0,1.0 +1089.0,0.0,4.090252818381426,1.0,1.0 +1090.0,0.0,4.090303351946826,1.0,1.0 +1091.0,0.0,4.090353141795051,1.0,1.0 +1092.0,0.0,4.090402201794179,1.0,1.0 +1093.0,0.0,4.090450545078762,1.0,1.0 +1094.0,0.0,4.090498184065852,1.0,1.0 +1095.0,0.0,4.09054517636494,1.0,1.0 +1096.0,0.0,4.090591544875099,1.0,1.0 +1097.0,0.0,4.090637274177523,1.0,1.0 +1098.0,0.0,4.090682378239904,1.0,1.0 +1099.0,0.0,4.090726870582236,1.0,1.0 +1100.0,0.0,4.090770764286746,1.0,1.0 +1101.0,0.0,4.090814072007476,1.0,1.0 +1102.0,0.0,4.0908568059794765,1.0,1.0 +1103.0,0.0,4.09089897802794,1.0,1.0 +1104.0,0.0,4.090940599576809,1.0,1.0 +1105.0,0.0,4.090981683409852,1.0,1.0 +1106.0,0.0,4.091022245792877,1.0,1.0 +1107.0,0.0,4.091062295272398,1.0,1.0 +1108.0,0.0,4.091101843141846,1.0,1.0 +1109.0,0.0,4.091140900448937,1.0,1.0 +1110.0,0.0,4.091179478000868,1.0,1.0 +1110.000000001,-2.5,4.108685027099113,1.0,2.0 +1111.0,-2.5,4.109249145264736,1.0,2.0 +1112.0,-2.5,4.109756288211877,1.0,2.0 +1113.0,-2.5,4.110216306657217,1.0,2.0 +1114.0,-2.5,4.11063679848971,1.0,2.0 +1115.0,-2.5,4.111024144279855,1.0,2.0 +1116.0,-2.5,4.111383688693465,1.0,2.0 +1117.0,-2.5,4.111719910353336,1.0,2.0 +1118.0,-2.5,4.112036627838165,1.0,2.0 +1119.0,-2.5,4.1123374513584645,1.0,2.0 +1120.0,-2.5,4.112624703713546,1.0,2.0 +1121.0,-2.5,4.112901264842645,1.0,2.0 +1122.0,-2.5,4.113169023059253,1.0,2.0 +1123.0,-2.5,4.113429662109631,1.0,2.0 +1124.0,-2.5,4.1136849705905485,1.0,2.0 +1125.0,-2.5,4.11393590218169,1.0,2.0 +1126.0,-2.5,4.114183898556045,1.0,2.0 +1127.0,-2.5,4.114429812580923,1.0,2.0 +1128.0,-2.5,4.114674508933649,1.0,2.0 +1129.0,-2.5,4.114918858556363,1.0,2.0 +1130.0,-2.5,4.115163355133316,1.0,2.0 +1131.0,-2.5,4.115408750813659,1.0,2.0 +1132.0,-2.5,4.115655457774607,1.0,2.0 +1133.0,-2.5,4.115903970540377,1.0,2.0 +1134.0,-2.5,4.116154731935361,1.0,2.0 +1135.0,-2.5,4.1164079747050675,1.0,2.0 +1136.0,-2.5,4.116664113153866,1.0,2.0 +1137.0,-2.5,4.116923483994771,1.0,2.0 +1138.0,-2.5,4.117186304751822,1.0,2.0 +1139.0,-2.5,4.117452733393656,1.0,2.0 +1140.0,-2.5,4.117723048647415,1.0,2.0 +1141.0,-2.5,4.117997449976209,1.0,2.0 +1142.0,-2.5,4.118276067261086,1.0,2.0 +1143.0,-2.5,4.118559027442687,1.0,2.0 +1144.0,-2.5,4.118846454892512,1.0,2.0 +1145.0,-2.5,4.119138434977853,1.0,2.0 +1146.0,-2.5,4.119435211584634,1.0,2.0 +1147.0,-2.5,4.1197368141989426,1.0,2.0 +1148.0,-2.5,4.120043272604645,1.0,2.0 +1149.0,-2.5,4.120354607129009,1.0,2.0 +1150.0,-2.5,4.120670808247033,1.0,2.0 +1151.0,-2.5,4.120991834230043,1.0,2.0 +1152.0,-2.5,4.121317949818342,1.0,2.0 +1153.0,-2.5,4.1216494070134075,1.0,2.0 +1154.0,-2.5,4.121985930927271,1.0,2.0 +1155.0,-2.5,4.122327484251333,1.0,2.0 +1156.0,-2.5,4.122674005538976,1.0,2.0 +1157.0,-2.5,4.123025407361925,1.0,2.0 +1158.0,-2.5,4.123381649938508,1.0,2.0 +1159.0,-2.5,4.1237434461927736,1.0,2.0 +1160.0,-2.5,4.124110291142608,1.0,2.0 +1161.0,-2.5,4.124482143996708,1.0,2.0 +1162.0,-2.5,4.124858951949952,1.0,2.0 +1163.0,-2.5,4.125240649374779,1.0,2.0 +1164.0,-2.5,4.125627156974626,1.0,2.0 +1165.0,-2.5,4.126018765297173,1.0,2.0 +1166.0,-2.5,4.126415420508046,1.0,2.0 +1167.0,-2.5,4.1268169804047625,1.0,2.0 +1168.0,-2.5,4.1272234104186545,1.0,2.0 +1169.0,-2.5,4.127634671758837,1.0,2.0 +1170.0,-2.5,4.128050721125763,1.0,2.0 +1171.0,-2.5,4.128471557190049,1.0,2.0 +1172.0,-2.5,4.128897234233817,1.0,2.0 +1173.0,-2.5,4.129327650792582,1.0,2.0 +1174.0,-2.5,4.1297627716613174,1.0,2.0 +1175.0,-2.5,4.130202559226611,1.0,2.0 +1176.0,-2.5,4.13064697326481,1.0,2.0 +1177.0,-2.5,4.131095970727928,1.0,2.0 +1178.0,-2.5,4.131549539618323,1.0,2.0 +1179.0,-2.5,4.132007619400688,1.0,2.0 +1180.0,-2.5,4.132470161637274,1.0,2.0 +1181.0,-2.5,4.132937116253136,1.0,2.0 +1182.0,-2.5,4.133408429926535,1.0,2.0 +1183.0,-2.5,4.133884045858476,1.0,2.0 +1184.0,-2.5,4.13436399518869,1.0,2.0 +1185.0,-2.5,4.134848256511372,1.0,2.0 +1186.0,-2.5,4.135336720628326,1.0,2.0 +1187.0,-2.5,4.135829329839066,1.0,2.0 +1188.0,-2.5,4.136326022479192,1.0,2.0 +1189.0,-2.5,4.136826732668227,1.0,2.0 +1190.0,-2.5,4.137331390055763,1.0,2.0 +1191.0,-2.5,4.137839919566874,1.0,2.0 +1192.0,-2.5,4.138352241147238,1.0,2.0 +1193.0,-2.5,4.138868269508739,1.0,2.0 +1194.0,-2.5,4.139388090405576,1.0,2.0 +1195.0,-2.5,4.139911945468805,1.0,2.0 +1196.0,-2.5,4.140439469506935,1.0,2.0 +1197.0,-2.5,4.140970596830726,1.0,2.0 +1198.0,-2.5,4.141505258693858,1.0,2.0 +1199.0,-2.5,4.142043383132191,1.0,2.0 +1200.0,-2.5,4.142584894803722,1.0,2.0 +1201.0,-2.5,4.143129714829247,1.0,2.0 +1202.0,-2.5,4.143677760634381,1.0,2.0 +1203.0,-2.5,4.1442289457928165,1.0,2.0 +1204.0,-2.5,4.14478322862258,1.0,2.0 +1205.0,-2.5,4.145341122756782,1.0,2.0 +1206.0,-2.5,4.145902133383769,1.0,2.0 +1207.0,-2.5,4.146466201686998,1.0,2.0 +1208.0,-2.5,4.147033267834858,1.0,2.0 +1209.0,-2.5,4.1476032709162425,1.0,2.0 +1210.0,-2.5,4.148176148876015,1.0,2.0 +1211.0,-2.5,4.148751838450418,1.0,2.0 +1212.0,-2.5,4.149330275102583,1.0,2.0 +1213.0,-2.5,4.149911392958335,1.0,2.0 +1214.0,-2.5,4.150495124742351,1.0,2.0 +1215.0,-2.5,4.151081702911843,1.0,2.0 +1216.0,-2.5,4.151670935118932,1.0,2.0 +1217.0,-2.5,4.152262725946282,1.0,2.0 +1218.0,-2.5,4.152857026354436,1.0,2.0 +1219.0,-2.5,4.153453787405518,1.0,2.0 +1220.0,-2.5,4.154052960236228,1.0,2.0 +1221.0,-2.5,4.154654496030229,1.0,2.0 +1222.0,-2.5,4.155258345990371,1.0,2.0 +1223.0,-2.5,4.155864461310419,1.0,2.0 +1224.0,-2.5,4.156472793146713,1.0,2.0 +1225.0,-2.5,4.157083337101548,1.0,2.0 +1226.0,-2.5,4.157696051150865,1.0,2.0 +1227.0,-2.5,4.1583108666402815,1.0,2.0 +1228.0,-2.5,4.158927739327761,1.0,2.0 +1229.0,-2.5,4.159546625154724,1.0,2.0 +1230.0,-2.5,4.160167480223082,1.0,2.0 +1231.0,-2.5,4.160790260771999,1.0,2.0 +1232.0,-2.5,4.161414923154602,1.0,2.0 +1233.0,-2.5,4.162041423814567,1.0,2.0 +1234.0,-2.5,4.16266971926274,1.0,2.0 +1235.0,-2.5,4.163299771039238,1.0,2.0 +1236.0,-2.5,4.1639315429873,1.0,2.0 +1237.0,-2.5,4.164564985346292,1.0,2.0 +1238.0,-2.5,4.165200055599982,1.0,2.0 +1239.0,-2.5,4.165836711249497,1.0,2.0 +1240.0,-2.5,4.1664749097914004,1.0,2.0 +1241.0,-2.5,4.1671146086956625,1.0,2.0 +1242.0,-2.5,4.167755765383997,1.0,2.0 +1243.0,-2.5,4.168398337208374,1.0,2.0 +1244.0,-2.5,4.1690422814296175,1.0,2.0 +1245.0,-2.5,4.169687567259625,1.0,2.0 +1246.0,-2.5,4.170334241751983,1.0,2.0 +1247.0,-2.5,4.170982193315098,1.0,2.0 +1248.0,-2.5,4.171631382319352,1.0,2.0 +1249.0,-2.5,4.172281769042215,1.0,2.0 +1250.0,-2.5,4.172933313647918,1.0,2.0 +1251.0,-2.5,4.173585976167334,1.0,2.0 +1252.0,-2.5,4.174239716478154,1.0,2.0 +1253.0,-2.5,4.1748944942855015,1.0,2.0 +1254.0,-2.5,4.175550269102773,1.0,2.0 +1255.0,-2.5,4.1762070002328775,1.0,2.0 +1256.0,-2.5,4.176864646749841,1.0,2.0 +1257.0,-2.5,4.177523167480745,1.0,2.0 +1258.0,-2.5,4.178182520988054,1.0,2.0 +1259.0,-2.5,4.178842665552368,1.0,2.0 +1260.0,-2.5,4.179503559155461,1.0,2.0 +1260.000000001,0.0,4.160964013318741,1.0,3.0 +1261.0,0.0,4.158572141824962,1.0,3.0 +1262.0,0.0,4.156376079810138,1.0,3.0 +1263.0,0.0,4.154355287883229,1.0,3.0 +1264.0,0.0,4.152491375699777,1.0,3.0 +1265.0,0.0,4.15076812516371,1.0,3.0 +1266.0,0.0,4.149171470426165,1.0,3.0 +1267.0,0.0,4.147689317719975,1.0,3.0 +1268.0,0.0,4.146309632986848,1.0,3.0 +1269.0,0.0,4.145023571363815,1.0,3.0 +1270.0,0.0,4.143820927136515,1.0,3.0 +1271.0,0.0,4.142695079880294,1.0,3.0 +1272.0,0.0,4.1416381894283445,1.0,3.0 +1273.0,0.0,4.14064487102113,1.0,3.0 +1274.0,0.0,4.13970920934347,1.0,3.0 +1275.0,0.0,4.138826626364079,1.0,3.0 +1276.0,0.0,4.137992857750286,1.0,3.0 +1277.0,0.0,4.137204112149755,1.0,3.0 +1278.0,0.0,4.136456270215449,1.0,3.0 +1279.0,0.0,4.135746551393303,1.0,3.0 +1280.0,0.0,4.135072086036729,1.0,3.0 +1281.0,0.0,4.134429879915956,1.0,3.0 +1282.0,0.0,4.133817769759332,1.0,3.0 +1283.0,0.0,4.133233704495695,1.0,3.0 +1284.0,0.0,4.132675743275834,1.0,3.0 +1285.0,0.0,4.132141856675212,1.0,3.0 +1286.0,0.0,4.13163047997326,1.0,3.0 +1287.0,0.0,4.13114039589672,1.0,3.0 +1288.0,0.0,4.130670508342971,1.0,3.0 +1289.0,0.0,4.130219777592415,1.0,3.0 +1290.0,0.0,4.129785742285175,1.0,3.0 +1291.0,0.0,4.129368320529917,1.0,3.0 +1292.0,0.0,4.1289667590876435,1.0,3.0 +1293.0,0.0,4.128580441095567,1.0,3.0 +1294.0,0.0,4.128208154421832,1.0,3.0 +1295.0,0.0,4.127848527451031,1.0,3.0 +1296.0,0.0,4.127501498535111,1.0,3.0 +1297.0,0.0,4.127166525127259,1.0,3.0 +1298.0,0.0,4.12684313956645,1.0,3.0 +1299.0,0.0,4.126530143174026,1.0,3.0 +1300.0,0.0,4.1262271792578895,1.0,3.0 +1301.0,0.0,4.125933882682511,1.0,3.0 +1302.0,0.0,4.125649818819935,1.0,3.0 +1303.0,0.0,4.125374543972036,1.0,3.0 +1304.0,0.0,4.125107415795206,1.0,3.0 +1305.0,0.0,4.124848189574386,1.0,3.0 +1306.0,0.0,4.124596511743216,1.0,3.0 +1307.0,0.0,4.124352057786894,1.0,3.0 +1308.0,0.0,4.124114469897172,1.0,3.0 +1309.0,0.0,4.123883423770482,1.0,3.0 +1310.0,0.0,4.123658683075876,1.0,3.0 +1311.0,0.0,4.123440001395834,1.0,3.0 +1312.0,0.0,4.123227154652392,1.0,3.0 +1313.0,0.0,4.123019671431074,1.0,3.0 +1314.0,0.0,4.122817455156986,1.0,3.0 +1315.0,0.0,4.122620334724273,1.0,3.0 +1316.0,0.0,4.122428142796556,1.0,3.0 +1317.0,0.0,4.12224073234334,1.0,3.0 +1318.0,0.0,4.122057976175602,1.0,3.0 +1319.0,0.0,4.121879766506314,1.0,3.0 +1320.0,0.0,4.121706014534377,1.0,3.0 +1321.0,0.0,4.121535798038875,1.0,3.0 +1322.0,0.0,4.121369506151888,1.0,3.0 +1323.0,0.0,4.121207051728784,1.0,3.0 +1324.0,0.0,4.12104834283579,1.0,3.0 +1325.0,0.0,4.120893300672793,1.0,3.0 +1326.0,0.0,4.120741859315891,1.0,3.0 +1327.0,0.0,4.120593965473212,1.0,3.0 +1328.0,0.0,4.12044955868774,1.0,3.0 +1329.0,0.0,4.12030772622053,1.0,3.0 +1330.0,0.0,4.120168950001753,1.0,3.0 +1331.0,0.0,4.120033151243904,1.0,3.0 +1332.0,0.0,4.119900257880457,1.0,3.0 +1333.0,0.0,4.119770204439625,1.0,3.0 +1334.0,0.0,4.119642931924266,1.0,3.0 +1335.0,0.0,4.119518387696884,1.0,3.0 +1336.0,0.0,4.119396494292352,1.0,3.0 +1337.0,0.0,4.119276777146785,1.0,3.0 +1338.0,0.0,4.1191594517585095,1.0,3.0 +1339.0,0.0,4.119044450606128,1.0,3.0 +1340.0,0.0,4.118931709417646,1.0,3.0 +1341.0,0.0,4.11882116710964,1.0,3.0 +1342.0,0.0,4.118712765728629,1.0,3.0 +1343.0,0.0,4.1186064503949895,1.0,3.0 +1344.0,0.0,4.118502156713998,1.0,3.0 +1345.0,0.0,4.118399739448249,1.0,3.0 +1346.0,0.0,4.118299209261662,1.0,3.0 +1347.0,0.0,4.118200513557185,1.0,3.0 +1348.0,0.0,4.1181036019272454,1.0,3.0 +1349.0,0.0,4.118008426115434,1.0,3.0 +1350.0,0.0,4.117914939979552,1.0,3.0 +1351.0,0.0,4.117823099456101,1.0,3.0 +1352.0,0.0,4.117732860639865,1.0,3.0 +1353.0,0.0,4.1176441741203815,1.0,3.0 +1354.0,0.0,4.117557007544608,1.0,3.0 +1355.0,0.0,4.117471323815646,1.0,3.0 +1356.0,0.0,4.117387087687448,1.0,3.0 +1357.0,0.0,4.11730426573703,1.0,3.0 +1358.0,0.0,4.117222826337418,1.0,3.0 +1359.0,0.0,4.117142739631756,1.0,3.0 +1360.0,0.0,4.117063958651974,1.0,3.0 +1361.0,0.0,4.116986396092423,1.0,3.0 +1362.0,0.0,4.116910074054813,1.0,3.0 +1363.0,0.0,4.116834966029668,1.0,3.0 +1364.0,0.0,4.116761047174298,1.0,3.0 +1365.0,0.0,4.116688294290901,1.0,3.0 +1366.0,0.0,4.11661668580559,1.0,3.0 +1367.0,0.0,4.116546201748191,1.0,3.0 +1368.0,0.0,4.1164768237325,1.0,3.0 +1369.0,0.0,4.116408534937501,1.0,3.0 +1370.0,0.0,4.116341320089215,1.0,3.0 +1371.0,0.0,4.1162751654430405,1.0,3.0 +1372.0,0.0,4.116210058766934,1.0,3.0 +1373.0,0.0,4.1161459643077425,1.0,3.0 +1374.0,0.0,4.11608277734336,1.0,3.0 +1375.0,0.0,4.116020544200532,1.0,3.0 +1376.0,0.0,4.115959245171489,1.0,3.0 +1377.0,0.0,4.115898860961665,1.0,3.0 +1378.0,0.0,4.11583937268339,1.0,3.0 +1379.0,0.0,4.115780761849897,1.0,3.0 +1380.0,0.0,4.115723010369455,1.0,3.0 diff --git a/examples/Initial_API.py b/examples/Initial_API.py index 40e5179a6..1c1db9d2e 100644 --- a/examples/Initial_API.py +++ b/examples/Initial_API.py @@ -1,36 +1,38 @@ import pybop +import pandas as pd import numpy as np # Form observations -applied_current = [np.arange(0,3,0.1),np.ones([30])] -observation = [ - pybop.Observed(["Current function [A]"], applied_current), - pybop.Observed(["Voltage [V]"], np.ones([30]) * 4.0) -] +Measurements = pd.read_csv("examples/Chen_example.csv", comment='#').to_numpy() #[np.arange(0,10,0.1),np.ones([100])] +observations = dict( + Time = pybop.Observed(["Time [s]"], Measurements[:,0]), + Current = pybop.Observed(["Current function [A]"], Measurements[:,1]), + Voltage = pybop.Observed(["Voltage [V]"], Measurements[:,2]) +) # Create model model = pybop.models.lithium_ion.SPM() # Fitting parameters params = ( - pybop.Parameter("Electrode height [m]", prior = pybop.Gaussian(0,1), bounds = (0,1)), - pybop.Parameter("Negative particle radius [m]", prior = pybop.Uniform(0,1), bounds = (0,1)), - pybop.Parameter("Positive particle radius [m]", prior = pybop.Uniform(0,1), bounds = (0,1)) + pybop.Parameter("Electrode height [m]", prior = pybop.Gaussian(0,1), bounds = (0.03,0.1)), + pybop.Parameter("Negative particle radius [m]", prior = pybop.Uniform(0,1), bounds = (0.1e-6,0.8e-6)), + pybop.Parameter("Positive particle radius [m]", prior = pybop.Uniform(0,1), bounds = (0.1e-5,0.8e-5)) ) -parameterisation = pybop.Parameterisation(model, observations=observation, fit_parameters=params) +parameterisation = pybop.Parameterisation(model, observations=observations, fit_parameters=params) # get RMSE estimate -parameterisation.rmse() +results, last_optim, num_evals = parameterisation.rmse(method="nlopt") # get MAP estimate, starting at a random initial point in parameter space -parameterisation.map(x0=[p.sample() for p in params]) +# parameterisation.map(x0=[p.sample() for p in params]) # or sample from posterior -parameterisation.sample(1000, n_chains=4, ....) +# parameterisation.sample(1000, n_chains=4, ....) # or SOBER -parameterisation.sober() +# parameterisation.sober() #Optimisation = pybop.optimisation(model, cost=cost, parameters=parameters, observation=observation) \ No newline at end of file diff --git a/pybop/__init__.py b/pybop/__init__.py index ad1e2317d..7cc8690e3 100644 --- a/pybop/__init__.py +++ b/pybop/__init__.py @@ -52,13 +52,12 @@ # from .simulation import Simulation - # # Optimisation class # from .optimisation.base_optimisation import BaseOptimisation -from .optimisation.nlopt_opt import nlopt_opt -from .optimisation.scipy_opt import scipy_opt +from .optimisation.nlopt_opt import NLoptOptimize +from .optimisation.scipy_opt import ScipyMinimize # # Remove any imported modules, so we don't expose them as part of pybop diff --git a/pybop/observations.py b/pybop/observations.py index 7ac41a801..e6db914bf 100644 --- a/pybop/observations.py +++ b/pybop/observations.py @@ -12,6 +12,9 @@ def __init__(self, name, data): self.name = name self.data = data + def __repr__(self): + return f"Observation: {self.name} \n Data: {self.data}" + def Interpolant(self): if self.variable == "time": self.Interpolant = pybamm.Interpolant(self.x, self.y, pybamm.t) diff --git a/pybop/optimisation/base_optimisation.py b/pybop/optimisation/base_optimisation.py index fa16ba865..a60f9fe72 100644 --- a/pybop/optimisation/base_optimisation.py +++ b/pybop/optimisation/base_optimisation.py @@ -11,7 +11,7 @@ class BaseOptimisation(object): def __init__(self): self.name = "Base Optimisation" - def optimise(self, cost_function, x0, method=None, bounds=None, options=None): + def optimise(self, cost_function, x0, bounds, method=None): """ Optimise method to be overloaded by child classes. @@ -19,18 +19,15 @@ def optimise(self, cost_function, x0, method=None, bounds=None, options=None): # Set up optimisation self.cost_function = cost_function self.x0 = x0 - self.options = options self.method = method self.bounds = bounds # Run optimisation - result = self._runoptimise( - cost_function, self.method, self.x0, self.bounds, self.options - ) + result = self._runoptimise(self.cost_function, self.x0, self.bounds) return result - def _runoptimise(self, cost_function, method, x0, bounds, options): + def _runoptimise(self, cost_function, x0, bounds): """ Run optimisation method, to be overloaded by child classes. diff --git a/pybop/optimisation/nlopt_opt.py b/pybop/optimisation/nlopt_opt.py index 987bbf88c..d50763882 100644 --- a/pybop/optimisation/nlopt_opt.py +++ b/pybop/optimisation/nlopt_opt.py @@ -2,21 +2,26 @@ import nlopt -class nlopt_opt(pybop.BaseOptimisation): +class NLoptOptimize(pybop.BaseOptimisation): """ Wrapper class for the NLOpt optimisation class. Extends the BaseOptimisation class. """ - def __init__(self, cost_function, x0, bounds, method=None, options=None): + def __init__(self, method=None, x0=None, xtol=None): super().__init__() - self.cost_function = cost_function - self.method = method - self.x0 = x0 - self.bounds = bounds - self.options = options self.name = "NLOpt Optimisation" - def _runoptimise(self): + if method is not None: + self.opt = nlopt.opt(method, len(x0)) + else: + self.opt = nlopt.opt(nlopt.LN_BOBYQA, len(x0)) + + if xtol is not None: + self.opt.set_xtol_rel(xtol) + else: + self.opt.set_xtol_rel(1e-5) + + def _runoptimise(self, cost_function, x0, bounds): """ Run the NLOpt opt method. @@ -25,21 +30,13 @@ def _runoptimise(self): cost_function: function for optimising method: optimisation method x0: Initialisation array - options: options dictionary bounds: bounds array """ - if self.options.xtol is not None: - opt.set_xtol_rel(self.options.xtol) - - if self.method is not None: - opt = nlopt.opt(self.method, len(self.x0)) - else: - opt = nlopt.opt(nlopt.LN_BOBYQA, len(self.x0)) - opt.set_min_objective(self.cost_function) - opt.set_lower_bounds(self.bounds.lower) - opt.set_upper_bounds(self.bounds.upper) - results = opt.optimize(self.cost_function) - num_evals = opt.get_numevals() + self.opt.set_min_objective(cost_function) + self.opt.set_lower_bounds(bounds["lower"]) + self.opt.set_upper_bounds(bounds["upper"]) + results = self.opt.optimize(x0) + num_evals = self.opt.get_numevals() - return results, opt.last_optimum_value(), num_evals + return results, self.opt.last_optimum_value(), num_evals diff --git a/pybop/optimisation/scipy_opt.py b/pybop/optimisation/scipy_opt.py index 0073ac3d1..3586f43fb 100644 --- a/pybop/optimisation/scipy_opt.py +++ b/pybop/optimisation/scipy_opt.py @@ -2,7 +2,7 @@ from scipy.optimize import minimize -class scipy_opt(pybop.BaseOptimisation): +class ScipyMinimize(pybop.BaseOptimisation): """ Wrapper class for the Scipy optimisation class. Extends the BaseOptimisation class. """ diff --git a/pybop/parameterisation.py b/pybop/parameterisation.py index a0528acdc..c68d34343 100644 --- a/pybop/parameterisation.py +++ b/pybop/parameterisation.py @@ -3,6 +3,12 @@ import numpy as np +# To Do: +# checks on observations and parameters +# implement method to update parameterisation without reconstructing the simulation +# Geometric parameters might always require reconstruction (i.e. electrode height) + + class Parameterisation: """ Parameterisation class for pybop. @@ -13,21 +19,32 @@ def __init__(self, model, observations, fit_parameters, x0=None, options=None): self.fit_parameters = fit_parameters self.observations = observations self.options = options - - # To Do: - # Split observations into forward model inputs/outputs - # checks on observations and parameters + self.bounds = dict( + lower=[p.bounds[0] for p in fit_parameters], + upper=[p.bounds[1] for p in fit_parameters], + ) if options is not None: self.parameter_set = options.parameter_set else: self.parameter_set = self.model.pybamm_model.default_parameter_values + try: + self.parameter_set["Current function [A]"] = pybamm.Interpolant( + self.observations["Time"].data, + self.observations["Current"].data, + pybamm.t, + ) + except: + raise ValueError("Current function not supplied") + if x0 is None: - self.x0 = np.ones(len(self.fit_parameters)) * 0.1 + self.x0 = np.mean([self.bounds["lower"], self.bounds["upper"]], axis=0) - self.sim = pybamm.Simulation( - self.model.pybamm_model, parameter_values=self.parameter_set + self.sim = pybop.Simulation( + self.model.pybamm_model, + parameter_values=self.parameter_set, + solver=pybamm.CasadiSolver(), ) def map(self, x0): @@ -47,27 +64,33 @@ def rmse(self, method=None): Calculate the root mean squared error. """ - def step(x): + def step(x, grad): for i in range(len(self.fit_parameters)): - self.sim.parameter_set.update( - { - self.fit_parameters[i] - .name: self.fit_parameters[i] - .prior.rvs(1)[0] - } - ) + self.parameter_set.update({self.fit_parameters[i].name: x[i]}) + self.sim = pybamm.Simulation( + self.model.pybamm_model, + parameter_values=self.parameter_set, + solver=pybamm.CasadiSolver(), + ) y_hat = self.sim.solve()["Terminal voltage [V]"].data - return np.sqrt(np.mean((self.observations["Voltage [V]"] - y_hat) ** 2)) + + try: + res = np.sqrt( + np.mean((self.observations["Voltage"].data[1] - y_hat) ** 2) + ) + except: + raise ValueError( + "Measurement and modelled data length mismatch, potentially due to voltage cut-offs" + ) + return res if method == "nlopt": - results = pybop.nlopt_opt( - step, self.x0, [p.bounds for p in self.fit_parameters], self.options - ) + optim = pybop.NLoptOptimize(x0=self.x0) + results = optim.optimise(step, self.x0, self.bounds) else: - results = pybop.scipy_opt.optimise( - step, self.x0, [p.bounds for p in self.fit_parameters], self.options - ) + optim = pybop.NLoptOptimize(method) + results = optim.optimise(step, self.x0, self.bounds) return results def mle(self, method): @@ -75,5 +98,3 @@ def mle(self, method): Maximum likelihood estimation. """ pass - - [p for p in self.fit_parameters] diff --git a/pybop/simulation.py b/pybop/simulation.py index 133a41239..c1c33b9b0 100644 --- a/pybop/simulation.py +++ b/pybop/simulation.py @@ -41,7 +41,7 @@ def __init__( model, measured_experiment=None, geometry=None, - initial_parameter_values=None, + parameter_values=None, submesh_types=None, var_pts=None, spatial_methods=None, @@ -49,9 +49,7 @@ def __init__( output_variables=None, C_rate=None, ): - self.parameter_values = ( - initial_parameter_values or model.default_parameter_values - ) + self.parameter_values = parameter_values or model.default_parameter_values # Check to see that current is provided as a drive_cycle current = self._parameter_values.get("Current function [A]") From 37c16beaecde04d99e5c092d96871f30504202dc Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 3 Aug 2023 14:41:50 +0100 Subject: [PATCH 019/210] Add PEM holder method, Update example, clean out of date files --- examples/Initial_API.py | 10 +++++----- examples/Simulation.py | 29 ----------------------------- pybop/parameterisation.py | 9 ++++++++- 3 files changed, 13 insertions(+), 35 deletions(-) delete mode 100644 examples/Simulation.py diff --git a/examples/Initial_API.py b/examples/Initial_API.py index 1c1db9d2e..f0bb4e4a3 100644 --- a/examples/Initial_API.py +++ b/examples/Initial_API.py @@ -3,19 +3,19 @@ import numpy as np # Form observations -Measurements = pd.read_csv("examples/Chen_example.csv", comment='#').to_numpy() #[np.arange(0,10,0.1),np.ones([100])] +Measurements = pd.read_csv("examples/Chen_example.csv", comment='#').to_numpy() observations = dict( - Time = pybop.Observed(["Time [s]"], Measurements[:,0]), + Time = pybop.Observed(["Time [s]"], Measurements[:,0]), Current = pybop.Observed(["Current function [A]"], Measurements[:,1]), Voltage = pybop.Observed(["Voltage [V]"], Measurements[:,2]) ) - -# Create model + +# Define model model = pybop.models.lithium_ion.SPM() # Fitting parameters params = ( - pybop.Parameter("Electrode height [m]", prior = pybop.Gaussian(0,1), bounds = (0.03,0.1)), + pybop.Parameter("Electrode height [m]", prior = pybop.Gaussian(0,1), bounds = (0.03,0.1)), pybop.Parameter("Negative particle radius [m]", prior = pybop.Uniform(0,1), bounds = (0.1e-6,0.8e-6)), pybop.Parameter("Positive particle radius [m]", prior = pybop.Uniform(0,1), bounds = (0.1e-5,0.8e-5)) ) diff --git a/examples/Simulation.py b/examples/Simulation.py deleted file mode 100644 index e991d49f1..000000000 --- a/examples/Simulation.py +++ /dev/null @@ -1,29 +0,0 @@ -import pybop -import pybamm -import numpy as np - -# Form list of applied current -measured_expirement = [np.arange(0,3,0.1),np.ones([30])] -current_interpolant = pybamm.Interpolant(measured_expirement[0], measured_expirement[1], variable="time") - -# Create model & add applied current -model = pybop.BaseSPM() -param = model.default_parameter_values -param["Current function [A]"] = current_interpolant - -# Form initial data -sim = pybop.Simulation(model, initial_parameter_values=param) -sim.solve() - -# Method to parameterise and run the forward model -def forward(x): - sim.parameter_values.update( - { "Electrode height [m]": x[0], - "Negative particle radius [m]": x[1], - "Positive particle radius [m]": x[2] - } - ) - sol = sim.solve()["Voltage [V]"].data - return sol - -V_out = forward([0.065, 0.2e-6, 0.2e-5]) \ No newline at end of file diff --git a/pybop/parameterisation.py b/pybop/parameterisation.py index c68d34343..46c82bca4 100644 --- a/pybop/parameterisation.py +++ b/pybop/parameterisation.py @@ -59,6 +59,12 @@ def sample(self, n_chains): """ pass + def pem(self, method=None): + """ + Predictive error minimisation. + """ + pass + def rmse(self, method=None): """ Calculate the root mean squared error. @@ -93,8 +99,9 @@ def step(x, grad): results = optim.optimise(step, self.x0, self.bounds) return results - def mle(self, method): + def mle(self, method=None): """ Maximum likelihood estimation. """ pass + From 282874ff27eb638c55258d38c1d114080686c554 Mon Sep 17 00:00:00 2001 From: Brady Planden <55357039+BradyPlanden@users.noreply.github.com> Date: Fri, 4 Aug 2023 11:50:09 +0100 Subject: [PATCH 020/210] Update LICENSE to BSD 3 --- LICENSE | 41 ++++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/LICENSE b/LICENSE index c7c3f30fd..160abed72 100644 --- a/LICENSE +++ b/LICENSE @@ -1,21 +1,28 @@ -MIT License +BSD 3-Clause License -Copyright (c) 2023 PRISM-Organisation +Copyright (c) 2023, pybop-team -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +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. From 5955c948ea09165ce8afafbde3a58ac2a5d102d6 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 4 Aug 2023 17:10:49 +0100 Subject: [PATCH 021/210] Progress: Updt. model build structure for parameterisation groups --- examples/Initial_API.py | 22 ++++----- pybop/parameterisation.py | 93 +++++++++++++++++++++++++-------------- 2 files changed, 72 insertions(+), 43 deletions(-) diff --git a/examples/Initial_API.py b/examples/Initial_API.py index f0bb4e4a3..6d37f5157 100644 --- a/examples/Initial_API.py +++ b/examples/Initial_API.py @@ -4,21 +4,23 @@ # Form observations Measurements = pd.read_csv("examples/Chen_example.csv", comment='#').to_numpy() -observations = dict( - Time = pybop.Observed(["Time [s]"], Measurements[:,0]), - Current = pybop.Observed(["Current function [A]"], Measurements[:,1]), - Voltage = pybop.Observed(["Voltage [V]"], Measurements[:,2]) -) +observations = { + "Time [s]": pybop.Observed(["Time [s]"], Measurements[:,0]), + "Current function [A]": pybop.Observed(["Current function [A]"], Measurements[:,1]), + "Voltage [V]": pybop.Observed(["Voltage [V]"], Measurements[:,2]) +} # Define model model = pybop.models.lithium_ion.SPM() +model.parameter_values = pybop.ParameterSet("Chen2020") #To implement # Fitting parameters -params = ( - pybop.Parameter("Electrode height [m]", prior = pybop.Gaussian(0,1), bounds = (0.03,0.1)), - pybop.Parameter("Negative particle radius [m]", prior = pybop.Uniform(0,1), bounds = (0.1e-6,0.8e-6)), - pybop.Parameter("Positive particle radius [m]", prior = pybop.Uniform(0,1), bounds = (0.1e-5,0.8e-5)) -) +params = { + "Upper voltage cut-off [V]": pybop.Parameter("Upper voltage cut-off [V]", prior = pybop.Gaussian(4.0,0.01), bounds = [3.8,4.1]) + # "Electrode height [m]": pybop.Parameter("Electrode height [m]", prior = pybop.Gaussian(0,1), bounds = [0.03,0.1]), + # "Negative particle radius [m]": pybop.Parameter("Negative particle radius [m]", prior = pybop.Gaussian(0,1), bounds = [0.1e-6,0.8e-6]), + # "Positive particle radius [m]": pybop.Parameter("Positive particle radius [m]", prior = pybop.Gaussian(0,1), bounds = [0.1e-5,0.8e-5]) +} parameterisation = pybop.Parameterisation(model, observations=observations, fit_parameters=params) diff --git a/pybop/parameterisation.py b/pybop/parameterisation.py index 46c82bca4..79ae2526a 100644 --- a/pybop/parameterisation.py +++ b/pybop/parameterisation.py @@ -20,32 +20,59 @@ def __init__(self, model, observations, fit_parameters, x0=None, options=None): self.observations = observations self.options = options self.bounds = dict( - lower=[p.bounds[0] for p in fit_parameters], - upper=[p.bounds[1] for p in fit_parameters], + lower=[self.fit_parameters[p].bounds[0] for p in self.fit_parameters], + upper=[self.fit_parameters[p].bounds[1] for p in self.fit_parameters], ) - if options is not None: - self.parameter_set = options.parameter_set + if model.pybamm_model is not None: + if options is not None: + self.parameter_set = options.parameter_set + else: + self.parameter_set = self.model.pybamm_model.default_parameter_values + + try: + self.parameter_set["Current function [A]"] = pybamm.Interpolant( + self.observations["Time [s]"].data, + self.observations["Current function [A]"].data, + pybamm.t, + ) + except: + raise ValueError("Current function not supplied") + + if x0 is None: + self.x0 = np.mean([self.bounds["lower"], self.bounds["upper"]], axis=0) + + # self.sim = pybop.Simulation( + # self.model.pybamm_model, + # parameter_values=self.parameter_set, + # solver=pybamm.CasadiSolver(), + # ) + + # set input parameters in parameter set from fitting parameters + for i in self.fit_parameters: + self.parameter_set[i] = "[input]" + + self.fit_dict = {p: self.fit_parameters[p].prior.mean for p in self.fit_parameters} + + #Set up geometry on model + geometry = self.model.pybamm_model.default_geometry + + # Set up parameters for geometry and model + self.parameter_set.process_model(self.model.pybamm_model) + self.parameter_set.process_geometry(geometry) + + # Mesh the model + mesh = pybamm.Mesh(geometry, self.model.pybamm_model.default_submesh_types, self.model.pybamm_model.default_var_pts) #update + + # Discretise the model + disc = pybamm.Discretisation(mesh, self.model.pybamm_model.default_spatial_methods) + disc.process_model(self.model.pybamm_model) + + # Set solver + self.solver = pybamm.CasadiSolver() else: - self.parameter_set = self.model.pybamm_model.default_parameter_values - - try: - self.parameter_set["Current function [A]"] = pybamm.Interpolant( - self.observations["Time"].data, - self.observations["Current"].data, - pybamm.t, - ) - except: - raise ValueError("Current function not supplied") - - if x0 is None: - self.x0 = np.mean([self.bounds["lower"], self.bounds["upper"]], axis=0) - - self.sim = pybop.Simulation( - self.model.pybamm_model, - parameter_values=self.parameter_set, - solver=pybamm.CasadiSolver(), - ) + raise ValueError("No pybamm model supplied") + def map(self, x0): """ @@ -71,15 +98,16 @@ def rmse(self, method=None): """ def step(x, grad): - for i in range(len(self.fit_parameters)): - self.parameter_set.update({self.fit_parameters[i].name: x[i]}) + for i,p in enumerate(self.fit_dict): + self.fit_dict[p] = x[i] + print(self.fit_dict) - self.sim = pybamm.Simulation( - self.model.pybamm_model, - parameter_values=self.parameter_set, - solver=pybamm.CasadiSolver(), - ) - y_hat = self.sim.solve()["Terminal voltage [V]"].data + # self.sim = pybamm.Simulation( + # self.model.pybamm_model, + # parameter_values=self.parameter_set, + # solver=pybamm.CasadiSolver(), + # ) + y_hat = self.solver.solve(self.model.pybamm_model, inputs=self.fit_dict)["Terminal voltage [V]"].data try: res = np.sqrt( @@ -103,5 +131,4 @@ def mle(self, method=None): """ Maximum likelihood estimation. """ - pass - + pass \ No newline at end of file From fb082fc7bbb9e93f367064c9be26bc5f55887ab6 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Sat, 5 Aug 2023 18:38:04 +0100 Subject: [PATCH 022/210] Progress: Add parameter_sets class with model class inclusion --- examples/Initial_API.py | 2 +- pybop/__init__.py | 4 ++++ pybop/models/lithium_ion/spm.py | 3 +-- pybop/parameter_sets.py | 16 ++++++++++++++++ pybop/parameterisation.py | 4 ++-- 5 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 pybop/parameter_sets.py diff --git a/examples/Initial_API.py b/examples/Initial_API.py index 6d37f5157..48749344f 100644 --- a/examples/Initial_API.py +++ b/examples/Initial_API.py @@ -12,7 +12,7 @@ # Define model model = pybop.models.lithium_ion.SPM() -model.parameter_values = pybop.ParameterSet("Chen2020") #To implement +model.parameter_set = pybop.ParameterSet("pybamm", "Chen2020") #To implement # Fitting parameters params = { diff --git a/pybop/__init__.py b/pybop/__init__.py index 7cc8690e3..14204e866 100644 --- a/pybop/__init__.py +++ b/pybop/__init__.py @@ -30,6 +30,10 @@ # from .models import lithium_ion +# +# Parameterisation class +# +from .parameter_sets import ParameterSet # # Parameterisation class # diff --git a/pybop/models/lithium_ion/spm.py b/pybop/models/lithium_ion/spm.py index 367596ddd..99b118a99 100644 --- a/pybop/models/lithium_ion/spm.py +++ b/pybop/models/lithium_ion/spm.py @@ -4,11 +4,10 @@ class SPM: """ - Composition of the SPM class in PyBaMM. - """ def __init__(self): self.pybamm_model = pybamm.lithium_ion.SPM() self.name = "Single Particle Model" + self.parameter_set = self.pybamm_model.default_parameter_values diff --git a/pybop/parameter_sets.py b/pybop/parameter_sets.py new file mode 100644 index 000000000..299b1d41c --- /dev/null +++ b/pybop/parameter_sets.py @@ -0,0 +1,16 @@ +import pybamm +import pybop + +class ParameterSet: + """ + Class for creating parameter sets in pybop. + """ + + def __new__(cls, method, name): + if method.casefold() == "pybamm": + try: + return pybamm.ParameterValues(name).copy() + except: + raise ValueError("Parameter set not found") + else: + raise ValueError("Only PybaMM parameter sets are currently implemented") \ No newline at end of file diff --git a/pybop/parameterisation.py b/pybop/parameterisation.py index 79ae2526a..ee7672ae6 100644 --- a/pybop/parameterisation.py +++ b/pybop/parameterisation.py @@ -25,8 +25,8 @@ def __init__(self, model, observations, fit_parameters, x0=None, options=None): ) if model.pybamm_model is not None: - if options is not None: - self.parameter_set = options.parameter_set + if model.parameter_set is not None: + self.parameter_set = model.parameter_set else: self.parameter_set = self.model.pybamm_model.default_parameter_values From d332a3f0dec745253dff09e23e3e794eefb3e95b Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Wed, 9 Aug 2023 09:02:09 +0100 Subject: [PATCH 023/210] Updt. parameterisation for model_build --- pybop/parameterisation.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/pybop/parameterisation.py b/pybop/parameterisation.py index ee7672ae6..5f1f591dd 100644 --- a/pybop/parameterisation.py +++ b/pybop/parameterisation.py @@ -72,7 +72,24 @@ def __init__(self, model, observations, fit_parameters, x0=None, options=None): self.solver = pybamm.CasadiSolver() else: raise ValueError("No pybamm model supplied") - + + def build_model(self): + """ + Build the model. + """ + + if self.model.pybamm_model.built_model: + return + elif self.model.pybamm_model.is_discretised: + self.model.pybamm_model._model_with_set_params = self.model.pybamm_model + self.model.pybamm_model._built_model = self.pybamm_model + else: + # Set parameters + # Mesh + # Discretise + # Built model + pass + def map(self, x0): """ From 52362fd3354f30238bfd64138a50ab62fb396c43 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Wed, 9 Aug 2023 18:00:21 +0100 Subject: [PATCH 024/210] Updt parameterisation cls w/ build_model(), set_init_soc(), set_params() --- examples/Initial_API.py | 3 +- pybop/__init__.py | 1 + pybop/parameter_sets.py | 3 +- pybop/parameterisation.py | 173 +++++++++------ pybop/simulation.py | 448 -------------------------------------- 5 files changed, 112 insertions(+), 516 deletions(-) delete mode 100644 pybop/simulation.py diff --git a/examples/Initial_API.py b/examples/Initial_API.py index 48749344f..5e3efee98 100644 --- a/examples/Initial_API.py +++ b/examples/Initial_API.py @@ -16,8 +16,9 @@ # Fitting parameters params = { - "Upper voltage cut-off [V]": pybop.Parameter("Upper voltage cut-off [V]", prior = pybop.Gaussian(4.0,0.01), bounds = [3.8,4.1]) + # "Upper voltage cut-off [V]": pybop.Parameter("Upper voltage cut-off [V]", prior = pybop.Gaussian(4.0,0.01), bounds = [3.8,4.1]) # "Electrode height [m]": pybop.Parameter("Electrode height [m]", prior = pybop.Gaussian(0,1), bounds = [0.03,0.1]), + "Negative electrode Bruggeman coefficient (electrolyte)": pybop.Parameter("Negative electrode Bruggeman coefficient (electrolyte)", prior = pybop.Gaussian(1.5,0.1), bounds = [0.8,1.7]), # "Negative particle radius [m]": pybop.Parameter("Negative particle radius [m]", prior = pybop.Gaussian(0,1), bounds = [0.1e-6,0.8e-6]), # "Positive particle radius [m]": pybop.Parameter("Positive particle radius [m]", prior = pybop.Gaussian(0,1), bounds = [0.1e-5,0.8e-5]) } diff --git a/pybop/__init__.py b/pybop/__init__.py index 14204e866..b32cce831 100644 --- a/pybop/__init__.py +++ b/pybop/__init__.py @@ -34,6 +34,7 @@ # Parameterisation class # from .parameter_sets import ParameterSet + # # Parameterisation class # diff --git a/pybop/parameter_sets.py b/pybop/parameter_sets.py index 299b1d41c..eb84b9da1 100644 --- a/pybop/parameter_sets.py +++ b/pybop/parameter_sets.py @@ -1,6 +1,7 @@ import pybamm import pybop + class ParameterSet: """ Class for creating parameter sets in pybop. @@ -13,4 +14,4 @@ def __new__(cls, method, name): except: raise ValueError("Parameter set not found") else: - raise ValueError("Only PybaMM parameter sets are currently implemented") \ No newline at end of file + raise ValueError("Only PybaMM parameter sets are currently implemented") diff --git a/pybop/parameterisation.py b/pybop/parameterisation.py index 5f1f591dd..6dcf6b89d 100644 --- a/pybop/parameterisation.py +++ b/pybop/parameterisation.py @@ -14,82 +14,125 @@ class Parameterisation: Parameterisation class for pybop. """ - def __init__(self, model, observations, fit_parameters, x0=None, options=None): - self.model = model + def __init__( + self, + model, + observations, + fit_parameters, + geometry=None, + submesh_types=None, + var_pts=None, + spatial_methods=None, + solver=None, + x0=None, + check_model=True, + init_soc=None, + ): + self.model = model.pybamm_model + self._unprocessed_model = model.pybamm_model self.fit_parameters = fit_parameters self.observations = observations - self.options = options self.bounds = dict( lower=[self.fit_parameters[p].bounds[0] for p in self.fit_parameters], upper=[self.fit_parameters[p].bounds[1] for p in self.fit_parameters], ) + self._model_with_set_params = None + self._built_model = None + self._geometry = geometry or self.model.default_geometry + self._submesh_types = submesh_types or self.model.default_submesh_types + self._var_pts = var_pts or self.model.default_var_pts + self._spatial_methods = spatial_methods or self.model.default_spatial_methods + self.solver = solver or self.model.default_solver + + if model.parameter_set is not None: + self.parameter_set = model.parameter_set + else: + self.parameter_set = self.model.default_parameter_values - if model.pybamm_model is not None: - if model.parameter_set is not None: - self.parameter_set = model.parameter_set - else: - self.parameter_set = self.model.pybamm_model.default_parameter_values - - try: - self.parameter_set["Current function [A]"] = pybamm.Interpolant( - self.observations["Time [s]"].data, - self.observations["Current function [A]"].data, - pybamm.t, - ) - except: - raise ValueError("Current function not supplied") + try: + self.parameter_set["Current function [A]"] = pybamm.Interpolant( + self.observations["Time [s]"].data, + self.observations["Current function [A]"].data, + pybamm.t, + ) + except: + raise ValueError("Current function not supplied") - if x0 is None: - self.x0 = np.mean([self.bounds["lower"], self.bounds["upper"]], axis=0) + if x0 is None: + self.x0 = np.mean([self.bounds["lower"], self.bounds["upper"]], axis=0) - # self.sim = pybop.Simulation( - # self.model.pybamm_model, - # parameter_values=self.parameter_set, - # solver=pybamm.CasadiSolver(), - # ) + # set input parameters in parameter set from fitting parameters + for i in self.fit_parameters: + self.parameter_set[i] = "[input]" - # set input parameters in parameter set from fitting parameters - for i in self.fit_parameters: - self.parameter_set[i] = "[input]" - - self.fit_dict = {p: self.fit_parameters[p].prior.mean for p in self.fit_parameters} + self._unprocessed_parameter_set = self.parameter_set + self.fit_dict = { + p: self.fit_parameters[p].prior.mean for p in self.fit_parameters + } - #Set up geometry on model - geometry = self.model.pybamm_model.default_geometry + # Set t_eval + self.time_data = self.parameter_set["Current function [A]"].x[0] - # Set up parameters for geometry and model - self.parameter_set.process_model(self.model.pybamm_model) - self.parameter_set.process_geometry(geometry) + self.build_model(check_model=check_model, init_soc=init_soc) - # Mesh the model - mesh = pybamm.Mesh(geometry, self.model.pybamm_model.default_submesh_types, self.model.pybamm_model.default_var_pts) #update + # Set solver + self.solver = pybamm.CasadiSolver() - # Discretise the model - disc = pybamm.Discretisation(mesh, self.model.pybamm_model.default_spatial_methods) - disc.process_model(self.model.pybamm_model) + def build_model(self, check_model=True, init_soc=None): + """ + Build the model (if not built already). + """ + if init_soc is not None: + self.set_init_soc(init_soc) # define this function - # Set solver - self.solver = pybamm.CasadiSolver() + if self._built_model: + return + elif self.model.is_discretised: + self.model._model_with_set_params = self.model.pybamm_model + self.model._built_model = self.pybamm_model else: - raise ValueError("No pybamm model supplied") - - def build_model(self): + self.set_params() + self._mesh = pybamm.Mesh(self._geometry, self._submesh_types, self._var_pts) + self._disc = pybamm.Discretisation(self._mesh, self._spatial_methods) + self._built_model = self._disc.process_model( + self._model_with_set_params, inplace=False, check_model=check_model + ) + + # Clear solver + self.solver._model_set_up = {} + + def set_init_soc(self, init_soc): + """ + Set the initial state of charge. + """ + if self._built_initial_soc != init_soc: + # reset + self._model_with_set_params = None + self._built_model = None + self.op_conds_to_built_models = None + self.op_conds_to_built_solvers = None + + param = self.model.param + self.parameter_set = ( + self._unprocessed_parameter_set.set_initial_stoichiometries( + init_soc, param=param, inplace=False + ) + ) + # Save solved initial SOC in case we need to re-build the model + self._built_initial_soc = init_soc + + def set_params(self): """ - Build the model. + Set the parameters in the model. """ - - if self.model.pybamm_model.built_model: + if self._model_with_set_params: return - elif self.model.pybamm_model.is_discretised: - self.model.pybamm_model._model_with_set_params = self.model.pybamm_model - self.model.pybamm_model._built_model = self.pybamm_model - else: - # Set parameters - # Mesh - # Discretise - # Built model - pass - + + self._model_with_set_params = self.parameter_set.process_model( + self._unprocessed_model, inplace=False + ) + self.parameter_set.process_geometry(self._geometry) + self.model = self._model_with_set_params def map(self, x0): """ @@ -115,25 +158,23 @@ def rmse(self, method=None): """ def step(x, grad): - for i,p in enumerate(self.fit_dict): + for i, p in enumerate(self.fit_dict): self.fit_dict[p] = x[i] print(self.fit_dict) - # self.sim = pybamm.Simulation( - # self.model.pybamm_model, - # parameter_values=self.parameter_set, - # solver=pybamm.CasadiSolver(), - # ) - y_hat = self.solver.solve(self.model.pybamm_model, inputs=self.fit_dict)["Terminal voltage [V]"].data + y_hat = self.solver.solve( + self._built_model, self.time_data, inputs=self.fit_dict + )["Terminal voltage [V]"].data try: res = np.sqrt( - np.mean((self.observations["Voltage"].data[1] - y_hat) ** 2) + np.mean((self.observations["Voltage [V]"].data[1] - y_hat) ** 2) ) except: raise ValueError( "Measurement and modelled data length mismatch, potentially due to voltage cut-offs" ) + print(res) return res if method == "nlopt": @@ -148,4 +189,4 @@ def mle(self, method=None): """ Maximum likelihood estimation. """ - pass \ No newline at end of file + pass diff --git a/pybop/simulation.py b/pybop/simulation.py deleted file mode 100644 index c1c33b9b0..000000000 --- a/pybop/simulation.py +++ /dev/null @@ -1,448 +0,0 @@ -import pybamm -import numpy as np -import copy -import pickle -import sys -from functools import lru_cache -import warnings - - -def is_notebook(): - try: - shell = get_ipython().__class__.__name__ - if shell == "ZMQInteractiveShell": # pragma: no cover - # Jupyter notebook or qtconsole - cfg = get_ipython().config - nb = len(cfg["InteractiveShell"].keys()) == 0 - return nb - elif shell == "TerminalInteractiveShell": # pragma: no cover - return False # Terminal running IPython - elif shell == "Shell": # pragma: no cover - return True # Google Colab notebook - else: # pragma: no cover - return False # Other type (?) - except NameError: - return False # Probably standard Python interpreter - - -class Simulation: - """ - - This class constructs the PyBOP simulation class. It was initially built from the PyBaMM simulation class. - - Parameters: - ================ - - - """ - - def __init__( - self, - model, - measured_experiment=None, - geometry=None, - parameter_values=None, - submesh_types=None, - var_pts=None, - spatial_methods=None, - solver=None, - output_variables=None, - C_rate=None, - ): - self.parameter_values = parameter_values or model.default_parameter_values - - # Check to see that current is provided as a drive_cycle - current = self._parameter_values.get("Current function [A]") - if isinstance(current, pybamm.Interpolant): - self.operating_mode = "drive cycle" - elif isinstance(current, pybamm.Interpolant): - # This requires syncing the sampling frequency to ensure equivalent vector lengths - self.operating_mode = "without experiment" - if C_rate: - self.C_rate = C_rate - self._parameter_values.update( - { - "Current function [A]": self.C_rate - * self._parameter_values["Nominal cell capacity [A.h]"] - } - ) - else: - raise TypeError( - "measured_experiment must be drive_cycle or C_rate with" - "matching sampling frequency between t_eval and measured data" - ) - - self._unprocessed_model = model - self.model = model - self.geometry = geometry or self.model.default_geometry - self.submesh_types = submesh_types or self.model.default_submesh_types - self.var_pts = var_pts or self.model.default_var_pts - self.spatial_methods = spatial_methods or self.model.default_spatial_methods - self.solver = solver or self.model.default_solver - self.output_variables = output_variables - - # Initialize empty built states - self._model_with_set_params = None - self._built_model = None - self._built_initial_soc = None - self.op_conds_to_built_models = None - self.op_conds_to_built_solvers = None - self._mesh = None - self._disc = None - self._solution = None - self.quick_plot = None - - # ignore runtime warnings in notebooks - if is_notebook(): # pragma: no cover - import warnings - - warnings.filterwarnings("ignore") - - self.get_esoh_solver = lru_cache()(self._get_esoh_solver) - - def set_parameters(self): - """ - Setter for parameter values - - Inputs: - ============ - param: The parameter object to set - """ - if self.model_with_set_params: - return - - self._model_with_set_params = self._parameter_values.process_model( - self._unprocessed_model, inplace=False - ) - self._parameter_values.process_geometry(self.geometry) - self.model = self._model_with_set_params - - def build(self, check_model=True, initial_soc=None): - """ - A method to build the model into a system of matrices and vectors suitable for - performing numerical computations. If the model has already been built or - solved then this function will have no effect. This method will automatically set the parameters - if they have not already been set. - - Parameters - ---------- - check_model : bool, optional - If True, model checks are performed after discretisation (see - :meth:`pybamm.Discretisation.process_model`). Default is True. - initial_soc : float, optional - Initial State of Charge (SOC) for the simulation. Must be between 0 and 1. - If given, overwrites the initial concentrations provided in the parameter - set. - """ - if initial_soc is not None: - self.set_initial_soc(initial_soc) - - if self.built_model: - return - elif self.model.is_discretised: - self._model_with_set_params = self.model - self._built_model = self.model - else: - self.set_parameters() - self._mesh = pybamm.Mesh(self._geometry, self._submesh_types, self._var_pts) - self._disc = pybamm.Discretisation(self._mesh, self._spatial_methods) - self._built_model = self._disc.process_model( - self._model_with_set_params, inplace=False, check_model=check_model - ) - # rebuilt model so clear solver setup - self._solver._model_set_up = {} - - def setup_for_parameterisation(): - """ - A method to setup self.model for the parameterisation experiment - """ - - def plot(self, output_variables=None, **kwargs): - """ - A method to quickly plot the outputs of the simulation. Creates a - :class:`pybamm.QuickPlot` object (with keyword arguments 'kwargs') and - then calls :meth:`pybamm.QuickPlot.dynamic_plot`. - - Parameters - ---------- - output_variables: list, optional - A list of the variables to plot. - **kwargs - Additional keyword arguments passed to - :meth:`pybamm.QuickPlot.dynamic_plot`. - For a list of all possible keyword arguments see :class:`pybamm.QuickPlot`. - """ - - if self._solution is None: - raise ValueError( - "Model has not been solved, please solve the model before plotting." - ) - - if output_variables is None: - output_variables = self.output_variables - - self.quick_plot = pybop.dynamic_plot( - self._solution, output_variables=output_variables, **kwargs - ) - - return self.quick_plot - - def create_gif(self, number_of_images=80, duration=0.1, output_filename="plot.gif"): - """ - Create a gif of the parameterisation steps created by :meth:`pybamm.Simulation.plot`. - - Parameters - ---------- - number_of_images : int (optional) - Number of images/plots to be compiled for a GIF. - duration : float (optional) - Duration of visibility of a single image/plot in the created GIF. - output_filename : str (optional) - Name of the generated GIF file. - - """ - if self.quick_plot is None: - self.quick_plot = pybamm.QuickPlot(self._solution) - - # create_git needs to be updated - self.quick_plot.create_gif( - number_of_images=number_of_images, - duration=duration, - output_filename=output_filename, - ) - - def solve( - self, - t_eval=None, - solver=None, - check_model=True, - calc_esoh=True, - starting_solution=None, - initial_soc=None, - callbacks=None, - showprogress=False, - **kwargs, - ): - """ - A method to solve the model for parameterisation. This method will automatically build - and set the model parameters if not already done so. - - Parameters - ---------- - t_eval : numeric type, optional - The times (in seconds) at which to compute the solution. Can be - provided as an array of times at which to return the solution, or as a - list `[t0, tf]` where `t0` is the initial time and `tf` is the final time. - If provided as a list the solution is returned at 100 points within the - interval `[t0, tf]`. - - If None and the parameter "Current function [A]" is read from data - (i.e. drive cycle simulation) the model will be solved at the times - provided in the data. - solver : :class:`pybop.BaseSolver`, optional - The solver to use to solve the model. If None, Simulation.solver is used - check_model : bool, optional - If True, model checks are performed after discretisation (see - :meth:`pybamm.Discretisation.process_model`). Default is True. - calc_esoh : bool, optional - Whether to include eSOH variables in the summary variables. If `False` - then only summary variables that do not require the eSOH calculation - are calculated. Default is True. - starting_solution : :class:`pybamm.Solution` - The solution to start stepping from. If None (default), then self._solution - is used. Must be None if not using an experiment. - initial_soc : float, optional - Initial State of Charge (SOC) for the simulation. Must be between 0 and 1. - If given, overwrites the initial concentrations provided in the parameter - set. - callbacks : list of callbacks, optional - A list of callbacks to be called at each time step. Each callback must - implement all the methods defined in :class:`pybamm.callbacks.BaseCallback`. - showprogress : bool, optional - Whether to show a progress bar for cycling. If true, shows a progress bar - for cycles. Has no effect when not used with an experiment. - Default is False. - **kwargs - Additional key-word arguments passed to `solver.solve`. - See :meth:`pybamm.BaseSolver.solve`. - """ - # Setup - if solver is None: - solver = self.solver - - callbacks = pybamm.callbacks.setup_callbacks(callbacks) - logs = {} - - self.build(check_model=check_model, initial_soc=initial_soc) - - if self.operating_mode == "drive cycle": - # For drive cycles (current provided as data) we perform additional - # tests on t_eval (if provided) to ensure the returned solution - # captures the input. - time_data = self._parameter_values["Current function [A]"].x[0] - # If no t_eval is provided, we use the times provided in the data. - if t_eval is None: - pybamm.logger.info("Setting t_eval as specified by the data") - t_eval = time_data - # If t_eval is provided we first check if it contains all of the - # times in the data to within 10-12. If it doesn't, we then check - # that the largest gap in t_eval is smaller than the smallest gap in - # the time data (to ensure the resolution of t_eval is fine enough). - # We only raise a warning here as users may genuinely only want - # the solution returned at some specified points. - elif ( - set(np.round(time_data, 12)).issubset(set(np.round(t_eval, 12))) - ) is False: - warnings.warn( - """ - t_eval does not contain all of the time points in the data - set. Note: passing t_eval = None automatically sets t_eval - to be the points in the data. - """, - pybamm.SolverWarning, - ) - dt_data_min = np.min(np.diff(time_data)) - dt_eval_max = np.max(np.diff(t_eval)) - if dt_eval_max > dt_data_min + sys.float_info.epsilon: - warnings.warn( - """ - The largest timestep in t_eval ({}) is larger than - the smallest timestep in the data ({}). The returned - solution may not have the correct resolution to accurately - capture the input. Try refining t_eval. Alternatively, - passing t_eval = None automatically sets t_eval to be the - points in the data. - """.format( - dt_eval_max, dt_data_min - ), - pybamm.SolverWarning, - ) - - self._solution = solver.solve(self.built_model, t_eval, **kwargs) - - return self.solution - - def _get_esoh_solver(self, calc_esoh): - if ( - calc_esoh is False - or isinstance(self.model, pybamm.lead_acid.BaseModel) - or isinstance(self.model, pybamm.equivalent_circuit.Thevenin) - or self.model.options["working electrode"] != "both" - ): - return None - - return pybamm.lithium_ion.ElectrodeSOHSolver( - self.parameter_values, self.model.param - ) - - def save(self, filename): - """Save simulation using pickle""" - if self.model.convert_to_format == "python": - # We currently cannot save models in the 'python' format - raise NotImplementedError( - """ - Cannot save simulation if model format is python. - Set model.convert_to_format = 'casadi' instead. - """ - ) - # Clear solver problem (not pickle-able, will automatically be recomputed) - if ( - isinstance(self._solver, pybamm.CasadiSolver) - and self._solver.integrator_specs != {} - ): - self._solver.integrator_specs = {} - - if self.op_conds_to_built_solvers is not None: - for solver in self.op_conds_to_built_solvers.values(): - if ( - isinstance(solver, pybamm.CasadiSolver) - and solver.integrator_specs != {} - ): - solver.integrator_specs = {} - - with open(filename, "wb") as f: - pickle.dump(self, f, pickle.HIGHEST_PROTOCOL) - - def load_sim(filename): - """Load a saved simulation""" - return pybamm.load(filename) - - @property - def model(self): - return self._model - - @model.setter - def model(self, model): - self._model = copy.copy(model) - - @property - def model_with_set_params(self): - return self._model_with_set_params - - @property - def built_model(self): - return self._built_model - - @property - def geometry(self): - return self._geometry - - @geometry.setter - def geometry(self, geometry): - self._geometry = geometry.copy() - - @property - def parameter_values(self): - return self._parameter_values - - @parameter_values.setter - def parameter_values(self, parameter_values): - self._parameter_values = parameter_values.copy() - - @property - def submesh_types(self): - return self._submesh_types - - @submesh_types.setter - def submesh_types(self, submesh_types): - self._submesh_types = submesh_types.copy() - - @property - def mesh(self): - return self._mesh - - @property - def var_pts(self): - return self._var_pts - - @var_pts.setter - def var_pts(self, var_pts): - self._var_pts = var_pts.copy() - - @property - def spatial_methods(self): - return self._spatial_methods - - @spatial_methods.setter - def spatial_methods(self, spatial_methods): - self._spatial_methods = spatial_methods.copy() - - @property - def solver(self): - return self._solver - - @solver.setter - def solver(self, solver): - self._solver = solver.copy() - - @property - def output_variables(self): - return self._output_variables - - @output_variables.setter - def output_variables(self, output_variables): - self._output_variables = copy.copy(output_variables) - - @property - def solution(self): - return self._solution From 57d302558ee2c8de49f9fb8d56066fe1b790c04c Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 10 Aug 2023 17:02:47 +0100 Subject: [PATCH 025/210] Non-geometric parameterisation fitting complete, rm simulation class from init --- examples/Initial_API.py | 9 +++------ pybop/__init__.py | 5 ----- pybop/parameterisation.py | 12 ++++++------ 3 files changed, 9 insertions(+), 17 deletions(-) diff --git a/examples/Initial_API.py b/examples/Initial_API.py index 5e3efee98..1e5ffb7d9 100644 --- a/examples/Initial_API.py +++ b/examples/Initial_API.py @@ -12,15 +12,12 @@ # Define model model = pybop.models.lithium_ion.SPM() -model.parameter_set = pybop.ParameterSet("pybamm", "Chen2020") #To implement +model.parameter_set = pybop.ParameterSet("pybamm", "Chen2020") # Fitting parameters params = { - # "Upper voltage cut-off [V]": pybop.Parameter("Upper voltage cut-off [V]", prior = pybop.Gaussian(4.0,0.01), bounds = [3.8,4.1]) - # "Electrode height [m]": pybop.Parameter("Electrode height [m]", prior = pybop.Gaussian(0,1), bounds = [0.03,0.1]), - "Negative electrode Bruggeman coefficient (electrolyte)": pybop.Parameter("Negative electrode Bruggeman coefficient (electrolyte)", prior = pybop.Gaussian(1.5,0.1), bounds = [0.8,1.7]), - # "Negative particle radius [m]": pybop.Parameter("Negative particle radius [m]", prior = pybop.Gaussian(0,1), bounds = [0.1e-6,0.8e-6]), - # "Positive particle radius [m]": pybop.Parameter("Positive particle radius [m]", prior = pybop.Gaussian(0,1), bounds = [0.1e-5,0.8e-5]) + "Negative electrode active material volume fraction": pybop.Parameter("Negative electrode active material volume fraction", prior = pybop.Gaussian(0.6,0.1), bounds = [0.1,0.9]), + "Positive electrode active material volume fraction": pybop.Parameter("Positive electrode active material volume fraction", prior = pybop.Gaussian(0.6,0.1), bounds = [0.1,0.9]), } parameterisation = pybop.Parameterisation(model, observations=observations, fit_parameters=params) diff --git a/pybop/__init__.py b/pybop/__init__.py index b32cce831..e154c23ff 100644 --- a/pybop/__init__.py +++ b/pybop/__init__.py @@ -52,11 +52,6 @@ # from .priors import Gaussian, Uniform, Exponential -# -# Simulation class -# -from .simulation import Simulation - # # Optimisation class # diff --git a/pybop/parameterisation.py b/pybop/parameterisation.py index 6dcf6b89d..90d8df8da 100644 --- a/pybop/parameterisation.py +++ b/pybop/parameterisation.py @@ -5,7 +5,6 @@ # To Do: # checks on observations and parameters -# implement method to update parameterisation without reconstructing the simulation # Geometric parameters might always require reconstruction (i.e. electrode height) @@ -44,6 +43,9 @@ def __init__( self._spatial_methods = spatial_methods or self.model.default_spatial_methods self.solver = solver or self.model.default_solver + # Set solver + self.solver = pybamm.CasadiSolver() + if model.parameter_set is not None: self.parameter_set = model.parameter_set else: @@ -75,9 +77,6 @@ def __init__( self.build_model(check_model=check_model, init_soc=init_soc) - # Set solver - self.solver = pybamm.CasadiSolver() - def build_model(self, check_model=True, init_soc=None): """ Build the model (if not built already). @@ -88,8 +87,8 @@ def build_model(self, check_model=True, init_soc=None): if self._built_model: return elif self.model.is_discretised: - self.model._model_with_set_params = self.model.pybamm_model - self.model._built_model = self.pybamm_model + self.model._model_with_set_params = self.model + self.model._built_model = self.model else: self.set_params() self._mesh = pybamm.Mesh(self._geometry, self._submesh_types, self._var_pts) @@ -180,6 +179,7 @@ def step(x, grad): if method == "nlopt": optim = pybop.NLoptOptimize(x0=self.x0) results = optim.optimise(step, self.x0, self.bounds) + else: optim = pybop.NLoptOptimize(method) results = optim.optimise(step, self.x0, self.bounds) From 5df369602dcd83a31a8b2361c7ebfe782508d943 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Wed, 16 Aug 2023 12:59:38 +0100 Subject: [PATCH 026/210] Add optim step method w/ lambda, Add initial test framework w/ nox + pytest --- .github/workflows/test_on_push.yaml | 26 +++++++++++++++ examples/Initial_API.py | 8 ++--- noxfile.py | 16 ++++++++++ pybop/parameterisation.py | 49 +++++++++++++++-------------- requirements.txt | 5 --- setup.py | 10 +++--- tests/unit/test_parameterisation.py | 45 ++++++++++++++++++++++++++ 7 files changed, 121 insertions(+), 38 deletions(-) create mode 100644 .github/workflows/test_on_push.yaml create mode 100644 noxfile.py delete mode 100644 requirements.txt create mode 100644 tests/unit/test_parameterisation.py diff --git a/.github/workflows/test_on_push.yaml b/.github/workflows/test_on_push.yaml new file mode 100644 index 000000000..eedb94d68 --- /dev/null +++ b/.github/workflows/test_on_push.yaml @@ -0,0 +1,26 @@ +name: Python package + +on: [push] + +jobs: + build: + + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.8", "3.9", "3.10", "3.11"] + + steps: + - uses: actions/checkout@v3 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install --upgrade pip nox + pip install -e . + - name: Test with pytest + run: | + pytest diff --git a/examples/Initial_API.py b/examples/Initial_API.py index 1e5ffb7d9..c30bbf8ed 100644 --- a/examples/Initial_API.py +++ b/examples/Initial_API.py @@ -16,14 +16,14 @@ # Fitting parameters params = { - "Negative electrode active material volume fraction": pybop.Parameter("Negative electrode active material volume fraction", prior = pybop.Gaussian(0.6,0.1), bounds = [0.1,0.9]), - "Positive electrode active material volume fraction": pybop.Parameter("Positive electrode active material volume fraction", prior = pybop.Gaussian(0.6,0.1), bounds = [0.1,0.9]), + "Negative electrode active material volume fraction": pybop.Parameter("Negative electrode active material volume fraction", prior = pybop.Gaussian(0.6,0.1), bounds = [0.05,0.95]), + "Positive electrode active material volume fraction": pybop.Parameter("Positive electrode active material volume fraction", prior = pybop.Gaussian(0.6,0.1), bounds = [0.05,0.95]), } parameterisation = pybop.Parameterisation(model, observations=observations, fit_parameters=params) -# get RMSE estimate -results, last_optim, num_evals = parameterisation.rmse(method="nlopt") +# get RMSE estimate using NLOpt +results, last_optim, num_evals = parameterisation.rmse(signal="Voltage [V]", method="nlopt") # get MAP estimate, starting at a random initial point in parameter space # parameterisation.map(x0=[p.sample() for p in params]) diff --git a/noxfile.py b/noxfile.py new file mode 100644 index 000000000..d96c45832 --- /dev/null +++ b/noxfile.py @@ -0,0 +1,16 @@ +import nox + +# nox options +nox.options.reuse_existing_virtualenvs = True + +# @nox.session +# def lint(session): +# session.install('flake8') +# session.run('flake8', 'example.py') + + +@nox.session +def tests(session): + session.run_always('pip', 'install', '-e', '.') + session.install('pytest') + session.run('pytest') \ No newline at end of file diff --git a/pybop/parameterisation.py b/pybop/parameterisation.py index 90d8df8da..e54aa13d2 100644 --- a/pybop/parameterisation.py +++ b/pybop/parameterisation.py @@ -133,9 +133,28 @@ def set_params(self): self.parameter_set.process_geometry(self._geometry) self.model = self._model_with_set_params + def step(self, signal, x, grad): + for i, p in enumerate(self.fit_dict): + self.fit_dict[p] = x[i] + print(self.fit_dict) + + y_hat = self.solver.solve( + self._built_model, self.time_data, inputs=self.fit_dict + )[signal].data + + try: + res = np.sqrt( + np.mean((self.observations["Voltage [V]"].data[1] - y_hat) ** 2) + ) + except: + raise ValueError( + "Measurement and modelled data length mismatch, potentially due to reaching a voltage cut-off" + ) + return res + def map(self, x0): """ - Max a posteriori estimation. + Maximum a posteriori estimation. """ pass @@ -151,38 +170,20 @@ def pem(self, method=None): """ pass - def rmse(self, method=None): + def rmse(self, signal, method=None): """ Calculate the root mean squared error. """ - def step(x, grad): - for i, p in enumerate(self.fit_dict): - self.fit_dict[p] = x[i] - print(self.fit_dict) - - y_hat = self.solver.solve( - self._built_model, self.time_data, inputs=self.fit_dict - )["Terminal voltage [V]"].data - - try: - res = np.sqrt( - np.mean((self.observations["Voltage [V]"].data[1] - y_hat) ** 2) - ) - except: - raise ValueError( - "Measurement and modelled data length mismatch, potentially due to voltage cut-offs" - ) - print(res) - return res - if method == "nlopt": optim = pybop.NLoptOptimize(x0=self.x0) - results = optim.optimise(step, self.x0, self.bounds) + results = optim.optimise( + lambda x, grad: self.step(signal, x, grad), self.x0, self.bounds + ) else: optim = pybop.NLoptOptimize(method) - results = optim.optimise(step, self.x0, self.bounds) + results = optim.optimise(self.step, self.x0, self.bounds) return results def mle(self, method=None): diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index dae82630d..000000000 --- a/requirements.txt +++ /dev/null @@ -1,5 +0,0 @@ -numpy -pandas -scipy -pybamm -matplotlib \ No newline at end of file diff --git a/setup.py b/setup.py index 42d1d101f..bf5523cde 100644 --- a/setup.py +++ b/setup.py @@ -31,11 +31,11 @@ url='https://github.com/pybop-team/PyBOP', # List of packages to install with this one install_requires=[ - "pybamm>=23.1" - "numpy>=1.16", - "scipy>=1.3", - "pandas>=0.24", - "casadi>=3.6.0", + "pybamm>=23.1", + "numpy>=1.25", + "scipy>=1.11", + "pandas>=2.0", + "casadi>=3.6", "nlopt>=2.6", ], # https://pypi.org/classifiers/ diff --git a/tests/unit/test_parameterisation.py b/tests/unit/test_parameterisation.py new file mode 100644 index 000000000..551366d31 --- /dev/null +++ b/tests/unit/test_parameterisation.py @@ -0,0 +1,45 @@ +import pybop +import pytest +import numpy as np +import pandas as pd + + +class TestParameterisation: + def test_rmse(self): + # Form observations + Measurements = pd.read_csv("examples/Chen_example.csv", comment='#').to_numpy() + observations = { + "Time [s]": pybop.Observed(["Time [s]"], Measurements[:,0]), + "Current function [A]": pybop.Observed(["Current function [A]"], Measurements[:,1]), + "Voltage [V]": pybop.Observed(["Voltage [V]"], Measurements[:,2]) + } + + # Define model + model = pybop.models.lithium_ion.SPM() + model.parameter_set = pybop.ParameterSet("pybamm", "Chen2020") + + # Fitting parameters + params = { + "Negative electrode active material volume fraction": pybop.Parameter( + "Negative electrode active material volume fraction", + prior=pybop.Gaussian(0.6, 0.1), + bounds=[0.05, 0.95], + ), + "Positive electrode active material volume fraction": pybop.Parameter( + "Positive electrode active material volume fraction", + prior=pybop.Gaussian(0.6, 0.1), + bounds=[0.05, 0.95], + ), + } + + parameterisation = pybop.Parameterisation( + model, observations=observations, fit_parameters=params + ) + + # get RMSE estimate using NLOpt + results, last_optim, num_evals = parameterisation.rmse( + signal="Voltage [V]", method="nlopt" + ) + # Assertions + np.testing.assert_allclose(last_optim, 1e-1, atol=5e-2) + \ No newline at end of file From 66d58565b228615bfced9d4bfe896de3706aebbe Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Wed, 16 Aug 2023 13:09:08 +0100 Subject: [PATCH 027/210] Fix test_on_push for nox --- .github/workflows/test_on_push.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test_on_push.yaml b/.github/workflows/test_on_push.yaml index eedb94d68..9fc78541f 100644 --- a/.github/workflows/test_on_push.yaml +++ b/.github/workflows/test_on_push.yaml @@ -1,4 +1,4 @@ -name: Python package +name: PyBOP on: [push] @@ -21,6 +21,6 @@ jobs: python -m pip install --upgrade pip pip install --upgrade pip nox pip install -e . - - name: Test with pytest + - name: Test with nox run: | - pytest + nox From c0001e5c55886e2ea1b0ba38d1a58e3160921b4c Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Wed, 16 Aug 2023 13:12:14 +0100 Subject: [PATCH 028/210] Updt numpy version requirement, add fail-fast false condition --- .github/workflows/test_on_push.yaml | 1 + setup.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test_on_push.yaml b/.github/workflows/test_on_push.yaml index 9fc78541f..04f4afc26 100644 --- a/.github/workflows/test_on_push.yaml +++ b/.github/workflows/test_on_push.yaml @@ -7,6 +7,7 @@ jobs: runs-on: ubuntu-latest strategy: + fail-fast: false matrix: python-version: ["3.8", "3.9", "3.10", "3.11"] diff --git a/setup.py b/setup.py index bf5523cde..67ed0aef4 100644 --- a/setup.py +++ b/setup.py @@ -32,7 +32,7 @@ # List of packages to install with this one install_requires=[ "pybamm>=23.1", - "numpy>=1.25", + "numpy>=1.16", "scipy>=1.11", "pandas>=2.0", "casadi>=3.6", From 38bddb072ca36469d3ee2d04abfde4b0f90bf008 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Wed, 16 Aug 2023 13:24:03 +0100 Subject: [PATCH 029/210] Updt dependancy requirements for python 3.8 support --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 67ed0aef4..a9a328598 100644 --- a/setup.py +++ b/setup.py @@ -33,8 +33,8 @@ install_requires=[ "pybamm>=23.1", "numpy>=1.16", - "scipy>=1.11", - "pandas>=2.0", + "scipy>=1.3", + "pandas>=1.0", "casadi>=3.6", "nlopt>=2.6", ], From 1fb9fac65ed5d255f36ab3b434020315ec079416 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Wed, 16 Aug 2023 15:32:41 +0100 Subject: [PATCH 030/210] Updt README w/ build status --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index da868b90f..441e2c469 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,11 @@ # PyBOP - A *Py*thon package for *B*attery *O*ptimisation and *P*arameterisation +<div align="center"> + +[![Build Status](https://github.com/pybop-team/PyBOP/actions/workflows/CI/badge.svg)](https://github.com/pybop-team/PyBOP/actions) + +</div> + PyBOP aims to be a modular library for the parameterisation and optimisation of battery models, with a particular focus on classes built around [PyBaMM](https://github.com/pybamm-team/PyBaMM) models. The figure below gives the current conceptual idea of PyBOP's structure. This will likely evolve as development progresses. <p align="center"> From cc10421d4dd99209592d70c91f15dab83c396a2b Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Wed, 16 Aug 2023 15:41:07 +0100 Subject: [PATCH 031/210] Test icon syntax fix --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 441e2c469..20f03d5b7 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ <div align="center"> -[![Build Status](https://github.com/pybop-team/PyBOP/actions/workflows/CI/badge.svg)](https://github.com/pybop-team/PyBOP/actions) +[![Build Status](https://github.com/pybop-team/PyBOP/actions/workflows/test_on_push.yaml/badge.svg?branch=develop)](https://github.com/pybop-team/PyBOP/actions/workflows/test_on_push.yaml) </div> From 6b7ab48a391f3116cedea3c0c7107cb3ac5071a0 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 17 Aug 2023 16:19:40 +0100 Subject: [PATCH 032/210] Updt. x0 to be sampled from priors, Progress: API to list formation --- examples/Initial_API.py | 10 +++++----- pybop/parameterisation.py | 12 ++++++++++-- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/examples/Initial_API.py b/examples/Initial_API.py index c30bbf8ed..261e296ef 100644 --- a/examples/Initial_API.py +++ b/examples/Initial_API.py @@ -4,11 +4,11 @@ # Form observations Measurements = pd.read_csv("examples/Chen_example.csv", comment='#').to_numpy() -observations = { - "Time [s]": pybop.Observed(["Time [s]"], Measurements[:,0]), - "Current function [A]": pybop.Observed(["Current function [A]"], Measurements[:,1]), - "Voltage [V]": pybop.Observed(["Voltage [V]"], Measurements[:,2]) -} +observations = [ + pybop.Observed(["Time [s]"], Measurements[:,0]), + pybop.Observed(["Current function [A]"], Measurements[:,1]), + pybop.Observed(["Voltage [V]"], Measurements[:,2]) +] # Define model model = pybop.models.lithium_ion.SPM() diff --git a/pybop/parameterisation.py b/pybop/parameterisation.py index e54aa13d2..a31cc31ea 100644 --- a/pybop/parameterisation.py +++ b/pybop/parameterisation.py @@ -30,7 +30,12 @@ def __init__( self.model = model.pybamm_model self._unprocessed_model = model.pybamm_model self.fit_parameters = fit_parameters - self.observations = observations + + self.observations = {o.name: o for o in observations} # needs to be fixed + for name in ["Time [s]", "Current function [A]"]: + if name not in self.observations: + raise ValueError(f"expected {name} in list of observations") + self.bounds = dict( lower=[self.fit_parameters[p].bounds[0] for p in self.fit_parameters], upper=[self.fit_parameters[p].bounds[1] for p in self.fit_parameters], @@ -61,7 +66,10 @@ def __init__( raise ValueError("Current function not supplied") if x0 is None: - self.x0 = np.mean([self.bounds["lower"], self.bounds["upper"]], axis=0) + self.x0 = np.zeros(len(self.fit_parameters)) + + for i, j in enumerate(self.fit_parameters): + self.x0[i] = self.fit_parameters[j].prior.rvs(1) # set input parameters in parameter set from fitting parameters for i in self.fit_parameters: From d50702e284e92cc543c693390e6c98229f76b746 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 17 Aug 2023 18:07:16 +0100 Subject: [PATCH 033/210] API change to observation & params definition to type::list --- examples/Initial_API.py | 14 +++++++------- pybop/parameterisation.py | 6 +++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/examples/Initial_API.py b/examples/Initial_API.py index 261e296ef..a884409bb 100644 --- a/examples/Initial_API.py +++ b/examples/Initial_API.py @@ -5,9 +5,9 @@ # Form observations Measurements = pd.read_csv("examples/Chen_example.csv", comment='#').to_numpy() observations = [ - pybop.Observed(["Time [s]"], Measurements[:,0]), - pybop.Observed(["Current function [A]"], Measurements[:,1]), - pybop.Observed(["Voltage [V]"], Measurements[:,2]) + pybop.Observed("Time [s]", Measurements[:,0]), + pybop.Observed("Current function [A]", Measurements[:,1]), + pybop.Observed("Voltage [V]", Measurements[:,2]) ] # Define model @@ -15,10 +15,10 @@ model.parameter_set = pybop.ParameterSet("pybamm", "Chen2020") # Fitting parameters -params = { - "Negative electrode active material volume fraction": pybop.Parameter("Negative electrode active material volume fraction", prior = pybop.Gaussian(0.6,0.1), bounds = [0.05,0.95]), - "Positive electrode active material volume fraction": pybop.Parameter("Positive electrode active material volume fraction", prior = pybop.Gaussian(0.6,0.1), bounds = [0.05,0.95]), -} +params = [ + pybop.Parameter("Negative electrode active material volume fraction", prior = pybop.Gaussian(0.6,0.1), bounds = [0.05,0.95]), + pybop.Parameter("Positive electrode active material volume fraction", prior = pybop.Gaussian(0.6,0.1), bounds = [0.05,0.95]), +] parameterisation = pybop.Parameterisation(model, observations=observations, fit_parameters=params) diff --git a/pybop/parameterisation.py b/pybop/parameterisation.py index a31cc31ea..008e38bfd 100644 --- a/pybop/parameterisation.py +++ b/pybop/parameterisation.py @@ -29,9 +29,10 @@ def __init__( ): self.model = model.pybamm_model self._unprocessed_model = model.pybamm_model - self.fit_parameters = fit_parameters + self.fit_parameters = {o.name: o for o in fit_parameters} + self.observations = {o.name: o for o in observations} - self.observations = {o.name: o for o in observations} # needs to be fixed + # Check that the observations contain time and current for name in ["Time [s]", "Current function [A]"]: if name not in self.observations: raise ValueError(f"expected {name} in list of observations") @@ -67,7 +68,6 @@ def __init__( if x0 is None: self.x0 = np.zeros(len(self.fit_parameters)) - for i, j in enumerate(self.fit_parameters): self.x0[i] = self.fit_parameters[j].prior.rvs(1) From ee7fe83f7727672c9ab12a1d2846123d39c25df4 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 18 Aug 2023 09:03:32 +0100 Subject: [PATCH 034/210] refactor API change for observ. & param class type::list, tests update for change --- examples/Initial_API.py | 34 +++++++++++++++++++---------- pybop/parameterisation.py | 2 +- tests/unit/test_parameterisation.py | 21 +++++++++--------- 3 files changed, 34 insertions(+), 23 deletions(-) diff --git a/examples/Initial_API.py b/examples/Initial_API.py index a884409bb..25faa65b7 100644 --- a/examples/Initial_API.py +++ b/examples/Initial_API.py @@ -3,30 +3,42 @@ import numpy as np # Form observations -Measurements = pd.read_csv("examples/Chen_example.csv", comment='#').to_numpy() +Measurements = pd.read_csv("examples/Chen_example.csv", comment="#").to_numpy() observations = [ - pybop.Observed("Time [s]", Measurements[:,0]), - pybop.Observed("Current function [A]", Measurements[:,1]), - pybop.Observed("Voltage [V]", Measurements[:,2]) + pybop.Observed("Time [s]", Measurements[:, 0]), + pybop.Observed("Current function [A]", Measurements[:, 1]), + pybop.Observed("Voltage [V]", Measurements[:, 2]), ] - + # Define model model = pybop.models.lithium_ion.SPM() model.parameter_set = pybop.ParameterSet("pybamm", "Chen2020") # Fitting parameters params = [ - pybop.Parameter("Negative electrode active material volume fraction", prior = pybop.Gaussian(0.6,0.1), bounds = [0.05,0.95]), - pybop.Parameter("Positive electrode active material volume fraction", prior = pybop.Gaussian(0.6,0.1), bounds = [0.05,0.95]), + pybop.Parameter( + "Negative electrode active material volume fraction", + prior=pybop.Gaussian(0.6, 0.1), + bounds=[0.05, 0.95], + ), + pybop.Parameter( + "Positive electrode active material volume fraction", + prior=pybop.Gaussian(0.6, 0.1), + bounds=[0.05, 0.95], + ), ] -parameterisation = pybop.Parameterisation(model, observations=observations, fit_parameters=params) +parameterisation = pybop.Parameterisation( + model, observations=observations, fit_parameters=params +) # get RMSE estimate using NLOpt -results, last_optim, num_evals = parameterisation.rmse(signal="Voltage [V]", method="nlopt") +results, last_optim, num_evals = parameterisation.rmse( + signal="Voltage [V]", method="nlopt" +) # get MAP estimate, starting at a random initial point in parameter space -# parameterisation.map(x0=[p.sample() for p in params]) +# parameterisation.map(x0=[p.sample() for p in params]) # or sample from posterior # parameterisation.sample(1000, n_chains=4, ....) @@ -35,4 +47,4 @@ # parameterisation.sober() -#Optimisation = pybop.optimisation(model, cost=cost, parameters=parameters, observation=observation) \ No newline at end of file +# Optimisation = pybop.optimisation(model, cost=cost, parameters=parameters, observation=observation) diff --git a/pybop/parameterisation.py b/pybop/parameterisation.py index 008e38bfd..898f87b52 100644 --- a/pybop/parameterisation.py +++ b/pybop/parameterisation.py @@ -69,7 +69,7 @@ def __init__( if x0 is None: self.x0 = np.zeros(len(self.fit_parameters)) for i, j in enumerate(self.fit_parameters): - self.x0[i] = self.fit_parameters[j].prior.rvs(1) + self.x0[i] = self.fit_parameters[j].prior.rvs(1)[0] # set input parameters in parameter set from fitting parameters for i in self.fit_parameters: diff --git a/tests/unit/test_parameterisation.py b/tests/unit/test_parameterisation.py index 551366d31..123363517 100644 --- a/tests/unit/test_parameterisation.py +++ b/tests/unit/test_parameterisation.py @@ -7,30 +7,30 @@ class TestParameterisation: def test_rmse(self): # Form observations - Measurements = pd.read_csv("examples/Chen_example.csv", comment='#').to_numpy() - observations = { - "Time [s]": pybop.Observed(["Time [s]"], Measurements[:,0]), - "Current function [A]": pybop.Observed(["Current function [A]"], Measurements[:,1]), - "Voltage [V]": pybop.Observed(["Voltage [V]"], Measurements[:,2]) - } + Measurements = pd.read_csv("examples/Chen_example.csv", comment="#").to_numpy() + observations = [ + pybop.Observed("Time [s]", Measurements[:, 0]), + pybop.Observed("Current function [A]", Measurements[:, 1]), + pybop.Observed("Voltage [V]", Measurements[:, 2]), + ] # Define model model = pybop.models.lithium_ion.SPM() model.parameter_set = pybop.ParameterSet("pybamm", "Chen2020") # Fitting parameters - params = { - "Negative electrode active material volume fraction": pybop.Parameter( + params = [ + pybop.Parameter( "Negative electrode active material volume fraction", prior=pybop.Gaussian(0.6, 0.1), bounds=[0.05, 0.95], ), - "Positive electrode active material volume fraction": pybop.Parameter( + pybop.Parameter( "Positive electrode active material volume fraction", prior=pybop.Gaussian(0.6, 0.1), bounds=[0.05, 0.95], ), - } + ] parameterisation = pybop.Parameterisation( model, observations=observations, fit_parameters=params @@ -42,4 +42,3 @@ def test_rmse(self): ) # Assertions np.testing.assert_allclose(last_optim, 1e-1, atol=5e-2) - \ No newline at end of file From d8b8077ffc5f3f735df1a5078c52b4ecbcde039b Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 18 Aug 2023 10:29:17 +0100 Subject: [PATCH 035/210] Refactor parameterisation & spm class, Add BaseModel class --- pybop/__init__.py | 1 + pybop/models/BaseModel.py | 24 +++++++++ pybop/models/lithium_ion/spm.py | 92 ++++++++++++++++++++++++++++++-- pybop/parameterisation.py | 93 +++------------------------------ 4 files changed, 122 insertions(+), 88 deletions(-) create mode 100644 pybop/models/BaseModel.py diff --git a/pybop/__init__.py b/pybop/__init__.py index e154c23ff..7aeec0553 100644 --- a/pybop/__init__.py +++ b/pybop/__init__.py @@ -28,6 +28,7 @@ # # Model Classes # +from .models import BaseModel from .models import lithium_ion # diff --git a/pybop/models/BaseModel.py b/pybop/models/BaseModel.py new file mode 100644 index 000000000..a526909bf --- /dev/null +++ b/pybop/models/BaseModel.py @@ -0,0 +1,24 @@ +import pybop + + +class BaseModel: + """ + Base class for PyBOP models + """ + + def __init__(self, name="Base Model"): + self.pybamm_model = None + self.name = name + self.parameter_set = None + + def build(self): + """ + Build the model + """ + pass + + def sim(self): + """ + Simulate the model + """ + pass diff --git a/pybop/models/lithium_ion/spm.py b/pybop/models/lithium_ion/spm.py index 99b118a99..5ea73fbc4 100644 --- a/pybop/models/lithium_ion/spm.py +++ b/pybop/models/lithium_ion/spm.py @@ -1,13 +1,99 @@ import pybop import pybamm +from ..BaseModel import BaseModel -class SPM: +class SPM(BaseModel): """ Composition of the SPM class in PyBaMM. """ - def __init__(self): + def __init__( + self, + name="Single Particle Model", + geometry=None, + submesh_types=None, + var_pts=None, + spatial_methods=None, + solver=None, + ): + super().__init__() self.pybamm_model = pybamm.lithium_ion.SPM() - self.name = "Single Particle Model" + self._unprocessed_model = self.pybamm_model + self.name = name self.parameter_set = self.pybamm_model.default_parameter_values + self._model_with_set_params = None + self._built_model = None + self._geometry = geometry or self.pybamm_model.default_geometry + self._submesh_types = submesh_types or self.pybamm_model.default_submesh_types + self._var_pts = var_pts or self.pybamm_model.default_var_pts + self._spatial_methods = ( + spatial_methods or self.pybamm_model.default_spatial_methods + ) + self.solver = solver or self.pybamm_model.default_solver + + def build_model( + self, + check_model=True, + init_soc=None, + ): + """ + Build the model (if not built already). + """ + if init_soc is not None: + self.set_init_soc(init_soc) # define this function + + if self._built_model: + return + + elif self.pybamm_model.is_discretised: + self.pybamm_model._model_with_set_params = self.pybamm_model + self.pybamm_model._built_model = self.pybamm_model + else: + self.set_params() + self._mesh = pybamm.Mesh(self._geometry, self._submesh_types, self._var_pts) + self._disc = pybamm.Discretisation(self._mesh, self._spatial_methods) + self._built_model = self._disc.process_model( + self._model_with_set_params, inplace=False, check_model=check_model + ) + + # Clear solver + self.solver._model_set_up = {} + + def set_init_soc(self, init_soc): + """ + Set the initial state of charge. + """ + if self._built_initial_soc != init_soc: + # reset + self._model_with_set_params = None + self._built_model = None + self.op_conds_to_built_models = None + self.op_conds_to_built_solvers = None + + param = self.model.pybamm_model.param + self.parameter_set = ( + self._unprocessed_parameter_set.set_initial_stoichiometries( + init_soc, param=param, inplace=False + ) + ) + # Save solved initial SOC in case we need to re-build the model + self._built_initial_soc = init_soc + + def set_params(self): + """ + Set the parameters in the model. + """ + if self._model_with_set_params: + return + + self._model_with_set_params = self.parameter_set.process_model( + self._unprocessed_model, inplace=False + ) + self.parameter_set.process_geometry(self._geometry) + self.pybamm_model = self._model_with_set_params + + def sim(self): + """ + Simulate the model + """ diff --git a/pybop/parameterisation.py b/pybop/parameterisation.py index 898f87b52..70cbd7c93 100644 --- a/pybop/parameterisation.py +++ b/pybop/parameterisation.py @@ -3,11 +3,6 @@ import numpy as np -# To Do: -# checks on observations and parameters -# Geometric parameters might always require reconstruction (i.e. electrode height) - - class Parameterisation: """ Parameterisation class for pybop. @@ -18,17 +13,11 @@ def __init__( model, observations, fit_parameters, - geometry=None, - submesh_types=None, - var_pts=None, - spatial_methods=None, - solver=None, x0=None, check_model=True, init_soc=None, ): - self.model = model.pybamm_model - self._unprocessed_model = model.pybamm_model + self.model = model self.fit_parameters = {o.name: o for o in fit_parameters} self.observations = {o.name: o for o in observations} @@ -41,21 +30,11 @@ def __init__( lower=[self.fit_parameters[p].bounds[0] for p in self.fit_parameters], upper=[self.fit_parameters[p].bounds[1] for p in self.fit_parameters], ) - self._model_with_set_params = None - self._built_model = None - self._geometry = geometry or self.model.default_geometry - self._submesh_types = submesh_types or self.model.default_submesh_types - self._var_pts = var_pts or self.model.default_var_pts - self._spatial_methods = spatial_methods or self.model.default_spatial_methods - self.solver = solver or self.model.default_solver - - # Set solver - self.solver = pybamm.CasadiSolver() - - if model.parameter_set is not None: - self.parameter_set = model.parameter_set + + if self.model.parameter_set is not None: + self.parameter_set = self.model.parameter_set else: - self.parameter_set = self.model.default_parameter_values + self.parameter_set = self.model.pybamm_model.default_parameter_values try: self.parameter_set["Current function [A]"] = pybamm.Interpolant( @@ -83,71 +62,15 @@ def __init__( # Set t_eval self.time_data = self.parameter_set["Current function [A]"].x[0] - self.build_model(check_model=check_model, init_soc=init_soc) - - def build_model(self, check_model=True, init_soc=None): - """ - Build the model (if not built already). - """ - if init_soc is not None: - self.set_init_soc(init_soc) # define this function - - if self._built_model: - return - elif self.model.is_discretised: - self.model._model_with_set_params = self.model - self.model._built_model = self.model - else: - self.set_params() - self._mesh = pybamm.Mesh(self._geometry, self._submesh_types, self._var_pts) - self._disc = pybamm.Discretisation(self._mesh, self._spatial_methods) - self._built_model = self._disc.process_model( - self._model_with_set_params, inplace=False, check_model=check_model - ) - - # Clear solver - self.solver._model_set_up = {} - - def set_init_soc(self, init_soc): - """ - Set the initial state of charge. - """ - if self._built_initial_soc != init_soc: - # reset - self._model_with_set_params = None - self._built_model = None - self.op_conds_to_built_models = None - self.op_conds_to_built_solvers = None - - param = self.model.param - self.parameter_set = ( - self._unprocessed_parameter_set.set_initial_stoichiometries( - init_soc, param=param, inplace=False - ) - ) - # Save solved initial SOC in case we need to re-build the model - self._built_initial_soc = init_soc - - def set_params(self): - """ - Set the parameters in the model. - """ - if self._model_with_set_params: - return - - self._model_with_set_params = self.parameter_set.process_model( - self._unprocessed_model, inplace=False - ) - self.parameter_set.process_geometry(self._geometry) - self.model = self._model_with_set_params + self.model.build_model(check_model=check_model, init_soc=init_soc) def step(self, signal, x, grad): for i, p in enumerate(self.fit_dict): self.fit_dict[p] = x[i] print(self.fit_dict) - y_hat = self.solver.solve( - self._built_model, self.time_data, inputs=self.fit_dict + y_hat = self.model.solver.solve( + self.model._built_model, self.time_data, inputs=self.fit_dict )[signal].data try: From e3f49c587f604a2633b916f618344b47558bee82 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 18 Aug 2023 11:26:45 +0100 Subject: [PATCH 036/210] Refactor #2 of parameterisation & spm class, Aligned init. parameter conditions for rmse/nlopt --- pybop/models/lithium_ion/spm.py | 28 ++++++++++++++++++-- pybop/parameterisation.py | 47 +++++++++++++-------------------- 2 files changed, 44 insertions(+), 31 deletions(-) diff --git a/pybop/models/lithium_ion/spm.py b/pybop/models/lithium_ion/spm.py index 5ea73fbc4..c42ec0f0e 100644 --- a/pybop/models/lithium_ion/spm.py +++ b/pybop/models/lithium_ion/spm.py @@ -16,12 +16,13 @@ def __init__( var_pts=None, spatial_methods=None, solver=None, + parameter_set=None, ): super().__init__() self.pybamm_model = pybamm.lithium_ion.SPM() self._unprocessed_model = self.pybamm_model self.name = name - self.parameter_set = self.pybamm_model.default_parameter_values + self.parameter_set = parameter_set or self.pybamm_model.default_parameter_values self._model_with_set_params = None self._built_model = None self._geometry = geometry or self.pybamm_model.default_geometry @@ -77,7 +78,7 @@ def set_init_soc(self, init_soc): init_soc, param=param, inplace=False ) ) - # Save solved initial SOC in case we need to re-build the model + # Save solved initial SOC in case we need to rebuild the model self._built_initial_soc = init_soc def set_params(self): @@ -93,6 +94,29 @@ def set_params(self): self.parameter_set.process_geometry(self._geometry) self.pybamm_model = self._model_with_set_params + def build_parameter_set(self, observations, fit_parameters): + """ + Build the parameter set. + """ + + try: + self.parameter_set["Current function [A]"] = pybamm.Interpolant( + observations["Time [s]"].data, + observations["Current function [A]"].data, + pybamm.t, + ) + except: + raise ValueError("Current function not supplied") + + # set input parameters in parameter set from fitting parameters + for i in fit_parameters: + self.parameter_set[i] = "[input]" + + self._unprocessed_parameter_set = self.parameter_set + + # Set t_eval + self.time_data = self.parameter_set["Current function [A]"].x[0] + def sim(self): """ Simulate the model diff --git a/pybop/parameterisation.py b/pybop/parameterisation.py index 70cbd7c93..3bc9cc27b 100644 --- a/pybop/parameterisation.py +++ b/pybop/parameterisation.py @@ -16,8 +16,10 @@ def __init__( x0=None, check_model=True, init_soc=None, + verbose=False, ): self.model = model + self.fit_dict = {} self.fit_parameters = {o.name: o for o in fit_parameters} self.observations = {o.name: o for o in observations} @@ -26,51 +28,34 @@ def __init__( if name not in self.observations: raise ValueError(f"expected {name} in list of observations") + # Set bounds self.bounds = dict( lower=[self.fit_parameters[p].bounds[0] for p in self.fit_parameters], upper=[self.fit_parameters[p].bounds[1] for p in self.fit_parameters], ) - if self.model.parameter_set is not None: - self.parameter_set = self.model.parameter_set - else: - self.parameter_set = self.model.pybamm_model.default_parameter_values - - try: - self.parameter_set["Current function [A]"] = pybamm.Interpolant( - self.observations["Time [s]"].data, - self.observations["Current function [A]"].data, - pybamm.t, - ) - except: - raise ValueError("Current function not supplied") - + # Sample from prior for x0 if x0 is None: self.x0 = np.zeros(len(self.fit_parameters)) for i, j in enumerate(self.fit_parameters): - self.x0[i] = self.fit_parameters[j].prior.rvs(1)[0] - - # set input parameters in parameter set from fitting parameters - for i in self.fit_parameters: - self.parameter_set[i] = "[input]" - - self._unprocessed_parameter_set = self.parameter_set - self.fit_dict = { - p: self.fit_parameters[p].prior.mean for p in self.fit_parameters - } + self.x0[i] = self.fit_parameters[j].prior.rvs(1)[ + 0 + ] # Updt to capture dimensions per parameter - # Set t_eval - self.time_data = self.parameter_set["Current function [A]"].x[0] + # Align initial guess with sample from prior + for i, j in enumerate(self.fit_parameters): + self.fit_dict[j] = {j: self.x0[i]} + # Build parameter set and model + self.model.build_parameter_set(self.observations, self.fit_parameters) self.model.build_model(check_model=check_model, init_soc=init_soc) - def step(self, signal, x, grad): + def step(self, signal, x, grad, verbose): for i, p in enumerate(self.fit_dict): self.fit_dict[p] = x[i] - print(self.fit_dict) y_hat = self.model.solver.solve( - self.model._built_model, self.time_data, inputs=self.fit_dict + self.model._built_model, self.model.time_data, inputs=self.fit_dict )[signal].data try: @@ -81,6 +66,10 @@ def step(self, signal, x, grad): raise ValueError( "Measurement and modelled data length mismatch, potentially due to reaching a voltage cut-off" ) + + if verbose: + print(self.fit_dict) + return res def map(self, x0): From d21249ba9823ff4535237680ec987a0a60873d96 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 18 Aug 2023 15:38:10 +0100 Subject: [PATCH 037/210] Data generation in test methods, debug parameter initilisation problem for spm+basemodel, parameterisation.py tidy --- examples/Initial_API.py | 12 +-- pybop/models/BaseModel.py | 4 +- pybop/models/lithium_ion/spm.py | 129 +++++++++++++++++++++------- pybop/parameterisation.py | 38 +++++--- tests/unit/test_parameterisation.py | 34 +++++++- 5 files changed, 161 insertions(+), 56 deletions(-) diff --git a/examples/Initial_API.py b/examples/Initial_API.py index 25faa65b7..5a47e27aa 100644 --- a/examples/Initial_API.py +++ b/examples/Initial_API.py @@ -11,20 +11,20 @@ ] # Define model -model = pybop.models.lithium_ion.SPM() -model.parameter_set = pybop.ParameterSet("pybamm", "Chen2020") +parameter_set = pybop.ParameterSet("pybamm", "Chen2020") +model = pybop.models.lithium_ion.SPM(parameter_set=parameter_set) # Fitting parameters params = [ pybop.Parameter( "Negative electrode active material volume fraction", - prior=pybop.Gaussian(0.6, 0.1), - bounds=[0.05, 0.95], + prior=pybop.Gaussian(0.75, 0.05), + bounds=[0.65, 0.85], ), pybop.Parameter( "Positive electrode active material volume fraction", - prior=pybop.Gaussian(0.6, 0.1), - bounds=[0.05, 0.95], + prior=pybop.Gaussian(0.65, 0.05), + bounds=[0.55, 0.75], ), ] diff --git a/pybop/models/BaseModel.py b/pybop/models/BaseModel.py index a526909bf..809a99e28 100644 --- a/pybop/models/BaseModel.py +++ b/pybop/models/BaseModel.py @@ -7,9 +7,9 @@ class BaseModel: """ def __init__(self, name="Base Model"): - self.pybamm_model = None + # self.pybamm_model = None self.name = name - self.parameter_set = None + # self.parameter_set = None def build(self): """ diff --git a/pybop/models/lithium_ion/spm.py b/pybop/models/lithium_ion/spm.py index c42ec0f0e..133a241b6 100644 --- a/pybop/models/lithium_ion/spm.py +++ b/pybop/models/lithium_ion/spm.py @@ -11,30 +11,39 @@ class SPM(BaseModel): def __init__( self, name="Single Particle Model", + parameter_set=None, geometry=None, submesh_types=None, var_pts=None, spatial_methods=None, solver=None, - parameter_set=None, ): super().__init__() self.pybamm_model = pybamm.lithium_ion.SPM() self._unprocessed_model = self.pybamm_model self.name = name + self.parameter_set = parameter_set or self.pybamm_model.default_parameter_values - self._model_with_set_params = None - self._built_model = None - self._geometry = geometry or self.pybamm_model.default_geometry - self._submesh_types = submesh_types or self.pybamm_model.default_submesh_types - self._var_pts = var_pts or self.pybamm_model.default_var_pts - self._spatial_methods = ( + self._unprocessed_parameter_set = self.parameter_set + + self.geometry = geometry or self.pybamm_model.default_geometry + self.submesh_types = submesh_types or self.pybamm_model.default_submesh_types + self.var_pts = var_pts or self.pybamm_model.default_var_pts + self.spatial_methods = ( spatial_methods or self.pybamm_model.default_spatial_methods ) self.solver = solver or self.pybamm_model.default_solver + self._model_with_set_params = None + self._built_model = None + self._built_initial_soc = None + self._mesh = None + self._disc = None + def build_model( self, + observations, + fit_parameters, check_model=True, init_soc=None, ): @@ -42,24 +51,26 @@ def build_model( Build the model (if not built already). """ if init_soc is not None: - self.set_init_soc(init_soc) # define this function + self.set_init_soc(init_soc) if self._built_model: return elif self.pybamm_model.is_discretised: - self.pybamm_model._model_with_set_params = self.pybamm_model - self.pybamm_model._built_model = self.pybamm_model + self._model_with_set_params = self.pybamm_model + self._built_model = self.pybamm_model else: - self.set_params() - self._mesh = pybamm.Mesh(self._geometry, self._submesh_types, self._var_pts) - self._disc = pybamm.Discretisation(self._mesh, self._spatial_methods) + self.set_params(observations, fit_parameters) + self._mesh = pybamm.Mesh(self.geometry, self.submesh_types, self.var_pts) + self._disc = pybamm.Discretisation(self.mesh, self.spatial_methods) self._built_model = self._disc.process_model( self._model_with_set_params, inplace=False, check_model=check_model ) + # Set t_eval + self.time_data = self._parameter_set["Current function [A]"].x[0] # Clear solver - self.solver._model_set_up = {} + self._solver._model_set_up = {} def set_init_soc(self, init_soc): """ @@ -72,7 +83,7 @@ def set_init_soc(self, init_soc): self.op_conds_to_built_models = None self.op_conds_to_built_solvers = None - param = self.model.pybamm_model.param + param = self.pybamm_model.param self.parameter_set = ( self._unprocessed_parameter_set.set_initial_stoichiometries( init_soc, param=param, inplace=False @@ -81,24 +92,13 @@ def set_init_soc(self, init_soc): # Save solved initial SOC in case we need to rebuild the model self._built_initial_soc = init_soc - def set_params(self): + def set_params(self, observations, fit_parameters): """ Set the parameters in the model. """ - if self._model_with_set_params: + if self.model_with_set_params: return - self._model_with_set_params = self.parameter_set.process_model( - self._unprocessed_model, inplace=False - ) - self.parameter_set.process_geometry(self._geometry) - self.pybamm_model = self._model_with_set_params - - def build_parameter_set(self, observations, fit_parameters): - """ - Build the parameter set. - """ - try: self.parameter_set["Current function [A]"] = pybamm.Interpolant( observations["Time [s]"].data, @@ -112,12 +112,77 @@ def build_parameter_set(self, observations, fit_parameters): for i in fit_parameters: self.parameter_set[i] = "[input]" - self._unprocessed_parameter_set = self.parameter_set - - # Set t_eval - self.time_data = self.parameter_set["Current function [A]"].x[0] + self._model_with_set_params = self._parameter_set.process_model( + self._unprocessed_model, inplace=False + ) + self._parameter_set.process_geometry(self.geometry) + self.pybamm_model = self._model_with_set_params def sim(self): """ Simulate the model """ + + @property + def built_model(self): + return self._built_model + + @property + def parameter_set(self): + return self._parameter_set + + @parameter_set.setter + def parameter_set(self, parameter_set): + self._parameter_set = parameter_set.copy() + + @property + def model_with_set_params(self): + return self._model_with_set_params + + @property + def built_model(self): + return self._built_model + + @property + def geometry(self): + return self._geometry + + @geometry.setter + def geometry(self, geometry): + self._geometry = geometry.copy() + + @property + def submesh_types(self): + return self._submesh_types + + @submesh_types.setter + def submesh_types(self, submesh_types): + self._submesh_types = submesh_types.copy() + + @property + def mesh(self): + return self._mesh + + @property + def var_pts(self): + return self._var_pts + + @var_pts.setter + def var_pts(self, var_pts): + self._var_pts = var_pts.copy() + + @property + def spatial_methods(self): + return self._spatial_methods + + @spatial_methods.setter + def spatial_methods(self, spatial_methods): + self._spatial_methods = spatial_methods.copy() + + @property + def solver(self): + return self._solver + + @solver.setter + def solver(self, solver): + self._solver = solver.copy() diff --git a/pybop/parameterisation.py b/pybop/parameterisation.py index 3bc9cc27b..aa6828d3c 100644 --- a/pybop/parameterisation.py +++ b/pybop/parameterisation.py @@ -1,5 +1,4 @@ import pybop -import pybamm import numpy as np @@ -19,6 +18,7 @@ def __init__( verbose=False, ): self.model = model + self.verbose = verbose self.fit_dict = {} self.fit_parameters = {o.name: o for o in fit_parameters} self.observations = {o.name: o for o in observations} @@ -46,28 +46,42 @@ def __init__( for i, j in enumerate(self.fit_parameters): self.fit_dict[j] = {j: self.x0[i]} - # Build parameter set and model - self.model.build_parameter_set(self.observations, self.fit_parameters) - self.model.build_model(check_model=check_model, init_soc=init_soc) + # Build model with observations and fitting_parameters + self.model.build_model( + self.observations, + self.fit_parameters, + check_model=check_model, + init_soc=init_soc, + ) - def step(self, signal, x, grad, verbose): + def step(self, signal, x, grad): for i, p in enumerate(self.fit_dict): self.fit_dict[p] = x[i] y_hat = self.model.solver.solve( - self.model._built_model, self.model.time_data, inputs=self.fit_dict + self.model.built_model, self.model.time_data, inputs=self.fit_dict )[signal].data - try: - res = np.sqrt( - np.mean((self.observations["Voltage [V]"].data[1] - y_hat) ** 2) + print( + "Last Voltage Values:", y_hat[-1], self.observations["Voltage [V]"].data[-1] + ) + + if len(y_hat) != len(self.observations["Voltage [V]"].data): + print( + "len of vectors:", + len(y_hat), + len(self.observations["Voltage [V]"].data), ) - except: raise ValueError( - "Measurement and modelled data length mismatch, potentially due to reaching a voltage cut-off" + "Measurement and simulated data length mismatch, potentially due to reaching a voltage cut-off" ) - if verbose: + try: + res = np.sqrt(np.mean((self.observations["Voltage [V]"].data - y_hat) ** 2)) + except: + print("Error in RMSE calculation") + + if self.verbose: print(self.fit_dict) return res diff --git a/tests/unit/test_parameterisation.py b/tests/unit/test_parameterisation.py index 123363517..a55dae54b 100644 --- a/tests/unit/test_parameterisation.py +++ b/tests/unit/test_parameterisation.py @@ -1,17 +1,43 @@ import pybop import pytest +import pybamm import numpy as np import pandas as pd class TestParameterisation: + def getdata(self, x1, x2): + model = pybamm.lithium_ion.SPM() + params = pybamm.ParameterValues("Chen2020") + + params.update( + { + "Negative electrode active material volume fraction": x1, + "Positive electrode active material volume fraction": x2, + } + ) + experiment = pybamm.Experiment( + [ + ( + "Discharge at 0.5C for 5 minutes (1 second period)", + "Rest for 2 minutes (1 second period)", + "Charge at 0.5C for 2.5 minutes (1 second period)", + "Rest for 2 minutes (1 second period)", + ), + ] + * 2 + ) + sim = pybamm.Simulation(model, experiment=experiment, parameter_values=params) + return sim.solve(initial_soc=0.5) + def test_rmse(self): # Form observations - Measurements = pd.read_csv("examples/Chen_example.csv", comment="#").to_numpy() + solution = self.getdata(0.6, 0.6) + observations = [ - pybop.Observed("Time [s]", Measurements[:, 0]), - pybop.Observed("Current function [A]", Measurements[:, 1]), - pybop.Observed("Voltage [V]", Measurements[:, 2]), + pybop.Observed("Time [s]", solution["Time [s]"].data), + pybop.Observed("Current function [A]", solution["Current [A]"].data), + pybop.Observed("Voltage [V]", solution["Terminal voltage [V]"].data), ] # Define model From 4735367adcab4830dffca70eecaf1b48218e7522 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 18 Aug 2023 19:32:00 +0100 Subject: [PATCH 038/210] Updt. to default parameter set for a stable & working state --- tests/unit/test_parameterisation.py | 33 +++++++++++++++-------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/tests/unit/test_parameterisation.py b/tests/unit/test_parameterisation.py index a55dae54b..6bf4f6e92 100644 --- a/tests/unit/test_parameterisation.py +++ b/tests/unit/test_parameterisation.py @@ -1,38 +1,38 @@ import pybop -import pytest import pybamm +import pytest import numpy as np -import pandas as pd class TestParameterisation: - def getdata(self, x1, x2): + def getdata(self, x0): model = pybamm.lithium_ion.SPM() - params = pybamm.ParameterValues("Chen2020") + params = model.default_parameter_values params.update( { - "Negative electrode active material volume fraction": x1, - "Positive electrode active material volume fraction": x2, + "Negative electrode active material volume fraction": x0[0], + "Positive electrode active material volume fraction": x0[1], } ) experiment = pybamm.Experiment( [ ( - "Discharge at 0.5C for 5 minutes (1 second period)", + "Discharge at 2C for 5 minutes (1 second period)", "Rest for 2 minutes (1 second period)", - "Charge at 0.5C for 2.5 minutes (1 second period)", + "Charge at 1C for 5 minutes (1 second period)", "Rest for 2 minutes (1 second period)", ), ] * 2 ) sim = pybamm.Simulation(model, experiment=experiment, parameter_values=params) - return sim.solve(initial_soc=0.5) + return sim.solve() def test_rmse(self): # Form observations - solution = self.getdata(0.6, 0.6) + x0 = np.array([0.55, 0.63]) + solution = self.getdata(x0) observations = [ pybop.Observed("Time [s]", solution["Time [s]"].data), @@ -42,19 +42,19 @@ def test_rmse(self): # Define model model = pybop.models.lithium_ion.SPM() - model.parameter_set = pybop.ParameterSet("pybamm", "Chen2020") + model.parameter_set = model.pybamm_model.default_parameter_values # Fitting parameters params = [ pybop.Parameter( "Negative electrode active material volume fraction", - prior=pybop.Gaussian(0.6, 0.1), - bounds=[0.05, 0.95], + prior=pybop.Gaussian(0.5, 0.05), + bounds=[0.35, 0.75], ), pybop.Parameter( "Positive electrode active material volume fraction", - prior=pybop.Gaussian(0.6, 0.1), - bounds=[0.05, 0.95], + prior=pybop.Gaussian(0.65, 0.05), + bounds=[0.45, 0.85], ), ] @@ -67,4 +67,5 @@ def test_rmse(self): signal="Voltage [V]", method="nlopt" ) # Assertions - np.testing.assert_allclose(last_optim, 1e-1, atol=5e-2) + np.testing.assert_allclose(last_optim, 1e-3, atol=1e-2) + np.testing.assert_almost_equal(results, x0, decimal=1) From 9d7181b1f4beb9cfbc5ae729534dd21895b78032 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Sat, 19 Aug 2023 11:14:38 +0100 Subject: [PATCH 039/210] Add issue templates --- .github/ISSUE_TEMPLATE/bug_report.yml | 37 ++++++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.yml | 35 ++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 000000000..0857a4b77 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,37 @@ +name: Bug Report +description: Create a bug report +title: "[Bug]: " +labels: ["bug"] +body: + - type: markdown + attributes: + value: | + Thanks for filling out this report to help us improve! + - type: input + id: python-version + attributes: + label: Python Version + description: What python version are you using? + placeholder: python version + validations: + required: true + - type: text-area + id: bug-description + attributes: + label: Describe the bug + description: A clear and concise description of the bug. + validations: + required: true + - type: text-area + id: reproduce + attributes: + label: Steps to reproduce the behaviour + description: Tell us how to reproduce this behaviour. Please try to include a [Minimum Workable Example](https://stackoverflow.com/help/minimal-reproducible-example) + validations: + required: true + - type: text-area + id: logs + attributes: + label: Relevant log output + description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks. + render: shell diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 000000000..58987bf0c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,35 @@ +name: Feature request +about: Suggest a feature +title: "[Feature]:" +labels: ["enhancement"] +body: + -type: markdown + attributes: + value: | + Thanks for filling out this report to help us improve! + -type: input + id: Feature + attributes: + label: Feature description + description: Describe the feature you'd like + placeholder: Feature description + validations: + required: true + -type: input + id: Motivation + attributes: + label: Motivation + description: Please enter the motivation for this feature i.e (problem, performance, etc) + -type: input + id: Possible Implementation + attributes: + label: Possible implementation + description: Please enter any possible implementation for this feature + -type: input + id: Additional context + attributes: + label: Additional context + description: Add any additional context about the feature request. + placeholder: Additional context + + From 01ea80eb8e4c59dfdffddd313ebffcedaae34e54 Mon Sep 17 00:00:00 2001 From: Brady Planden <55357039+BradyPlanden@users.noreply.github.com> Date: Sat, 19 Aug 2023 11:55:20 +0100 Subject: [PATCH 040/210] Syntax fix for issue templates (#23) * Issue template bugfix --- .github/ISSUE_TEMPLATE/bug_report.yml | 6 ++-- .github/ISSUE_TEMPLATE/feature_request.yml | 41 ++++++++++------------ 2 files changed, 21 insertions(+), 26 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 0857a4b77..0b95cd9a8 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -15,21 +15,21 @@ body: placeholder: python version validations: required: true - - type: text-area + - type: textarea id: bug-description attributes: label: Describe the bug description: A clear and concise description of the bug. validations: required: true - - type: text-area + - type: textarea id: reproduce attributes: label: Steps to reproduce the behaviour description: Tell us how to reproduce this behaviour. Please try to include a [Minimum Workable Example](https://stackoverflow.com/help/minimal-reproducible-example) validations: required: true - - type: text-area + - type: textarea id: logs attributes: label: Relevant log output diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index 58987bf0c..84ffca5d8 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -1,35 +1,30 @@ name: Feature request -about: Suggest a feature -title: "[Feature]:" +description: Suggest a feature labels: ["enhancement"] body: - -type: markdown - attributes: - value: | - Thanks for filling out this report to help us improve! - -type: input - id: Feature + - type: markdown + attributes: + value: | + Thanks for filling out this report to help us improve! + - type: textarea + id: feature attributes: label: Feature description - description: Describe the feature you'd like - placeholder: Feature description - validations: + description: Describe the feature you'd like. + validations: required: true - -type: input - id: Motivation + - type: textarea + id: motivation attributes: label: Motivation - description: Please enter the motivation for this feature i.e (problem, performance, etc) - -type: input - id: Possible Implementation + description: Please enter the motivation for this feature i.e (problem, performance, etc). + - type: textarea + id: possible-implementation attributes: label: Possible implementation - description: Please enter any possible implementation for this feature - -type: input - id: Additional context + description: Please enter any possible implementation for this feature. + - type: textarea + id: context attributes: label: Additional context - description: Add any additional context about the feature request. - placeholder: Additional context - - + description: Add any additional context about the feature request. \ No newline at end of file From 08e5bce8436da0f8cde18fce317ac3aee3e9ad39 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 24 Aug 2023 14:13:41 +0100 Subject: [PATCH 041/210] Updt. README.md w/ allcontributors, Updt. setup.py --- README.md | 164 ++++++++++++++++++++++++++++++++++-- assets/Temp_Logo.png | Bin 0 -> 9277 bytes examples/Initial_HMC_API.py | 53 ++++++++++++ setup.py | 19 +---- 4 files changed, 213 insertions(+), 23 deletions(-) create mode 100644 assets/Temp_Logo.png create mode 100644 examples/Initial_HMC_API.py diff --git a/README.md b/README.md index 20f03d5b7..93dc93fcd 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,170 @@ -# PyBOP - A *Py*thon package for *B*attery *O*ptimisation and *P*arameterisation - <div align="center"> -[![Build Status](https://github.com/pybop-team/PyBOP/actions/workflows/test_on_push.yaml/badge.svg?branch=develop)](https://github.com/pybop-team/PyBOP/actions/workflows/test_on_push.yaml) + <img src="assets/Temp_logo.png" alt="logo" width="200" height="auto" /> + <h1>Python Battery Optimisation and Parameterisation</h1> + + +<p> + <a href="https://github.com/pybop-team/PyBOP/actions/workflows/test_on_push.yaml"> + <img src="https://img.shields.io/github/actions/workflow/status/pybop-team/PyBOP/test_on_push.yaml?label=Build%20Status" alt="build" /> + </a> + <a href="https://github.com/pybop-team/PyBOP/graphs/contributors"> + <img src="https://img.shields.io/github/contributors/pybop-team/PyBOP" alt="contributors" /> + </a> + <a href=""> + <img src="https://img.shields.io/github/last-commit/pybop-team/PyBOP" alt="last update" /> + </a> + <a href="https://github.com/pybop-team/PyBOPe/network/members"> + <img src="https://img.shields.io/github/forks/pybop-team/PyBOP" alt="forks" /> + </a> + <a href="https://github.com/pybop-team/PyBOP/stargazers"> + <img src="https://img.shields.io/github/stars/pybop-team/PyBOP" alt="stars" /> + </a> + <a href="https://github.com/pybop-team/PyBOP/issues/"> + <img src="https://img.shields.io/github/issues/pybop-team/PyBOP" alt="open issues" /> + </a> + <a href="https://github.com/pybop-team/PyBOP/blob/develop/LICENSE"> + <img src="https://img.shields.io/github/license/pybop-team/PyBOP" alt="license" /> + </a> +</p> </div> -PyBOP aims to be a modular library for the parameterisation and optimisation of battery models, with a particular focus on classes built around [PyBaMM](https://github.com/pybamm-team/PyBaMM) models. The figure below gives the current conceptual idea of PyBOP's structure. This will likely evolve as development progresses. +<!-- Software Specification --> +## PyBOP +PyBOP provides a comprehensive suite of tools for parameterisation and optimisation of battery models. It aims to implement Bayesian and frequentist techniques with example workflows to guide the user. PyBOP can be applied to parameterise a wide range of battery models, including the electrochemical and equivalent circuit models available in PyBAMM. A major emphasis in PyBOP is understandable and actionable diagnostics for the user, while still providing extensibility for advanced probabilistic methods. By building on the state-of-the-art battery models and leveraging Python's accessibility, PyBOP enables agile and robust parameterisation and optimisation. + +The figure below gives PyBOP's current conceptual structure. The living software specification of PyBOP can be found [here](https://github.com/pybop-team/software-spec). This package is under active development, expect API evolution with releases. + <p align="center"> <img src="assets/PyBOP_Arch.svg" alt="Data flows from battery cycling machines to Galv Harvesters, then to the Galv server and REST API. Metadata can be updated and data read using the web client, and data can be downloaded by the Python client." width="600" /> </p> -The living software specification of PyBOP can be found [here](https://github.com/pybop-team/software-spec); however, an overview is introduced below. +<!-- Getting Started --> +## Getting Started + +<!-- Installation --> +### Installation + +Create a virtual environment, i.e with [pyenv](https://github.com/pyenv/pyenv#installation) and [pyenv-virtualenv](https://github.com/pyenv/pyenv-virtualenv#installation): + +```bash +pyenv virtualenv pybop-env +pyenv activate pybop-env +``` + +Install PyBOP: + +```bash + pip install git+https://github.com/pybop-team/PyBOP +``` + +<!-- Installation --> +### Usage +The example below shows a simple fitting routine that starts by generating synthetic data from a single particle model with modified parameter values. An RMSE cost function using the terminal voltage as the optimised signal is completed to determine the unknown parameter values. + +```python +import pybop +import pybamm +import pandas as pd +import numpy as np + +def getdata(x0): + model = pybamm.lithium_ion.SPM() + params = model.default_parameter_values + + params.update( + { + "Negative electrode active material volume fraction": x0[0], + "Positive electrode active material volume fraction": x0[1], + } + ) + experiment = pybamm.Experiment( + [ + ( + "Discharge at 2C for 5 minutes (1 second period)", + "Rest for 2 minutes (1 second period)", + "Charge at 1C for 5 minutes (1 second period)", + "Rest for 2 minutes (1 second period)", + ), + ] + * 2 + ) + sim = pybamm.Simulation(model, experiment=experiment, parameter_values=params) + return sim.solve() + + +# Form observations +x0 = np.array([0.55, 0.63]) +solution = getdata(x0) + +observations = [ + pybop.Observed("Time [s]", solution["Time [s]"].data), + pybop.Observed("Current function [A]", solution["Current [A]"].data), + pybop.Observed("Voltage [V]", solution["Terminal voltage [V]"].data), +] + +# Define model +model = pybop.models.lithium_ion.SPM() +model.parameter_set = model.pybamm_model.default_parameter_values + +# Fitting parameters +params = [ + pybop.Parameter( + "Negative electrode active material volume fraction", + prior=pybop.Gaussian(0.5, 0.05), + bounds=[0.35, 0.75], + ), + pybop.Parameter( + "Positive electrode active material volume fraction", + prior=pybop.Gaussian(0.65, 0.05), + bounds=[0.45, 0.85], + ), +] + +parameterisation = pybop.Parameterisation( + model, observations=observations, fit_parameters=params +) + +# get RMSE estimate using NLOpt +results, last_optim, num_evals = parameterisation.rmse( + signal="Voltage [V]", method="nlopt" # results = [0.54452026, 0.63064801] +) +``` + +<!-- Code of Conduct --> +### Code of Conduct + +PyBOP aims to foster a broad consortium of developers and users, building on and +learning from the success of the PyBaMM community. Our values are: + +- Open-source (code and ideas should be shared) + +- Inclusivity and fairness (those who want to contribute may do so, and their input is appropriately recognised) + +- Inter-operability (aiming for modularity to enable maximum impact and inclusivity) + +- User-friendliness (putting user requirements first, thinking about user-assistance & workflows) + + +<!-- Contributing --> +## Contributing +Thanks to all of our contributing members! [[emoji key](https://allcontributors.org/docs/en/emoji-key)] + +<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --> +<!-- prettier-ignore-start --> +<!-- markdownlint-disable --> + +<!-- markdownlint-restore --> +<!-- prettier-ignore-end --> + +<!-- ALL-CONTRIBUTORS-LIST:END --> + +Contributions are always welcome! See `contributing.md` for ways to get started. + + -- Provide design optimisation plus both frequentist and Bayesian parameterisation methods to battery modellers -- Provide workflows and examples for parameter fitting and grouping -- Create diagnostics for end-users to understand parameter identifiability and optimisation fidelity **Community and values** diff --git a/assets/Temp_Logo.png b/assets/Temp_Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..fa64dab9d5f24bdb17b90bd7a2aa4c25f7747eeb GIT binary patch literal 9277 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 literal 0 HcmV?d00001 diff --git a/examples/Initial_HMC_API.py b/examples/Initial_HMC_API.py new file mode 100644 index 000000000..42ce387ba --- /dev/null +++ b/examples/Initial_HMC_API.py @@ -0,0 +1,53 @@ +import pybop +import pandas as pd +import numpy as np + +import numpyro +import numpyro.infer as infer + +# Form observations +Measurements = pd.read_csv("examples/Chen_example.csv", comment="#").to_numpy() +observations = [ + pybop.Observed("Time [s]", Measurements[:, 0]), + pybop.Observed("Current function [A]", Measurements[:, 1]), + pybop.Observed("Voltage [V]", Measurements[:, 2]), +] + +# Define model +parameter_set = pybop.ParameterSet("pybamm", "Chen2020") +model = pybop.models.lithium_ion.SPM(parameter_set=parameter_set) + +# Fitting parameters +params = [ + pybop.Parameter( + "Negative electrode active material volume fraction", + prior=pybop.Gaussian(0.75, 0.05), + bounds=[0.65, 0.85], + ), + pybop.Parameter( + "Positive electrode active material volume fraction", + prior=pybop.Gaussian(0.65, 0.05), + bounds=[0.55, 0.75], + ), +] + +parameterisation = pybop.Parameterisation( + model, observations=observations, fit_parameters=params +) + +# get RMSE estimate using NLOpt +results, last_optim, num_evals = parameterisation.rmse( + signal="Voltage [V]", method="nlopt" +) + +# get MAP estimate, starting at a random initial point in parameter space +# parameterisation.map(x0=[p.sample() for p in params]) + +# or sample from posterior +# parameterisation.sample(1000, n_chains=4, ....) + +# or SOBER +# parameterisation.sober() + + +# Optimisation = pybop.optimisation(model, cost=cost, parameters=parameters, observation=observation) diff --git a/setup.py b/setup.py index a9a328598..d08697bff 100644 --- a/setup.py +++ b/setup.py @@ -11,34 +11,23 @@ long_description = '' setup( - # Name of the package - name='PyBOP', - # Packages to include into the distribution + name='pybop', packages=find_packages('.'), - # Start with a small number and increase it with - # every change you make https://semver.org version='0.0.1', - # Chose a license from here: https: // - # help.github.com / articles / licensing - a - - # repository. For example: MIT - license='MIT', - # Short description of your library + license='BSD-3-Clause', description='Python Battery Optimisation and Parameterisation', - # Long description of your library long_description=long_description, long_description_content_type='text/markdown', - # Either the link to your github or to your website url='https://github.com/pybop-team/PyBOP', - # List of packages to install with this one + install_requires=[ "pybamm>=23.1", "numpy>=1.16", "scipy>=1.3", "pandas>=1.0", - "casadi>=3.6", "nlopt>=2.6", ], # https://pypi.org/classifiers/ classifiers=[], - python_requires=">=3.8,<3.12", + python_requires=">=3.8,<=3.12", ) From 3950511c99cab99af1c2aca0de29834f20c3f9f9 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 24 Aug 2023 14:16:54 +0100 Subject: [PATCH 042/210] Fix links --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 93dc93fcd..e6e479457 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ <div align="center"> - <img src="assets/Temp_logo.png" alt="logo" width="200" height="auto" /> + <img src="assets/Temp_Logo.png" alt="logo" width="200" height="auto" /> <h1>Python Battery Optimisation and Parameterisation</h1> From 8b08694aa5e9fb7f8c7259715c002ca6b3d5f851 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 24 Aug 2023 14:17:36 +0100 Subject: [PATCH 043/210] Updt. logo size --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e6e479457..4f268fa6a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ <div align="center"> - <img src="assets/Temp_Logo.png" alt="logo" width="200" height="auto" /> + <img src="assets/Temp_Logo.png" alt="logo" width="400" height="auto" /> <h1>Python Battery Optimisation and Parameterisation</h1> From 13090a3b2c43c3caaeaefe69fd87118cbfdcf608 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 24 Aug 2023 14:19:30 +0100 Subject: [PATCH 044/210] Logo crop --- assets/Temp_Logo.png | Bin 9277 -> 9532 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/Temp_Logo.png b/assets/Temp_Logo.png index fa64dab9d5f24bdb17b90bd7a2aa4c25f7747eeb..4ef2853b345d37284b8e3272c312b5a7d091b6f2 100644 GIT binary patch literal 9532 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 literal 9277 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 From da9e4254b532e99b63f0d647201a677584254f08 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 24 Aug 2023 14:20:51 +0100 Subject: [PATCH 045/210] Remove duplicates --- README.md | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/README.md b/README.md index 4f268fa6a..917d83305 100644 --- a/README.md +++ b/README.md @@ -162,21 +162,3 @@ Thanks to all of our contributing members! [[emoji key](https://allcontributors. <!-- ALL-CONTRIBUTORS-LIST:END --> Contributions are always welcome! See `contributing.md` for ways to get started. - - - - -**Community and values** - -PyBOP aims to foster a broad consortium of developers and users, building on and -learning from the success of the PyBaMM community. Our values are: - -- Open-source (code and ideas should be shared) - -- Inclusivity and fairness (those who want to contribute may do so, - and their input is appropriately recognised) - -- Inter-operability (aiming for modularity to enable maximum impact - and inclusivity) - -- User-friendliness (putting user requirements first, thinking about user- assistance & workflows) From de800cd3fc32eb9bb14ece48fe393cf5c049c293 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 24 Aug 2023 14:22:25 +0100 Subject: [PATCH 046/210] Updt heading structure --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 917d83305..a0d8a51cb 100644 --- a/README.md +++ b/README.md @@ -134,7 +134,7 @@ results, last_optim, num_evals = parameterisation.rmse( ``` <!-- Code of Conduct --> -### Code of Conduct +## Code of Conduct PyBOP aims to foster a broad consortium of developers and users, building on and learning from the success of the PyBaMM community. Our values are: From 01ef49d9b8e7edc63184d1e42a69a01a812d74c7 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 24 Aug 2023 14:29:04 +0100 Subject: [PATCH 047/210] Upd. commit badge link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a0d8a51cb..f0001ff18 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ <img src="https://img.shields.io/github/contributors/pybop-team/PyBOP" alt="contributors" /> </a> <a href=""> - <img src="https://img.shields.io/github/last-commit/pybop-team/PyBOP" alt="last update" /> + <img src="https://img.shields.io/github/last-commit/pybop-team/PyBOP/develop" alt="last update" /> </a> <a href="https://github.com/pybop-team/PyBOPe/network/members"> <img src="https://img.shields.io/github/forks/pybop-team/PyBOP" alt="forks" /> From 664d6f3f5afdba7243f55d865be81ea0eace69db Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 24 Aug 2023 14:41:44 +0100 Subject: [PATCH 048/210] Remove HMC example --- examples/Initial_HMC_API.py | 53 ------------------------------------- 1 file changed, 53 deletions(-) delete mode 100644 examples/Initial_HMC_API.py diff --git a/examples/Initial_HMC_API.py b/examples/Initial_HMC_API.py deleted file mode 100644 index 42ce387ba..000000000 --- a/examples/Initial_HMC_API.py +++ /dev/null @@ -1,53 +0,0 @@ -import pybop -import pandas as pd -import numpy as np - -import numpyro -import numpyro.infer as infer - -# Form observations -Measurements = pd.read_csv("examples/Chen_example.csv", comment="#").to_numpy() -observations = [ - pybop.Observed("Time [s]", Measurements[:, 0]), - pybop.Observed("Current function [A]", Measurements[:, 1]), - pybop.Observed("Voltage [V]", Measurements[:, 2]), -] - -# Define model -parameter_set = pybop.ParameterSet("pybamm", "Chen2020") -model = pybop.models.lithium_ion.SPM(parameter_set=parameter_set) - -# Fitting parameters -params = [ - pybop.Parameter( - "Negative electrode active material volume fraction", - prior=pybop.Gaussian(0.75, 0.05), - bounds=[0.65, 0.85], - ), - pybop.Parameter( - "Positive electrode active material volume fraction", - prior=pybop.Gaussian(0.65, 0.05), - bounds=[0.55, 0.75], - ), -] - -parameterisation = pybop.Parameterisation( - model, observations=observations, fit_parameters=params -) - -# get RMSE estimate using NLOpt -results, last_optim, num_evals = parameterisation.rmse( - signal="Voltage [V]", method="nlopt" -) - -# get MAP estimate, starting at a random initial point in parameter space -# parameterisation.map(x0=[p.sample() for p in params]) - -# or sample from posterior -# parameterisation.sample(1000, n_chains=4, ....) - -# or SOBER -# parameterisation.sober() - - -# Optimisation = pybop.optimisation(model, cost=cost, parameters=parameters, observation=observation) From ae61f09a3a434bf91748777821c35ab053c52d0b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 24 Aug 2023 14:51:24 +0000 Subject: [PATCH 049/210] docs: update README.md [skip ci] --- README.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/README.md b/README.md index f0001ff18..880c03669 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,7 @@ <div align="center"> +<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section --> +[![All Contributors](https://img.shields.io/badge/all_contributors-1-orange.svg?style=flat-square)](#contributors-) +<!-- ALL-CONTRIBUTORS-BADGE:END --> <img src="assets/Temp_Logo.png" alt="logo" width="400" height="auto" /> <h1>Python Battery Optimisation and Parameterisation</h1> @@ -155,6 +158,13 @@ Thanks to all of our contributing members! [[emoji key](https://allcontributors. <!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --> <!-- prettier-ignore-start --> <!-- markdownlint-disable --> +<table> + <tbody> + <tr> + <td align="center" valign="top" width="14.28%"><a href="http://bradyplanden.github.io"><img src="https://avatars.githubusercontent.com/u/55357039?v=4?s=100" width="100px;" alt="Brady Planden"/><br /><sub><b>Brady Planden</b></sub></a><br /><a href="#infra-BradyPlanden" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/pybop-team/PyBOP/commits?author=BradyPlanden" title="Tests">⚠️</a> <a href="https://github.com/pybop-team/PyBOP/commits?author=BradyPlanden" title="Code">💻</a> <a href="#example-BradyPlanden" title="Examples">💡</a></td> + </tr> + </tbody> +</table> <!-- markdownlint-restore --> <!-- prettier-ignore-end --> @@ -162,3 +172,16 @@ Thanks to all of our contributing members! [[emoji key](https://allcontributors. <!-- ALL-CONTRIBUTORS-LIST:END --> Contributions are always welcome! See `contributing.md` for ways to get started. + +## Contributors ✨ + +Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): + +<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --> +<!-- prettier-ignore-start --> +<!-- markdownlint-disable --> +<!-- markdownlint-restore --> +<!-- prettier-ignore-end --> +<!-- ALL-CONTRIBUTORS-LIST:END --> + +This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! \ No newline at end of file From 8071ed67216675e6ccdc00089af40c417eb4ce11 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 24 Aug 2023 14:51:25 +0000 Subject: [PATCH 050/210] docs: create .all-contributorsrc [skip ci] --- .all-contributorsrc | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 .all-contributorsrc diff --git a/.all-contributorsrc b/.all-contributorsrc new file mode 100644 index 000000000..730848a57 --- /dev/null +++ b/.all-contributorsrc @@ -0,0 +1,29 @@ +{ + "files": [ + "README.md" + ], + "imageSize": 100, + "commit": false, + "commitType": "docs", + "commitConvention": "angular", + "contributors": [ + { + "login": "BradyPlanden", + "name": "Brady Planden", + "avatar_url": "https://avatars.githubusercontent.com/u/55357039?v=4", + "profile": "http://bradyplanden.github.io", + "contributions": [ + "infra", + "test", + "code", + "example" + ] + } + ], + "contributorsPerLine": 7, + "skipCi": true, + "repoType": "github", + "repoHost": "https://github.com", + "projectName": "PyBOP", + "projectOwner": "pybop-team" +} From e111c94c90de34e3c5dcc98f0f72f8ea8a6e5c81 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 24 Aug 2023 16:03:40 +0100 Subject: [PATCH 051/210] Move all-contributors badge --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 880c03669..d57bb939d 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,4 @@ <div align="center"> -<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section --> -[![All Contributors](https://img.shields.io/badge/all_contributors-1-orange.svg?style=flat-square)](#contributors-) -<!-- ALL-CONTRIBUTORS-BADGE:END --> <img src="assets/Temp_Logo.png" alt="logo" width="400" height="auto" /> <h1>Python Battery Optimisation and Parameterisation</h1> @@ -31,6 +28,10 @@ </a> </p> +<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section --> +[![All Contributors](https://img.shields.io/badge/all_contributors-1-orange.svg?style=flat-square)](#contributors-) +<!-- ALL-CONTRIBUTORS-BADGE:END --> + </div> <!-- Software Specification --> From 326740316d3eafea59c3cc2fa9d23868ea0f7d48 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 8 Sep 2023 08:23:11 -0700 Subject: [PATCH 052/210] Updt. README example + grammar --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d57bb939d..98af3efa9 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ Install PyBOP: <!-- Installation --> ### Usage -The example below shows a simple fitting routine that starts by generating synthetic data from a single particle model with modified parameter values. An RMSE cost function using the terminal voltage as the optimised signal is completed to determine the unknown parameter values. +The example below shows a simple fitting routine that starts by generating synthetic data from a single particle model with modified parameter values. An RMSE cost function using the terminal voltage as the optimised signal is completed to determine the unknown parameter values. First, the synthetic data is generated: ```python import pybop @@ -102,7 +102,9 @@ def getdata(x0): # Form observations x0 = np.array([0.55, 0.63]) solution = getdata(x0) - +``` +Next, the observed variables are defined, with the model construction and parameter definitions following. Finally, the parameterisation class is constructed and parameter fitting is completed. +```python observations = [ pybop.Observed("Time [s]", solution["Time [s]"].data), pybop.Observed("Current function [A]", solution["Current [A]"].data), @@ -185,4 +187,4 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d <!-- prettier-ignore-end --> <!-- ALL-CONTRIBUTORS-LIST:END --> -This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! \ No newline at end of file +This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specifications. Contributions of any kind are welcome! \ No newline at end of file From 1dbd91c131b120f637981b7ecb0452e3118aefd8 Mon Sep 17 00:00:00 2001 From: NicolaCourtier <45851982+NicolaCourtier@users.noreply.github.com> Date: Sun, 10 Sep 2023 12:59:03 +0100 Subject: [PATCH 053/210] Add init py files --- pybop/optimisation/__init__.py | 0 pybop/plotting/__init__.py | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 pybop/optimisation/__init__.py create mode 100644 pybop/plotting/__init__.py diff --git a/pybop/optimisation/__init__.py b/pybop/optimisation/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/pybop/plotting/__init__.py b/pybop/plotting/__init__.py new file mode 100644 index 000000000..e69de29bb From 936e6a5a96661cc243db9e1a3e73c7cde3a31dfd Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 12 Sep 2023 08:56:31 +0000 Subject: [PATCH 054/210] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 98af3efa9..991321bb7 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ </p> <!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section --> -[![All Contributors](https://img.shields.io/badge/all_contributors-1-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-2-orange.svg?style=flat-square)](#contributors-) <!-- ALL-CONTRIBUTORS-BADGE:END --> </div> @@ -165,6 +165,7 @@ Thanks to all of our contributing members! [[emoji key](https://allcontributors. <tbody> <tr> <td align="center" valign="top" width="14.28%"><a href="http://bradyplanden.github.io"><img src="https://avatars.githubusercontent.com/u/55357039?v=4?s=100" width="100px;" alt="Brady Planden"/><br /><sub><b>Brady Planden</b></sub></a><br /><a href="#infra-BradyPlanden" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/pybop-team/PyBOP/commits?author=BradyPlanden" title="Tests">⚠️</a> <a href="https://github.com/pybop-team/PyBOP/commits?author=BradyPlanden" title="Code">💻</a> <a href="#example-BradyPlanden" title="Examples">💡</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/NicolaCourtier"><img src="https://avatars.githubusercontent.com/u/45851982?v=4?s=100" width="100px;" alt="NicolaCourtier"/><br /><sub><b>NicolaCourtier</b></sub></a><br /><a href="https://github.com/pybop-team/PyBOP/commits?author=NicolaCourtier" title="Code">💻</a></td> </tr> </tbody> </table> From 9de2ac80cdd27cc700424e920d2f9053186418e4 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 12 Sep 2023 08:56:32 +0000 Subject: [PATCH 055/210] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 730848a57..3392afcc5 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -18,6 +18,15 @@ "code", "example" ] + }, + { + "login": "NicolaCourtier", + "name": "NicolaCourtier", + "avatar_url": "https://avatars.githubusercontent.com/u/45851982?v=4", + "profile": "https://github.com/NicolaCourtier", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, From aedd14a3f59897e5b87627e671a1213835f8fbae Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 12 Sep 2023 08:59:28 +0000 Subject: [PATCH 056/210] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 991321bb7..594906ce1 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ </p> <!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section --> -[![All Contributors](https://img.shields.io/badge/all_contributors-2-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-3-orange.svg?style=flat-square)](#contributors-) <!-- ALL-CONTRIBUTORS-BADGE:END --> </div> @@ -166,6 +166,7 @@ Thanks to all of our contributing members! [[emoji key](https://allcontributors. <tr> <td align="center" valign="top" width="14.28%"><a href="http://bradyplanden.github.io"><img src="https://avatars.githubusercontent.com/u/55357039?v=4?s=100" width="100px;" alt="Brady Planden"/><br /><sub><b>Brady Planden</b></sub></a><br /><a href="#infra-BradyPlanden" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/pybop-team/PyBOP/commits?author=BradyPlanden" title="Tests">⚠️</a> <a href="https://github.com/pybop-team/PyBOP/commits?author=BradyPlanden" title="Code">💻</a> <a href="#example-BradyPlanden" title="Examples">💡</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/NicolaCourtier"><img src="https://avatars.githubusercontent.com/u/45851982?v=4?s=100" width="100px;" alt="NicolaCourtier"/><br /><sub><b>NicolaCourtier</b></sub></a><br /><a href="https://github.com/pybop-team/PyBOP/commits?author=NicolaCourtier" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="http://howey.eng.ox.ac.uk"><img src="https://avatars.githubusercontent.com/u/2247552?v=4?s=100" width="100px;" alt="David Howey"/><br /><sub><b>David Howey</b></sub></a><br /><a href="#ideas-davidhowey" title="Ideas, Planning, & Feedback">🤔</a> <a href="#mentoring-davidhowey" title="Mentoring">🧑🏫</a></td> </tr> </tbody> </table> From a38c67be780093d3431c24754eb632cb8ae4dc45 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 12 Sep 2023 08:59:29 +0000 Subject: [PATCH 057/210] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 3392afcc5..faad9c994 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -27,6 +27,16 @@ "contributions": [ "code" ] + }, + { + "login": "davidhowey", + "name": "David Howey", + "avatar_url": "https://avatars.githubusercontent.com/u/2247552?v=4", + "profile": "http://howey.eng.ox.ac.uk", + "contributions": [ + "ideas", + "mentoring" + ] } ], "contributorsPerLine": 7, From fd6d52fd7603f1bd72a3e06812f20f16276fe5fa Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 12 Sep 2023 09:04:19 +0000 Subject: [PATCH 058/210] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 594906ce1..fa1d36186 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ </p> <!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section --> -[![All Contributors](https://img.shields.io/badge/all_contributors-3-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-4-orange.svg?style=flat-square)](#contributors-) <!-- ALL-CONTRIBUTORS-BADGE:END --> </div> @@ -167,6 +167,7 @@ Thanks to all of our contributing members! [[emoji key](https://allcontributors. <td align="center" valign="top" width="14.28%"><a href="http://bradyplanden.github.io"><img src="https://avatars.githubusercontent.com/u/55357039?v=4?s=100" width="100px;" alt="Brady Planden"/><br /><sub><b>Brady Planden</b></sub></a><br /><a href="#infra-BradyPlanden" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/pybop-team/PyBOP/commits?author=BradyPlanden" title="Tests">⚠️</a> <a href="https://github.com/pybop-team/PyBOP/commits?author=BradyPlanden" title="Code">💻</a> <a href="#example-BradyPlanden" title="Examples">💡</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/NicolaCourtier"><img src="https://avatars.githubusercontent.com/u/45851982?v=4?s=100" width="100px;" alt="NicolaCourtier"/><br /><sub><b>NicolaCourtier</b></sub></a><br /><a href="https://github.com/pybop-team/PyBOP/commits?author=NicolaCourtier" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="http://howey.eng.ox.ac.uk"><img src="https://avatars.githubusercontent.com/u/2247552?v=4?s=100" width="100px;" alt="David Howey"/><br /><sub><b>David Howey</b></sub></a><br /><a href="#ideas-davidhowey" title="Ideas, Planning, & Feedback">🤔</a> <a href="#mentoring-davidhowey" title="Mentoring">🧑🏫</a></td> + <td align="center" valign="top" width="14.28%"><a href="http://www.rse.ox.ac.uk"><img src="https://avatars.githubusercontent.com/u/1148404?v=4?s=100" width="100px;" alt="Martin Robinson"/><br /><sub><b>Martin Robinson</b></sub></a><br /><a href="#ideas-martinjrobins" title="Ideas, Planning, & Feedback">🤔</a> <a href="#mentoring-martinjrobins" title="Mentoring">🧑🏫</a></td> </tr> </tbody> </table> From 6074e973a100e4ba4bcfa1157efc37f7d76f7524 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 12 Sep 2023 09:04:20 +0000 Subject: [PATCH 059/210] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index faad9c994..920bf1dde 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -37,6 +37,16 @@ "ideas", "mentoring" ] + }, + { + "login": "martinjrobins", + "name": "Martin Robinson", + "avatar_url": "https://avatars.githubusercontent.com/u/1148404?v=4", + "profile": "http://www.rse.ox.ac.uk", + "contributions": [ + "ideas", + "mentoring" + ] } ], "contributorsPerLine": 7, From 01956aabbc0b019d5b15474bcb341fa488ecf81b Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Wed, 13 Sep 2023 12:53:29 +0100 Subject: [PATCH 060/210] __init__.py bugfix for #28 --- pybop/__init__.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pybop/__init__.py b/pybop/__init__.py index 7aeec0553..86a62d733 100644 --- a/pybop/__init__.py +++ b/pybop/__init__.py @@ -56,9 +56,7 @@ # # Optimisation class # -from .optimisation.base_optimisation import BaseOptimisation -from .optimisation.nlopt_opt import NLoptOptimize -from .optimisation.scipy_opt import ScipyMinimize +from .optimisation import * # # Remove any imported modules, so we don't expose them as part of pybop From 0530d11844df5ceb6aea511d7986465b495b5cc7 Mon Sep 17 00:00:00 2001 From: NicolaCourtier <45851982+NicolaCourtier@users.noreply.github.com> Date: Thu, 14 Sep 2023 12:27:36 +0100 Subject: [PATCH 061/210] Add links to PyBaMM --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index fa1d36186..0219931a5 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ <!-- Software Specification --> ## PyBOP -PyBOP provides a comprehensive suite of tools for parameterisation and optimisation of battery models. It aims to implement Bayesian and frequentist techniques with example workflows to guide the user. PyBOP can be applied to parameterise a wide range of battery models, including the electrochemical and equivalent circuit models available in PyBAMM. A major emphasis in PyBOP is understandable and actionable diagnostics for the user, while still providing extensibility for advanced probabilistic methods. By building on the state-of-the-art battery models and leveraging Python's accessibility, PyBOP enables agile and robust parameterisation and optimisation. +PyBOP provides a comprehensive suite of tools for parameterisation and optimisation of battery models. It aims to implement Bayesian and frequentist techniques with example workflows to guide the user. PyBOP can be applied to parameterise a wide range of battery models, including the electrochemical and equivalent circuit models available in [PyBaMM](https://pybamm.org/). A major emphasis in PyBOP is understandable and actionable diagnostics for the user, while still providing extensibility for advanced probabilistic methods. By building on the state-of-the-art battery models and leveraging Python's accessibility, PyBOP enables agile and robust parameterisation and optimisation. The figure below gives PyBOP's current conceptual structure. The living software specification of PyBOP can be found [here](https://github.com/pybop-team/software-spec). This package is under active development, expect API evolution with releases. @@ -143,7 +143,7 @@ results, last_optim, num_evals = parameterisation.rmse( ## Code of Conduct PyBOP aims to foster a broad consortium of developers and users, building on and -learning from the success of the PyBaMM community. Our values are: +learning from the success of the [PyBaMM](https://pybamm.org/) community. Our values are: - Open-source (code and ideas should be shared) From 6d20181d24c571a759251738eb33466cf58862ae Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 14 Sep 2023 12:31:16 +0100 Subject: [PATCH 062/210] Alignment for #28, fix build error --- pybop/__init__.py | 4 +++- .../{base_optimisation.py => BaseOptimisation.py} | 2 +- pybop/optimisation/{nlopt_opt.py => NLoptOptimize.py} | 3 ++- pybop/optimisation/{scipy_opt.py => SciPyMinimize.py} | 3 ++- 4 files changed, 8 insertions(+), 4 deletions(-) rename pybop/optimisation/{base_optimisation.py => BaseOptimisation.py} (95%) rename pybop/optimisation/{nlopt_opt.py => NLoptOptimize.py} (92%) rename pybop/optimisation/{scipy_opt.py => SciPyMinimize.py} (93%) diff --git a/pybop/__init__.py b/pybop/__init__.py index 86a62d733..ad678ba42 100644 --- a/pybop/__init__.py +++ b/pybop/__init__.py @@ -56,7 +56,9 @@ # # Optimisation class # -from .optimisation import * +from .optimisation import BaseOptimisation +from .optimisation.NLoptOptimize import NLoptOptimize +from .optimisation.SciPyMinimize import SciPyMinimize # # Remove any imported modules, so we don't expose them as part of pybop diff --git a/pybop/optimisation/base_optimisation.py b/pybop/optimisation/BaseOptimisation.py similarity index 95% rename from pybop/optimisation/base_optimisation.py rename to pybop/optimisation/BaseOptimisation.py index a60f9fe72..14364a787 100644 --- a/pybop/optimisation/base_optimisation.py +++ b/pybop/optimisation/BaseOptimisation.py @@ -1,7 +1,7 @@ import pybop -class BaseOptimisation(object): +class BaseOptimisation: """ Base class for the optimisation methods. diff --git a/pybop/optimisation/nlopt_opt.py b/pybop/optimisation/NLoptOptimize.py similarity index 92% rename from pybop/optimisation/nlopt_opt.py rename to pybop/optimisation/NLoptOptimize.py index d50763882..6d0f5ba87 100644 --- a/pybop/optimisation/nlopt_opt.py +++ b/pybop/optimisation/NLoptOptimize.py @@ -1,8 +1,9 @@ import pybop import nlopt +from .BaseOptimisation import BaseOptimisation -class NLoptOptimize(pybop.BaseOptimisation): +class NLoptOptimize(BaseOptimisation): """ Wrapper class for the NLOpt optimisation class. Extends the BaseOptimisation class. """ diff --git a/pybop/optimisation/scipy_opt.py b/pybop/optimisation/SciPyMinimize.py similarity index 93% rename from pybop/optimisation/scipy_opt.py rename to pybop/optimisation/SciPyMinimize.py index 3586f43fb..ee4c57067 100644 --- a/pybop/optimisation/scipy_opt.py +++ b/pybop/optimisation/SciPyMinimize.py @@ -1,8 +1,9 @@ import pybop from scipy.optimize import minimize +from .BaseOptimisation import BaseOptimisation -class ScipyMinimize(pybop.BaseOptimisation): +class SciPyMinimize(BaseOptimisation): """ Wrapper class for the Scipy optimisation class. Extends the BaseOptimisation class. """ From 5345a62b1d1a02b89ca116c99f6df3c408738070 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 14 Sep 2023 16:55:48 +0100 Subject: [PATCH 063/210] Adding CONTRIBUTING.md --- CONTRIBUTING.md | 287 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 287 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..d1f8bc013 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,287 @@ +# Contributing to PyBOP + +If you'd like to contribute to PyBOP, please have a look at the [pre-commit](#pre-commit-checks) and the [workflow](#workflow) guidelines below. + +## Pre-commit checks + +Before you commit any code, please perform the following checks: + +- [All tests pass](#testing): `$ nox` + + +## Workflow + +We use [GIT](https://en.wikipedia.org/wiki/Git) and [GitHub](https://en.wikipedia.org/wiki/GitHub) to coordinate our work. When making any kind of update, we try to follow the procedure below. + +### A. Before you begin + +1. Create an [issue](https://guides.github.com/features/issues/) where new proposals can be discussed before any coding is done. +2. Create a [branch](https://help.github.com/articles/creating-and-deleting-branches-within-your-repository/) of this repo (ideally on your own [fork](https://help.github.com/articles/fork-a-repo/)), where all changes will be made +3. Download the source code onto your local system, by [cloning](https://help.github.com/articles/cloning-a-repository/) the repository (or your fork of the repository). +4. [Install](Developer-Install) PyBOP with the developer options. +5. [Test](#testing) if your installation worked, using the test script: `$ python run-tests.py --unit`. + +You now have everything you need to start making changes! + +### B. Writing your code + +6. PyBOP is developed in [Python](https://en.wikipedia.org/wiki/Python_(programming_language)), and makes heavy use of [NumPy](https://en.wikipedia.org/wiki/NumPy) (see also [NumPy for MatLab users](https://numpy.org/doc/stable/user/numpy-for-matlab-users.html) and [Python for R users](http://blog.hackerearth.com/how-can-r-users-learn-python-for-data-science)). +7. Make sure to follow our [coding style guidelines](#coding-style-guidelines). +8. Commit your changes to your branch with [useful, descriptive commit messages](https://chris.beams.io/posts/git-commit/): Remember these are publicly visible and should still make sense a few months ahead in time. While developing, you can keep using the GitHub issue you're working on as a place for discussion. [Refer to your commits](https://stackoverflow.com/questions/8910271/how-can-i-reference-a-commit-in-an-issue-comment-on-github) when discussing specific lines of code. +9. If you want to add a dependency on another library, or re-use code you found somewhere else, have a look at [these guidelines](#dependencies-and-reusing-code). + +### C. Merging your changes with PyBOP + +10. [Test your code!](#testing) +12. If you added a major new feature, perhaps it should be showcased in an [example notebook](#example-notebooks). +13. If you've added new functionality, please add additional tests to ensure ample code coverage in PyBOP. +13. When you feel your code is finished, or at least warrants serious discussion, create a [pull request](https://help.github.com/articles/about-pull-requests/) (PR) on [PyBOP's GitHub page](https://github.com/pybop-team/PyBOP). +14. Once a PR has been created, it will be reviewed by any member of the community. Changes might be suggested which you can make by simply adding new commits to the branch. When everything's finished, someone with the right GitHub permissions will merge your changes into PyBOP main repository. + +Finally, if you really, really, _really_ love developing PyBOP, have a look at the current [project infrastructure](#infrastructure). + +## Coding style guidelines + +PyBOP follows the [PEP8 recommendations](https://www.python.org/dev/peps/pep-0008/) for coding style. These are very common guidelines, and community tools have been developed to check how well projects implement them. + +### Ruff + +We use [ruff](https://github.com/charliermarsh/ruff) to check our PEP8 adherence. To try this on your system, navigate to the PyBOP directory in a console and type + +```bash +python -m pip install pre-commit +pre-commit run ruff +``` + +ruff is configured inside the file `pre-commit-config.yaml`, allowing us to ignore some errors. If you think this should be added or removed, please submit an [issue](#issues) + +When you commit your changes they will be checked against ruff automatically (see [Pre-commit checks](#pre-commit-checks)). + +### Naming + +Naming is hard. In general, we aim for descriptive class, method, and argument names. Avoid abbreviations when possible without making names overly long, so `mean` is better than `mu`, but a class name like `MyClass` is fine. + +Class names are CamelCase, and start with an upper case letter, for example `MyOtherClass`. Method and variable names are lower-case, and use underscores for word separation, for example, `x` or `iteration_count`. + +## Dependencies and reusing code + +While it's a bad idea for developers to "reinvent the wheel", it's important for users to get a _reasonably sized download and an easy install_. In addition, external libraries can sometimes cease to be supported, and when they contain bugs it might take a while before fixes become available as automatic downloads to PyBOP users. +For these reasons, all dependencies in PyBOP should be thought about carefully and discussed on GitHub. + +Direct inclusion of code from other packages is possible, as long as their license permits it and is compatible with ours, but again should be considered carefully and discussed in the group. Snippets from blogs and [stackoverflow](https://stackoverflow.com/) can often be included without attribution, but if they solve a particularly nasty problem (or are very hard to read) it's often a good idea to attribute (and document) them, by commenting with a link in the source code. + +### Separating dependencies + +On the other hand... We _do_ want to compare several tools, to generate documentation, and speed up development. For this reason, the dependency structure is split into 4 parts: + +1. Core PyBOP: A minimal set, including things like NumPy, SciPy, etc. All infrastructure should run against this set of dependencies, as well as any numerical methods we implement ourselves. +2. Extras: Other inference packages and their dependencies. Methods we don't want to implement ourselves, but do want to provide an interface to can have their dependencies added here. +3. Documentation generating code: Everything you need to generate and work on the docs. +4. Development code: Everything you need to do PyBOP development (so all of the above packages, plus ruff and other testing tools). + +Only 'core pybop' is installed by default. The others have to be specified explicitly when running the installation command. + +### Matplotlib + +We use Matplotlib in PyBOP, but with two caveats: + +First, Matplotlib should only be used in plotting methods, and these should _never_ be called by other PyBOP methods. So users who don't like Matplotlib will not be forced to use it in any way. Use in notebooks is OK and encouraged. + +Second, Matplotlib should never be imported at the module level, but always inside methods. For example: + +``` +def plot_great_things(self, x, y, z): + import matplotlib.pyplot as pl + ... +``` + +This allows people to (1) use PyBOP without ever importing Matplotlib and (2) configure Matplotlib's back-end in their scripts, which _must_ be done before e.g. `pyplot` is first imported. + +## Testing + +All code requires testing. We use the [pytest](https://docs.pytest.org/en/) package for our tests. (These tests typically just check that the code runs without error, and so, are more _debugging_ than _testing_ in a strict sense. Nevertheless, they are very useful to have!) + +If you have nox installed, to run unit tests, type + +```bash +nox +``` + +else, type + +```bash +python run-tests.py +``` + +### Writing tests + +Every new feature should have its own test. To create ones, have a look at the `test` directory and see if there's a test for a similar method. Copy-pasting is a good way to start. + +Next, add some simple (and speedy!) tests of your main features. If these run without exceptions that's a good start! Next, check the output of your methods using any of these [functions](https://docs.pytest.org/en/7.4.x/reference/reference.html#functions). + +### Debugging + +Often, the code you write won't pass the tests straight away, at which stage it will become necessary to debug. +The key to successful debugging is to isolate the problem by finding the smallest possible example that causes the bug. +In practice, there are a few tricks to help you do this, which we give below. +Once you've isolated the issue, it's a good idea to add a unit test that replicates this issue, so that you can easily check whether it's been fixed, and make sure that it's easily picked up if it crops up again. +This also means that, if you can't fix the bug yourself, it will be much easier to ask for help (by opening a [bug-report issue](https://github.com/pybop-team/PyBOP/issues/new?assignees=&labels=bug&projects=&template=bug_report.yml&title=%5BBug%5D%3A+)). + +1. Run individual test scripts instead of the whole test suite: + + ```bash + python tests/unit/path/to/test + ``` + + You can also run an individual test from a particular script, e.g. + + ```bash + python tests/unit/test_quick_plot.py TestQuickPlot.test_failure + ``` + + If you want to run several, but not all, the tests from a script, you can restrict which tests are run from a particular script by using the skipping decorator: + + ```python + @unittest.skip("") + def test_bit_of_code(self): + ... + ``` + + or by just commenting out all the tests you don't want to run. +2. Set break-points, either in your IDE or using the Python debugging module. To use the latter, add the following line where you want to set the break point + + ```python + import ipdb + + ipdb.set_trace() + ``` + + This will start the [Python interactive debugger](https://gist.github.com/mono0926/6326015). If you want to be able to use magic commands from `ipython`, such as `%timeit`, then set + + ```python + from IPython import embed + + embed() + import ipdb + + ipdb.set_trace() + ``` + + at the break point instead. + Figuring out where to start the debugger is the real challenge. Some good ways to set debugging break points are: + + 1. Try-except blocks. Suppose the line `do_something_complicated()` is raising a `ValueError`. Then you can put a try-except block around that line as: + + ```python + try: + do_something_complicated() + except ValueError: + import ipdb + + ipdb.set_trace() + ``` + + This will start the debugger at the point where the `ValueError` was raised, and allow you to investigate further. Sometimes, it is more informative to put the try-except block further up the call stack than exactly where the error is raised. + 2. Warnings. If functions are raising warnings instead of errors, it can be hard to pinpoint where this is coming from. Here, you can use the `warnings` module to convert warnings to errors: + + ```python + import warnings + + warnings.simplefilter("error") + ``` + + Then you can use a try-except block, as in a., but with, for example, `RuntimeWarning` instead of `ValueError`. + +3. To isolate whether a bug is in a model, its Jacobian or its simplified version, you can set the `use_jacobian` and/or `use_simplify` attributes of the model to `False` (they are both `True` by default for most models). +4. If a model isn't giving the answer you expect, you can try comparing it to other models. For example, you can investigate parameter limits in which two models should give the same answer by setting some parameters to be small or zero. The `StandardOutputComparison` class can be used to compare some standard outputs from battery models. +5. To get more information about what is going on under the hood, and hence understand what is causing the bug, you can set the [logging](https://realpython.com/python-logging/) level to `DEBUG` by adding the following line to your test or script: + + ```python3 + pybop.set_logging_level("DEBUG") + ``` + +### Profiling + +Sometimes, a bit of code will take much longer than you expect to run. In this case, you can set + +```python +from IPython import embed + +embed() +import ipdb + +ipdb.set_trace() +``` + +as above, and then use some of the profiling tools. In order of increasing detail: + +1. Simple timer. In ipython, the command + + ``` + %time command_to_time() + ``` + + tells you how long the line `command_to_time()` takes. You can use `%timeit` instead to run the command several times and obtain more accurate timings. +2. Simple profiler. Using `%prun` instead of `%time` will give a brief profiling report 3. Detailed profiler. You can install the detailed profiler `snakeviz` through pip: + + ```bash + pip install snakeviz + ``` + + and then, in ipython, run + + ``` + %load_ext snakeviz + %snakeviz command_to_time() + ``` + + This will open a window in your browser with detailed profiling information. + +## Infrastructure + +### Setuptools + +Installation of PyBOP _and dependencies_ is handled via [setuptools](http://setuptools.readthedocs.io/) + +Configuration files: + +``` +setup.py +``` + +Note that this file must be kept in sync with the version number in [pybop/**init**.py](pybop/__init__.py). + +### Continuous Integration using GitHub actions + +Each change pushed to the PyBOP GitHub repository will trigger the test and benchmark suites to be run, using [GitHub actions](https://github.com/features/actions). + +Tests are run for different operating systems, and for all Python versions officially supported by PyBOP. If you opened a Pull Request, feedback is directly available on the corresponding page. If all tests pass, a green tick will be displayed next to the corresponding test run. If one or more test(s) fail, a red cross will be displayed instead. + +Similarly, the benchmark suite is automatically run for the most recently pushed commit. Benchmark results are compared to the results available for the latest commit on the `develop` branch. Should any significant performance regression be found, a red cross will be displayed next to the benchmark run. + +In all cases, more details can be obtained by clicking on a specific run. + +Configuration files for various GitHub actions workflow can be found in `.github/worklfows`. + +### Codecov + +Code coverage (how much of our code is seen by the (linux) unit tests) is tested using [Codecov](https://docs.codecov.io/), a report is visible on https://codecov.io/gh/pybop-team/PyBOP. + +Configuration files: + +``` +.coveragerc +``` + +### GitHub + +GitHub does some magic with particular filenames. In particular: + +- The first page people see when they go to [our GitHub page](https://github.com/pybop-team/PyBOP) displays the contents of [README.md](README.md), which is written in the [Markdown](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) format. Some guidelines can be found [here](https://help.github.com/articles/about-readmes/). +- The license for using PyBOP is stored in [LICENSE](LICENSE.txt), and [automatically](https://help.github.com/articles/adding-a-license-to-a-repository/) linked to by GitHub. +- This file, [CONTRIBUTING.md](CONTRIBUTING.md) is recognised as the contribution guidelines and a link is [automatically](https://github.com/blog/1184-contributing-guidelines) displayed when new issues or pull requests are created. + +## Acknowledgements + +This CONTRIBUTING.md file, along with large sections of the code infrastructure, +was copied from the excellent [Pints GitHub repo](https://github.com/pints-team/pints), and [PyBaMM repo](https://github.com/pybamm-team/PyBaMM) \ No newline at end of file From 01f32977efa7f4fa643227dba4ce5ce29ee931f6 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 14 Sep 2023 17:33:14 +0100 Subject: [PATCH 064/210] Add codecov to workflow, update noxfile with coverage session --- .github/workflows/test_on_push.yaml | 36 +++++++++++++++++++++++++++-- noxfile.py | 8 ++++++- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test_on_push.yaml b/.github/workflows/test_on_push.yaml index 04f4afc26..40827f79e 100644 --- a/.github/workflows/test_on_push.yaml +++ b/.github/workflows/test_on_push.yaml @@ -4,7 +4,6 @@ on: [push] jobs: build: - runs-on: ubuntu-latest strategy: fail-fast: false @@ -12,7 +11,7 @@ jobs: python-version: ["3.8", "3.9", "3.10", "3.11"] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: @@ -25,3 +24,36 @@ jobs: - name: Test with nox run: | nox + + # Runs only on Ubuntu with Python 3.11 + check_coverage: + needs: style + runs-on: ubuntu-latest + strategy: + fail-fast: false + name: Coverage tests (ubuntu-latest / Python 3.11) + + steps: + - name: Check out PyBOP repository + uses: actions/checkout@v4 + - name: Set up Python 3.11 + id: setup-python + uses: actions/setup-python@v4 + with: + python-version: 3.11 + cache: 'pip' + cache-dependency-path: setup.py + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install --upgrade pip nox + pip install -e . + + - name: Run unit tests for Ubuntu with Python 3.11 and generate coverage report + run: nox -s coverage + + - name: Upload coverage report + uses: codecov/codecov-action@v3 + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} \ No newline at end of file diff --git a/noxfile.py b/noxfile.py index d96c45832..ad833df1b 100644 --- a/noxfile.py +++ b/noxfile.py @@ -13,4 +13,10 @@ def tests(session): session.run_always('pip', 'install', '-e', '.') session.install('pytest') - session.run('pytest') \ No newline at end of file + session.run('pytest') + +@nox.session +def coverage(session): + session.run_always('pip', 'install', '-e', '.') + session.install('pytest-cov') + session.run('pytest', '--cov') \ No newline at end of file From b8cef8e07eb2ef6cab6d9d07114debca85cbf7ac Mon Sep 17 00:00:00 2001 From: NicolaCourtier <45851982+NicolaCourtier@users.noreply.github.com> Date: Thu, 14 Sep 2023 20:43:39 +0100 Subject: [PATCH 065/210] Update installation guide Advise using virtualenv rather than pyenv-virtualenv for consistency with the PyBaMM installation instructions. --- README.md | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 54 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 0219931a5..566bf12d5 100644 --- a/README.md +++ b/README.md @@ -49,23 +49,73 @@ The figure below gives PyBOP's current conceptual structure. The living software ## Getting Started <!-- Installation --> +### Prerequisites +To use and/or contribute to PyBOP, you must first install Python 3 (specifically, 3.8-3.11). For example, on a Debian-based distribution (Debian, Ubuntu - including via WSL, Linux Mint), open a terminal and enter: + +```bash +sudo apt update +sudo apt install python3 python3-virtualenv +``` + +For further information, please refer to the similar [installation instructions for PyBaMM](https://docs.pybamm.org/en/latest/source/user_guide/installation/GNU-linux.html). + ### Installation -Create a virtual environment, i.e with [pyenv](https://github.com/pyenv/pyenv#installation) and [pyenv-virtualenv](https://github.com/pyenv/pyenv-virtualenv#installation): +Create a virtual environment called `pybop-env` within your current directory using: + +```bash +virtualenv pybop-env +``` + +Activate the environment with: + +```bash +source pybop-env/bin/activate +``` + +You can check which version of python is installed within the virtual environment by typing: + +```bash +python --version +``` + +Later, you can deactivate the environment and go back to your original system using: + +```bash +deactivate +``` + +Note that there are alternative packages which can be used to create and manage [virtual environments](https://realpython.com/python-virtual-environments-a-primer/), for example [pyenv](https://github.com/pyenv/pyenv#installation) and [pyenv-virtualenv](https://github.com/pyenv/pyenv-virtualenv#installation). In this case, follow the instructions to install these packages and then to create, activate and deactivate a virtual environment, use: ```bash pyenv virtualenv pybop-env pyenv activate pybop-env +pyenv deactivate ``` -Install PyBOP: +Within your virtual environment, install the `develop` branch of PyBOP: ```bash - pip install git+https://github.com/pybop-team/PyBOP +pip install git+https://github.com/pybop-team/PyBOP.git@develop ``` -<!-- Installation --> +To alternatively install PyBOP from a local directory, use the following template, substituting in the relevant path: + +```bash +pip install -e "PATH_TO_PYBOP" +``` + +Now, with PyBOP installed in your virtual environment, you can run Python scripts which import and use the functionality of this package. + +<!-- Example Usage --> ### Usage +PyBOP has two classes of intended use case: +1. parameter estimation from battery test data +2. design optimisation subject to battery manufacturing/usage constraints + +These classes encompass a wide variety of optimisation problems, which depend on the choice of battery model, the available data and/or the choice of design parameters. + +### Parameter estimation The example below shows a simple fitting routine that starts by generating synthetic data from a single particle model with modified parameter values. An RMSE cost function using the terminal voltage as the optimised signal is completed to determine the unknown parameter values. First, the synthetic data is generated: ```python From 81b97b932c328ac19fbde7a82d386384a9e49cb0 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 15 Sep 2023 09:49:56 +0100 Subject: [PATCH 066/210] yaml bugfix --- .github/workflows/test_on_push.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/test_on_push.yaml b/.github/workflows/test_on_push.yaml index 40827f79e..b1074e915 100644 --- a/.github/workflows/test_on_push.yaml +++ b/.github/workflows/test_on_push.yaml @@ -27,7 +27,6 @@ jobs: # Runs only on Ubuntu with Python 3.11 check_coverage: - needs: style runs-on: ubuntu-latest strategy: fail-fast: false From 609677b7ed89d50d943ccf3222df6e830be75079 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 15 Sep 2023 10:00:07 +0100 Subject: [PATCH 067/210] Add cov-report flag --- noxfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/noxfile.py b/noxfile.py index ad833df1b..efb9aa8f3 100644 --- a/noxfile.py +++ b/noxfile.py @@ -19,4 +19,4 @@ def tests(session): def coverage(session): session.run_always('pip', 'install', '-e', '.') session.install('pytest-cov') - session.run('pytest', '--cov') \ No newline at end of file + session.run('pytest', '--cov', '--cov-report=xml') \ No newline at end of file From b2c5437d93e53174f153675ea64756ee3ba3baf7 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 15 Sep 2023 10:06:43 +0100 Subject: [PATCH 068/210] Split Nox sessions --- .github/workflows/test_on_push.yaml | 4 ++-- noxfile.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test_on_push.yaml b/.github/workflows/test_on_push.yaml index b1074e915..a090f2ce8 100644 --- a/.github/workflows/test_on_push.yaml +++ b/.github/workflows/test_on_push.yaml @@ -21,9 +21,9 @@ jobs: python -m pip install --upgrade pip pip install --upgrade pip nox pip install -e . - - name: Test with nox + - name: Unit tests with nox run: | - nox + nox -s unit_test # Runs only on Ubuntu with Python 3.11 check_coverage: diff --git a/noxfile.py b/noxfile.py index efb9aa8f3..b48348a9e 100644 --- a/noxfile.py +++ b/noxfile.py @@ -10,7 +10,7 @@ @nox.session -def tests(session): +def unit_test(session): session.run_always('pip', 'install', '-e', '.') session.install('pytest') session.run('pytest') From 3c1d3d3dcb5e69b53215cf10964e1871b9bfdfe2 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 15 Sep 2023 10:14:55 +0100 Subject: [PATCH 069/210] Add codecov badge --- README.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index fa1d36186..a7c139929 100644 --- a/README.md +++ b/README.md @@ -20,18 +20,17 @@ <a href="https://github.com/pybop-team/PyBOP/stargazers"> <img src="https://img.shields.io/github/stars/pybop-team/PyBOP" alt="stars" /> </a> + <a href="https://codecov.io/gh/pybop-team/PyBOP"> + <img src="https://img.shields.io/github/stars/pybop-team/PyBOP" alt="codecov" /> + </a> <a href="https://github.com/pybop-team/PyBOP/issues/"> - <img src="https://img.shields.io/github/issues/pybop-team/PyBOP" alt="open issues" /> + <img src="https://codecov.io/gh/pybamm-team/PyBaMM/branch/main/graph/badge.svg" alt="open issues" /> </a> <a href="https://github.com/pybop-team/PyBOP/blob/develop/LICENSE"> <img src="https://img.shields.io/github/license/pybop-team/PyBOP" alt="license" /> </a> </p> -<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section --> -[![All Contributors](https://img.shields.io/badge/all_contributors-4-orange.svg?style=flat-square)](#contributors-) -<!-- ALL-CONTRIBUTORS-BADGE:END --> - </div> <!-- Software Specification --> From cf5c50d977cf17cedbfb4ad9e77a38155b94cd26 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 15 Sep 2023 10:21:10 +0100 Subject: [PATCH 070/210] bugfix badge --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a7c139929..765a1a38c 100644 --- a/README.md +++ b/README.md @@ -21,10 +21,10 @@ <img src="https://img.shields.io/github/stars/pybop-team/PyBOP" alt="stars" /> </a> <a href="https://codecov.io/gh/pybop-team/PyBOP"> - <img src="https://img.shields.io/github/stars/pybop-team/PyBOP" alt="codecov" /> + <img src="https://codecov.io/gh/pybop-team/PyBOP/branch/develop/graph/badge.svg" alt="codecov" /> </a> <a href="https://github.com/pybop-team/PyBOP/issues/"> - <img src="https://codecov.io/gh/pybamm-team/PyBaMM/branch/main/graph/badge.svg" alt="open issues" /> + <img src="https://img.shields.io/github/issues/pybop-team/PyBOP" alt="open issues" /> </a> <a href="https://github.com/pybop-team/PyBOP/blob/develop/LICENSE"> <img src="https://img.shields.io/github/license/pybop-team/PyBOP" alt="license" /> From 58fd600829a5c4e682b5ebc2834b0add86da5d52 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 15 Sep 2023 10:42:00 +0100 Subject: [PATCH 071/210] Update & relax assertations --- tests/unit/test_parameterisation.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/unit/test_parameterisation.py b/tests/unit/test_parameterisation.py index 6bf4f6e92..e77638283 100644 --- a/tests/unit/test_parameterisation.py +++ b/tests/unit/test_parameterisation.py @@ -31,7 +31,7 @@ def getdata(self, x0): def test_rmse(self): # Form observations - x0 = np.array([0.55, 0.63]) + x0 = np.array([0.52, 0.63]) solution = self.getdata(x0) observations = [ @@ -49,12 +49,12 @@ def test_rmse(self): pybop.Parameter( "Negative electrode active material volume fraction", prior=pybop.Gaussian(0.5, 0.05), - bounds=[0.35, 0.75], + bounds=[0.4, 0.65], ), pybop.Parameter( "Positive electrode active material volume fraction", prior=pybop.Gaussian(0.65, 0.05), - bounds=[0.45, 0.85], + bounds=[0.5, 0.75], ), ] @@ -68,4 +68,4 @@ def test_rmse(self): ) # Assertions np.testing.assert_allclose(last_optim, 1e-3, atol=1e-2) - np.testing.assert_almost_equal(results, x0, decimal=1) + np.testing.assert_allclose(results, x0, atol=5e-2) From e11781bf1cfeede751f486c8a0ac368e0d6b9c2b Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 15 Sep 2023 11:05:53 +0100 Subject: [PATCH 072/210] Add PR trigger --- .github/workflows/test_on_push.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test_on_push.yaml b/.github/workflows/test_on_push.yaml index a090f2ce8..a75406db7 100644 --- a/.github/workflows/test_on_push.yaml +++ b/.github/workflows/test_on_push.yaml @@ -1,6 +1,7 @@ name: PyBOP -on: [push] +on: [push, pull_request] + jobs: build: From 2cdc7e7df04eebe6151dc74ac63cbea7c91b7352 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 15 Sep 2023 11:07:04 +0100 Subject: [PATCH 073/210] Add concurrency cancel trigger --- .github/workflows/test_on_push.yaml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test_on_push.yaml b/.github/workflows/test_on_push.yaml index a75406db7..f6516faf2 100644 --- a/.github/workflows/test_on_push.yaml +++ b/.github/workflows/test_on_push.yaml @@ -2,7 +2,14 @@ name: PyBOP on: [push, pull_request] - +concurrency: + # github.workflow: name of the workflow, so that we don't cancel other workflows + # github.event.pull_request.number || github.ref: pull request number or branch name if not a pull request + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + # Cancel in-progress runs when a new workflow with the same group name is triggered + # This avoids workflow runs on both pushes and PRs + cancel-in-progress: true + jobs: build: runs-on: ubuntu-latest From 1528651183e27c6f19c0d3b8a8f16e7dc1c53de9 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 15 Sep 2023 11:21:15 +0100 Subject: [PATCH 074/210] Syntax for concurrency trigger --- .github/workflows/test_on_push.yaml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test_on_push.yaml b/.github/workflows/test_on_push.yaml index f6516faf2..4f4d0b8a6 100644 --- a/.github/workflows/test_on_push.yaml +++ b/.github/workflows/test_on_push.yaml @@ -1,6 +1,9 @@ name: PyBOP -on: [push, pull_request] +on: + push: + workflow_dispatch: + pull_request: concurrency: # github.workflow: name of the workflow, so that we don't cancel other workflows @@ -9,7 +12,7 @@ concurrency: # Cancel in-progress runs when a new workflow with the same group name is triggered # This avoids workflow runs on both pushes and PRs cancel-in-progress: true - + jobs: build: runs-on: ubuntu-latest From a0cc83c58d30c662537e04b73afe8d4a47811900 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 15 Sep 2023 11:40:08 +0100 Subject: [PATCH 075/210] Grammar, codecov --- CONTRIBUTING.md | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d1f8bc013..2a34360f1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,7 +6,7 @@ If you'd like to contribute to PyBOP, please have a look at the [pre-commit](#pr Before you commit any code, please perform the following checks: -- [All tests pass](#testing): `$ nox` +- [All tests pass](#testing): `$ nox -s unit_test` ## Workflow @@ -104,7 +104,7 @@ All code requires testing. We use the [pytest](https://docs.pytest.org/en/) pack If you have nox installed, to run unit tests, type ```bash -nox +nox -s unit_test ``` else, type @@ -261,17 +261,12 @@ Similarly, the benchmark suite is automatically run for the most recently pushed In all cases, more details can be obtained by clicking on a specific run. -Configuration files for various GitHub actions workflow can be found in `.github/worklfows`. +Configuration files for various GitHub actions workflow can be found in `.github/workflows`. ### Codecov -Code coverage (how much of our code is seen by the (linux) unit tests) is tested using [Codecov](https://docs.codecov.io/), a report is visible on https://codecov.io/gh/pybop-team/PyBOP. +Code coverage (how much of our code is seen by the (Linux) unit tests) is tested using [Codecov](https://docs.codecov.io/), a report is visible on https://codecov.io/gh/pybop-team/PyBOP. -Configuration files: - -``` -.coveragerc -``` ### GitHub @@ -284,4 +279,4 @@ GitHub does some magic with particular filenames. In particular: ## Acknowledgements This CONTRIBUTING.md file, along with large sections of the code infrastructure, -was copied from the excellent [Pints GitHub repo](https://github.com/pints-team/pints), and [PyBaMM repo](https://github.com/pybamm-team/PyBaMM) \ No newline at end of file +was copied from the excellent [Pints repo](https://github.com/pints-team/pints), and [PyBaMM repo](https://github.com/pybamm-team/PyBaMM) \ No newline at end of file From 9e6c5cfad881b81006a5996ebd74650abc2f8ff1 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 15 Sep 2023 17:04:22 +0100 Subject: [PATCH 076/210] Loosen assertion and shift unit_test bounds --- tests/unit/test_parameterisation.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/unit/test_parameterisation.py b/tests/unit/test_parameterisation.py index e77638283..40d2b7f3d 100644 --- a/tests/unit/test_parameterisation.py +++ b/tests/unit/test_parameterisation.py @@ -48,13 +48,13 @@ def test_rmse(self): params = [ pybop.Parameter( "Negative electrode active material volume fraction", - prior=pybop.Gaussian(0.5, 0.05), - bounds=[0.4, 0.65], + prior=pybop.Gaussian(0.5, 0.02), + bounds=[0.375, 0.625], ), pybop.Parameter( "Positive electrode active material volume fraction", - prior=pybop.Gaussian(0.65, 0.05), - bounds=[0.5, 0.75], + prior=pybop.Gaussian(0.65, 0.02), + bounds=[0.525, 0.75], ), ] @@ -68,4 +68,4 @@ def test_rmse(self): ) # Assertions np.testing.assert_allclose(last_optim, 1e-3, atol=1e-2) - np.testing.assert_allclose(results, x0, atol=5e-2) + np.testing.assert_allclose(results, x0, atol=1e-1) From 38e8339f60dce5f6aed598484f5bd429a2bdbd0a Mon Sep 17 00:00:00 2001 From: NicolaCourtier <45851982+NicolaCourtier@users.noreply.github.com> Date: Mon, 18 Sep 2023 11:24:18 +0100 Subject: [PATCH 077/210] Update Architecture diagram (#43) Update the Architecture diagram --- README.md | 4 +- assets/PyBOP_Arch.pdf | Bin 110377 -> 0 bytes assets/PyBOP_Arch.svg | 74 ------------- ...cture.drawio => PyBOP_Architecture.drawio} | 103 +++++++++--------- assets/PyBOP_Architecture.png | Bin 0 -> 147518 bytes 5 files changed, 56 insertions(+), 125 deletions(-) delete mode 100644 assets/PyBOP_Arch.pdf delete mode 100644 assets/PyBOP_Arch.svg rename assets/{PyBOP-Architecture.drawio => PyBOP_Architecture.drawio} (83%) create mode 100644 assets/PyBOP_Architecture.png diff --git a/README.md b/README.md index cefe1dfc7..4c89bea8b 100644 --- a/README.md +++ b/README.md @@ -37,11 +37,11 @@ ## PyBOP PyBOP provides a comprehensive suite of tools for parameterisation and optimisation of battery models. It aims to implement Bayesian and frequentist techniques with example workflows to guide the user. PyBOP can be applied to parameterise a wide range of battery models, including the electrochemical and equivalent circuit models available in [PyBaMM](https://pybamm.org/). A major emphasis in PyBOP is understandable and actionable diagnostics for the user, while still providing extensibility for advanced probabilistic methods. By building on the state-of-the-art battery models and leveraging Python's accessibility, PyBOP enables agile and robust parameterisation and optimisation. -The figure below gives PyBOP's current conceptual structure. The living software specification of PyBOP can be found [here](https://github.com/pybop-team/software-spec). This package is under active development, expect API evolution with releases. +The figure below gives PyBOP's current conceptual structure. The living software specification of PyBOP can be found [here](https://github.com/pybop-team/software-spec). This package is under active development, expect API (Application Programming Interface) evolution with releases. <p align="center"> - <img src="assets/PyBOP_Arch.svg" alt="Data flows from battery cycling machines to Galv Harvesters, then to the Galv server and REST API. Metadata can be updated and data read using the web client, and data can be downloaded by the Python client." width="600" /> + <img src="assets/PyBOP_Architecture.png" alt="Data flows from battery cycling machines to Galv Harvesters, then to the Galv server and REST API. Metadata can be updated and data read using the web client, and data can be downloaded by the Python client." width="600" /> </p> <!-- Getting Started --> diff --git a/assets/PyBOP_Arch.pdf b/assets/PyBOP_Arch.pdf deleted file mode 100644 index 17d36a9c67f8979280494d3c38c8a9700bbfabb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 110377 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 Wvi%uTUS24aR}`CxNl{A)`~Lve0B%SC diff --git a/assets/PyBOP_Arch.svg b/assets/PyBOP_Arch.svg deleted file mode 100644 index 49a7c78c8..000000000 --- a/assets/PyBOP_Arch.svg +++ /dev/null @@ -1,74 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - version="1.1" - id="svg2" - width="754.66669" - height="318.66666" - viewBox="0 0 754.66669 318.66666" - xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns="http://www.w3.org/2000/svg" - xmlns:svg="http://www.w3.org/2000/svg"> - <defs - id="defs6"> - <clipPath - clipPathUnits="userSpaceOnUse" - id="clipPath20"> - <path - d="M 0,0 H 566 V 239 H 0 Z" - id="path18" /> - </clipPath> - <clipPath - clipPathUnits="userSpaceOnUse" - id="clipPath30"> - <path - d="M 0.5,239 H 566 V -2.384186e-6 H 0.5 Z" - id="path28" /> - </clipPath> - <clipPath - clipPathUnits="userSpaceOnUse" - id="clipPath36"> - <path - d="m 0.5,-0.5 h 566 V 239 H 0.5 Z" - id="path34" /> - </clipPath> - </defs> - <g - id="g10" - transform="matrix(1.3333333,0,0,-1.3333333,0,318.66667)"> - <g - id="g14"> - <g - id="g16" - clip-path="url(#clipPath20)"> - <path - d="M 0,239 H 566 V 0 H 0 Z" - style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" - id="path22" /> - </g> - </g> - <g - id="g24"> - <g - id="g26" - clip-path="url(#clipPath30)"> - <g - id="g32" - clip-path="url(#clipPath36)"> - <g - id="g38" - transform="matrix(565.5,0,0,239,0.5,-2.384186e-6)"> - <image - width="1" - height="1" - preserveAspectRatio="none" - transform="matrix(1,0,0,-1,0,1)" - xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABf4AAAKICAYAAAAhJevmAAAABHNCSVQICAgIfAhkiAAAIABJREFUeJzs3Xd4VGXax/HvtEwq6QmQ0HsRRIqAgK6ouIu9rV3UfcWCsoIVyyqKsHYQBdfVtaywKnZAlN4hAgGktwAJEJKQQnqZOe8fkwwJk0ZNJvw+e+0lOeU595yZyUzuc5/7MRmGYSAiIiIiIiINitPp5J577sbHx85H//oIs8Vc1yGJiIiIyFliresARERERERE5PRyGgavvPIKX3/9DSUlJbRs2YoXXni+rsMSERERkbNEiX8REREREZEGxOl08vLLL/PGG2/w2muv4XA4GDt2LHa7D0899VRdhyciIiIiZ4ES/yIiIiIiIg2Ew+HgtXHjmDx5MpPee4+/3X8/AMHBwTzxxBMYGIx6fBQ2m62OIxURERGRM0mJfxERERERkQaisLCQHTt38umnn3L11Ve7lw8fPpzIyEh+/ukncnNzCQkJqcMoRURERORMM2lyXxERERERkYbD6XRiNlc+kW9160RERESk4VDiX0RERERERERERESkAVGrHxERERERkQYoMTGRdevWYTab6d27N40bN67rkERERETkLFHiX0REREREpAEpKipi0qRJfPDBB7Rt24aiomJSU1P5/PPP6dmzZ12HJyIiIiJngVr9iIiIiIiINCCPP/44EydOZMKECYwcOZLcvFz69+uPv78/S5YsITAwsK5DFBEREZEzTLM6iYiIiIiINACGYTD+tfG8++67/O1vf+Opp57CbrcTFhrGoIsHER8fz5rff6/rMEVERETkLFDiX0REREREpAFYtGgRr7z6Cs2bNeOZZ5+psC46KhqAuDgl/kVERETOBUr8i4iIiIiIeLnc3Fxefull8vPzGXbvvbRu1brC+rIOr9u2b6uL8ERERETkLFPiX0RERERExMv9/PPPLFm6hKCgIO644w6P9enp6QDk5OSc7dBEREREpA4o8S8iIiIiIuLFcnNyeeuttzAMg6uuuor27dpVWO90OtmfuB8AHx+fughRRERERM4yJf5FRERERES82Lz581i7di0mk4mbb7oZTKYK648ePcq+vfsACA0NrYsQRUREROQsU+JfRERERETEi82ePRvDMGjSuDH9+vX1WJ+amsq+vXsBiIqKOsvRiYiIiEhdsNZ1ACIiIiIi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HA6ysjLJyjpKdnY2eXl55OTmkpebS25uLpmZme7l+fn55OflkZef7/65qKiI4uISSkqKKSkuprikhIKCAjp06MD//ve/MxZ3cHDwGRtbpD5Q4l9ERESknnn66adp2aoVwx94gJiYGI/1BmCqIiOVk5PDtGnTWLJkCe+///4ZjlREpAEqbemvvL+IiEt+QT7Jh5I5ePAghw8fZteuXSQkJHD48GEOp6SQkZ5OTk4OOTk55OXlUVh4eiZXLioqOi3jiJyrlPgXERERqUf8/f254YYbuP766/n0P//hgQce4N577630AkD5iv+cnBy++eYbJk2axPr163lv0nuqYhIRORllrX7qNgoRkTpx4MABEhIS2LNnD5s2bWLjhg3s3rOHtLQ0MjMzK93Hx8eH0LBQoqOjCQkNJSgwkMDAQIKDgwkJCSEkOIRGIcH42u3YbDasVis2mw82mxUfm49rmc1autyGzWrF5uOj77Iip0iJfxEREZF6ZujQofzpkktYuGgRL7zwAv/617/4v/97gPvuv4+mTZq4q1D9/PzIzc3l66++ZtJ7roQ/QJcuXRh277A6i19EpEFQ5l9EGrjcvFx2bN/B1q1biYuLY/XqVezevYfU1NQK24WFhdO8eXP69O5N4yZNaNmyJS1btiQ2NpaIiAgCAwMJCAggwD8A/wB/bDZbHT0iESlPiX8RERGResZmszF69GgWL1mC0+kkMTGRF198gX//+98MG3YPRUVFmEwmPvroI7755hvWrVtXYf/HHnuMwMDAOopeRMTLlSX81etHxOvoel3NUlJSWLlyJTNnzmTJ4sXs3beXoqJi9/qOnToxaNDFdO7cic6dO9OufTuiIqMIDQ3V98uzpKSkBKfTic1mq3ZOr/rO6XBS4ijBYrFgsVjqOpwzzjAMSoqLwWSqNxe/lPgXERERqYeuGDKEQRcPYtHCRe5l+/fvY+zYse6fn332WY/9unbtyu233342QhQRERERL1BUVMTy5cuZNm0av/zyCwcOHHCv69atG7169mLAwAH07t2bZs2aqcVOHcrIyOD2229n3969vDtxIldccQUA999/P2vWrOGWW27hueeeq+Moa2fca+OYNn0aFw8axNSpH9Z1OGfcmt9/555hw4iIiGDa9OnEVtKq9WxT4l9ERESkHrLZbIwe9QRLFruq/mvr0UcfVTWWiMipMKnY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M4e5c+cyYMAAbDYbq1atIjY2lrCwMO68806ys7PzJEPVqlWZPn063t7eOe68+qNq1arlyfmLKhX+RURERERERERExHQpKSm88847fPDBBwD069ePkSNHUrx4cZOTFXw9e/Zkzpw5bN68mX379lG7dm1Pm59mzZpRoUKFGxqV/1cEBATQqlWrPDm2XJsK/yIiIiIiIiIiImKq3bt3ExUVxYoVKyhZsiTvvfceffv2NTtWodG6dWvKly/P8ePHWb58OWFhYfzyyy8A3H///Xl6bsMwyMrKwsvLK0/PIzmpKZaIiIiIiIiIiIiY5j//+Q/t27dnxYoVtG7dmqVLl6ron8tKlSpF69atAViwYAE//vgjp0+fpmTJkrRr187ccJInVPgXERERERERERGRWy4uLo4BAwbwr3/9i7Nnz/LCCy+wePFi6tevb3a0QqlXr14AbN68mbfffhuA5s2bU7FixRs+xl+ZANhqtWq0vwnU6kdERERERERERERuqY0bNxIVFcXGjRspV64cY8eOzfOWM0Vdy5YtqVSpEjExMcTHxwMXe//fjB07drB8+fJrTtJrs9m4/fbbCQwM9CxLSEjghx9+wMvL67qT+7rdbho1akRoaOhNZZKrU+FfREREREREREREbgnDMJgyZQovv/wySUlJdOrUiXHjxlGjRg2zoxV6oaGhtGvXjpiYGOBi+58/tvm5VJj/Y4H+0uNp06bx6aefXvX4hmHg7e3N6tWradKkiWefmJgYunbtisViuW4+wzCYN28e9957700/N7mSWv2IiIiIiIiIiIhInjt16hT/+te/GDBgAOnp6bzxxhssWLBARf9cZrPZ8Pb2xtvbG6s1Z/m3V69ennXt2rWjXLlynnUWiwUfHx/P+kusViu+vr54e3vj5eWFzWa76pfdbsdut3vOefmxHA7HNfe79OVwOP704oDcOI34FxEREREREbnFsrKyWLJkCW3btqVYsWI51v3666+EhYVRvXp1k9LdGitXrqRixYpUrlw5x/KDBw9y8uRJ2rZta1IyEckLq1ev5plnnuH333+natWqjB8/ns6dO5sdq1CqX78+Bw8eBLiibU7Hjh05dOgQhmEQFBSUY11gYCCLFy/G6XTmeG2qWbMme/bsuW6bnkssFgslS5YEYMqUKYwZM+amsqvNT+5R4V9ERERERETkFktISOD5558n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9+706NGDPn360LhxY4oXL56vRnlL3klLS+P48eMsW7aMadOmceDAAby8vHj77bfp16+f2fGuoMK/iIiIiIiIiAmcTudVl2dnZ+NyuXIse/XVV5k/fz47d+7Ex8eHmTNnmj6h7yVlypRhxowZLFq0iL1793LXXXcxatQoSpQocd39nE4nbrf7iuWGYVzx/Dt06ECHDh1yNbdIUbVhwwYiIyP57bffqFChAmPHjuW+++4zO1a+FhERwfz583nllVf49NNPiY6OJjo6mmLFiuHj42P6BVi5NbKzs0lOTiYrKwuAGjVqMGLECHr06GFysqtT4V9ERERERETkFgsKCuKVV16hfPnyV6x7+OGHr1ju7e1Nr169blW8m1a5cmWioqJuap/HH3+c2rVrX7G8Y8eOVKxYMbeiich/GYbBpEmTGDp0KMnJyXTu3Jlx48Z5WojJ9QUFBTFx4kT69OnDV199xcaNGzl69ChJSUlXvYgphY+3tzelSpWiXr16dOjQgccee+xPL3KbyWJcukdOREREREyXmZnJoUOHrloIgYujTFq3bs369etZu3YtzZs3v+p2J0+exGq1Urp06byMKyIiUqDExMRQuXJlKlWqxIEDB9SeQ4qMkydPMmTIEL766iu8vLwYNmwYQ4cOxeFwmB2twMrIyCA1NfWad29J4WO1WvHy8iI4ONjsKDdEI/5FRERE8hGHw8G0adM4ffo0L7zwAk2aNLmp/WNjY/nkk09YunQpc+bMyQlhOY0AACAASURBVKOUIiIiIlJQ/Pzzz0RGRrJr1y6qV6/O+PHj6dSpk9mxCjwfHx98fHzMjiFyTVazA4iIiIjI/1itVp588kmio6Np06YNjz76KJs2bfrT/WJjYxk5ciTNmjXj9ddf5+6779ZofxEREZEiLCsri/fee4+7776bXbt20atXL5YvX66iv0gRocK/iIiISD5Tp04dnnzySTIyMpgxYwZt2rThscceY9OmTdjtdqzWi2/hvL29OXv2LCNHjqRp06a88sorHDt2jIiICPr372/ysxARERERs8TExPDAAw8wdOhQvLy8GDVqFDNnzqRcuXJmRxORW0StfkRERETyoaioKGbMmEFycjIZGRl8+eWXfPPNN/Ts2ZO4uDisVisff/wxq1atIiYmJse+/fv3z9eTTImIiIhI3lm4cCEDBw7k8OHDNGjQgAkTJtCyZUuzY4nILabJfUVERETyqQEDBjB58uSb2iciIoLffvtNhX8REZGr0OS+UpilpaUxcuRIhg8fDkDfvn358MMP9b5QpIhSqx8RERGRfCoqKopixYrd1D5PP/20PtyJiIiIFDG7d++mW7duDB8+nLCwMD755BM+++wzvS8UKcJU+BcRERHJp2rVqkWfPn1uePuIiAieeOKJPEwkIiIiIvnNrFmz6NChAytWrKBZs2b8+OOPek8oIir8i4iIiORnNzPqX6P9RURERIqO+Ph4nnvuOR566CFOnz7Nc889x5IlS2jUqJHZ0UQkH9DkviIiIiL52KVR/3/W61+j/UVERESKjs2bN/PMM8+wYcMGypYty+jRo3nwwQfNjlXkZGZm4na70RSqRYPVasVms+FwOMyOckNU+BcRERHJ56Kiovjqq69ISkq65jb9+/fXaH8RERGRImDq1Km8/PLLxMfH07FjR8aPH0/NmjXNjlVknDt3ju+//56FCxeyZ88eEhMTcblcZseSW8DX15fQ0FDatGlD9+7dadeundmRrsti6JKUiIiISL73zDPPMGnSpKuui4iI4LffflPhX0RE5E/ExMRQuXJlKlWqxIEDB7DZbGZHErlhZ86cYciQIXzxxRfY7XaGDBnCa6+9hre3t9nRigSn08nUqVMZM2YMhw8fBsBiseBwOLBYLCank1vB5XKRnZ0NXPzed+vWjVdffZUmTZqYnOzqNOJfREREpACIjIxkxowZVx31r97+IiIiIoXbL7/8QmRkJNu3b6dKlSqMGzeOrl27mh2ryDh//jzPPvssM2fOBKBly5Y88MADtGnThrCwsALT+kX+npSUFA4ePMjChQuZM2cOCxYsYM2aNYwbN45HH33U7HhX0Ih/ERERkQJiwIABV/T612h/ERGRG6cR/1LQuFwuxo4dy2uvvUZ6ejr33nsvY8eOJSIiwuxoRUZKSgp9+vRhwYIFlChRghEjRvDvf/8bLy8vs6OJiQ4cOMCwYcP45ptvcDgcfPnll/lung2r2QFERERE5MZERUVRrFixHMs02l9ERESkcDp69CgPPfQQgwYNwmKx8N577xEdHa2i/y32zjvvsGDBAsLDw5k/fz79+vVT0V+oVq0as2bNYtCgQTidTs8dOfmJCv8iIiIiBUStWrXo06eP53FERARPPPGEiYlEREREJC/8+OOP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W2cUlytXToZh6Pjx4/r77781cuRIpaen67PPPpOdnZ1cXV119epVXbt2zfrfN94BMmPGDPXv31+SbjmeJI0YMSJHnmvr1q01dOhQxcbGau/evbJYLLKzs9OVK1d08eJF/fbbb1q9erWio6MlXV/OxdbWVhcuXNDJkyfl6uqqtLQ01a9fX/Hx8UpOTlZ4eLhatWqV6TypqakKCwvT+fPnVbduXZUvX17S9U1VW7durbNnz0qSKlWqJFtbWx0/flw7duxQp06ddPbsWb3zzjuSrt8hdPbsWZ0/f14ffPCBoqKi5ODgoCpVqujKlSs6c+aM9u3bZ/0eK1myZI68bsjava45n56erjNnzujy5cv66KOPFB0dLVdXV1WuXFnHjx9XTEyMhg8frrCwMB04cED29vaqWLGiYmJiFBMTowULFsjT01OTJ0+WjY2NkpKSdPToUVksFnXp0kXR0dHy9fVViRIlFBUVpTNnzujHH39UVFSUwsPDrXnPnTunkydPytfX17oPQXJysqKiomRra6uuXbvq8OHDkq4voeXg4KC4uDgdO3ZMtra2unbtmvU5LVmyREFBQUpISJCjo6OqVasmwzB08OBBHTx4UL169VKJEiWsS/UtWLBA3bp1U1pamtzc3FS5cmXZ29vr9OnTOnnypCZPnqz4+HjNmjWLTXwBAACQa/ibJwCYKKsNetPS0nTw4EG9++671iVrGjdufFNdXFyc6tWrpzVr1mjbtm3aunWrhgwZIjs7O8XExGjRokWSpOeff966MfCSJUusGwlnWLlypa5duyZHR0d17NhRkjR16lQlJCSoTp062rhxozZs2KCtW7fqt99+U9WqVZWamqpx48ZZl/fJaGTcuDTI8ePHNXjwYKWmpqpixYpavny5tm/fru3bt2vevHlyc3PT5cuXrUuwrFu3TuvXr5eTk5NCQkK0bds2bdiwQVu2bLFerPjpp5904MCBTPlXr16t5ORkNWzYUMWLF7/pdTpw4IDmzp2r4ODgW/4zb948Xb16VdL15ubRo0clSZUrV75pWaP7YWNjo5YtW8rW1lY7duy46TkcPHhQO3fulCS1a9fuvpYnws0qVKgg6fqFlX///VfS9c/XhAkTZBiGGjZsqE2bNmnjxo3atGmTNm3apOeee06StHDhQl27dk1Vq1bV5s2bNXDgQEnXNxD9/fffFR4eLhcX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IiIiIiIiIiIiInqGsPBPRERERERERERERPQMYeGfiIiIiIiIiIiIiOgZwsI/EREREREREREREdEzhIV/IiIiIiIiIiIiIqJnCAv/RERERERERERERETPEBb+iYiIiIiIiIiIiIieISz8ExERERERERERERE9Q1j4JyIiIiIiIiIiIiJ6hrDwT0RERERERERERET0DGHhn4joIWQyGQBACGHhTIieXDw+6GnXsA83fOabA78/iIiIiIjIUlj4JyJ6CI1GAwAoKyuzcCZEHVNRUQGj0Qi1Wg2lUtnheAqFAo6Ojqirq+PxQU+98vJymEwmqNVqWFlZdTieQqGAg4MDampqeHzQU6+kpAS1tbXQaDRQKBSWToeIiIiI2oCFfyKih3B2dgYA3Lhxw8KZEHXMnTt3UFlZCa1WC2tr6w7HUygU0vFRWFjY4XhElnT79m1UV1dDq9WiS5cuHY6nVCrh7OwMk8nE44OeeoWFhairq4NOpzPLiTEiIiIi6nws/BMRPYS3tzcA4OTJkxbOhKhjMjIyUFVVBb1eDzs7uw7Hk8lk6NOnDwAeH/T0u3jxIurq6uDh4QGVStXheEqlEl5eXhBC4PTp02bIkMhyTp06BaD+byJe8U9ERET0dGDhn4joIcLCwiCTyXDs2DGYTCZLp0P0yI4cOQIACA0NNUurHwAIDw8HACQlJbGPOT3VEhMTAfz/Z35HyWQy6fg4evRoh+MRWVLDPvzCCy9YOBMiIiIiaisW/omIHiIwMBCurq44c+aMVDgletrk5ORg7969kMvlGDVqlNnihoSEwMnJCWlpaTh+/LjZ4hI9TpcuXcI///lPqFQqREREmC1uWFgYbG1tceTIEZw9e9ZscYkep/T0dCQnJ8PBwQEhISGWToeIiIiI2oiFfyKih3B2dsb06dNRV1eHVatW8ap/eiqtX78et2/fxqhRoxAYGGi2uD169MDUqVNhMpkQHR2N+/fvmy020ePy+eefo6ysDC+//DL69u1rtrheXl547bXXUFlZiejoaLPFJXpchBCIjo6G0WjElClT0LNnT0unRERERERtpPj4448/tnQSRERPOj8/P8TFxeH8+fOoq6vDiBEjLJ0SUZvt2rULK1asgFKpxPbt29GjRw+zxvfz88OePXtw7tw5qFQqhIaGmjU+UWfatm0boqKi4ODggB07dkCn05kttkwmg4+PD77++mucO3cOTk5OCAoKMlt8os62evVqxMbGQqfTYfv27XB0dLR0SkRERETURiz8ExG1gb29Pby9vfGPf/wDqampcHR0xNChQy2dFtFDJSQkYPr06aioqMCnn36KSZMmmX0MjUYDvV6PuLg4pKSkwMXFBYMGDTL7OETmtn//frzzzjswGo1Yu3YtxowZY/YxtFotunfvjvj4eCQnJ8PT0xP9+vUz+zhE5vbVV19h4cKFAIA//elPMBgMFs6IiIiIiNqDhX8iojbq3bs3rK2tkZCQgMOHD6O0tBRDhw6FtbW1pVMjaqK2thZffvkl3nrrLZSWluJ3v/sdVq9eDbm8c7r8+fn5oa6uDseOHcO///1vmEwmBAYGQqVSdcp4RB1hNBqxefNmzJkzB1VVVZg5cyY+/vhjs0zq25wBAwagvLwcaWlpOHDgAORyOQICAsw2yTaROTW0pvr973+PmpoaLFu2DPPnz7d0WkRERETUTiz8ExG1Q1BQEOzs7JCSkoLvvvsOhw8fhr29PXQ6Hezt7S2dHhHKy8uRmpqKefPmYePGjTCZTJg2bRpiYmI6/SSVwWCATCZDamoqUlNTkZiYCEdHR+h0Otja2nbq2ERtUVJSgqNHj2L27Nn44osvUFtbizlz5uDzzz9Hly5dOnXs8PBwVFdXIy0tDUlJSUhJSUHXrl3h7OwMGxubTh2bqC3u3LmDb775BjNmzMDOnTshhMDy5cvx4YcfQqFQWDo9IiIiImonmRBCWDoJIqKnzZ49e7B48WL873//AwB4eHggJCQEAQEBcHd3h5OTk4UzpOdJRUUF8vPzcfHiRaSkpCAjIwMA4OjoiMWLF2Px4sWPtWjz1VdfYdmyZbh+/TqA+rtlDAYDBg0aBHd3d2g0mseWC1F5eTny8vJw/vx5pKWl4ccffwRQ34JnxYoVWLBgwWPNZ+vWrfjoo49w69YtAIC3tzcMBgMGDhyIHj16wMHB4bHmQ8+30tJS5OXl4ezZszh+/DiuXLkCAOjevTuioqIwffp0C2dIRERERI+KhX8iokdUUFCAL774Art27ZL+o0z0JPj5z3+O0aNH491330Xfvn0tkkNubi5iY2Oxd+9eZGdnWyQHoub06NED48aNw/z589GnTx+L5JCdnY2YmBjExcVJJ5CJngQeHh6IjIzE7Nmz0bNnT0unQ0REREQdwMI/EVEHFRUV4fjx49iwYQOuXr2KoqIi3Lt3z9Jp0XPEysoK3bp1g4uLC9555x2MHj0a7u7ulk4LAHDr1i0kJydj8+bNyM7ORlFREYxGo6XToudIly5doNVq4ebmhlmzZiEiIgKurq6WTgsAUFhYiCNHjiAmJga5ubkoLi7m8UGPlUqlglarRc+ePTFv3jy88MIL0Ol0lk6LiIiIiMzg/wAq4SfRnuqw2AAAAABJRU5ErkJggg==" - id="image40" /> - </g> - </g> - </g> - </g> - </g> -</svg> diff --git a/assets/PyBOP-Architecture.drawio b/assets/PyBOP_Architecture.drawio similarity index 83% rename from assets/PyBOP-Architecture.drawio rename to assets/PyBOP_Architecture.drawio index a376dedbd..9045249c2 100644 --- a/assets/PyBOP-Architecture.drawio +++ b/assets/PyBOP_Architecture.drawio @@ -1,9 +1,12 @@ -<mxfile host="app.diagrams.net" modified="2023-07-17T09:39:50.258Z" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/116.0" etag="R1Rc19VzA4c5cRQsho2y" version="21.6.2" type="device"> +<mxfile host="app.diagrams.net" modified="2023-09-18T10:17:45.280Z" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/117.0" etag="c32hgD70DTLdr2bVtD3K" version="21.7.5" type="device"> <diagram name="Page-1" id="KMmnkO2Ysz7c5i8QPpm3"> - <mxGraphModel dx="1363" dy="423" grid="1" gridSize="1" guides="0" tooltips="1" connect="1" arrows="1" fold="1" page="0" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> + <mxGraphModel dx="1450" dy="166" grid="1" gridSize="1" guides="0" tooltips="1" connect="1" arrows="1" fold="1" page="0" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> <root> <mxCell id="0" /> <mxCell id="1" parent="0" /> + <mxCell id="gN4vE8bEkTlw2jWnqAIC-14" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" parent="1" vertex="1"> + <mxGeometry x="-23" y="533" width="821" height="351" as="geometry" /> + </mxCell> <mxCell id="hdwB_MQwIhiL4xS-3u5l-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="hdwB_MQwIhiL4xS-3u5l-1" target="hdwB_MQwIhiL4xS-3u5l-3" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> @@ -31,14 +34,14 @@ <mxCell id="hdwB_MQwIhiL4xS-3u5l-7" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="hdwB_MQwIhiL4xS-3u5l-6" target="hdwB_MQwIhiL4xS-3u5l-1" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="hdwB_MQwIhiL4xS-3u5l-6" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" parent="1" vertex="1"> - <mxGeometry x="297" y="606" width="70" height="40" as="geometry" /> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-6" value="Parameter Values" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" parent="1" vertex="1"> + <mxGeometry x="272" y="589" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="hdwB_MQwIhiL4xS-3u5l-38" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="hdwB_MQwIhiL4xS-3u5l-11" target="hdwB_MQwIhiL4xS-3u5l-6" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="hdwB_MQwIhiL4xS-3u5l-11" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> - <mxGeometry x="193" y="611" width="70" height="30" as="geometry" /> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-11" value="Non-optimised Parameters" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> + <mxGeometry x="111" y="594" width="100" height="50" as="geometry" /> </mxCell> <mxCell id="hdwB_MQwIhiL4xS-3u5l-91" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="hdwB_MQwIhiL4xS-3u5l-13" target="hdwB_MQwIhiL4xS-3u5l-1" edge="1"> <mxGeometry relative="1" as="geometry" /> @@ -59,95 +62,97 @@ <mxGeometry x="462" y="716" width="6.7" height="13" as="geometry" /> </mxCell> <mxCell id="hdwB_MQwIhiL4xS-3u5l-23" value="" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/png,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nhZ7AOoRMzUWsc4DcBxRA0TJiE6NROHuALaxkers7Ds9p08JFvlj2W87Rb20nHXgHzIzw39X9z8tmMo6vfxv9l8BhAf7uiw5BAAABeBlWElmTU0AKgAAAAgABgEGAAMAAAABAAIAAAESAAMAAAABAAEAAAEaAAUAAAABAAAAVgEbAAUAAAABAAAAXgEoAAMAAAABAAIAAIdpAAQAAAABAAAAZgAAAAAAAACQAAAAAQAAAJAAAAABAAOShgAHAAAFUAAAAJCgAgAEAAAAAQAAACKgAwAEAAAAAQAAAEYAAAAAQVNDSUkAAABBQUFFNDNqYWJWTmJiQnRGRkwyems3Wkoyc1NicEk4MGZXMkpBeW1seFdrRERTNlBPRTNUaGpadTA3VVRKN0ZyCnh1dXh2ZlY2MSt5TzA3cFdwUGxBQlNINDRLdlFEeUNKRUJRaFhpb1ZJQUZDTklBUUN1QkVnSVFBVlh6MEIvR0IKa0JDcWtKaTFyVkpRWjdUYWUrL01uWHZ1bVRPSnZLRTd6T2RiUmhLdVc3RnlWV1BFTzAxdFI3Zk1DUyt4dFl3dQp2SkNYV2ZtSTEwcWNvaHB6V2dHZGV6RXVlNExxRVZxa3lVQnQwemYxRFNIYnNoaEhiOGpiVjYvcHV2Mk83aDEzCjdyeHIxKzY3NzlsL2YvL2d3MGRHVDB4T25TUTBkU3FYWjRXdzF5d1l4bEpUczBmdThJNEgxZDFaV25RbXhiOVcKWk15ckdjUnhMcmEwdHExZHQzNUQrMFl1Y2N6citBcStrcS9pOWJ5Qk4xN2N0SG5MMW0zSzl0czYrV3EraGpkegpEMi9oSFh3VDM4SzNjaVdTSUE0MWRKT0dOY3V3N0ZET1N0SXcwNWxCSTNtYmtsekNvTEVjU1p0NlN0Y0lFKzJHCmtvUlIwVmFDYU5tMGJSWE01QUUzY2RLeENyWkdRL1FNNjRUYVdQTDFlUGJzN1EwSDFST0hCcUpCdGJKUnpST04KRHZrVU1VRkd2S2w4Nzc2Kyt5YXJiWmdrUnlOVmt6cmp0WVM1UG44a3FCNnI5Q3ZYbFQwUFBQalFoQ0RBWWJadQpwcmw4WEJ3UUdLandQRkpnUk9CVkt5dnpnUU51WHRWWk91Z1pPblI0K0lZdndBU1lzQklGUmgzZXlqZnl0cmhjCmppWXRyWkNqSnFzZ21Pcng1Vm1zUkd5bWF3YWRhWXdXSENxd1owbWFUZ25UeGVyRVNoWFdacFF1RVVrcUtjc1cKbjhtVVN2VG1qQkxKT1U0eGx4QTdjNFJsblArdnVjRmJyVTBWV0tvdlZ0TE52RUJxYXRWQ3FZS2hNRXRoeFR4Vgprcm90ZURHS3dpQ2FyUXVzaXBZaE50R1lVR2VqSzV5andlT3pJM3p0N0RHK2pyZVBCZFVoQVhCWkRZVTlZK09SCkNlR3IrbGtxaUVrTkdTVHRDRDhvR3V2czc2NWVvU3p6OVh6RDJJaGxFczBTVEVkanRSUG1vbjdoeGg4UlRBN3EKbWlzTVloZm40bTR3b2NYbDFwc0lUbFk1bjB2NmJ4bnY3QitvMWlxblBSbmQxVGpUQllMQWxZVmZsSUUvUnZsbQpjV1RXRUdVSGhmRG1zbjVYVmViZTNxRWVSVXpnVGU3ZFBucDRtRzl6YnpFYXpSQldpcklNWldSR0pFNmZqc3R0Ck41VHhMOUw1NmJnZjZxRUZPc0FMTzJBUDdJTmhPQXFqb01KcG1JSEg0Q2s0RDgvREsvQXF2QWF2dzV2d05seUMKeS9BdXZBOVg0RlA0SEw2QUwyRVJ2b1l5TE1PMzhEMWNoV3Z3Sy93TzExRURha1lLMm9sNjBYNFVRRUVVUnVObwpBcDFFT3JMUldUU0R6cUVuME5Qb1BIb09YVUF2b0xmUU8raER0SUFXMFEvb1IvUXp1aXBkbGo2UVBwSStsajZSCkZxVFBwRVhwTytrbjZacjBtL1NuOUpkMFhmb2IxK0VHTE9NMjNJNjdjRGZlaFFmd1FUeUpOWnpCZVZ6RUpjengKNC9oSi9BeCtGbC9BczNnZXY0UmZ4cGZ3ZS9pcktzc1NxcjNPTS9DZmdaZitBWHNVbFRRPcxmgcUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAjfaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+CiAgICAgICAgIDx0aWZmOkNvbXByZXNzaW9uPjE8L3RpZmY6Q29tcHJlc3Npb24+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjE0NDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+MTQ0PC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpQaG90b21ldHJpY0ludGVycHJldGF0aW9uPjI8L3RpZmY6UGhvdG9tZXRyaWNJbnRlcnByZXRhdGlvbj4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjM0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6VXNlckNvbW1lbnQ+QUFBRTQzamFiVk5iYkJ0RkZMMnprN1pKMnNTYnBJODBmVzJKQXltbHhXa0REUzZQT0UzVGhqWnUwN1VUSjdGciYjeEE7eHV1eHZmVjYxK3lPMDdwV3BQbEFCU0g0NEt2UUR5Q0pFQlFoWGlvVklBRkNOSUFRQ3VCRWdJUUFWWHowQi9HQiYjeEE7a0JDcWtKaTFyVkpRWjdUYWUrL01uWHZ1bVRPSnZLRTd6T2RiUmhLdVc3RnlWV1BFTzAxdFI3Zk1DUyt4dFl3dSYjeEE7dkpDWFdmbUkxMHFjb2hweldnR2RlekV1ZTRMcUVWcWt5VUJ0MHpmMURTSGJzaGhIYjhqYlY2L3B1djJPN2gxMyYjeEE7N3J4cjErNjc3OWwvZi8vZ3cwZEdUMHhPblNRMGRTcVhaNFd3MXl3WXhsSlRzMGZ1OEk0SDFkMVpXblFteGI5VyYjeEE7Wk15ckdjUnhMcmEwdHExZHQzNUQrMFl1Y2N6citBcStrcS9pOWJ5Qk4xN2N0SG5MMW0zSzl0czYrV3EraGpkeiYjeEE7RDIvaEhYd1QzOEszY2lXU0lBNDFkSk9HTmN1dzdGRE9TdEl3MDVsQkkzbWJrbHpDb0xFY1NadDZTdGNJRSsyRyYjeEE7a29SUjBWYUNhTm0wYlJYTTVBRTNjZEt4Q3JaR1EvUU02NFRhV1BMMWVQYnM3UTBIMVJPSEJxSkJ0YkpSelJPTiYjeEE7RHZrVU1VRkd2S2w4Nzc2Kyt5YXJiWmdrUnlOVmt6cmp0WVM1UG44a3FCNnI5Q3ZYbFQwUFBQalFoQ0RBWWJadSYjeEE7cHJsOFhCd1FHS2p3UEZKZ1JPQlZLeXZ6Z1FOdVh0VlpPdWdaT25SNCtJWXZ3QVNZc0JJRlJoM2V5amZ5dHJoYyYjeEE7amlZdHJaQ2pKcXNnbU9yeDVWbXNSR3ltYXdhZGFZd1dIQ3F3WjBtYVRnblR4ZXJFU2hYV1pwUXVFVWtxS2NzVyYjeEE7bjhtVVN2VG1qQkxKT1U0eGx4QTdjNFJsblArdnVjRmJyVTBWV0tvdlZ0TE52RUJxYXRWQ3FZS2hNRXRoeFR4ViYjeEE7a3JvdGVER0t3aUNhclF1c2lwWWhOdEdZVUdlaks1eWp3ZU96STN6dDdERytqcmVQQmRVaEFYQlpEWVU5WStPUiYjeEE7Q2VHcitsa3FpRWtOR1NUdENEOG9HdXZzNzY1ZW9Teno5WHpEMklobEVzMFNURWRqdFJQbW9uN2h4aDhSVEE3cSYjeEE7bWlzTVloZm40bTR3b2NYbDFwc0lUbFk1bjB2NmJ4bnY3QitvMWlxblBSbmQxVGpUQllMQWxZVmZsSUUvUnZsbSYjeEE7Y1dUV0VHVUhoZkRtc241WFZlYmUzcUVlUlV6Z1RlN2RQbnA0bUc5emJ6RWF6UkJXaXJJTVpXUkdKRTZmanN0dCYjeEE7TjVUeEw5TDU2YmdmNnFFRk9zQUxPMkFQN0lOaE9BcWpvTUpwbUlISDRDazREOC9ESy9BcXZBYXZ3NXZ3Tmx5QyYjeEE7eS9BdXZBOVg0RlA0SEw2QUwyRVJ2b1l5TE1PMzhEMWNoV3Z3Sy93TzExRURha1lLMm9sNjBYNFVRRUVVUnVObyYjeEE7QXAxRU9yTFJXVFNEenFFbjBOUG9QSG9PWFVBdm9MZlFPK2hEdElBVzBRL29SL1F6dWlwZGxqNlFQcEkrbGo2UiYjeEE7RnFUUHBFWHBPK2tuNlpyMG0vU245SmQwWGZvYjErRUdMT00yM0k2N2NEZmVoUWZ3UVR5Sk5aekJlVnpFSmN6eCYjeEE7NC9oSi9BeCtGbC9BczNnZXY0UmZ4cGZ3ZS9pcktzc1NxcjNPTS9DZmdaZitBWHNVbFRRPTwvZXhpZjpVc2VyQ29tbWVudD4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjcwPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CvXptlIAAAcPSURBVHgB7VxbbBRVGC53DBVrAa1Q0sEbEgldAdMqUkaEKDHBPqgh8sCq8fLgpYpGjYldEq0vmoC8GKMu3kLlwag1ojZmFxu1GtRW0YBgd9EqGFppsVZpa1fN/38lPTtnzjmzM3up7cP+c/7zX785c25zpkVFBfG31qYw/0wRPZYgujhE9H/zu9qmVPsZiJRAf2VgFl00xiFZxUD8IQAgAoLyLwzMhWMNmJUMRJ8mEAAEtJOBOc8q8BZzeTUl8LsCiJejJLc7RhRAiPQwA2NZJFcwv1UMRK8EiGHmPxwZndKkSVR+LkpUBATlDgZmfvlo/bwrXcpA9EiAOMn8jWG90B+LkByAEOlBBmZuvgGzlIfJ4xygGDgAutLWA0KUujlMnEEJ0PvZb1mZqJnlcoiB6JYA8SPz/ZpXXFNLCcr6pG/Z35zZWQYC7o5KgGhjflBNeRnfCJn/d2KIMMv0gTpyiEfkAw7k9JnZCWSBRX4O8A3AjPdqm/g5+8WoMmVKbkIo5UdkzM9scwPvuNdxBMYRGEdARGCCyMjP8tSpFNf8uUSHOczkYbrAcM7ssUMwLD7I85aveL6CRR4SB8U2wScst55nqAWLyMSJFPo9DMBvPHFCwl7pG1GyO21agUAziydI7/OdlSWOtc+T9ZRYjU30Yt4Ze40Tl+m/yvV5C0s5L787EhSiLBFMsc9XbAliXwRrIpm928J5BglaxHcKIL6MUeBnlpglgJYjAwSr6Zw/QsXFlNhnnKgsYOyDnGuZASFK4/WEzA/2S0S9wMsYJrGqlQUIfq1Po4PKX2M08NSdHWxlx0hYRnf6HODT9RSPzB/e40zI1vxrBe+V/p1yDww7WfN83uN8NOLuF0DJd+Z4HkBmvP9On066L+wkqjLbsIXkfu707tNJs7/HiZvOW22n84ijilymJ/C3PESMhZZQIRS7k8TY/pRQ4VNxUNNOVaVMMENAlvMjsjkiczCav/UlKvf1jeb7VTpN01C5pSloKtYSIw08mzKKYfUMw/mFaTyRiF48eE+Tbt9jC8HL6CvsdJNOnGcjxO3VfMadbOjwzqnQkSoqmqEnpi/VrNky0GKy9VZetTZCPN8n9HN1lcSuOQyr6KcMnKtRHyuRqCouHJ/I2HWTYcu4sy5jl1oGMOwPpkhcBci+TFvIkpCeIwQywIGZLtK0sncQwmgH/yoa5xubbkqzUw1fl67qxmmJU+3xgDtRxBBSbBNADrQriSuRKgDBjtaNYVHRvdz0lnu937WXrDKzeEwqrgCkpoY051lSC44VTW86sgNjXmaZmfbcQjZsMnN0IEnyPzA10zaXxn7LEttMt5N369O1JC0EL6OvN3TUHE93ESSnajlZ5xNW2q4+b5OJSgBZey0pzLJkis785iz3HSts5zhk3H6u+GafTGKyc8VV0tWgszy4t95LVzcYjkrQN6W6SwfY/SJOV0ND4IhUAki1LQrqldd71NOznrlUa1xlQ3hk0HcstVWKhVnf2q6KW2ghlctIgTfAVNoj9fffR5dt0s5qRNSXi4Z6MmPaklv3Grq/q44UVFNf1A+lSH5mls6KIZ29MbM49ReZwiNTbdiZtscpsBMnEGqwtKSE7IdsMz+N2qOfAMhiQ0cfxc0Cy1Qa383ozjuG2eGuRl3PAiBzdPVYrkXZSRkaVIivMxzO98TJ4JGjCsOyapwxRx+hon6/V5HFhRdLRxIkoYoL9beHZRYVfByghSEV7eLAFGZ9qzbdqcN+DF6y6wfCj8zsUn2V/yS/TprJZyp90x1mFl7ZQfLdXWZ6I9L4XEPVMlCPd7cjBgK6wPkP2Vl1xAOKV6gXGG4YnQqfW0ip4UzsUJY60zUrKdSzrVMhu13t2kG1B/e7SbnVMSAn3WQc6n5KOjADYN2ySc9oisUatunJK6VwZgtNT0XxIZDSsEeBBRYpYiasiuftmEdHMrWzyqhG5Rj1FZbMkj/8Z6J68aDPwHcx/nj/1wo6LzhA4jIa1JdIOKeq+71u4J276owWAELgvt0RNvREPV3Aj4x2JEhuRrHfEQj2PuZnURYI+H5/xIdHEF86wY+MrrGFwIMqPhIhy7JAwF/oeZx3jvx1zT7jRZZzthIAF2evkLiMrrb9cW6zHZkf8A/xI4Llvz/eDawkOAAEJNLNvJFkYHKUKDplfKsv2kcZi7lMz6+Ocu6loBr2Pox5sVpUhFejqvOkvSmyXxny5sd3LZwx/4sDwx0DxWpSd7TB5vXzUQoVdkQKfzih5HtimRp8vN49AZzYmSxsVsMvHo09MXc7OIO2rhaaeUqRKL4/Ee8oytj03cYtAP/OQvafYaDXnqDEva9OcwQcmvx2Tlj3pA4SB8XE727ulAF4jtJycOvxzDf6mI0byOaiCqKYYPWwq2SSLt7jXe/d71J5YIAF8o78Axuajf6pP+ghAAAAAElFTkSuQmCC;" parent="1" vertex="1"> - <mxGeometry x="462" y="546" width="7" height="14.42" as="geometry" /> + <mxGeometry x="315" y="658" width="7" height="14.42" as="geometry" /> </mxCell> - <mxCell id="hdwB_MQwIhiL4xS-3u5l-30" value="Physics/ECM" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-30" value="Physics-based" style="rounded=1;whiteSpace=wrap;html=1;strokeColor=#585858;" parent="1" vertex="1"> <mxGeometry x="185" y="829" width="90" height="40" as="geometry" /> </mxCell> - <mxCell id="hdwB_MQwIhiL4xS-3u5l-31" value="Empirical" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-31" value="Empirical" style="rounded=1;whiteSpace=wrap;html=1;strokeColor=#585858;" parent="1" vertex="1"> <mxGeometry x="385" y="829" width="90" height="40" as="geometry" /> </mxCell> - <mxCell id="hdwB_MQwIhiL4xS-3u5l-32" value="Data-Driven" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-32" value="Data-driven" style="rounded=1;whiteSpace=wrap;html=1;strokeColor=#585858;" parent="1" vertex="1"> <mxGeometry x="285" y="829" width="90" height="40" as="geometry" /> </mxCell> - <mxCell id="hdwB_MQwIhiL4xS-3u5l-34" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=0;exitDx=0;exitDy=0;" parent="1" source="hdwB_MQwIhiL4xS-3u5l-30" edge="1"> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-34" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=0;exitDx=0;exitDy=0;strokeColor=#585858;" parent="1" source="hdwB_MQwIhiL4xS-3u5l-30" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="212" y="801" as="sourcePoint" /> <mxPoint x="271" y="738" as="targetPoint" /> </mxGeometry> </mxCell> - <mxCell id="hdwB_MQwIhiL4xS-3u5l-35" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=0;exitDx=0;exitDy=0;" parent="1" source="hdwB_MQwIhiL4xS-3u5l-31" edge="1"> + <mxCell id="hdwB_MQwIhiL4xS-3u5l-35" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=0;exitDx=0;exitDy=0;strokeColor=#585858;" parent="1" source="hdwB_MQwIhiL4xS-3u5l-31" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="482" y="849.62" as="sourcePoint" /> <mxPoint x="393" y="736" as="targetPoint" /> </mxGeometry> </mxCell> - <mxCell id="hdwB_MQwIhiL4xS-3u5l-40" value="" style="endArrow=classic;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" edge="1"> - <mxGeometry width="50" height="50" relative="1" as="geometry"> - <mxPoint x="47" y="699" as="sourcePoint" /> - <mxPoint x="110" y="699" as="targetPoint" /> - </mxGeometry> - </mxCell> - <mxCell id="hdwB_MQwIhiL4xS-3u5l-41" value="Excitation" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;flipH=1;" parent="1" vertex="1"> - <mxGeometry x="39" y="674" width="60" height="30" as="geometry" /> - </mxCell> <mxCell id="hdwB_MQwIhiL4xS-3u5l-43" value="" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/png,iVBORw0KGgoAAAANSUhEUgAAACYAAAAiEAYAAABjPHf7AAAKqGlDQ1BJQ0MgUHJvZmlsZQAASImVlwdQU+kWgP9700NCS4h0Qm/SWwApIbTQpYOohCRAKCEGgogdWVyBtSAighVdEFFwVYosNkSxLQKKXRdkEVHWxYINlXeBIbj75r0378ycOd899/znP+ef+8+cCwBZniMSpcHyAKQLs8ShPh706JhYOm4YQEANEAAJQBxupogZEhIAEJm1f5f3d5BoRG6ZTeX69/f/VRR4/EwuAFAIwgm8TG46wqcQfcEVibMAQO1H/LrLs0RT3IEwVYwUiPC9KU6a4dEpTphmNJiOCQ9lIUwFAE/icMRJAJDoiJ+ezU1C8pDcEbYU8gRChEUIu6anZ/AQPo6wERKD+EhT+RkJ3+VJ+lvOBGlODidJyjO9TAveU5ApSuOs+D+P439Leppkdg8DREnJYt9QxCoiZ3YvNcNfysKEoOBZFvCm46c5WeIbMcvcTFbsLPM4nv7StWlBAbOcKPBmS/NkscNnmZ/pFTbL4oxQ6V6JYhZzljniuX0lqRFSfzKfLc2fmxweNcvZgsigWc5MDfOfi2FJ/WJJqLR+vtDHY25fb2nv6Znf9StgS9dmJYf7SnvnzNXPFzLncmZGS2vj8T295mIipPGiLA/pXqK0EGk8P81H6s/MDpOuzUI+yLm1IdIzTOH4hcwyYIEMkIaoGNBBAPLkCUAWPydrqhFWhmiFWJCUnEVnIjeMT2cLuebz6daW1jYATN3Xmc/hLW36HkK0a3O+vIMAuLhOTk62zfn8hwA4OQYA8fGczwg5I9leAK6UciXi7Bnf9F3CACKQA1SgAjSBLjACZsAa2ANn4A68gB8IBuEgBiwBXJAM0pHKl4NVYD0oAEVgK9gBKsA+cBAcBsfACdAM2sAFcBlcB92gDzwE/WAIvARj4D2YgCAIB5EhCqQCaUH6kClkDTEgV8gLCoBCoRgoHkqChJAEWgVtgIqgEqgCOgDVQr9Ap6EL0FWoB7oPDUAj0BvoM4yCSTAV1oANYAuYATNhfzgcXgwnwcvgXDgf3gyXw1XwUbgJvgBfh/vgfvglPI4CKBkUDaWNMkMxUCxUMCoWlYgSo9agClFlqCpUPaoV1Ym6hepHjaI+obFoCpqONkM7o33REWguehl6DboYXYE+jG5Cd6BvoQfQY+hvGDJGHWOKccKwMdGYJMxyTAGmDFONacRcwvRhhjDvsVgsDWuIdcD6YmOwKdiV2GLsHmwD9jy2BzuIHcfhcCo4U5wLLhjHwWXhCnC7cEdx53C9uCHcR7wMXgtvjffGx+KF+Dx8Gf4I/iy+Fz+MnyDIE/QJToRgAo+wgrCFcIjQSrhJGCJMEBWIhkQXYjgxhbieWE6sJ14iPiK+lZGR0ZFxlFkoI5BZJ1Muc1zmisyAzCeSIsmExCLFkSSkzaQa0nnSfdJbMplsQHYnx5KzyJvJteSL5Cfkj7IUWXNZtixPdq1spWyTbK/sKzmCnL4cU26JXK5cmdxJuZtyo/IEeQN5ljxHfo18pfxp+bvy4woUBSuFYIV0hWKFIwpXFZ4r4hQNFL0UeYr5igcVLyoOUlAUXQqLwqVsoByiXKIMUbFUQyqbmkItoh6jdlHHlBSVbJUilXKUKpXOKPXTUDQDGpuWRttCO0G7Q/s8T2Mecx5/3qZ59fN6531QVlN2V+YrFyo3KPcpf1ahq3ippKpsU2lWeayKVjVRXai6XHWv6iXVUTWqmrMaV61Q7YTaA3VY3UQ9VH2l+kH1G+rjGpoaPhoijV0aFzVGNWma7popmqWaZzVHtCharloCrVKtc1ov6Ep0Jj2NXk7voI9pq2v7aku0D2h3aU/oGOpE6OTpNOg81iXqMnQTdUt123XH9LT0AvVW6dXpPdAn6DP0k/V36nfqfzAwNIgy2GjQbPDcUNmQbZhrWGf4yIhs5Ga0zKjK6LYx1phhnGq8x7jbBDaxM0k2qTS5aQqb2psKTPeY9szHzHecL5xfNf+uGcmMaZZtVmc2YE4zDzDPM282f2WhZxFrsc2i0+KbpZ1lmuUhy4dWilZ+VnlWrVZvrE2sudaV1rdtyDbeNmttWmxe25ra8m332t6zo9gF2m20a7f7au9gL7avtx9x0HOId9jtcJdBZYQwihlXHDGOHo5rHdscPznZO2U5nXD6y9nMOdX5iPPzBYYL+AsOLRh00XHhuBxw6Xelu8a77nftd9N247hVuT1113XnuVe7DzONmSnMo8xXHpYeYo9Gjw8sJ9Zq1nlPlKePZ6Fnl5eiV4RXhdcTbx3vJO867zEfO5+VPud9Mb7+vtt877I12Fx2LXvMz8FvtV+HP8k/zL/C/2mASYA4oDUQDvQL3B74KEg/SBjUHAyC2cHbgx+HGIYsC/l1IXZhyMLKhc9CrUJXhXaGUcKWhh0Jex/uEb4l/GGEUYQkoj1SLjIusjbyQ5RnVElUf7RF9Oro6zGqMYKYllhcbGRsdez4Iq9FOxYNxdnFFcTdWWy4OGfx1SWqS9KWnFkqt5Sz9GQ8Jj4q/kj8F04wp4oznsBO2J0wxmVxd3Jf8tx5pbwRvgu/hD+c6JJYkvg8ySVpe9JIsltyWfKogCWoELxO8U3Zl/IhNTi1JnUyLSqtIR2fHp9+WqgoTBV2ZGhm5GT0iExFBaL+ZU7LdiwbE/uLqzOhzMWZLVlUZDC6ITGS/CAZyHbNrsz+uDxy+ckchRxhzo0VJis2rRjO9c79eSV6JXdl+yrtVetXDaxmrj6wBlqTsKZ9re7a/LVD63zWHV5PXJ+6/rc8y7ySvHcboja05mvkr8sf/MHnh7oC2QJxwd2Nzhv3/Yj+UfBj1yabTbs2fSvkFV4rsiwqK/pSzC2+9pPVT+U/TW5O3Ny1xX7L3q3YrcKtd7a5bTtcolCSWzK4PXB7Uym9tLD03Y6lO66W2Zbt20ncKdnZXx5Q3rJLb9fWXV8qkiv6Kj0qG3ar7960+8Me3p7eve576/dp7Cva93m/YP+9Az4HmqoMqsoOYg9mH3x2KPJQ58+Mn2urVauLqr/WCGv6D4ce7qh1qK09on5kSx1cJ6kbORp3tPuY57GWerP6Aw20hqLj4Ljk+Itf4n+5c8L/RPtJxsn6U/qndjdSGguboKYVTWPNyc39LTEtPaf9Tre3Orc2/mr+a02bdlvlGaUzW84Sz+afnTyXe278vOj86IWkC4PtS9sfXoy+eLtjYUfXJf9LVy57X77Yyew8d8XlSttVp6unrzGuNV+3v950w+5G4292vzV22Xc13XS42dLt2N3as6DnbK9b74Vbnrcu32bfvt4X1NdzJ+LOvbtxd/vv8e49v592//WD7AcTD9c9wjwqfCz/uOyJ+pOq341/b+i37z8z4Dlw42nY04eD3MGXf2T+8WUo/xn5Wdmw1nDtc+vnbSPeI90vFr0Yeil6OTFa8KfCn7tfGb069Zf7XzfGoseGXotfT74pfqvytuad7bv28ZDxJ+/T3098KPyo8vHwJ8anzs9Rn4cnln/BfSn/avy19Zv/t0eT6ZOTIo6YMz0KoBCFExMBeFMDADkGAEo3Mj8smpmnpwWa+QeYJvCfeGbmnhZ7AOoRMzUWsc4DcBxRA0TJiE6NROHuALaxkers7Ds9p08JFvlj2W87Rb20nHXgHzIzw39X9z8tmMo6vfxv9l8BhAf7uiw5BAAABdRlWElmTU0AKgAAAAgABgEGAAMAAAABAAIAAAESAAMAAAABAAEAAAEaAAUAAAABAAAAVgEbAAUAAAABAAAAXgEoAAMAAAABAAIAAIdpAAQAAAABAAAAZgAAAAAAAACQAAAAAQAAAJAAAAABAAOShgAHAAAFRAAAAJCgAgAEAAAAAQAAACagAwAEAAAAAQAAACIAAAAAQVNDSUkAAABBQUFFMkhqYWJWTmRiQlJWRkQ1MzdnSnRvZDFweTA4cGY0UGRhaEhCTFZTcGl6L2RVZ29WdWxCbXQ5MytMT3ZkCjJidmJvYk16Njh5ZHdySnBjaDhNR0tNUFBxRThxRzFqdE1iVW55Z3hKbXFNQlluUlJ0dEdUWXdhbm5neFB2aGkKRERIeHp1NEcwVEEza3pubjNIUHUrYzUzdjBubERkMWh3ZUFLa3JCdjFlbzFOZkhBSkxVZDNUS0hBOFRXeG5YaApSUVBNeXNjRFZ1b00xWmpUQU9qQ2EwblpIMUdQMFFKTmh5dEozMVZWUjIzTFloeTlJKzljdTY3MTN2dmFkdDIvCis0RTlleDk4Nk9DalhUMVBIaHM0TlRKNm10RE1tVnlldWJHQTZSckdjbTJkWDI0T0RFWFV2Uk8wNEl5SWI2WEoKWUVBemlPUE0xVGMwcnQrd2NWUFRaaTV4ekgxOEZWL04xL0FxWHMxcjVyWnMzYlo5aDdMem5oYStscS9qZGR6UAo2M2t6MzhLMzhlMWNpYWVJUXczZHBESE5NaXc3bXJQU05NWjBadEI0M3FZa2x6Sm9Ja2V5cHA3Uk5jTEV1TkUwCllWU01sU0xhUk5hMlhETjl5Q3NjY1N6WDFtaVVubU10VUhtV2crMytmZnM3WWhIMTFKSHVzWWhhU2xUelJLTzkKUVVVc2tCR3ZYWHI0UU9jakkrVXhUSktqOGJKSm5hRkt3VXhuS0I1UlQ1VG1sWDFML3NjZWYySllFT0F3V3plegpYRDRwRGdoM2wzanVkeGtSZU5YU3ptejRrRmRYZHBZUCszdVBITzI3N1Fzd1lTYXNsTXVvd3h2NFp0NllsSmZHCjBwYm01cWpKU2doRzI0TjVsaWdTbSttYVFhZHF4bHlIQ3V3VEpFdEhoZWxoZFJMRkVtdFRTcXVJcEpXTVpZdlgKWkVvcGVtZEZrZVFjcDVCTGljd2NZZVBPLy9lODROMzJSbDJXNlV3VWRUTXZrSnBhdVZIR05SUm1LYXlRcDBwYQp0d1V2UmtFWVJMTjFnVlhSeG9sTk5DYlVXZU1KNTNqazVIUS9Yejk5Z20vZ1RZTVJ0VmNBWEZHak1mL2dVSHhZCitLcCtuZ3BpTXIwR3lUckNqNGpCV3JyYXlsY295M3dqM3pUWWI1bEVzd1RUWTRuS0NUTmpJZUVtbnhKTTl1aWEKSnd4aUYyYVNYakNsSmVXR093aE9sem1mU1lmdUdtL3A2aTczV3NyNngzVlA0MHdYQ01JTDEzekJiK1puK1ZaeAo1SVFoMnZZSTRjMU1oRHhWbWZzN2V0c1ZzWURYZW5mNzlORSt2c083eFFGWFpFK2VUY3FOdCtYd0w3elp5V1FJCnFxQWVtaUVBdTJBZkhJQStPQTREb01KWm1JSm40SG00QksvQW0vQVd2QTN6OEM2OER4L0FGZmdJUG9ZRnVBYlgKNFN2NEdoYmhXMWlDRmZnZWZvUWJjQk4rZ3ovZ0ZxcEdkVWhCdTFFSE9vakNLSUppYUFnTm85TklSelk2ajZiUQpCZlFzZWdGZFFpK2p5K2hWOUI3NkVIMktycUpGOUJQNkdmMktia2hYcEUra3o2VFBwUytrcTlLWDBxTDBnL1NMCmRGUDZYZnBUK2t1NkpmMk5mYmdheTdnUk4rRlczSWIzNEc1OEdJOWdEWS9qUEM3Z0l1YjRJbjRPdjRoZndwZngKTko3RnIrTTM4QnlleHd0bGFpVlUrU1hQd1g4ZWZQMGYzWnVRT0E9PRrZ8zAAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAjTaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+CiAgICAgICAgIDx0aWZmOkNvbXByZXNzaW9uPjE8L3RpZmY6Q29tcHJlc3Npb24+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjE0NDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+MTQ0PC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpQaG90b21ldHJpY0ludGVycHJldGF0aW9uPjI8L3RpZmY6UGhvdG9tZXRyaWNJbnRlcnByZXRhdGlvbj4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjM4PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6VXNlckNvbW1lbnQ+QUFBRTJIamFiVk5kYkJSVkZENTM3Z0p0b2QxcHkwOHBmNFBkYWhIQkxWU3Bpei9kVWdvVnVsQm10OTMrTE92ZCYjeEE7MmJ2Ym9iTXo2OHlkd3JKcGNoOE1HS01QUHFFOHFHMWp0TWJVbnlneEptcU1CWW5SUnR0R1RZd2Fubmd4UHZoaSYjeEE7RERIeHp1NEcwVEEza3pubjNIUHUrYzUzdjBubERkMWh3ZUFLa3JCdjFlbzFOZkhBSkxVZDNUS0hBOFRXeG5YaCYjeEE7UlFQTXlzY0RWdW9NMVpqVEFPakNhMG5aSDFHUDBRSk5oeXRKMzFWVlIyM0xZaHk5SSs5Y3U2NzEzdnZhZHQyLyYjeEE7KzRFOWV4OTg2T0NqWFQxUEhoczROVEo2bXRETW1WeWV1YkdBNlJyR2NtMmRYMjRPREVYVXZSTzA0SXlJYjZYSiYjeEE7WUVBemlPUE0xVGMwcnQrd2NWUFRaaTV4ekgxOEZWL04xL0FxWHMxcjVyWnMzYlo5aDdMem5oYStscS9qZGR6UCYjeEE7NjNrejM4SzM4ZTFjaWFlSVF3M2RwREhOTWl3N21yUFNOTVowWnRCNDNxWWtsekpvSWtleXBwN1JOY0xFdU5FMCYjeEE7WVZTTWxTTGFSTmEyWEROOXlDc2NjU3pYMW1pVW5tTXRVSG1XZyszK2ZmczdZaEgxMUpIdXNZaGFTbFR6UktPOSYjeEE7UVVVc2tCR3ZYWHI0UU9jakkrVXhUSktqOGJKSm5hRkt3VXhuS0I1UlQ1VG1sWDFML3NjZWYySllFT0F3V3pleiYjeEE7WEQ0cERnaDNsM2p1ZHhrUmVOWFN6bXo0a0ZkWGRwWVArM3VQSE8yNzdRc3dZU2FzbE11b3d4djRadDZZbEpmRyYjeEE7MHBibTVxakpTZ2hHMjRONWxpZ1NtK21hUWFkcXhseUhDdXdUSkV0SGhlbGhkUkxGRW10VFNxdUlwSldNWll2WCYjeEE7WkVvcGVtZEZrZVFjcDVCTGljd2NZZVBPLy9lODROMzJSbDJXNlV3VWRUTXZrSnBhdVZIR05SUm1LYXlRcDBwYSYjeEE7dHdVdlJrRVlSTE4xZ1ZYUnhvbE5OQ2JVV2VNSjUzams1SFEvWHo5OWdtL2dUWU1SdFZjQVhGR2pNZi9nVUh4WSYjeEE7K0twK25ncGlNcjBHeVRyQ2o0akJXcnJheWxjb3kzd2ozelRZYjVsRXN3VFRZNG5LQ1ROakllRW1ueEpNOXVpYSYjeEE7Snd4aUYyYVNYakNsSmVXR093aE9sem1mU1lmdUdtL3A2aTczV3NyNngzVlA0MHdYQ01JTDEzekJiK1puK1ZaeCYjeEE7NUlRaDJ2WUk0YzFNaER4Vm1mczdldHNWc1lEWGVuZjc5TkUrdnNPN3hRRlhaRStlVGNxTnQrWHdMN3paeVdRSSYjeEE7cXFBZW1pRUF1MkFmSElBK09BNERvTUpabUlKbjRIbTRCSy9BbS9BV3ZBM3o4QzY4RHgvQUZmZ0lQb1lGdUFiWCYjeEE7NFN2NEdoYmhXMWlDRmZnZWZvUWJjQk4rZ3ovZ0ZxcEdkVWhCdTFFSE9vakNLSUppYUFnTm85TklSelk2ajZiUSYjeEE7QmZRc2VnRmRRaStqeStoVjlCNzZFSDJLcnFKRjlCUDZHZjJLYmtoWHBF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;" parent="1" vertex="1"> <mxGeometry x="234" y="696" width="7.85" height="7.02" as="geometry" /> </mxCell> - <mxCell id="hdwB_MQwIhiL4xS-3u5l-78" value="" style="endArrow=classic;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" edge="1"> - <mxGeometry width="50" height="50" relative="1" as="geometry"> - <mxPoint x="47" y="725" as="sourcePoint" /> - <mxPoint x="110" y="725" as="targetPoint" /> - </mxGeometry> - </mxCell> - <mxCell id="hdwB_MQwIhiL4xS-3u5l-79" value="Design Space" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> - <mxGeometry x="20" y="700" width="86" height="30" as="geometry" /> - </mxCell> <mxCell id="hdwB_MQwIhiL4xS-3u5l-81" value="" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/png,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nhZ7AOoRMzUWsc4DcBxRA0TJiE6NROHuALaxkers7Ds9p08JFvlj2W87Rb20nHXgHzIzw39X9z8tmMo6vfxv9l8BhAf7uiw5BAAABehlWElmTU0AKgAAAAgABgEGAAMAAAABAAIAAAESAAMAAAABAAEAAAEaAAUAAAABAAAAVgEbAAUAAAABAAAAXgEoAAMAAAABAAIAAIdpAAQAAAABAAAAZgAAAAAAAACQAAAAAQAAAJAAAAABAAOShgAHAAAFWAAAAJCgAgAEAAAAAQAAAQagAwAEAAAAAQAAAEoAAAAAQVNDSUkAAABBQUFFNjNqYWJWTmRiQlJWRkQ1M2JpbHRvZDFweTA4cGY0UGRhaXNXMjFLbEZuKzZwUlFxZFBtWjNYYmI3ckxlCm5iMjdPK3pzekRwenQ3QnNtOXdIZzhiSUEwOG9EMnJiR01VWS82TEVHSDlDQkRScUdtMGJJU0ZxZU9MRitPQ0wKTWNURU83c2JSTVBjVE9hY2MrODU1enZmL1NhV05YU0hkWFl1SXdsWHJLaGNXUlB5VGxIYjBTMXozRXRzTGFVTApMK0JsVmpia3RXTEhxY2FjQmtDblg0L0tIcjk2Z09acDNGYys5R05WZGNDMkxNYlJlL0syVmF0YjczK2dyZjNCCjdROTE3SGo0a2QyUDl3OCtmZURJMFluSlk0UW1qbWV5TEJmMG1qbkRXS3F0ODhqTjNqRy91aU5OODg2RStKYWIKakhvMWd6ak9oZnFHeGpWcjE2MXYyc0Fsam5rRlg4RXIrVXBleGF0NXpZV05telp2MmFwc3U2K0ZyK0tyZVIzMwo4SHJlekRmeXpYd0xWMEl4NGxCRE4ybFFzd3pMRG1Tc09BMHluUmswbExVcHljUU1Hc21RcEtrbmRJMHdNVzRnClRoZ1ZZOFdJbGs3YVZzNk03M0VUSnh3cloyczBRRSt5RmlnL1M1MWRudTZkUFVHL2VuVGZRTml2RmcrcVdhTFIKb1U1RkxKQVJyMTE4ZEZmdll4T2xNVXlTb2FHU1NaMnhjc0pjYjEvSXJ4NHF6aXRYTEhxZWVQS3BjVUdBdzJ6ZApUSEw1c0NqZ0d5anlQSkpqUk9CVml6dnp2ajF1WHNsWjJ1c1oycmQvK0k0dndQaVlzR0k1UmgzZXdEZnd4cWk4CkdJNWJXaTVEVFZaRU1OblZtV1dSQXJHWnJobDBwaWFjYzZqQW5pWkpPaWxNRjZzVEtSUlptMUZhUlNTdUpDeGIKdkNaVGl0RzdNd29rNHpqNVRFeWN6QkNXY3Y2LzV3YnZ0VGVaWTRuZVNFRTNzd0twcVpVYUpYS0d3aXlGNWJOVQppZXUyNE1YSUM0Tm90aTZ3S2xxSzJFUmpRcDAxcm5BTytnL1BqdkExczRmNFd0NDA2bGVIQk1CbE5SRDBqSTZGCnhvV3Y2cWVvSUNZeFpKQ2tJM3kvR0t5bHY2MTBoYkxNMS9IMW95T1dTVFJMTUIyT2xDdk1oZnVFRzMxR01EbW8KYTY0d2lKMmZpN3JCbUJhVkcrNGlPRjdpZkM3ZWQ4OTRTLzlBcWRkaTBwUFNYWTB6WFNEd1hiNWEyUjYvL2gzZgpKRXFtRGRGMlVBaHZMdDNucXNyYzJUUFVwWWdGdk5hOTIyZjNEL090cFZ0c21KNVd3aW5DQ3ZrWnBVUEpUMDlICnUwV0JxUk5SdWZHT1F2NUZQRDhWN1lNcXFJZG04RUk3ZE1NdUdJYURjQVJVT0FFejhCeThCT2ZnVlhnTDNvWjMKNEYxNEh6NkVqK0FpZkFLZndtVzRDdC9BdC9BOUxNQVBzQWpMOEJOY2g1dHdDMzZEUCtBMnFrWjFTRUhiVVEvYQpqWHpJajRKb0RJMmpZMGhITmpxRlp0QnA5QUk2Zzg2aFY5QjU5QnI2QUgyTXZrQlgwQUs2Z1g1R3Y2S2Iwa1hwCmMrbEw2WkwwbFhSRitscGFrSzVKdjBpM3BOK2xQNlcvcE52UzM3Z0NWMk1aTitJbTNJcmJjQWNld0h2eEJOWncKQ21keEhoY3d4OC9qRi9GWi9ESStqMmZ4UEg0RHY0ay93NWZ3dFJMYkVpci9wU2ZoUHcrKzhROGt4WmEwZJJWPgAAAAlwSFlzAAAWJQAAFiUBSVIk8AAACOhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDYuMC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHRpZmY6Q29tcHJlc3Npb24+MTwvdGlmZjpDb21wcmVzc2lvbj4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24+MTQ0PC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xNDQ8L3RpZmY6WVJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOlBob3RvbWV0cmljSW50ZXJwcmV0YXRpb24+MjwvdGlmZjpQaG90b21ldHJpY0ludGVycHJldGF0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+MjYyPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6VXNlckNvbW1lbnQ+QUFBRTYzamFiVk5kYkJSVkZENTNiaWx0b2QxcHkwOHBmNFBkYWlzVzIxS2xGbis2cFJRcWRQbVozWGJiN3JMZSYjeEE7bmIyN08renN6RHB6dDdCc205d0hnOGJJQTA4b0QycmJHTVVZLzZMRUdIOUNCRFJxR20wYklTRnFlT0xGK09DTCYjeEE7TWNURU83c2JSTVBjVE9hY2MrODU1enZmL1NhV05YU0hkWFl1SXdsWHJLaGNXUlB5VGxIYjBTMXozRXRzTGFVTCYjeEE7TCtCbFZqYmt0V0xIcWNhY0JrQ25YNC9LSHI5NmdPWnAzRmMrOUdOVmRjQzJMTWJSZS9LMlZhdGI3MytncmYzQiYjeEE7N1E5MTdIajRrZDJQOXc4K2ZlREkwWW5KWTRRbWptZXlMQmYwbWpuRFdLcXQ4OGpOM2pHL3VpTk44ODZFK0phYiYjeEE7akhvMWd6ak9oZnFHeGpWcjE2MXYyc0Fsam5rRlg4RXIrVXBleGF0NXpZV05telp2MmFwc3U2K0ZyK0tyZVIzMyYjeEE7OEhyZXpEZnl6WHdMVjBJeDRsQkROMmxRc3d6TERtU3NPQTB5blJrMGxMVXB5Y1FNR3NtUXBLa25kSTB3TVc0ZyYjeEE7VGhnVlk4V0lsazdhVnM2TTczRVRKeHdyWjJzMFFFK3lGaWcvUzUxZG51NmRQVUcvZW5UZlFOaXZGZytxV2FMUiYjeEE7b1U1RkxKQVJyMTE4ZEZmdll4T2xNVXlTb2FHU1NaMnhjc0pjYjEvSXJ4NHF6aXRYTEhxZWVQS3BjVUdBdzJ6ZCYjeEE7VEhMNXNDamdHeWp5UEpKalJPQlZpenZ6dmoxdVhzbFoydXNaMnJkLytJNHZ3UGlZc0dJNVJoM2V3RGZ3eHFpOCYjeEE7R0k1YldpNURUVlpFTU5uVm1XV1JBckdacmhsMHBpYWNjNmpBbmlaSk9pbE1GNnNUS1JSWm0xRmFSU1N1SkN4YiYjeEE7dkNaVGl0RzdNd29rNHpqNVRFeWN6QkNXY3Y2LzV3YnZ0VGVaWTRuZVNFRTNzd0twcVpVYUpYS0d3aXlGNWJOVSYjeEE7aWV1MjRNWElDNE5vdGk2d0tscUsyRVJqUXAwMXJuQU8rZy9QanZBMXM0ZjRXdDQwNmxlSEJNQmxOUkQwakk2RiYjeEE7eG9XdjZxZW9JQ1l4WkpDa0kzeS9HS3lsdjYxMGhiTE0xL0gxb3lPV1NUUkxNQjJPbEN2TWhmdUVHMzFHTURtbyYjeEE7YTY0d2lKMmZpN3JCbUJhVkcrNGlPRjdpZkM3ZWQ4OTRTLzlBcWRkaTBwUFNYWTB6WFNEd1hiNWEyUjYvL2gzZiYjeEE7SkVxbURkRjJVQWh2THQzbnFzcmMyVFBVcFlnRnZOYTkyMmYzRC9PdHBWdHNtSjVXd2luQ0N2a1pwVVBKVDA5SCYjeEE7dTBXQnFSTlJ1ZkdPUXY1RlBEOFY3WU1xcUlkbThFSTdkTU11R0lhRGNBUlVPQUV6OEJ5OEJPZmdWWGdMM29aMyYjeEE7NEYxNEh6NkVqK0FpZkFLZndtVzRDdC9BdC9BOUxNQVBzQWpMOEJOY2g1dHdDMzZEUCtBMnFrWjFTRUhiVVEvYSYjeEE7alh6SWo0Sm9ESTJqWTBoSE5qcUZadEJwOUFJNmc4NmhWOUI1OUJyNkFIMk12a0JYMEFLNmdYNUd2NktiMGtYcCYjeEE7YytsTDZaTDBsWFJGK2xwYWtLNUp2MGkzcE4rbFA2Vy9wTnZTMzdnQ1YyTVpOK0ltM0lyYmNBY2V3SHZ4Qk5adyYjeEE7Q21keEhoY3d4OC9qRi9GWi9ESStqMmZ4UEg0RHY0ay93NWZ3dFJMYkVpci9wU2ZoUHcrKzhROGt4WmEwPC9leGlmOlVzZXJDb21tZW50PgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+NzQ8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4Kr2v84wAAEtNJREFUeAHtnXuUFMUVh0eRCIi8RCQq0ijCiiYggkKMoTESiEJ4JD7jYyCJGsk5QHLUcIyykpOIjxxBNHrUsEPU+DyiURDksSOcKI8YwCj4ZBuVKBEJRFAQcEPOvZfd7u3qrp7pma6Z+e0fc7vuvVV1+6upntrq6upUCn8gAAIgAAIgAAIgEEKgGdlbtSI5+jySVVUkN9SR3LePZFKfpseXFBfUCwIgAAKmEjD9um16fKa2a+q2KRRafb1b3lBtRsimx2cGJUQBAiAAAuYQMP26bXp85rSkRHIwHfS0ReGWPbu600mlTI8vKS6oFwRAAARMJWD6ddv0+MxrVx4wdFBE1sFSGIqsNj2+IuNAdSAAAiBgPAHTr9umx2deA/OAwbzAEFEQgdMHkPUkXmsS5AsbCIAACIAACORPAAOG/BkWsYQhNlX20iskl75A8pQ+JPEJAiAAAiAAAoUhgAFDYbjGXOrZNhX4bC3JFiRSHS06WDyHJGYcGAwECIAACIBAzAQwYIgZaLzFDbKpvOd4oNBSUXwniwyLecahB25VKEhBDQIgAAIgkBsBDBhy41bgXGfZVMFcHijwNhmhtX7dIpclPHA4gdOhGeEAAiAAAiAAAoEEMGAIxFNs47d4MeM8HigcpgjgoQwZ5mf9HY6xSL+Ey7E47e8NLQiAAAiAAAiEEcCAIYxQUexn8EDhBV7M2NpTaz2nJ99MB5ePJTn8HJIPZEh6P4+zSCMDhy7Hej2QBgEQAAEQAAEdAhgw6FAqmE9/Higs4IFCG09NX3L6Mh4gTKt2O8iW3VeyfQoPKNxeqVQ3izRLlpE8GgMHAoFPEAABEAABTQIYMGiCitetLz8G+eKjVG5bT/HbOT1sMB08kmFFiJhaTQ7jeACx1+Pf3SKFDBw6d/Y4IAkCIAACIAACvgQwYPDFUihlHx4oLOTHINtZ7po+cCj97VNJ1mZJRv2syVCOEaNJ7vAU0NMixWKe2Tiyo8cBSRAAARAAARBwEcCAwYWj0In5PFDwbrm91qGaB5xF8vU18UQy/xkqx+YByGbHXW4vi9I1T7r1SIEACIAACICAmwAGDG4eBU7dMcNdwcIspc/qTfJfH7rtcaVe5QHIQL7F8bZDJe/iCmbeHFdNKAcEQAAEQKA8CRxSnqdl6lndMZ0iW7ac5D9eJblnT3EirnOonoH9SR7FtyLWv1mc+lELCIAACIBAqRLAgCGRllvBA4ZEKt9f6dYtVLPIpOJAvSAAAiAAAqVCALckSqWlECcIgAAIgAAIJEgAA4YE4aNqEAABEAABECgVAhgwlEpLIU4QAAEQAAEQSJAABgwJwkfVIAACIAACIFAqBLDoMdaWataMiutxIsnj+TXT7/FTCG+9Rfp6eTlErLWjMBAAgWIQQD8vBmXUYR4BDBjyapOjOlP2abeQvDBNsiWJJp+fOqRanCV51SSS27aRLPbn8RbVOGIUyZbtSL7wDMm1a0jiEwQqmQD6eSW3Ps69CYFl/Bpk+c9X5POsb5KhyArT4juXf2C38UyB8PLK3SH21cy32Fszn2NTA+5QxLeL9SfzDEmRmxvVgYARBNDP82sG067b3rMxPT5vvMmnsYYhUhsMscn9ad7iuS3n/orl76vpoHs3kq14BufPGUp7P/vYpHlpFcnmzb0ehUlnaqjcwxTFH8r6wcMUDlCDQBkTQD8v48bFqeVBAAMGLXhd+HXQT/GMgPygbnMo+7m85fINvMXye6yX108//mxwNSdZZB9zXrBfvlaZMTiG6wsrb1+YA+wgUEYE0M/LqDFxKgUggAGDFtQHHiK3Nh7va3iAsCDrMXiSLTxpVXLwSJUlHv2giDMGq5bHUy9KAYFSIIB+XgqthBiTI4ABQyD74bxWYajtdnsmQ+lHWbqtTVNVfZrq/DRdLD9tfLrv8Euuwkrczg6r+VZJmD/sIFDKBNDPS7n1EHvxCGDAEMj6pglu8w5OXj3ZrQ9LnT4ozIPsux09v1y9Btl6OZdlyU9uqejlghcIlCYB9PPSbDdEXWwCGDD4Eh84gNT9bbe5JkPpzR+79apUG76H4Z2hUPm/66gs+emrqih/Z0uvnNqQNRd6pcALBMwmgH5udvsgOtMIYMDg2yJjr/JVp+6+1V+v0o4cQ5YWKgeP/u9rPYqYkvawaAVls9H84Q0CpUgA/bwUWw0xJ0cAGze52B/MA6iRtkudWp2l9Nu8Y6Pbqk5deoXa1tiykxNzFzXWxndsa65dkKc+1rwWX90oCQRMI4B+Ti2Cfm7aN9Mdj+woOnQE6b/Hi+JPsyjdiWV7Sqa2snQcOqgTyf+IzplP+nci/o5Rrv9/YsDQwGL/UVUPSkpDiPHJl+RITx7Nj2HKBklhuZ7IkMdOWSQRliGiXXvtgkMFfyUbS0SsB+4gUAoE0M+pldDPzfy2yq2yex+l+HpbenEeyW49Ff7T7iQHearvrhmUnv8sSdl4kFJ+nxgwuKh8xj/Yu1n7JcvZD7rcQhOX/IhcdO/41MwOLTInB6xdyAkbMpU5AfTzMm/gEju99u0o4Nv5B31cmtIHec5DZoAXZcmwie2dWfaz6eAEixUeIeUNs8kgUm5BX3A+6T/Z4snoTZq+RWax4zuUd2bKdefF1+qIsIzYVHID+x0kLeltmDzTV0/Ui0PiO1Xz8c88wypadumIL9ZSlZuY9xf1lIaMxmEnc/uQOc6oKVpTFqQi9POCYD1QaLGv2wcq1jxIOj657i+opYDlOixSrlcXp8neQnMx3BEdyf9B7p9SXph8n/u1asBBpe7/TBrcgUAUB6bHJ2H35h/csIYR+9QpkrMw8jHNL8xW/qLIvd3CRFP8UkePojqFN2S8PL6qp/IO9+5oVvymLmqN6Od6uE2/bicd3+Rq4ui9Li2sJX1c7xi6NE3lqd4d5K1/Df8etGxF+Ro+defMG3LgKIDA+bwoJcDFZXrocVcy9oTu2oWlDlVdbvc0N30cO1IU2IjAZ3z8xeeNlBVwiH5eAY1cwFPsP4AK9/7D+I5D+h/wKwJCbw1oxvhwhhyvm6SXQdZM3Hit1x9rGLxE8kqPSetlX5Elv9xXqwbXE3XtQpYXvQSXWnrWlcsp5iGDSX6TZ4DatCu9czEhYlkLu9mhaJYx3717TYiueDGgnxePdTnWdOFQOivvz+/cDOllxi7ugfj9d1P54yeQ7GWRVH1emSbLVN5OYNcu9kx6akYVsOhNj++kKorUO7WjSl83Uc6sMDLq2oU+/ENamGhQKgiUBwH082jtaPp1O6n4XuZbDqrfB7lFfFqBrssXjKJ2VNXv1Y9h/1QKtySi9QCF9+iLFAaF+rn5CkNMat19F7Y6VOHatTFVjGJAoIwJoJ+XceMW4dRkkW1fO7iy9hbZr+OZgGDv6NaVa6Ll6dlH/DFgEBJ5ybMH6WWXrZ/Xv6nnn6uX9tqFLNUgI8pc60M+EKgEAujnldDKhTvHI3mjBH4IL7SiY61Ql5wcNm6kbLpLj6yuUg0GDEIiJ3kI34Q6w9bLPjer55erV0++NaL7zogsZhZyRY18FUQA/byCGruAp/rhh1T4JkevEvkHU89b30v+QdylGUfDAAcDBn3KPp69TyFlax+bn+rlAi8utAf41arW1WbVNlhAAASIAPo5vglxErhjBpVWryj0U4cMt7Ofwi1ntezT0MHSK2IDz0hga2g9XkqvqgP3dpQuLsOKiPeOXJk1ErbmrRH5Qv4TMwwaVOFS6QTQzyv9GxDv+U+fTuW9zE8Zncn/6DkO6efOI/mlbDVMydg+e/E/uroFvu2Ip/e5DtFDahE4qp2WW+oTh/w2stTLFd3LtvXyLM2Sn0xN6eWCFwhUJgH088ps90KftTz2LbLQ9Un5P7xCjoLlHjYvWyR+uCUhJHKSndrqZXvf0fPL1Svq2oVazCzkihr5KpAA+nkFNnoZnnIH3jL6p2m9k3ssQ36beO0FHqvU46b00t2v5hNlCfEYhg2LVo68bCRaLniDQGUSQD+vzHYvt7OeOJ7O6LCQE5OXL07jDZsa3DHD0MAih6O6A4tBgjPLDnnBXtGt8lzvrzSf193iUB2vY4YhOmzkqFgC6OcV2/RlceLy7pPrq/VO55eTyG9dk8f/MWDQI6jw2uAoDB51J086ruTM+6ikLpZeiVi7oMcJXiDQmAD6eWMaOC4VAvJ2y0fmUMRfCwk8kyGHP/KizKbuGDA0ZRJBs4afegjbAKO3TYV25HtIEarwdb1mIql/lvY1K5VYu6BEAwMIKAmgnyvRwGAgAXltduZeCu5kKzjIGRmyjxsX7Ic1DGF8Quz/2UYO91cHOzZn8+WXBvuprM2akeW3U0jOvFPlGazH2oVgPrCCgB8B9HM/KtCZSmDaTRTZhengCH/Ntx4mjiU/7afmknoJR/DpNFhNj++YYynWT+rc4KUBRH5ZT/YRoxrOLejoeIusS2tJSjlR5b85Lhl5BtUJGwiAgD8B9HN/Liqt6ddt0+NTcVXpb5lCFtXvwx7+/bkirSohTI99GMIIadnlsZPvjib3JXzP6AjLnV1mGp5m+4os2V9hKft0nG6T/myW3jtHz2XJPoLtlFJ/vpQlm3yR1J6wgAAIqAign6vIQJ8kgdt4oHBttX8U8pLBi3km4cWsv5+21vSRlunxeUHLzMBfasjyFY/s5Ac7qtzO+S9PU3nDeYZCt5zxvObBGyfSIAACuRNAPw9mZ/p12/T4gummUn/ggYLqd2BNHZXQzQorSdeOGQZdUpH8ZFX1JTyiu/Fmyt6vD8mTe5PsZZGUt5JtpWTqA4cOljxL8vlFJHfuIHlvDUndz3nP6HrCDwRAQJcA+rkuKfjFSWA6X/8npP1LfSJD+rG878LnYavy/YtRa00faZken5psYSwbeeSoGlmKflVtYepHqSAAAoUnUOr93PTrtunxyTdM1p7N5IGCXN9Fygz2DdWSIz958xTKP59/P87jGW08JZEf16Ln7sszFMdZelU/wTMUet7wAgEQMIEA+rkJrZB8DDJQuGcWxfKLtDumLzh5Aa+d+121255rSp6uGGpTCYN4RhwDhohEBeBjNZRxJY/AnuL0uQdGYhEL1nSfNEHPke9cpDIP6/nDCwRAoIEA+nkDCxwVn4AMFO7jgcLP0+4YNjuUtgeSfCqmW85t2lB5PSyS8rluoxyxNH1qJun4plQTKJkCUkmZGurHryv1YM45eSw/timPZarqF/3UKTlXhYwgULEE0M/jbfqkr9thZ2NafDJQeID/AZXrucj1dXRGlhV2ZrnZR/M/vFKfyNO9v2emgfOeblLxncq3APbWU0QCMEz+ptp7BvmlVV8gbxyyD0TbdvnVh9wgUEkE0M8L09pJXbd1z8aU+A7m5+ZnKQYKsg9P+wJd11u3JmKLa0l6f1cO55mHVApPSQR+t4byiIs3Wgz0bWyM6t84b+Nj26bUT9IkVZ/y3vLzx5LH9m0qT+hBAAS8BNDPvUSQLgYBGSjU/Ilqk8fmvXV3tUizfLXXopc+iN3kd0n2Azqc9W0tOhA/Vh94Wu+z/4oGAwYh4Su/0dVXHaqUjZJCHRUOLVuRQWYWvA3pzXY1DxSw9bOXDNIgEE4A/TycETziIyBb/c9+kMr8cTq47OOsYHuhrG843pK9Wwh67RWebhHx/BdmKcOyZREzsrvcw5p1Dym6W8Hl3FpN9lmZYD9YQQAE1ATQz9VsYImfwCzNgUL8NUcrcV3W648Bg5eIK/23ta5kk8Qu1tyVoYPz+fGWffuauAYqZKAwnVfFXpQOdE89nSH75KnBfrCCAAiEE0A/D2cEj/wJHNmRylDdesi/hnhLaPJ0BNYwBANekvW3r3NI37eK5O7d/n5hWlmcOHsOeY60g3PMz5L9Mt7BSxanBOeCFQRAIIgA+nkQHdjiIrB3L5Uk7wz6WlwFF6icdW8qCjZltagivFRS8cl//gsVq0fnsb4HDxxU8Yte1iZcM5E0YTu5ydMZk6vJX+KR8iBBAATyJyD9Cv08f5aNS0jqut04hqBj0+MLij0ZGxY9BnKX/+BHjSC3Bc+RPNMm+X2WQ9ZTemWW5AqWzS1Kn8iyH0vvWyzJq+GzNkvH108muWp5gw1HIAAC8RJAP4+XJ0orcwKmj7RMiU9uIdxTQ1+InfUk5YITVX7B+f/KMxXn2GX+RcPpgUAJEEA/j6eRTLluq87G9PhUcSenxwxDJPayv8F4fozxxmsp+8jhJLt3JdnNItmK5ccOpTdtJPnGGpILFpGUt1BSCp8gAAJJEkA/T5I+6jaXAA8YZOMfb6B7HK8mmbSp8W3dQjxqMslwQa0gAAKFJ4B+nhtjU6/bcjamxydxmiP5scqPHP+QPvJXF137keNfpSnx+UcHLQiAAAhULoGPHP9zN+W6bXp8/vQM0Mr7ruvqKJh3Wdq2AcHtD8H0+MyghChAAARAwBwCpl+3TY/PnJaUSP4HyiARXCXX284AAAAASUVORK5CYII=;" parent="1" vertex="1"> <mxGeometry x="518" y="660" width="41.49" height="11.72" as="geometry" /> </mxCell> - <mxCell id="hdwB_MQwIhiL4xS-3u5l-82" value="" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/png,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nhZ7AOoRMzUWsc4DcBxRA0TJiE6NROHuALaxkers7Ds9p08JFvlj2W87Rb20nHXgHzIzw39X9z8tmMo6vfxv9l8BhAf7uiw5BAAABdxlWElmTU0AKgAAAAgABgEGAAMAAAABAAIAAAESAAMAAAABAAEAAAEaAAUAAAABAAAAVgEbAAUAAAABAAAAXgEoAAMAAAABAAIAAIdpAAQAAAABAAAAZgAAAAAAAACQAAAAAQAAAJAAAAABAAOShgAHAAAFTAAAAJCgAgAEAAAAAQAAADygAwAEAAAAAQAAADgAAAAAQVNDSUkAAABBQUFFMzNqYWJWTk5iQnRGRkg2ems2Wkoyc1NicEQ5cCtyY2xEcVF0TFVrYmFIRDVpZE0wYldqai9xeWRPSWtUCk0xNlA3YTNYdTJaM25OYTFJczBCdFFqQkFYRW85QURFRVlJaUJBWFJDaUVCUXJRRkZSVEFpUUFKQWVxcEY4U0IKQzBJVkVyTzJWUXJxakZiNzNwdDU4NzczelRleHJLRTdyTHQ3Q1VtNFpsbnQ4b2F3ZDRiYWptNlo0MTVpYXlsZAplRUV2czdKaHJ4VTdRVFhtdEFBNjgxcFU5Z1RVUXpSUDQvN3FwdS9xNm9PMlpUR08zcFczckZqWmVlOTlYVnUzCmJiOS94ODRISHR6N1NQL2dFNGVPSForWW5DWTBjU0tUWmJtUTE4d1p4bUpqazBkdTk0NEYxSjFwbW5jbXhMOWEKWk5TckdjUnhMalMzdEs1YXZXWnQyem91Y2N4citESmV5NWZ6T2w3UEd5NnMzN0J4MDJabHl6MGRmQVZmeVp1NApoemZ6ZHI2ZWIrU2J1QktPRVljYXVrbERtbVZZZGpCanhXbUk2Y3lnNGF4TlNTWm0wS2tNU1pwNlF0Y0lFKzBHCjQ0UlIwVmFNYU9ta2JlWE0rRDQzY2NLeGNyWkdnL1FVNjREcVdPenU4ZXphM1JzS3FNY1BERVFDYW5tam1pVWEKSGVwV3hBUVo4Y2JTUTN2NkhwNm90R0dTREExWFRPcU1WUk9LZmI1d1FEMVM3bGV1S1hrZWZlenhjVUdBdzJ6ZApUSEw1cURqQVAxRG1lU1RIaU1DcmxsZm0vZnZjdklxenVOOHpkT0RnOEcxZmdQRXpZY1Z5akRxOGhhL2pyVkc1CkZJbGJXaTVEVFZaR01OblRuV1ZUQldJelhUUG9iRU1rNTFDQlBVMlNkRktZTGxabnFsQm1iVmJwRkpHNGtyQnMKOFpsTUtVZnZ6Q2lRak9Qa016R3hNME5ZeXZuL21odTgyOXBramlYNnBncTZtUlZJVGExU0tKRXpGR1lwTEorbApTbHkzQlM5R1hoaEVzM1dCVmRGU3hDWWFFK3BzY0lWek9IQjBib1N2bWp2Q1YvTzIwWUE2SkFBdXFjR1FaM1FzClBDNThWVDlOQlRHSklZTWtIZUVIUkdNZC9WMlZLNVJsdm9hdkhSMnhUS0paZ3VuSVZQV0VZc1FuM09pVGdzbEIKWFhPRlFleDhNZW9HWTFwVWJybUQ0SGlGODJMY2Q5ZDRSLzlBcFZZcDZVbnByc2FaTGhENHIxeXJUYjU0UGM0MwppQ1BUaGlnN0tJUlhUUHRjVlptN2U0ZDZGREdCTjdwMys5VEJZYjdadmNWd2hLVW9JOVBiUk5MTXlhamNlbHNWCi82S2NuNG42b0E2YW9SMjhzQlYyd1I0WWhzTndERlE0Q2JQd05Ed0g1K0FWZUJQZWdyZmhIYmdJNzhNSGNCaysKaEkvZ0NseURMK0U2ZkEwTDhDMlVZQW0raHgvaEJ0eUUzK0FQdUlYcVVSTlMwSGJVaS9ZaVB3cWdFQnBENDJnYQo2Y2hHcDlFc09vT2VRYytqYytobGRCNjlpdDVEbDlBbjZDcGFRRCtobjlHdjZJWjBXZnBZK2xUNlRQcGN1aXA5CklTMUlQMGkvU0RlbDM2VS9wYitrVzlMZnVBYlhZeG0zNGpiY2lidndEanlBOStNSnJPRVV6dUk4TG1DT3orSm4KOFF2NEpYd2V6K0Y1L0RwK0ExL0VsL0JYRllZbFZIMlpwK0EvQTMvekQzcVhrcnc9NsYx2QAAAAlwSFlzAAAWJQAAFiUBSVIk8AAACNtpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDYuMC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHRpZmY6Q29tcHJlc3Npb24+MTwvdGlmZjpDb21wcmVzc2lvbj4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24+MTQ0PC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xNDQ8L3RpZmY6WVJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOlBob3RvbWV0cmljSW50ZXJwcmV0YXRpb24+MjwvdGlmZjpQaG90b21ldHJpY0ludGVycHJldGF0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+NjA8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpVc2VyQ29tbWVudD5BQUFFMzNqYWJWTk5iQnRGRkg2ems2Wkoyc1NicEQ5cCtyY2xEcVF0TFVrYmFIRDVpZE0wYldqai9xeWRPSWtUJiN4QTtNMTZQN2EzWHUyWjNuTmExSXMwQnRRakJBWEVvOUFERUVZSWlCQVhSQ2lFQlFyUUZGUlRBaVFBSkFlcXBGOFNCJiN4QTtDMElWRXJPMlZRcnFqRmI3M3B0NTg3NzN6VGV4cktFN3JMdDdDVW00WmxudDhvYXdkNGJham02WjQxNWlheWxkJiN4QTtlRUV2czdKaHJ4VTdRVFhtdEFBNjgxcFU5Z1RVUXpSUDQvN3FwdS9xNm9PMlpUR08zcFczckZqWmVlOTlYVnUzJiN4QTtiYjkveDg0SEh0ejdTUC9nRTRlT0haK1luQ1kwY1NLVFpibVExOHdaeG1KamswZHU5NDRGMUoxcG1uY214TDlhJiN4QTtaTlNyR2NSeExqUzN0SzVhdldadDJ6b3VjY3hyK0RKZXk1ZnpPbDdQR3k2czM3QngwMlpseXowZGZBVmZ5WnU0JiN4QTtoemZ6ZHI2ZWIrU2J1QktPRVljYXVrbERtbVZZZGpCanhXbUk2Y3lnNGF4TlNTWm0wS2tNU1pwNlF0Y0lFKzBHJiN4QTs0NFJSMFZhTWFPbWtiZVhNK0Q0M2NjS3hjclpHZy9RVTY0RHFXT3p1OGV6YTNSc0txTWNQREVRQ2FubWptaVVhJiN4QTtIZXBXeEFRWjhjYlNRM3Y2SHA2b3RHR1NEQTFYVE9xTVZST0tmYjV3UUQxUzdsZXVLWGtlZmV6eGNVR0F3MnpkJiN4QTtUSEw1cURqQVAxRG1lU1RIaU1DcmxsZm0vZnZjdklxenVOOHpkT0RnOEcxZmdQRXpZY1Z5akRxOGhhL2pyVkc1JiN4QTtGSWxiV2k1RFRWWkdNTm5UbldWVEJXSXpYVFBvYkVNazUxQ0JQVTJTZEZLWUxsWm5xbEJtYlZicEZKRzRrckJzJiN4QTs4WmxNS1VmdnpDaVFqT1BrTXpHeE0wTll5dm4vbWh1ODI5cGtqaVg2cGdxNm1SVklUYTFTS0pFekZHWXBMSitsJiN4QTtTbHkzQlM5R1hoaEVzM1dCVmRGU3hDWWFFK3BzY0lWek9IQjBib1N2bWp2Q1YvTzIwWUE2SkFBdXFjR1FaM1FzJiN4QTtQQzU4VlQ5TkJUR0pJWU1rSGVFSFJHTWQvVjJWSzVSbHZvYXZIUjJ4VEtKWmd1bklWUFdFWXNRbjNPaVRnc2xCJiN4QTtYWE9GUWV4OE1lb0dZMXBVYnJtRDRIaUY4MkxjZDlkNFIvOUFwVllwNlVucHJzYVpMaEQ0cjF5clRiNTRQYzQzJiN4QTtpQ1BUaGlnN0tJUlhUUHRjVlptN2U0ZDZGREdCTjdwMys5VEJZYjdadmNWd2hLVW9JOVBiUk5MTXlhamNlbHNWJiN4QTsvNktjbjRuNm9BNmFvUjI4c0JWMndSNFloc053REZRNENiUHdORHdINStBVmVCUGVncmZoSGJnSTc4TUhjQmsrJiN4QTtoSS9nQ2x5REwrRTZmQTBMOEMyVVlBbStoeC9oQnR5RTMrQVB1SVhxVVJOUzBIYlVpL1lpUHdxZ0VCcEQ0MmdhJiN4QTs2Y2hHcDlFc09vT2VRYytqYytobGRCNjlpdDVEbDlBbjZD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;" parent="1" vertex="1"> - <mxGeometry x="328" y="619" width="12.93" height="12.07" as="geometry" /> - </mxCell> <mxCell id="hdwB_MQwIhiL4xS-3u5l-86" value="" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/png,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nhZ7AOoRMzUWsc4DcBxRA0TJiE6NROHuALaxkers7Ds9p08JFvlj2W87Rb20nHXgHzIzw39X9z8tmMo6vfxv9l8BhAf7uiw5BAAABeRlWElmTU0AKgAAAAgABgEGAAMAAAABAAIAAAESAAMAAAABAAEAAAEaAAUAAAABAAAAVgEbAAUAAAABAAAAXgEoAAMAAAABAAIAAIdpAAQAAAABAAAAZgAAAAAAAACQAAAAAQAAAJAAAAABAAOShgAHAAAFVAAAAJCgAgAEAAAAAQAAAHSgAwAEAAAAAQAAAEAAAAAAQVNDSUkAAABBQUFFNjNqYWJWTnJiQlJWRkQ1M2JxRVBhSGZhOGlqbE5kaXRGaERjUXBXNitPaVdzbENoeTJOMnU5dDJ5M3AzCjl1N3VzTE16Njh6ZHdySnBjbjhZTUFaLytBc2hSRzBib3hqakswcU04UkVpb0RHbTBXMGpKa1FOdi9oai9PRWYKWTRpSmR4OUJOTXpOWk00NTk1NXp2dlBkYitJNVEzZVl4N09JSkZ5M1pHbDlVOFE5UlcxSHQ4d3hON0cxdEM2OApvSnRadVlqYmloK25HblBhQUoxK1BTYTdBdW9CV3FBSlgrM1FEdzJOUWR1eUdFZnZ5WnVXTGU5KzhLR2V6VnUyClByeHQreU9QN241aVlPaVpBMGVPams4Y0l6UjVQSnRqK1pEYnpCdkdRbk9MUys1MGh3UHE5Z3d0T09QaVcyc3kKNnRZTTRqaVhXdHZhVjZ4Y3RicGpEWmM0NW5WOENWL0s2M2tEYitSTmw5YXVXNzlobzdMcGdTNitqQy9uTGR6RgpXM2tuWDh2WDh3MWNpY1NKUXczZHBDSE5NaXc3bUxVU05NUjBadEJJenFZa0d6Zm9aSmFrVEQycGE0U0pjWU1KCndxZ1lLMDYwVE1xMjhtWmlUemx4M0xIeXRrYUQ5Q1RyZ3RxejRPbDE3ZGpaRndxb1IvY05SZ05xNWFDYUl4cjEKZXhTeFFFYTh1ZlRZcnY3SHg2dGptQ1JMSTFXVE91RmF3bXkvTnhKUUQxWG1sZXRLcmllZmVucE1FT0F3V3pkVApYRDRzQ3ZnR0t6eVA1QmtSZU5YS3pweHZUem12Nml6c2RmbjM3UisrNndzd1BpYXNlSjVSaDdmeE5idzlKcGVpCkNVdkxaNm5KS2dnbWVqMDVObGtrTnRNMWcwNDNSZk1PRmRnekpFVW5oRm5HNmt3V0s2eE5LOTBpa2xDU2xpMWUKa3ltVjZMMFpSWkoxbkVJMkxrNW1DVXM3Lzk4ckIrKzNONUZueWY3Sm9tN21CRkpUcXpaSzVnMkZXUW9yNUtpUwowRzNCaTFFUUJ0RnNYV0JWdERTeGljYUVPcHZLd2prWU9Ed3p3bGZNSE9JcmVjZG9RUFVMZ0l0cU1PUWFEVWZHCmhLL3FwNmdnSnVrM1NNb1Jma0FNMWpYUVU3MUNXZWFyK09yUkVjc2ttaVdZams3V0tzeEd2Y0tOUFN1WUhOSzEKc2pDSVhaaU5sWU54TFNhMzNVTndvc3I1Yk1KNzMzalh3R0MxVnlubFN1dGxqVE5kSVBCZHZWNS85bUo0QzE4bgpTbVlNMFhaSUNHODI0eTJyeXR6WjUrOVZ4QUxlWEw3YjUvWVA4NDNWVzJ5THNqUmxKQlpsUW9xQ09KMU5pd0pUCkoySnkrMTJGL0l0NGJpcm1oUVpvaFU1d3cyYllBYnRnR0E3Q0VWRGhCRXpEODNBV3pzR3I4QmE4RGUvQXUvQSsKZkFnZndXWDRCRDZGcTNBZHZvRnY0VHVZaCsraEJJdndJL3dFdCtBMi9BWi93QjNVaUZxUWdyYWlQclFiK1ZBQQpoVkFZamFGalNFYzJPb1dtMFduMEFub0puVVBuMFFYMEd2b0FmWXkrUU5mUVBMcUpma2Evb2x2U1plbHo2VXZwCml2U1ZkRTM2V3BxWGJraS9TTGVsMzZVL3BiK2tPOUxmdUE0M1lobTM0dzdjalh2d05qeUk5K0p4ck9FMHp1RUMKTG1LT3orQVg4Y3Y0Rlh3QnorQTUvQVorRTMrR3IrQWJWYllsVlB0TFQ4Si9Ibnp6SDZnbGx6cz11ijupAAAACXBIWXMAABYlAAAWJQFJUiTwAAAI5GlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNi4wLjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8dGlmZjpDb21wcmVzc2lvbj4xPC90aWZmOkNvbXByZXNzaW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj4xNDQ8L3RpZmY6WFJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOllSZXNvbHV0aW9uPjE0NDwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6UGhvdG9tZXRyaWNJbnRlcnByZXRhdGlvbj4yPC90aWZmOlBob3RvbWV0cmljSW50ZXJwcmV0YXRpb24+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4xMTY8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpVc2VyQ29tbWVudD5BQUFFNjNqYWJWTnJiQlJWRkQ1M2JxRVBhSGZhOGlqbE5kaXRGaERjUXBXNitPaVdzbENoeTJOMnU5dDJ5M3AzJiN4QTs5dTd1c0xNejY4emR3ckpwY244WU1BWi8rQXNoUkcwYm94ampLMHFNOFJFaW9ER20wVzBqSmtRTnYvaGovT0VmJiN4QTtZNGlKZHg5Qk5Nek5aTTQ1OTU1enZ2UGRiK0k1UTNlWXg3T0lKRnkzWkdsOVU4UTlSVzFIdDh3eE43RzF0QzY4JiN4QTtvSnRadVlqYmloK25HblBhQUoxK1BTYTdBdW9CV3FBSlgrM1FEdzJOUWR1eUdFZnZ5WnVXTGU5KzhLR2V6VnUyJiN4QTtQcnh0K3lPUDduNWlZT2laQTBlT2prOGNJelI1UEp0aitaRGJ6QnZHUW5PTFMrNTBod1BxOWd3dE9PUGlXMnN5JiN4QTs2dFlNNGppWFd0dmFWNnhjdGJwakRaYzQ1blY4Q1YvSzYza0RiK1JObDlhdVc3OWhvN0xwZ1M2K2pDL25MZHpGJiN4QTtXM2tuWDh2WDh3MWNpY1NKUXczZHBDSE5NaXc3bUxVU05NUjBadEJJenFZa0d6Zm9aSmFrVEQycGE0U0pjWU1KJiN4QTt3cWdZSzA2MFRNcTI4bVppVHpseDNMSHl0a2FEOUNUcmd0cXo0T2wxN2RqWkZ3cW9SL2NOUmdOcTVhQ2FJeHIxJiN4QTtleFN4UUVhOHVmVFlydjdIeDZ0am1DUkxJMVdUT3VGYXdteS9OeEpRRDFYbWxldEtyaWVmZW5wTUVPQXdXemRUJiN4QTtYRDRzQ3ZnR0t6eVA1QmtSZU5YS3pweHZUem12Nml6c2RmbjM3UisrNndzd1BpYXNlSjVSaDdmeE5idzlKcGVpJiN4QTtDVXZMWjZuSktnZ21lajA1Tmxra050TTFnMDQzUmZNT0ZkZ3pKRVVuaEZuRzZrd1dLNnhOSzkwaWtsQ1NsaTFlJiN4QTtreW1WNkwwWlJaSjFuRUkyTGs1bUNVczcvOThyQisrM041Rm55ZjdKb203bUJGSlRxelpLNWcyRldRb3I1S2lTJiN4QTswRzNCaTFFUUJ0RnNYV0JWdERTeGljYUVPcHZLd2prWU9Ed3p3bGZNSE9JcmVjZG9RUFVMZ0l0cU1PUWFEVWZHJiN4QTtoSy9xcDZnZ0p1azNTTW9SZmtBTTFqWFFVNzFDV2VhcitPclJFY3NrbWlXWWprN1dLc3hHdmNLTlBTdVlITksxJiN4QTtzakNJWFppTmxZTnhMU2EzM1VOd29zcjViTUo3MzNqWHdHQzFWeW5sU3V0bGpUTmRJUEJkdlY1LzltSjRDMThuJiN4QTtTbVlNMFhaSUNHODI0eTJyeXR6WjUrOVZ4QUxlWEw3YjUvWVA4NDNWVzJ5THNqUmxKQlpsUW9xQ09KMU5pd0pUJiN4QTtKMkp5KzEyRi9JdDRiaXJtaFFab2hVNXd3MmJZQWJ0Z0dBN0NFVkRoQkV6RDgzQVd6c0dyOEJhOERlL0F1L0ErJiN4QTtmQWdmd1dYNEJENkZxM0Fkdm9GdjRUdVloKytoQkl2d0kvd0V0K0EyL0FaL3dCM1VpRnFRZ3JhaVByUWIrVkFBJiN4QTtoVkFZamFGalNFYzJPb1dtMFduMEFub0pu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;" parent="1" vertex="1"> - <mxGeometry x="216" y="619.1" width="24.82" height="13.7" as="geometry" /> + <mxGeometry x="226" y="630" width="24.82" height="13.7" as="geometry" /> </mxCell> <mxCell id="hdwB_MQwIhiL4xS-3u5l-89" value="" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/png,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nhZ7AOoRMzUWsc4DcBxRA0TJiE6NROHuALaxkers7Ds9p08JFvlj2W87Rb20nHXgHzIzw39X9z8tmMo6vfxv9l8BhAf7uiw5BAAABdRlWElmTU0AKgAAAAgABgEGAAMAAAABAAIAAAESAAMAAAABAAEAAAEaAAUAAAABAAAAVgEbAAUAAAABAAAAXgEoAAMAAAABAAIAAIdpAAQAAAABAAAAZgAAAAAAAACQAAAAAQAAAJAAAAABAAOShgAHAAAFRAAAAJCgAgAEAAAAAQAAACKgAwAEAAAAAQAAADAAAAAAQVNDSUkAAABBQUFFMkhqYWJWTmRiQlJWRkQ1M2JvRzIwTzYwNWFlVXY4RnV0WWpnRnFyVTRrKzNsSVVLWFNpejIyNzNoL1h1CjdOM3QwTm1aZGVadVlXbWEzQWNEeHNpRFR3Z1BhTnNZclRINEV5WEdSSTJ4SURHbTBXMmpKa1lOVDd3WUgzd3gKaHBoNFozZURhSmlieVp4ejdqbjNmT2U3MzZUeWh1NHduMjhaU2JobXhjcFY5Ukh2SkxVZDNUTEh2TVRXeG5YaApoYnpNeWtlOFZ1b1UxWmpURE9qYzYwblpFMVNQMENKTis2dEozOVhXaFd6TFloeTlLMjlmdmFiandZYzZkenk4Cjg1RmR1eDk5YlArVGZRUFBIaGsrRVkyZEpEUnpLcGRuaGJEWExCakdVa09qUjI3empnYlYzUk8wNkVURnQ5cGsKeEtzWnhISG1tNXBiMXE1YnY2RjFJNWM0NWpWOEJWL0pWL0ZhWHNmcjV6ZHQzckoxbTdMOWdYYSttcS9oamR6RAptM2diMzhTMzhLMWNpYVNJUXczZHBHSE5NaXc3bExQU05NeDBadEJJM3FZa2x6Sm9Ja2V5cHA3Uk5jTEV1S0UwCllWU01sU0xhUk5hMkNtYjZnRnNZZGF5Q3JkRVFQY1Bhb2ZvcytibzhlL1oyaDRQcWlVUDk4YUJhVGxUelJLTUIKbnlJV3lJZzNsQjdmMS9ORXRES0dTWEkwVWpHcE0xb3RtTzNwalFUVlkrVjU1WnFTNTZtbm54a1RCRGpNMXMwcwpsNCtMQS96OVpaNkhDb3dJdkdwNVo4NS93SzJyT0VzSFBZRkRod2Z2K2dLTW53a3JWV0RVNGMxOEkyOUp5cVY0CjJ0SUtPV3F5TW9KWWx5L1BFbFBFWnJwbTBPbjZlTUdoQXZzRXlkS1lNRjJzVG1LcXpOcTAwaUVpYVNWajJlSTEKbVZLTzNsc3hSWEtPVTh5bFJHYU9zSEhuLzN0dThINTdzUUxMOUNTbWRETXZrSnBhcFZHbVlDak1VbGd4VDVXMApiZ3RlaktJd2lHYnJBcXVpalJPYmFFeW9zOTRWenRIZzhaa2h2bmJtR0YvSFcwZUNha0FBWEZaRFljL0lhR1JNCitLcCtsZ3BpTWdHRFpCM2hCOFZnN1gyZGxTdVVaYjZlYnhnWnNreWlXWUxwZUtKNndteThWN2pKNXdTVEE3cm0KQ29QWXhkbWtHMHhwU2JuNUhvTFRGYzVuMDczM2piZjM5VmQ2bGJLZWNkM1ZPTk1GQXYvQ0RjLzVDOTRZM3l5TwpuREJFMndFaHZObUpYbGRWNXQ3dVFKY2lGdkFHOTI2ZlB6ekl0N20zT0Z3VTJaT25rM0xMWFRuOEMyOXVNdGtMCnRkQUViZUNGSGJBSDlzRWdISVZoVU9FMFRNTUw4REpjaEN2d0Zyd043OEJWZUE4K2dBL2hHbndNbjhBQzNJQ2IKOERWOEE0dndMWlJnR2I2SEgrRVczSWJmNEErNGcrcFFJMUxRVHRTTjlpTS9DcUl3R2tWajZDVFNrWTNPb21sMApEcjJJTHFDTDZCSzZqRjVENzZPUDBHZm9PbHBFUDZHZjBhL29sblJOK2xUNlhQcEMrbEs2TG4wbExVby9TTDlJCnQ2WGZwVCtsdjZRNzB0KzRCdGRoR2JmZ1Z0eUJPL0V1M0k4UDRpalc4RGpPNHlLZXdoeWZ4eS9oVi9DcitES2UKd1hQNERmd21uc2RYOFVLRldnbFZmOGt6OEo4SDMvd0g4SE9QakE9PS1PM0UAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAjTaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+CiAgICAgICAgIDx0aWZmOkNvbXByZXNzaW9uPjE8L3RpZmY6Q29tcHJlc3Npb24+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjE0NDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+MTQ0PC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpQaG90b21ldHJpY0ludGVycHJldGF0aW9uPjI8L3RpZmY6UGhvdG9tZXRyaWNJbnRlcnByZXRhdGlvbj4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjM0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6VXNlckNvbW1lbnQ+QUFBRTJIamFiVk5kYkJSVkZENTNib0cyME82MDVhZVV2OEZ1dFlqZ0ZxclU0ayszbElVS1hTaXoyMjczaC9YdSYjeEE7N04zdDBObVpkZVp1WVdtYTNBY0R4c2lEVHdnUGFOc1lyVEg0RXlYR1JJMnhJREdtMFcyakprWU5UN3dZSDN3eCYjeEE7aHBoNFozZURhSmlieVp4ejdqbjNmT2U3MzZUeWh1NHduMjhaU2JobXhjcFY5Ukh2SkxVZDNUTEh2TVRXeG5YaCYjeEE7aGJ6TXlrZThWdW9VMVpqVERPamM2MG5aRTFTUDBDSk4rNnRKMzlYV2hXekxZaHk5SzI5ZnZhYmp3WWM2ZHp5OCYjeEE7ODVGZHV4OTliUCtUZlFQUEhoaytFWTJkSkRSektwZG5oYkRYTEJqR1VrT2pSMjd6amdiVjNSTzA2RVRGdDlwayYjeEE7eEtzWnhISG1tNXBiMXE1YnY2RjFJNWM0NWpWOEJWL0pWL0ZhWHNmcjV6ZHQzckoxbTdMOWdYYSttcS9oamR6RCYjeEE7bTNnYjM4UzM4SzFjaWFTSVF3M2RwR0hOTWl3N2xMUFNOTXgwWnRCSTNxWWtsekpvSWtleXBwN1JOY0xFdUtFMCYjeEE7WVZTTWxTTGFSTmEyQ21iNmdGc1lkYXlDcmRFUVBjUGFvZm9zK2JvOGUvWjJoNFBxaVVQOThhQmFUbFR6UktNQiYjeEE7bnlJV3lJZzNsQjdmMS9ORXRES0dTWEkwVWpHcE0xb3RtTzNwalFUVlkrVjU1WnFTNTZtbm54a1RCRGpNMXMwcyYjeEE7bDQrTEEvejlaWjZIQ293SXZHcDVaODUvd0syck9Fc0hQWUZEaHdmditnS01ud2tyVldEVTRjMThJMjlKeXFWNCYjeEE7MnRJS09XcXlNb0pZbHkvUEVsUEVacnBtME9uNmVNR2hBdnNFeWRLWU1GMnNUbUtxek5xMDBpRWlhU1ZqMmVJMSYjeEE7bVZLTzNsc3hSWEtPVTh5bFJHYU9zSEhuLzN0dThINTdzUUxMOUNTbWRETXZrSnBhcFZHbVlDak1VbGd4VDVXMCYjeEE7Ymd0ZWpLSXdpR2JyQXF1aWpST2JhRXlvczk0Vnp0SGc4Wmtodm5ibUdGL0hXMGVDYWtBQVhGWkRZYy9JYUdSTSYjeEE7K0twK2xncGlNZ0dEWkIzaEI4Vmc3WDJkbFN1VVpiNmVieGdac2t5aVdZTHBlS0o2d215OFY3ako1d1NUQTdybSYjeEE7Q29QWXhkbWtHMHhwU2JuNUhvTFRGYzVuMDczM2piZjM5VmQ2bGJLZWNkM1ZPTk1GQXYvQ0RjLzVDOTRZM3l5TyYjeEE7bkRCRTJ3RWh2Tm1KWGxkVjV0N3VRSmNpRnZBRzkyNmZQenpJdDdtM09Gd1UyWk9uazNMTFhUbjhDMjl1TXRrTCYjeEE7dGRBRWJlQ0ZIYkFIOXNFZ0hJVmhVT0UwVE1NTDhESmNoQ3Z3RnJ3Tjc4QlZlQTgrZ0EvaEdud01uOEFDM0lDYiYjeEE7OERWOEE0dndMWlJnR2I2SEgrRVczSWJmNEErNGcrcFFJMUxRVHRTTjlpTS9DcUl3R2tWajZDVFNrWTNPb21sMCYjeEE7RHIySUxxQ0w2Qks2akY1RDc2T1AwR2ZvT2xwRVA2R2YwYS9vbG5STits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;" parent="1" vertex="1"> <mxGeometry x="551" y="767" width="6.38" height="9" as="geometry" /> </mxCell> - <mxCell id="BE7m5MwMy8wg7SoJYegb-1" value="MLE" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> - <mxGeometry x="699" y="641" width="70" height="30" as="geometry" /> + <mxCell id="BE7m5MwMy8wg7SoJYegb-1" value="MLE" style="rounded=1;whiteSpace=wrap;html=1;strokeColor=#585858;" parent="1" vertex="1"> + <mxGeometry x="700" y="641" width="70" height="30" as="geometry" /> </mxCell> - <mxCell id="BE7m5MwMy8wg7SoJYegb-2" value="PEM" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> - <mxGeometry x="699" y="677" width="70" height="30" as="geometry" /> + <mxCell id="BE7m5MwMy8wg7SoJYegb-2" value="PEM" style="rounded=1;whiteSpace=wrap;html=1;strokeColor=#585858;" parent="1" vertex="1"> + <mxGeometry x="700" y="677" width="70" height="30" as="geometry" /> </mxCell> - <mxCell id="BE7m5MwMy8wg7SoJYegb-4" value="" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0;entryDx=0;entryDy=0;" parent="1" edge="1"> + <mxCell id="BE7m5MwMy8wg7SoJYegb-4" value="" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0;entryDx=0;entryDy=0;strokeColor=#585858;" parent="1" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="696" y="646" as="sourcePoint" /> <mxPoint x="628" y="696" as="targetPoint" /> </mxGeometry> </mxCell> - <mxCell id="BE7m5MwMy8wg7SoJYegb-5" value="" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=1;entryDx=0;entryDy=0;" parent="1" edge="1"> + <mxCell id="BE7m5MwMy8wg7SoJYegb-5" value="" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=1;entryDx=0;entryDy=0;strokeColor=#585858;" parent="1" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="695" y="780" as="sourcePoint" /> <mxPoint x="628" y="728" as="targetPoint" /> </mxGeometry> </mxCell> - <mxCell id="BE7m5MwMy8wg7SoJYegb-6" value="MAP" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> - <mxGeometry x="699" y="714" width="70" height="30" as="geometry" /> - </mxCell> - <mxCell id="BE7m5MwMy8wg7SoJYegb-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;curved=1;endArrow=none;endFill=0;" parent="1" source="BE7m5MwMy8wg7SoJYegb-7" target="hdwB_MQwIhiL4xS-3u5l-2" edge="1"> - <mxGeometry relative="1" as="geometry" /> + <mxCell id="BE7m5MwMy8wg7SoJYegb-6" value="MAP" style="rounded=1;whiteSpace=wrap;html=1;strokeColor=#585858;" parent="1" vertex="1"> + <mxGeometry x="700" y="714" width="70" height="30" as="geometry" /> </mxCell> - <mxCell id="BE7m5MwMy8wg7SoJYegb-7" value="gradient or non-gradient based.." style="rounded=0;whiteSpace=wrap;html=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> - <mxGeometry x="682.5" y="567" width="103" height="60" as="geometry" /> + <mxCell id="BE7m5MwMy8wg7SoJYegb-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;curved=1;endArrow=none;endFill=0;strokeColor=#585858;" parent="1" target="hdwB_MQwIhiL4xS-3u5l-2" edge="1"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="675" y="598" as="sourcePoint" /> + </mxGeometry> </mxCell> - <mxCell id="BE7m5MwMy8wg7SoJYegb-11" value="Design related" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> - <mxGeometry x="699" y="751" width="70" height="30" as="geometry" /> + <mxCell id="BE7m5MwMy8wg7SoJYegb-11" value="Design -related" style="rounded=1;whiteSpace=wrap;html=1;strokeColor=#585858;" parent="1" vertex="1"> + <mxGeometry x="700" y="751" width="70" height="30" as="geometry" /> </mxCell> <mxCell id="ilc09JGzDhpx_nHwKlJr-1" value="" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=https://cdn.onlinewebfonts.com/svg/img_827.svg;flipV=1;" parent="1" vertex="1"> <mxGeometry x="437" y="632.8" width="20" height="20" as="geometry" /> </mxCell> + <mxCell id="gN4vE8bEkTlw2jWnqAIC-4" value="" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/png,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nhZ7AOoRMzUWsc4DcBxRA0TJiE6NROHuALaxkers7Ds9p08JFvlj2W87Rb20nHXgHzIzw39X9z8tmMo6vfxv9l8BhAf7uiw5BAAABdxlWElmTU0AKgAAAAgABgEGAAMAAAABAAIAAAESAAMAAAABAAEAAAEaAAUAAAABAAAAVgEbAAUAAAABAAAAXgEoAAMAAAABAAIAAIdpAAQAAAABAAAAZgAAAAAAAACQAAAAAQAAAJAAAAABAAOShgAHAAAFTAAAAJCgAgAEAAAAAQAAADygAwAEAAAAAQAAADgAAAAAQVNDSUkAAABBQUFFMzNqYWJWTk5iQnRGRkg2ems2Wkoyc1NicEQ5cCtyY2xEcVF0TFVrYmFIRDVpZE0wYldqai9xeWRPSWtUCk0xNlA3YTNYdTJaM25OYTFJczBCdFFqQkFYRW85QURFRVlJaUJBWFJDaUVCUXJRRkZSVEFpUUFKQWVxcEY4U0IKQzBJVkVyTzJWUXJxakZiNzNwdDU4NzczelRleHJLRTdyTHQ3Q1VtNFpsbnQ4b2F3ZDRiYWptNlo0MTVpYXlsZAplRUV2czdKaHJ4VTdRVFhtdEFBNjgxcFU5Z1RVUXpSUDQvN3FwdS9xNm9PMlpUR08zcFczckZqWmVlOTlYVnUzCmJiOS94ODRISHR6N1NQL2dFNGVPSForWW5DWTBjU0tUWmJtUTE4d1p4bUpqazBkdTk0NEYxSjFwbW5jbXhMOWEKWk5TckdjUnhMalMzdEs1YXZXWnQyem91Y2N4citESmV5NWZ6T2w3UEd5NnMzN0J4MDJabHl6MGRmQVZmeVp1NApoemZ6ZHI2ZWIrU2J1QktPRVljYXVrbERtbVZZZGpCanhXbUk2Y3lnNGF4TlNTWm0wS2tNU1pwNlF0Y0lFKzBHCjQ0UlIwVmFNYU9ta2JlWE0rRDQzY2NLeGNyWkdnL1FVNjREcVdPenU4ZXphM1JzS3FNY1BERVFDYW5tam1pVWEKSGVwV3hBUVo4Y2JTUTN2NkhwNm90R0dTREExWFRPcU1WUk9LZmI1d1FEMVM3bGV1S1hrZWZlenhjVUdBdzJ6ZApUSEw1cURqQVAxRG1lU1RIaU1DcmxsZm0vZnZjdklxenVOOHpkT0RnOEcxZmdQRXpZY1Z5akRxOGhhL2pyVkc1CkZJbGJXaTVEVFZaR01OblRuV1ZUQldJelhUUG9iRU1rNTFDQlBVMlNkRktZTGxabnFsQm1iVmJwRkpHNGtyQnMKOFpsTUtVZnZ6Q2lRak9Qa016R3hNME5ZeXZuL21odTgyOXBramlYNnBncTZtUlZJVGExU0tKRXpGR1lwTEorbApTbHkzQlM5R1hoaEVzM1dCVmRGU3hDWWFFK3BzY0lWek9IQjBib1N2bWp2Q1YvTzIwWUE2SkFBdXFjR1FaM1FzClBDNThWVDlOQlRHSklZTWtIZUVIUkdNZC9WMlZLNVJsdm9hdkhSMnhUS0paZ3VuSVZQV0VZc1FuM09pVGdzbEIKWFhPRlFleDhNZW9HWTFwVWJybUQ0SGlGODJMY2Q5ZDRSLzlBcFZZcDZVbnByc2FaTGhENHIxeXJUYjU0UGM0MwppQ1BUaGlnN0tJUlhUUHRjVlptN2U0ZDZGREdCTjdwMys5VEJZYjdadmNWd2hLVW9JOVBiUk5MTXlhamNlbHNWCi82S2NuNG42b0E2YW9SMjhzQlYyd1I0WWhzTndERlE0Q2JQd05Ed0g1K0FWZUJQZWdyZmhIYmdJNzhNSGNCaysKaEkvZ0NseURMK0U2ZkEwTDhDMlVZQW0raHgvaEJ0eUUzK0FQdUlYcVVSTlMwSGJVaS9ZaVB3cWdFQnBENDJnYQo2Y2hHcDlFc09vT2VRYytqYytobGRCNjlpdDVEbDlBbjZDcGFRRCtobjlHdjZJWjBXZnBZK2xUNlRQcGN1aXA5CklTMUlQMGkvU0RlbDM2VS9wYitrVzlMZnVBYlhZeG0zNGpiY2lidndEanlBOStNSnJPRVV6dUk4TG1DT3orSm4KOFF2NEpYd2V6K0Y1L0RwK0ExL0VsL0JYRllZbFZIMlpwK0EvQTMvekQzcVhrcnc9NsYx2QAAAAlwSFlzAAAWJQAAFiUBSVIk8AAACNtpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDYuMC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHRpZmY6Q29tcHJlc3Npb24+MTwvdGlmZjpDb21wcmVzc2lvbj4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24+MTQ0PC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xNDQ8L3RpZmY6WVJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOlBob3RvbWV0cmljSW50ZXJwcmV0YXRpb24+MjwvdGlmZjpQaG90b21ldHJpY0ludGVycHJldGF0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+NjA8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpVc2VyQ29tbWVudD5BQUFFMzNqYWJWTk5iQnRGRkg2ems2Wkoyc1NicEQ5cCtyY2xEcVF0TFVrYmFIRDVpZE0wYldqai9xeWRPSWtUJiN4QTtNMTZQN2EzWHUyWjNuTmExSXMwQnRRakJBWEVvOUFERUVZSWlCQVhSQ2lFQlFyUUZGUlRBaVFBSkFlcXBGOFNCJiN4QTtDMElWRXJPMlZRcnFqRmI3M3B0NTg3NzN6VGV4cktFN3JMdDdDVW00WmxudDhvYXdkNGJham02WjQxNWlheWxkJiN4QTtlRUV2czdKaHJ4VTdRVFhtdEFBNjgxcFU5Z1RVUXpSUDQvN3FwdS9xNm9PMlpUR08zcFczckZqWmVlOTlYVnUzJiN4QTtiYjkveDg0SEh0ejdTUC9nRTRlT0haK1luQ1kwY1NLVFpibVExOHdaeG1KamswZHU5NDRGMUoxcG1uY214TDlhJiN4QTtaTlNyR2NSeExqUzN0SzVhdldadDJ6b3VjY3hyK0RKZXk1ZnpPbDdQR3k2czM3QngwMlpseXowZGZBVmZ5WnU0JiN4QTtoemZ6ZHI2ZWIrU2J1QktPRVljYXVrbERtbVZZZGpCanhXbUk2Y3lnNGF4TlNTWm0wS2tNU1pwNlF0Y0lFKzBHJiN4QTs0NFJSMFZhTWFPbWtiZVhNK0Q0M2NjS3hjclpHZy9RVTY0RHFXT3p1OGV6YTNSc0txTWNQREVRQ2FubWptaVVhJiN4QTtIZXBXeEFRWjhjYlNRM3Y2SHA2b3RHR1NEQTFYVE9xTVZST0tmYjV3UUQxUzdsZXVLWGtlZmV6eGNVR0F3MnpkJiN4QTtUSEw1cURqQVAxRG1lU1RIaU1DcmxsZm0vZnZjdklxenVOOHpkT0RnOEcxZmdQRXpZY1Z5akRxOGhhL2pyVkc1JiN4QTtGSWxiV2k1RFRWWkdNTm5UbldWVEJXSXpYVFBvYkVNazUxQ0JQVTJTZEZLWUxsWm5xbEJtYlZicEZKRzRrckJzJiN4QTs4WmxNS1VmdnpDaVFqT1BrTXpHeE0wTll5dm4vbWh1ODI5cGtqaVg2cGdxNm1SVklUYTFTS0pFekZHWXBMSitsJiN4QTtTbHkzQlM5R1hoaEVzM1dCVmRGU3hDWWFFK3BzY0lWek9IQjBib1N2bWp2Q1YvTzIwWUE2SkFBdXFjR1FaM1FzJiN4QTtQQzU4VlQ5TkJUR0pJWU1rSGVFSFJHTWQvVjJWSzVSbHZvYXZIUjJ4VEtKWmd1bklWUFdFWXNRbjNPaVRnc2xCJiN4QTtYWE9GUWV4OE1lb0dZMXBVYnJtRDRIaUY4MkxjZDlkNFIvOUFwVllwNlVucHJzYVpMaEQ0cjF5clRiNTRQYzQzJiN4QTtpQ1BUaGlnN0tJUlhUUHRjVlptN2U0ZDZGREdCTjdwMys5VEJZYjdadmNWd2hLVW9JOVBiUk5MTXlhamNlbHNWJiN4QTsvNktjbjRuNm9BNmFvUjI4c0JWMndSNFloc053REZRNENiUHdORHdINStBVmVCUGVncmZoSGJnSTc4TUhjQmsrJiN4QTtoSS9nQ2x5REwrRTZmQTBMOEMyVVlBbStoeC9oQnR5RTMrQVB1SVhxVVJOUzBIYlVpL1lpUHdxZ0VCcEQ0MmdhJiN4QTs2Y2hHcDlFc09vT2VRYytqYytobGRCNjlpdDVEbDlBbjZD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;" parent="1" vertex="1"> + <mxGeometry x="481" y="548" width="12.93" height="12.07" as="geometry" /> + </mxCell> + <mxCell id="gN4vE8bEkTlw2jWnqAIC-6" value="Excitation" style="rounded=1;whiteSpace=wrap;html=1;strokeColor=#585858;" parent="1" vertex="1"> + <mxGeometry x="-10" y="677" width="70" height="30" as="geometry" /> + </mxCell> + <mxCell id="gN4vE8bEkTlw2jWnqAIC-8" value="" style="endArrow=none;html=1;rounded=0;strokeColor=#585858;" parent="1" edge="1"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="108" y="725" as="sourcePoint" /> + <mxPoint x="64" y="744" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="gN4vE8bEkTlw2jWnqAIC-9" value="Design Space" style="rounded=1;whiteSpace=wrap;html=1;strokeColor=#585858;" parent="1" vertex="1"> + <mxGeometry x="-10" y="714" width="70" height="30" as="geometry" /> + </mxCell> + <mxCell id="gN4vE8bEkTlw2jWnqAIC-10" value="" style="endArrow=none;html=1;rounded=0;strokeColor=#585858;" parent="1" edge="1"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="63" y="678" as="sourcePoint" /> + <mxPoint x="107" y="696" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="gN4vE8bEkTlw2jWnqAIC-11" value="Gradient or non-gradient based..." style="rounded=1;whiteSpace=wrap;html=1;strokeColor=#585858;" parent="1" vertex="1"> + <mxGeometry x="679" y="578" width="104" height="42" as="geometry" /> + </mxCell> </root> </mxGraphModel> </diagram> diff --git a/assets/PyBOP_Architecture.png b/assets/PyBOP_Architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..25ea6d42fa4cc64b30a41e8806071681843cbf87 GIT binary patch literal 147518 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 literal 0 HcmV?d00001 From f730427bfa14c9cf51643145d09b2eff4c859056 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 21 Sep 2023 14:23:36 +0100 Subject: [PATCH 078/210] Add release workflow for pypi + testpypi --- .github/workflows/release-action.yaml | 109 ++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 .github/workflows/release-action.yaml diff --git a/.github/workflows/release-action.yaml b/.github/workflows/release-action.yaml new file mode 100644 index 000000000..a8a846cbe --- /dev/null +++ b/.github/workflows/release-action.yaml @@ -0,0 +1,109 @@ +name: Publish Python 🐍 distribution 📦 to PyPI and TestPyPI + +on: push + +jobs: + build: + name: Build distribution 📦 + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.8" + - name: Install pypa/build + run: >- + python3 -m + pip install + build + --user + - name: Build a binary wheel and a source tarball + run: python3 -m build + - name: Store the distribution packages + uses: actions/upload-artifact@v3 + with: + name: python-package-distributions + path: dist/ + + publish-to-pypi: + name: >- + Publish Python 🐍 distribution 📦 to PyPI + if: startsWith(github.ref, 'refs/tags/') # only publish to PyPI on tag pushes + needs: + - build + runs-on: ubuntu-latest + environment: + name: pypi + url: https://pypi.org/p/pybop + permissions: + id-token: write # IMPORTANT: mandatory for trusted publishing + + steps: + - name: Download all the dists + uses: actions/download-artifact@v3 + with: + name: python-package-distributions + path: dist/ + - name: Publish distribution 📦 to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + + github-release: + name: >- + Sign the Python 🐍 distribution 📦 with Sigstore + and upload them to GitHub Release + needs: + - publish-to-pypi + runs-on: ubuntu-latest + + permissions: + contents: write # IMPORTANT: mandatory for making GitHub Releases + id-token: write # IMPORTANT: mandatory for sigstore + + steps: + - name: Download all the dists + uses: actions/download-artifact@v3 + with: + name: python-package-distributions + path: dist/ + - name: Sign the dists with Sigstore + uses: sigstore/gh-action-sigstore-python@v1.2.3 + with: + inputs: >- + ./dist/*.tar.gz + ./dist/*.whl + - name: Upload artifact signatures to GitHub Release + env: + GITHUB_TOKEN: ${{ github.token }} + # Upload to GitHub Release using the `gh` CLI. + # `dist/` contains the built packages, and the + # sigstore-produced signatures and certificates. + run: >- + gh release upload + '${{ github.ref_name }}' dist/** + --repo '${{ github.repository }}' + + publish-to-testpypi: + name: Publish Python 🐍 distribution 📦 to TestPyPI + needs: + - build + runs-on: ubuntu-latest + + environment: + name: testpypi + url: https://test.pypi.org/p/<package-name> + + permissions: + id-token: write # IMPORTANT: mandatory for trusted publishing + + steps: + - name: Download all the dists + uses: actions/download-artifact@v3 + with: + name: python-package-distributions + path: dist/ + - name: Publish distribution 📦 to TestPyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + repository-url: https://test.pypi.org/legacy/ \ No newline at end of file From 008694328eaabcbf48bd51f6fdc711f4e5e1e6bc Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 22 Sep 2023 08:09:48 +0100 Subject: [PATCH 079/210] Add TestPyPI project hyperlink --- .github/workflows/release-action.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-action.yaml b/.github/workflows/release-action.yaml index a8a846cbe..ce088f3d0 100644 --- a/.github/workflows/release-action.yaml +++ b/.github/workflows/release-action.yaml @@ -92,7 +92,7 @@ jobs: environment: name: testpypi - url: https://test.pypi.org/p/<package-name> + url: https://test.pypi.org/project/pybop/ permissions: id-token: write # IMPORTANT: mandatory for trusted publishing From 66507e94dd353c6c47b2e7a00483d628c5d1016b Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 22 Sep 2023 08:44:06 +0100 Subject: [PATCH 080/210] Modify TestPyPI for 'rc' tag dependancy --- .github/workflows/release-action.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release-action.yaml b/.github/workflows/release-action.yaml index ce088f3d0..449464c97 100644 --- a/.github/workflows/release-action.yaml +++ b/.github/workflows/release-action.yaml @@ -86,6 +86,7 @@ jobs: publish-to-testpypi: name: Publish Python 🐍 distribution 📦 to TestPyPI + if: tags contains 'rc' # only publish to TestPyPI on release candidate tags needs: - build runs-on: ubuntu-latest From 1009ee7964b76cd9b5be7216996e9a4865b551b9 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 22 Sep 2023 09:40:23 +0100 Subject: [PATCH 081/210] Updt readme logo link for PyPI, Add estimation notebook, black format --- README.md | 2 +- examples/notebooks/rmse-estimisation.ipynb | 302 +++++++++++++++++++++ examples/{ => scripts}/Chen_example.csv | 0 examples/{ => scripts}/Initial_API.py | 0 noxfile.py | 13 +- setup.py | 29 +- 6 files changed, 324 insertions(+), 22 deletions(-) create mode 100644 examples/notebooks/rmse-estimisation.ipynb rename examples/{ => scripts}/Chen_example.csv (100%) rename examples/{ => scripts}/Initial_API.py (100%) diff --git a/README.md b/README.md index 4c89bea8b..860d6e3cf 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ <div align="center"> - <img src="assets/Temp_Logo.png" alt="logo" width="400" height="auto" /> + <img src="https://raw.githubusercontent.com/pybop-team/PyBOP/develop/assets/Temp_Logo.png" alt="logo" width="400" height="auto" /> <h1>Python Battery Optimisation and Parameterisation</h1> diff --git a/examples/notebooks/rmse-estimisation.ipynb b/examples/notebooks/rmse-estimisation.ipynb new file mode 100644 index 000000000..3f0dfcbf5 --- /dev/null +++ b/examples/notebooks/rmse-estimisation.ipynb @@ -0,0 +1,302 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## A NMC/Gr parameterisation example using PyBOP\n", + "\n", + "This notebook introduces a synthetic re-parameterisation of the single-particle model with corrupted observations. To start, we import the PyBOP package for parameterisation and the PyBaMM package to generate the initial synethic data," + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%pip install git+https://github.com/pybop-team/PyBOP.git@develop -q \n", + "%pip install pybamm -q" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we import the added packages plus any additional dependencies," + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import pybop\n", + "import pybamm\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Generate Synthetic Data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We need to generate the synthetic data required for later reparameterisation. To do this we will run the PyBaMM forward model and store the generated data. This will be integrated into PyBOP in a future release for fast synthetic generation. For now, we define the PyBaMM model with a default parameter set," + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "synthetic_model = pybamm.lithium_ion.SPM()\n", + "params = synthetic_model.default_parameter_values" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can now modify individual parameters with the bespoke values and run the simulation." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "params.update(\n", + " {\n", + " \"Negative electrode active material volume fraction\": 0.52,\n", + " \"Positive electrode active material volume fraction\": 0.63,\n", + " }\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Define the experiment and run the forward model to capture the synthetic data." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "experiment = pybamm.Experiment(\n", + " [\n", + " (\n", + " \"Discharge at 2C for 5 minutes (1 second period)\",\n", + " \"Rest for 2 minutes (1 second period)\",\n", + " \"Charge at 1C for 5 minutes (1 second period)\",\n", + " \"Rest for 2 minutes (1 second period)\",\n", + " ),\n", + " ]\n", + " * 2\n", + ")\n", + "sim = pybamm.Simulation(synthetic_model, experiment=experiment, parameter_values=params)\n", + "synthetic_sol = sim.solve()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plot the synthetic data," + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sim.plot()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, let's corrupt the synthetic data with 5mV of gaussian noise centered around zero," + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "corrupt_V = synthetic_sol[\"Terminal voltage [V]\"].data\n", + "corrupt_V += np.random.normal(0,0.005,len(corrupt_V))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Identify the Parameters" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, to blind fit the synthetic parameters we need to define the observation variables as well as update the forward model to be of PyBOP type (This composes PyBaMM's model class). For the observed voltage variable, we used the newly corrupted voltage array, " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model = pybop.lithium_ion.SPM()\n", + "observations = [\n", + " pybop.Observed(\"Time [s]\", synthetic_sol[\"Time [s]\"].data),\n", + " pybop.Observed(\"Current function [A]\", synthetic_sol[\"Current [A]\"].data),\n", + " pybop.Observed(\"Voltage [V]\", corrupt_V),\n", + " ]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we define the targetted forward model parameters for estimation. Furthermore, PyBOP provides functionality to define a prior for the parameters. The initial parameters values used in the estimiation will be randomly drawn from the prior distribution." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fit_params = [\n", + " pybop.Parameter(\n", + " \"Negative electrode active material volume fraction\",\n", + " prior=pybop.Gaussian(0.5, 0.02),\n", + " bounds=[0.375, 0.625],\n", + " ),\n", + " pybop.Parameter(\n", + " \"Positive electrode active material volume fraction\",\n", + " prior=pybop.Gaussian(0.65, 0.02),\n", + " bounds=[0.525, 0.75],\n", + " ),\n", + "]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can now construct PyBOP's parameterisation class. This class provides the parameterisation methods needed to fit the forward model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "parameterisation = pybop.Parameterisation(\n", + " model, observations=observations, fit_parameters=fit_params\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, we run the estimation algorithm. For this example, we use a root-mean square cost function with the BOBYQA algorithm implemented in NLOpt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "results, last_optim, num_evals = parameterisation.rmse(\n", + " signal=\"Voltage [V]\", method=\"nlopt\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plotting" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First, run SPM forward model with the estimated parameters," + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "params.update(\n", + " {\"Negative electrode active material volume fraction\": results[0], \n", + " \"Positive electrode active material volume fraction\": results[1]}\n", + " )\n", + "optsol = sim.solve()[\"Terminal voltage [V]\"].data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, we plot the estimated forward model against the corrupted synthetic observation," + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plt.plot(corrupt_V, label='Groundtruth')\n", + "plt.plot(optsol, label='Estimated')\n", + "plt.xlabel('Time (s)')\n", + "plt.ylabel('Voltage (V)')\n", + "plt.legend()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "python", + "version": "3.10.12" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/Chen_example.csv b/examples/scripts/Chen_example.csv similarity index 100% rename from examples/Chen_example.csv rename to examples/scripts/Chen_example.csv diff --git a/examples/Initial_API.py b/examples/scripts/Initial_API.py similarity index 100% rename from examples/Initial_API.py rename to examples/scripts/Initial_API.py diff --git a/noxfile.py b/noxfile.py index b48348a9e..9117de5ba 100644 --- a/noxfile.py +++ b/noxfile.py @@ -11,12 +11,13 @@ @nox.session def unit_test(session): - session.run_always('pip', 'install', '-e', '.') - session.install('pytest') - session.run('pytest') + session.run_always("pip", "install", "-e", ".") + session.install("pytest") + session.run("pytest") + @nox.session def coverage(session): - session.run_always('pip', 'install', '-e', '.') - session.install('pytest-cov') - session.run('pytest', '--cov', '--cov-report=xml') \ No newline at end of file + session.run_always("pip", "install", "-e", ".") + session.install("pytest-cov") + session.run("pytest", "--cov", "--cov-report=xml") diff --git a/setup.py b/setup.py index d08697bff..3e374ef47 100644 --- a/setup.py +++ b/setup.py @@ -5,29 +5,28 @@ # User-friendly description from README.md current_directory = os.path.dirname(os.path.abspath(__file__)) try: - with open(os.path.join(current_directory, 'README.md'), encoding='utf-8') as f: + with open(os.path.join(current_directory, "README.md"), encoding="utf-8") as f: long_description = f.read() except Exception: - long_description = '' + long_description = "" setup( - name='pybop', - packages=find_packages('.'), - version='0.0.1', - license='BSD-3-Clause', - description='Python Battery Optimisation and Parameterisation', - long_description=long_description, - long_description_content_type='text/markdown', - url='https://github.com/pybop-team/PyBOP', - - install_requires=[ + name="pybop", + packages=find_packages("."), + version="0.0.1", + license="BSD-3-Clause", + description="Python Battery Optimisation and Parameterisation", + long_description=long_description, + long_description_content_type="text/markdown", + url="https://github.com/pybop-team/PyBOP", + install_requires=[ "pybamm>=23.1", "numpy>=1.16", "scipy>=1.3", "pandas>=1.0", "nlopt>=2.6", - ], - # https://pypi.org/classifiers/ - classifiers=[], + ], + # https://pypi.org/classifiers/ + classifiers=[], python_requires=">=3.8,<=3.12", ) From 48c44ceca2230fe0e9618b08bd587bd0f7074b9e Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 22 Sep 2023 10:05:40 +0100 Subject: [PATCH 082/210] release-action.yaml trigger fix for TestPyPI --- .github/workflows/release-action.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-action.yaml b/.github/workflows/release-action.yaml index 449464c97..8bfa74f15 100644 --- a/.github/workflows/release-action.yaml +++ b/.github/workflows/release-action.yaml @@ -86,7 +86,7 @@ jobs: publish-to-testpypi: name: Publish Python 🐍 distribution 📦 to TestPyPI - if: tags contains 'rc' # only publish to TestPyPI on release candidate tags + if: contains(github.ref, 'rc') # only publish to TestPyPI for rc tags needs: - build runs-on: ubuntu-latest From 794d2e882e06bbd28256996c7b07b4d560a9890e Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Sun, 24 Sep 2023 16:42:03 +0100 Subject: [PATCH 083/210] Updt. contributors section, architecture hyperlink --- README.md | 28 ++++++++-------------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 860d6e3cf..518393dfd 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ The figure below gives PyBOP's current conceptual structure. The living software <p align="center"> - <img src="assets/PyBOP_Architecture.png" alt="Data flows from battery cycling machines to Galv Harvesters, then to the Galv server and REST API. Metadata can be updated and data read using the web client, and data can be downloaded by the Python client." width="600" /> + <img src="https://raw.githubusercontent.com/pybop-team/PyBOP/develop/assets/PyBOP_Architecture.png" alt="Data flows from battery cycling machines to Galv Harvesters, then to the Galv server and REST API. Metadata can be updated and data read using the web client, and data can be downloaded by the Python client." width="600" /> </p> <!-- Getting Started --> @@ -84,7 +84,7 @@ Later, you can deactivate the environment and go back to your original system us deactivate ``` -Note that there are alternative packages which can be used to create and manage [virtual environments](https://realpython.com/python-virtual-environments-a-primer/), for example [pyenv](https://github.com/pyenv/pyenv#installation) and [pyenv-virtualenv](https://github.com/pyenv/pyenv-virtualenv#installation). In this case, follow the instructions to install these packages and then to create, activate and deactivate a virtual environment, use: +Note that there are alternative packages that can be used to create and manage [virtual environments](https://realpython.com/python-virtual-environments-a-primer/), for example [pyenv](https://github.com/pyenv/pyenv#installation) and [pyenv-virtualenv](https://github.com/pyenv/pyenv-virtualenv#installation). In this case, follow the instructions to install these packages and then to create, activate and deactivate a virtual environment, use: ```bash pyenv virtualenv pybop-env @@ -104,11 +104,11 @@ To alternatively install PyBOP from a local directory, use the following templat pip install -e "PATH_TO_PYBOP" ``` -Now, with PyBOP installed in your virtual environment, you can run Python scripts which import and use the functionality of this package. +Now, with PyBOP installed in your virtual environment, you can run Python scripts that import and use the functionality of this package. <!-- Example Usage --> ### Usage -PyBOP has two classes of intended use case: +PyBOP has two classes of intended use cases: 1. parameter estimation from battery test data 2. design optimisation subject to battery manufacturing/usage constraints @@ -204,8 +204,9 @@ learning from the success of the [PyBaMM](https://pybamm.org/) community. Our va <!-- Contributing --> -## Contributing -Thanks to all of our contributing members! [[emoji key](https://allcontributors.org/docs/en/emoji-key)] +## Contributors ✨ + +Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): <!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --> <!-- prettier-ignore-start --> @@ -226,17 +227,4 @@ Thanks to all of our contributing members! [[emoji key](https://allcontributors. <!-- ALL-CONTRIBUTORS-LIST:END --> -Contributions are always welcome! See `contributing.md` for ways to get started. - -## Contributors ✨ - -Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): - -<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --> -<!-- prettier-ignore-start --> -<!-- markdownlint-disable --> -<!-- markdownlint-restore --> -<!-- prettier-ignore-end --> -<!-- ALL-CONTRIBUTORS-LIST:END --> - -This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specifications. Contributions of any kind are welcome! \ No newline at end of file +This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specifications. Contributions of any kind are welcome! See `contributing.md` for ways to get started. \ No newline at end of file From 13d41b24c207b7bac16dcb2d3cf8172692eee066 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Mon, 25 Sep 2023 16:05:31 +0100 Subject: [PATCH 084/210] Add version.py functionality --- setup.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 3e374ef47..ba81b7f8e 100644 --- a/setup.py +++ b/setup.py @@ -9,11 +9,16 @@ long_description = f.read() except Exception: long_description = "" + +# Defines __version__ +root = os.path.abspath(os.path.dirname(__file__)) +with open(os.path.join(root, "pybop", "version.py")) as f: + exec(f.read()) setup( name="pybop", packages=find_packages("."), - version="0.0.1", + version=__version__, license="BSD-3-Clause", description="Python Battery Optimisation and Parameterisation", long_description=long_description, From e45ae119e509b55da74221a38604009c230591f4 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Mon, 25 Sep 2023 16:06:01 +0100 Subject: [PATCH 085/210] python version requries --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index ba81b7f8e..a2804312c 100644 --- a/setup.py +++ b/setup.py @@ -33,5 +33,5 @@ ], # https://pypi.org/classifiers/ classifiers=[], - python_requires=">=3.8,<=3.12", + python_requires=">=3.8,<=3.11", ) From dbcb8380121f74f1c652593724b6db4bef930614 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Mon, 25 Sep 2023 16:17:05 +0100 Subject: [PATCH 086/210] revert python version change --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index a2804312c..ba81b7f8e 100644 --- a/setup.py +++ b/setup.py @@ -33,5 +33,5 @@ ], # https://pypi.org/classifiers/ classifiers=[], - python_requires=">=3.8,<=3.11", + python_requires=">=3.8,<=3.12", ) From 4d5cd3c1216aadd14aa438df8a4357ceb3627392 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Mon, 25 Sep 2023 16:53:40 +0100 Subject: [PATCH 087/210] Transfer pybamm model construction methods to BaseModel, Add pybamm SPMe class --- pybop/models/BaseModel.py | 143 +++++++++++++++- pybop/models/lithium_ion/__init__.py | 2 +- pybop/models/lithium_ion/pybamm_models.py | 79 +++++++++ pybop/models/lithium_ion/spm.py | 188 ---------------------- pybop/parameterisation.py | 2 +- 5 files changed, 220 insertions(+), 194 deletions(-) create mode 100644 pybop/models/lithium_ion/pybamm_models.py delete mode 100644 pybop/models/lithium_ion/spm.py diff --git a/pybop/models/BaseModel.py b/pybop/models/BaseModel.py index 809a99e28..1c2c3a3f5 100644 --- a/pybop/models/BaseModel.py +++ b/pybop/models/BaseModel.py @@ -1,4 +1,5 @@ import pybop +import pybamm class BaseModel: @@ -7,18 +8,152 @@ class BaseModel: """ def __init__(self, name="Base Model"): - # self.pybamm_model = None + self.pybamm_model = None self.name = name # self.parameter_set = None - def build(self): + def build( + self, + observations, + fit_parameters, + check_model=True, + init_soc=None, + ): + """ + Build the model (if not built already). + """ + if init_soc is not None: + self.set_init_soc(init_soc) + + if self._built_model: + return + + elif self.pybamm_model.is_discretised: + self._model_with_set_params = self.pybamm_model + self._built_model = self.pybamm_model + else: + self.set_params(observations, fit_parameters) + self._mesh = pybamm.Mesh(self.geometry, self.submesh_types, self.var_pts) + self._disc = pybamm.Discretisation(self.mesh, self.spatial_methods) + self._built_model = self._disc.process_model( + self._model_with_set_params, inplace=False, check_model=check_model + ) + # Set t_eval + self.time_data = self._parameter_set["Current function [A]"].x[0] + + # Clear solver + self._solver._model_set_up = {} + + def set_init_soc(self, init_soc): """ - Build the model + Set the initial state of charge. """ - pass + if self._built_initial_soc != init_soc: + # reset + self._model_with_set_params = None + self._built_model = None + self.op_conds_to_built_models = None + self.op_conds_to_built_solvers = None + + param = self.pybamm_model.param + self.parameter_set = ( + self._unprocessed_parameter_set.set_initial_stoichiometries( + init_soc, param=param, inplace=False + ) + ) + # Save solved initial SOC in case we need to rebuild the model + self._built_initial_soc = init_soc + + def set_params(self, observations, fit_parameters): + """ + Set the parameters in the model. + """ + if self.model_with_set_params: + return + + try: + self.parameter_set["Current function [A]"] = pybamm.Interpolant( + observations["Time [s]"].data, + observations["Current function [A]"].data, + pybamm.t, + ) + except: + raise ValueError("Current function not supplied") + + # set input parameters in parameter set from fitting parameters + for i in fit_parameters: + self.parameter_set[i] = "[input]" + + self._model_with_set_params = self._parameter_set.process_model( + self._unprocessed_model, inplace=False + ) + self._parameter_set.process_geometry(self.geometry) + self.pybamm_model = self._model_with_set_params + def sim(self): """ Simulate the model """ pass + + @property + def built_model(self): + return self._built_model + + @property + def parameter_set(self): + return self._parameter_set + + @parameter_set.setter + def parameter_set(self, parameter_set): + self._parameter_set = parameter_set.copy() + + @property + def model_with_set_params(self): + return self._model_with_set_params + + @property + def geometry(self): + return self._geometry + + @geometry.setter + def geometry(self, geometry): + self._geometry = geometry.copy() + + @property + def submesh_types(self): + return self._submesh_types + + @submesh_types.setter + def submesh_types(self, submesh_types): + self._submesh_types = submesh_types.copy() + + @property + def mesh(self): + return self._mesh + + @property + def var_pts(self): + return self._var_pts + + @var_pts.setter + def var_pts(self, var_pts): + self._var_pts = var_pts.copy() + + @property + def spatial_methods(self): + return self._spatial_methods + + @spatial_methods.setter + def spatial_methods(self, spatial_methods): + self._spatial_methods = spatial_methods.copy() + + @property + def solver(self): + return self._solver + + @solver.setter + def solver(self, solver): + self._solver = solver.copy() + diff --git a/pybop/models/lithium_ion/__init__.py b/pybop/models/lithium_ion/__init__.py index bd2bf037b..c7de73260 100644 --- a/pybop/models/lithium_ion/__init__.py +++ b/pybop/models/lithium_ion/__init__.py @@ -2,4 +2,4 @@ # Import lithium ion based models # -from .spm import SPM +from .pybamm_models import SPM, SPMe diff --git a/pybop/models/lithium_ion/pybamm_models.py b/pybop/models/lithium_ion/pybamm_models.py new file mode 100644 index 000000000..fa391022b --- /dev/null +++ b/pybop/models/lithium_ion/pybamm_models.py @@ -0,0 +1,79 @@ +import pybop +import pybamm +from ..BaseModel import BaseModel + + +class SPM(BaseModel): + """ + Composition of the SPM class in PyBaMM. + """ + + def __init__( + self, + name="Single Particle Model", + parameter_set=None, + geometry=None, + submesh_types=None, + var_pts=None, + spatial_methods=None, + solver=None, + ): + super().__init__() + self.pybamm_model = pybamm.lithium_ion.SPM() + self._unprocessed_model = self.pybamm_model + self.name = name + + self.parameter_set = parameter_set or self.pybamm_model.default_parameter_values + self._unprocessed_parameter_set = self.parameter_set + + self.geometry = geometry or self.pybamm_model.default_geometry + self.submesh_types = submesh_types or self.pybamm_model.default_submesh_types + self.var_pts = var_pts or self.pybamm_model.default_var_pts + self.spatial_methods = ( + spatial_methods or self.pybamm_model.default_spatial_methods + ) + self.solver = solver or self.pybamm_model.default_solver + + self._model_with_set_params = None + self._built_model = None + self._built_initial_soc = None + self._mesh = None + self._disc = None + + +class SPMe(BaseModel): + """ + Composition of the SPMe class in PyBaMM. + """ + + def __init__( + self, + name="Single Particle Model with Electrolyte", + parameter_set=None, + geometry=None, + submesh_types=None, + var_pts=None, + spatial_methods=None, + solver=None, + ): + super().__init__() + self.pybamm_model = pybamm.lithium_ion.SPMe() + self._unprocessed_model = self.pybamm_model + self.name = name + + self.parameter_set = parameter_set or self.pybamm_model.default_parameter_values + self._unprocessed_parameter_set = self.parameter_set + + self.geometry = geometry or self.pybamm_model.default_geometry + self.submesh_types = submesh_types or self.pybamm_model.default_submesh_types + self.var_pts = var_pts or self.pybamm_model.default_var_pts + self.spatial_methods = ( + spatial_methods or self.pybamm_model.default_spatial_methods + ) + self.solver = solver or self.pybamm_model.default_solver + + self._model_with_set_params = None + self._built_model = None + self._built_initial_soc = None + self._mesh = None + self._disc = None \ No newline at end of file diff --git a/pybop/models/lithium_ion/spm.py b/pybop/models/lithium_ion/spm.py deleted file mode 100644 index 133a241b6..000000000 --- a/pybop/models/lithium_ion/spm.py +++ /dev/null @@ -1,188 +0,0 @@ -import pybop -import pybamm -from ..BaseModel import BaseModel - - -class SPM(BaseModel): - """ - Composition of the SPM class in PyBaMM. - """ - - def __init__( - self, - name="Single Particle Model", - parameter_set=None, - geometry=None, - submesh_types=None, - var_pts=None, - spatial_methods=None, - solver=None, - ): - super().__init__() - self.pybamm_model = pybamm.lithium_ion.SPM() - self._unprocessed_model = self.pybamm_model - self.name = name - - self.parameter_set = parameter_set or self.pybamm_model.default_parameter_values - self._unprocessed_parameter_set = self.parameter_set - - self.geometry = geometry or self.pybamm_model.default_geometry - self.submesh_types = submesh_types or self.pybamm_model.default_submesh_types - self.var_pts = var_pts or self.pybamm_model.default_var_pts - self.spatial_methods = ( - spatial_methods or self.pybamm_model.default_spatial_methods - ) - self.solver = solver or self.pybamm_model.default_solver - - self._model_with_set_params = None - self._built_model = None - self._built_initial_soc = None - self._mesh = None - self._disc = None - - def build_model( - self, - observations, - fit_parameters, - check_model=True, - init_soc=None, - ): - """ - Build the model (if not built already). - """ - if init_soc is not None: - self.set_init_soc(init_soc) - - if self._built_model: - return - - elif self.pybamm_model.is_discretised: - self._model_with_set_params = self.pybamm_model - self._built_model = self.pybamm_model - else: - self.set_params(observations, fit_parameters) - self._mesh = pybamm.Mesh(self.geometry, self.submesh_types, self.var_pts) - self._disc = pybamm.Discretisation(self.mesh, self.spatial_methods) - self._built_model = self._disc.process_model( - self._model_with_set_params, inplace=False, check_model=check_model - ) - # Set t_eval - self.time_data = self._parameter_set["Current function [A]"].x[0] - - # Clear solver - self._solver._model_set_up = {} - - def set_init_soc(self, init_soc): - """ - Set the initial state of charge. - """ - if self._built_initial_soc != init_soc: - # reset - self._model_with_set_params = None - self._built_model = None - self.op_conds_to_built_models = None - self.op_conds_to_built_solvers = None - - param = self.pybamm_model.param - self.parameter_set = ( - self._unprocessed_parameter_set.set_initial_stoichiometries( - init_soc, param=param, inplace=False - ) - ) - # Save solved initial SOC in case we need to rebuild the model - self._built_initial_soc = init_soc - - def set_params(self, observations, fit_parameters): - """ - Set the parameters in the model. - """ - if self.model_with_set_params: - return - - try: - self.parameter_set["Current function [A]"] = pybamm.Interpolant( - observations["Time [s]"].data, - observations["Current function [A]"].data, - pybamm.t, - ) - except: - raise ValueError("Current function not supplied") - - # set input parameters in parameter set from fitting parameters - for i in fit_parameters: - self.parameter_set[i] = "[input]" - - self._model_with_set_params = self._parameter_set.process_model( - self._unprocessed_model, inplace=False - ) - self._parameter_set.process_geometry(self.geometry) - self.pybamm_model = self._model_with_set_params - - def sim(self): - """ - Simulate the model - """ - - @property - def built_model(self): - return self._built_model - - @property - def parameter_set(self): - return self._parameter_set - - @parameter_set.setter - def parameter_set(self, parameter_set): - self._parameter_set = parameter_set.copy() - - @property - def model_with_set_params(self): - return self._model_with_set_params - - @property - def built_model(self): - return self._built_model - - @property - def geometry(self): - return self._geometry - - @geometry.setter - def geometry(self, geometry): - self._geometry = geometry.copy() - - @property - def submesh_types(self): - return self._submesh_types - - @submesh_types.setter - def submesh_types(self, submesh_types): - self._submesh_types = submesh_types.copy() - - @property - def mesh(self): - return self._mesh - - @property - def var_pts(self): - return self._var_pts - - @var_pts.setter - def var_pts(self, var_pts): - self._var_pts = var_pts.copy() - - @property - def spatial_methods(self): - return self._spatial_methods - - @spatial_methods.setter - def spatial_methods(self, spatial_methods): - self._spatial_methods = spatial_methods.copy() - - @property - def solver(self): - return self._solver - - @solver.setter - def solver(self, solver): - self._solver = solver.copy() diff --git a/pybop/parameterisation.py b/pybop/parameterisation.py index aa6828d3c..cbc802240 100644 --- a/pybop/parameterisation.py +++ b/pybop/parameterisation.py @@ -47,7 +47,7 @@ def __init__( self.fit_dict[j] = {j: self.x0[i]} # Build model with observations and fitting_parameters - self.model.build_model( + self.model.build( self.observations, self.fit_parameters, check_model=check_model, From 1e79b47558e6fa767fd2da4e9d8fd7e9e5221e49 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Tue, 26 Sep 2023 14:34:03 +0100 Subject: [PATCH 088/210] Add sim method, bugfix data reference in example --- .../{Initial_API.py => rmse-estimisation.py} | 6 +- pybop/models/BaseModel.py | 73 ++++++++++--------- pybop/models/lithium_ion/pybamm_models.py | 2 +- setup.py | 2 +- 4 files changed, 43 insertions(+), 40 deletions(-) rename examples/scripts/{Initial_API.py => rmse-estimisation.py} (85%) diff --git a/examples/scripts/Initial_API.py b/examples/scripts/rmse-estimisation.py similarity index 85% rename from examples/scripts/Initial_API.py rename to examples/scripts/rmse-estimisation.py index 5a47e27aa..1e82d1df6 100644 --- a/examples/scripts/Initial_API.py +++ b/examples/scripts/rmse-estimisation.py @@ -3,7 +3,7 @@ import numpy as np # Form observations -Measurements = pd.read_csv("examples/Chen_example.csv", comment="#").to_numpy() +Measurements = pd.read_csv("examples/scripts/Chen_example.csv", comment="#").to_numpy() observations = [ pybop.Observed("Time [s]", Measurements[:, 0]), pybop.Observed("Current function [A]", Measurements[:, 1]), @@ -11,8 +11,8 @@ ] # Define model -parameter_set = pybop.ParameterSet("pybamm", "Chen2020") -model = pybop.models.lithium_ion.SPM(parameter_set=parameter_set) +# parameter_set = pybop.ParameterSet("pybamm", "Chen2020") +model = pybop.models.lithium_ion.SPM() # Fitting parameters params = [ diff --git a/pybop/models/BaseModel.py b/pybop/models/BaseModel.py index 1c2c3a3f5..0e9fdca9c 100644 --- a/pybop/models/BaseModel.py +++ b/pybop/models/BaseModel.py @@ -13,36 +13,36 @@ def __init__(self, name="Base Model"): # self.parameter_set = None def build( - self, - observations, - fit_parameters, - check_model=True, - init_soc=None, - ): - """ - Build the model (if not built already). - """ - if init_soc is not None: - self.set_init_soc(init_soc) - - if self._built_model: - return - - elif self.pybamm_model.is_discretised: - self._model_with_set_params = self.pybamm_model - self._built_model = self.pybamm_model - else: - self.set_params(observations, fit_parameters) - self._mesh = pybamm.Mesh(self.geometry, self.submesh_types, self.var_pts) - self._disc = pybamm.Discretisation(self.mesh, self.spatial_methods) - self._built_model = self._disc.process_model( - self._model_with_set_params, inplace=False, check_model=check_model - ) - # Set t_eval - self.time_data = self._parameter_set["Current function [A]"].x[0] - - # Clear solver - self._solver._model_set_up = {} + self, + observations, + fit_parameters, + check_model=True, + init_soc=None, + ): + """ + Build the model (if not built already). + """ + if init_soc is not None: + self.set_init_soc(init_soc) + + if self._built_model: + return + + elif self.pybamm_model.is_discretised: + self._model_with_set_params = self.pybamm_model + self._built_model = self.pybamm_model + else: + self.set_params(observations, fit_parameters) + self._mesh = pybamm.Mesh(self.geometry, self.submesh_types, self.var_pts) + self._disc = pybamm.Discretisation(self.mesh, self.spatial_methods) + self._built_model = self._disc.process_model( + self._model_with_set_params, inplace=False, check_model=check_model + ) + # Set t_eval + self.time_data = self._parameter_set["Current function [A]"].x[0] + + # Clear solver + self._solver._model_set_up = {} def set_init_soc(self, init_soc): """ @@ -90,13 +90,17 @@ def set_params(self, observations, fit_parameters): self._parameter_set.process_geometry(self.geometry) self.pybamm_model = self._model_with_set_params - - def sim(self): + def sim(self, experiment=None, parameter_set=None): """ Simulate the model """ - pass - + self.parameter_set = parameter_set or self.parameter_set + return pybamm.Simulation( + self._built_model, + experiment=experiment, + parameter_values=self.parameter_set, + ) + @property def built_model(self): return self._built_model @@ -156,4 +160,3 @@ def solver(self): @solver.setter def solver(self, solver): self._solver = solver.copy() - diff --git a/pybop/models/lithium_ion/pybamm_models.py b/pybop/models/lithium_ion/pybamm_models.py index fa391022b..9914cc837 100644 --- a/pybop/models/lithium_ion/pybamm_models.py +++ b/pybop/models/lithium_ion/pybamm_models.py @@ -76,4 +76,4 @@ def __init__( self._built_model = None self._built_initial_soc = None self._mesh = None - self._disc = None \ No newline at end of file + self._disc = None diff --git a/setup.py b/setup.py index ba81b7f8e..28900d55e 100644 --- a/setup.py +++ b/setup.py @@ -9,7 +9,7 @@ long_description = f.read() except Exception: long_description = "" - + # Defines __version__ root = os.path.abspath(os.path.dirname(__file__)) with open(os.path.join(root, "pybop", "version.py")) as f: From 49b39f1fd3c0562076cbe44c12075b17eae5c74e Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Tue, 26 Sep 2023 15:19:06 +0100 Subject: [PATCH 089/210] Add entry logic for sim method, Add SPMe parameterisation testcase --- pybop/models/BaseModel.py | 15 +++++--- tests/unit/test_parameterisation.py | 59 ++++++++++++++++++++++++----- 2 files changed, 59 insertions(+), 15 deletions(-) diff --git a/pybop/models/BaseModel.py b/pybop/models/BaseModel.py index 0e9fdca9c..ecaed6f3e 100644 --- a/pybop/models/BaseModel.py +++ b/pybop/models/BaseModel.py @@ -94,12 +94,15 @@ def sim(self, experiment=None, parameter_set=None): """ Simulate the model """ - self.parameter_set = parameter_set or self.parameter_set - return pybamm.Simulation( - self._built_model, - experiment=experiment, - parameter_values=self.parameter_set, - ) + if self.pybamm_model is not None: + self.parameter_set = parameter_set or self.parameter_set + return pybamm.Simulation( + self.pybamm_model, + experiment=experiment, + parameter_values=self.parameter_set, + ) + else: + raise ValueError("Sim currently only supports PyBaMM models") @property def built_model(self): diff --git a/tests/unit/test_parameterisation.py b/tests/unit/test_parameterisation.py index 40d2b7f3d..f9f821f90 100644 --- a/tests/unit/test_parameterisation.py +++ b/tests/unit/test_parameterisation.py @@ -1,15 +1,13 @@ import pybop import pybamm -import pytest import numpy as np class TestParameterisation: - def getdata(self, x0): - model = pybamm.lithium_ion.SPM() - params = model.default_parameter_values + def getdata(self, model, x0): + model.parameter_set = model.pybamm_model.default_parameter_values - params.update( + model.parameter_set.update( { "Negative electrode active material volume fraction": x0[0], "Positive electrode active material volume fraction": x0[1], @@ -26,13 +24,18 @@ def getdata(self, x0): ] * 2 ) - sim = pybamm.Simulation(model, experiment=experiment, parameter_values=params) + sim = model.sim(experiment=experiment) return sim.solve() - def test_rmse(self): + def test_spm(self): + + # Define model + model = pybop.lithium_ion.SPM() + model.parameter_set = model.pybamm_model.default_parameter_values + # Form observations x0 = np.array([0.52, 0.63]) - solution = self.getdata(x0) + solution = self.getdata(model, x0) observations = [ pybop.Observed("Time [s]", solution["Time [s]"].data), @@ -40,10 +43,48 @@ def test_rmse(self): pybop.Observed("Voltage [V]", solution["Terminal voltage [V]"].data), ] + # Fitting parameters + params = [ + pybop.Parameter( + "Negative electrode active material volume fraction", + prior=pybop.Gaussian(0.5, 0.02), + bounds=[0.375, 0.625], + ), + pybop.Parameter( + "Positive electrode active material volume fraction", + prior=pybop.Gaussian(0.65, 0.02), + bounds=[0.525, 0.75], + ), + ] + + parameterisation = pybop.Parameterisation( + model, observations=observations, fit_parameters=params + ) + + # get RMSE estimate using NLOpt + results, last_optim, num_evals = parameterisation.rmse( + signal="Voltage [V]", method="nlopt" + ) + # Assertions + np.testing.assert_allclose(last_optim, 1e-3, atol=1e-2) + np.testing.assert_allclose(results, x0, atol=1e-1) + + def test_spme(self): + # Define model - model = pybop.models.lithium_ion.SPM() + model = pybop.lithium_ion.SPMe() model.parameter_set = model.pybamm_model.default_parameter_values + # Form observations + x0 = np.array([0.52, 0.63]) + solution = self.getdata(model, x0) + + observations = [ + pybop.Observed("Time [s]", solution["Time [s]"].data), + pybop.Observed("Current function [A]", solution["Current [A]"].data), + pybop.Observed("Voltage [V]", solution["Terminal voltage [V]"].data), + ] + # Fitting parameters params = [ pybop.Parameter( From bab4b374315662123178f77c548d51972ee67f9d Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Tue, 26 Sep 2023 15:42:57 +0100 Subject: [PATCH 090/210] Tidy __init__, Updt. model directory names, Updt. BaseModel sim error message --- pybop/__init__.py | 14 +++----------- pybop/models/BaseModel.py | 2 +- pybop/models/lithium_ion/__init__.py | 2 +- .../lithium_ion/{pybamm_models.py => pybamm.py} | 0 4 files changed, 5 insertions(+), 13 deletions(-) rename pybop/models/lithium_ion/{pybamm_models.py => pybamm.py} (100%) diff --git a/pybop/__init__.py b/pybop/__init__.py index ad678ba42..1b71c1d46 100644 --- a/pybop/__init__.py +++ b/pybop/__init__.py @@ -2,20 +2,18 @@ # Root of the pybop module. # Provides access to all shared functionality (models, solvers, etc.). # -# The code in this file is adapted from Pints +# This file is adapted from Pints # (see https://github.com/pints-team/pints) # import sys import os - # # Version info # from pybop.version import __version__ - # # Constants # @@ -28,19 +26,13 @@ # # Model Classes # -from .models import BaseModel -from .models import lithium_ion +from .models import BaseModel, lithium_ion # # Parameterisation class # -from .parameter_sets import ParameterSet - -# -# Parameterisation class -# - from .parameterisation import Parameterisation +from .parameter_sets import ParameterSet from .parameters import Parameter # diff --git a/pybop/models/BaseModel.py b/pybop/models/BaseModel.py index ecaed6f3e..697900f7a 100644 --- a/pybop/models/BaseModel.py +++ b/pybop/models/BaseModel.py @@ -102,7 +102,7 @@ def sim(self, experiment=None, parameter_set=None): parameter_values=self.parameter_set, ) else: - raise ValueError("Sim currently only supports PyBaMM models") + raise ValueError("This sim method currently only supports PyBaMM models") @property def built_model(self): diff --git a/pybop/models/lithium_ion/__init__.py b/pybop/models/lithium_ion/__init__.py index c7de73260..43b78b32e 100644 --- a/pybop/models/lithium_ion/__init__.py +++ b/pybop/models/lithium_ion/__init__.py @@ -2,4 +2,4 @@ # Import lithium ion based models # -from .pybamm_models import SPM, SPMe +from .pybamm import SPM, SPMe diff --git a/pybop/models/lithium_ion/pybamm_models.py b/pybop/models/lithium_ion/pybamm.py similarity index 100% rename from pybop/models/lithium_ion/pybamm_models.py rename to pybop/models/lithium_ion/pybamm.py From 6646078b62cd8048f87aadbaa4f171bf76906b02 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Mon, 2 Oct 2023 18:20:18 +0100 Subject: [PATCH 091/210] Bump version for initial release --- pybop/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pybop/version.py b/pybop/version.py index f102a9cad..41a1fa8c0 100644 --- a/pybop/version.py +++ b/pybop/version.py @@ -1 +1 @@ -__version__ = "0.0.1" +__version__ = "23.09" From 99c00954338ad795e2d03dc79263fcfa94f1b68b Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Tue, 3 Oct 2023 13:08:46 +0100 Subject: [PATCH 092/210] Updt contributing.md for recommendation on source citation --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2a34360f1..30d2fe59f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -68,7 +68,7 @@ Class names are CamelCase, and start with an upper case letter, for example `MyO While it's a bad idea for developers to "reinvent the wheel", it's important for users to get a _reasonably sized download and an easy install_. In addition, external libraries can sometimes cease to be supported, and when they contain bugs it might take a while before fixes become available as automatic downloads to PyBOP users. For these reasons, all dependencies in PyBOP should be thought about carefully and discussed on GitHub. -Direct inclusion of code from other packages is possible, as long as their license permits it and is compatible with ours, but again should be considered carefully and discussed in the group. Snippets from blogs and [stackoverflow](https://stackoverflow.com/) can often be included without attribution, but if they solve a particularly nasty problem (or are very hard to read) it's often a good idea to attribute (and document) them, by commenting with a link in the source code. +Direct inclusion of code from other packages is possible, as long as their license permits it and is compatible with ours, but again should be considered carefully and discussed in the group. Snippets from blogs and [stackoverflow](https://stackoverflow.com/) can often be included but must include attribution to the original by commenting with a link in the source code. ### Separating dependencies From 37f512b6cd44d81ec90633c5dd35842f1f3cdfa6 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Wed, 4 Oct 2023 11:26:44 +0100 Subject: [PATCH 093/210] Add identified parameters --- examples/notebooks/rmse-estimisation.ipynb | 192 ++++++++++++++++++--- 1 file changed, 166 insertions(+), 26 deletions(-) diff --git a/examples/notebooks/rmse-estimisation.ipynb b/examples/notebooks/rmse-estimisation.ipynb index 3f0dfcbf5..f8fa02219 100644 --- a/examples/notebooks/rmse-estimisation.ipynb +++ b/examples/notebooks/rmse-estimisation.ipynb @@ -11,12 +11,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Note: you may need to restart the kernel to use updated packages.\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], "source": [ - "%pip install git+https://github.com/pybop-team/PyBOP.git@develop -q \n", - "%pip install pybamm -q" + "%pip install --upgrade pip ipywidgets pybamm -q\n", + "%pip install git+https://github.com/pybop-team/PyBOP.git@develop -q " ] }, { @@ -28,7 +37,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -54,7 +63,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -71,7 +80,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -92,7 +101,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -120,9 +129,44 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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S2VdBQDA2LFjtRq8H1UTXQUAwLvvvot33323whgiIiIiIiIiopfRggULMGbMGIwYMQIAEB0djbi4OCxfvhyfffZZmfjVq1drzS9duhQbN25EcnIyAgICpOVyubzKY9IVFBSgoKBAmtdoNAAAQ0PDau8PEVFtqfad6ERERERERERE9HwrLCxEeno6vL29pWV6enrw9vZGWlpaleq4c+cOioqKYGlpqbU8NTUVTZo0gZOTE8aPH48bN26UW0dERATMzc2lyc7O7vF2iIioFrERnYiIiIiIiIiojvnnn39QXFwMKysrreVWVlZQq9VVquPTTz+Fra2tVkO8r68vVq5cieTkZHz99dfYuXMn/Pz8UFxcrLOOsLAw5ObmStOVK1cAACUlJY+5Z0REzx4b0YmIiIiI6pAlS5bAxcUFCoUCCoUCnp6e+PXXXwEAN2/exEcffQQnJycYGxujWbNmmDBhAnJzc7XqeHTAOJlMhrVr12rFpKamokOHDpDL5WjRogViY2PL5FKdweyIiOj5Mnv2bKxduxabN2+GkZGRtHzQoEF488030a5dO/j7+2P79u04dOgQUlNTddYjl8ul76TSCQDu3r37LHaDiKhGsBGdiIiIiKgOadq0KWbPno309HQcPnwYPXv2RP/+/XHy5Elcu3YN165dw7x583DixAnExsYiPj4eo0aNKlNPTEyM1qBx/v7+UllmZib69u2LHj16QKVSISQkBKNHj0ZCQoIUU93B7IiIqGY1atQI+vr6yM7O1lqenZ1daX/m8+bNw+zZs5GYmAgXF5cKY5s3b45GjRrh/PnzT5wzEdHzqtoDixIRERER0fOrX79+WvNffvkllixZgv3792PUqFHYuHGjVPbqq6/iyy+/xPvvv4/79++jXr3//XlgYWFRbiNLdHQ0HB0dMX/+fABAmzZtsGfPHixcuBBKpRJA9QezK1XeAHRERFQ9hoaGcHd3R3JysvRDaElJCZKTkxEcHFzuenPmzMGXX36JhIQEdOzYsdLtXL16FTdu3ICNjU1NpU5E9NzhnehERERERHVUcXEx1q5di/z8fHh6euqMyc3NhUKh0GpAB4CgoCA0atQInTp1wvLlyyGEkMrS0tK0+scFAKVSKQ1U9ySD2XEAOiKimhMaGooffvgBK1aswOnTpzF+/Hjk5+dLP3AGBAQgLCxMiv/666/xxRdf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F/t1IqLah307EREVZ8KECfjpp58wfPhwfPnllzA0NMTdu3exfft2/Pzzz1BVVS1TOYcOHcL9+/fRs2dP1K9fH7///jvy8vJgZWVVyS2gmogj0anO+frrr5GSkoI1a9Zg5syZePfdd/HFF1+Uq4zIyEgAwNq1a3Hnzh388ccfcHd3B5B/w09ERFWH/ToRUe3Dvp2IiIpjZmaGM2fOIDc3F46OjmjXrh2mTJkCAwMDqKiUPdRpYGCAPXv24MMPP0SrVq0QEBCAX3/9FW3atKnE2lNNxZHoVKeEhYVh1apVOH78OORyOQBg69at6NChA/z9/TF+/PgylRMZGQknJyfcv38f7dq1Q+vWrfHtt99i/PjxWLNmDbZu3VqZzSAiov/Hfp2IqPZh305EVPN5eHjAw8OjUHpgYKDCflhYWKE8RU3hJYRQ2G/ZsiX27NnzFjUEunfvXuT1iYrCIDrVKb1790Z2drZCmqWlJVJSUspVztWrV9G1a1d89913CumfffaZ9O83/SIgIqKyY79ORFT7sG8nIqLKkJKSAl1dXUyYMAGLFy8uNf+4cePwyy+/VEHNqCbgdC5EZfDDDz9AV1cXUVFRAPJvyNu1a1cp1xo3bhx0dXUrpWwiIsrHfp2IqPZh305ERMUZNGgQ7ty5g8jISMyYMaNM58ybNw+RkZG4c+cOPvroo0quIVV3MsGf1IlK9PjxY7x8+RIA0KRJEyQlJcHU1BQ3btxA69atK/x6iYmJSE1NBQCYmpqWe2VpIiIqGft1IqLah307ERERVSYG0YmIiIiIiIiIiIiIisHpXIiIiIiIiIiIiIiIisEgOhERERERERERERFRMRhEJyIiIiIiIiIiIiIqBoPoRERERERERERERETFYBCdiIiIiIiIiIiIiKgYDKITERERERERERERERWDQXQiIiIiIiIiIiIiomIwiE5EREREREREREREVAwG0YmIiIiIiIiIiIiIisEgOhERERERERERERFRMRhEJyIiIiIiIiIiIiIqBoPoRERERERERERERETFYBCdiIiIiIiIiIiIiKgYDKITERERERERERERERWDQXQiIiIiIiIiIiIiomIwiE5EREREREREREREVAwG0ancLC0tsWrVKqXWITAwEAYGBkqtQ3lVh9dNGXx9fdGxY8dynSOTybBv375ij/fu3RsymQwymQyRkZHl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Z49+/PFHbdq0SSNHjlRhYWG529m4caMWLFig1NRU/fLLL1q9erWKiorUrl27KowetVXVP7YcqGEuXryooUOH6t5771W7du00evRo7d+/X97e3uVuIy0tTRcuXJCfn5+lLCkpScePHy820wUAULUY1wGg7mFsBwCUxs/PT19++aWeeuop9enTR3l5eWrZsqUiIiJkZ1f++cJubm56//33NWPGDF24cEFt27bVf/7zH11//fVVGD1qK5LoqHeeeeYZnTlzRgsWLFCjRo306aef6sEHH9TGjRvL3UZqaqokaeHChXrsscd05MgRyxOcL168WBVhAwBKwbgOAHUPYzsA1G4jRozQiBEjipWvXLnSan/btm3F6pT06SOTyWS137ZtW73//vtXEaEUGhpa4vWBkrCcC+qVbdu2af78+XrzzTdlNBplZ2enN998U1988YWWLFlS7nZSU1MVHh6un376SR07dtQzzzyjZ599VkajUQsWLKjCHgAA/opxHQDqHsZ2AEBVOHPmjBo1aqSnnnqqXPUfeughNWrUqIqjQm3BTHTUKz179lR+fr5VWatWrXTmzJkrauebb77RTTfdpOeee86q/P7777d8X9F3UwEA5ce4DgB1D2M7AKCy3XXXXQoNDZVkXsalPGbOnKl///vfkqRmzZpVVWioJZiJDpTD4sWL1ahRI+3fv1+S+QV5x44dq+RavNMJAFWPcR0A6h7GdgBAaRo3bqw2bdqoTZs28vT0LNc53t7elnMaNmxYxRGipjOYeEsdKNPx48d1/vx5SVKLFi2UmZmpZs2a6eDBg+rQoUOlXy8jI0PZ2dmSzO90MlADQOViXAeAuoexHQAAVCWS6AAAAAAAAAAAlILlXAAAAAAAAAAAKAVJdAAAAAAAAAAASkESHQAAAAAAAACAUpBEBwAAAAAAAACgFCTRAQAAAAAAAAAoBUl0AAAAAAAAAABKQRIdAAAAAAAAAIBSkEQHAAAAAAAAAKAUJNEBAAAAAAAAACgFSXQAAAAAAAAAAErx/wG5zswtkpVtsAAAAABJRU5ErkJggg==", + "text/plain": [ + "<Figure size 1500x700 with 8 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "733a23c5511b4df7be43966d0fcc268b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "interactive(children=(FloatSlider(value=0.0, description='t', max=1680.0, step=16.8), Output()), _dom_classes=…" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "<pybamm.plotting.quick_plot.QuickPlot at 0x7fd9141a5f50>" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "sim.plot()" ] @@ -136,7 +180,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -160,7 +204,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -181,7 +225,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -208,7 +252,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -226,15 +270,85 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Last Voltage Values: 3.7996611982185766 3.7975057810794395\n", + "Last Voltage Values: 3.7998126133693533 3.7975057810794395\n", + "Last Voltage Values: 3.8031854726522285 3.7975057810794395\n", + "Last Voltage Values: 3.799468931833036 3.7975057810794395\n", + "Last Voltage Values: 3.795602883298669 3.7975057810794395\n", + "Last Voltage Values: 3.799699771891773 3.7975057810794395\n", + "Last Voltage Values: 3.7996774395763646 3.7975057810794395\n", + "Last Voltage Values: 3.799593518890104 3.7975057810794395\n", + "Last Voltage Values: 3.799509395374853 3.7975057810794395\n", + "Last Voltage Values: 3.799536439260354 3.7975057810794395\n", + "Last Voltage Values: 3.799500287332914 3.7975057810794395\n", + "Last Voltage Values: 3.7995753351359633 3.7975057810794395\n", + "Last Voltage Values: 3.7995384590593297 3.7975057810794395\n", + "Last Voltage Values: 3.7995486528904316 3.7975057810794395\n", + "Last Voltage Values: 3.799516169359653 3.7975057810794395\n", + "Last Voltage Values: 3.7995185726290273 3.7975057810794395\n", + "Last Voltage Values: 3.7995203555320374 3.7975057810794395\n", + "Last Voltage Values: 3.7995147509521265 3.7975057810794395\n", + "Last Voltage Values: 3.7995176549369756 3.7975057810794395\n", + "Last Voltage Values: 3.79951475648217 3.7975057810794395\n", + "Last Voltage Values: 3.799511594116657 3.7975057810794395\n", + "Last Voltage Values: 3.7995343783536892 3.7975057810794395\n", + "Last Voltage Values: 3.799509412527155 3.7975057810794395\n", + "Last Voltage Values: 3.7995128802129674 3.7975057810794395\n", + "Last Voltage Values: 3.799512401383983 3.7975057810794395\n", + "Last Voltage Values: 3.7995112796265267 3.7975057810794395\n", + "Last Voltage Values: 3.7995122788212523 3.7975057810794395\n", + "Last Voltage Values: 3.7995113814292405 3.7975057810794395\n", + "Last Voltage Values: 3.7995114700840316 3.7975057810794395\n", + "Last Voltage Values: 3.799511298272937 3.7975057810794395\n", + "Last Voltage Values: 3.799511135780194 3.7975057810794395\n", + "Last Voltage Values: 3.799510972324501 3.7975057810794395\n", + "Last Voltage Values: 3.7995318559387594 3.7975057810794395\n", + "Last Voltage Values: 3.799510973343803 3.7975057810794395\n", + "Last Voltage Values: 3.799511115021574 3.7975057810794395\n", + "Last Voltage Values: 3.7995110103732177 3.7975057810794395\n" + ] + } + ], "source": [ "results, last_optim, num_evals = parameterisation.rmse(\n", " signal=\"Voltage [V]\", method=\"nlopt\"\n", ")" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's view the identified parameters:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0.49301982, 0.63682677])" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "results" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -251,7 +365,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -271,9 +385,30 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "<matplotlib.legend.Legend at 0x7fd910dc2290>" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "<Figure size 640x480 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "plt.plot(corrupt_V, label='Groundtruth')\n", "plt.plot(optsol, label='Estimated')\n", @@ -285,18 +420,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { - "file_extension": ".jl", - "mimetype": "application/julia", + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", "name": "python", - "version": "3.10.12" - }, - "orig_nbformat": 4 + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.4" + } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } From a5c8f479d6fb08ed5440263b080f5649419783f7 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 6 Oct 2023 18:21:54 +0100 Subject: [PATCH 094/210] Updt. object tree & directory, Add pints forwardmodel methods --- examples/notebooks/rmse-estimisation.ipynb | 28 ++++----- pybop/__init__.py | 9 +-- pybop/costs/mle.py | 10 ++++ pybop/identification/__init__.py | 4 ++ pybop/{ => identification}/observations.py | 0 .../parameter.py} | 0 .../parameter_set.py} | 0 .../{ => identification}/parameterisation.py | 2 + pybop/models/BaseModel.py | 57 +++++++++++++------ pybop/models/lithium_ion/__init__.py | 2 +- .../lithium_ion/{pybamm.py => base_echem.py} | 6 +- tests/unit/test_parameterisation.py | 6 +- 12 files changed, 79 insertions(+), 45 deletions(-) create mode 100644 pybop/costs/mle.py create mode 100644 pybop/identification/__init__.py rename pybop/{ => identification}/observations.py (100%) rename pybop/{parameters.py => identification/parameter.py} (100%) rename pybop/{parameter_sets.py => identification/parameter_set.py} (100%) rename pybop/{ => identification}/parameterisation.py (98%) rename pybop/models/lithium_ion/{pybamm.py => base_echem.py} (90%) diff --git a/examples/notebooks/rmse-estimisation.ipynb b/examples/notebooks/rmse-estimisation.ipynb index f8fa02219..c4104d7be 100644 --- a/examples/notebooks/rmse-estimisation.ipynb +++ b/examples/notebooks/rmse-estimisation.ipynb @@ -25,7 +25,7 @@ ], "source": [ "%pip install --upgrade pip ipywidgets pybamm -q\n", - "%pip install git+https://github.com/pybop-team/PyBOP.git@develop -q " + "%pip install git+https://github.com/pybop-team/PyBOP.git@develop -q" ] }, { @@ -185,7 +185,7 @@ "outputs": [], "source": [ "corrupt_V = synthetic_sol[\"Terminal voltage [V]\"].data\n", - "corrupt_V += np.random.normal(0,0.005,len(corrupt_V))" + "corrupt_V += np.random.normal(0, 0.005, len(corrupt_V))" ] }, { @@ -210,10 +210,10 @@ "source": [ "model = pybop.lithium_ion.SPM()\n", "observations = [\n", - " pybop.Observed(\"Time [s]\", synthetic_sol[\"Time [s]\"].data),\n", - " pybop.Observed(\"Current function [A]\", synthetic_sol[\"Current [A]\"].data),\n", - " pybop.Observed(\"Voltage [V]\", corrupt_V),\n", - " ]" + " pybop.Observed(\"Time [s]\", synthetic_sol[\"Time [s]\"].data),\n", + " pybop.Observed(\"Current function [A]\", synthetic_sol[\"Current [A]\"].data),\n", + " pybop.Observed(\"Voltage [V]\", corrupt_V),\n", + "]" ] }, { @@ -370,9 +370,11 @@ "outputs": [], "source": [ "params.update(\n", - " {\"Negative electrode active material volume fraction\": results[0], \n", - " \"Positive electrode active material volume fraction\": results[1]}\n", - " )\n", + " {\n", + " \"Negative electrode active material volume fraction\": results[0],\n", + " \"Positive electrode active material volume fraction\": results[1],\n", + " }\n", + ")\n", "optsol = sim.solve()[\"Terminal voltage [V]\"].data" ] }, @@ -410,10 +412,10 @@ } ], "source": [ - "plt.plot(corrupt_V, label='Groundtruth')\n", - "plt.plot(optsol, label='Estimated')\n", - "plt.xlabel('Time (s)')\n", - "plt.ylabel('Voltage (V)')\n", + "plt.plot(corrupt_V, label=\"Groundtruth\")\n", + "plt.plot(optsol, label=\"Estimated\")\n", + "plt.xlabel(\"Time (s)\")\n", + "plt.ylabel(\"Voltage (V)\")\n", "plt.legend()" ] } diff --git a/pybop/__init__.py b/pybop/__init__.py index 1b71c1d46..6b5cfe509 100644 --- a/pybop/__init__.py +++ b/pybop/__init__.py @@ -31,14 +31,7 @@ # # Parameterisation class # -from .parameterisation import Parameterisation -from .parameter_sets import ParameterSet -from .parameters import Parameter - -# -# Observation class -# -from .observations import Observed +from .identification import Parameterisation, ParameterSet, Parameter, Observed # # Priors class diff --git a/pybop/costs/mle.py b/pybop/costs/mle.py new file mode 100644 index 000000000..a177b4e4f --- /dev/null +++ b/pybop/costs/mle.py @@ -0,0 +1,10 @@ +import pybop +import pints + + +class MLE: + def __init__(model, x0, method): + self.model = model + self.x0 = x0 + self.method = method + self.problem = pints.SingleOutputProblem(model, x0) diff --git a/pybop/identification/__init__.py b/pybop/identification/__init__.py new file mode 100644 index 000000000..0951af26c --- /dev/null +++ b/pybop/identification/__init__.py @@ -0,0 +1,4 @@ +from .parameter_set import ParameterSet +from .parameter import Parameter +from .observations import Observed +from .parameterisation import Parameterisation \ No newline at end of file diff --git a/pybop/observations.py b/pybop/identification/observations.py similarity index 100% rename from pybop/observations.py rename to pybop/identification/observations.py diff --git a/pybop/parameters.py b/pybop/identification/parameter.py similarity index 100% rename from pybop/parameters.py rename to pybop/identification/parameter.py diff --git a/pybop/parameter_sets.py b/pybop/identification/parameter_set.py similarity index 100% rename from pybop/parameter_sets.py rename to pybop/identification/parameter_set.py diff --git a/pybop/parameterisation.py b/pybop/identification/parameterisation.py similarity index 98% rename from pybop/parameterisation.py rename to pybop/identification/parameterisation.py index cbc802240..00154de1d 100644 --- a/pybop/parameterisation.py +++ b/pybop/identification/parameterisation.py @@ -22,6 +22,7 @@ def __init__( self.fit_dict = {} self.fit_parameters = {o.name: o for o in fit_parameters} self.observations = {o.name: o for o in observations} + self.model.n_parameters = len(self.fit_dict) # Check that the observations contain time and current for name in ["Time [s]", "Current function [A]"]: @@ -53,6 +54,7 @@ def __init__( check_model=check_model, init_soc=init_soc, ) + def step(self, signal, x, grad): for i, p in enumerate(self.fit_dict): diff --git a/pybop/models/BaseModel.py b/pybop/models/BaseModel.py index 697900f7a..f819f43af 100644 --- a/pybop/models/BaseModel.py +++ b/pybop/models/BaseModel.py @@ -8,14 +8,13 @@ class BaseModel: """ def __init__(self, name="Base Model"): - self.pybamm_model = None self.name = name - # self.parameter_set = None + self.pybamm_model = None def build( self, - observations, - fit_parameters, + observations=None, + fit_parameters=None, check_model=True, init_soc=None, ): @@ -38,8 +37,7 @@ def build( self._built_model = self._disc.process_model( self._model_with_set_params, inplace=False, check_model=check_model ) - # Set t_eval - self.time_data = self._parameter_set["Current function [A]"].x[0] + # Clear solver self._solver._model_set_up = {} @@ -71,18 +69,19 @@ def set_params(self, observations, fit_parameters): if self.model_with_set_params: return - try: + if fit_parameters is not None: + # set input parameters in parameter set from fitting parameters + for i in fit_parameters: + self.parameter_set[i] = "[input]" + + if observations is not None and fit_parameters is not None: self.parameter_set["Current function [A]"] = pybamm.Interpolant( observations["Time [s]"].data, observations["Current function [A]"].data, pybamm.t, ) - except: - raise ValueError("Current function not supplied") - - # set input parameters in parameter set from fitting parameters - for i in fit_parameters: - self.parameter_set[i] = "[input]" + # Set t_eval + self.time_data = self._parameter_set["Current function [A]"].x[0] self._model_with_set_params = self._parameter_set.process_model( self._unprocessed_model, inplace=False @@ -90,20 +89,44 @@ def set_params(self, observations, fit_parameters): self._parameter_set.process_geometry(self.geometry) self.pybamm_model = self._model_with_set_params - def sim(self, experiment=None, parameter_set=None): + def simulate(self, inputs=None, t_eval=None, parameter_set=None, experiment=None): + """ + Run the forward model and return the result in Numpy array format + aligning with Pints' ForwardModel simulate method. + """ + parameter_set = parameter_set or self.parameter_set + if inputs is None: + return self._simulate(parameter_set, experiment).solve(t_eval=t_eval) + else: + return self.solver.solve(inputs=inputs, t_eval=t_eval) + + + def _simulate(self, parameter_set=None, experiment=None): """ - Simulate the model + Create a PyBaMM simulation object and return it. """ if self.pybamm_model is not None: - self.parameter_set = parameter_set or self.parameter_set return pybamm.Simulation( self.pybamm_model, experiment=experiment, - parameter_values=self.parameter_set, + parameter_values=parameter_set, ) else: raise ValueError("This sim method currently only supports PyBaMM models") + def n_parameters(self): + """ + Returns the dimension of the parameter space. + """ + raise NotImplementedError + + def n_outputs(self): + """ + Returns the number of outputs this model has. The default is 1. + """ + raise NotImplementedError + + @property def built_model(self): return self._built_model diff --git a/pybop/models/lithium_ion/__init__.py b/pybop/models/lithium_ion/__init__.py index 43b78b32e..50f61b1e9 100644 --- a/pybop/models/lithium_ion/__init__.py +++ b/pybop/models/lithium_ion/__init__.py @@ -2,4 +2,4 @@ # Import lithium ion based models # -from .pybamm import SPM, SPMe +from .base_echem import SPM, SPMe diff --git a/pybop/models/lithium_ion/pybamm.py b/pybop/models/lithium_ion/base_echem.py similarity index 90% rename from pybop/models/lithium_ion/pybamm.py rename to pybop/models/lithium_ion/base_echem.py index 9914cc837..0989dc623 100644 --- a/pybop/models/lithium_ion/pybamm.py +++ b/pybop/models/lithium_ion/base_echem.py @@ -5,7 +5,7 @@ class SPM(BaseModel): """ - Composition of the SPM class in PyBaMM. + Composition of the PyBaMM SPM class. """ def __init__( @@ -23,6 +23,7 @@ def __init__( self._unprocessed_model = self.pybamm_model self.name = name + self.default_parameter_values = self.pybamm_model.default_parameter_values self.parameter_set = parameter_set or self.pybamm_model.default_parameter_values self._unprocessed_parameter_set = self.parameter_set @@ -43,7 +44,7 @@ def __init__( class SPMe(BaseModel): """ - Composition of the SPMe class in PyBaMM. + Composition of the PyBaMM SPMe class. """ def __init__( @@ -61,6 +62,7 @@ def __init__( self._unprocessed_model = self.pybamm_model self.name = name + self.default_parameter_values = self.pybamm_model.default_parameter_values self.parameter_set = parameter_set or self.pybamm_model.default_parameter_values self._unprocessed_parameter_set = self.parameter_set diff --git a/tests/unit/test_parameterisation.py b/tests/unit/test_parameterisation.py index f9f821f90..5cbadf84a 100644 --- a/tests/unit/test_parameterisation.py +++ b/tests/unit/test_parameterisation.py @@ -24,11 +24,10 @@ def getdata(self, model, x0): ] * 2 ) - sim = model.sim(experiment=experiment) - return sim.solve() + sim = model.simulate(experiment=experiment) + return sim def test_spm(self): - # Define model model = pybop.lithium_ion.SPM() model.parameter_set = model.pybamm_model.default_parameter_values @@ -70,7 +69,6 @@ def test_spm(self): np.testing.assert_allclose(results, x0, atol=1e-1) def test_spme(self): - # Define model model = pybop.lithium_ion.SPMe() model.parameter_set = model.pybamm_model.default_parameter_values From 9497ff8f6ccb040de73c0bd8ded4e480d3745863 Mon Sep 17 00:00:00 2001 From: NicolaCourtier <45851982+NicolaCourtier@users.noreply.github.com> Date: Tue, 10 Oct 2023 14:32:15 +0100 Subject: [PATCH 095/210] Rename model file to base_echem --- pybop/models/lithium_ion/__init__.py | 2 +- pybop/models/lithium_ion/{pybamm.py => base_echem.py} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename pybop/models/lithium_ion/{pybamm.py => base_echem.py} (100%) diff --git a/pybop/models/lithium_ion/__init__.py b/pybop/models/lithium_ion/__init__.py index 43b78b32e..50f61b1e9 100644 --- a/pybop/models/lithium_ion/__init__.py +++ b/pybop/models/lithium_ion/__init__.py @@ -2,4 +2,4 @@ # Import lithium ion based models # -from .pybamm import SPM, SPMe +from .base_echem import SPM, SPMe diff --git a/pybop/models/lithium_ion/pybamm.py b/pybop/models/lithium_ion/base_echem.py similarity index 100% rename from pybop/models/lithium_ion/pybamm.py rename to pybop/models/lithium_ion/base_echem.py From 653a88dcc37cc62c0b91ffc4ae2876de351e4477 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Wed, 11 Oct 2023 10:13:46 +0100 Subject: [PATCH 096/210] Initial Pints MLE, Updates to BaseModel for Pints, build() --- noxfile.py | 2 +- pybop/costs/mle.py | 23 ++++++++++++++++------ pybop/models/BaseModel.py | 27 ++++++++++++++++---------- pybop/models/lithium_ion/base_echem.py | 4 ++-- 4 files changed, 37 insertions(+), 19 deletions(-) diff --git a/noxfile.py b/noxfile.py index 9117de5ba..7a39e8338 100644 --- a/noxfile.py +++ b/noxfile.py @@ -10,7 +10,7 @@ @nox.session -def unit_test(session): +def unit(session): session.run_always("pip", "install", "-e", ".") session.install("pytest") session.run("pytest") diff --git a/pybop/costs/mle.py b/pybop/costs/mle.py index a177b4e4f..7f9075a82 100644 --- a/pybop/costs/mle.py +++ b/pybop/costs/mle.py @@ -1,10 +1,21 @@ import pybop import pints +import numpy as np +model = pybop.lithium_ion.SPM() -class MLE: - def __init__(model, x0, method): - self.model = model - self.x0 = x0 - self.method = method - self.problem = pints.SingleOutputProblem(model, x0) +inputs = { + "Negative electrode active material volume fraction": 0.5, + "Positive electrode active material volume fraction": 0.5, + "Current function [A]": 1, + } +t_eval = [0, 1800] + +values = model.simulate(inputs=inputs, t_eval=t_eval) +V = values["Terminal voltage [V]"].data +T = values["Time [s]"].data + +sigma = 0.05 +CorruptValues = V + np.random.normal(0, sigma, len(V)) + +problem = pints.SingleOutputProblem(model, T, CorruptValues) diff --git a/pybop/models/BaseModel.py b/pybop/models/BaseModel.py index f819f43af..021caf32d 100644 --- a/pybop/models/BaseModel.py +++ b/pybop/models/BaseModel.py @@ -10,6 +10,8 @@ class BaseModel: def __init__(self, name="Base Model"): self.name = name self.pybamm_model = None + self.fit_parameters = None + self.observations = None def build( self, @@ -21,6 +23,9 @@ def build( """ Build the model (if not built already). """ + self.fit_parameters = fit_parameters + self.observations = observations + if init_soc is not None: self.set_init_soc(init_soc) @@ -31,7 +36,7 @@ def build( self._model_with_set_params = self.pybamm_model self._built_model = self.pybamm_model else: - self.set_params(observations, fit_parameters) + self.set_params() self._mesh = pybamm.Mesh(self.geometry, self.submesh_types, self.var_pts) self._disc = pybamm.Discretisation(self.mesh, self.spatial_methods) self._built_model = self._disc.process_model( @@ -62,22 +67,22 @@ def set_init_soc(self, init_soc): # Save solved initial SOC in case we need to rebuild the model self._built_initial_soc = init_soc - def set_params(self, observations, fit_parameters): + def set_params(self): """ Set the parameters in the model. """ if self.model_with_set_params: return - if fit_parameters is not None: + if self.fit_parameters is not None: # set input parameters in parameter set from fitting parameters - for i in fit_parameters: + for i in self.fit_parameters: self.parameter_set[i] = "[input]" - if observations is not None and fit_parameters is not None: + if self.observations is not None and self.fit_parameters is not None: self.parameter_set["Current function [A]"] = pybamm.Interpolant( - observations["Time [s]"].data, - observations["Current function [A]"].data, + self.observations["Time [s]"].data, + self.observations["Current function [A]"].data, pybamm.t, ) # Set t_eval @@ -98,7 +103,9 @@ def simulate(self, inputs=None, t_eval=None, parameter_set=None, experiment=None if inputs is None: return self._simulate(parameter_set, experiment).solve(t_eval=t_eval) else: - return self.solver.solve(inputs=inputs, t_eval=t_eval) + if self._built_model is None: + self.build(fit_parameters=inputs.keys()) + return self.solver.solve(self.built_model,inputs=inputs, t_eval=t_eval) def _simulate(self, parameter_set=None, experiment=None): @@ -118,13 +125,13 @@ def n_parameters(self): """ Returns the dimension of the parameter space. """ - raise NotImplementedError + return len(self.fit_parameters) def n_outputs(self): """ Returns the number of outputs this model has. The default is 1. """ - raise NotImplementedError + return 1 @property diff --git a/pybop/models/lithium_ion/base_echem.py b/pybop/models/lithium_ion/base_echem.py index 0989dc623..7cd00a021 100644 --- a/pybop/models/lithium_ion/base_echem.py +++ b/pybop/models/lithium_ion/base_echem.py @@ -5,7 +5,7 @@ class SPM(BaseModel): """ - Composition of the PyBaMM SPM class. + Composition of the PyBaMM Single Particle Model class. """ def __init__( @@ -44,7 +44,7 @@ def __init__( class SPMe(BaseModel): """ - Composition of the PyBaMM SPMe class. + Composition of the PyBaMM Single Particle Model with Electrolyte class. """ def __init__( From 65ec80d0d398bee26113cf3fdda847a3478f23c8 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Wed, 11 Oct 2023 11:38:10 +0100 Subject: [PATCH 097/210] Update workflow for rename of nox unit session --- .github/workflows/test_on_push.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test_on_push.yaml b/.github/workflows/test_on_push.yaml index 4f4d0b8a6..977fbba12 100644 --- a/.github/workflows/test_on_push.yaml +++ b/.github/workflows/test_on_push.yaml @@ -34,7 +34,7 @@ jobs: pip install -e . - name: Unit tests with nox run: | - nox -s unit_test + nox -s unit # Runs only on Ubuntu with Python 3.11 check_coverage: @@ -60,7 +60,7 @@ jobs: pip install --upgrade pip nox pip install -e . - - name: Run unit tests for Ubuntu with Python 3.11 and generate coverage report + - name: Run coverage tests for Ubuntu with Python 3.11 and generate report run: nox -s coverage - name: Upload coverage report From e285c422ba1ce10731ce976d9faf0c853c4b2097 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Wed, 11 Oct 2023 11:55:08 +0100 Subject: [PATCH 098/210] Remove initial MLE.py, Add black format --- pybop/costs/mle.py | 21 --------------------- pybop/identification/__init__.py | 2 +- pybop/identification/parameterisation.py | 1 - pybop/models/BaseModel.py | 11 ++++------- pybop/models/lithium_ion/base_echem.py | 1 - 5 files changed, 5 insertions(+), 31 deletions(-) delete mode 100644 pybop/costs/mle.py diff --git a/pybop/costs/mle.py b/pybop/costs/mle.py deleted file mode 100644 index 7f9075a82..000000000 --- a/pybop/costs/mle.py +++ /dev/null @@ -1,21 +0,0 @@ -import pybop -import pints -import numpy as np - -model = pybop.lithium_ion.SPM() - -inputs = { - "Negative electrode active material volume fraction": 0.5, - "Positive electrode active material volume fraction": 0.5, - "Current function [A]": 1, - } -t_eval = [0, 1800] - -values = model.simulate(inputs=inputs, t_eval=t_eval) -V = values["Terminal voltage [V]"].data -T = values["Time [s]"].data - -sigma = 0.05 -CorruptValues = V + np.random.normal(0, sigma, len(V)) - -problem = pints.SingleOutputProblem(model, T, CorruptValues) diff --git a/pybop/identification/__init__.py b/pybop/identification/__init__.py index 0951af26c..4bcb89c1d 100644 --- a/pybop/identification/__init__.py +++ b/pybop/identification/__init__.py @@ -1,4 +1,4 @@ from .parameter_set import ParameterSet from .parameter import Parameter from .observations import Observed -from .parameterisation import Parameterisation \ No newline at end of file +from .parameterisation import Parameterisation diff --git a/pybop/identification/parameterisation.py b/pybop/identification/parameterisation.py index 00154de1d..4a2cee9d5 100644 --- a/pybop/identification/parameterisation.py +++ b/pybop/identification/parameterisation.py @@ -54,7 +54,6 @@ def __init__( check_model=check_model, init_soc=init_soc, ) - def step(self, signal, x, grad): for i, p in enumerate(self.fit_dict): diff --git a/pybop/models/BaseModel.py b/pybop/models/BaseModel.py index 021caf32d..7d529b3cf 100644 --- a/pybop/models/BaseModel.py +++ b/pybop/models/BaseModel.py @@ -42,7 +42,6 @@ def build( self._built_model = self._disc.process_model( self._model_with_set_params, inplace=False, check_model=check_model ) - # Clear solver self._solver._model_set_up = {} @@ -96,7 +95,7 @@ def set_params(self): def simulate(self, inputs=None, t_eval=None, parameter_set=None, experiment=None): """ - Run the forward model and return the result in Numpy array format + Run the forward model and return the result in Numpy array format aligning with Pints' ForwardModel simulate method. """ parameter_set = parameter_set or self.parameter_set @@ -104,9 +103,8 @@ def simulate(self, inputs=None, t_eval=None, parameter_set=None, experiment=None return self._simulate(parameter_set, experiment).solve(t_eval=t_eval) else: if self._built_model is None: - self.build(fit_parameters=inputs.keys()) - return self.solver.solve(self.built_model,inputs=inputs, t_eval=t_eval) - + self.build(fit_parameters=inputs.keys()) + return self.solver.solve(self.built_model, inputs=inputs, t_eval=t_eval) def _simulate(self, parameter_set=None, experiment=None): """ @@ -126,14 +124,13 @@ def n_parameters(self): Returns the dimension of the parameter space. """ return len(self.fit_parameters) - + def n_outputs(self): """ Returns the number of outputs this model has. The default is 1. """ return 1 - @property def built_model(self): return self._built_model diff --git a/pybop/models/lithium_ion/base_echem.py b/pybop/models/lithium_ion/base_echem.py index d998d3c7a..25f6526c9 100644 --- a/pybop/models/lithium_ion/base_echem.py +++ b/pybop/models/lithium_ion/base_echem.py @@ -24,7 +24,6 @@ def __init__( self._unprocessed_model = self.pybamm_model self.name = name - self.default_parameter_values = self.pybamm_model.default_parameter_values self.parameter_set = parameter_set or self.pybamm_model.default_parameter_values self._unprocessed_parameter_set = self.parameter_set From 396a83faff53dee8db7145d93a6571d78ea56c84 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 13 Oct 2023 09:20:09 +0100 Subject: [PATCH 099/210] Split Simulate(), Prediction(), Add initial Pints integration --- examples/scripts/mle.py | 29 +++++++++++++++++++++++++++++ pybop/models/BaseModel.py | 39 ++++++++++++++++++++++++--------------- 2 files changed, 53 insertions(+), 15 deletions(-) create mode 100644 examples/scripts/mle.py diff --git a/examples/scripts/mle.py b/examples/scripts/mle.py new file mode 100644 index 000000000..e52f2a9a7 --- /dev/null +++ b/examples/scripts/mle.py @@ -0,0 +1,29 @@ +import pybop +import pints +import numpy as np + +model = pybop.lithium_ion.SPM() +model.parameter_set["Current function [A]"] = 2 + +inputs = { + "Negative electrode active material volume fraction": 0.5, + "Positive electrode active material volume fraction": 0.5, + } +t_eval = [0, 900] +model.build(fit_parameters=inputs) + +values = model.predict(inputs=inputs, t_eval=t_eval) +V = values["Terminal voltage [V]"].data +T = values["Time [s]"].data + +sigma = 0.01 +CorruptValues = V + np.random.normal(0, sigma, len(V)) + +problem = pints.SingleOutputProblem(model, T, CorruptValues) + +cost = pints.SumOfSquaresError(problem) +boundaries = pints.RectangularBoundaries([0.4, 0.4], [0.6, 0.6]) + +x0 = np.array([0.52, 0.47]) +op = pints.OptimisationController(cost, x0, boundaries=boundaries, method=pints.CMAES) +x1, f1 = op.run() \ No newline at end of file diff --git a/pybop/models/BaseModel.py b/pybop/models/BaseModel.py index 7d529b3cf..4faf3c814 100644 --- a/pybop/models/BaseModel.py +++ b/pybop/models/BaseModel.py @@ -75,7 +75,7 @@ def set_params(self): if self.fit_parameters is not None: # set input parameters in parameter set from fitting parameters - for i in self.fit_parameters: + for i in self.fit_parameters.keys(): self.parameter_set[i] = "[input]" if self.observations is not None and self.fit_parameters is not None: @@ -93,29 +93,38 @@ def set_params(self): self._parameter_set.process_geometry(self.geometry) self.pybamm_model = self._model_with_set_params - def simulate(self, inputs=None, t_eval=None, parameter_set=None, experiment=None): + def simulate(self, inputs=None, t_eval=None): """ Run the forward model and return the result in Numpy array format aligning with Pints' ForwardModel simulate method. """ - parameter_set = parameter_set or self.parameter_set - if inputs is None: - return self._simulate(parameter_set, experiment).solve(t_eval=t_eval) + if self._built_model is None: + ValueError("Model must be built before calling simulate") else: - if self._built_model is None: - self.build(fit_parameters=inputs.keys()) - return self.solver.solve(self.built_model, inputs=inputs, t_eval=t_eval) + if type(inputs) is not dict: + inputs_dict = {key: inputs[i] for i, key in enumerate(self.fit_parameters)} + print(inputs_dict) + return self.solver.solve(self.built_model, inputs=inputs_dict, t_eval=t_eval)["Terminal voltage [V]"].data - def _simulate(self, parameter_set=None, experiment=None): + def predict(self, inputs=None, t_eval=None, parameter_set=None, experiment=None): """ Create a PyBaMM simulation object and return it. """ - if self.pybamm_model is not None: - return pybamm.Simulation( - self.pybamm_model, - experiment=experiment, - parameter_values=parameter_set, - ) + parameter_set = parameter_set or self.parameter_set + if inputs is not None: + parameter_set.update(inputs) + if self._unprocessed_model is not None: + if experiment is None: + return pybamm.Simulation( + self._unprocessed_model, + parameter_values=parameter_set, + ).solve(t_eval=t_eval) + else: + return pybamm.Simulation( + self._unprocessed_model, + experiment=experiment, + parameter_values=parameter_set, + ).solve() else: raise ValueError("This sim method currently only supports PyBaMM models") From 22c24cc8909c5f0580a4d6aa981b6fb04d752925 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 13 Oct 2023 09:39:35 +0100 Subject: [PATCH 100/210] Fix tests, black format, update mle example --- examples/scripts/mle.py | 44 +++++++++++++++++++++++------ pybop/models/BaseModel.py | 8 ++++-- tests/unit/test_parameterisation.py | 2 +- 3 files changed, 42 insertions(+), 12 deletions(-) diff --git a/examples/scripts/mle.py b/examples/scripts/mle.py index e52f2a9a7..eee7b5eae 100644 --- a/examples/scripts/mle.py +++ b/examples/scripts/mle.py @@ -1,15 +1,16 @@ import pybop import pints import numpy as np +import matplotlib.pyplot as plt model = pybop.lithium_ion.SPM() model.parameter_set["Current function [A]"] = 2 inputs = { - "Negative electrode active material volume fraction": 0.5, - "Positive electrode active material volume fraction": 0.5, - } -t_eval = [0, 900] + "Negative electrode active material volume fraction": 0.5, + "Positive electrode active material volume fraction": 0.5, +} +t_eval = np.arange(0, 900, 2) model.build(fit_parameters=inputs) values = model.predict(inputs=inputs, t_eval=t_eval) @@ -18,12 +19,37 @@ sigma = 0.01 CorruptValues = V + np.random.normal(0, sigma, len(V)) +# Show the generated data +plt.figure() +plt.xlabel("Time") +plt.ylabel("Values") +plt.plot(T, CorruptValues) +plt.plot(T, V) +plt.show() + problem = pints.SingleOutputProblem(model, T, CorruptValues) +# cost = pints.SumOfSquaresError(problem) + +log_likelihood = pints.GaussianLogLikelihood(problem) +boundaries = pints.RectangularBoundaries([0.4, 0.4, 1e-5], [0.6, 0.6, 1e-1]) + +x0 = np.array([0.52, 0.47, 1e-3]) +op = pints.OptimisationController( + log_likelihood, x0, boundaries=boundaries, method=pints.CMAES +) +x1, f1 = op.run() +print("Estimated parameters:") +print(x1) + -cost = pints.SumOfSquaresError(problem) -boundaries = pints.RectangularBoundaries([0.4, 0.4], [0.6, 0.6]) +# Show the generated data +simulated_values = problem.evaluate(x1[:2]) -x0 = np.array([0.52, 0.47]) -op = pints.OptimisationController(cost, x0, boundaries=boundaries, method=pints.CMAES) -x1, f1 = op.run() \ No newline at end of file +plt.figure() +plt.xlabel("Time") +plt.ylabel("Values") +plt.plot(T, CorruptValues) +plt.fill_between(T, simulated_values - sigma, simulated_values + sigma, alpha=0.2) +plt.plot(T, simulated_values) +plt.show() diff --git a/pybop/models/BaseModel.py b/pybop/models/BaseModel.py index 4faf3c814..6b93b1711 100644 --- a/pybop/models/BaseModel.py +++ b/pybop/models/BaseModel.py @@ -102,9 +102,13 @@ def simulate(self, inputs=None, t_eval=None): ValueError("Model must be built before calling simulate") else: if type(inputs) is not dict: - inputs_dict = {key: inputs[i] for i, key in enumerate(self.fit_parameters)} + inputs_dict = { + key: inputs[i] for i, key in enumerate(self.fit_parameters) + } print(inputs_dict) - return self.solver.solve(self.built_model, inputs=inputs_dict, t_eval=t_eval)["Terminal voltage [V]"].data + return self.solver.solve( + self.built_model, inputs=inputs_dict, t_eval=t_eval + )["Terminal voltage [V]"].data def predict(self, inputs=None, t_eval=None, parameter_set=None, experiment=None): """ diff --git a/tests/unit/test_parameterisation.py b/tests/unit/test_parameterisation.py index 5cbadf84a..effaa4cec 100644 --- a/tests/unit/test_parameterisation.py +++ b/tests/unit/test_parameterisation.py @@ -24,7 +24,7 @@ def getdata(self, model, x0): ] * 2 ) - sim = model.simulate(experiment=experiment) + sim = model.predict(experiment=experiment) return sim def test_spm(self): From b9751fa3c92cd0afa72a4410ba7e558403d1e7f6 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 13 Oct 2023 12:05:08 +0100 Subject: [PATCH 101/210] Add pytest marker functionality, updt mle, doc-strings for BaseModel --- conftest.py | 21 ++++++++++++ examples/scripts/mle.py | 25 +++++++------- noxfile.py | 2 +- pybop/models/BaseModel.py | 7 ++-- tests/unit/test_parameterisation.py | 53 ++++++++++++++++------------- 5 files changed, 67 insertions(+), 41 deletions(-) create mode 100644 conftest.py diff --git a/conftest.py b/conftest.py new file mode 100644 index 000000000..0e07ebe5e --- /dev/null +++ b/conftest.py @@ -0,0 +1,21 @@ +import pytest + + +def pytest_addoption(parser): + parser.addoption( + "--unit", action="store_true", default=False, help="run unit tests" + ) + + +def pytest_configure(config): + config.addinivalue_line("markers", "unit: mark test as a unit test") + + +def pytest_collection_modifyitems(config, items): + if config.getoption("--unit"): + # --unit given in cli: do not skip unit tests + return + skip_unit = pytest.mark.skip(reason="need --unit option to run") + for item in items: + if "unit" in item.keywords: + item.add_marker(skip_unit) \ No newline at end of file diff --git a/examples/scripts/mle.py b/examples/scripts/mle.py index eee7b5eae..9118e0b4b 100644 --- a/examples/scripts/mle.py +++ b/examples/scripts/mle.py @@ -3,34 +3,33 @@ import numpy as np import matplotlib.pyplot as plt -model = pybop.lithium_ion.SPM() +model = pybop.lithium_ion.SPMe() model.parameter_set["Current function [A]"] = 2 inputs = { "Negative electrode active material volume fraction": 0.5, - "Positive electrode active material volume fraction": 0.5, + "Positive electrode active material volume fraction": 0.6, } t_eval = np.arange(0, 900, 2) model.build(fit_parameters=inputs) values = model.predict(inputs=inputs, t_eval=t_eval) -V = values["Terminal voltage [V]"].data -T = values["Time [s]"].data +voltage = values["Terminal voltage [V]"].data +time = values["Time [s]"].data sigma = 0.01 -CorruptValues = V + np.random.normal(0, sigma, len(V)) +CorruptValues = voltage + np.random.normal(0, sigma, len(voltage)) + # Show the generated data plt.figure() plt.xlabel("Time") plt.ylabel("Values") -plt.plot(T, CorruptValues) -plt.plot(T, V) +plt.plot(time, CorruptValues) +plt.plot(time, voltage) plt.show() -problem = pints.SingleOutputProblem(model, T, CorruptValues) -# cost = pints.SumOfSquaresError(problem) - +problem = pints.SingleOutputProblem(model, time, CorruptValues) log_likelihood = pints.GaussianLogLikelihood(problem) boundaries = pints.RectangularBoundaries([0.4, 0.4, 1e-5], [0.6, 0.6, 1e-1]) @@ -49,7 +48,7 @@ plt.figure() plt.xlabel("Time") plt.ylabel("Values") -plt.plot(T, CorruptValues) -plt.fill_between(T, simulated_values - sigma, simulated_values + sigma, alpha=0.2) -plt.plot(T, simulated_values) +plt.plot(time, CorruptValues) +plt.fill_between(time, simulated_values - sigma, simulated_values + sigma, alpha=0.2) +plt.plot(time, simulated_values) plt.show() diff --git a/noxfile.py b/noxfile.py index 7a39e8338..f9af6fac0 100644 --- a/noxfile.py +++ b/noxfile.py @@ -13,7 +13,7 @@ def unit(session): session.run_always("pip", "install", "-e", ".") session.install("pytest") - session.run("pytest") + session.run("pytest", "--unit") @nox.session diff --git a/pybop/models/BaseModel.py b/pybop/models/BaseModel.py index 6b93b1711..5f6ce0c43 100644 --- a/pybop/models/BaseModel.py +++ b/pybop/models/BaseModel.py @@ -21,7 +21,9 @@ def build( init_soc=None, ): """ - Build the model (if not built already). + Build the PyBOP model (if not built already). + For PyBaMM forward models, this method follwos a + similar process to pybamm.Simulation.build(). """ self.fit_parameters = fit_parameters self.observations = observations @@ -105,14 +107,13 @@ def simulate(self, inputs=None, t_eval=None): inputs_dict = { key: inputs[i] for i, key in enumerate(self.fit_parameters) } - print(inputs_dict) return self.solver.solve( self.built_model, inputs=inputs_dict, t_eval=t_eval )["Terminal voltage [V]"].data def predict(self, inputs=None, t_eval=None, parameter_set=None, experiment=None): """ - Create a PyBaMM simulation object and return it. + Create a PyBaMM simulation object, solve it, and return a solution object. """ parameter_set = parameter_set or self.parameter_set if inputs is not None: diff --git a/tests/unit/test_parameterisation.py b/tests/unit/test_parameterisation.py index effaa4cec..db6d2b89a 100644 --- a/tests/unit/test_parameterisation.py +++ b/tests/unit/test_parameterisation.py @@ -1,32 +1,11 @@ import pybop import pybamm import numpy as np +import pytest class TestParameterisation: - def getdata(self, model, x0): - model.parameter_set = model.pybamm_model.default_parameter_values - - model.parameter_set.update( - { - "Negative electrode active material volume fraction": x0[0], - "Positive electrode active material volume fraction": x0[1], - } - ) - experiment = pybamm.Experiment( - [ - ( - "Discharge at 2C for 5 minutes (1 second period)", - "Rest for 2 minutes (1 second period)", - "Charge at 1C for 5 minutes (1 second period)", - "Rest for 2 minutes (1 second period)", - ), - ] - * 2 - ) - sim = model.predict(experiment=experiment) - return sim - + @pytest.mark.unit def test_spm(self): # Define model model = pybop.lithium_ion.SPM() @@ -67,7 +46,8 @@ def test_spm(self): # Assertions np.testing.assert_allclose(last_optim, 1e-3, atol=1e-2) np.testing.assert_allclose(results, x0, atol=1e-1) - + + @pytest.mark.unit def test_spme(self): # Define model model = pybop.lithium_ion.SPMe() @@ -108,3 +88,28 @@ def test_spme(self): # Assertions np.testing.assert_allclose(last_optim, 1e-3, atol=1e-2) np.testing.assert_allclose(results, x0, atol=1e-1) + + def getdata(self, model, x0): + model.parameter_set = model.pybamm_model.default_parameter_values + + model.parameter_set.update( + { + "Negative electrode active material volume fraction": x0[0], + "Positive electrode active material volume fraction": x0[1], + } + ) + experiment = pybamm.Experiment( + [ + ( + "Discharge at 2C for 5 minutes (1 second period)", + "Rest for 2 minutes (1 second period)", + "Charge at 1C for 5 minutes (1 second period)", + "Rest for 2 minutes (1 second period)", + ), + ] + * 2 + ) + sim = model.predict(experiment=experiment) + return sim + + From feec21d8a7d394f49f711cc36495b14d07dcb194 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 13 Oct 2023 12:30:24 +0100 Subject: [PATCH 102/210] Fix coverage session, add tests, Updt model.simulate() args --- noxfile.py | 2 +- pybop/models/BaseModel.py | 4 ++-- tests/unit/test_parameterisation.py | 10 ++++++++++ 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/noxfile.py b/noxfile.py index f9af6fac0..a2719e3bd 100644 --- a/noxfile.py +++ b/noxfile.py @@ -20,4 +20,4 @@ def unit(session): def coverage(session): session.run_always("pip", "install", "-e", ".") session.install("pytest-cov") - session.run("pytest", "--cov", "--cov-report=xml") + session.run("pytest","--unit", "--cov", "--cov-report=xml") diff --git a/pybop/models/BaseModel.py b/pybop/models/BaseModel.py index 5f6ce0c43..648f40c18 100644 --- a/pybop/models/BaseModel.py +++ b/pybop/models/BaseModel.py @@ -95,13 +95,13 @@ def set_params(self): self._parameter_set.process_geometry(self.geometry) self.pybamm_model = self._model_with_set_params - def simulate(self, inputs=None, t_eval=None): + def simulate(self, inputs, t_eval): """ Run the forward model and return the result in Numpy array format aligning with Pints' ForwardModel simulate method. """ if self._built_model is None: - ValueError("Model must be built before calling simulate") + raise ValueError("Model must be built before calling simulate") else: if type(inputs) is not dict: inputs_dict = { diff --git a/tests/unit/test_parameterisation.py b/tests/unit/test_parameterisation.py index db6d2b89a..7b9393c17 100644 --- a/tests/unit/test_parameterisation.py +++ b/tests/unit/test_parameterisation.py @@ -112,4 +112,14 @@ def getdata(self, model, x0): sim = model.predict(experiment=experiment) return sim + @pytest.mark.unit + def test_simulate_without_build_model(self): + # Define model + model = pybop.lithium_ion.SPM() + + with pytest.raises(ValueError, match="Model must be built before calling simulate"): + model.simulate(None, None) + + + From fbe6b4c53f79ba6a07b2f03c95d89c1796d6b3d4 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 13 Oct 2023 14:10:22 +0100 Subject: [PATCH 103/210] ruff & black --- conftest.py | 2 +- examples/scripts/rmse-estimisation.py | 1 - noxfile.py | 2 +- pybop/identification/observations.py | 2 -- pybop/identification/parameter.py | 5 ----- pybop/identification/parameter_set.py | 1 - pybop/models/BaseModel.py | 5 ++--- pybop/models/lithium_ion/base_echem.py | 1 - pybop/optimisation/BaseOptimisation.py | 3 --- pybop/optimisation/NLoptOptimize.py | 1 - pybop/optimisation/SciPyMinimize.py | 1 - pybop/plotting/quick_plot.py | 5 ----- pybop/priors.py | 2 -- setup.py | 2 +- tests/unit/test_parameterisation.py | 12 +++++------- 15 files changed, 10 insertions(+), 35 deletions(-) diff --git a/conftest.py b/conftest.py index 0e07ebe5e..033168440 100644 --- a/conftest.py +++ b/conftest.py @@ -18,4 +18,4 @@ def pytest_collection_modifyitems(config, items): skip_unit = pytest.mark.skip(reason="need --unit option to run") for item in items: if "unit" in item.keywords: - item.add_marker(skip_unit) \ No newline at end of file + item.add_marker(skip_unit) diff --git a/examples/scripts/rmse-estimisation.py b/examples/scripts/rmse-estimisation.py index 1e82d1df6..30c5159a3 100644 --- a/examples/scripts/rmse-estimisation.py +++ b/examples/scripts/rmse-estimisation.py @@ -1,6 +1,5 @@ import pybop import pandas as pd -import numpy as np # Form observations Measurements = pd.read_csv("examples/scripts/Chen_example.csv", comment="#").to_numpy() diff --git a/noxfile.py b/noxfile.py index a2719e3bd..87c9cacdd 100644 --- a/noxfile.py +++ b/noxfile.py @@ -20,4 +20,4 @@ def unit(session): def coverage(session): session.run_always("pip", "install", "-e", ".") session.install("pytest-cov") - session.run("pytest","--unit", "--cov", "--cov-report=xml") + session.run("pytest", "--unit", "--cov", "--cov-report=xml") diff --git a/pybop/identification/observations.py b/pybop/identification/observations.py index e6db914bf..417a9b876 100644 --- a/pybop/identification/observations.py +++ b/pybop/identification/observations.py @@ -1,6 +1,4 @@ -import pybop import pybamm -import numpy as np class Observed: diff --git a/pybop/identification/parameter.py b/pybop/identification/parameter.py index e0933a6c0..f15bdfea5 100644 --- a/pybop/identification/parameter.py +++ b/pybop/identification/parameter.py @@ -1,8 +1,3 @@ -from typing import Any -import pybop -import pybamm - - class Parameter: """ "" Class for creating parameters in pybop. diff --git a/pybop/identification/parameter_set.py b/pybop/identification/parameter_set.py index eb84b9da1..60d9b6a9e 100644 --- a/pybop/identification/parameter_set.py +++ b/pybop/identification/parameter_set.py @@ -1,5 +1,4 @@ import pybamm -import pybop class ParameterSet: diff --git a/pybop/models/BaseModel.py b/pybop/models/BaseModel.py index 648f40c18..d23d60f2f 100644 --- a/pybop/models/BaseModel.py +++ b/pybop/models/BaseModel.py @@ -1,4 +1,3 @@ -import pybop import pybamm @@ -22,7 +21,7 @@ def build( ): """ Build the PyBOP model (if not built already). - For PyBaMM forward models, this method follwos a + For PyBaMM forward models, this method follows a similar process to pybamm.Simulation.build(). """ self.fit_parameters = fit_parameters @@ -103,7 +102,7 @@ def simulate(self, inputs, t_eval): if self._built_model is None: raise ValueError("Model must be built before calling simulate") else: - if type(inputs) is not dict: + if inputs is isinstance(dict): inputs_dict = { key: inputs[i] for i, key in enumerate(self.fit_parameters) } diff --git a/pybop/models/lithium_ion/base_echem.py b/pybop/models/lithium_ion/base_echem.py index 25f6526c9..542d6a399 100644 --- a/pybop/models/lithium_ion/base_echem.py +++ b/pybop/models/lithium_ion/base_echem.py @@ -1,4 +1,3 @@ -import pybop import pybamm from ..BaseModel import BaseModel diff --git a/pybop/optimisation/BaseOptimisation.py b/pybop/optimisation/BaseOptimisation.py index 14364a787..1663375f8 100644 --- a/pybop/optimisation/BaseOptimisation.py +++ b/pybop/optimisation/BaseOptimisation.py @@ -1,6 +1,3 @@ -import pybop - - class BaseOptimisation: """ diff --git a/pybop/optimisation/NLoptOptimize.py b/pybop/optimisation/NLoptOptimize.py index 6d0f5ba87..c8040645a 100644 --- a/pybop/optimisation/NLoptOptimize.py +++ b/pybop/optimisation/NLoptOptimize.py @@ -1,4 +1,3 @@ -import pybop import nlopt from .BaseOptimisation import BaseOptimisation diff --git a/pybop/optimisation/SciPyMinimize.py b/pybop/optimisation/SciPyMinimize.py index ee4c57067..122d4d749 100644 --- a/pybop/optimisation/SciPyMinimize.py +++ b/pybop/optimisation/SciPyMinimize.py @@ -1,4 +1,3 @@ -import pybop from scipy.optimize import minimize from .BaseOptimisation import BaseOptimisation diff --git a/pybop/plotting/quick_plot.py b/pybop/plotting/quick_plot.py index e36bed225..5acbb2626 100644 --- a/pybop/plotting/quick_plot.py +++ b/pybop/plotting/quick_plot.py @@ -1,8 +1,3 @@ -import os -import numpy -import matplotlib - - class QuickPlot: """ diff --git a/pybop/priors.py b/pybop/priors.py index b23f2c38e..7224b58a7 100644 --- a/pybop/priors.py +++ b/pybop/priors.py @@ -1,5 +1,3 @@ -import pybop -import numpy as np import scipy.stats as stats diff --git a/setup.py b/setup.py index 28900d55e..c0a885538 100644 --- a/setup.py +++ b/setup.py @@ -18,7 +18,7 @@ setup( name="pybop", packages=find_packages("."), - version=__version__, + version=__version__, # noqa F821 license="BSD-3-Clause", description="Python Battery Optimisation and Parameterisation", long_description=long_description, diff --git a/tests/unit/test_parameterisation.py b/tests/unit/test_parameterisation.py index 7b9393c17..b584ca08c 100644 --- a/tests/unit/test_parameterisation.py +++ b/tests/unit/test_parameterisation.py @@ -46,7 +46,7 @@ def test_spm(self): # Assertions np.testing.assert_allclose(last_optim, 1e-3, atol=1e-2) np.testing.assert_allclose(results, x0, atol=1e-1) - + @pytest.mark.unit def test_spme(self): # Define model @@ -111,15 +111,13 @@ def getdata(self, model, x0): ) sim = model.predict(experiment=experiment) return sim - + @pytest.mark.unit def test_simulate_without_build_model(self): # Define model model = pybop.lithium_ion.SPM() - with pytest.raises(ValueError, match="Model must be built before calling simulate"): + with pytest.raises( + ValueError, match="Model must be built before calling simulate" + ): model.simulate(None, None) - - - - From b66b807ad95c5e8952d9c06f43664b0243daf8ae Mon Sep 17 00:00:00 2001 From: Brady Planden <55357039+BradyPlanden@users.noreply.github.com> Date: Fri, 13 Oct 2023 14:54:51 +0100 Subject: [PATCH 104/210] First Repository Clean + Initial model alignment with Pints (#53) * Update object tree & directory, Add pints forwardmodel methods * Initial Pints MLE, Updates to BaseModel for Pints, build() * Update workflow for rename of nox unit session * Remove initial MLE.py, Add black format --- .github/workflows/test_on_push.yaml | 4 +- examples/notebooks/rmse-estimisation.ipynb | 28 ++++---- noxfile.py | 2 +- pybop/__init__.py | 9 +-- pybop/identification/__init__.py | 4 ++ pybop/{ => identification}/observations.py | 0 .../parameter.py} | 0 .../parameter_set.py} | 0 .../{ => identification}/parameterisation.py | 1 + pybop/models/BaseModel.py | 69 +++++++++++++------ pybop/models/lithium_ion/base_echem.py | 8 ++- tests/unit/test_parameterisation.py | 6 +- 12 files changed, 80 insertions(+), 51 deletions(-) create mode 100644 pybop/identification/__init__.py rename pybop/{ => identification}/observations.py (100%) rename pybop/{parameters.py => identification/parameter.py} (100%) rename pybop/{parameter_sets.py => identification/parameter_set.py} (100%) rename pybop/{ => identification}/parameterisation.py (98%) diff --git a/.github/workflows/test_on_push.yaml b/.github/workflows/test_on_push.yaml index 4f4d0b8a6..977fbba12 100644 --- a/.github/workflows/test_on_push.yaml +++ b/.github/workflows/test_on_push.yaml @@ -34,7 +34,7 @@ jobs: pip install -e . - name: Unit tests with nox run: | - nox -s unit_test + nox -s unit # Runs only on Ubuntu with Python 3.11 check_coverage: @@ -60,7 +60,7 @@ jobs: pip install --upgrade pip nox pip install -e . - - name: Run unit tests for Ubuntu with Python 3.11 and generate coverage report + - name: Run coverage tests for Ubuntu with Python 3.11 and generate report run: nox -s coverage - name: Upload coverage report diff --git a/examples/notebooks/rmse-estimisation.ipynb b/examples/notebooks/rmse-estimisation.ipynb index f8fa02219..c4104d7be 100644 --- a/examples/notebooks/rmse-estimisation.ipynb +++ b/examples/notebooks/rmse-estimisation.ipynb @@ -25,7 +25,7 @@ ], "source": [ "%pip install --upgrade pip ipywidgets pybamm -q\n", - "%pip install git+https://github.com/pybop-team/PyBOP.git@develop -q " + "%pip install git+https://github.com/pybop-team/PyBOP.git@develop -q" ] }, { @@ -185,7 +185,7 @@ "outputs": [], "source": [ "corrupt_V = synthetic_sol[\"Terminal voltage [V]\"].data\n", - "corrupt_V += np.random.normal(0,0.005,len(corrupt_V))" + "corrupt_V += np.random.normal(0, 0.005, len(corrupt_V))" ] }, { @@ -210,10 +210,10 @@ "source": [ "model = pybop.lithium_ion.SPM()\n", "observations = [\n", - " pybop.Observed(\"Time [s]\", synthetic_sol[\"Time [s]\"].data),\n", - " pybop.Observed(\"Current function [A]\", synthetic_sol[\"Current [A]\"].data),\n", - " pybop.Observed(\"Voltage [V]\", corrupt_V),\n", - " ]" + " pybop.Observed(\"Time [s]\", synthetic_sol[\"Time [s]\"].data),\n", + " pybop.Observed(\"Current function [A]\", synthetic_sol[\"Current [A]\"].data),\n", + " pybop.Observed(\"Voltage [V]\", corrupt_V),\n", + "]" ] }, { @@ -370,9 +370,11 @@ "outputs": [], "source": [ "params.update(\n", - " {\"Negative electrode active material volume fraction\": results[0], \n", - " \"Positive electrode active material volume fraction\": results[1]}\n", - " )\n", + " {\n", + " \"Negative electrode active material volume fraction\": results[0],\n", + " \"Positive electrode active material volume fraction\": results[1],\n", + " }\n", + ")\n", "optsol = sim.solve()[\"Terminal voltage [V]\"].data" ] }, @@ -410,10 +412,10 @@ } ], "source": [ - "plt.plot(corrupt_V, label='Groundtruth')\n", - "plt.plot(optsol, label='Estimated')\n", - "plt.xlabel('Time (s)')\n", - "plt.ylabel('Voltage (V)')\n", + "plt.plot(corrupt_V, label=\"Groundtruth\")\n", + "plt.plot(optsol, label=\"Estimated\")\n", + "plt.xlabel(\"Time (s)\")\n", + "plt.ylabel(\"Voltage (V)\")\n", "plt.legend()" ] } diff --git a/noxfile.py b/noxfile.py index 9117de5ba..7a39e8338 100644 --- a/noxfile.py +++ b/noxfile.py @@ -10,7 +10,7 @@ @nox.session -def unit_test(session): +def unit(session): session.run_always("pip", "install", "-e", ".") session.install("pytest") session.run("pytest") diff --git a/pybop/__init__.py b/pybop/__init__.py index 1b71c1d46..6b5cfe509 100644 --- a/pybop/__init__.py +++ b/pybop/__init__.py @@ -31,14 +31,7 @@ # # Parameterisation class # -from .parameterisation import Parameterisation -from .parameter_sets import ParameterSet -from .parameters import Parameter - -# -# Observation class -# -from .observations import Observed +from .identification import Parameterisation, ParameterSet, Parameter, Observed # # Priors class diff --git a/pybop/identification/__init__.py b/pybop/identification/__init__.py new file mode 100644 index 000000000..4bcb89c1d --- /dev/null +++ b/pybop/identification/__init__.py @@ -0,0 +1,4 @@ +from .parameter_set import ParameterSet +from .parameter import Parameter +from .observations import Observed +from .parameterisation import Parameterisation diff --git a/pybop/observations.py b/pybop/identification/observations.py similarity index 100% rename from pybop/observations.py rename to pybop/identification/observations.py diff --git a/pybop/parameters.py b/pybop/identification/parameter.py similarity index 100% rename from pybop/parameters.py rename to pybop/identification/parameter.py diff --git a/pybop/parameter_sets.py b/pybop/identification/parameter_set.py similarity index 100% rename from pybop/parameter_sets.py rename to pybop/identification/parameter_set.py diff --git a/pybop/parameterisation.py b/pybop/identification/parameterisation.py similarity index 98% rename from pybop/parameterisation.py rename to pybop/identification/parameterisation.py index cbc802240..4a2cee9d5 100644 --- a/pybop/parameterisation.py +++ b/pybop/identification/parameterisation.py @@ -22,6 +22,7 @@ def __init__( self.fit_dict = {} self.fit_parameters = {o.name: o for o in fit_parameters} self.observations = {o.name: o for o in observations} + self.model.n_parameters = len(self.fit_dict) # Check that the observations contain time and current for name in ["Time [s]", "Current function [A]"]: diff --git a/pybop/models/BaseModel.py b/pybop/models/BaseModel.py index 697900f7a..7d529b3cf 100644 --- a/pybop/models/BaseModel.py +++ b/pybop/models/BaseModel.py @@ -8,20 +8,24 @@ class BaseModel: """ def __init__(self, name="Base Model"): - self.pybamm_model = None self.name = name - # self.parameter_set = None + self.pybamm_model = None + self.fit_parameters = None + self.observations = None def build( self, - observations, - fit_parameters, + observations=None, + fit_parameters=None, check_model=True, init_soc=None, ): """ Build the model (if not built already). """ + self.fit_parameters = fit_parameters + self.observations = observations + if init_soc is not None: self.set_init_soc(init_soc) @@ -32,14 +36,12 @@ def build( self._model_with_set_params = self.pybamm_model self._built_model = self.pybamm_model else: - self.set_params(observations, fit_parameters) + self.set_params() self._mesh = pybamm.Mesh(self.geometry, self.submesh_types, self.var_pts) self._disc = pybamm.Discretisation(self.mesh, self.spatial_methods) self._built_model = self._disc.process_model( self._model_with_set_params, inplace=False, check_model=check_model ) - # Set t_eval - self.time_data = self._parameter_set["Current function [A]"].x[0] # Clear solver self._solver._model_set_up = {} @@ -64,25 +66,26 @@ def set_init_soc(self, init_soc): # Save solved initial SOC in case we need to rebuild the model self._built_initial_soc = init_soc - def set_params(self, observations, fit_parameters): + def set_params(self): """ Set the parameters in the model. """ if self.model_with_set_params: return - try: + if self.fit_parameters is not None: + # set input parameters in parameter set from fitting parameters + for i in self.fit_parameters: + self.parameter_set[i] = "[input]" + + if self.observations is not None and self.fit_parameters is not None: self.parameter_set["Current function [A]"] = pybamm.Interpolant( - observations["Time [s]"].data, - observations["Current function [A]"].data, + self.observations["Time [s]"].data, + self.observations["Current function [A]"].data, pybamm.t, ) - except: - raise ValueError("Current function not supplied") - - # set input parameters in parameter set from fitting parameters - for i in fit_parameters: - self.parameter_set[i] = "[input]" + # Set t_eval + self.time_data = self._parameter_set["Current function [A]"].x[0] self._model_with_set_params = self._parameter_set.process_model( self._unprocessed_model, inplace=False @@ -90,20 +93,44 @@ def set_params(self, observations, fit_parameters): self._parameter_set.process_geometry(self.geometry) self.pybamm_model = self._model_with_set_params - def sim(self, experiment=None, parameter_set=None): + def simulate(self, inputs=None, t_eval=None, parameter_set=None, experiment=None): """ - Simulate the model + Run the forward model and return the result in Numpy array format + aligning with Pints' ForwardModel simulate method. + """ + parameter_set = parameter_set or self.parameter_set + if inputs is None: + return self._simulate(parameter_set, experiment).solve(t_eval=t_eval) + else: + if self._built_model is None: + self.build(fit_parameters=inputs.keys()) + return self.solver.solve(self.built_model, inputs=inputs, t_eval=t_eval) + + def _simulate(self, parameter_set=None, experiment=None): + """ + Create a PyBaMM simulation object and return it. """ if self.pybamm_model is not None: - self.parameter_set = parameter_set or self.parameter_set return pybamm.Simulation( self.pybamm_model, experiment=experiment, - parameter_values=self.parameter_set, + parameter_values=parameter_set, ) else: raise ValueError("This sim method currently only supports PyBaMM models") + def n_parameters(self): + """ + Returns the dimension of the parameter space. + """ + return len(self.fit_parameters) + + def n_outputs(self): + """ + Returns the number of outputs this model has. The default is 1. + """ + return 1 + @property def built_model(self): return self._built_model diff --git a/pybop/models/lithium_ion/base_echem.py b/pybop/models/lithium_ion/base_echem.py index 9914cc837..25f6526c9 100644 --- a/pybop/models/lithium_ion/base_echem.py +++ b/pybop/models/lithium_ion/base_echem.py @@ -5,7 +5,8 @@ class SPM(BaseModel): """ - Composition of the SPM class in PyBaMM. + Composition of the PyBaMM Single Particle Model class. + """ def __init__( @@ -23,6 +24,7 @@ def __init__( self._unprocessed_model = self.pybamm_model self.name = name + self.default_parameter_values = self.pybamm_model.default_parameter_values self.parameter_set = parameter_set or self.pybamm_model.default_parameter_values self._unprocessed_parameter_set = self.parameter_set @@ -43,7 +45,8 @@ def __init__( class SPMe(BaseModel): """ - Composition of the SPMe class in PyBaMM. + Composition of the PyBaMM Single Particle Model with Electrolyte class. + """ def __init__( @@ -61,6 +64,7 @@ def __init__( self._unprocessed_model = self.pybamm_model self.name = name + self.default_parameter_values = self.pybamm_model.default_parameter_values self.parameter_set = parameter_set or self.pybamm_model.default_parameter_values self._unprocessed_parameter_set = self.parameter_set diff --git a/tests/unit/test_parameterisation.py b/tests/unit/test_parameterisation.py index f9f821f90..5cbadf84a 100644 --- a/tests/unit/test_parameterisation.py +++ b/tests/unit/test_parameterisation.py @@ -24,11 +24,10 @@ def getdata(self, model, x0): ] * 2 ) - sim = model.sim(experiment=experiment) - return sim.solve() + sim = model.simulate(experiment=experiment) + return sim def test_spm(self): - # Define model model = pybop.lithium_ion.SPM() model.parameter_set = model.pybamm_model.default_parameter_values @@ -70,7 +69,6 @@ def test_spm(self): np.testing.assert_allclose(results, x0, atol=1e-1) def test_spme(self): - # Define model model = pybop.lithium_ion.SPMe() model.parameter_set = model.pybamm_model.default_parameter_values From f5378c9ce77b3e852cc75662f738398ab1520b63 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 13 Oct 2023 15:35:24 +0000 Subject: [PATCH 105/210] docs: update README.md [skip ci] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 518393dfd..128da7964 100644 --- a/README.md +++ b/README.md @@ -215,7 +215,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d <tbody> <tr> <td align="center" valign="top" width="14.28%"><a href="http://bradyplanden.github.io"><img src="https://avatars.githubusercontent.com/u/55357039?v=4?s=100" width="100px;" alt="Brady Planden"/><br /><sub><b>Brady Planden</b></sub></a><br /><a href="#infra-BradyPlanden" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/pybop-team/PyBOP/commits?author=BradyPlanden" title="Tests">⚠️</a> <a href="https://github.com/pybop-team/PyBOP/commits?author=BradyPlanden" title="Code">💻</a> <a href="#example-BradyPlanden" title="Examples">💡</a></td> - <td align="center" valign="top" width="14.28%"><a href="https://github.com/NicolaCourtier"><img src="https://avatars.githubusercontent.com/u/45851982?v=4?s=100" width="100px;" alt="NicolaCourtier"/><br /><sub><b>NicolaCourtier</b></sub></a><br /><a href="https://github.com/pybop-team/PyBOP/commits?author=NicolaCourtier" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/NicolaCourtier"><img src="https://avatars.githubusercontent.com/u/45851982?v=4?s=100" width="100px;" alt="NicolaCourtier"/><br /><sub><b>NicolaCourtier</b></sub></a><br /><a href="https://github.com/pybop-team/PyBOP/commits?author=NicolaCourtier" title="Code">💻</a> <a href="https://github.com/pybop-team/PyBOP/pulls?q=is%3Apr+reviewed-by%3ANicolaCourtier" title="Reviewed Pull Requests">👀</a></td> <td align="center" valign="top" width="14.28%"><a href="http://howey.eng.ox.ac.uk"><img src="https://avatars.githubusercontent.com/u/2247552?v=4?s=100" width="100px;" alt="David Howey"/><br /><sub><b>David Howey</b></sub></a><br /><a href="#ideas-davidhowey" title="Ideas, Planning, & Feedback">🤔</a> <a href="#mentoring-davidhowey" title="Mentoring">🧑🏫</a></td> <td align="center" valign="top" width="14.28%"><a href="http://www.rse.ox.ac.uk"><img src="https://avatars.githubusercontent.com/u/1148404?v=4?s=100" width="100px;" alt="Martin Robinson"/><br /><sub><b>Martin Robinson</b></sub></a><br /><a href="#ideas-martinjrobins" title="Ideas, Planning, & Feedback">🤔</a> <a href="#mentoring-martinjrobins" title="Mentoring">🧑🏫</a></td> </tr> From 468de32cf229cfc9675a96244510515e7e7a479e Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 13 Oct 2023 15:35:25 +0000 Subject: [PATCH 106/210] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 920bf1dde..2be30620d 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -25,7 +25,8 @@ "avatar_url": "https://avatars.githubusercontent.com/u/45851982?v=4", "profile": "https://github.com/NicolaCourtier", "contributions": [ - "code" + "code", + "review" ] }, { From ce56923797706f7d82d50765553a65feaee70ce1 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 13 Oct 2023 17:26:58 +0100 Subject: [PATCH 107/210] Add prior and parameter_set tests, remove redundant catch in parameter_set --- pybop/identification/parameter_set.py | 3 --- tests/unit/test_parameterisation.py | 23 +++++++++++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/pybop/identification/parameter_set.py b/pybop/identification/parameter_set.py index 60d9b6a9e..261c84fa2 100644 --- a/pybop/identification/parameter_set.py +++ b/pybop/identification/parameter_set.py @@ -8,9 +8,6 @@ class ParameterSet: def __new__(cls, method, name): if method.casefold() == "pybamm": - try: return pybamm.ParameterValues(name).copy() - except: - raise ValueError("Parameter set not found") else: raise ValueError("Only PybaMM parameter sets are currently implemented") diff --git a/tests/unit/test_parameterisation.py b/tests/unit/test_parameterisation.py index b584ca08c..3549e489e 100644 --- a/tests/unit/test_parameterisation.py +++ b/tests/unit/test_parameterisation.py @@ -121,3 +121,26 @@ def test_simulate_without_build_model(self): ValueError, match="Model must be built before calling simulate" ): model.simulate(None, None) + + @pytest.mark.unit + def test_priors(self): + # Tests priors + Gaussian = pybop.Gaussian(0.5, 1) + Uniform = pybop.Uniform(0, 1) + Exponential = pybop.Exponential(1) + + np.testing.assert_allclose(Gaussian.pdf(0.5), 0.3989422804014327, atol=1e-4) + np.testing.assert_allclose(Uniform.pdf(0.5), 1, atol=1e-4) + np.testing.assert_allclose(Exponential.pdf(1), 0.36787944117144233, atol=1e-4) + + @pytest.mark.unit + def test_parameter_set(self): + # Tests parameter set creation + with pytest.raises(ValueError): + pybop.ParameterSet("pybamms", "Chen2020") + + parameter_test = pybop.ParameterSet("pybamm", "Chen2020") + np.testing.assert_allclose( + parameter_test["Negative electrode active material volume fraction"], 0.75 + ) + From 5168e068304f279b6809e3a83e1e200806485e0d Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Mon, 23 Oct 2023 09:46:59 +0100 Subject: [PATCH 108/210] Add periodic tests w/ self-hosted, Updt. dependency install, Updt. workflow names --- .github/workflows/scheduled_tests.yaml | 68 ++++++++++++++++++++++++++ .github/workflows/test_on_push.yaml | 11 ++--- 2 files changed, 71 insertions(+), 8 deletions(-) create mode 100644 .github/workflows/scheduled_tests.yaml diff --git a/.github/workflows/scheduled_tests.yaml b/.github/workflows/scheduled_tests.yaml new file mode 100644 index 000000000..02caaaafd --- /dev/null +++ b/.github/workflows/scheduled_tests.yaml @@ -0,0 +1,68 @@ +name: Scheduled + +on: + workflow_dispatch: + pull_request: + branches: + - main + + # runs every day at 09:00 UTC + schedule: + - cron: '0 9 * * *' + +jobs: + build: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python-version: ["3.8", "3.9", "3.10", "3.11"] + + steps: + - uses: actions/checkout@v4 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip nox + - name: Unit tests with nox + run: | + nox -s unit + + #M-series Mac Mini + build-apple-mseries: + needs: style + runs-on: [self-hosted, macOS, ARM64] + env: + GITHUB_PATH: ${PYENV_ROOT/bin:$PATH} + strategy: + fail-fast: false + matrix: + python-version: ["3.8", "3.9", "3.10", "3.11"] + + steps: + - uses: actions/checkout@v4 + - name: Install python & create virtualenv + shell: bash + run: | + eval "$(pyenv init -)" + pyenv install ${{ matrix.python-version }} -s + pyenv virtualenv ${{ matrix.python-version }} pybop-${{ matrix.python-version }} + + - name: Install dependencies & run unit tests for Windows and MacOS + shell: bash + run: | + eval "$(pyenv init -)" + pyenv activate pybop-${{ matrix.python-version }} + python -m pip install --upgrade pip nox + python -m nox -s unit + + - name: Uninstall pyenv-virtualenv & python + if: always() + shell: bash + run: | + eval "$(pyenv init -)" + pyenv activate pybop-${{ matrix.python-version }} + pyenv uninstall -f $( python --version ) \ No newline at end of file diff --git a/.github/workflows/test_on_push.yaml b/.github/workflows/test_on_push.yaml index 977fbba12..02c71bcdd 100644 --- a/.github/workflows/test_on_push.yaml +++ b/.github/workflows/test_on_push.yaml @@ -1,4 +1,4 @@ -name: PyBOP +name: test_on_push on: push: @@ -29,9 +29,7 @@ jobs: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | - python -m pip install --upgrade pip - pip install --upgrade pip nox - pip install -e . + python -m pip install --upgrade pip nox - name: Unit tests with nox run: | nox -s unit @@ -56,10 +54,7 @@ jobs: - name: Install dependencies run: | - python -m pip install --upgrade pip - pip install --upgrade pip nox - pip install -e . - + python -m pip install --upgrade pip nox - name: Run coverage tests for Ubuntu with Python 3.11 and generate report run: nox -s coverage From 393067f1cc55a065ae753615c71da251c2123747 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Mon, 23 Oct 2023 10:18:52 +0100 Subject: [PATCH 109/210] Modify trigger to register workflow --- .github/workflows/scheduled_tests.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/scheduled_tests.yaml b/.github/workflows/scheduled_tests.yaml index 02caaaafd..44be78644 100644 --- a/.github/workflows/scheduled_tests.yaml +++ b/.github/workflows/scheduled_tests.yaml @@ -3,8 +3,8 @@ name: Scheduled on: workflow_dispatch: pull_request: - branches: - - main + # branches: + # - main # runs every day at 09:00 UTC schedule: From c0650e25af80150d7227eecdf5f67a5c91714a16 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Mon, 23 Oct 2023 10:24:59 +0100 Subject: [PATCH 110/210] Updt trigger, remove style requirement, align nox call --- .github/workflows/scheduled_tests.yaml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/scheduled_tests.yaml b/.github/workflows/scheduled_tests.yaml index 44be78644..32a9c3ddb 100644 --- a/.github/workflows/scheduled_tests.yaml +++ b/.github/workflows/scheduled_tests.yaml @@ -3,8 +3,8 @@ name: Scheduled on: workflow_dispatch: pull_request: - # branches: - # - main + branches: + - main # runs every day at 09:00 UTC schedule: @@ -29,11 +29,10 @@ jobs: python -m pip install --upgrade pip nox - name: Unit tests with nox run: | - nox -s unit + python -m nox -s unit #M-series Mac Mini build-apple-mseries: - needs: style runs-on: [self-hosted, macOS, ARM64] env: GITHUB_PATH: ${PYENV_ROOT/bin:$PATH} From bd3b1a3c1c24a9de84489d6d5d466a4fce774eb7 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Mon, 23 Oct 2023 10:40:08 +0100 Subject: [PATCH 111/210] Add wheel dependency --- .github/workflows/scheduled_tests.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/scheduled_tests.yaml b/.github/workflows/scheduled_tests.yaml index 32a9c3ddb..e2903bbf9 100644 --- a/.github/workflows/scheduled_tests.yaml +++ b/.github/workflows/scheduled_tests.yaml @@ -50,12 +50,12 @@ jobs: pyenv install ${{ matrix.python-version }} -s pyenv virtualenv ${{ matrix.python-version }} pybop-${{ matrix.python-version }} - - name: Install dependencies & run unit tests for Windows and MacOS + - name: Install dependencies & run unit tests shell: bash run: | eval "$(pyenv init -)" pyenv activate pybop-${{ matrix.python-version }} - python -m pip install --upgrade pip nox + python -m pip install --upgrade pip nox wheel python -m nox -s unit - name: Uninstall pyenv-virtualenv & python From d10804cfd6868b3ac491a579c9213e783b281455 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Mon, 23 Oct 2023 10:44:33 +0100 Subject: [PATCH 112/210] Add setuptools dependency --- .github/workflows/scheduled_tests.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scheduled_tests.yaml b/.github/workflows/scheduled_tests.yaml index e2903bbf9..9ee2c0cde 100644 --- a/.github/workflows/scheduled_tests.yaml +++ b/.github/workflows/scheduled_tests.yaml @@ -55,7 +55,7 @@ jobs: run: | eval "$(pyenv init -)" pyenv activate pybop-${{ matrix.python-version }} - python -m pip install --upgrade pip nox wheel + python -m pip install --upgrade pip wheel setuptools nox python -m nox -s unit - name: Uninstall pyenv-virtualenv & python From 60d9a9e799c8cbd637a9130fa42a43298d01ac11 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Mon, 23 Oct 2023 13:23:31 +0100 Subject: [PATCH 113/210] Remove python matrix, 3.10 support only --- .github/workflows/scheduled_tests.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scheduled_tests.yaml b/.github/workflows/scheduled_tests.yaml index 9ee2c0cde..5e1e66887 100644 --- a/.github/workflows/scheduled_tests.yaml +++ b/.github/workflows/scheduled_tests.yaml @@ -39,7 +39,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.8", "3.9", "3.10", "3.11"] + python-version: ["3.10"] steps: - uses: actions/checkout@v4 From d2403990bee8788e271de0ff30d3e21fb99e56da Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Mon, 23 Oct 2023 13:36:37 +0100 Subject: [PATCH 114/210] Updt testing badge for scheduled workflow --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 128da7964..9b4f4a267 100644 --- a/README.md +++ b/README.md @@ -3,10 +3,9 @@ <img src="https://raw.githubusercontent.com/pybop-team/PyBOP/develop/assets/Temp_Logo.png" alt="logo" width="400" height="auto" /> <h1>Python Battery Optimisation and Parameterisation</h1> - <p> - <a href="https://github.com/pybop-team/PyBOP/actions/workflows/test_on_push.yaml"> - <img src="https://img.shields.io/github/actions/workflow/status/pybop-team/PyBOP/test_on_push.yaml?label=Build%20Status" alt="build" /> + <a href="https://github.com/pybop-team/PyBOP/actions/workflows/scheduled_tests.yaml"> + <img src="https://github.com/pybop-team/PyBOP/actions/workflows/scheduled_tests.yaml/badge.svg" alt="Scheduled" /> </a> <a href="https://github.com/pybop-team/PyBOP/graphs/contributors"> <img src="https://img.shields.io/github/contributors/pybop-team/PyBOP" alt="contributors" /> From e085a7f88ae0c549a0a3d4c2a14deff470a955aa Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Tue, 24 Oct 2023 17:45:06 +0100 Subject: [PATCH 115/210] Add pre-commit config and run on repo --- .github/ISSUE_TEMPLATE/feature_request.yml | 2 +- .github/workflows/release-action.yaml | 4 +- .github/workflows/test_on_push.yaml | 2 +- .pre-commit-config.yaml | 43 ++++++++++++++++++++++ CONTRIBUTING.md | 2 +- README.md | 6 +-- examples/notebooks/rmse-estimisation.ipynb | 2 +- tests/unit/test_parameterisation.py | 1 - 8 files changed, 52 insertions(+), 10 deletions(-) create mode 100644 .pre-commit-config.yaml diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index 84ffca5d8..5821d4f5c 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -27,4 +27,4 @@ body: id: context attributes: label: Additional context - description: Add any additional context about the feature request. \ No newline at end of file + description: Add any additional context about the feature request. diff --git a/.github/workflows/release-action.yaml b/.github/workflows/release-action.yaml index 8bfa74f15..c2cd834b2 100644 --- a/.github/workflows/release-action.yaml +++ b/.github/workflows/release-action.yaml @@ -36,7 +36,7 @@ jobs: runs-on: ubuntu-latest environment: name: pypi - url: https://pypi.org/p/pybop + url: https://pypi.org/p/pybop permissions: id-token: write # IMPORTANT: mandatory for trusted publishing @@ -107,4 +107,4 @@ jobs: - name: Publish distribution 📦 to TestPyPI uses: pypa/gh-action-pypi-publish@release/v1 with: - repository-url: https://test.pypi.org/legacy/ \ No newline at end of file + repository-url: https://test.pypi.org/legacy/ diff --git a/.github/workflows/test_on_push.yaml b/.github/workflows/test_on_push.yaml index 977fbba12..f5ee3b37d 100644 --- a/.github/workflows/test_on_push.yaml +++ b/.github/workflows/test_on_push.yaml @@ -66,4 +66,4 @@ jobs: - name: Upload coverage report uses: codecov/codecov-action@v3 env: - CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} \ No newline at end of file + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 000000000..d4a98ef4e --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,43 @@ +ci: + autoupdate_commit_msg: "chore: update pre-commit hooks" + autofix_commit_msg: "style: pre-commit fixes" + +repos: + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: "v0.0.292" + hooks: + - id: ruff + args: [--fix, --ignore=E741, --exclude=__init__.py] + + - repo: https://github.com/nbQA-dev/nbQA + rev: 1.7.0 + hooks: + - id: nbqa-ruff + additional_dependencies: [ruff==0.0.284] + args: ["--fix","--ignore=E501,E402"] + + # - repo: https://github.com/adamchainz/blacken-docs + # rev: "1.16.0" + # hooks: + # - id: blacken-docs + # additional_dependencies: [black==22.12.0] + + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.4.0 + hooks: + - id: check-added-large-files + - id: check-case-conflict + - id: check-merge-conflict + - id: check-yaml + - id: debug-statements + - id: end-of-file-fixer + - id: mixed-line-ending + - id: trailing-whitespace + + - repo: https://github.com/pre-commit/pygrep-hooks + rev: v1.10.0 + hooks: + - id: python-check-blanket-type-ignore + - id: rst-backticks + - id: rst-directive-colons + - id: rst-inline-touching-normal diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 30d2fe59f..fab971445 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -279,4 +279,4 @@ GitHub does some magic with particular filenames. In particular: ## Acknowledgements This CONTRIBUTING.md file, along with large sections of the code infrastructure, -was copied from the excellent [Pints repo](https://github.com/pints-team/pints), and [PyBaMM repo](https://github.com/pybamm-team/PyBaMM) \ No newline at end of file +was copied from the excellent [Pints repo](https://github.com/pints-team/pints), and [PyBaMM repo](https://github.com/pybamm-team/PyBaMM) diff --git a/README.md b/README.md index 128da7964..65bbe9c68 100644 --- a/README.md +++ b/README.md @@ -152,7 +152,7 @@ def getdata(x0): x0 = np.array([0.55, 0.63]) solution = getdata(x0) ``` -Next, the observed variables are defined, with the model construction and parameter definitions following. Finally, the parameterisation class is constructed and parameter fitting is completed. +Next, the observed variables are defined, with the model construction and parameter definitions following. Finally, the parameterisation class is constructed and parameter fitting is completed. ```python observations = [ pybop.Observed("Time [s]", solution["Time [s]"].data), @@ -198,7 +198,7 @@ learning from the success of the [PyBaMM](https://pybamm.org/) community. Our va - Inclusivity and fairness (those who want to contribute may do so, and their input is appropriately recognised) -- Inter-operability (aiming for modularity to enable maximum impact and inclusivity) +- Interoperability (aiming for modularity to enable maximum impact and inclusivity) - User-friendliness (putting user requirements first, thinking about user-assistance & workflows) @@ -227,4 +227,4 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d <!-- ALL-CONTRIBUTORS-LIST:END --> -This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specifications. Contributions of any kind are welcome! See `contributing.md` for ways to get started. \ No newline at end of file +This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specifications. Contributions of any kind are welcome! See `contributing.md` for ways to get started. diff --git a/examples/notebooks/rmse-estimisation.ipynb b/examples/notebooks/rmse-estimisation.ipynb index c4104d7be..ff7b47771 100644 --- a/examples/notebooks/rmse-estimisation.ipynb +++ b/examples/notebooks/rmse-estimisation.ipynb @@ -220,7 +220,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Next, we define the targetted forward model parameters for estimation. Furthermore, PyBOP provides functionality to define a prior for the parameters. The initial parameters values used in the estimiation will be randomly drawn from the prior distribution." + "Next, we define the targeted forward model parameters for estimation. Furthermore, PyBOP provides functionality to define a prior for the parameters. The initial parameters values used in the estimiation will be randomly drawn from the prior distribution." ] }, { diff --git a/tests/unit/test_parameterisation.py b/tests/unit/test_parameterisation.py index 3549e489e..aa5499076 100644 --- a/tests/unit/test_parameterisation.py +++ b/tests/unit/test_parameterisation.py @@ -143,4 +143,3 @@ def test_parameter_set(self): np.testing.assert_allclose( parameter_test["Negative electrode active material volume fraction"], 0.75 ) - From 0f11fb46ad02e4dd62c0e4e60c752c70a3c7d1a8 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Wed, 25 Oct 2023 10:44:12 +0100 Subject: [PATCH 116/210] Add pre-commit format check --- .github/workflows/test_on_push.yaml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/.github/workflows/test_on_push.yaml b/.github/workflows/test_on_push.yaml index f5ee3b37d..9fb2b2c37 100644 --- a/.github/workflows/test_on_push.yaml +++ b/.github/workflows/test_on_push.yaml @@ -14,6 +14,21 @@ concurrency: cancel-in-progress: true jobs: + style: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: 3.11 + + - name: Check formatting with pre-commit + run: | + python -m pip install pre-commit + pre-commit run ruff + + build: runs-on: ubuntu-latest strategy: From 5fd104f37d0f92852bb09de6b6fdd983125ba007 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Wed, 25 Oct 2023 10:49:56 +0100 Subject: [PATCH 117/210] Add pre-commit to CONTRIBUTING --- CONTRIBUTING.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fab971445..f65361cd2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -8,6 +8,22 @@ Before you commit any code, please perform the following checks: - [All tests pass](#testing): `$ nox -s unit_test` +### Installing and using pre-commit + +`PyBOP` uses a set of `pre-commit` hooks and the `pre-commit` bot to format and prettify the codebase. The hooks can be installed locally using - + +```bash +pip install pre-commit +pre-commit install +``` + +This would run the checks every time a commit is created locally. The checks will only run on the files modified by that commit, but the checks can be triggered for all the files using - + +```bash +pre-commit run --all-files +``` + +If you would like to skip the failing checks and push the code for further discussion, use the `--no-verify` option with `git commit`. ## Workflow From 00403cb479ded9daaf9304a8d951c75676a2acd2 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Wed, 25 Oct 2023 13:42:50 +0100 Subject: [PATCH 118/210] hotfix for model.simulate() --- pybop/models/BaseModel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pybop/models/BaseModel.py b/pybop/models/BaseModel.py index d23d60f2f..21e48ebe3 100644 --- a/pybop/models/BaseModel.py +++ b/pybop/models/BaseModel.py @@ -102,7 +102,7 @@ def simulate(self, inputs, t_eval): if self._built_model is None: raise ValueError("Model must be built before calling simulate") else: - if inputs is isinstance(dict): + if not isinstance(inputs, dict): inputs_dict = { key: inputs[i] for i, key in enumerate(self.fit_parameters) } From 3251332c2d9d1ad5570ccd8caa92f4051901b6c6 Mon Sep 17 00:00:00 2001 From: NicolaCourtier <45851982+NicolaCourtier@users.noreply.github.com> Date: Wed, 25 Oct 2023 17:12:20 +0100 Subject: [PATCH 119/210] Run example scripts as tests (#65) * Run example scripts as tests * Add Pints to setup * Remove Matlibplot test rendering, split tests with descripts, add BaseModel() tests --------- Co-authored-by: Brady Planden <brady.planden@gmail.com> --- conftest.py | 3 ++ examples/scripts/mle.py | 1 - ...mse-estimisation.py => rmse_estimation.py} | 1 + pybop/__init__.py | 7 +-- pybop/identification/observations.py | 1 + pybop/identification/parameter_set.py | 3 +- pybop/models/BaseModel.py | 2 +- setup.py | 1 + tests/unit/test_examples.py | 20 ++++++++ tests/unit/test_models.py | 34 +++++++++++++ tests/unit/test_parameter_sets.py | 22 ++++++++ ...erisation.py => test_parameterisations.py} | 51 +++++-------------- tests/unit/test_priors.py | 22 ++++++++ 13 files changed, 124 insertions(+), 44 deletions(-) rename examples/scripts/{rmse-estimisation.py => rmse_estimation.py} (98%) create mode 100644 tests/unit/test_examples.py create mode 100644 tests/unit/test_models.py create mode 100644 tests/unit/test_parameter_sets.py rename tests/unit/{test_parameterisation.py => test_parameterisations.py} (72%) create mode 100644 tests/unit/test_priors.py diff --git a/conftest.py b/conftest.py index 033168440..b37cbd0f5 100644 --- a/conftest.py +++ b/conftest.py @@ -1,4 +1,7 @@ import pytest +import matplotlib + +matplotlib.use("Template") def pytest_addoption(parser): diff --git a/examples/scripts/mle.py b/examples/scripts/mle.py index 9118e0b4b..1385a8ccd 100644 --- a/examples/scripts/mle.py +++ b/examples/scripts/mle.py @@ -41,7 +41,6 @@ print("Estimated parameters:") print(x1) - # Show the generated data simulated_values = problem.evaluate(x1[:2]) diff --git a/examples/scripts/rmse-estimisation.py b/examples/scripts/rmse_estimation.py similarity index 98% rename from examples/scripts/rmse-estimisation.py rename to examples/scripts/rmse_estimation.py index 30c5159a3..1e82d1df6 100644 --- a/examples/scripts/rmse-estimisation.py +++ b/examples/scripts/rmse_estimation.py @@ -1,5 +1,6 @@ import pybop import pandas as pd +import numpy as np # Form observations Measurements = pd.read_csv("examples/scripts/Chen_example.csv", comment="#").to_numpy() diff --git a/pybop/__init__.py b/pybop/__init__.py index 6b5cfe509..84dde9555 100644 --- a/pybop/__init__.py +++ b/pybop/__init__.py @@ -20,13 +20,14 @@ # Float format: a float can be converted to a 17 digit decimal and back without # loss of information FLOAT_FORMAT = "{: .17e}" -# Absolute path to the PyBOP repo -script_path = os.path.abspath(__file__) +# Absolute path to the pybop module +script_path = os.path.dirname(__file__) # # Model Classes # -from .models import BaseModel, lithium_ion +from .models import lithium_ion +from .models.BaseModel import BaseModel # # Parameterisation class diff --git a/pybop/identification/observations.py b/pybop/identification/observations.py index bd824af17..417a9b876 100644 --- a/pybop/identification/observations.py +++ b/pybop/identification/observations.py @@ -1,5 +1,6 @@ import pybamm + class Observed: """ Class for experimental Observations. diff --git a/pybop/identification/parameter_set.py b/pybop/identification/parameter_set.py index d5fc930e8..1e1dc23ec 100644 --- a/pybop/identification/parameter_set.py +++ b/pybop/identification/parameter_set.py @@ -1,5 +1,6 @@ import pybamm + class ParameterSet: """ Class for creating parameter sets in pybop. @@ -7,6 +8,6 @@ class ParameterSet: def __new__(cls, method, name): if method.casefold() == "pybamm": - return pybamm.ParameterValues(name).copy() + return pybamm.ParameterValues(name).copy() else: raise ValueError("Only PybaMM parameter sets are currently implemented") diff --git a/pybop/models/BaseModel.py b/pybop/models/BaseModel.py index 21e48ebe3..313f5b71b 100644 --- a/pybop/models/BaseModel.py +++ b/pybop/models/BaseModel.py @@ -1,7 +1,7 @@ import pybamm -class BaseModel: +class BaseModel(): """ Base class for PyBOP models """ diff --git a/setup.py b/setup.py index c0a885538..4d6b63a65 100644 --- a/setup.py +++ b/setup.py @@ -30,6 +30,7 @@ "scipy>=1.3", "pandas>=1.0", "nlopt>=2.6", + "pints>=0.5", ], # https://pypi.org/classifiers/ classifiers=[], diff --git a/tests/unit/test_examples.py b/tests/unit/test_examples.py new file mode 100644 index 000000000..60d1a5fe9 --- /dev/null +++ b/tests/unit/test_examples.py @@ -0,0 +1,20 @@ +import pybop +import numpy as np +import pytest +import runpy +import os + + +class TestExamples: + """ + A class to test the example scripts. + """ + + @pytest.mark.unit + def test_example_scripts(self): + path_to_example_scripts = os.path.join( + pybop.script_path, "..", "examples", "scripts" + ) + for example in os.listdir(path_to_example_scripts): + if example.endswith(".py"): + runpy.run_path(os.path.join(path_to_example_scripts, example)) \ No newline at end of file diff --git a/tests/unit/test_models.py b/tests/unit/test_models.py new file mode 100644 index 000000000..839c832d3 --- /dev/null +++ b/tests/unit/test_models.py @@ -0,0 +1,34 @@ +import pybop +import numpy as np +import pytest +import runpy +import os + + +class TestModels: + """ + A class to test the models. + """ + + @pytest.mark.unit + def test_simulate_without_build_model(self): + # Define model + model = pybop.lithium_ion.SPM() + + with pytest.raises( + ValueError, match="Model must be built before calling simulate" + ): + model.simulate(None, None) + + @pytest.mark.unit + def test_build(self): + model = pybop.lithium_ion.SPM() + model.build() + assert model.built_model is not None + + @pytest.mark.unit + def test_n_parameters(self): + model = pybop.BaseModel() + n = model.n_outputs() + assert isinstance(n, int) + diff --git a/tests/unit/test_parameter_sets.py b/tests/unit/test_parameter_sets.py new file mode 100644 index 000000000..fc58eac6b --- /dev/null +++ b/tests/unit/test_parameter_sets.py @@ -0,0 +1,22 @@ +import pybop +import numpy as np +import pytest +import runpy +import os + + +class TestParameterSets: + """ + A class to test parameter sets. + """ + + @pytest.mark.unit + def test_parameter_set(self): + # Tests parameter set creation + with pytest.raises(ValueError): + pybop.ParameterSet("pybamms", "Chen2020") + + parameter_test = pybop.ParameterSet("pybamm", "Chen2020") + np.testing.assert_allclose( + parameter_test["Negative electrode active material volume fraction"], 0.75 + ) diff --git a/tests/unit/test_parameterisation.py b/tests/unit/test_parameterisations.py similarity index 72% rename from tests/unit/test_parameterisation.py rename to tests/unit/test_parameterisations.py index 3549e489e..70c8b776b 100644 --- a/tests/unit/test_parameterisation.py +++ b/tests/unit/test_parameterisations.py @@ -1,10 +1,14 @@ import pybop import pybamm -import numpy as np import pytest +import numpy as np -class TestParameterisation: +class TestModelParameterisation: + """ + A class to test the model parameterisation methods. + """ + @pytest.mark.unit def test_spm(self): # Define model @@ -43,8 +47,9 @@ def test_spm(self): results, last_optim, num_evals = parameterisation.rmse( signal="Voltage [V]", method="nlopt" ) - # Assertions - np.testing.assert_allclose(last_optim, 1e-3, atol=1e-2) + + # Assertions (for testing purposes only) + np.testing.assert_allclose(last_optim, 0, atol=1e-2) np.testing.assert_allclose(results, x0, atol=1e-1) @pytest.mark.unit @@ -85,9 +90,10 @@ def test_spme(self): results, last_optim, num_evals = parameterisation.rmse( signal="Voltage [V]", method="nlopt" ) - # Assertions - np.testing.assert_allclose(last_optim, 1e-3, atol=1e-2) - np.testing.assert_allclose(results, x0, atol=1e-1) + + # Assertions (for testing purposes only) + np.testing.assert_allclose(last_optim, 0, atol=1e-2) + np.testing.assert_allclose(results, x0, rtol=1e-1) def getdata(self, model, x0): model.parameter_set = model.pybamm_model.default_parameter_values @@ -112,35 +118,4 @@ def getdata(self, model, x0): sim = model.predict(experiment=experiment) return sim - @pytest.mark.unit - def test_simulate_without_build_model(self): - # Define model - model = pybop.lithium_ion.SPM() - - with pytest.raises( - ValueError, match="Model must be built before calling simulate" - ): - model.simulate(None, None) - - @pytest.mark.unit - def test_priors(self): - # Tests priors - Gaussian = pybop.Gaussian(0.5, 1) - Uniform = pybop.Uniform(0, 1) - Exponential = pybop.Exponential(1) - - np.testing.assert_allclose(Gaussian.pdf(0.5), 0.3989422804014327, atol=1e-4) - np.testing.assert_allclose(Uniform.pdf(0.5), 1, atol=1e-4) - np.testing.assert_allclose(Exponential.pdf(1), 0.36787944117144233, atol=1e-4) - - @pytest.mark.unit - def test_parameter_set(self): - # Tests parameter set creation - with pytest.raises(ValueError): - pybop.ParameterSet("pybamms", "Chen2020") - - parameter_test = pybop.ParameterSet("pybamm", "Chen2020") - np.testing.assert_allclose( - parameter_test["Negative electrode active material volume fraction"], 0.75 - ) diff --git a/tests/unit/test_priors.py b/tests/unit/test_priors.py new file mode 100644 index 000000000..d7ba2d748 --- /dev/null +++ b/tests/unit/test_priors.py @@ -0,0 +1,22 @@ +import pybop +import numpy as np +import pytest +import runpy +import os + + +class TestPriors: + """ + A class to test the priors. + """ + + @pytest.mark.unit + def test_priors(self): + # Tests priors + Gaussian = pybop.Gaussian(0.5, 1) + Uniform = pybop.Uniform(0, 1) + Exponential = pybop.Exponential(1) + + np.testing.assert_allclose(Gaussian.pdf(0.5), 0.3989422804014327, atol=1e-4) + np.testing.assert_allclose(Uniform.pdf(0.5), 1, atol=1e-4) + np.testing.assert_allclose(Exponential.pdf(1), 0.36787944117144233, atol=1e-4) From 019718b2e35fffc0765314d2401530f644307c56 Mon Sep 17 00:00:00 2001 From: NicolaCourtier <45851982+NicolaCourtier@users.noreply.github.com> Date: Wed, 25 Oct 2023 17:25:09 +0100 Subject: [PATCH 120/210] Folder restructure into components of optimisation No change to the code other than file locations. Aiming to represent the components of the architecture diagram in the structure of the code. --- pybop/__init__.py | 13 ++++++++----- pybop/{optimisation => costs}/__init__.py | 0 pybop/datasets/__init__.py | 0 pybop/{identification => datasets}/observations.py | 0 pybop/identification/__init__.py | 4 ---- .../BaseOptimisation.py | 0 pybop/{optimisation => optimisers}/NLoptOptimize.py | 0 pybop/{optimisation => optimisers}/SciPyMinimize.py | 0 pybop/optimisers/__init__.py | 0 pybop/{identification => }/parameterisation.py | 0 pybop/parameters/__init__.py | 0 pybop/{identification => parameters}/parameter.py | 0 .../{identification => parameters}/parameter_set.py | 0 pybop/{ => parameters}/priors.py | 0 14 files changed, 8 insertions(+), 9 deletions(-) rename pybop/{optimisation => costs}/__init__.py (100%) create mode 100644 pybop/datasets/__init__.py rename pybop/{identification => datasets}/observations.py (100%) delete mode 100644 pybop/identification/__init__.py rename pybop/{optimisation => optimisers}/BaseOptimisation.py (100%) rename pybop/{optimisation => optimisers}/NLoptOptimize.py (100%) rename pybop/{optimisation => optimisers}/SciPyMinimize.py (100%) create mode 100644 pybop/optimisers/__init__.py rename pybop/{identification => }/parameterisation.py (100%) create mode 100644 pybop/parameters/__init__.py rename pybop/{identification => parameters}/parameter.py (100%) rename pybop/{identification => parameters}/parameter_set.py (100%) rename pybop/{ => parameters}/priors.py (100%) diff --git a/pybop/__init__.py b/pybop/__init__.py index 84dde9555..a946b38ca 100644 --- a/pybop/__init__.py +++ b/pybop/__init__.py @@ -32,19 +32,22 @@ # # Parameterisation class # -from .identification import Parameterisation, ParameterSet, Parameter, Observed +from .parameters.parameter_set import ParameterSet +from .parameters.parameter import Parameter +from .datasets.observations import Observed +from .parameterisation import Parameterisation # # Priors class # -from .priors import Gaussian, Uniform, Exponential +from .parameters.priors import Gaussian, Uniform, Exponential # # Optimisation class # -from .optimisation import BaseOptimisation -from .optimisation.NLoptOptimize import NLoptOptimize -from .optimisation.SciPyMinimize import SciPyMinimize +from .optimisers import BaseOptimisation +from .optimisers.NLoptOptimize import NLoptOptimize +from .optimisers.SciPyMinimize import SciPyMinimize # # Remove any imported modules, so we don't expose them as part of pybop diff --git a/pybop/optimisation/__init__.py b/pybop/costs/__init__.py similarity index 100% rename from pybop/optimisation/__init__.py rename to pybop/costs/__init__.py diff --git a/pybop/datasets/__init__.py b/pybop/datasets/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/pybop/identification/observations.py b/pybop/datasets/observations.py similarity index 100% rename from pybop/identification/observations.py rename to pybop/datasets/observations.py diff --git a/pybop/identification/__init__.py b/pybop/identification/__init__.py deleted file mode 100644 index 4bcb89c1d..000000000 --- a/pybop/identification/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from .parameter_set import ParameterSet -from .parameter import Parameter -from .observations import Observed -from .parameterisation import Parameterisation diff --git a/pybop/optimisation/BaseOptimisation.py b/pybop/optimisers/BaseOptimisation.py similarity index 100% rename from pybop/optimisation/BaseOptimisation.py rename to pybop/optimisers/BaseOptimisation.py diff --git a/pybop/optimisation/NLoptOptimize.py b/pybop/optimisers/NLoptOptimize.py similarity index 100% rename from pybop/optimisation/NLoptOptimize.py rename to pybop/optimisers/NLoptOptimize.py diff --git a/pybop/optimisation/SciPyMinimize.py b/pybop/optimisers/SciPyMinimize.py similarity index 100% rename from pybop/optimisation/SciPyMinimize.py rename to pybop/optimisers/SciPyMinimize.py diff --git a/pybop/optimisers/__init__.py b/pybop/optimisers/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/pybop/identification/parameterisation.py b/pybop/parameterisation.py similarity index 100% rename from pybop/identification/parameterisation.py rename to pybop/parameterisation.py diff --git a/pybop/parameters/__init__.py b/pybop/parameters/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/pybop/identification/parameter.py b/pybop/parameters/parameter.py similarity index 100% rename from pybop/identification/parameter.py rename to pybop/parameters/parameter.py diff --git a/pybop/identification/parameter_set.py b/pybop/parameters/parameter_set.py similarity index 100% rename from pybop/identification/parameter_set.py rename to pybop/parameters/parameter_set.py diff --git a/pybop/priors.py b/pybop/parameters/priors.py similarity index 100% rename from pybop/priors.py rename to pybop/parameters/priors.py From 25d2f656214eeeccd0b3cbced9bfc9b2100fcffa Mon Sep 17 00:00:00 2001 From: NicolaCourtier <45851982+NicolaCourtier@users.noreply.github.com> Date: Wed, 25 Oct 2023 18:09:12 +0100 Subject: [PATCH 121/210] Rename optimisation/optimiser objects Rename BaseOptimisation to BaseOptimiser for clarity of its purpose, and rename Parameterisation to Optimisation. --- examples/scripts/rmse_estimation.py | 2 +- pybop/__init__.py | 4 ++-- pybop/{parameterisation.py => optimisation.py} | 4 ++-- .../optimisers/{BaseOptimisation.py => BaseOptimiser.py} | 4 ++-- pybop/optimisers/NLoptOptimize.py | 8 ++++---- pybop/optimisers/SciPyMinimize.py | 8 ++++---- tests/unit/test_parameterisations.py | 4 ++-- 7 files changed, 17 insertions(+), 17 deletions(-) rename pybop/{parameterisation.py => optimisation.py} (98%) rename pybop/optimisers/{BaseOptimisation.py => BaseOptimiser.py} (91%) diff --git a/examples/scripts/rmse_estimation.py b/examples/scripts/rmse_estimation.py index 1e82d1df6..cb857baf0 100644 --- a/examples/scripts/rmse_estimation.py +++ b/examples/scripts/rmse_estimation.py @@ -28,7 +28,7 @@ ), ] -parameterisation = pybop.Parameterisation( +parameterisation = pybop.Optimisation( model, observations=observations, fit_parameters=params ) diff --git a/pybop/__init__.py b/pybop/__init__.py index a946b38ca..072276283 100644 --- a/pybop/__init__.py +++ b/pybop/__init__.py @@ -35,7 +35,6 @@ from .parameters.parameter_set import ParameterSet from .parameters.parameter import Parameter from .datasets.observations import Observed -from .parameterisation import Parameterisation # # Priors class @@ -45,7 +44,8 @@ # # Optimisation class # -from .optimisers import BaseOptimisation +from .optimisation import Optimisation +from .optimisers import BaseOptimiser from .optimisers.NLoptOptimize import NLoptOptimize from .optimisers.SciPyMinimize import SciPyMinimize diff --git a/pybop/parameterisation.py b/pybop/optimisation.py similarity index 98% rename from pybop/parameterisation.py rename to pybop/optimisation.py index 4a2cee9d5..d63fbec68 100644 --- a/pybop/parameterisation.py +++ b/pybop/optimisation.py @@ -2,9 +2,9 @@ import numpy as np -class Parameterisation: +class Optimisation: """ - Parameterisation class for pybop. + Optimisation class for PyBOP. """ def __init__( diff --git a/pybop/optimisers/BaseOptimisation.py b/pybop/optimisers/BaseOptimiser.py similarity index 91% rename from pybop/optimisers/BaseOptimisation.py rename to pybop/optimisers/BaseOptimiser.py index 1663375f8..130ac5299 100644 --- a/pybop/optimisers/BaseOptimisation.py +++ b/pybop/optimisers/BaseOptimiser.py @@ -1,4 +1,4 @@ -class BaseOptimisation: +class BaseOptimiser: """ Base class for the optimisation methods. @@ -6,7 +6,7 @@ class BaseOptimisation: """ def __init__(self): - self.name = "Base Optimisation" + self.name = "Base Optimiser" def optimise(self, cost_function, x0, bounds, method=None): """ diff --git a/pybop/optimisers/NLoptOptimize.py b/pybop/optimisers/NLoptOptimize.py index c8040645a..e1c88f696 100644 --- a/pybop/optimisers/NLoptOptimize.py +++ b/pybop/optimisers/NLoptOptimize.py @@ -1,15 +1,15 @@ import nlopt -from .BaseOptimisation import BaseOptimisation +from .BaseOptimiser import BaseOptimiser -class NLoptOptimize(BaseOptimisation): +class NLoptOptimize(BaseOptimiser): """ - Wrapper class for the NLOpt optimisation class. Extends the BaseOptimisation class. + Wrapper class for the NLOpt optimisation class. Extends the BaseOptimiser class. """ def __init__(self, method=None, x0=None, xtol=None): super().__init__() - self.name = "NLOpt Optimisation" + self.name = "NLOpt Optimiser" if method is not None: self.opt = nlopt.opt(method, len(x0)) diff --git a/pybop/optimisers/SciPyMinimize.py b/pybop/optimisers/SciPyMinimize.py index 122d4d749..cd831e9b2 100644 --- a/pybop/optimisers/SciPyMinimize.py +++ b/pybop/optimisers/SciPyMinimize.py @@ -1,10 +1,10 @@ from scipy.optimize import minimize -from .BaseOptimisation import BaseOptimisation +from .BaseOptimiser import BaseOptimiser -class SciPyMinimize(BaseOptimisation): +class SciPyMinimize(BaseOptimiser): """ - Wrapper class for the Scipy optimisation class. Extends the BaseOptimisation class. + Wrapper class for the Scipy optimisation class. Extends the BaseOptimiser class. """ def __init__(self, cost_function, x0, bounds=None, options=None): @@ -14,7 +14,7 @@ def __init__(self, cost_function, x0, bounds=None, options=None): self.x0 = x0 or cost_function.x0 self.bounds = bounds self.options = options - self.name = "Scipy Optimisation" + self.name = "Scipy Optimiser" def _runoptimise(self): """ diff --git a/tests/unit/test_parameterisations.py b/tests/unit/test_parameterisations.py index 70c8b776b..b542b0c96 100644 --- a/tests/unit/test_parameterisations.py +++ b/tests/unit/test_parameterisations.py @@ -39,7 +39,7 @@ def test_spm(self): ), ] - parameterisation = pybop.Parameterisation( + parameterisation = pybop.Optimisation( model, observations=observations, fit_parameters=params ) @@ -82,7 +82,7 @@ def test_spme(self): ), ] - parameterisation = pybop.Parameterisation( + parameterisation = pybop.Optimisation( model, observations=observations, fit_parameters=params ) From a6f1a193c25f72a87bc89832bccc9e22454d7957 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 26 Oct 2023 10:07:33 +0100 Subject: [PATCH 122/210] Add options to echem_classes, Updt example to show submodel usage --- examples/scripts/rmse_estimation.py | 2 +- pybop/models/lithium_ion/base_echem.py | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/examples/scripts/rmse_estimation.py b/examples/scripts/rmse_estimation.py index cb857baf0..000796f2d 100644 --- a/examples/scripts/rmse_estimation.py +++ b/examples/scripts/rmse_estimation.py @@ -12,7 +12,7 @@ # Define model # parameter_set = pybop.ParameterSet("pybamm", "Chen2020") -model = pybop.models.lithium_ion.SPM() +model = pybop.models.lithium_ion.SPM(options = {"thermal": "lumped"}) # Fitting parameters params = [ diff --git a/pybop/models/lithium_ion/base_echem.py b/pybop/models/lithium_ion/base_echem.py index 542d6a399..7f8efc202 100644 --- a/pybop/models/lithium_ion/base_echem.py +++ b/pybop/models/lithium_ion/base_echem.py @@ -17,9 +17,10 @@ def __init__( var_pts=None, spatial_methods=None, solver=None, + options=None, ): super().__init__() - self.pybamm_model = pybamm.lithium_ion.SPM() + self.pybamm_model = pybamm.lithium_ion.SPM(options=options) self._unprocessed_model = self.pybamm_model self.name = name @@ -57,9 +58,10 @@ def __init__( var_pts=None, spatial_methods=None, solver=None, + options=None, ): super().__init__() - self.pybamm_model = pybamm.lithium_ion.SPMe() + self.pybamm_model = pybamm.lithium_ion.SPMe(options=options) self._unprocessed_model = self.pybamm_model self.name = name From dd58d24c406f9a4b56982ea42be5bbfe0b2644e4 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 26 Oct 2023 10:10:16 +0100 Subject: [PATCH 123/210] black format --- examples/scripts/rmse_estimation.py | 2 +- pybop/models/BaseModel.py | 2 +- tests/unit/test_examples.py | 2 +- tests/unit/test_models.py | 1 - tests/unit/test_parameterisations.py | 2 -- 5 files changed, 3 insertions(+), 6 deletions(-) diff --git a/examples/scripts/rmse_estimation.py b/examples/scripts/rmse_estimation.py index 000796f2d..2c7f41eca 100644 --- a/examples/scripts/rmse_estimation.py +++ b/examples/scripts/rmse_estimation.py @@ -12,7 +12,7 @@ # Define model # parameter_set = pybop.ParameterSet("pybamm", "Chen2020") -model = pybop.models.lithium_ion.SPM(options = {"thermal": "lumped"}) +model = pybop.models.lithium_ion.SPM(options={"thermal": "lumped"}) # Fitting parameters params = [ diff --git a/pybop/models/BaseModel.py b/pybop/models/BaseModel.py index 313f5b71b..21e48ebe3 100644 --- a/pybop/models/BaseModel.py +++ b/pybop/models/BaseModel.py @@ -1,7 +1,7 @@ import pybamm -class BaseModel(): +class BaseModel: """ Base class for PyBOP models """ diff --git a/tests/unit/test_examples.py b/tests/unit/test_examples.py index 60d1a5fe9..807a577e3 100644 --- a/tests/unit/test_examples.py +++ b/tests/unit/test_examples.py @@ -17,4 +17,4 @@ def test_example_scripts(self): ) for example in os.listdir(path_to_example_scripts): if example.endswith(".py"): - runpy.run_path(os.path.join(path_to_example_scripts, example)) \ No newline at end of file + runpy.run_path(os.path.join(path_to_example_scripts, example)) diff --git a/tests/unit/test_models.py b/tests/unit/test_models.py index 839c832d3..9c746f992 100644 --- a/tests/unit/test_models.py +++ b/tests/unit/test_models.py @@ -31,4 +31,3 @@ def test_n_parameters(self): model = pybop.BaseModel() n = model.n_outputs() assert isinstance(n, int) - diff --git a/tests/unit/test_parameterisations.py b/tests/unit/test_parameterisations.py index b542b0c96..4f6a60ce7 100644 --- a/tests/unit/test_parameterisations.py +++ b/tests/unit/test_parameterisations.py @@ -117,5 +117,3 @@ def getdata(self, model, x0): ) sim = model.predict(experiment=experiment) return sim - - From 486e2fc07cc0b07569922fd0ee1220a0aed7368b Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 26 Oct 2023 10:54:42 +0100 Subject: [PATCH 124/210] Add boundary constraints on the prior sampling, bugfix for test assertion --- examples/scripts/rmse_estimation.py | 2 +- pybop/models/BaseModel.py | 2 +- pybop/optimisation.py | 10 +++++++--- tests/unit/test_examples.py | 2 +- tests/unit/test_models.py | 1 - tests/unit/test_parameterisations.py | 8 +++----- 6 files changed, 13 insertions(+), 12 deletions(-) diff --git a/examples/scripts/rmse_estimation.py b/examples/scripts/rmse_estimation.py index cb857baf0..71b378c1f 100644 --- a/examples/scripts/rmse_estimation.py +++ b/examples/scripts/rmse_estimation.py @@ -19,7 +19,7 @@ pybop.Parameter( "Negative electrode active material volume fraction", prior=pybop.Gaussian(0.75, 0.05), - bounds=[0.65, 0.85], + bounds=[0.73, 0.77], ), pybop.Parameter( "Positive electrode active material volume fraction", diff --git a/pybop/models/BaseModel.py b/pybop/models/BaseModel.py index 313f5b71b..21e48ebe3 100644 --- a/pybop/models/BaseModel.py +++ b/pybop/models/BaseModel.py @@ -1,7 +1,7 @@ import pybamm -class BaseModel(): +class BaseModel: """ Base class for PyBOP models """ diff --git a/pybop/optimisation.py b/pybop/optimisation.py index d63fbec68..a367d9fdb 100644 --- a/pybop/optimisation.py +++ b/pybop/optimisation.py @@ -39,9 +39,13 @@ def __init__( if x0 is None: self.x0 = np.zeros(len(self.fit_parameters)) for i, j in enumerate(self.fit_parameters): - self.x0[i] = self.fit_parameters[j].prior.rvs(1)[ - 0 - ] # Updt to capture dimensions per parameter + sample = self.fit_parameters[j].prior.rvs(1)[0] + if sample < self.fit_parameters[j].bounds[0]: + self.x0[i] = self.fit_parameters[j].bounds[0] + elif sample > self.fit_parameters[j].bounds[1]: + self.x0[i] = self.fit_parameters[j].bounds[1] + else: + self.x0[i] = sample # Updt to capture dimensions per parameter # Align initial guess with sample from prior for i, j in enumerate(self.fit_parameters): diff --git a/tests/unit/test_examples.py b/tests/unit/test_examples.py index 60d1a5fe9..807a577e3 100644 --- a/tests/unit/test_examples.py +++ b/tests/unit/test_examples.py @@ -17,4 +17,4 @@ def test_example_scripts(self): ) for example in os.listdir(path_to_example_scripts): if example.endswith(".py"): - runpy.run_path(os.path.join(path_to_example_scripts, example)) \ No newline at end of file + runpy.run_path(os.path.join(path_to_example_scripts, example)) diff --git a/tests/unit/test_models.py b/tests/unit/test_models.py index 839c832d3..9c746f992 100644 --- a/tests/unit/test_models.py +++ b/tests/unit/test_models.py @@ -31,4 +31,3 @@ def test_n_parameters(self): model = pybop.BaseModel() n = model.n_outputs() assert isinstance(n, int) - diff --git a/tests/unit/test_parameterisations.py b/tests/unit/test_parameterisations.py index b542b0c96..942347d6c 100644 --- a/tests/unit/test_parameterisations.py +++ b/tests/unit/test_parameterisations.py @@ -48,7 +48,7 @@ def test_spm(self): signal="Voltage [V]", method="nlopt" ) - # Assertions (for testing purposes only) + # Assertions np.testing.assert_allclose(last_optim, 0, atol=1e-2) np.testing.assert_allclose(results, x0, atol=1e-1) @@ -91,9 +91,9 @@ def test_spme(self): signal="Voltage [V]", method="nlopt" ) - # Assertions (for testing purposes only) + # Assertions np.testing.assert_allclose(last_optim, 0, atol=1e-2) - np.testing.assert_allclose(results, x0, rtol=1e-1) + np.testing.assert_allclose(results, x0, atol=1e-1) def getdata(self, model, x0): model.parameter_set = model.pybamm_model.default_parameter_values @@ -117,5 +117,3 @@ def getdata(self, model, x0): ) sim = model.predict(experiment=experiment) return sim - - From ab4ab1db5fd8342caa74d6ed8ea8b5b64863fcd5 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 26 Oct 2023 11:30:35 +0100 Subject: [PATCH 125/210] Add tests for optimisation class, prior bound sampling --- tests/unit/test_optimisation.py | 34 +++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 tests/unit/test_optimisation.py diff --git a/tests/unit/test_optimisation.py b/tests/unit/test_optimisation.py new file mode 100644 index 000000000..6d3c9d0ef --- /dev/null +++ b/tests/unit/test_optimisation.py @@ -0,0 +1,34 @@ +import pybop +import numpy as np +import pytest + + +class TestOptimisation: + """ + A class to test the optimisation class. + """ + + @pytest.mark.unit + def test_prior_sampling(self): + # Tests prior sampling + model = pybop.lithium_ion.SPM() + + observations = [ + pybop.Observed("Time [s]", np.linspace(0, 3600, 100)), + pybop.Observed("Current function [A]", np.zeros(100)), + pybop.Observed("Terminal voltage [V]", np.ones(100)), + ] + + param = [ + pybop.Parameter( + "Negative electrode active material volume fraction", + prior=pybop.Gaussian(0.75, 0.05), + bounds=[0.73, 0.77], + ) + ] + + for i in range(10): + opt = pybop.Optimisation( + model, observations=observations, fit_parameters=param + ) + assert opt.x0 <= 0.77 and opt.x0 >= 0.73 From 426baf8c7dcdd7c5c5ae31a81439d263960706a5 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 26 Oct 2023 17:23:08 +0100 Subject: [PATCH 126/210] Fix model parameterisation, parameterize tests & add test for incorrect parameter_set --- examples/scripts/mle.py | 1 + examples/scripts/rmse_estimation.py | 10 +-- pybop/models/BaseModel.py | 23 ++++--- pybop/models/lithium_ion/base_echem.py | 12 ++-- tests/unit/test_examples.py | 2 +- tests/unit/test_models.py | 1 - tests/unit/test_parameterisations.py | 84 ++++++++++++++++++++------ 7 files changed, 95 insertions(+), 38 deletions(-) diff --git a/examples/scripts/mle.py b/examples/scripts/mle.py index 1385a8ccd..8ccdff464 100644 --- a/examples/scripts/mle.py +++ b/examples/scripts/mle.py @@ -37,6 +37,7 @@ op = pints.OptimisationController( log_likelihood, x0, boundaries=boundaries, method=pints.CMAES ) +op.set_max_unchanged_iterations(20) # default 200 x1, f1 = op.run() print("Estimated parameters:") print(x1) diff --git a/examples/scripts/rmse_estimation.py b/examples/scripts/rmse_estimation.py index cb857baf0..5ddddf33a 100644 --- a/examples/scripts/rmse_estimation.py +++ b/examples/scripts/rmse_estimation.py @@ -11,25 +11,25 @@ ] # Define model -# parameter_set = pybop.ParameterSet("pybamm", "Chen2020") -model = pybop.models.lithium_ion.SPM() +parameter_set = pybop.ParameterSet("pybamm", "Chen2020") +model = pybop.models.lithium_ion.SPM(parameter_set=parameter_set) # Fitting parameters params = [ pybop.Parameter( "Negative electrode active material volume fraction", prior=pybop.Gaussian(0.75, 0.05), - bounds=[0.65, 0.85], + bounds=[0.6, 0.9], ), pybop.Parameter( "Positive electrode active material volume fraction", prior=pybop.Gaussian(0.65, 0.05), - bounds=[0.55, 0.75], + bounds=[0.5, 0.8], ), ] parameterisation = pybop.Optimisation( - model, observations=observations, fit_parameters=params + model, init_soc=0.97, observations=observations, fit_parameters=params ) # get RMSE estimate using NLOpt diff --git a/pybop/models/BaseModel.py b/pybop/models/BaseModel.py index 313f5b71b..ccc2f5d9b 100644 --- a/pybop/models/BaseModel.py +++ b/pybop/models/BaseModel.py @@ -1,7 +1,7 @@ import pybamm -class BaseModel(): +class BaseModel: """ Base class for PyBOP models """ @@ -59,7 +59,7 @@ def set_init_soc(self, init_soc): self.op_conds_to_built_solvers = None param = self.pybamm_model.param - self.parameter_set = ( + self._parameter_set = ( self._unprocessed_parameter_set.set_initial_stoichiometries( init_soc, param=param, inplace=False ) @@ -77,10 +77,10 @@ def set_params(self): if self.fit_parameters is not None: # set input parameters in parameter set from fitting parameters for i in self.fit_parameters.keys(): - self.parameter_set[i] = "[input]" + self._parameter_set[i] = "[input]" if self.observations is not None and self.fit_parameters is not None: - self.parameter_set["Current function [A]"] = pybamm.Interpolant( + self._parameter_set["Current function [A]"] = pybamm.Interpolant( self.observations["Time [s]"].data, self.observations["Current function [A]"].data, pybamm.t, @@ -110,11 +110,18 @@ def simulate(self, inputs, t_eval): self.built_model, inputs=inputs_dict, t_eval=t_eval )["Terminal voltage [V]"].data - def predict(self, inputs=None, t_eval=None, parameter_set=None, experiment=None): + def predict( + self, + inputs=None, + t_eval=None, + parameter_set=None, + experiment=None, + init_soc=None, + ): """ Create a PyBaMM simulation object, solve it, and return a solution object. """ - parameter_set = parameter_set or self.parameter_set + parameter_set = parameter_set or self._parameter_set if inputs is not None: parameter_set.update(inputs) if self._unprocessed_model is not None: @@ -122,13 +129,13 @@ def predict(self, inputs=None, t_eval=None, parameter_set=None, experiment=None) return pybamm.Simulation( self._unprocessed_model, parameter_values=parameter_set, - ).solve(t_eval=t_eval) + ).solve(t_eval=t_eval, initial_soc=init_soc) else: return pybamm.Simulation( self._unprocessed_model, experiment=experiment, parameter_values=parameter_set, - ).solve() + ).solve(initial_soc=init_soc) else: raise ValueError("This sim method currently only supports PyBaMM models") diff --git a/pybop/models/lithium_ion/base_echem.py b/pybop/models/lithium_ion/base_echem.py index 542d6a399..57ab718a8 100644 --- a/pybop/models/lithium_ion/base_echem.py +++ b/pybop/models/lithium_ion/base_echem.py @@ -24,8 +24,10 @@ def __init__( self.name = name self.default_parameter_values = self.pybamm_model.default_parameter_values - self.parameter_set = parameter_set or self.pybamm_model.default_parameter_values - self._unprocessed_parameter_set = self.parameter_set + self._parameter_set = ( + parameter_set or self.pybamm_model.default_parameter_values + ) + self._unprocessed_parameter_set = self._parameter_set self.geometry = geometry or self.pybamm_model.default_geometry self.submesh_types = submesh_types or self.pybamm_model.default_submesh_types @@ -64,8 +66,10 @@ def __init__( self.name = name self.default_parameter_values = self.pybamm_model.default_parameter_values - self.parameter_set = parameter_set or self.pybamm_model.default_parameter_values - self._unprocessed_parameter_set = self.parameter_set + self._parameter_set = ( + parameter_set or self.pybamm_model.default_parameter_values + ) + self._unprocessed_parameter_set = self._parameter_set self.geometry = geometry or self.pybamm_model.default_geometry self.submesh_types = submesh_types or self.pybamm_model.default_submesh_types diff --git a/tests/unit/test_examples.py b/tests/unit/test_examples.py index 60d1a5fe9..807a577e3 100644 --- a/tests/unit/test_examples.py +++ b/tests/unit/test_examples.py @@ -17,4 +17,4 @@ def test_example_scripts(self): ) for example in os.listdir(path_to_example_scripts): if example.endswith(".py"): - runpy.run_path(os.path.join(path_to_example_scripts, example)) \ No newline at end of file + runpy.run_path(os.path.join(path_to_example_scripts, example)) diff --git a/tests/unit/test_models.py b/tests/unit/test_models.py index 839c832d3..9c746f992 100644 --- a/tests/unit/test_models.py +++ b/tests/unit/test_models.py @@ -31,4 +31,3 @@ def test_n_parameters(self): model = pybop.BaseModel() n = model.n_outputs() assert isinstance(n, int) - diff --git a/tests/unit/test_parameterisations.py b/tests/unit/test_parameterisations.py index b542b0c96..11e1daad1 100644 --- a/tests/unit/test_parameterisations.py +++ b/tests/unit/test_parameterisations.py @@ -9,15 +9,16 @@ class TestModelParameterisation: A class to test the model parameterisation methods. """ + @pytest.mark.parametrize("init_soc", [0.3, 0.5, 0.8]) @pytest.mark.unit - def test_spm(self): + def test_spm(self, init_soc): # Define model - model = pybop.lithium_ion.SPM() - model.parameter_set = model.pybamm_model.default_parameter_values + parameter_set = pybop.ParameterSet("pybamm", "Chen2020") + model = pybop.lithium_ion.SPM(parameter_set=parameter_set) # Form observations x0 = np.array([0.52, 0.63]) - solution = self.getdata(model, x0) + solution = self.getdata(model, x0, init_soc) observations = [ pybop.Observed("Time [s]", solution["Time [s]"].data), @@ -40,7 +41,7 @@ def test_spm(self): ] parameterisation = pybop.Optimisation( - model, observations=observations, fit_parameters=params + model, observations=observations, fit_parameters=params, init_soc=init_soc ) # get RMSE estimate using NLOpt @@ -50,17 +51,18 @@ def test_spm(self): # Assertions (for testing purposes only) np.testing.assert_allclose(last_optim, 0, atol=1e-2) - np.testing.assert_allclose(results, x0, atol=1e-1) + np.testing.assert_allclose(results, x0, atol=5e-2) + @pytest.mark.parametrize("init_soc", [0.3, 0.5, 0.8]) @pytest.mark.unit - def test_spme(self): + def test_spme(self, init_soc): # Define model - model = pybop.lithium_ion.SPMe() - model.parameter_set = model.pybamm_model.default_parameter_values + parameter_set = pybop.ParameterSet("pybamm", "Chen2020") + model = pybop.lithium_ion.SPMe(parameter_set=parameter_set) # Form observations x0 = np.array([0.52, 0.63]) - solution = self.getdata(model, x0) + solution = self.getdata(model, x0, init_soc) observations = [ pybop.Observed("Time [s]", solution["Time [s]"].data), @@ -83,7 +85,7 @@ def test_spme(self): ] parameterisation = pybop.Optimisation( - model, observations=observations, fit_parameters=params + model, observations=observations, fit_parameters=params, init_soc=init_soc ) # get RMSE estimate using NLOpt @@ -93,11 +95,57 @@ def test_spme(self): # Assertions (for testing purposes only) np.testing.assert_allclose(last_optim, 0, atol=1e-2) - np.testing.assert_allclose(results, x0, rtol=1e-1) + np.testing.assert_allclose(results, x0, rtol=5e-2) - def getdata(self, model, x0): - model.parameter_set = model.pybamm_model.default_parameter_values + @pytest.mark.parametrize("init_soc", [0.3, 0.5, 0.8]) + @pytest.mark.unit + def test_model_misparameterisation(self, init_soc): + # Define model + parameter_set = pybop.ParameterSet("pybamm", "Chen2020") + model = pybop.lithium_ion.SPM(parameter_set=parameter_set) + + second_parameter_set = pybop.ParameterSet("pybamm", "Ecker2015") + second_model = pybop.lithium_ion.SPM(parameter_set=second_parameter_set) + + # Form observations + x0 = np.array([0.52, 0.63]) + solution = self.getdata(second_model, x0, init_soc) + + observations = [ + pybop.Observed("Time [s]", solution["Time [s]"].data), + pybop.Observed("Current function [A]", solution["Current [A]"].data), + pybop.Observed("Voltage [V]", solution["Terminal voltage [V]"].data), + ] + + # Fitting parameters + params = [ + pybop.Parameter( + "Negative electrode active material volume fraction", + prior=pybop.Gaussian(0.5, 0.02), + bounds=[0.375, 0.625], + ), + pybop.Parameter( + "Positive electrode active material volume fraction", + prior=pybop.Gaussian(0.65, 0.02), + bounds=[0.525, 0.75], + ), + ] + + parameterisation = pybop.Optimisation( + model, observations=observations, fit_parameters=params, init_soc=init_soc + ) + # get RMSE estimate using NLOpt + results, last_optim, num_evals = parameterisation.rmse( + signal="Voltage [V]", method="nlopt" + ) + + # Assertions (for testing purposes only) + with np.testing.assert_raises(AssertionError): + np.testing.assert_allclose(last_optim, 0, atol=1e-2) + np.testing.assert_allclose(results, x0, rtol=5e-1) + + def getdata(self, model, x0, init_soc): model.parameter_set.update( { "Negative electrode active material volume fraction": x0[0], @@ -107,15 +155,13 @@ def getdata(self, model, x0): experiment = pybamm.Experiment( [ ( - "Discharge at 2C for 5 minutes (1 second period)", + "Discharge at 1C for 3 minutes (1 second period)", "Rest for 2 minutes (1 second period)", - "Charge at 1C for 5 minutes (1 second period)", + "Charge at 1C for 3 minutes (1 second period)", "Rest for 2 minutes (1 second period)", ), ] * 2 ) - sim = model.predict(experiment=experiment) + sim = model.predict(init_soc=init_soc, experiment=experiment) return sim - - From 344e85fa7ad906b67794ac2a4e99b8d1a9551464 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 26 Oct 2023 17:26:27 +0100 Subject: [PATCH 127/210] Remove commented blacken repo, black format --- .pre-commit-config.yaml | 6 ------ pybop/identification/observations.py | 1 + pybop/identification/parameter_set.py | 3 ++- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d4a98ef4e..9791b659e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -16,12 +16,6 @@ repos: additional_dependencies: [ruff==0.0.284] args: ["--fix","--ignore=E501,E402"] - # - repo: https://github.com/adamchainz/blacken-docs - # rev: "1.16.0" - # hooks: - # - id: blacken-docs - # additional_dependencies: [black==22.12.0] - - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.4.0 hooks: diff --git a/pybop/identification/observations.py b/pybop/identification/observations.py index bd824af17..417a9b876 100644 --- a/pybop/identification/observations.py +++ b/pybop/identification/observations.py @@ -1,5 +1,6 @@ import pybamm + class Observed: """ Class for experimental Observations. diff --git a/pybop/identification/parameter_set.py b/pybop/identification/parameter_set.py index d5fc930e8..1e1dc23ec 100644 --- a/pybop/identification/parameter_set.py +++ b/pybop/identification/parameter_set.py @@ -1,5 +1,6 @@ import pybamm + class ParameterSet: """ Class for creating parameter sets in pybop. @@ -7,6 +8,6 @@ class ParameterSet: def __new__(cls, method, name): if method.casefold() == "pybamm": - return pybamm.ParameterValues(name).copy() + return pybamm.ParameterValues(name).copy() else: raise ValueError("Only PybaMM parameter sets are currently implemented") From 3b1571e7fdcadba087a2a6157ee426782c191d66 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 27 Oct 2023 16:14:32 +0100 Subject: [PATCH 128/210] Add gradient support to BaseModel class, Add Pints gradient descent example --- examples/scripts/grad_descent.py | 58 ++++++++++++++++++++++++++++++++ examples/scripts/mle.py | 4 +-- pybop/models/BaseModel.py | 39 ++++++++++++++++++++- tests/unit/test_examples.py | 2 +- tests/unit/test_models.py | 1 - 5 files changed, 99 insertions(+), 5 deletions(-) create mode 100644 examples/scripts/grad_descent.py diff --git a/examples/scripts/grad_descent.py b/examples/scripts/grad_descent.py new file mode 100644 index 000000000..5c83ade0c --- /dev/null +++ b/examples/scripts/grad_descent.py @@ -0,0 +1,58 @@ +import pybop +import pints +import numpy as np +import matplotlib.pyplot as plt + +model = pybop.lithium_ion.SPMe() +model.parameter_set["Current function [A]"] = 1 + +inputs = { + "Negative electrode active material volume fraction": 0.587, + "Positive electrode active material volume fraction": 0.44, +} +t_eval = np.arange(0, 900, 2) +model.build(fit_parameters=inputs) + +values = model.predict(inputs=inputs, t_eval=t_eval) +voltage = values["Terminal voltage [V]"].data +time = values["Time [s]"].data + +sigma = 0.0 +CorruptValues = voltage + np.random.normal(0, sigma, len(voltage)) + +# Show the generated data +plt.figure() +plt.xlabel("Time") +plt.ylabel("Values") +plt.plot(time, CorruptValues) +plt.plot(time, voltage) +plt.show() + + +problem = pints.SingleOutputProblem(model, time, CorruptValues) + +# Select a score function +score = pints.SumOfSquaresError(problem) + +x0 = np.array([0.5, 0.5]) +opt = pints.OptimisationController(score, x0, method=pints.GradientDescent) + +opt.optimiser().set_learning_rate(0.025) +opt.set_max_unchanged_iterations(250) +opt.set_max_iterations(500) + + +x1, f1 = opt.run() +print("Estimated parameters:") +print(x1) + +# Show the generated data +simulated_values = problem.evaluate(x1[:2]) + +plt.figure() +plt.xlabel("Time") +plt.ylabel("Values") +plt.plot(time, CorruptValues) +plt.fill_between(time, simulated_values - sigma, simulated_values + sigma, alpha=0.2) +plt.plot(time, simulated_values) +plt.show() diff --git a/examples/scripts/mle.py b/examples/scripts/mle.py index 1385a8ccd..730263863 100644 --- a/examples/scripts/mle.py +++ b/examples/scripts/mle.py @@ -7,8 +7,8 @@ model.parameter_set["Current function [A]"] = 2 inputs = { - "Negative electrode active material volume fraction": 0.5, - "Positive electrode active material volume fraction": 0.6, + "Negative electrode active material volume fraction": 0.587, + "Positive electrode active material volume fraction": 0.44, } t_eval = np.arange(0, 900, 2) model.build(fit_parameters=inputs) diff --git a/pybop/models/BaseModel.py b/pybop/models/BaseModel.py index 313f5b71b..380ef60b5 100644 --- a/pybop/models/BaseModel.py +++ b/pybop/models/BaseModel.py @@ -1,7 +1,8 @@ import pybamm +import numpy as np -class BaseModel(): +class BaseModel: """ Base class for PyBOP models """ @@ -26,6 +27,7 @@ def build( """ self.fit_parameters = fit_parameters self.observations = observations + self.fit_keys = list(self.fit_parameters.keys()) if init_soc is not None: self.set_init_soc(init_soc) @@ -110,6 +112,41 @@ def simulate(self, inputs, t_eval): self.built_model, inputs=inputs_dict, t_eval=t_eval )["Terminal voltage [V]"].data + def simulateS1(self, inputs, t_eval): + """ + Run the forward model and return the function evaulation and it's gradient + aligning with Pints' ForwardModel simulateS1 method. + """ + if self._built_model is None: + raise ValueError("Model must be built before calling simulate") + else: + if not isinstance(inputs, dict): + inputs_dict = { + key: inputs[i] for i, key in enumerate(self.fit_parameters) + } + sol = self.solver.solve( + self.built_model, + inputs=inputs_dict, + t_eval=t_eval, + calculate_sensitivities=True, + ) + + # print(inputs_dict) + out = np.array( + [ + sol["Terminal voltage [V]"] + .sensitivities[self.fit_keys[0]] + .toarray(), + sol["Terminal voltage [V]"] + .sensitivities[self.fit_keys[0]] + .toarray(), + ] + ) + + return sol["Terminal voltage [V]"].data, out.reshape( + (out.shape[1], out.shape[0]) + ) + def predict(self, inputs=None, t_eval=None, parameter_set=None, experiment=None): """ Create a PyBaMM simulation object, solve it, and return a solution object. diff --git a/tests/unit/test_examples.py b/tests/unit/test_examples.py index 60d1a5fe9..807a577e3 100644 --- a/tests/unit/test_examples.py +++ b/tests/unit/test_examples.py @@ -17,4 +17,4 @@ def test_example_scripts(self): ) for example in os.listdir(path_to_example_scripts): if example.endswith(".py"): - runpy.run_path(os.path.join(path_to_example_scripts, example)) \ No newline at end of file + runpy.run_path(os.path.join(path_to_example_scripts, example)) diff --git a/tests/unit/test_models.py b/tests/unit/test_models.py index 839c832d3..9c746f992 100644 --- a/tests/unit/test_models.py +++ b/tests/unit/test_models.py @@ -31,4 +31,3 @@ def test_n_parameters(self): model = pybop.BaseModel() n = model.n_outputs() assert isinstance(n, int) - From 4e06bccc03e2a057a149dabdad9b912b0b18f9f7 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 27 Oct 2023 16:39:46 +0100 Subject: [PATCH 129/210] revert mle parameterisation --- examples/scripts/mle.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/scripts/mle.py b/examples/scripts/mle.py index 730263863..1385a8ccd 100644 --- a/examples/scripts/mle.py +++ b/examples/scripts/mle.py @@ -7,8 +7,8 @@ model.parameter_set["Current function [A]"] = 2 inputs = { - "Negative electrode active material volume fraction": 0.587, - "Positive electrode active material volume fraction": 0.44, + "Negative electrode active material volume fraction": 0.5, + "Positive electrode active material volume fraction": 0.6, } t_eval = np.arange(0, 900, 2) model.build(fit_parameters=inputs) From c8404672e6a1b34c9611b9e233a5a2ebcc927c0c Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 27 Oct 2023 20:09:40 +0100 Subject: [PATCH 130/210] Bugfix for BaseModel, reduce grad_descent runtime --- examples/scripts/grad_descent.py | 4 ++-- pybop/models/BaseModel.py | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/examples/scripts/grad_descent.py b/examples/scripts/grad_descent.py index 5c83ade0c..e8d866745 100644 --- a/examples/scripts/grad_descent.py +++ b/examples/scripts/grad_descent.py @@ -38,8 +38,8 @@ opt = pints.OptimisationController(score, x0, method=pints.GradientDescent) opt.optimiser().set_learning_rate(0.025) -opt.set_max_unchanged_iterations(250) -opt.set_max_iterations(500) +opt.set_max_unchanged_iterations(50) +opt.set_max_iterations(100) x1, f1 = opt.run() diff --git a/pybop/models/BaseModel.py b/pybop/models/BaseModel.py index 380ef60b5..a61efcb5b 100644 --- a/pybop/models/BaseModel.py +++ b/pybop/models/BaseModel.py @@ -27,7 +27,8 @@ def build( """ self.fit_parameters = fit_parameters self.observations = observations - self.fit_keys = list(self.fit_parameters.keys()) + if self.fit_parameters is not None: + self.fit_keys = list(self.fit_parameters.keys()) if init_soc is not None: self.set_init_soc(init_soc) From 4df240428d8dbac2bb8dd852fb6296905b7163d5 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Mon, 30 Oct 2023 17:20:01 +0000 Subject: [PATCH 131/210] Updt senstitivity inferface in simulateS1(), aligned parameterisation examples --- examples/scripts/grad_descent.py | 15 ++++++----- examples/scripts/mle.py | 23 +++++++++-------- pybop/models/BaseModel.py | 43 ++++++++++++++++---------------- 3 files changed, 42 insertions(+), 39 deletions(-) diff --git a/examples/scripts/grad_descent.py b/examples/scripts/grad_descent.py index e8d866745..115b23258 100644 --- a/examples/scripts/grad_descent.py +++ b/examples/scripts/grad_descent.py @@ -4,20 +4,20 @@ import matplotlib.pyplot as plt model = pybop.lithium_ion.SPMe() -model.parameter_set["Current function [A]"] = 1 inputs = { - "Negative electrode active material volume fraction": 0.587, + "Negative electrode active material volume fraction": 0.58, "Positive electrode active material volume fraction": 0.44, + "Current function [A]": 1, } -t_eval = np.arange(0, 900, 2) +t_eval = np.arange(0, 1200, 2) model.build(fit_parameters=inputs) values = model.predict(inputs=inputs, t_eval=t_eval) voltage = values["Terminal voltage [V]"].data time = values["Time [s]"].data -sigma = 0.0 +sigma = 0.001 CorruptValues = voltage + np.random.normal(0, sigma, len(voltage)) # Show the generated data @@ -34,20 +34,19 @@ # Select a score function score = pints.SumOfSquaresError(problem) -x0 = np.array([0.5, 0.5]) +x0 = np.array([0.48, 0.55, 1.4]) opt = pints.OptimisationController(score, x0, method=pints.GradientDescent) opt.optimiser().set_learning_rate(0.025) opt.set_max_unchanged_iterations(50) -opt.set_max_iterations(100) - +opt.set_max_iterations(200) x1, f1 = opt.run() print("Estimated parameters:") print(x1) # Show the generated data -simulated_values = problem.evaluate(x1[:2]) +simulated_values = problem.evaluate(x1[:3]) plt.figure() plt.xlabel("Time") diff --git a/examples/scripts/mle.py b/examples/scripts/mle.py index 1385a8ccd..e20ccf55b 100644 --- a/examples/scripts/mle.py +++ b/examples/scripts/mle.py @@ -4,20 +4,20 @@ import matplotlib.pyplot as plt model = pybop.lithium_ion.SPMe() -model.parameter_set["Current function [A]"] = 2 inputs = { - "Negative electrode active material volume fraction": 0.5, - "Positive electrode active material volume fraction": 0.6, + "Negative electrode active material volume fraction": 0.58, + "Positive electrode active material volume fraction": 0.44, + "Current function [A]": 1, } -t_eval = np.arange(0, 900, 2) +t_eval = np.arange(0, 1200, 2) model.build(fit_parameters=inputs) values = model.predict(inputs=inputs, t_eval=t_eval) voltage = values["Terminal voltage [V]"].data time = values["Time [s]"].data -sigma = 0.01 +sigma = 0.001 CorruptValues = voltage + np.random.normal(0, sigma, len(voltage)) # Show the generated data @@ -31,18 +31,21 @@ problem = pints.SingleOutputProblem(model, time, CorruptValues) log_likelihood = pints.GaussianLogLikelihood(problem) -boundaries = pints.RectangularBoundaries([0.4, 0.4, 1e-5], [0.6, 0.6, 1e-1]) +boundaries = pints.RectangularBoundaries([0.4, 0.4, 0.7, 1e-5], [0.6, 0.6, 2.1, 1e-1]) -x0 = np.array([0.52, 0.47, 1e-3]) -op = pints.OptimisationController( +x0 = np.array([0.48, 0.55, 1.4, 1e-3]) +opt = pints.OptimisationController( log_likelihood, x0, boundaries=boundaries, method=pints.CMAES ) -x1, f1 = op.run() +opt.set_max_unchanged_iterations(50) +opt.set_max_iterations(200) + +x1, f1 = opt.run() print("Estimated parameters:") print(x1) # Show the generated data -simulated_values = problem.evaluate(x1[:2]) +simulated_values = problem.evaluate(x1[:3]) plt.figure() plt.xlabel("Time") diff --git a/pybop/models/BaseModel.py b/pybop/models/BaseModel.py index a61efcb5b..184acc2f6 100644 --- a/pybop/models/BaseModel.py +++ b/pybop/models/BaseModel.py @@ -125,27 +125,28 @@ def simulateS1(self, inputs, t_eval): inputs_dict = { key: inputs[i] for i, key in enumerate(self.fit_parameters) } - sol = self.solver.solve( - self.built_model, - inputs=inputs_dict, - t_eval=t_eval, - calculate_sensitivities=True, - ) - - # print(inputs_dict) - out = np.array( - [ - sol["Terminal voltage [V]"] - .sensitivities[self.fit_keys[0]] - .toarray(), - sol["Terminal voltage [V]"] - .sensitivities[self.fit_keys[0]] - .toarray(), - ] - ) - - return sol["Terminal voltage [V]"].data, out.reshape( - (out.shape[1], out.shape[0]) + sol = self.solver.solve( + self.built_model, + inputs=inputs_dict, + t_eval=t_eval, + calculate_sensitivities=True, + ) + else: + sol = self.solver.solve( + self.built_model, + inputs=inputs, + t_eval=t_eval, + calculate_sensitivities=True, + ) + + return ( + sol["Terminal voltage [V]"].data, + np.array( + [ + sol["Terminal voltage [V]"].sensitivities[key].toarray() + for key in self.fit_keys + ] + ).T, ) def predict(self, inputs=None, t_eval=None, parameter_set=None, experiment=None): From 0dfad2f32e4ebe85894ad0464f40a2d3c36bb1c5 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Mon, 30 Oct 2023 18:00:59 +0000 Subject: [PATCH 132/210] ruff fixes, black formatting --- .github/workflows/scheduled_tests.yaml | 4 ++-- .pre-commit-config.yaml | 2 +- examples/scripts/rmse_estimation.py | 1 - pybop/optimisation.py | 13 +++++++------ tests/unit/test_examples.py | 1 - tests/unit/test_models.py | 3 --- tests/unit/test_parameter_sets.py | 2 -- tests/unit/test_priors.py | 2 -- 8 files changed, 10 insertions(+), 18 deletions(-) diff --git a/.github/workflows/scheduled_tests.yaml b/.github/workflows/scheduled_tests.yaml index 5e1e66887..cb730f66e 100644 --- a/.github/workflows/scheduled_tests.yaml +++ b/.github/workflows/scheduled_tests.yaml @@ -30,7 +30,7 @@ jobs: - name: Unit tests with nox run: | python -m nox -s unit - + #M-series Mac Mini build-apple-mseries: runs-on: [self-hosted, macOS, ARM64] @@ -64,4 +64,4 @@ jobs: run: | eval "$(pyenv init -)" pyenv activate pybop-${{ matrix.python-version }} - pyenv uninstall -f $( python --version ) \ No newline at end of file + pyenv uninstall -f $( python --version ) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9791b659e..784e58cca 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -7,7 +7,7 @@ repos: rev: "v0.0.292" hooks: - id: ruff - args: [--fix, --ignore=E741, --exclude=__init__.py] + args: ["--fix", "--ignore=E501,E402,E741", "--exclude=__init__.py"] - repo: https://github.com/nbQA-dev/nbQA rev: 1.7.0 diff --git a/examples/scripts/rmse_estimation.py b/examples/scripts/rmse_estimation.py index cb857baf0..1e8ea68b3 100644 --- a/examples/scripts/rmse_estimation.py +++ b/examples/scripts/rmse_estimation.py @@ -1,6 +1,5 @@ import pybop import pandas as pd -import numpy as np # Form observations Measurements = pd.read_csv("examples/scripts/Chen_example.csv", comment="#").to_numpy() diff --git a/pybop/optimisation.py b/pybop/optimisation.py index d63fbec68..beebbec2c 100644 --- a/pybop/optimisation.py +++ b/pybop/optimisation.py @@ -77,15 +77,16 @@ def step(self, signal, x, grad): "Measurement and simulated data length mismatch, potentially due to reaching a voltage cut-off" ) - try: - res = np.sqrt(np.mean((self.observations["Voltage [V]"].data - y_hat) ** 2)) - except: - print("Error in RMSE calculation") - if self.verbose: print(self.fit_dict) - return res + try: + return np.sqrt( + np.mean((self.observations["Voltage [V]"].data - y_hat) ** 2) + ) + except Exception as e: + print(f"Error in RMSE calculation: {e}") + return None def map(self, x0): """ diff --git a/tests/unit/test_examples.py b/tests/unit/test_examples.py index 807a577e3..6e8fc09e0 100644 --- a/tests/unit/test_examples.py +++ b/tests/unit/test_examples.py @@ -1,5 +1,4 @@ import pybop -import numpy as np import pytest import runpy import os diff --git a/tests/unit/test_models.py b/tests/unit/test_models.py index 9c746f992..09c47d730 100644 --- a/tests/unit/test_models.py +++ b/tests/unit/test_models.py @@ -1,8 +1,5 @@ import pybop -import numpy as np import pytest -import runpy -import os class TestModels: diff --git a/tests/unit/test_parameter_sets.py b/tests/unit/test_parameter_sets.py index fc58eac6b..9cc478525 100644 --- a/tests/unit/test_parameter_sets.py +++ b/tests/unit/test_parameter_sets.py @@ -1,8 +1,6 @@ import pybop import numpy as np import pytest -import runpy -import os class TestParameterSets: diff --git a/tests/unit/test_priors.py b/tests/unit/test_priors.py index d7ba2d748..cfb544cdf 100644 --- a/tests/unit/test_priors.py +++ b/tests/unit/test_priors.py @@ -1,8 +1,6 @@ import pybop import numpy as np import pytest -import runpy -import os class TestPriors: From ad31282b877ac01677745b2493f885eacb8f5527 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Tue, 31 Oct 2023 10:07:05 +0000 Subject: [PATCH 133/210] Add citation.cff --- CITATION.cff | 17 +++++++++++++++++ pybop/models/BaseModel.py | 2 +- tests/unit/test_examples.py | 3 +-- tests/unit/test_models.py | 4 ---- 4 files changed, 19 insertions(+), 7 deletions(-) create mode 100644 CITATION.cff diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 000000000..69dc095b4 --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,17 @@ +cff-version: 1.2.0 +title: PyBOP +message: >- + If you use this software, please cite it using the + metadata from this file. +type: software +authors: + - given-names: Brady + family-names: Planden + - given-names: Nicola + family-names: Courtier + - given-names: David + family-names: Howey +identifiers: + - type: doi + value: 10.3452/zenodo.4321 +repository-code: 'https://www.github.com/pybop-team/pybop' diff --git a/pybop/models/BaseModel.py b/pybop/models/BaseModel.py index 313f5b71b..21e48ebe3 100644 --- a/pybop/models/BaseModel.py +++ b/pybop/models/BaseModel.py @@ -1,7 +1,7 @@ import pybamm -class BaseModel(): +class BaseModel: """ Base class for PyBOP models """ diff --git a/tests/unit/test_examples.py b/tests/unit/test_examples.py index 60d1a5fe9..6e8fc09e0 100644 --- a/tests/unit/test_examples.py +++ b/tests/unit/test_examples.py @@ -1,5 +1,4 @@ import pybop -import numpy as np import pytest import runpy import os @@ -17,4 +16,4 @@ def test_example_scripts(self): ) for example in os.listdir(path_to_example_scripts): if example.endswith(".py"): - runpy.run_path(os.path.join(path_to_example_scripts, example)) \ No newline at end of file + runpy.run_path(os.path.join(path_to_example_scripts, example)) diff --git a/tests/unit/test_models.py b/tests/unit/test_models.py index 839c832d3..09c47d730 100644 --- a/tests/unit/test_models.py +++ b/tests/unit/test_models.py @@ -1,8 +1,5 @@ import pybop -import numpy as np import pytest -import runpy -import os class TestModels: @@ -31,4 +28,3 @@ def test_n_parameters(self): model = pybop.BaseModel() n = model.n_outputs() assert isinstance(n, int) - From 4465aee5ecc962d5ecba7bbec69ad1ec60a8f6af Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Tue, 31 Oct 2023 10:13:27 +0000 Subject: [PATCH 134/210] Remove sample DOI --- CITATION.cff | 3 --- 1 file changed, 3 deletions(-) diff --git a/CITATION.cff b/CITATION.cff index 69dc095b4..de4b2302a 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -11,7 +11,4 @@ authors: family-names: Courtier - given-names: David family-names: Howey -identifiers: - - type: doi - value: 10.3452/zenodo.4321 repository-code: 'https://www.github.com/pybop-team/pybop' From c23be13b5818ea5ec3d8493aedf8cc0d0a3f92cc Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Tue, 31 Oct 2023 10:42:07 +0000 Subject: [PATCH 135/210] Updt. Title --- CITATION.cff | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CITATION.cff b/CITATION.cff index de4b2302a..e1efab891 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -1,5 +1,5 @@ cff-version: 1.2.0 -title: PyBOP +title: 'Python Battery Optimisation and Parameterisation (PyBOP)' message: >- If you use this software, please cite it using the metadata from this file. From d03c21a428437d3e246619127de71208e901b6e5 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Tue, 31 Oct 2023 11:13:43 +0000 Subject: [PATCH 136/210] refactor for readability --- pybop/optimisation.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/pybop/optimisation.py b/pybop/optimisation.py index a367d9fdb..b993be720 100644 --- a/pybop/optimisation.py +++ b/pybop/optimisation.py @@ -38,12 +38,18 @@ def __init__( # Sample from prior for x0 if x0 is None: self.x0 = np.zeros(len(self.fit_parameters)) - for i, j in enumerate(self.fit_parameters): - sample = self.fit_parameters[j].prior.rvs(1)[0] - if sample < self.fit_parameters[j].bounds[0]: - self.x0[i] = self.fit_parameters[j].bounds[0] - elif sample > self.fit_parameters[j].bounds[1]: - self.x0[i] = self.fit_parameters[j].bounds[1] + + for i, param in enumerate(self.fit_parameters): + parameter = self.fit_parameters[param] + sample = parameter.prior.rvs(1)[0] + + lower_bound = parameter.bounds[0] + upper_bound = parameter.bounds[1] + + if sample < lower_bound: + self.x0[i] = lower_bound + elif sample > upper_bound: + self.x0[i] = upper_bound else: self.x0[i] = sample # Updt to capture dimensions per parameter From 6fe2dca9fb0e5ee2f550ec79fcc9c54fb5932c6e Mon Sep 17 00:00:00 2001 From: NicolaCourtier <45851982+NicolaCourtier@users.noreply.github.com> Date: Tue, 31 Oct 2023 12:25:33 +0000 Subject: [PATCH 137/210] Consistent filenames --- examples/scripts/rmse_estimation.py | 6 +- pybop/__init__.py | 14 +-- pybop/costs/error_costs.py | 93 +++++++++++++++++++ .../{observations.py => base_dataset.py} | 2 +- pybop/models/{BaseModel.py => base_model.py} | 0 pybop/models/lithium_ion/base_echem.py | 2 +- .../{BaseOptimiser.py => base_optimiser.py} | 0 .../{NLoptOptimize.py => nlopt_optimize.py} | 2 +- .../{SciPyMinimize.py => scipy_minimize.py} | 2 +- .../{parameter.py => base_parameter.py} | 0 ...parameter_set.py => base_parameter_set.py} | 0 tests/unit/test_parameterisations.py | 18 ++-- 12 files changed, 118 insertions(+), 21 deletions(-) create mode 100644 pybop/costs/error_costs.py rename pybop/datasets/{observations.py => base_dataset.py} (96%) rename pybop/models/{BaseModel.py => base_model.py} (100%) rename pybop/optimisers/{BaseOptimiser.py => base_optimiser.py} (100%) rename pybop/optimisers/{NLoptOptimize.py => nlopt_optimize.py} (96%) rename pybop/optimisers/{SciPyMinimize.py => scipy_minimize.py} (96%) rename pybop/parameters/{parameter.py => base_parameter.py} (100%) rename pybop/parameters/{parameter_set.py => base_parameter_set.py} (100%) diff --git a/examples/scripts/rmse_estimation.py b/examples/scripts/rmse_estimation.py index cb857baf0..dd0360350 100644 --- a/examples/scripts/rmse_estimation.py +++ b/examples/scripts/rmse_estimation.py @@ -5,9 +5,9 @@ # Form observations Measurements = pd.read_csv("examples/scripts/Chen_example.csv", comment="#").to_numpy() observations = [ - pybop.Observed("Time [s]", Measurements[:, 0]), - pybop.Observed("Current function [A]", Measurements[:, 1]), - pybop.Observed("Voltage [V]", Measurements[:, 2]), + pybop.Dataset("Time [s]", Measurements[:, 0]), + pybop.Dataset("Current function [A]", Measurements[:, 1]), + pybop.Dataset("Voltage [V]", Measurements[:, 2]), ] # Define model diff --git a/pybop/__init__.py b/pybop/__init__.py index 072276283..e5fa88254 100644 --- a/pybop/__init__.py +++ b/pybop/__init__.py @@ -27,14 +27,14 @@ # Model Classes # from .models import lithium_ion -from .models.BaseModel import BaseModel +from .models.base_model import BaseModel # # Parameterisation class # -from .parameters.parameter_set import ParameterSet -from .parameters.parameter import Parameter -from .datasets.observations import Observed +from .parameters.base_parameter_set import ParameterSet +from .parameters.base_parameter import Parameter +from .datasets.base_dataset import Dataset # # Priors class @@ -45,9 +45,9 @@ # Optimisation class # from .optimisation import Optimisation -from .optimisers import BaseOptimiser -from .optimisers.NLoptOptimize import NLoptOptimize -from .optimisers.SciPyMinimize import SciPyMinimize +from .optimisers import base_optimiser +from .optimisers.nlopt_optimize import NLoptOptimize +from .optimisers.scipy_minimize import SciPyMinimize # # Remove any imported modules, so we don't expose them as part of pybop diff --git a/pybop/costs/error_costs.py b/pybop/costs/error_costs.py new file mode 100644 index 000000000..42b5c8bed --- /dev/null +++ b/pybop/costs/error_costs.py @@ -0,0 +1,93 @@ +import pybop +import numpy as np + + +class RMSE: + """ + Defines the root mean square error cost function. + """ + + def __init__(self): + self.name = "RMSE" + + def compute(self, prediction, target): + # Check compatibility + if len(prediction) != len(target): + print( + "Length of vectors:", + len(prediction), + len(target), + ) + raise ValueError( + "Measurement and simulated data length mismatch, potentially due to reaching a voltage cut-off" + ) + + print("Last Values:", prediction[-1], target[-1]) + + # Compute the cost + try: + cost = np.sqrt(np.mean((prediction - target) ** 2)) + except: + print("Error in RMSE calculation") + + return cost + + +class MLE: + """ + Defines the cost function for maximum likelihood estimation. + """ + + def __init__(self): + self.name = "MLE" + + def compute(self, prediction, target): + # Compute the cost + try: + cost = 0 # update with MLE residual + except: + print("Error in MLE calculation") + + return cost + + +class PEM: + """ + Defines the cost function for prediction error minimisation. + """ + + def __init__(self): + self.name = "PEM" + + def compute(self, prediction, target): + # Compute the cost + try: + cost = 0 # update with MLE residual + except: + print("Error in PEM calculation") + + return cost + + +class MAP: + """ + Defines the cost function for maximum a posteriori estimation. + """ + + def __init__(self): + self.name = "MAP" + + def compute(self, prediction, target): + # Compute the cost + try: + cost = 0 # update with MLE residual + except: + print("Error in MAP calculation") + + return cost + + def sample(self, n_chains): + """ + Sample from the posterior distribution. + """ + pass diff --git a/pybop/datasets/observations.py b/pybop/datasets/base_dataset.py similarity index 96% rename from pybop/datasets/observations.py rename to pybop/datasets/base_dataset.py index 417a9b876..41ee89060 100644 --- a/pybop/datasets/observations.py +++ b/pybop/datasets/base_dataset.py @@ -1,7 +1,7 @@ import pybamm -class Observed: +class Dataset: """ Class for experimental Observations. """ diff --git a/pybop/models/BaseModel.py b/pybop/models/base_model.py similarity index 100% rename from pybop/models/BaseModel.py rename to pybop/models/base_model.py diff --git a/pybop/models/lithium_ion/base_echem.py b/pybop/models/lithium_ion/base_echem.py index 542d6a399..ffa3b5775 100644 --- a/pybop/models/lithium_ion/base_echem.py +++ b/pybop/models/lithium_ion/base_echem.py @@ -1,5 +1,5 @@ import pybamm -from ..BaseModel import BaseModel +from ..base_model import BaseModel class SPM(BaseModel): diff --git a/pybop/optimisers/BaseOptimiser.py b/pybop/optimisers/base_optimiser.py similarity index 100% rename from pybop/optimisers/BaseOptimiser.py rename to pybop/optimisers/base_optimiser.py diff --git a/pybop/optimisers/NLoptOptimize.py b/pybop/optimisers/nlopt_optimize.py similarity index 96% rename from pybop/optimisers/NLoptOptimize.py rename to pybop/optimisers/nlopt_optimize.py index e1c88f696..50552898e 100644 --- a/pybop/optimisers/NLoptOptimize.py +++ b/pybop/optimisers/nlopt_optimize.py @@ -1,5 +1,5 @@ import nlopt -from .BaseOptimiser import BaseOptimiser +from .base_optimiser import BaseOptimiser class NLoptOptimize(BaseOptimiser): diff --git a/pybop/optimisers/SciPyMinimize.py b/pybop/optimisers/scipy_minimize.py similarity index 96% rename from pybop/optimisers/SciPyMinimize.py rename to pybop/optimisers/scipy_minimize.py index cd831e9b2..2c8a0e651 100644 --- a/pybop/optimisers/SciPyMinimize.py +++ b/pybop/optimisers/scipy_minimize.py @@ -1,5 +1,5 @@ from scipy.optimize import minimize -from .BaseOptimiser import BaseOptimiser +from .base_optimiser import BaseOptimiser class SciPyMinimize(BaseOptimiser): diff --git a/pybop/parameters/parameter.py b/pybop/parameters/base_parameter.py similarity index 100% rename from pybop/parameters/parameter.py rename to pybop/parameters/base_parameter.py diff --git a/pybop/parameters/parameter_set.py b/pybop/parameters/base_parameter_set.py similarity index 100% rename from pybop/parameters/parameter_set.py rename to pybop/parameters/base_parameter_set.py diff --git a/tests/unit/test_parameterisations.py b/tests/unit/test_parameterisations.py index 047e41847..d68b3debc 100644 --- a/tests/unit/test_parameterisations.py +++ b/tests/unit/test_parameterisations.py @@ -2,9 +2,10 @@ import pybamm import pytest import numpy as np +import unittest -class TestModelParameterisation: +class TestModelParameterisation(unittest.TestCase): """ A class to test the model parameterisation methods. """ @@ -20,9 +21,9 @@ def test_spm(self): solution = self.getdata(model, x0) observations = [ - pybop.Observed("Time [s]", solution["Time [s]"].data), - pybop.Observed("Current function [A]", solution["Current [A]"].data), - pybop.Observed("Voltage [V]", solution["Terminal voltage [V]"].data), + pybop.Dataset("Time [s]", solution["Time [s]"].data), + pybop.Dataset("Current function [A]", solution["Current [A]"].data), + pybop.Dataset("Voltage [V]", solution["Terminal voltage [V]"].data), ] # Fitting parameters @@ -63,9 +64,9 @@ def test_spme(self): solution = self.getdata(model, x0) observations = [ - pybop.Observed("Time [s]", solution["Time [s]"].data), - pybop.Observed("Current function [A]", solution["Current [A]"].data), - pybop.Observed("Voltage [V]", solution["Terminal voltage [V]"].data), + pybop.Dataset("Time [s]", solution["Time [s]"].data), + pybop.Dataset("Current function [A]", solution["Current [A]"].data), + pybop.Dataset("Voltage [V]", solution["Terminal voltage [V]"].data), ] # Fitting parameters @@ -149,3 +150,6 @@ def test_parameter_set(self): np.testing.assert_allclose( parameter_test["Negative electrode active material volume fraction"], 0.75 ) + +if __name__ == "__main__": + unittest.main() From 80e136b9478f583012e83d5d3b89fce6ea5c21f8 Mon Sep 17 00:00:00 2001 From: NicolaCourtier <45851982+NicolaCourtier@users.noreply.github.com> Date: Tue, 31 Oct 2023 13:19:31 +0000 Subject: [PATCH 138/210] Consistent formatting --- pybop/__init__.py | 34 ++++++++++++++++++-------- pybop/datasets/base_dataset.py | 4 +-- pybop/models/base_model.py | 2 +- pybop/models/lithium_ion/__init__.py | 1 - pybop/optimisers/base_optimiser.py | 3 +-- pybop/optimisers/nlopt_optimize.py | 2 +- pybop/optimisers/scipy_minimize.py | 2 +- pybop/parameters/base_parameter.py | 9 ++++--- pybop/parameters/base_parameter_set.py | 7 ++++-- pybop/parameters/priors.py | 2 +- 10 files changed, 42 insertions(+), 24 deletions(-) diff --git a/pybop/__init__.py b/pybop/__init__.py index e5fa88254..f06a38fdf 100644 --- a/pybop/__init__.py +++ b/pybop/__init__.py @@ -24,31 +24,45 @@ script_path = os.path.dirname(__file__) # -# Model Classes +# Cost function class # -from .models import lithium_ion -from .models.base_model import BaseModel +from .costs.error_costs import RMSE # -# Parameterisation class +# Dataset class # -from .parameters.base_parameter_set import ParameterSet -from .parameters.base_parameter import Parameter from .datasets.base_dataset import Dataset # -# Priors class +# Model classes # -from .parameters.priors import Gaussian, Uniform, Exponential +from .models.base_model import BaseModel +from .models import lithium_ion # -# Optimisation class +# Main optimisation class # from .optimisation import Optimisation -from .optimisers import base_optimiser + +# +# Optimiser class +# +from .optimisers.base_optimiser import BaseOptimiser from .optimisers.nlopt_optimize import NLoptOptimize from .optimisers.scipy_minimize import SciPyMinimize +# +# Parameter classes +# +from .parameters.base_parameter import Parameter +from .parameters.base_parameter_set import ParameterSet +from .parameters.priors import Gaussian, Uniform, Exponential + +# +# Plotting class +# +from .plotting.quick_plot import QuickPlot + # # Remove any imported modules, so we don't expose them as part of pybop # diff --git a/pybop/datasets/base_dataset.py b/pybop/datasets/base_dataset.py index 41ee89060..ed194ae48 100644 --- a/pybop/datasets/base_dataset.py +++ b/pybop/datasets/base_dataset.py @@ -3,7 +3,7 @@ class Dataset: """ - Class for experimental Observations. + Class for experimental observations. """ def __init__(self, name, data): @@ -11,7 +11,7 @@ def __init__(self, name, data): self.data = data def __repr__(self): - return f"Observation: {self.name} \n Data: {self.data}" + return f"Dataset: {self.name} \n Data: {self.data}" def Interpolant(self): if self.variable == "time": diff --git a/pybop/models/base_model.py b/pybop/models/base_model.py index 21e48ebe3..cce1aa8db 100644 --- a/pybop/models/base_model.py +++ b/pybop/models/base_model.py @@ -3,7 +3,7 @@ class BaseModel: """ - Base class for PyBOP models + Base class for pybop models. """ def __init__(self, name="Base Model"): diff --git a/pybop/models/lithium_ion/__init__.py b/pybop/models/lithium_ion/__init__.py index 50f61b1e9..69b51653b 100644 --- a/pybop/models/lithium_ion/__init__.py +++ b/pybop/models/lithium_ion/__init__.py @@ -1,5 +1,4 @@ # # Import lithium ion based models # - from .base_echem import SPM, SPMe diff --git a/pybop/optimisers/base_optimiser.py b/pybop/optimisers/base_optimiser.py index 130ac5299..df6e253e5 100644 --- a/pybop/optimisers/base_optimiser.py +++ b/pybop/optimisers/base_optimiser.py @@ -10,10 +10,9 @@ def __init__(self): def optimise(self, cost_function, x0, bounds, method=None): """ - Optimise method to be overloaded by child classes. + Optimisiation method to be overloaded by child classes. """ - # Set up optimisation self.cost_function = cost_function self.x0 = x0 self.method = method diff --git a/pybop/optimisers/nlopt_optimize.py b/pybop/optimisers/nlopt_optimize.py index 50552898e..5af0dbab2 100644 --- a/pybop/optimisers/nlopt_optimize.py +++ b/pybop/optimisers/nlopt_optimize.py @@ -4,7 +4,7 @@ class NLoptOptimize(BaseOptimiser): """ - Wrapper class for the NLOpt optimisation class. Extends the BaseOptimiser class. + Wrapper class for the NLOpt optimiser class. Extends the BaseOptimiser class. """ def __init__(self, method=None, x0=None, xtol=None): diff --git a/pybop/optimisers/scipy_minimize.py b/pybop/optimisers/scipy_minimize.py index 2c8a0e651..bb9500135 100644 --- a/pybop/optimisers/scipy_minimize.py +++ b/pybop/optimisers/scipy_minimize.py @@ -4,7 +4,7 @@ class SciPyMinimize(BaseOptimiser): """ - Wrapper class for the Scipy optimisation class. Extends the BaseOptimiser class. + Wrapper class for the Scipy optimiser class. Extends the BaseOptimiser class. """ def __init__(self, cost_function, x0, bounds=None, options=None): diff --git a/pybop/parameters/base_parameter.py b/pybop/parameters/base_parameter.py index f15bdfea5..c6b2e6cdf 100644 --- a/pybop/parameters/base_parameter.py +++ b/pybop/parameters/base_parameter.py @@ -3,8 +3,8 @@ class Parameter: Class for creating parameters in pybop. """ - def __init__(self, param, value=None, prior=None, bounds=None): - self.name = param + def __init__(self, name, value=None, prior=None, bounds=None): + self.name = name self.prior = prior self.value = value self.bounds = bounds @@ -15,5 +15,8 @@ def __init__(self, param, value=None, prior=None, bounds=None): # bounds checks and set defaults # implement methods to assign and retrieve parameters + def update(self, value): + self.value = value + def __repr__(self): - return f"Parameter: {self.name} \n Prior: {self.prior} \n Bounds: {self.bounds}" + return f"Parameter: {self.name} \n Prior: {self.prior} \n Bounds: {self.bounds} \n Value: {self.value}" diff --git a/pybop/parameters/base_parameter_set.py b/pybop/parameters/base_parameter_set.py index 1e1dc23ec..e67b175ce 100644 --- a/pybop/parameters/base_parameter_set.py +++ b/pybop/parameters/base_parameter_set.py @@ -8,6 +8,9 @@ class ParameterSet: def __new__(cls, method, name): if method.casefold() == "pybamm": - return pybamm.ParameterValues(name).copy() + try: + return pybamm.ParameterValues(name).copy() + except: + raise ValueError("Parameter set not found") else: - raise ValueError("Only PybaMM parameter sets are currently implemented") + raise ValueError("Only PyBaMM parameter sets are currently implemented") diff --git a/pybop/parameters/priors.py b/pybop/parameters/priors.py index 7224b58a7..f98e9b767 100644 --- a/pybop/parameters/priors.py +++ b/pybop/parameters/priors.py @@ -57,7 +57,7 @@ def __repr__(self): class Exponential: """ - exponential prior class. + Exponential prior class. """ def __init__(self, scale): From d27173389ce4602c076abc5072ed395a9295fe6b Mon Sep 17 00:00:00 2001 From: NicolaCourtier <45851982+NicolaCourtier@users.noreply.github.com> Date: Tue, 31 Oct 2023 13:23:01 +0000 Subject: [PATCH 139/210] Update gitattributes and gitignore --- .gitattributes | 2 ++ .gitignore | 3 +++ 2 files changed, 5 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..dfe077042 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.gitignore b/.gitignore index 7978daaa3..838f372b0 100644 --- a/.gitignore +++ b/.gitignore @@ -301,3 +301,6 @@ $RECYCLE.BIN/ *.lnk # End of https://www.toptal.com/developers/gitignore/api/python,macos,windows,linux,c + +# Visual Studio Code settings +.vscode/* From 0f91baba88b65e59c7525d500b7bb9a7e1b91a1e Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Tue, 31 Oct 2023 14:03:14 +0000 Subject: [PATCH 140/210] Squashed merge of #54 --- .gitattributes | 2 + .gitignore | 3 + CITATION.cff | 14 +++ examples/scripts/rmse_estimation.py | 6 +- pybop/__init__.py | 38 +++++--- pybop/costs/error_costs.py | 92 +++++++++++++++++++ .../{observations.py => base_dataset.py} | 6 +- pybop/models/{BaseModel.py => base_model.py} | 2 +- pybop/models/lithium_ion/__init__.py | 1 - pybop/models/lithium_ion/base_echem.py | 2 +- .../{BaseOptimiser.py => base_optimiser.py} | 3 +- .../{NLoptOptimize.py => nlopt_optimize.py} | 4 +- .../{SciPyMinimize.py => scipy_minimize.py} | 4 +- .../{parameter.py => base_parameter.py} | 9 +- pybop/parameters/base_parameter_set.py | 16 ++++ pybop/parameters/parameter_set.py | 13 --- pybop/parameters/priors.py | 2 +- tests/unit/test_parameterisations.py | 19 ++-- 18 files changed, 185 insertions(+), 51 deletions(-) create mode 100644 .gitattributes create mode 100644 CITATION.cff create mode 100644 pybop/costs/error_costs.py rename pybop/datasets/{observations.py => base_dataset.py} (75%) rename pybop/models/{BaseModel.py => base_model.py} (99%) rename pybop/optimisers/{BaseOptimiser.py => base_optimiser.py} (87%) rename pybop/optimisers/{NLoptOptimize.py => nlopt_optimize.py} (89%) rename pybop/optimisers/{SciPyMinimize.py => scipy_minimize.py} (89%) rename pybop/parameters/{parameter.py => base_parameter.py} (68%) create mode 100644 pybop/parameters/base_parameter_set.py delete mode 100644 pybop/parameters/parameter_set.py diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..dfe077042 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.gitignore b/.gitignore index 7978daaa3..838f372b0 100644 --- a/.gitignore +++ b/.gitignore @@ -301,3 +301,6 @@ $RECYCLE.BIN/ *.lnk # End of https://www.toptal.com/developers/gitignore/api/python,macos,windows,linux,c + +# Visual Studio Code settings +.vscode/* diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 000000000..e1efab891 --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,14 @@ +cff-version: 1.2.0 +title: 'Python Battery Optimisation and Parameterisation (PyBOP)' +message: >- + If you use this software, please cite it using the + metadata from this file. +type: software +authors: + - given-names: Brady + family-names: Planden + - given-names: Nicola + family-names: Courtier + - given-names: David + family-names: Howey +repository-code: 'https://www.github.com/pybop-team/pybop' diff --git a/examples/scripts/rmse_estimation.py b/examples/scripts/rmse_estimation.py index 1e8ea68b3..358b3a5c2 100644 --- a/examples/scripts/rmse_estimation.py +++ b/examples/scripts/rmse_estimation.py @@ -4,9 +4,9 @@ # Form observations Measurements = pd.read_csv("examples/scripts/Chen_example.csv", comment="#").to_numpy() observations = [ - pybop.Observed("Time [s]", Measurements[:, 0]), - pybop.Observed("Current function [A]", Measurements[:, 1]), - pybop.Observed("Voltage [V]", Measurements[:, 2]), + pybop.Dataset("Time [s]", Measurements[:, 0]), + pybop.Dataset("Current function [A]", Measurements[:, 1]), + pybop.Dataset("Voltage [V]", Measurements[:, 2]), ] # Define model diff --git a/pybop/__init__.py b/pybop/__init__.py index 072276283..f06a38fdf 100644 --- a/pybop/__init__.py +++ b/pybop/__init__.py @@ -24,30 +24,44 @@ script_path = os.path.dirname(__file__) # -# Model Classes +# Cost function class # +from .costs.error_costs import RMSE + +# +# Dataset class +# +from .datasets.base_dataset import Dataset + +# +# Model classes +# +from .models.base_model import BaseModel from .models import lithium_ion -from .models.BaseModel import BaseModel # -# Parameterisation class +# Main optimisation class # -from .parameters.parameter_set import ParameterSet -from .parameters.parameter import Parameter -from .datasets.observations import Observed +from .optimisation import Optimisation # -# Priors class +# Optimiser class +# +from .optimisers.base_optimiser import BaseOptimiser +from .optimisers.nlopt_optimize import NLoptOptimize +from .optimisers.scipy_minimize import SciPyMinimize + # +# Parameter classes +# +from .parameters.base_parameter import Parameter +from .parameters.base_parameter_set import ParameterSet from .parameters.priors import Gaussian, Uniform, Exponential # -# Optimisation class +# Plotting class # -from .optimisation import Optimisation -from .optimisers import BaseOptimiser -from .optimisers.NLoptOptimize import NLoptOptimize -from .optimisers.SciPyMinimize import SciPyMinimize +from .plotting.quick_plot import QuickPlot # # Remove any imported modules, so we don't expose them as part of pybop diff --git a/pybop/costs/error_costs.py b/pybop/costs/error_costs.py new file mode 100644 index 000000000..66bc28af8 --- /dev/null +++ b/pybop/costs/error_costs.py @@ -0,0 +1,92 @@ +import numpy as np + + +class RMSE: + """ + Defines the root mean square error cost function. + """ + + def __init__(self): + self.name = "RMSE" + + def compute(self, prediction, target): + # Check compatibility + if len(prediction) != len(target): + print( + "Length of vectors:", + len(prediction), + len(target), + ) + raise ValueError( + "Measurement and simulated data length mismatch, potentially due to reaching a voltage cut-off" + ) + + print("Last Values:", prediction[-1], target[-1]) + + # Compute the cost + try: + return np.sqrt(np.mean((prediction - target) ** 2)) + + except Exception as e: + print(f"Error in RMSE calculation: {e}") + return None + + +class MLE: + """ + Defines the cost function for maximum likelihood estimation. + """ + + def __init__(self): + self.name = "MLE" + + def compute(self, prediction, target): + # Compute the cost + try: + return 0 # update with MLE residual + + except Exception as e: + print(f"Error in RMSE calculation: {e}") + return None + + +class PEM: + """ + Defines the cost function for prediction error minimisation. + """ + + def __init__(self): + self.name = "PEM" + + def compute(self, prediction, target): + # Compute the cost + try: + return 0 # update with MLE residual + + except Exception as e: + print(f"Error in RMSE calculation: {e}") + return None + + +class MAP: + """ + Defines the cost function for maximum a posteriori estimation. + """ + + def __init__(self): + self.name = "MAP" + + def compute(self, prediction, target): + # Compute the cost + try: + return 0 # update with MLE residual + + except Exception as e: + print(f"Error in RMSE calculation: {e}") + return None + + def sample(self, n_chains): + """ + Sample from the posterior distribution. + """ + pass diff --git a/pybop/datasets/observations.py b/pybop/datasets/base_dataset.py similarity index 75% rename from pybop/datasets/observations.py rename to pybop/datasets/base_dataset.py index 417a9b876..ed194ae48 100644 --- a/pybop/datasets/observations.py +++ b/pybop/datasets/base_dataset.py @@ -1,9 +1,9 @@ import pybamm -class Observed: +class Dataset: """ - Class for experimental Observations. + Class for experimental observations. """ def __init__(self, name, data): @@ -11,7 +11,7 @@ def __init__(self, name, data): self.data = data def __repr__(self): - return f"Observation: {self.name} \n Data: {self.data}" + return f"Dataset: {self.name} \n Data: {self.data}" def Interpolant(self): if self.variable == "time": diff --git a/pybop/models/BaseModel.py b/pybop/models/base_model.py similarity index 99% rename from pybop/models/BaseModel.py rename to pybop/models/base_model.py index 184acc2f6..4ad8a2076 100644 --- a/pybop/models/BaseModel.py +++ b/pybop/models/base_model.py @@ -4,7 +4,7 @@ class BaseModel: """ - Base class for PyBOP models + Base class for pybop models. """ def __init__(self, name="Base Model"): diff --git a/pybop/models/lithium_ion/__init__.py b/pybop/models/lithium_ion/__init__.py index 50f61b1e9..69b51653b 100644 --- a/pybop/models/lithium_ion/__init__.py +++ b/pybop/models/lithium_ion/__init__.py @@ -1,5 +1,4 @@ # # Import lithium ion based models # - from .base_echem import SPM, SPMe diff --git a/pybop/models/lithium_ion/base_echem.py b/pybop/models/lithium_ion/base_echem.py index 542d6a399..ffa3b5775 100644 --- a/pybop/models/lithium_ion/base_echem.py +++ b/pybop/models/lithium_ion/base_echem.py @@ -1,5 +1,5 @@ import pybamm -from ..BaseModel import BaseModel +from ..base_model import BaseModel class SPM(BaseModel): diff --git a/pybop/optimisers/BaseOptimiser.py b/pybop/optimisers/base_optimiser.py similarity index 87% rename from pybop/optimisers/BaseOptimiser.py rename to pybop/optimisers/base_optimiser.py index 130ac5299..df6e253e5 100644 --- a/pybop/optimisers/BaseOptimiser.py +++ b/pybop/optimisers/base_optimiser.py @@ -10,10 +10,9 @@ def __init__(self): def optimise(self, cost_function, x0, bounds, method=None): """ - Optimise method to be overloaded by child classes. + Optimisiation method to be overloaded by child classes. """ - # Set up optimisation self.cost_function = cost_function self.x0 = x0 self.method = method diff --git a/pybop/optimisers/NLoptOptimize.py b/pybop/optimisers/nlopt_optimize.py similarity index 89% rename from pybop/optimisers/NLoptOptimize.py rename to pybop/optimisers/nlopt_optimize.py index e1c88f696..5af0dbab2 100644 --- a/pybop/optimisers/NLoptOptimize.py +++ b/pybop/optimisers/nlopt_optimize.py @@ -1,10 +1,10 @@ import nlopt -from .BaseOptimiser import BaseOptimiser +from .base_optimiser import BaseOptimiser class NLoptOptimize(BaseOptimiser): """ - Wrapper class for the NLOpt optimisation class. Extends the BaseOptimiser class. + Wrapper class for the NLOpt optimiser class. Extends the BaseOptimiser class. """ def __init__(self, method=None, x0=None, xtol=None): diff --git a/pybop/optimisers/SciPyMinimize.py b/pybop/optimisers/scipy_minimize.py similarity index 89% rename from pybop/optimisers/SciPyMinimize.py rename to pybop/optimisers/scipy_minimize.py index cd831e9b2..bb9500135 100644 --- a/pybop/optimisers/SciPyMinimize.py +++ b/pybop/optimisers/scipy_minimize.py @@ -1,10 +1,10 @@ from scipy.optimize import minimize -from .BaseOptimiser import BaseOptimiser +from .base_optimiser import BaseOptimiser class SciPyMinimize(BaseOptimiser): """ - Wrapper class for the Scipy optimisation class. Extends the BaseOptimiser class. + Wrapper class for the Scipy optimiser class. Extends the BaseOptimiser class. """ def __init__(self, cost_function, x0, bounds=None, options=None): diff --git a/pybop/parameters/parameter.py b/pybop/parameters/base_parameter.py similarity index 68% rename from pybop/parameters/parameter.py rename to pybop/parameters/base_parameter.py index f15bdfea5..c6b2e6cdf 100644 --- a/pybop/parameters/parameter.py +++ b/pybop/parameters/base_parameter.py @@ -3,8 +3,8 @@ class Parameter: Class for creating parameters in pybop. """ - def __init__(self, param, value=None, prior=None, bounds=None): - self.name = param + def __init__(self, name, value=None, prior=None, bounds=None): + self.name = name self.prior = prior self.value = value self.bounds = bounds @@ -15,5 +15,8 @@ def __init__(self, param, value=None, prior=None, bounds=None): # bounds checks and set defaults # implement methods to assign and retrieve parameters + def update(self, value): + self.value = value + def __repr__(self): - return f"Parameter: {self.name} \n Prior: {self.prior} \n Bounds: {self.bounds}" + return f"Parameter: {self.name} \n Prior: {self.prior} \n Bounds: {self.bounds} \n Value: {self.value}" diff --git a/pybop/parameters/base_parameter_set.py b/pybop/parameters/base_parameter_set.py new file mode 100644 index 000000000..e67b175ce --- /dev/null +++ b/pybop/parameters/base_parameter_set.py @@ -0,0 +1,16 @@ +import pybamm + + +class ParameterSet: + """ + Class for creating parameter sets in pybop. + """ + + def __new__(cls, method, name): + if method.casefold() == "pybamm": + try: + return pybamm.ParameterValues(name).copy() + except: + raise ValueError("Parameter set not found") + else: + raise ValueError("Only PyBaMM parameter sets are currently implemented") diff --git a/pybop/parameters/parameter_set.py b/pybop/parameters/parameter_set.py deleted file mode 100644 index 1e1dc23ec..000000000 --- a/pybop/parameters/parameter_set.py +++ /dev/null @@ -1,13 +0,0 @@ -import pybamm - - -class ParameterSet: - """ - Class for creating parameter sets in pybop. - """ - - def __new__(cls, method, name): - if method.casefold() == "pybamm": - return pybamm.ParameterValues(name).copy() - else: - raise ValueError("Only PybaMM parameter sets are currently implemented") diff --git a/pybop/parameters/priors.py b/pybop/parameters/priors.py index 7224b58a7..f98e9b767 100644 --- a/pybop/parameters/priors.py +++ b/pybop/parameters/priors.py @@ -57,7 +57,7 @@ def __repr__(self): class Exponential: """ - exponential prior class. + Exponential prior class. """ def __init__(self, scale): diff --git a/tests/unit/test_parameterisations.py b/tests/unit/test_parameterisations.py index 047e41847..8c72a6608 100644 --- a/tests/unit/test_parameterisations.py +++ b/tests/unit/test_parameterisations.py @@ -2,9 +2,10 @@ import pybamm import pytest import numpy as np +import unittest -class TestModelParameterisation: +class TestModelParameterisation(unittest.TestCase): """ A class to test the model parameterisation methods. """ @@ -20,9 +21,9 @@ def test_spm(self): solution = self.getdata(model, x0) observations = [ - pybop.Observed("Time [s]", solution["Time [s]"].data), - pybop.Observed("Current function [A]", solution["Current [A]"].data), - pybop.Observed("Voltage [V]", solution["Terminal voltage [V]"].data), + pybop.Dataset("Time [s]", solution["Time [s]"].data), + pybop.Dataset("Current function [A]", solution["Current [A]"].data), + pybop.Dataset("Voltage [V]", solution["Terminal voltage [V]"].data), ] # Fitting parameters @@ -63,9 +64,9 @@ def test_spme(self): solution = self.getdata(model, x0) observations = [ - pybop.Observed("Time [s]", solution["Time [s]"].data), - pybop.Observed("Current function [A]", solution["Current [A]"].data), - pybop.Observed("Voltage [V]", solution["Terminal voltage [V]"].data), + pybop.Dataset("Time [s]", solution["Time [s]"].data), + pybop.Dataset("Current function [A]", solution["Current [A]"].data), + pybop.Dataset("Voltage [V]", solution["Terminal voltage [V]"].data), ] # Fitting parameters @@ -149,3 +150,7 @@ def test_parameter_set(self): np.testing.assert_allclose( parameter_test["Negative electrode active material volume fraction"], 0.75 ) + + +if __name__ == "__main__": + unittest.main() From a6e59b0d1543ffbbd7c1310ba9cd25b53acda278 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Tue, 31 Oct 2023 17:50:55 +0000 Subject: [PATCH 141/210] Squashed commit of #54 - optimisation.py changes & dependancies --- examples/scripts/rmse_estimation.py | 26 +++-- pybop/models/base_model.py | 21 ++-- pybop/optimisation.py | 140 +++++++++++---------------- tests/unit/test_parameterisations.py | 83 +++++++--------- 4 files changed, 124 insertions(+), 146 deletions(-) diff --git a/examples/scripts/rmse_estimation.py b/examples/scripts/rmse_estimation.py index 358b3a5c2..b63cf9428 100644 --- a/examples/scripts/rmse_estimation.py +++ b/examples/scripts/rmse_estimation.py @@ -1,9 +1,10 @@ import pybop import pandas as pd +import numpy as np # Form observations Measurements = pd.read_csv("examples/scripts/Chen_example.csv", comment="#").to_numpy() -observations = [ +dataset = [ pybop.Dataset("Time [s]", Measurements[:, 0]), pybop.Dataset("Current function [A]", Measurements[:, 1]), pybop.Dataset("Voltage [V]", Measurements[:, 2]), @@ -14,7 +15,7 @@ model = pybop.models.lithium_ion.SPM() # Fitting parameters -params = [ +parameters = [ pybop.Parameter( "Negative electrode active material volume fraction", prior=pybop.Gaussian(0.75, 0.05), @@ -27,14 +28,25 @@ ), ] +x0 = np.array([0.52, 0.63]) +# Define the cost to optimise +cost = pybop.RMSE() +signal = "Voltage [V]" + + +# Build the optimisation problem parameterisation = pybop.Optimisation( - model, observations=observations, fit_parameters=params + cost=cost, + model=model, + optimiser=pybop.NLoptOptimize(x0=x0), + parameters=parameters, + dataset=dataset, + signal=signal, ) -# get RMSE estimate using NLOpt -results, last_optim, num_evals = parameterisation.rmse( - signal="Voltage [V]", method="nlopt" -) +# Run the optimisation problem +results, last_optim, num_evals = parameterisation.run() + # get MAP estimate, starting at a random initial point in parameter space # parameterisation.map(x0=[p.sample() for p in params]) diff --git a/pybop/models/base_model.py b/pybop/models/base_model.py index 4ad8a2076..3ddd904c1 100644 --- a/pybop/models/base_model.py +++ b/pybop/models/base_model.py @@ -11,11 +11,11 @@ def __init__(self, name="Base Model"): self.name = name self.pybamm_model = None self.fit_parameters = None - self.observations = None + self.dataset = None def build( self, - observations=None, + dataset=None, fit_parameters=None, check_model=True, init_soc=None, @@ -26,7 +26,7 @@ def build( similar process to pybamm.Simulation.build(). """ self.fit_parameters = fit_parameters - self.observations = observations + self.dataset = dataset if self.fit_parameters is not None: self.fit_keys = list(self.fit_parameters.keys()) @@ -82,10 +82,10 @@ def set_params(self): for i in self.fit_parameters.keys(): self.parameter_set[i] = "[input]" - if self.observations is not None and self.fit_parameters is not None: + if self.dataset is not None and self.fit_parameters is not None: self.parameter_set["Current function [A]"] = pybamm.Interpolant( - self.observations["Time [s]"].data, - self.observations["Current function [A]"].data, + self.dataset["Time [s]"].data, + self.dataset["Current function [A]"].data, pybamm.t, ) # Set t_eval @@ -109,9 +109,11 @@ def simulate(self, inputs, t_eval): inputs_dict = { key: inputs[i] for i, key in enumerate(self.fit_parameters) } - return self.solver.solve( - self.built_model, inputs=inputs_dict, t_eval=t_eval - )["Terminal voltage [V]"].data + return self.solver.solve( + self.built_model, inputs=inputs_dict, t_eval=t_eval + )["Terminal voltage [V]"].data + else: + return self.solver.solve(self.built_model, inputs=inputs, t_eval=t_eval) def simulateS1(self, inputs, t_eval): """ @@ -125,6 +127,7 @@ def simulateS1(self, inputs, t_eval): inputs_dict = { key: inputs[i] for i, key in enumerate(self.fit_parameters) } + sol = self.solver.solve( self.built_model, inputs=inputs_dict, diff --git a/pybop/optimisation.py b/pybop/optimisation.py index beebbec2c..aef3be7e2 100644 --- a/pybop/optimisation.py +++ b/pybop/optimisation.py @@ -1,4 +1,3 @@ -import pybop import numpy as np @@ -9,121 +8,96 @@ class Optimisation: def __init__( self, + cost, model, - observations, - fit_parameters, + optimiser, + parameters, x0=None, + dataset=None, + signal=None, check_model=True, init_soc=None, verbose=False, ): + self.cost = cost self.model = model + self.optimiser = optimiser + self.parameters = parameters + self.x0 = x0 + self.dataset = {o.name: o for o in dataset} + self.fit_parameters = {o.name: o for o in parameters} + self.signal = signal + self.n_parameters = len(self.parameters) self.verbose = verbose - self.fit_dict = {} - self.fit_parameters = {o.name: o for o in fit_parameters} - self.observations = {o.name: o for o in observations} - self.model.n_parameters = len(self.fit_dict) - # Check that the observations contain time and current + # Check that the dataset contains time and current for name in ["Time [s]", "Current function [A]"]: - if name not in self.observations: - raise ValueError(f"expected {name} in list of observations") + if name not in self.dataset: + raise ValueError(f"expected {name} in list of dataset") # Set bounds self.bounds = dict( - lower=[self.fit_parameters[p].bounds[0] for p in self.fit_parameters], - upper=[self.fit_parameters[p].bounds[1] for p in self.fit_parameters], + lower=[Param.bounds[0] for Param in self.parameters], + upper=[Param.bounds[1] for Param in self.parameters], ) # Sample from prior for x0 if x0 is None: - self.x0 = np.zeros(len(self.fit_parameters)) - for i, j in enumerate(self.fit_parameters): - self.x0[i] = self.fit_parameters[j].prior.rvs(1)[ - 0 - ] # Updt to capture dimensions per parameter + self.x0 = np.zeros(self.n_parameters) + for i, Param in enumerate(self.parameters): + self.x0[i] = Param.prior.rvs(1)[0] + # Update to capture dimensions per parameter - # Align initial guess with sample from prior - for i, j in enumerate(self.fit_parameters): - self.fit_dict[j] = {j: self.x0[i]} + # Add the initial values to the parameter definitions + for i, Param in enumerate(self.parameters): + Param.update(value=self.x0[i]) - # Build model with observations and fitting_parameters + # Build model with dataset and fitting parameters self.model.build( - self.observations, - self.fit_parameters, + dataset=self.dataset, + fit_parameters=self.fit_parameters, check_model=check_model, init_soc=init_soc, ) - def step(self, signal, x, grad): - for i, p in enumerate(self.fit_dict): - self.fit_dict[p] = x[i] - - y_hat = self.model.solver.solve( - self.model.built_model, self.model.time_data, inputs=self.fit_dict - )[signal].data + def run(self): + """ + Run the optimisation algorithm. + """ - print( - "Last Voltage Values:", y_hat[-1], self.observations["Voltage [V]"].data[-1] + results = self.optimiser.optimise( + cost_function=self.cost_function, # lambda x, grad: self.cost_function(x, grad), + x0=self.x0, + bounds=self.bounds, ) - if len(y_hat) != len(self.observations["Voltage [V]"].data): - print( - "len of vectors:", - len(y_hat), - len(self.observations["Voltage [V]"].data), - ) - raise ValueError( - "Measurement and simulated data length mismatch, potentially due to reaching a voltage cut-off" - ) - - if self.verbose: - print(self.fit_dict) - - try: - return np.sqrt( - np.mean((self.observations["Voltage [V]"].data - y_hat) ** 2) - ) - except Exception as e: - print(f"Error in RMSE calculation: {e}") - return None + return results - def map(self, x0): + def cost_function(self, x, grad=None): """ - Maximum a posteriori estimation. + Compute a model prediction and associated value of the cost. """ - pass - def sample(self, n_chains): - """ - Sample from the posterior distribution. - """ - pass + # Unpack the target dataset + target = self.dataset[self.signal].data - def pem(self, method=None): - """ - Predictive error minimisation. - """ - pass + # Update the parameter dictionary + inputs_dict = {key: x[i] for i, key in enumerate(self.fit_parameters)} - def rmse(self, signal, method=None): - """ - Calculate the root mean squared error. - """ + # for i, Param in enumerate(self.parameters): + # Param.update(value=x[i]) - if method == "nlopt": - optim = pybop.NLoptOptimize(x0=self.x0) - results = optim.optimise( - lambda x, grad: self.step(signal, x, grad), self.x0, self.bounds - ) + # Make prediction + prediction = self.model.simulate( + inputs=inputs_dict, t_eval=self.model.time_data + )[self.signal].data - else: - optim = pybop.NLoptOptimize(method) - results = optim.optimise(self.step, self.x0, self.bounds) - return results + # Add simulation error handling here - def mle(self, method=None): - """ - Maximum likelihood estimation. - """ - pass + # Compute cost + res = self.cost.compute(prediction, target) + + if self.verbose: + print("Parameter estimates: ", self.parameters.value, "\n") + + return res diff --git a/tests/unit/test_parameterisations.py b/tests/unit/test_parameterisations.py index 8c72a6608..73078ec1d 100644 --- a/tests/unit/test_parameterisations.py +++ b/tests/unit/test_parameterisations.py @@ -20,14 +20,14 @@ def test_spm(self): x0 = np.array([0.52, 0.63]) solution = self.getdata(model, x0) - observations = [ + dataset = [ pybop.Dataset("Time [s]", solution["Time [s]"].data), pybop.Dataset("Current function [A]", solution["Current [A]"].data), pybop.Dataset("Voltage [V]", solution["Terminal voltage [V]"].data), ] # Fitting parameters - params = [ + parameters = [ pybop.Parameter( "Negative electrode active material volume fraction", prior=pybop.Gaussian(0.5, 0.02), @@ -40,14 +40,25 @@ def test_spm(self): ), ] + # Define the cost to optimise + cost = pybop.RMSE() + signal = "Voltage [V]" + + # Select optimiser + optimiser = pybop.NLoptOptimize(x0=x0) + + # Build the optimisation problem parameterisation = pybop.Optimisation( - model, observations=observations, fit_parameters=params + cost=cost, + model=model, + optimiser=optimiser, + parameters=parameters, + dataset=dataset, + signal=signal, ) - # get RMSE estimate using NLOpt - results, last_optim, num_evals = parameterisation.rmse( - signal="Voltage [V]", method="nlopt" - ) + # Run the optimisation problem + results, last_optim, num_evals = parameterisation.run() # Assertions (for testing purposes only) np.testing.assert_allclose(last_optim, 0, atol=1e-2) @@ -63,14 +74,14 @@ def test_spme(self): x0 = np.array([0.52, 0.63]) solution = self.getdata(model, x0) - observations = [ + dataset = [ pybop.Dataset("Time [s]", solution["Time [s]"].data), pybop.Dataset("Current function [A]", solution["Current [A]"].data), pybop.Dataset("Voltage [V]", solution["Terminal voltage [V]"].data), ] # Fitting parameters - params = [ + parameters = [ pybop.Parameter( "Negative electrode active material volume fraction", prior=pybop.Gaussian(0.5, 0.02), @@ -83,15 +94,25 @@ def test_spme(self): ), ] - parameterisation = pybop.Optimisation( - model, observations=observations, fit_parameters=params - ) + # Define the cost to optimise + cost = pybop.RMSE() + signal = "Voltage [V]" - # get RMSE estimate using NLOpt - results, last_optim, num_evals = parameterisation.rmse( - signal="Voltage [V]", method="nlopt" + # Select optimiser + optimiser = pybop.NLoptOptimize(x0=x0) + + # Build the optimisation problem + parameterisation = pybop.Optimisation( + cost=cost, + model=model, + optimiser=optimiser, + parameters=parameters, + dataset=dataset, + signal=signal, ) + # Run the optimisation problem + results, last_optim, num_evals = parameterisation.run() # Assertions (for testing purposes only) np.testing.assert_allclose(last_optim, 0, atol=1e-2) np.testing.assert_allclose(results, x0, rtol=1e-1) @@ -119,38 +140,6 @@ def getdata(self, model, x0): sim = model.predict(experiment=experiment) return sim - @pytest.mark.unit - def test_simulate_without_build_model(self): - # Define model - model = pybop.lithium_ion.SPM() - - with pytest.raises( - ValueError, match="Model must be built before calling simulate" - ): - model.simulate(None, None) - - @pytest.mark.unit - def test_priors(self): - # Tests priors - Gaussian = pybop.Gaussian(0.5, 1) - Uniform = pybop.Uniform(0, 1) - Exponential = pybop.Exponential(1) - - np.testing.assert_allclose(Gaussian.pdf(0.5), 0.3989422804014327, atol=1e-4) - np.testing.assert_allclose(Uniform.pdf(0.5), 1, atol=1e-4) - np.testing.assert_allclose(Exponential.pdf(1), 0.36787944117144233, atol=1e-4) - - @pytest.mark.unit - def test_parameter_set(self): - # Tests parameter set creation - with pytest.raises(ValueError): - pybop.ParameterSet("pybamms", "Chen2020") - - parameter_test = pybop.ParameterSet("pybamm", "Chen2020") - np.testing.assert_allclose( - parameter_test["Negative electrode active material volume fraction"], 0.75 - ) - if __name__ == "__main__": unittest.main() From fe5446cd2508be3a56447b69600eff54847b89ca Mon Sep 17 00:00:00 2001 From: NicolaCourtier <45851982+NicolaCourtier@users.noreply.github.com> Date: Wed, 1 Nov 2023 03:02:27 +0000 Subject: [PATCH 142/210] Separate cost and optimiser from optimisation --- examples/scripts/rmse_estimation.py | 25 ++++-- pybop/models/base_model.py | 12 +-- pybop/optimisation.py | 117 +++++++++++---------------- pybop/optimisers/nlopt_optimize.py | 19 +++-- pybop/optimisers/scipy_minimize.py | 40 ++++++--- tests/unit/test_parameterisations.py | 58 ++++++++----- 6 files changed, 149 insertions(+), 122 deletions(-) diff --git a/examples/scripts/rmse_estimation.py b/examples/scripts/rmse_estimation.py index dd0360350..65a5a8a83 100644 --- a/examples/scripts/rmse_estimation.py +++ b/examples/scripts/rmse_estimation.py @@ -2,9 +2,9 @@ import pandas as pd import numpy as np -# Form observations +# Form dataset Measurements = pd.read_csv("examples/scripts/Chen_example.csv", comment="#").to_numpy() -observations = [ +dataset = [ pybop.Dataset("Time [s]", Measurements[:, 0]), pybop.Dataset("Current function [A]", Measurements[:, 1]), pybop.Dataset("Voltage [V]", Measurements[:, 2]), @@ -28,14 +28,25 @@ ), ] +# Define the cost to optimise +cost = pybop.RMSE() +signal = "Voltage [V]" + +# Select optimiser +optimiser = pybop.NLoptOptimize(x0=params) + +# Construct the optimisation problem parameterisation = pybop.Optimisation( - model, observations=observations, fit_parameters=params + cost=cost, + model=model, + optimiser=optimiser, + fit_parameters=params, + dataset=dataset, + signal=signal, ) -# get RMSE estimate using NLOpt -results, last_optim, num_evals = parameterisation.rmse( - signal="Voltage [V]", method="nlopt" -) + # Run the optimisation problem +x, output, final_cost, num_evals = parameterisation.run() # get MAP estimate, starting at a random initial point in parameter space # parameterisation.map(x0=[p.sample() for p in params]) diff --git a/pybop/models/base_model.py b/pybop/models/base_model.py index cce1aa8db..8dc5652d7 100644 --- a/pybop/models/base_model.py +++ b/pybop/models/base_model.py @@ -10,11 +10,11 @@ def __init__(self, name="Base Model"): self.name = name self.pybamm_model = None self.fit_parameters = None - self.observations = None + self.dataset = None def build( self, - observations=None, + dataset=None, fit_parameters=None, check_model=True, init_soc=None, @@ -25,7 +25,7 @@ def build( similar process to pybamm.Simulation.build(). """ self.fit_parameters = fit_parameters - self.observations = observations + self.dataset = dataset if init_soc is not None: self.set_init_soc(init_soc) @@ -79,10 +79,10 @@ def set_params(self): for i in self.fit_parameters.keys(): self.parameter_set[i] = "[input]" - if self.observations is not None and self.fit_parameters is not None: + if self.dataset is not None and self.fit_parameters is not None: self.parameter_set["Current function [A]"] = pybamm.Interpolant( - self.observations["Time [s]"].data, - self.observations["Current function [A]"].data, + self.dataset["Time [s]"].data, + self.dataset["Current function [A]"].data, pybamm.t, ) # Set t_eval diff --git a/pybop/optimisation.py b/pybop/optimisation.py index d63fbec68..75786ffb9 100644 --- a/pybop/optimisation.py +++ b/pybop/optimisation.py @@ -9,30 +9,37 @@ class Optimisation: def __init__( self, + cost, model, - observations, + optimiser, fit_parameters, x0=None, + dataset=None, + signal=None, check_model=True, init_soc=None, verbose=False, ): + self.cost = cost self.model = model + self.optimiser = optimiser + self.x0 = x0 + self.dataset = {o.name: o for o in dataset} + self.signal = signal self.verbose = verbose self.fit_dict = {} self.fit_parameters = {o.name: o for o in fit_parameters} - self.observations = {o.name: o for o in observations} self.model.n_parameters = len(self.fit_dict) - # Check that the observations contain time and current + # Check that the dataset contains time and current for name in ["Time [s]", "Current function [A]"]: - if name not in self.observations: - raise ValueError(f"expected {name} in list of observations") + if name not in self.dataset: + raise ValueError(f"expected {name} in list of dataset") # Set bounds self.bounds = dict( - lower=[self.fit_parameters[p].bounds[0] for p in self.fit_parameters], - upper=[self.fit_parameters[p].bounds[1] for p in self.fit_parameters], + lower=[self.fit_parameters[param].bounds[0] for param in self.fit_parameters], + upper=[self.fit_parameters[param].bounds[1] for param in self.fit_parameters], ) # Sample from prior for x0 @@ -43,86 +50,52 @@ def __init__( 0 ] # Updt to capture dimensions per parameter - # Align initial guess with sample from prior - for i, j in enumerate(self.fit_parameters): - self.fit_dict[j] = {j: self.x0[i]} + # Add the initial values to the parameter definitions + for i, param in enumerate(self.fit_parameters): + self.fit_dict[param] = {param: self.x0[i]} - # Build model with observations and fitting_parameters + # Build model with dataset and fitting parameters self.model.build( - self.observations, - self.fit_parameters, + dataset=self.dataset, + fit_parameters=self.fit_parameters, check_model=check_model, init_soc=init_soc, ) - def step(self, signal, x, grad): - for i, p in enumerate(self.fit_dict): - self.fit_dict[p] = x[i] - - y_hat = self.model.solver.solve( - self.model.built_model, self.model.time_data, inputs=self.fit_dict - )[signal].data + def run(self): + """ + Run the optimisation algorithm. + """ - print( - "Last Voltage Values:", y_hat[-1], self.observations["Voltage [V]"].data[-1] + results = self.optimiser.optimise( + self.cost_function, # lambda x, grad: self.cost_function(x, grad), + self.x0, + self.bounds, ) - if len(y_hat) != len(self.observations["Voltage [V]"].data): - print( - "len of vectors:", - len(y_hat), - len(self.observations["Voltage [V]"].data), - ) - raise ValueError( - "Measurement and simulated data length mismatch, potentially due to reaching a voltage cut-off" - ) - - try: - res = np.sqrt(np.mean((self.observations["Voltage [V]"].data - y_hat) ** 2)) - except: - print("Error in RMSE calculation") - - if self.verbose: - print(self.fit_dict) - - return res + return results - def map(self, x0): + def cost_function(self, x, grad=None): """ - Maximum a posteriori estimation. + Compute a model prediction and associated value of the cost. """ - pass - def sample(self, n_chains): - """ - Sample from the posterior distribution. - """ - pass + # Unpack the target dataset + target = self.dataset[self.signal].data - def pem(self, method=None): - """ - Predictive error minimisation. - """ - pass + # Update the parameter dictionary + for i, param in enumerate(self.fit_dict): + self.fit_dict[param] = x[i] - def rmse(self, signal, method=None): - """ - Calculate the root mean squared error. - """ + # Make prediction + prediction = self.model.predict(inputs=self.fit_dict)[self.signal].data - if method == "nlopt": - optim = pybop.NLoptOptimize(x0=self.x0) - results = optim.optimise( - lambda x, grad: self.step(signal, x, grad), self.x0, self.bounds - ) + # Add simulation error handling here - else: - optim = pybop.NLoptOptimize(method) - results = optim.optimise(self.step, self.x0, self.bounds) - return results + # Compute cost + res = self.cost.compute(prediction, target) - def mle(self, method=None): - """ - Maximum likelihood estimation. - """ - pass + if self.verbose: + print("Parameter estimates: ", self.parameters.value, "\n") + + return res diff --git a/pybop/optimisers/nlopt_optimize.py b/pybop/optimisers/nlopt_optimize.py index 5af0dbab2..d766f376a 100644 --- a/pybop/optimisers/nlopt_optimize.py +++ b/pybop/optimisers/nlopt_optimize.py @@ -1,3 +1,4 @@ +import pybop import nlopt from .base_optimiser import BaseOptimiser @@ -23,20 +24,26 @@ def __init__(self, method=None, x0=None, xtol=None): def _runoptimise(self, cost_function, x0, bounds): """ - Run the NLOpt opt method. + Run the NLOpt optimisation method. - Parameters + Inputs ---------- cost_function: function for optimising - method: optimisation method - x0: Initialisation array + method: optimisation algorithm + x0: initialisation array bounds: bounds array """ self.opt.set_min_objective(cost_function) self.opt.set_lower_bounds(bounds["lower"]) self.opt.set_upper_bounds(bounds["upper"]) - results = self.opt.optimize(x0) + + # Run the optimser + x = self.opt.optimize(x0) + + # Get performance statistics + output = self.opt + final_cost = self.opt.last_optimum_value() num_evals = self.opt.get_numevals() - return results, self.opt.last_optimum_value(), num_evals + return x, output, final_cost, num_evals diff --git a/pybop/optimisers/scipy_minimize.py b/pybop/optimisers/scipy_minimize.py index bb9500135..b9a282839 100644 --- a/pybop/optimisers/scipy_minimize.py +++ b/pybop/optimisers/scipy_minimize.py @@ -1,10 +1,11 @@ +import pybop from scipy.optimize import minimize from .base_optimiser import BaseOptimiser class SciPyMinimize(BaseOptimiser): """ - Wrapper class for the Scipy optimiser class. Extends the BaseOptimiser class. + Wrapper class for the SciPy optimisation class. Extends the BaseOptimiser class. """ def __init__(self, cost_function, x0, bounds=None, options=None): @@ -18,24 +19,37 @@ def __init__(self, cost_function, x0, bounds=None, options=None): def _runoptimise(self): """ - Run the Scipy opt method. + Run the SciPy optimisation method. - Parameters + Inputs ---------- cost_function: function for optimising - method: optimisation method - x0: Initialisation array - options: options dictionary + method: optimisation algorithm + x0: initialisation array bounds: bounds array """ - if self.method is not None and self.bounds is not None: - opt = minimize( - self.cost_function, self.x0, method=self.method, bounds=self.bounds - ) - elif self.method is not None: - opt = minimize(self.cost_function, self.x0, method=self.method) + if self.method is not None: + method=self.method else: opt = minimize(self.cost_function, self.x0, method="BFGS") - return opt + # Reformat bounds + bounds = ( + (lower, upper) for lower, upper in zip(bounds["lower"], bounds["upper"]) + ) + + # Run the optimser + if self.bounds is not None: + output = minimize( + self.cost_function, self.x0, method=method, bounds=self.bounds, tol=self.xtol + ) + else: + output = minimize(self.cost_function, self.x0, method=method, tol=self.xtol) + + # Get performance statistics + x = output.x + final_cost = output.fun + num_evals = output.nfev + + return x, output, final_cost, num_evals diff --git a/tests/unit/test_parameterisations.py b/tests/unit/test_parameterisations.py index d68b3debc..b47ccdb5b 100644 --- a/tests/unit/test_parameterisations.py +++ b/tests/unit/test_parameterisations.py @@ -16,11 +16,11 @@ def test_spm(self): model = pybop.lithium_ion.SPM() model.parameter_set = model.pybamm_model.default_parameter_values - # Form observations + # Form dataset x0 = np.array([0.52, 0.63]) solution = self.getdata(model, x0) - observations = [ + dataset = [ pybop.Dataset("Time [s]", solution["Time [s]"].data), pybop.Dataset("Current function [A]", solution["Current [A]"].data), pybop.Dataset("Voltage [V]", solution["Terminal voltage [V]"].data), @@ -40,18 +40,29 @@ def test_spm(self): ), ] + # Define the cost to optimise + cost = pybop.RMSE() + signal = "Voltage [V]" + + # Select optimiser + optimiser = pybop.NLoptOptimize(x0=x0) + + # Build the optimisation problem parameterisation = pybop.Optimisation( - model, observations=observations, fit_parameters=params + cost=cost, + model=model, + optimiser=optimiser, + fit_parameters=params, + dataset=dataset, + signal=signal, ) - # get RMSE estimate using NLOpt - results, last_optim, num_evals = parameterisation.rmse( - signal="Voltage [V]", method="nlopt" - ) + # Run the optimisation problem + x, output, final_cost, num_evals = parameterisation.run() # Assertions (for testing purposes only) - np.testing.assert_allclose(last_optim, 0, atol=1e-2) - np.testing.assert_allclose(results, x0, atol=1e-1) + np.testing.assert_allclose(final_cost, 0, atol=1e-2) + np.testing.assert_allclose(x, x0, atol=1e-1) @pytest.mark.unit def test_spme(self): @@ -59,11 +70,11 @@ def test_spme(self): model = pybop.lithium_ion.SPMe() model.parameter_set = model.pybamm_model.default_parameter_values - # Form observations + # Form dataset x0 = np.array([0.52, 0.63]) solution = self.getdata(model, x0) - observations = [ + dataset = [ pybop.Dataset("Time [s]", solution["Time [s]"].data), pybop.Dataset("Current function [A]", solution["Current [A]"].data), pybop.Dataset("Voltage [V]", solution["Terminal voltage [V]"].data), @@ -83,18 +94,29 @@ def test_spme(self): ), ] + # Define the cost to optimise + cost = pybop.RMSE() + signal = "Voltage [V]" + + # Select optimiser + optimiser = pybop.NLoptOptimize(x0=x0) + + # Build the optimisation problem parameterisation = pybop.Optimisation( - model, observations=observations, fit_parameters=params + cost=cost, + model=model, + optimiser=optimiser, + fit_parameters=params, + dataset=dataset, + signal=signal, ) - # get RMSE estimate using NLOpt - results, last_optim, num_evals = parameterisation.rmse( - signal="Voltage [V]", method="nlopt" - ) + # Run the optimisation problem + x, output, final_cost, num_evals = parameterisation.run() # Assertions (for testing purposes only) - np.testing.assert_allclose(last_optim, 0, atol=1e-2) - np.testing.assert_allclose(results, x0, rtol=1e-1) + np.testing.assert_allclose(final_cost, 0, atol=1e-2) + np.testing.assert_allclose(x, x0, rtol=1e-1) def getdata(self, model, x0): model.parameter_set = model.pybamm_model.default_parameter_values From e4e161d9c9e6d07872b9330aecb74ceb3e2f49e1 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Wed, 1 Nov 2023 10:46:48 +0000 Subject: [PATCH 143/210] Squashed commit of #54 - Add Optimisers --- examples/scripts/rmse_estimation.py | 2 +- pybop/__init__.py | 11 +- pybop/optimisers/base_optimiser.py | 3 +- pybop/optimisers/nlopt_optimize.py | 37 +++--- pybop/optimisers/pints_optimiser.py | 158 +++++++++++++++++++++++++ pybop/optimisers/scipy_minimize.py | 56 +++++---- pybop/parameters/base_parameter.py | 2 +- pybop/parameters/base_parameter_set.py | 2 +- tests/unit/test_parameterisations.py | 12 +- 9 files changed, 230 insertions(+), 53 deletions(-) create mode 100644 pybop/optimisers/pints_optimiser.py diff --git a/examples/scripts/rmse_estimation.py b/examples/scripts/rmse_estimation.py index b63cf9428..987e899a0 100644 --- a/examples/scripts/rmse_estimation.py +++ b/examples/scripts/rmse_estimation.py @@ -45,7 +45,7 @@ ) # Run the optimisation problem -results, last_optim, num_evals = parameterisation.run() +x, output, final_cost, num_evals = parameterisation.run() # get MAP estimate, starting at a random initial point in parameter space diff --git a/pybop/__init__.py b/pybop/__init__.py index f06a38fdf..e00e3d3c1 100644 --- a/pybop/__init__.py +++ b/pybop/__init__.py @@ -1,5 +1,5 @@ # -# Root of the pybop module. +# Root of the PyBOP module. # Provides access to all shared functionality (models, solvers, etc.). # # This file is adapted from Pints @@ -7,7 +7,7 @@ # import sys -import os +from os import path # # Version info @@ -20,8 +20,8 @@ # Float format: a float can be converted to a 17 digit decimal and back without # loss of information FLOAT_FORMAT = "{: .17e}" -# Absolute path to the pybop module -script_path = os.path.dirname(__file__) +# Absolute path to the PyBOP repo +script_path = path.dirname(__file__) # # Cost function class @@ -50,6 +50,7 @@ from .optimisers.base_optimiser import BaseOptimiser from .optimisers.nlopt_optimize import NLoptOptimize from .optimisers.scipy_minimize import SciPyMinimize +from .optimisers.pints_optimiser import PintsOptimiser, PintsError, PintsBoundaries # # Parameter classes @@ -64,6 +65,6 @@ from .plotting.quick_plot import QuickPlot # -# Remove any imported modules, so we don't expose them as part of pybop +# Remove any imported modules, so we don't expose them as part of PyBOP # del sys diff --git a/pybop/optimisers/base_optimiser.py b/pybop/optimisers/base_optimiser.py index df6e253e5..dec1495f6 100644 --- a/pybop/optimisers/base_optimiser.py +++ b/pybop/optimisers/base_optimiser.py @@ -8,14 +8,13 @@ class BaseOptimiser: def __init__(self): self.name = "Base Optimiser" - def optimise(self, cost_function, x0, bounds, method=None): + def optimise(self, cost_function, x0, bounds): """ Optimisiation method to be overloaded by child classes. """ self.cost_function = cost_function self.x0 = x0 - self.method = method self.bounds = bounds # Run optimisation diff --git a/pybop/optimisers/nlopt_optimize.py b/pybop/optimisers/nlopt_optimize.py index 5af0dbab2..8e7fd9c4a 100644 --- a/pybop/optimisers/nlopt_optimize.py +++ b/pybop/optimisers/nlopt_optimize.py @@ -7,36 +7,43 @@ class NLoptOptimize(BaseOptimiser): Wrapper class for the NLOpt optimiser class. Extends the BaseOptimiser class. """ - def __init__(self, method=None, x0=None, xtol=None): + def __init__(self, x0, xtol=None, method=None): super().__init__() self.name = "NLOpt Optimiser" if method is not None: - self.opt = nlopt.opt(method, len(x0)) + self.optim = nlopt.opt(method, len(x0)) else: - self.opt = nlopt.opt(nlopt.LN_BOBYQA, len(x0)) + self.optim = nlopt.opt(nlopt.LN_BOBYQA, len(x0)) if xtol is not None: - self.opt.set_xtol_rel(xtol) + self.optim.set_xtol_rel(xtol) else: - self.opt.set_xtol_rel(1e-5) + self.optim.set_xtol_rel(1e-5) def _runoptimise(self, cost_function, x0, bounds): """ - Run the NLOpt opt method. + Run the NLOpt optimisation method. - Parameters + Inputs ---------- cost_function: function for optimising - method: optimisation method - x0: Initialisation array + method: optimisation algorithm + x0: initialisation array bounds: bounds array """ - self.opt.set_min_objective(cost_function) - self.opt.set_lower_bounds(bounds["lower"]) - self.opt.set_upper_bounds(bounds["upper"]) - results = self.opt.optimize(x0) - num_evals = self.opt.get_numevals() + # Pass settings to the optimiser + self.optim.set_min_objective(cost_function) + self.optim.set_lower_bounds(bounds["lower"]) + self.optim.set_upper_bounds(bounds["upper"]) - return results, self.opt.last_optimum_value(), num_evals + # Run the optimser + x = self.optim.optimize(x0) + + # Get performance statistics + output = self.optim + final_cost = self.optim.last_optimum_value() + num_evals = self.optim.get_numevals() + + return x, output, final_cost, num_evals diff --git a/pybop/optimisers/pints_optimiser.py b/pybop/optimisers/pints_optimiser.py new file mode 100644 index 000000000..a36f93856 --- /dev/null +++ b/pybop/optimisers/pints_optimiser.py @@ -0,0 +1,158 @@ +import pybop +import pints +from pybop.optimisers.base_optimiser import BaseOptimiser +from pints import ErrorMeasure + + +class PintsOptimiser(BaseOptimiser): + """ + Wrapper class for the PINTS optimisation class. Extends the BaseOptimiser class. + """ + + def __init__(self, x0, xtol=None, method=None): + super().__init__() + self.name = "PINTS Optimiser" + + if method is not None: + self.method = method + else: + self.method = pints.PSO + + def _runoptimise(self, cost_function, x0, bounds): + """ + Run the PINTS optimisation method. + + Inputs + ---------- + cost_function: function for optimising + method: optimisation algorithm + x0: initialisation array + bounds: bounds array + """ + + # Wrap bounds + boundaries = pybop.PintsBoundaries(bounds, x0) + + # Wrap error measure + error = pybop.PintsError(cost_function, x0) + + # Set up optimisation controller + controller = pints.OptimisationController( + error, x0, boundaries=boundaries, method=self.method + ) + controller.set_max_unchanged_iterations(20) # default 200 + + # Run the optimser + x, final_cost = controller.run() + + # Get performance statistics + # output = *pass all output* + # final_cost + # num_evals + output = None + num_evals = None + + return x, output, final_cost, num_evals + + +class PintsError(ErrorMeasure): + """ + An interface class for PyBOP that extends the PINTS ErrorMeasure class. + + From PINTS: + Abstract base class for objects that calculate some scalar measure of + goodness-of-fit (for a model and a data set), such that a smaller value + means a better fit. + + ErrorMeasures are callable objects: If ``e`` is an instance of an + :class:`ErrorMeasure` class you can calculate the error by calling ``e(p)`` + where ``p`` is a point in parameter space. + """ + + def __init__(self, cost_function, x0): + self.cost_function = cost_function + self.x0 = x0 + + def __call__(self, x): + cost = self.cost_function(x) + + return cost + + def evaluateS1(self, x): + """ + Evaluates this error measure, and returns the result plus the partial + derivatives of the result with respect to the parameters. + + The returned data has the shape ``(e, e')`` where ``e`` is a scalar + value and ``e'`` is a sequence of length ``n_parameters``. + + *This is an optional method that is not always implemented.* + """ + raise NotImplementedError + + def n_parameters(self): + """ + Returns the dimension of the parameter space this measure is defined + over. + """ + return len(self.x0) + + +class PintsBoundaries(object): + """ + An interface class for PyBOP that extends the PINTS ErrorMeasure class. + + From PINTS: + Abstract class representing boundaries on a parameter space. + """ + + def __init__(self, bounds, x0): + self.bounds = bounds + self.x0 = x0 + + def check(self, parameters): + """ + Returns ``True`` if and only if the given point in parameter space is + within the boundaries. + + Parameters + ---------- + parameters + A point in parameter space + """ + result = False + if ( + parameters[0] >= self.bounds["lower"][0] + and parameters[1] >= self.bounds["lower"][1] + and parameters[0] <= self.bounds["upper"][0] + and parameters[1] <= self.bounds["upper"][1] + ): + result = True + + return result + + def n_parameters(self): + """ + Returns the dimension of the parameter space these boundaries are + defined on. + """ + return len(self.x0) + + def sample(self, n=1): + """ + Returns ``n`` random samples from within the boundaries, for example to + use as starting points for an optimisation. + + The returned value is a NumPy array with shape ``(n, d)`` where ``n`` + is the requested number of samples, and ``d`` is the dimension of the + parameter space these boundaries are defined on. + + *Note that implementing :meth:`sample()` is optional, so some boundary + types may not support it.* + + Parameters + ---------- + n : int + The number of points to sample + """ + raise NotImplementedError diff --git a/pybop/optimisers/scipy_minimize.py b/pybop/optimisers/scipy_minimize.py index bb9500135..d8b19e7c6 100644 --- a/pybop/optimisers/scipy_minimize.py +++ b/pybop/optimisers/scipy_minimize.py @@ -4,38 +4,50 @@ class SciPyMinimize(BaseOptimiser): """ - Wrapper class for the Scipy optimiser class. Extends the BaseOptimiser class. + Wrapper class for the SciPy optimisation class. Extends the BaseOptimiser class. """ - def __init__(self, cost_function, x0, bounds=None, options=None): + def __init__(self, x0, xtol=None, method=None, options=None): super().__init__() - self.cost_function = cost_function - self.method = options.optmethod - self.x0 = x0 or cost_function.x0 - self.bounds = bounds - self.options = options self.name = "Scipy Optimiser" - def _runoptimise(self): + if method is None: + self.method = method + else: + self.method = "BFGS" + + if xtol is not None: + self.xtol = xtol + else: + self.xtol = 1e-5 + + self.options = options + + def _runoptimise(self, cost_function, x0, bounds): """ - Run the Scipy opt method. + Run the SciPy optimisation method. - Parameters + Inputs ---------- cost_function: function for optimising - method: optimisation method - x0: Initialisation array - options: options dictionary + method: optimisation algorithm + x0: initialisation array bounds: bounds array """ - if self.method is not None and self.bounds is not None: - opt = minimize( - self.cost_function, self.x0, method=self.method, bounds=self.bounds - ) - elif self.method is not None: - opt = minimize(self.cost_function, self.x0, method=self.method) - else: - opt = minimize(self.cost_function, self.x0, method="BFGS") + # Reformat bounds + bounds = ( + (lower, upper) for lower, upper in zip(bounds["lower"], bounds["upper"]) + ) + + # Run the optimser + output = minimize( + cost_function, x0, method=self.method, bounds=bounds, tol=self.xtol + ) + + # Get performance statistics + x = output.x + final_cost = output.fun + num_evals = output.nfev - return opt + return x, output, final_cost, num_evals diff --git a/pybop/parameters/base_parameter.py b/pybop/parameters/base_parameter.py index c6b2e6cdf..b1fafb857 100644 --- a/pybop/parameters/base_parameter.py +++ b/pybop/parameters/base_parameter.py @@ -1,6 +1,6 @@ class Parameter: """ "" - Class for creating parameters in pybop. + Class for creating parameters in PyBOP. """ def __init__(self, name, value=None, prior=None, bounds=None): diff --git a/pybop/parameters/base_parameter_set.py b/pybop/parameters/base_parameter_set.py index e67b175ce..59172b3ba 100644 --- a/pybop/parameters/base_parameter_set.py +++ b/pybop/parameters/base_parameter_set.py @@ -3,7 +3,7 @@ class ParameterSet: """ - Class for creating parameter sets in pybop. + Class for creating parameter sets in PyBOP. """ def __new__(cls, method, name): diff --git a/tests/unit/test_parameterisations.py b/tests/unit/test_parameterisations.py index 73078ec1d..5ea901583 100644 --- a/tests/unit/test_parameterisations.py +++ b/tests/unit/test_parameterisations.py @@ -58,11 +58,11 @@ def test_spm(self): ) # Run the optimisation problem - results, last_optim, num_evals = parameterisation.run() + x, _, final_cost, _ = parameterisation.run() # Assertions (for testing purposes only) - np.testing.assert_allclose(last_optim, 0, atol=1e-2) - np.testing.assert_allclose(results, x0, atol=1e-1) + np.testing.assert_allclose(final_cost, 0, atol=1e-2) + np.testing.assert_allclose(x, x0, atol=1e-1) @pytest.mark.unit def test_spme(self): @@ -112,10 +112,10 @@ def test_spme(self): ) # Run the optimisation problem - results, last_optim, num_evals = parameterisation.run() + x, _, final_cost, _ = parameterisation.run() # Assertions (for testing purposes only) - np.testing.assert_allclose(last_optim, 0, atol=1e-2) - np.testing.assert_allclose(results, x0, rtol=1e-1) + np.testing.assert_allclose(final_cost, 0, atol=1e-2) + np.testing.assert_allclose(x, x0, rtol=1e-1) def getdata(self, model, x0): model.parameter_set = model.pybamm_model.default_parameter_values From cee66641c1a0cbdfe9695d8b3e9b2aa7f06a93e1 Mon Sep 17 00:00:00 2001 From: NicolaCourtier <45851982+NicolaCourtier@users.noreply.github.com> Date: Wed, 1 Nov 2023 11:41:52 +0000 Subject: [PATCH 144/210] Rename fit_parameters to parameters --- examples/scripts/mle.py | 2 +- examples/scripts/rmse_estimation.py | 8 ++++---- pybop/models/base_model.py | 16 ++++++++-------- pybop/optimisation.py | 18 +++++++++--------- tests/unit/test_parameterisations.py | 8 ++++---- 5 files changed, 26 insertions(+), 26 deletions(-) diff --git a/examples/scripts/mle.py b/examples/scripts/mle.py index 1385a8ccd..d440b2767 100644 --- a/examples/scripts/mle.py +++ b/examples/scripts/mle.py @@ -11,7 +11,7 @@ "Positive electrode active material volume fraction": 0.6, } t_eval = np.arange(0, 900, 2) -model.build(fit_parameters=inputs) +model.build(parameters=inputs) values = model.predict(inputs=inputs, t_eval=t_eval) voltage = values["Terminal voltage [V]"].data diff --git a/examples/scripts/rmse_estimation.py b/examples/scripts/rmse_estimation.py index 65a5a8a83..ed00ecfc1 100644 --- a/examples/scripts/rmse_estimation.py +++ b/examples/scripts/rmse_estimation.py @@ -15,7 +15,7 @@ model = pybop.models.lithium_ion.SPM() # Fitting parameters -params = [ +parameters = [ pybop.Parameter( "Negative electrode active material volume fraction", prior=pybop.Gaussian(0.75, 0.05), @@ -33,14 +33,14 @@ signal = "Voltage [V]" # Select optimiser -optimiser = pybop.NLoptOptimize(x0=params) +optimiser = pybop.NLoptOptimize(x0=parameters) # Construct the optimisation problem parameterisation = pybop.Optimisation( cost=cost, model=model, optimiser=optimiser, - fit_parameters=params, + parameters=parameters, dataset=dataset, signal=signal, ) @@ -49,7 +49,7 @@ x, output, final_cost, num_evals = parameterisation.run() # get MAP estimate, starting at a random initial point in parameter space -# parameterisation.map(x0=[p.sample() for p in params]) +# parameterisation.map(x0=[p.sample() for p in parameters]) # or sample from posterior # parameterisation.sample(1000, n_chains=4, ....) diff --git a/pybop/models/base_model.py b/pybop/models/base_model.py index 8dc5652d7..8f76a7483 100644 --- a/pybop/models/base_model.py +++ b/pybop/models/base_model.py @@ -9,13 +9,13 @@ class BaseModel: def __init__(self, name="Base Model"): self.name = name self.pybamm_model = None - self.fit_parameters = None + self.parameters = None self.dataset = None def build( self, dataset=None, - fit_parameters=None, + parameters=None, check_model=True, init_soc=None, ): @@ -24,7 +24,7 @@ def build( For PyBaMM forward models, this method follows a similar process to pybamm.Simulation.build(). """ - self.fit_parameters = fit_parameters + self.parameters = parameters self.dataset = dataset if init_soc is not None: @@ -74,12 +74,12 @@ def set_params(self): if self.model_with_set_params: return - if self.fit_parameters is not None: + if self.parameters is not None: # set input parameters in parameter set from fitting parameters - for i in self.fit_parameters.keys(): + for i in self.parameters.keys(): self.parameter_set[i] = "[input]" - if self.dataset is not None and self.fit_parameters is not None: + if self.dataset is not None and self.parameters is not None: self.parameter_set["Current function [A]"] = pybamm.Interpolant( self.dataset["Time [s]"].data, self.dataset["Current function [A]"].data, @@ -104,7 +104,7 @@ def simulate(self, inputs, t_eval): else: if not isinstance(inputs, dict): inputs_dict = { - key: inputs[i] for i, key in enumerate(self.fit_parameters) + key: inputs[i] for i, key in enumerate(self.parameters) } return self.solver.solve( self.built_model, inputs=inputs_dict, t_eval=t_eval @@ -136,7 +136,7 @@ def n_parameters(self): """ Returns the dimension of the parameter space. """ - return len(self.fit_parameters) + return len(self.parameters) def n_outputs(self): """ diff --git a/pybop/optimisation.py b/pybop/optimisation.py index 75786ffb9..19c35cdd4 100644 --- a/pybop/optimisation.py +++ b/pybop/optimisation.py @@ -12,7 +12,7 @@ def __init__( cost, model, optimiser, - fit_parameters, + parameters, x0=None, dataset=None, signal=None, @@ -28,7 +28,7 @@ def __init__( self.signal = signal self.verbose = verbose self.fit_dict = {} - self.fit_parameters = {o.name: o for o in fit_parameters} + self.parameters = {o.name: o for o in parameters} self.model.n_parameters = len(self.fit_dict) # Check that the dataset contains time and current @@ -38,26 +38,26 @@ def __init__( # Set bounds self.bounds = dict( - lower=[self.fit_parameters[param].bounds[0] for param in self.fit_parameters], - upper=[self.fit_parameters[param].bounds[1] for param in self.fit_parameters], + lower=[self.parameters[param].bounds[0] for param in self.parameters], + upper=[self.parameters[param].bounds[1] for param in self.parameters], ) # Sample from prior for x0 if x0 is None: - self.x0 = np.zeros(len(self.fit_parameters)) - for i, j in enumerate(self.fit_parameters): - self.x0[i] = self.fit_parameters[j].prior.rvs(1)[ + self.x0 = np.zeros(len(self.parameters)) + for i, j in enumerate(self.parameters): + self.x0[i] = self.parameters[j].prior.rvs(1)[ 0 ] # Updt to capture dimensions per parameter # Add the initial values to the parameter definitions - for i, param in enumerate(self.fit_parameters): + for i, param in enumerate(self.parameters): self.fit_dict[param] = {param: self.x0[i]} # Build model with dataset and fitting parameters self.model.build( dataset=self.dataset, - fit_parameters=self.fit_parameters, + parameters=self.parameters, check_model=check_model, init_soc=init_soc, ) diff --git a/tests/unit/test_parameterisations.py b/tests/unit/test_parameterisations.py index b47ccdb5b..9d4db3c88 100644 --- a/tests/unit/test_parameterisations.py +++ b/tests/unit/test_parameterisations.py @@ -27,7 +27,7 @@ def test_spm(self): ] # Fitting parameters - params = [ + parameters = [ pybop.Parameter( "Negative electrode active material volume fraction", prior=pybop.Gaussian(0.5, 0.02), @@ -52,7 +52,7 @@ def test_spm(self): cost=cost, model=model, optimiser=optimiser, - fit_parameters=params, + parameters=parameters, dataset=dataset, signal=signal, ) @@ -81,7 +81,7 @@ def test_spme(self): ] # Fitting parameters - params = [ + parameters = [ pybop.Parameter( "Negative electrode active material volume fraction", prior=pybop.Gaussian(0.5, 0.02), @@ -106,7 +106,7 @@ def test_spme(self): cost=cost, model=model, optimiser=optimiser, - fit_parameters=params, + parameters=parameters, dataset=dataset, signal=signal, ) From 6ca9bfba07d2b7b64ffd999ce139add1c236d293 Mon Sep 17 00:00:00 2001 From: NicolaCourtier <45851982+NicolaCourtier@users.noreply.github.com> Date: Wed, 1 Nov 2023 12:19:26 +0000 Subject: [PATCH 145/210] Separate PyBaMM from BaseModel --- pybop/models/base_model.py | 146 +----------------- pybop/models/lithium_ion/base_echem.py | 6 +- pybop/models/pybamm_model.py | 206 +++++++++++++++++++++++++ 3 files changed, 217 insertions(+), 141 deletions(-) create mode 100644 pybop/models/pybamm_model.py diff --git a/pybop/models/base_model.py b/pybop/models/base_model.py index 8f76a7483..19a69c5fa 100644 --- a/pybop/models/base_model.py +++ b/pybop/models/base_model.py @@ -1,4 +1,4 @@ -import pybamm +import pybop class BaseModel: @@ -8,7 +8,6 @@ class BaseModel: def __init__(self, name="Base Model"): self.name = name - self.pybamm_model = None self.parameters = None self.dataset = None @@ -20,117 +19,32 @@ def build( init_soc=None, ): """ - Build the PyBOP model (if not built already). - For PyBaMM forward models, this method follows a - similar process to pybamm.Simulation.build(). + Build the pybop model (if not built already). """ self.parameters = parameters self.dataset = dataset - if init_soc is not None: - self.set_init_soc(init_soc) - - if self._built_model: - return - - elif self.pybamm_model.is_discretised: - self._model_with_set_params = self.pybamm_model - self._built_model = self.pybamm_model - else: - self.set_params() - self._mesh = pybamm.Mesh(self.geometry, self.submesh_types, self.var_pts) - self._disc = pybamm.Discretisation(self.mesh, self.spatial_methods) - self._built_model = self._disc.process_model( - self._model_with_set_params, inplace=False, check_model=check_model - ) - - # Clear solver - self._solver._model_set_up = {} + raise ValueError("Not yet implemented") def set_init_soc(self, init_soc): """ Set the initial state of charge. """ - if self._built_initial_soc != init_soc: - # reset - self._model_with_set_params = None - self._built_model = None - self.op_conds_to_built_models = None - self.op_conds_to_built_solvers = None - - param = self.pybamm_model.param - self.parameter_set = ( - self._unprocessed_parameter_set.set_initial_stoichiometries( - init_soc, param=param, inplace=False - ) - ) - # Save solved initial SOC in case we need to rebuild the model - self._built_initial_soc = init_soc + raise ValueError("Not yet implemented") def set_params(self): """ - Set the parameters in the model. + Set each parameter in the model either equal to its value + or mark it as an input. """ - if self.model_with_set_params: - return - - if self.parameters is not None: - # set input parameters in parameter set from fitting parameters - for i in self.parameters.keys(): - self.parameter_set[i] = "[input]" - - if self.dataset is not None and self.parameters is not None: - self.parameter_set["Current function [A]"] = pybamm.Interpolant( - self.dataset["Time [s]"].data, - self.dataset["Current function [A]"].data, - pybamm.t, - ) - # Set t_eval - self.time_data = self._parameter_set["Current function [A]"].x[0] - - self._model_with_set_params = self._parameter_set.process_model( - self._unprocessed_model, inplace=False - ) - self._parameter_set.process_geometry(self.geometry) - self.pybamm_model = self._model_with_set_params + raise ValueError("Not yet implemented") def simulate(self, inputs, t_eval): """ Run the forward model and return the result in Numpy array format aligning with Pints' ForwardModel simulate method. """ - if self._built_model is None: - raise ValueError("Model must be built before calling simulate") - else: - if not isinstance(inputs, dict): - inputs_dict = { - key: inputs[i] for i, key in enumerate(self.parameters) - } - return self.solver.solve( - self.built_model, inputs=inputs_dict, t_eval=t_eval - )["Terminal voltage [V]"].data - - def predict(self, inputs=None, t_eval=None, parameter_set=None, experiment=None): - """ - Create a PyBaMM simulation object, solve it, and return a solution object. - """ - parameter_set = parameter_set or self.parameter_set - if inputs is not None: - parameter_set.update(inputs) - if self._unprocessed_model is not None: - if experiment is None: - return pybamm.Simulation( - self._unprocessed_model, - parameter_values=parameter_set, - ).solve(t_eval=t_eval) - else: - return pybamm.Simulation( - self._unprocessed_model, - experiment=experiment, - parameter_values=parameter_set, - ).solve() - else: - raise ValueError("This sim method currently only supports PyBaMM models") + raise ValueError("Not yet implemented") def n_parameters(self): """ @@ -159,47 +73,3 @@ def parameter_set(self, parameter_set): @property def model_with_set_params(self): return self._model_with_set_params - - @property - def geometry(self): - return self._geometry - - @geometry.setter - def geometry(self, geometry): - self._geometry = geometry.copy() - - @property - def submesh_types(self): - return self._submesh_types - - @submesh_types.setter - def submesh_types(self, submesh_types): - self._submesh_types = submesh_types.copy() - - @property - def mesh(self): - return self._mesh - - @property - def var_pts(self): - return self._var_pts - - @var_pts.setter - def var_pts(self, var_pts): - self._var_pts = var_pts.copy() - - @property - def spatial_methods(self): - return self._spatial_methods - - @spatial_methods.setter - def spatial_methods(self, spatial_methods): - self._spatial_methods = spatial_methods.copy() - - @property - def solver(self): - return self._solver - - @solver.setter - def solver(self, solver): - self._solver = solver.copy() diff --git a/pybop/models/lithium_ion/base_echem.py b/pybop/models/lithium_ion/base_echem.py index ffa3b5775..fe5b44d87 100644 --- a/pybop/models/lithium_ion/base_echem.py +++ b/pybop/models/lithium_ion/base_echem.py @@ -1,8 +1,8 @@ import pybamm -from ..base_model import BaseModel +from ..pybamm_model import PybammModel -class SPM(BaseModel): +class SPM(PybammModel): """ Composition of the PyBaMM Single Particle Model class. @@ -42,7 +42,7 @@ def __init__( self._disc = None -class SPMe(BaseModel): +class SPMe(PybammModel): """ Composition of the PyBaMM Single Particle Model with Electrolyte class. diff --git a/pybop/models/pybamm_model.py b/pybop/models/pybamm_model.py new file mode 100644 index 000000000..35c7c2276 --- /dev/null +++ b/pybop/models/pybamm_model.py @@ -0,0 +1,206 @@ +import pybop +import pybamm +from pybop import BaseModel + + +class PybammModel(BaseModel): + """ + Wrapper class for PyBaMM model classes. Extends the BaseModel class. + + """ + + def __init__(self): + super().__init__() + self.pybamm_model = None + + def build( + self, + dataset=None, + parameters=None, + check_model=True, + init_soc=None, + ): + """ + Build the PyBOP model (if not built already). + For PyBaMM forward models, this method follows a + similar process to pybamm.Simulation.build(). + """ + self.parameters = parameters + self.dataset = dataset + + if init_soc is not None: + self.set_init_soc(init_soc) + + if self._built_model: + return + + elif self.pybamm_model.is_discretised: + self._model_with_set_params = self.pybamm_model + self._built_model = self.pybamm_model + else: + self.set_params() + self._mesh = pybamm.Mesh(self.geometry, self.submesh_types, self.var_pts) + self._disc = pybamm.Discretisation(self.mesh, self.spatial_methods) + self._built_model = self._disc.process_model( + self._model_with_set_params, inplace=False, check_model=check_model + ) + + # Clear solver + self._solver._model_set_up = {} + + def set_init_soc(self, init_soc): + """ + Set the initial state of charge. + """ + if self._built_initial_soc != init_soc: + # reset + self._model_with_set_params = None + self._built_model = None + self.op_conds_to_built_models = None + self.op_conds_to_built_solvers = None + + param = self.pybamm_model.param + self.parameter_set = ( + self._unprocessed_parameter_set.set_initial_stoichiometries( + init_soc, param=param, inplace=False + ) + ) + # Save solved initial SOC in case we need to rebuild the model + self._built_initial_soc = init_soc + + def set_params(self): + """ + Set the parameters in the model. + """ + if self.model_with_set_params: + return + + if self.parameters is not None: + # set input parameters in parameter set from fitting parameters + for i in self.parameters.keys(): + self.parameter_set[i] = "[input]" + + if self.dataset is not None and self.parameters is not None: + self.parameter_set["Current function [A]"] = pybamm.Interpolant( + self.dataset["Time [s]"].data, + self.dataset["Current function [A]"].data, + pybamm.t, + ) + # Set t_eval + self.time_data = self._parameter_set["Current function [A]"].x[0] + + self._model_with_set_params = self._parameter_set.process_model( + self._unprocessed_model, inplace=False + ) + self._parameter_set.process_geometry(self.geometry) + self.pybamm_model = self._model_with_set_params + + def simulate(self, inputs, t_eval): + """ + Run the forward model and return the result in Numpy array format + aligning with Pints' ForwardModel simulate method. + """ + if self._built_model is None: + raise ValueError("Model must be built before calling simulate") + else: + if not isinstance(inputs, dict): + inputs_dict = { + key: inputs[i] for i, key in enumerate(self.parameters) + } + return self.solver.solve( + self.built_model, inputs=inputs_dict, t_eval=t_eval + )["Terminal voltage [V]"].data + + def predict(self, inputs=None, t_eval=None, parameter_set=None, experiment=None): + """ + Create a PyBaMM simulation object, solve it, and return a solution object. + """ + parameter_set = parameter_set or self.parameter_set + if inputs is not None: + parameter_set.update(inputs) + if self._unprocessed_model is not None: + if experiment is None: + return pybamm.Simulation( + self._unprocessed_model, + parameter_values=parameter_set, + ).solve(t_eval=t_eval) + else: + return pybamm.Simulation( + self._unprocessed_model, + experiment=experiment, + parameter_values=parameter_set, + ).solve() + else: + raise ValueError("This sim method currently only supports PyBaMM models") + + def n_parameters(self): + """ + Returns the dimension of the parameter space. + """ + return len(self.parameters) + + def n_outputs(self): + """ + Returns the number of outputs this model has. The default is 1. + """ + return 1 + + @property + def built_model(self): + return self._built_model + + @property + def parameter_set(self): + return self._parameter_set + + @parameter_set.setter + def parameter_set(self, parameter_set): + self._parameter_set = parameter_set.copy() + + @property + def model_with_set_params(self): + return self._model_with_set_params + + @property + def geometry(self): + return self._geometry + + @geometry.setter + def geometry(self, geometry): + self._geometry = geometry.copy() + + @property + def submesh_types(self): + return self._submesh_types + + @submesh_types.setter + def submesh_types(self, submesh_types): + self._submesh_types = submesh_types.copy() + + @property + def mesh(self): + return self._mesh + + @property + def var_pts(self): + return self._var_pts + + @var_pts.setter + def var_pts(self, var_pts): + self._var_pts = var_pts.copy() + + @property + def spatial_methods(self): + return self._spatial_methods + + @spatial_methods.setter + def spatial_methods(self, spatial_methods): + self._spatial_methods = spatial_methods.copy() + + @property + def solver(self): + return self._solver + + @solver.setter + def solver(self, solver): + self._solver = solver.copy() From 05a45d5bb4decbeec385fd604cd2cdd3575a9ffa Mon Sep 17 00:00:00 2001 From: NicolaCourtier <45851982+NicolaCourtier@users.noreply.github.com> Date: Wed, 1 Nov 2023 13:16:41 +0000 Subject: [PATCH 146/210] Rename opt to optim To avoid potential confusion with 'options'. --- pybop/optimisers/nlopt_optimize.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/pybop/optimisers/nlopt_optimize.py b/pybop/optimisers/nlopt_optimize.py index d766f376a..e40aa2bf7 100644 --- a/pybop/optimisers/nlopt_optimize.py +++ b/pybop/optimisers/nlopt_optimize.py @@ -13,14 +13,14 @@ def __init__(self, method=None, x0=None, xtol=None): self.name = "NLOpt Optimiser" if method is not None: - self.opt = nlopt.opt(method, len(x0)) + self.optim = nlopt.opt(method, len(x0)) else: - self.opt = nlopt.opt(nlopt.LN_BOBYQA, len(x0)) + self.optim = nlopt.opt(nlopt.LN_BOBYQA, len(x0)) if xtol is not None: - self.opt.set_xtol_rel(xtol) + self.optim.set_xtol_rel(xtol) else: - self.opt.set_xtol_rel(1e-5) + self.optim.set_xtol_rel(1e-5) def _runoptimise(self, cost_function, x0, bounds): """ @@ -34,16 +34,16 @@ def _runoptimise(self, cost_function, x0, bounds): bounds: bounds array """ - self.opt.set_min_objective(cost_function) - self.opt.set_lower_bounds(bounds["lower"]) - self.opt.set_upper_bounds(bounds["upper"]) + self.optim.set_min_objective(cost_function) + self.optim.set_lower_bounds(bounds["lower"]) + self.optim.set_upper_bounds(bounds["upper"]) # Run the optimser - x = self.opt.optimize(x0) + x = self.optim.optimize(x0) # Get performance statistics - output = self.opt - final_cost = self.opt.last_optimum_value() - num_evals = self.opt.get_numevals() + output = self.optim + final_cost = self.optim.last_optimum_value() + num_evals = self.optim.get_numevals() return x, output, final_cost, num_evals From 79b1907cefe4837606cacd41941c9ae7dae06351 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Wed, 1 Nov 2023 14:58:06 +0000 Subject: [PATCH 147/210] Updt nlopt initialisation args, Updt default pints method --- examples/scripts/rmse_estimation.py | 4 +--- pybop/optimisers/base_optimiser.py | 4 ++-- pybop/optimisers/nlopt_optimize.py | 6 +++--- pybop/optimisers/pints_optimiser.py | 9 +++++---- tests/unit/test_parameterisations.py | 4 ++-- 5 files changed, 13 insertions(+), 14 deletions(-) diff --git a/examples/scripts/rmse_estimation.py b/examples/scripts/rmse_estimation.py index 987e899a0..49d134fe6 100644 --- a/examples/scripts/rmse_estimation.py +++ b/examples/scripts/rmse_estimation.py @@ -1,6 +1,5 @@ import pybop import pandas as pd -import numpy as np # Form observations Measurements = pd.read_csv("examples/scripts/Chen_example.csv", comment="#").to_numpy() @@ -28,7 +27,6 @@ ), ] -x0 = np.array([0.52, 0.63]) # Define the cost to optimise cost = pybop.RMSE() signal = "Voltage [V]" @@ -38,7 +36,7 @@ parameterisation = pybop.Optimisation( cost=cost, model=model, - optimiser=pybop.NLoptOptimize(x0=x0), + optimiser=pybop.NLoptOptimize(n_param=len(parameters)), parameters=parameters, dataset=dataset, signal=signal, diff --git a/pybop/optimisers/base_optimiser.py b/pybop/optimisers/base_optimiser.py index dec1495f6..43d8a891f 100644 --- a/pybop/optimisers/base_optimiser.py +++ b/pybop/optimisers/base_optimiser.py @@ -8,7 +8,7 @@ class BaseOptimiser: def __init__(self): self.name = "Base Optimiser" - def optimise(self, cost_function, x0, bounds): + def optimise(self, cost_function, x0=None, bounds=None): """ Optimisiation method to be overloaded by child classes. @@ -22,7 +22,7 @@ def optimise(self, cost_function, x0, bounds): return result - def _runoptimise(self, cost_function, x0, bounds): + def _runoptimise(self, cost_function, x0=None, bounds=None): """ Run optimisation method, to be overloaded by child classes. diff --git a/pybop/optimisers/nlopt_optimize.py b/pybop/optimisers/nlopt_optimize.py index 8e7fd9c4a..83c62d051 100644 --- a/pybop/optimisers/nlopt_optimize.py +++ b/pybop/optimisers/nlopt_optimize.py @@ -7,14 +7,14 @@ class NLoptOptimize(BaseOptimiser): Wrapper class for the NLOpt optimiser class. Extends the BaseOptimiser class. """ - def __init__(self, x0, xtol=None, method=None): + def __init__(self, n_param, xtol=None, method=None): super().__init__() self.name = "NLOpt Optimiser" if method is not None: - self.optim = nlopt.opt(method, len(x0)) + self.optim = nlopt.opt(method, n_param) else: - self.optim = nlopt.opt(nlopt.LN_BOBYQA, len(x0)) + self.optim = nlopt.opt(nlopt.LN_BOBYQA, n_param) if xtol is not None: self.optim.set_xtol_rel(xtol) diff --git a/pybop/optimisers/pints_optimiser.py b/pybop/optimisers/pints_optimiser.py index a36f93856..4aa52d746 100644 --- a/pybop/optimisers/pints_optimiser.py +++ b/pybop/optimisers/pints_optimiser.py @@ -6,19 +6,19 @@ class PintsOptimiser(BaseOptimiser): """ - Wrapper class for the PINTS optimisation class. Extends the BaseOptimiser class. + Class for the PINTS optimisation. Extends the BaseOptimiser class. """ - def __init__(self, x0, xtol=None, method=None): + def __init__(self, x0=None, xtol=None, method=None): super().__init__() self.name = "PINTS Optimiser" if method is not None: self.method = method else: - self.method = pints.PSO + self.method = pints.CMAES - def _runoptimise(self, cost_function, x0, bounds): + def _runoptimise(self, cost_function, x0, bounds=None): """ Run the PINTS optimisation method. @@ -40,6 +40,7 @@ def _runoptimise(self, cost_function, x0, bounds): controller = pints.OptimisationController( error, x0, boundaries=boundaries, method=self.method ) + controller.set_max_unchanged_iterations(20) # default 200 # Run the optimser diff --git a/tests/unit/test_parameterisations.py b/tests/unit/test_parameterisations.py index 5ea901583..3aef9e92f 100644 --- a/tests/unit/test_parameterisations.py +++ b/tests/unit/test_parameterisations.py @@ -45,7 +45,7 @@ def test_spm(self): signal = "Voltage [V]" # Select optimiser - optimiser = pybop.NLoptOptimize(x0=x0) + optimiser = pybop.NLoptOptimize(n_param=len(parameters)) # Build the optimisation problem parameterisation = pybop.Optimisation( @@ -99,7 +99,7 @@ def test_spme(self): signal = "Voltage [V]" # Select optimiser - optimiser = pybop.NLoptOptimize(x0=x0) + optimiser = pybop.NLoptOptimize(n_param=len(parameters)) # Build the optimisation problem parameterisation = pybop.Optimisation( From 34ffca47e783ee95c1d98aadc3a32e0ab89c7837 Mon Sep 17 00:00:00 2001 From: NicolaCourtier <45851982+NicolaCourtier@users.noreply.github.com> Date: Wed, 1 Nov 2023 15:56:07 +0000 Subject: [PATCH 148/210] Update parameters --- pybop/models/base_model.py | 4 +- pybop/models/pybamm_model.py | 28 +++--- pybop/optimisation.py | 25 +++-- pybop/optimisers/base_optimiser.py | 3 +- pybop/optimisers/nlopt_optimize.py | 4 +- pybop/optimisers/scipy_minimize.py | 38 ++++--- tests/unit/test_parameterisation.py | 147 ++++++++++++++++++++++++++++ 7 files changed, 198 insertions(+), 51 deletions(-) create mode 100644 tests/unit/test_parameterisation.py diff --git a/pybop/models/base_model.py b/pybop/models/base_model.py index 19a69c5fa..69557b7ef 100644 --- a/pybop/models/base_model.py +++ b/pybop/models/base_model.py @@ -8,8 +8,6 @@ class BaseModel: def __init__(self, name="Base Model"): self.name = name - self.parameters = None - self.dataset = None def build( self, @@ -21,8 +19,8 @@ def build( """ Build the pybop model (if not built already). """ - self.parameters = parameters self.dataset = dataset + self.parameters = parameters raise ValueError("Not yet implemented") diff --git a/pybop/models/pybamm_model.py b/pybop/models/pybamm_model.py index 35c7c2276..a859cab7d 100644 --- a/pybop/models/pybamm_model.py +++ b/pybop/models/pybamm_model.py @@ -16,17 +16,19 @@ def __init__(self): def build( self, dataset=None, + experiment=None, parameters=None, check_model=True, init_soc=None, ): """ - Build the PyBOP model (if not built already). + Build the pybop model (if not built already). For PyBaMM forward models, this method follows a similar process to pybamm.Simulation.build(). """ - self.parameters = parameters self.dataset = dataset + self.experiment = experiment + self.parameters = parameters if init_soc is not None: self.set_init_soc(init_soc) @@ -37,6 +39,7 @@ def build( elif self.pybamm_model.is_discretised: self._model_with_set_params = self.pybamm_model self._built_model = self.pybamm_model + else: self.set_params() self._mesh = pybamm.Mesh(self.geometry, self.submesh_types, self.var_pts) @@ -70,15 +73,16 @@ def set_init_soc(self, init_soc): def set_params(self): """ - Set the parameters in the model. + Set each parameter in the model either equal to its value + or mark it as an input. """ if self.model_with_set_params: return if self.parameters is not None: - # set input parameters in parameter set from fitting parameters - for i in self.parameters.keys(): - self.parameter_set[i] = "[input]" + # Set input parameters in parameter set from fitting parameters + for param in self.parameters: + self.parameter_set[param.name] = "[input]" if self.dataset is not None and self.parameters is not None: self.parameter_set["Current function [A]"] = pybamm.Interpolant( @@ -86,8 +90,8 @@ def set_params(self): self.dataset["Current function [A]"].data, pybamm.t, ) - # Set t_eval - self.time_data = self._parameter_set["Current function [A]"].x[0] + # Set times + self.times = self._parameter_set["Current function [A]"].x[0] self._model_with_set_params = self._parameter_set.process_model( self._unprocessed_model, inplace=False @@ -107,9 +111,10 @@ def simulate(self, inputs, t_eval): inputs_dict = { key: inputs[i] for i, key in enumerate(self.parameters) } - return self.solver.solve( + prediction = self.solver.solve( self.built_model, inputs=inputs_dict, t_eval=t_eval )["Terminal voltage [V]"].data + return prediction def predict(self, inputs=None, t_eval=None, parameter_set=None, experiment=None): """ @@ -120,16 +125,17 @@ def predict(self, inputs=None, t_eval=None, parameter_set=None, experiment=None) parameter_set.update(inputs) if self._unprocessed_model is not None: if experiment is None: - return pybamm.Simulation( + prediction = pybamm.Simulation( self._unprocessed_model, parameter_values=parameter_set, ).solve(t_eval=t_eval) else: - return pybamm.Simulation( + prediction = pybamm.Simulation( self._unprocessed_model, experiment=experiment, parameter_values=parameter_set, ).solve() + return prediction else: raise ValueError("This sim method currently only supports PyBaMM models") diff --git a/pybop/optimisation.py b/pybop/optimisation.py index 19c35cdd4..7d94ecc71 100644 --- a/pybop/optimisation.py +++ b/pybop/optimisation.py @@ -23,13 +23,13 @@ def __init__( self.cost = cost self.model = model self.optimiser = optimiser + self.parameters = parameters self.x0 = x0 self.dataset = {o.name: o for o in dataset} self.signal = signal + self.n_parameters = len(self.parameters) self.verbose = verbose self.fit_dict = {} - self.parameters = {o.name: o for o in parameters} - self.model.n_parameters = len(self.fit_dict) # Check that the dataset contains time and current for name in ["Time [s]", "Current function [A]"]: @@ -38,21 +38,20 @@ def __init__( # Set bounds self.bounds = dict( - lower=[self.parameters[param].bounds[0] for param in self.parameters], - upper=[self.parameters[param].bounds[1] for param in self.parameters], + lower=[param.bounds[0] for param in self.parameters], + upper=[param.bounds[1] for param in self.parameters], ) # Sample from prior for x0 if x0 is None: - self.x0 = np.zeros(len(self.parameters)) - for i, j in enumerate(self.parameters): - self.x0[i] = self.parameters[j].prior.rvs(1)[ - 0 - ] # Updt to capture dimensions per parameter + self.x0 = np.zeros(self.n_parameters) + for i, param in enumerate(self.parameters): + self.x0[i] = param.prior.rvs(1)[0] + # Update to capture dimensions per parameter - # Add the initial values to the parameter definitions + # Populate the fit dictionary for i, param in enumerate(self.parameters): - self.fit_dict[param] = {param: self.x0[i]} + self.fit_dict[param.name] = {param.name: self.x0[i]} # Build model with dataset and fitting parameters self.model.build( @@ -84,8 +83,8 @@ def cost_function(self, x, grad=None): target = self.dataset[self.signal].data # Update the parameter dictionary - for i, param in enumerate(self.fit_dict): - self.fit_dict[param] = x[i] + for i, key in enumerate(self.fit_dict): + self.fit_dict[key] = x[i] # Make prediction prediction = self.model.predict(inputs=self.fit_dict)[self.signal].data diff --git a/pybop/optimisers/base_optimiser.py b/pybop/optimisers/base_optimiser.py index df6e253e5..dec1495f6 100644 --- a/pybop/optimisers/base_optimiser.py +++ b/pybop/optimisers/base_optimiser.py @@ -8,14 +8,13 @@ class BaseOptimiser: def __init__(self): self.name = "Base Optimiser" - def optimise(self, cost_function, x0, bounds, method=None): + def optimise(self, cost_function, x0, bounds): """ Optimisiation method to be overloaded by child classes. """ self.cost_function = cost_function self.x0 = x0 - self.method = method self.bounds = bounds # Run optimisation diff --git a/pybop/optimisers/nlopt_optimize.py b/pybop/optimisers/nlopt_optimize.py index e40aa2bf7..8a48d30a3 100644 --- a/pybop/optimisers/nlopt_optimize.py +++ b/pybop/optimisers/nlopt_optimize.py @@ -8,8 +8,10 @@ class NLoptOptimize(BaseOptimiser): Wrapper class for the NLOpt optimiser class. Extends the BaseOptimiser class. """ - def __init__(self, method=None, x0=None, xtol=None): + def __init__(self, x0, method=None, xtol=None): super().__init__() + self.method = method + self.x0 = x0 self.name = "NLOpt Optimiser" if method is not None: diff --git a/pybop/optimisers/scipy_minimize.py b/pybop/optimisers/scipy_minimize.py index b9a282839..c3b8919d1 100644 --- a/pybop/optimisers/scipy_minimize.py +++ b/pybop/optimisers/scipy_minimize.py @@ -8,16 +8,17 @@ class SciPyMinimize(BaseOptimiser): Wrapper class for the SciPy optimisation class. Extends the BaseOptimiser class. """ - def __init__(self, cost_function, x0, bounds=None, options=None): + def __init__(self, x0, method=None, bounds=None): super().__init__() - self.cost_function = cost_function - self.method = options.optmethod - self.x0 = x0 or cost_function.x0 + self.method = method + self.x0 = x0 self.bounds = bounds - self.options = options - self.name = "Scipy Optimiser" + self.name = "SciPy Optimiser" - def _runoptimise(self): + if self.method is None: + self.method = "BFGS" + + def _runoptimise(self, cost_function, x0, bounds): """ Run the SciPy optimisation method. @@ -29,23 +30,18 @@ def _runoptimise(self): bounds: bounds array """ - if self.method is not None: - method=self.method - else: - opt = minimize(self.cost_function, self.x0, method="BFGS") - - # Reformat bounds - bounds = ( - (lower, upper) for lower, upper in zip(bounds["lower"], bounds["upper"]) - ) - - # Run the optimser - if self.bounds is not None: + if bounds is not None: + # Reformat bounds and run the optimser + bounds = ( + (lower, upper) for lower, upper in zip(bounds["lower"], bounds["upper"]) + ) output = minimize( - self.cost_function, self.x0, method=method, bounds=self.bounds, tol=self.xtol + cost_function, x0, method=self.method, bounds=bounds ) else: - output = minimize(self.cost_function, self.x0, method=method, tol=self.xtol) + output = minimize( + cost_function, x0, method=self.method + ) # Get performance statistics x = output.x diff --git a/tests/unit/test_parameterisation.py b/tests/unit/test_parameterisation.py new file mode 100644 index 000000000..bf8eecf13 --- /dev/null +++ b/tests/unit/test_parameterisation.py @@ -0,0 +1,147 @@ +import unittest +import pybop +import pybamm +import pytest +import numpy as np + + +class TestParameterisation(unittest.TestCase): + """ + A class to test the model parameterisation methods. + """ + + def getdata(self, model, x0): + # Update fitting parameters + model.parameter_set.update( + { + "Negative electrode active material volume fraction": x0[0], + "Positive electrode active material volume fraction": x0[1], + } + ) + + # Define experimental protocol + experiment = pybamm.Experiment( + [ + ( + "Discharge at 2C for 5 minutes (1 second period)", + "Rest for 2 minutes (1 second period)", + "Charge at 1C for 5 minutes (1 second period)", + "Rest for 2 minutes (1 second period)", + ), + ] + * 2 + ) + + # Simulate model to generate test dataset + prediction = model.predict(experiment=experiment) + return prediction + + @pytest.mark.unit + def test_spm_nlopt(self): + # Define model + model = pybop.lithium_ion.SPM() + model.parameter_set = model.pybamm_model.default_parameter_values + + # Form dataset + x0 = np.array([0.52, 0.63]) + solution = self.getdata(model, x0) + dataset = [ + pybop.Dataset("Time [s]", solution["Time [s]"].data), + pybop.Dataset("Current function [A]", solution["Current [A]"].data), + pybop.Dataset("Voltage [V]", solution["Terminal voltage [V]"].data), + ] + + # Define fitting parameters + parameters = [ + pybop.Parameter( + name="Negative electrode active material volume fraction", + prior=pybop.Gaussian(0.5, 0.02), + bounds=[0.375, 0.625], + ), + pybop.Parameter( + name="Positive electrode active material volume fraction", + prior=pybop.Gaussian(0.65, 0.02), + bounds=[0.525, 0.75], + ), + ] + + # Define the cost to optimise + cost = pybop.RMSE() + signal = "Voltage [V]" + + # Select optimiser + optimiser = pybop.NLoptOptimize(x0=x0) + + # Build the optimisation problem + parameterisation = pybop.Optimisation( + cost=cost, + model=model, + optimiser=optimiser, + parameters=parameters, + dataset=dataset, + signal=signal, + ) + + # Run the optimisation problem + x, output, final_cost, num_evals = parameterisation.run() + + # Check assertions + np.testing.assert_allclose(final_cost, 1e-3, atol=1e-2) + np.testing.assert_allclose(x, x0, atol=1e-1) + + @pytest.mark.unit + def test_spme_scipy(self): + # Define model + model = pybop.lithium_ion.SPMe() + model.parameter_set = model.pybamm_model.default_parameter_values + + # Form dataset + x0 = np.array([0.52, 0.63]) + solution = self.getdata(model, x0) + dataset = [ + pybop.Dataset("Time [s]", solution["Time [s]"].data), + pybop.Dataset("Current function [A]", solution["Current [A]"].data), + pybop.Dataset("Voltage [V]", solution["Terminal voltage [V]"].data), + ] + + # Define fitting parameters + parameters = [ + pybop.Parameter( + name="Negative electrode active material volume fraction", + prior=pybop.Gaussian(0.5, 0.02), + bounds=[0.375, 0.625], + ), + pybop.Parameter( + name="Positive electrode active material volume fraction", + prior=pybop.Gaussian(0.65, 0.02), + bounds=[0.525, 0.75], + ), + ] + + # Define the cost to optimise + cost = pybop.RMSE() + signal = "Voltage [V]" + + # Select optimiser + optimiser = pybop.SciPyMinimize(x0=x0) + + # Build the optimisation problem + parameterisation = pybop.Optimisation( + cost=cost, + model=model, + optimiser=optimiser, + parameters=parameters, + dataset=dataset, + signal=signal, + ) + + # Run the optimisation problem + x, output, final_cost, num_evals = parameterisation.run() + + # Check assertions + np.testing.assert_allclose(final_cost, 1e-3, atol=1e-2) + np.testing.assert_allclose(x, x0, atol=1e-1) + + +if __name__ == "__main__": + unittest.main() From 6e67e5e77cc7a6d184254bad4eb8d2f2e87a3668 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Wed, 1 Nov 2023 15:58:03 +0000 Subject: [PATCH 149/210] Add problem class, Add modularity to output of model.simulateS1() --- pybop/__init__.py | 5 +++ pybop/_problem.py | 63 ++++++++++++++++++++++++++++++++++++++ pybop/models/base_model.py | 2 +- 3 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 pybop/_problem.py diff --git a/pybop/__init__.py b/pybop/__init__.py index e00e3d3c1..70cf0f7ea 100644 --- a/pybop/__init__.py +++ b/pybop/__init__.py @@ -59,6 +59,11 @@ from .parameters.base_parameter_set import ParameterSet from .parameters.priors import Gaussian, Uniform, Exponential +# +# Problem class +# +from ._problem import SingleOutputProblem + # # Plotting class # diff --git a/pybop/_problem.py b/pybop/_problem.py new file mode 100644 index 000000000..894c92300 --- /dev/null +++ b/pybop/_problem.py @@ -0,0 +1,63 @@ +import numpy as np + + +class SingleOutputProblem: + """ + Defines a PyBOP single output problem, follows the PINTS interface. + """ + + def __init__(self, model, parameters, signal, dataset): + self._model = model + self.parameters = parameters + self.signal = signal + self._dataset = dataset + + if self._model._built_model is None: + self._model.build(fit_parameters=self.parameters) + + for item in self._dataset: + if item.name == "Time [s]": + self._time_data_available = True + self._time_data = self._dataset[item] + + if item.name == signal: + self._ground_truth = self._dataset[item] + + if self._time_data_available is False: + raise ValueError("Dataset must contain time data") + + if np.any(self._time_data < 0): + raise ValueError("Times can not be negative.") + if np.any(self._time_data[:-1] >= self._time_data[1:]): + raise ValueError("Times must be increasing.") + + self._ground_truth = self._dataset[self.signal] + + if len(self._ground_truth) != len(self._time_data): + raise ValueError("Time data and signal data must be the same length.") + + def evaluate(self, parameters): + """ + Evaluate the model with the given parameters and return the signal. + """ + + y = np.asarray(self._model.simulate(inputs=parameters, t_eval=self.model.time_data)[ + self.signal + ].data) + + return y + + def evaluateS1(self, parameters): + """ + Evaluate the model with the given parameters and return the signal and + its derivatives. + """ + + y, dy_dp = self._model.simulateS1( + inputs=parameters, t_eval=self.model.time_data, calculate_sensitivities=True + )[self.signal] + + return ( + np.asarray(y), + np.asarray(dy_dp) + ) diff --git a/pybop/models/base_model.py b/pybop/models/base_model.py index 3ddd904c1..91a4d9664 100644 --- a/pybop/models/base_model.py +++ b/pybop/models/base_model.py @@ -144,7 +144,7 @@ def simulateS1(self, inputs, t_eval): return ( sol["Terminal voltage [V]"].data, - np.array( + np.asarray( [ sol["Terminal voltage [V]"].sensitivities[key].toarray() for key in self.fit_keys From 3b65b0225bbcd07e395e2a5f288dee97d2770e0b Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 2 Nov 2023 10:37:48 +0000 Subject: [PATCH 150/210] Add tests for problem class, SciPyMinimize, reduce example/ runtimes, bugfix problem class --- examples/scripts/grad_descent.py | 2 +- examples/scripts/mle.py | 2 +- pybop/_problem.py | 10 ++--- pybop/optimisers/scipy_minimize.py | 3 +- tests/unit/test_parameterisations.py | 41 ++++++++++-------- tests/unit/test_problem.py | 63 ++++++++++++++++++++++++++++ 6 files changed, 93 insertions(+), 28 deletions(-) create mode 100644 tests/unit/test_problem.py diff --git a/examples/scripts/grad_descent.py b/examples/scripts/grad_descent.py index 115b23258..6e62f9b18 100644 --- a/examples/scripts/grad_descent.py +++ b/examples/scripts/grad_descent.py @@ -10,7 +10,7 @@ "Positive electrode active material volume fraction": 0.44, "Current function [A]": 1, } -t_eval = np.arange(0, 1200, 2) +t_eval = np.arange(0, 900, 2) model.build(fit_parameters=inputs) values = model.predict(inputs=inputs, t_eval=t_eval) diff --git a/examples/scripts/mle.py b/examples/scripts/mle.py index e20ccf55b..a508ffa46 100644 --- a/examples/scripts/mle.py +++ b/examples/scripts/mle.py @@ -10,7 +10,7 @@ "Positive electrode active material volume fraction": 0.44, "Current function [A]": 1, } -t_eval = np.arange(0, 1200, 2) +t_eval = np.arange(0, 900, 2) model.build(fit_parameters=inputs) values = model.predict(inputs=inputs, t_eval=t_eval) diff --git a/pybop/_problem.py b/pybop/_problem.py index 9456f4461..979f1a2ff 100644 --- a/pybop/_problem.py +++ b/pybop/_problem.py @@ -8,20 +8,20 @@ class SingleOutputProblem: def __init__(self, model, parameters, signal, dataset): self._model = model - self.parameters = parameters + self.parameters = {o.name: o for o in parameters} self.signal = signal self._dataset = dataset if self._model._built_model is None: self._model.build(fit_parameters=self.parameters) - for item in self._dataset: + for i, item in enumerate(self._dataset): if item.name == "Time [s]": self._time_data_available = True - self._time_data = self._dataset[item] + self._time_data = self._dataset[i].data if item.name == signal: - self._ground_truth = self._dataset[item] + self._ground_truth = self._dataset[i].data if self._time_data_available is False: raise ValueError("Dataset must contain time data") @@ -31,8 +31,6 @@ def __init__(self, model, parameters, signal, dataset): if np.any(self._time_data[:-1] >= self._time_data[1:]): raise ValueError("Times must be increasing.") - self._ground_truth = self._dataset[self.signal] - if len(self._ground_truth) != len(self._time_data): raise ValueError("Time data and signal data must be the same length.") diff --git a/pybop/optimisers/scipy_minimize.py b/pybop/optimisers/scipy_minimize.py index d8391276f..1b1ae6351 100644 --- a/pybop/optimisers/scipy_minimize.py +++ b/pybop/optimisers/scipy_minimize.py @@ -7,10 +7,9 @@ class SciPyMinimize(BaseOptimiser): Wrapper class for the SciPy optimisation class. Extends the BaseOptimiser class. """ - def __init__(self, x0, method=None, bounds=None): + def __init__(self, method=None, bounds=None): super().__init__() self.method = method - self.x0 = x0 self.bounds = bounds self.name = "SciPy Optimiser" diff --git a/tests/unit/test_parameterisations.py b/tests/unit/test_parameterisations.py index bd2884e6a..9f5e3f042 100644 --- a/tests/unit/test_parameterisations.py +++ b/tests/unit/test_parameterisations.py @@ -65,7 +65,7 @@ def test_spm(self): np.testing.assert_allclose(x, x0, atol=1e-1) @pytest.mark.unit - def test_spme(self): + def test_spme_multiple_optimisers(self): # Define model model = pybop.lithium_ion.SPMe() model.parameter_set = model.pybamm_model.default_parameter_values @@ -98,24 +98,29 @@ def test_spme(self): cost = pybop.RMSE() signal = "Voltage [V]" - # Select optimiser - optimiser = pybop.NLoptOptimize(n_param=len(parameters)) - - # Build the optimisation problem - parameterisation = pybop.Optimisation( - cost=cost, - model=model, - optimiser=optimiser, - parameters=parameters, - dataset=dataset, - signal=signal, - ) + # Select optimisers + optimisers = [ + pybop.NLoptOptimize(n_param=len(parameters)), + pybop.SciPyMinimize() + ] - # Run the optimisation problem - x, _, final_cost, _ = parameterisation.run() - # Assertions (for testing purposes only) - np.testing.assert_allclose(final_cost, 0, atol=1e-2) - np.testing.assert_allclose(x, x0, rtol=1e-1) + # Test each optimiser + for optimiser in optimisers: + + parameterisation = pybop.Optimisation( + cost=cost, + model=model, + optimiser=optimiser, + parameters=parameters, + dataset=dataset, + signal=signal, + ) + + # Run the optimisation problem + x, _, final_cost, _ = parameterisation.run() + # Assertions (for testing purposes only) + np.testing.assert_allclose(final_cost, 0, atol=1e-2) + np.testing.assert_allclose(x, x0, rtol=1e-1) def getdata(self, model, x0): model.parameter_set = model.pybamm_model.default_parameter_values diff --git a/tests/unit/test_problem.py b/tests/unit/test_problem.py new file mode 100644 index 000000000..f117b313f --- /dev/null +++ b/tests/unit/test_problem.py @@ -0,0 +1,63 @@ +import pybop +import numpy as np +import pybamm + + +class TestProblem: + """ + A class to test the problem class. + """ + def test_problem(self): + # Define model + model = pybop.lithium_ion.SPM() + parameters = [ + pybop.Parameter( + "Negative electrode active material volume fraction", + prior=pybop.Gaussian(0.5, 0.02), + bounds=[0.375, 0.625], + ), + pybop.Parameter( + "Positive electrode active material volume fraction", + prior=pybop.Gaussian(0.65, 0.02), + bounds=[0.525, 0.75], + ), + ] + signal = "Voltage [V]" + + # Form dataset + x0 = np.array([0.52, 0.63]) + solution = self.getdata(model, x0) + + dataset = [ + pybop.Dataset("Time [s]", solution["Time [s]"].data), + pybop.Dataset("Current function [A]", solution["Current [A]"].data), + pybop.Dataset("Voltage [V]", solution["Terminal voltage [V]"].data), + ] + + problem = pybop.SingleOutputProblem(model, parameters, signal, dataset) + + assert problem._model == model + assert problem._dataset == dataset + + def getdata(self, model, x0): + model.parameter_set = model.pybamm_model.default_parameter_values + + model.parameter_set.update( + { + "Negative electrode active material volume fraction": x0[0], + "Positive electrode active material volume fraction": x0[1], + } + ) + experiment = pybamm.Experiment( + [ + ( + "Discharge at 2C for 5 minutes (1 second period)", + "Rest for 2 minutes (1 second period)", + "Charge at 1C for 5 minutes (1 second period)", + "Rest for 2 minutes (1 second period)", + ), + ] + * 2 + ) + sim = model.predict(experiment=experiment) + return sim From 4d84cb3499ffb4d3ccb87609f26d835f07cd0831 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 2 Nov 2023 12:56:46 +0000 Subject: [PATCH 151/210] Add tests for costs, improve priors and problem tests --- pybop/__init__.py | 2 +- tests/unit/test_cost.py | 44 ++++++++++++++++++++++++++++++++++++++ tests/unit/test_priors.py | 11 ++++++++++ tests/unit/test_problem.py | 3 +++ 4 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 tests/unit/test_cost.py diff --git a/pybop/__init__.py b/pybop/__init__.py index 70cf0f7ea..6d17e5102 100644 --- a/pybop/__init__.py +++ b/pybop/__init__.py @@ -26,7 +26,7 @@ # # Cost function class # -from .costs.error_costs import RMSE +from .costs.error_costs import RMSE, MLE, PEM, MAP # # Dataset class diff --git a/tests/unit/test_cost.py b/tests/unit/test_cost.py new file mode 100644 index 000000000..021877689 --- /dev/null +++ b/tests/unit/test_cost.py @@ -0,0 +1,44 @@ +import pytest +import pybop +import numpy as np + +class TestCosts: + """ + Class for tests cost functions + """ + + @pytest.mark.unit + def test_RMSE(self): + # Tests cost function + vector1 = np.array([1, 2, 3]) + vector2 = np.array([2, 3, 4]) + + cost = pybop.RMSE() + cost.compute(vector1, vector2) + + @pytest.mark.unit + def test_MLE(self): + # Tests cost function + vector1 = np.array([1, 2, 3]) + vector2 = np.array([2, 3, 4]) + + cost = pybop.MLE() + cost.compute(vector1, vector2) + + @pytest.mark.unit + def test_PEM(self): + # Tests cost function + vector1 = np.array([1, 2, 3]) + vector2 = np.array([2, 3, 4]) + + cost = pybop.PEM() + cost.compute(vector1, vector2) + + @pytest.mark.unit + def test_MAP(self): + # Tests cost function + vector1 = np.array([1, 2, 3]) + vector2 = np.array([2, 3, 4]) + + cost = pybop.MAP() + cost.compute(vector1, vector2) diff --git a/tests/unit/test_priors.py b/tests/unit/test_priors.py index cfb544cdf..389480505 100644 --- a/tests/unit/test_priors.py +++ b/tests/unit/test_priors.py @@ -15,6 +15,17 @@ def test_priors(self): Uniform = pybop.Uniform(0, 1) Exponential = pybop.Exponential(1) + # Test pdf np.testing.assert_allclose(Gaussian.pdf(0.5), 0.3989422804014327, atol=1e-4) np.testing.assert_allclose(Uniform.pdf(0.5), 1, atol=1e-4) np.testing.assert_allclose(Exponential.pdf(1), 0.36787944117144233, atol=1e-4) + + # Test logpdf + np.testing.assert_allclose(Gaussian.logpdf(0.5), -0.9189385332046727, atol=1e-4) + np.testing.assert_allclose(Uniform.logpdf(0.5), 0, atol=1e-4) + np.testing.assert_allclose(Exponential.logpdf(1), -1, atol=1e-4) + + # Test rvs + np.testing.assert_allclose(Gaussian.rvs(1), 0.5, atol=3) + np.testing.assert_allclose(Uniform.rvs(1), 0.5, atol=0.5) + np.testing.assert_allclose(Exponential.rvs(1), 1, atol=3) diff --git a/tests/unit/test_problem.py b/tests/unit/test_problem.py index f117b313f..0b4889087 100644 --- a/tests/unit/test_problem.py +++ b/tests/unit/test_problem.py @@ -1,12 +1,15 @@ import pybop import numpy as np import pybamm +import pytest class TestProblem: """ A class to test the problem class. """ + + @pytest.mark.unit def test_problem(self): # Define model model = pybop.lithium_ion.SPM() From b7dca7e18e33912d06767076f197174bff477466 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 2 Nov 2023 14:40:40 +0000 Subject: [PATCH 152/210] Add additional cost function tests --- tests/unit/test_cost.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/unit/test_cost.py b/tests/unit/test_cost.py index 021877689..4abf20dd8 100644 --- a/tests/unit/test_cost.py +++ b/tests/unit/test_cost.py @@ -16,6 +16,30 @@ def test_RMSE(self): cost = pybop.RMSE() cost.compute(vector1, vector2) + @pytest.mark.unit + def test_RMSE_mismatch_dims(self): + # Tests cost function + vector1 = np.array([1, 2, 3]) + vector2 = np.array([2, 3, 4, 5]) + + cost = pybop.RMSE() + with pytest.raises( + ValueError + ): + cost.compute(vector1, vector2) + + @pytest.mark.unit + def test_RMSE_incorrect_type(self): + # Tests cost function + vector1 = np.array([1, 2, 3]) + vector2 = "string" + + cost = pybop.RMSE() + with pytest.raises( + ValueError + ): + cost.compute(vector1, vector2) + @pytest.mark.unit def test_MLE(self): # Tests cost function From e98d840395c88743766fdb2e232b2ff782408944 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 2 Nov 2023 14:41:14 +0000 Subject: [PATCH 153/210] + black format --- tests/unit/test_cost.py | 9 +++------ tests/unit/test_parameterisations.py | 3 +-- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/tests/unit/test_cost.py b/tests/unit/test_cost.py index 4abf20dd8..e7122b86e 100644 --- a/tests/unit/test_cost.py +++ b/tests/unit/test_cost.py @@ -2,6 +2,7 @@ import pybop import numpy as np + class TestCosts: """ Class for tests cost functions @@ -23,9 +24,7 @@ def test_RMSE_mismatch_dims(self): vector2 = np.array([2, 3, 4, 5]) cost = pybop.RMSE() - with pytest.raises( - ValueError - ): + with pytest.raises(ValueError): cost.compute(vector1, vector2) @pytest.mark.unit @@ -35,9 +34,7 @@ def test_RMSE_incorrect_type(self): vector2 = "string" cost = pybop.RMSE() - with pytest.raises( - ValueError - ): + with pytest.raises(ValueError): cost.compute(vector1, vector2) @pytest.mark.unit diff --git a/tests/unit/test_parameterisations.py b/tests/unit/test_parameterisations.py index 9f5e3f042..337497d43 100644 --- a/tests/unit/test_parameterisations.py +++ b/tests/unit/test_parameterisations.py @@ -101,12 +101,11 @@ def test_spme_multiple_optimisers(self): # Select optimisers optimisers = [ pybop.NLoptOptimize(n_param=len(parameters)), - pybop.SciPyMinimize() + pybop.SciPyMinimize(), ] # Test each optimiser for optimiser in optimisers: - parameterisation = pybop.Optimisation( cost=cost, model=model, From fd11fcae4ac4a08f783e7858bb63e798e19f2c27 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 2 Nov 2023 15:17:58 +0000 Subject: [PATCH 154/210] Update tests --- tests/unit/test_parameterisations.py | 2 +- tests/unit/test_priors.py | 47 ++++++++++++++++++++++------ tests/unit/test_problem.py | 2 +- 3 files changed, 40 insertions(+), 11 deletions(-) diff --git a/tests/unit/test_parameterisations.py b/tests/unit/test_parameterisations.py index 337497d43..8b3c0807a 100644 --- a/tests/unit/test_parameterisations.py +++ b/tests/unit/test_parameterisations.py @@ -133,7 +133,7 @@ def getdata(self, model, x0): experiment = pybamm.Experiment( [ ( - "Discharge at 2C for 5 minutes (1 second period)", + "Discharge at 1C for 5 minutes (1 second period)", "Rest for 2 minutes (1 second period)", "Charge at 1C for 5 minutes (1 second period)", "Rest for 2 minutes (1 second period)", diff --git a/tests/unit/test_priors.py b/tests/unit/test_priors.py index 389480505..e3baf8cec 100644 --- a/tests/unit/test_priors.py +++ b/tests/unit/test_priors.py @@ -8,12 +8,20 @@ class TestPriors: A class to test the priors. """ + @pytest.fixture + def Gaussian(self): + return pybop.Gaussian(mean=0.5, sigma=1) + + @pytest.fixture + def Uniform(self): + return pybop.Uniform(lower=0, upper=1) + + @pytest.fixture + def Exponential(self): + return pybop.Exponential(scale=1) + @pytest.mark.unit - def test_priors(self): - # Tests priors - Gaussian = pybop.Gaussian(0.5, 1) - Uniform = pybop.Uniform(0, 1) - Exponential = pybop.Exponential(1) + def test_priors(self, Gaussian, Uniform, Exponential): # Test pdf np.testing.assert_allclose(Gaussian.pdf(0.5), 0.3989422804014327, atol=1e-4) @@ -25,7 +33,28 @@ def test_priors(self): np.testing.assert_allclose(Uniform.logpdf(0.5), 0, atol=1e-4) np.testing.assert_allclose(Exponential.logpdf(1), -1, atol=1e-4) - # Test rvs - np.testing.assert_allclose(Gaussian.rvs(1), 0.5, atol=3) - np.testing.assert_allclose(Uniform.rvs(1), 0.5, atol=0.5) - np.testing.assert_allclose(Exponential.rvs(1), 1, atol=3) + @pytest.mark.unit + def test_gaussian_rvs(self,Gaussian): + samples = Gaussian.rvs(size=500) + mean = np.mean(samples) + std = np.std(samples) + assert abs(mean - 0.5) < 0.1 + assert abs(std - 1) < 0.1 + + @pytest.mark.unit + def test_uniform_rvs(self, Uniform): + samples = Uniform.rvs(size=500) + assert (samples >= 0).all() and (samples <= 1).all() + + @pytest.mark.unit + def test_exponential_rvs(self, Exponential): + samples = Exponential.rvs(size=500) + assert (samples >= 0).all() + mean = np.mean(samples) + assert abs(mean - 1) < 0.1 + + @pytest.mark.unit + def test_repr(self, Gaussian, Uniform, Exponential): + assert repr(Gaussian) == "Gaussian, mean: 0.5, sigma: 1" + assert repr(Uniform) == "Uniform, lower: 0, upper: 1" + assert repr(Exponential) == "Exponential, scale: 1" diff --git a/tests/unit/test_problem.py b/tests/unit/test_problem.py index 0b4889087..1878b509f 100644 --- a/tests/unit/test_problem.py +++ b/tests/unit/test_problem.py @@ -54,7 +54,7 @@ def getdata(self, model, x0): experiment = pybamm.Experiment( [ ( - "Discharge at 2C for 5 minutes (1 second period)", + "Discharge at 1C for 5 minutes (1 second period)", "Rest for 2 minutes (1 second period)", "Charge at 1C for 5 minutes (1 second period)", "Rest for 2 minutes (1 second period)", From 326666ad85c1c59f6ea574b3704d2cf96cefe880 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 2 Nov 2023 16:59:18 +0000 Subject: [PATCH 155/210] Updt default SciPyMinimize Method, Reduce assert on prior tests --- pybop/optimisers/scipy_minimize.py | 2 +- tests/unit/test_priors.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pybop/optimisers/scipy_minimize.py b/pybop/optimisers/scipy_minimize.py index 1b1ae6351..8f24c1d2a 100644 --- a/pybop/optimisers/scipy_minimize.py +++ b/pybop/optimisers/scipy_minimize.py @@ -14,7 +14,7 @@ def __init__(self, method=None, bounds=None): self.name = "SciPy Optimiser" if self.method is None: - self.method = "BFGS" + self.method = "L-BFGS-B" def _runoptimise(self, cost_function, x0, bounds): """ diff --git a/tests/unit/test_priors.py b/tests/unit/test_priors.py index e3baf8cec..cfb8bacec 100644 --- a/tests/unit/test_priors.py +++ b/tests/unit/test_priors.py @@ -38,8 +38,8 @@ def test_gaussian_rvs(self,Gaussian): samples = Gaussian.rvs(size=500) mean = np.mean(samples) std = np.std(samples) - assert abs(mean - 0.5) < 0.1 - assert abs(std - 1) < 0.1 + assert abs(mean - 0.5) < 0.2 + assert abs(std - 1) < 0.2 @pytest.mark.unit def test_uniform_rvs(self, Uniform): @@ -51,7 +51,7 @@ def test_exponential_rvs(self, Exponential): samples = Exponential.rvs(size=500) assert (samples >= 0).all() mean = np.mean(samples) - assert abs(mean - 1) < 0.1 + assert abs(mean - 1) < 0.2 @pytest.mark.unit def test_repr(self, Gaussian, Uniform, Exponential): From d595cb038409216ed51dd44559eda577b657729a Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 2 Nov 2023 17:04:53 +0000 Subject: [PATCH 156/210] Change rtol assert to atol --- tests/unit/test_parameterisations.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/test_parameterisations.py b/tests/unit/test_parameterisations.py index 8b3c0807a..e08df6c00 100644 --- a/tests/unit/test_parameterisations.py +++ b/tests/unit/test_parameterisations.py @@ -119,7 +119,7 @@ def test_spme_multiple_optimisers(self): x, _, final_cost, _ = parameterisation.run() # Assertions (for testing purposes only) np.testing.assert_allclose(final_cost, 0, atol=1e-2) - np.testing.assert_allclose(x, x0, rtol=1e-1) + np.testing.assert_allclose(x, x0, atol=1e-1) def getdata(self, model, x0): model.parameter_set = model.pybamm_model.default_parameter_values From 3a58bcdffbd73c25b97f37e3d56723ebd0534a64 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 2 Nov 2023 18:58:44 +0000 Subject: [PATCH 157/210] Updt costs exception catches and tests --- pybop/costs/error_costs.py | 24 ++++-------------------- tests/unit/test_cost.py | 20 ++++---------------- tests/unit/test_priors.py | 3 +-- 3 files changed, 9 insertions(+), 38 deletions(-) diff --git a/pybop/costs/error_costs.py b/pybop/costs/error_costs.py index 66bc28af8..139a68968 100644 --- a/pybop/costs/error_costs.py +++ b/pybop/costs/error_costs.py @@ -28,8 +28,7 @@ def compute(self, prediction, target): return np.sqrt(np.mean((prediction - target) ** 2)) except Exception as e: - print(f"Error in RMSE calculation: {e}") - return None + raise ValueError(f"Error in RMSE calculation: {e}") class MLE: @@ -42,12 +41,7 @@ def __init__(self): def compute(self, prediction, target): # Compute the cost - try: - return 0 # update with MLE residual - - except Exception as e: - print(f"Error in RMSE calculation: {e}") - return None + return 0 # update with MLE residual class PEM: @@ -60,12 +54,7 @@ def __init__(self): def compute(self, prediction, target): # Compute the cost - try: - return 0 # update with MLE residual - - except Exception as e: - print(f"Error in RMSE calculation: {e}") - return None + return 0 # update with MLE residual class MAP: @@ -78,12 +67,7 @@ def __init__(self): def compute(self, prediction, target): # Compute the cost - try: - return 0 # update with MLE residual - - except Exception as e: - print(f"Error in RMSE calculation: {e}") - return None + return 0 # update with MLE residual def sample(self, n_chains): """ diff --git a/tests/unit/test_cost.py b/tests/unit/test_cost.py index e7122b86e..1f14243d0 100644 --- a/tests/unit/test_cost.py +++ b/tests/unit/test_cost.py @@ -13,29 +13,17 @@ def test_RMSE(self): # Tests cost function vector1 = np.array([1, 2, 3]) vector2 = np.array([2, 3, 4]) + vector3 = np.array(["string", "string", "string"]) + vector4 = np.array([2, 3, 4, 5]) cost = pybop.RMSE() cost.compute(vector1, vector2) - @pytest.mark.unit - def test_RMSE_mismatch_dims(self): - # Tests cost function - vector1 = np.array([1, 2, 3]) - vector2 = np.array([2, 3, 4, 5]) - - cost = pybop.RMSE() with pytest.raises(ValueError): - cost.compute(vector1, vector2) + cost.compute(vector1, vector3) - @pytest.mark.unit - def test_RMSE_incorrect_type(self): - # Tests cost function - vector1 = np.array([1, 2, 3]) - vector2 = "string" - - cost = pybop.RMSE() with pytest.raises(ValueError): - cost.compute(vector1, vector2) + cost.compute(vector1, vector4) @pytest.mark.unit def test_MLE(self): diff --git a/tests/unit/test_priors.py b/tests/unit/test_priors.py index cfb8bacec..342c35c46 100644 --- a/tests/unit/test_priors.py +++ b/tests/unit/test_priors.py @@ -22,7 +22,6 @@ def Exponential(self): @pytest.mark.unit def test_priors(self, Gaussian, Uniform, Exponential): - # Test pdf np.testing.assert_allclose(Gaussian.pdf(0.5), 0.3989422804014327, atol=1e-4) np.testing.assert_allclose(Uniform.pdf(0.5), 1, atol=1e-4) @@ -34,7 +33,7 @@ def test_priors(self, Gaussian, Uniform, Exponential): np.testing.assert_allclose(Exponential.logpdf(1), -1, atol=1e-4) @pytest.mark.unit - def test_gaussian_rvs(self,Gaussian): + def test_gaussian_rvs(self, Gaussian): samples = Gaussian.rvs(size=500) mean = np.mean(samples) std = np.std(samples) From 39dcaebae35a3fabdb9edffd2b95454106eb168b Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 3 Nov 2023 09:04:18 +0000 Subject: [PATCH 158/210] standardise case in __init__, Updt. optimisation parameter dict formation, Updt. Cost iteration output --- pybop/__init__.py | 6 +++--- pybop/costs/error_costs.py | 6 +++--- pybop/optimisation.py | 18 +++++++----------- 3 files changed, 13 insertions(+), 17 deletions(-) diff --git a/pybop/__init__.py b/pybop/__init__.py index 6d17e5102..81a6827ff 100644 --- a/pybop/__init__.py +++ b/pybop/__init__.py @@ -1,5 +1,5 @@ # -# Root of the PyBOP module. +# Root of the pybop module. # Provides access to all shared functionality (models, solvers, etc.). # # This file is adapted from Pints @@ -20,7 +20,7 @@ # Float format: a float can be converted to a 17 digit decimal and back without # loss of information FLOAT_FORMAT = "{: .17e}" -# Absolute path to the PyBOP repo +# Absolute path to the pybop repo script_path = path.dirname(__file__) # @@ -70,6 +70,6 @@ from .plotting.quick_plot import QuickPlot # -# Remove any imported modules, so we don't expose them as part of PyBOP +# Remove any imported modules, so we don't expose them as part of pybop # del sys diff --git a/pybop/costs/error_costs.py b/pybop/costs/error_costs.py index 139a68968..18fe57124 100644 --- a/pybop/costs/error_costs.py +++ b/pybop/costs/error_costs.py @@ -21,11 +21,11 @@ def compute(self, prediction, target): "Measurement and simulated data length mismatch, potentially due to reaching a voltage cut-off" ) - print("Last Values:", prediction[-1], target[-1]) - # Compute the cost try: - return np.sqrt(np.mean((prediction - target) ** 2)) + res = np.sqrt(np.mean((prediction - target) ** 2)) + print("Cost:", res) + return res except Exception as e: raise ValueError(f"Error in RMSE calculation: {e}") diff --git a/pybop/optimisation.py b/pybop/optimisation.py index b13e36a25..8595e75de 100644 --- a/pybop/optimisation.py +++ b/pybop/optimisation.py @@ -25,7 +25,6 @@ def __init__( self.parameters = parameters self.x0 = x0 self.dataset = {o.name: o for o in dataset} - self.fit_parameters = {o.name: o for o in parameters} self.signal = signal self.n_parameters = len(self.parameters) self.verbose = verbose @@ -37,8 +36,8 @@ def __init__( # Set bounds self.bounds = dict( - lower=[Param.bounds[0] for Param in self.parameters], - upper=[Param.bounds[1] for Param in self.parameters], + lower=[param.bounds[0] for param in self.parameters], + upper=[param.bounds[1] for param in self.parameters], ) # Sample from prior for x0 @@ -52,6 +51,7 @@ def __init__( for i, param in enumerate(self.parameters): param.update(value=self.x0[i]) + self.fit_parameters = {o.name: o for o in parameters} # Build model with dataset and fitting parameters self.model.build( dataset=self.dataset, @@ -66,7 +66,7 @@ def run(self): """ results = self.optimiser.optimise( - cost_function=self.cost_function, # lambda x, grad: self.cost_function(x, grad), + cost_function=self.cost_function, x0=self.x0, bounds=self.bounds, ) @@ -82,18 +82,14 @@ def cost_function(self, x, grad=None): target = self.dataset[self.signal].data # Update the parameter dictionary - inputs_dict = {key: x[i] for i, key in enumerate(self.fit_parameters)} - - # for i, Param in enumerate(self.parameters): - # Param.update(value=x[i]) + for i, key in enumerate(self.fit_parameters): + self.fit_parameters[key] = x[i] # Make prediction prediction = self.model.simulate( - inputs=inputs_dict, t_eval=self.model.time_data + inputs=self.fit_parameters, t_eval=self.model.time_data )[self.signal].data - # Add simulation error handling here - # Compute cost res = self.cost.compute(prediction, target) From f672d6e8fd60d7e8584aaf3a16febe2703617b87 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 3 Nov 2023 10:36:56 +0000 Subject: [PATCH 159/210] restore rmse_estimation script parameter bounds --- examples/scripts/rmse_estimation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/scripts/rmse_estimation.py b/examples/scripts/rmse_estimation.py index cc6fa8e1a..ca7d77868 100644 --- a/examples/scripts/rmse_estimation.py +++ b/examples/scripts/rmse_estimation.py @@ -18,7 +18,7 @@ pybop.Parameter( "Negative electrode active material volume fraction", prior=pybop.Gaussian(0.75, 0.05), - bounds=[0.73, 0.77], + bounds=[0.65, 0.85], ), pybop.Parameter( "Positive electrode active material volume fraction", From fbde16940fbd7ec22cefc9162f7349f51ea79ea3 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 3 Nov 2023 10:47:32 +0000 Subject: [PATCH 160/210] Updt num_samples and bounds for test_optimisation --- tests/unit/test_optimisation.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/unit/test_optimisation.py b/tests/unit/test_optimisation.py index 5d869f3f2..82cc3e32b 100644 --- a/tests/unit/test_optimisation.py +++ b/tests/unit/test_optimisation.py @@ -22,7 +22,7 @@ def test_prior_sampling(self): param = [ pybop.Parameter( "Negative electrode active material volume fraction", - prior=pybop.Gaussian(0.75, 0.05), + prior=pybop.Gaussian(0.75, 0.2), bounds=[0.73, 0.77], ) ] @@ -30,7 +30,7 @@ def test_prior_sampling(self): signal = "Terminal voltage [V]" cost = pybop.RMSE() - for i in range(10): + for i in range(50): opt = pybop.Optimisation( cost, model, From 8c66077057432cfda6bb13572969cc7e7f7a2f2f Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 3 Nov 2023 14:17:21 +0000 Subject: [PATCH 161/210] Add ruff format, jupyter notebook support, fix exception in base_parameter_set --- .pre-commit-config.yaml | 13 ++++--------- noxfile.py | 9 ++------- pybop/parameters/base_parameter_set.py | 5 +---- ruff.toml | 8 ++++++++ 4 files changed, 15 insertions(+), 20 deletions(-) create mode 100644 ruff.toml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 784e58cca..14fed65a6 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,17 +4,12 @@ ci: repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.0.292" + rev: "v0.1.3" hooks: - id: ruff - args: ["--fix", "--ignore=E501,E402,E741", "--exclude=__init__.py"] - - - repo: https://github.com/nbQA-dev/nbQA - rev: 1.7.0 - hooks: - - id: nbqa-ruff - additional_dependencies: [ruff==0.0.284] - args: ["--fix","--ignore=E501,E402"] + args: [--fix, --show-fixes] + types_or: [python, pyi, jupyter] + - id: ruff-format - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.4.0 diff --git a/noxfile.py b/noxfile.py index 87c9cacdd..be62e1129 100644 --- a/noxfile.py +++ b/noxfile.py @@ -3,21 +3,16 @@ # nox options nox.options.reuse_existing_virtualenvs = True -# @nox.session -# def lint(session): -# session.install('flake8') -# session.run('flake8', 'example.py') - @nox.session def unit(session): session.run_always("pip", "install", "-e", ".") session.install("pytest") - session.run("pytest", "--unit") + session.run("pytest", "--unit", "-v") @nox.session def coverage(session): session.run_always("pip", "install", "-e", ".") session.install("pytest-cov") - session.run("pytest", "--unit", "--cov", "--cov-report=xml") + session.run("pytest", "--unit", "-v", "--cov", "--cov-report=xml") diff --git a/pybop/parameters/base_parameter_set.py b/pybop/parameters/base_parameter_set.py index 59172b3ba..dd1653d81 100644 --- a/pybop/parameters/base_parameter_set.py +++ b/pybop/parameters/base_parameter_set.py @@ -8,9 +8,6 @@ class ParameterSet: def __new__(cls, method, name): if method.casefold() == "pybamm": - try: - return pybamm.ParameterValues(name).copy() - except: - raise ValueError("Parameter set not found") + return pybamm.ParameterValues(name).copy() else: raise ValueError("Only PyBaMM parameter sets are currently implemented") diff --git a/ruff.toml b/ruff.toml new file mode 100644 index 000000000..29a4a2442 --- /dev/null +++ b/ruff.toml @@ -0,0 +1,8 @@ +extend-include = ["*.ipynb"] +extend-exclude = ["__init__.py"] + +[lint] +ignore = ["E501","E741"] + +[lint.per-file-ignores] +"**.ipynb" = ["E402", "E703"] From df79b9a6157f7e7dc04272b3779a62b19e2d5e6c Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Mon, 6 Nov 2023 13:57:30 +0000 Subject: [PATCH 162/210] Split optimisation class, Updt cost classes, Updt problem class for alignment, Updt test suite to support changes --- examples/scripts/grad_descent.py | 1 + examples/scripts/mle.py | 1 + examples/scripts/rmse_estimation.py | 11 +--- pybop/__init__.py | 4 +- pybop/_problem.py | 77 ++++++++++++++++------- pybop/costs/error_costs.py | 92 ++++++++++++---------------- pybop/models/base_model.py | 12 ++-- pybop/optimisation.py | 63 ++----------------- tests/unit/test_cost.py | 79 ++++++++++++------------ tests/unit/test_optimisation.py | 13 ++-- tests/unit/test_parameterisations.py | 69 ++++++++------------- tests/unit/test_problem.py | 4 +- 12 files changed, 186 insertions(+), 240 deletions(-) diff --git a/examples/scripts/grad_descent.py b/examples/scripts/grad_descent.py index 6e62f9b18..3a75f5d3d 100644 --- a/examples/scripts/grad_descent.py +++ b/examples/scripts/grad_descent.py @@ -4,6 +4,7 @@ import matplotlib.pyplot as plt model = pybop.lithium_ion.SPMe() +model.signal = "Terminal voltage [V]" inputs = { "Negative electrode active material volume fraction": 0.58, diff --git a/examples/scripts/mle.py b/examples/scripts/mle.py index a508ffa46..ad2d7514d 100644 --- a/examples/scripts/mle.py +++ b/examples/scripts/mle.py @@ -4,6 +4,7 @@ import matplotlib.pyplot as plt model = pybop.lithium_ion.SPMe() +model.signal = "Terminal voltage [V]" inputs = { "Negative electrode active material volume fraction": 0.58, diff --git a/examples/scripts/rmse_estimation.py b/examples/scripts/rmse_estimation.py index 6c4bae536..7af0abe64 100644 --- a/examples/scripts/rmse_estimation.py +++ b/examples/scripts/rmse_estimation.py @@ -30,18 +30,13 @@ ] # Define the cost to optimise -cost = pybop.RMSE() signal = "Voltage [V]" +problem = pybop.Problem(model, parameters, signal, dataset, init_soc=0.97) +cost = pybop.RootMeanSquaredError(problem) # Build the optimisation problem parameterisation = pybop.Optimisation( - cost=cost, - model=model, - optimiser=pybop.NLoptOptimize(n_param=len(parameters)), - parameters=parameters, - dataset=dataset, - signal=signal, - init_soc=0.97, + cost=cost, optimiser=pybop.NLoptOptimize(n_param=len(parameters)) ) # Run the optimisation problem diff --git a/pybop/__init__.py b/pybop/__init__.py index 81a6827ff..90165d6f1 100644 --- a/pybop/__init__.py +++ b/pybop/__init__.py @@ -26,7 +26,7 @@ # # Cost function class # -from .costs.error_costs import RMSE, MLE, PEM, MAP +from .costs.error_costs import RootMeanSquaredError # # Dataset class @@ -62,7 +62,7 @@ # # Problem class # -from ._problem import SingleOutputProblem +from ._problem import Problem # # Plotting class diff --git a/pybop/_problem.py b/pybop/_problem.py index 979f1a2ff..ef808b613 100644 --- a/pybop/_problem.py +++ b/pybop/_problem.py @@ -1,49 +1,78 @@ import numpy as np -class SingleOutputProblem: +class Problem: """ Defines a PyBOP single output problem, follows the PINTS interface. """ - def __init__(self, model, parameters, signal, dataset): + def __init__( + self, + model, + parameters, + signal, + dataset, + check_model=True, + init_soc=None, + x0=None, + ): self._model = model - self.parameters = {o.name: o for o in parameters} + self.parameters = parameters self.signal = signal - self._dataset = dataset + self._model.signal = self.signal + self._dataset = {o.name: o for o in dataset} + self.check_model = check_model + self.init_soc = init_soc + self.x0 = x0 + self.n_parameters = len(self.parameters) - if self._model._built_model is None: - self._model.build(fit_parameters=self.parameters) + # Check that the dataset contains time and current + for name in ["Time [s]", "Current function [A]", signal]: + if name not in self._dataset: + raise ValueError(f"expected {name} in list of dataset") - for i, item in enumerate(self._dataset): - if item.name == "Time [s]": - self._time_data_available = True - self._time_data = self._dataset[i].data - - if item.name == signal: - self._ground_truth = self._dataset[i].data - - if self._time_data_available is False: - raise ValueError("Dataset must contain time data") + self._time_data = self._dataset["Time [s]"].data + self._target = self._dataset[signal].data if np.any(self._time_data < 0): raise ValueError("Times can not be negative.") if np.any(self._time_data[:-1] >= self._time_data[1:]): raise ValueError("Times must be increasing.") - if len(self._ground_truth) != len(self._time_data): + if len(self._target) != len(self._time_data): raise ValueError("Time data and signal data must be the same length.") + # Set bounds + self.bounds = dict( + lower=[param.bounds[0] for param in self.parameters], + upper=[param.bounds[1] for param in self.parameters], + ) + + # Sample from prior for x0 + if x0 is None: + self.x0 = np.zeros(self.n_parameters) + for i, param in enumerate(self.parameters): + self.x0[i] = param.rvs(1) + + # Add the initial values to the parameter definitions + for i, param in enumerate(self.parameters): + param.update(value=self.x0[i]) + + self.fit_parameters = {o.name: o for o in parameters} + # if self._model._built_model is None: + self._model.build( + dataset=self._dataset, + fit_parameters=self.fit_parameters, + check_model=self.check_model, + init_soc=self.init_soc, + ) + def evaluate(self, parameters): """ Evaluate the model with the given parameters and return the signal. """ - y = np.asarray( - self._model.simulate(inputs=parameters, t_eval=self.model.time_data)[ - self.signal - ].data - ) + y = np.asarray(self._model.simulate(inputs=parameters, t_eval=self._time_data)) return y @@ -54,7 +83,9 @@ def evaluateS1(self, parameters): """ y, dy_dp = self._model.simulateS1( - inputs=parameters, t_eval=self.model.time_data, calculate_sensitivities=True + inputs=parameters, + t_eval=self._model.time_data, + calculate_sensitivities=True, )[self.signal] return (np.asarray(y), np.asarray(dy_dp)) diff --git a/pybop/costs/error_costs.py b/pybop/costs/error_costs.py index 18fe57124..0536eccaa 100644 --- a/pybop/costs/error_costs.py +++ b/pybop/costs/error_costs.py @@ -1,76 +1,62 @@ import numpy as np +import pybop -class RMSE: +class BaseCost: """ - Defines the root mean square error cost function. + Base class for defining cost functions. + This class computes a corresponding goodness-of-fit for a corresponding model prediction and dataset. + Lower cost values indicate a better fit. """ - def __init__(self): - self.name = "RMSE" - - def compute(self, prediction, target): - # Check compatibility - if len(prediction) != len(target): - print( - "Length of vectors:", - len(prediction), - len(target), - ) - raise ValueError( - "Measurement and simulated data length mismatch, potentially due to reaching a voltage cut-off" - ) + def __call__(self, x): + raise NotImplementedError - # Compute the cost - try: - res = np.sqrt(np.mean((prediction - target) ** 2)) - print("Cost:", res) - return res + def compute(self, x): + """ + Calls the forward models and computes the cost. + """ + raise NotImplementedError - except Exception as e: - raise ValueError(f"Error in RMSE calculation: {e}") + def n_parameters(self): + """ + Returns the size of the parameter space. + """ + raise NotImplementedError -class MLE: +class ProblemCost(BaseCost): """ - Defines the cost function for maximum likelihood estimation. + Extends the base cost function class for a single output problem. """ - def __init__(self): - self.name = "MLE" + def __init__(self, problem): + super(ProblemCost, self).__init__() + self._problem = problem + self._target = problem._target - def compute(self, prediction, target): - # Compute the cost - return 0 # update with MLE residual + def n_parameters(self): + """ + Returns the dimension of the parameter space. + """ + return self._problem.n_parameters() -class PEM: +class RootMeanSquaredError(ProblemCost): """ - Defines the cost function for prediction error minimisation. + Defines the root mean square error cost function. """ - def __init__(self): - self.name = "PEM" - - def compute(self, prediction, target): - # Compute the cost - return 0 # update with MLE residual - - -class MAP: - """ - Defines the cost function for maximum a posteriori estimation. - """ + def __init__(self, problem): + super(RootMeanSquaredError, self).__init__(problem) - def __init__(self): - self.name = "MAP" + if not isinstance(problem, pybop.Problem): + raise ValueError("This cost function only supports pybop problems") - def compute(self, prediction, target): + def compute(self, x): # Compute the cost - return 0 # update with MLE residual + try: + return np.sqrt(np.mean((self._problem.evaluate(x) - self._target) ** 2)) - def sample(self, n_chains): - """ - Sample from the posterior distribution. - """ - pass + except Exception as e: + raise ValueError(f"Error in RMSE calculation: {e}") diff --git a/pybop/models/base_model.py b/pybop/models/base_model.py index dd656f74a..891901ccb 100644 --- a/pybop/models/base_model.py +++ b/pybop/models/base_model.py @@ -12,6 +12,7 @@ def __init__(self, name="Base Model"): self.pybamm_model = None self.fit_parameters = None self.dataset = None + self.signal = None def build( self, @@ -102,6 +103,7 @@ def simulate(self, inputs, t_eval): Run the forward model and return the result in Numpy array format aligning with Pints' ForwardModel simulate method. """ + if self._built_model is None: raise ValueError("Model must be built before calling simulate") else: @@ -111,9 +113,11 @@ def simulate(self, inputs, t_eval): } return self.solver.solve( self.built_model, inputs=inputs_dict, t_eval=t_eval - )["Terminal voltage [V]"].data + )[self.signal].data else: - return self.solver.solve(self.built_model, inputs=inputs, t_eval=t_eval) + return self.solver.solve( + self.built_model, inputs=inputs, t_eval=t_eval + )[self.signal].data def simulateS1(self, inputs, t_eval): """ @@ -143,10 +147,10 @@ def simulateS1(self, inputs, t_eval): ) return ( - sol["Terminal voltage [V]"].data, + sol[self.signal].data, np.asarray( [ - sol["Terminal voltage [V]"].sensitivities[key].toarray() + sol[self.signal].sensitivities[key].toarray() for key in self.fit_keys ] ).T, diff --git a/pybop/optimisation.py b/pybop/optimisation.py index 3318e34ce..b16551cc4 100644 --- a/pybop/optimisation.py +++ b/pybop/optimisation.py @@ -1,6 +1,3 @@ -import numpy as np - - class Optimisation: """ Optimisation class for PyBOP. @@ -9,55 +6,15 @@ class Optimisation: def __init__( self, cost, - model, optimiser, - parameters, - x0=None, - dataset=None, - signal=None, - check_model=True, - init_soc=None, verbose=False, ): self.cost = cost - self.model = model self.optimiser = optimiser - self.parameters = parameters - self.x0 = x0 - self.dataset = {o.name: o for o in dataset} - self.signal = signal - self.n_parameters = len(self.parameters) self.verbose = verbose - - # Check that the dataset contains time and current - for name in ["Time [s]", "Current function [A]"]: - if name not in self.dataset: - raise ValueError(f"expected {name} in list of dataset") - - # Set bounds - self.bounds = dict( - lower=[param.bounds[0] for param in self.parameters], - upper=[param.bounds[1] for param in self.parameters], - ) - - # Sample from prior for x0 - if x0 is None: - self.x0 = np.zeros(self.n_parameters) - for i, param in enumerate(self.parameters): - self.x0[i] = param.rvs(1) - - # Add the initial values to the parameter definitions - for i, param in enumerate(self.parameters): - param.update(value=self.x0[i]) - - self.fit_parameters = {o.name: o for o in parameters} - # Build model with dataset and fitting parameters - self.model.build( - dataset=self.dataset, - fit_parameters=self.fit_parameters, - check_model=check_model, - init_soc=init_soc, - ) + self.x0 = cost._problem.x0 + self.bounds = cost._problem.bounds + self.fit_parameters = {} def run(self): """ @@ -77,22 +34,14 @@ def cost_function(self, x, grad=None): Compute a model prediction and associated value of the cost. """ - # Unpack the target dataset - target = self.dataset[self.signal].data - # Update the parameter dictionary - for i, key in enumerate(self.fit_parameters): + for i, key in enumerate(self.cost._problem.fit_parameters): self.fit_parameters[key] = x[i] - # Make prediction - prediction = self.model.simulate( - inputs=self.fit_parameters, t_eval=self.model.time_data - )[self.signal].data - # Compute cost - res = self.cost.compute(prediction, target) + res = self.cost.compute(self.fit_parameters) if self.verbose: - print("Parameter estimates: ", self.parameters.value, "\n") + print("Parameter estimates: ", self.cost._problem.parameters, "\n") return res diff --git a/tests/unit/test_cost.py b/tests/unit/test_cost.py index 1f14243d0..a88a1a273 100644 --- a/tests/unit/test_cost.py +++ b/tests/unit/test_cost.py @@ -9,45 +9,42 @@ class TestCosts: """ @pytest.mark.unit - def test_RMSE(self): + def test_RootMeanSquaredError(self): # Tests cost function - vector1 = np.array([1, 2, 3]) - vector2 = np.array([2, 3, 4]) - vector3 = np.array(["string", "string", "string"]) - vector4 = np.array([2, 3, 4, 5]) - - cost = pybop.RMSE() - cost.compute(vector1, vector2) - - with pytest.raises(ValueError): - cost.compute(vector1, vector3) - - with pytest.raises(ValueError): - cost.compute(vector1, vector4) - - @pytest.mark.unit - def test_MLE(self): - # Tests cost function - vector1 = np.array([1, 2, 3]) - vector2 = np.array([2, 3, 4]) - - cost = pybop.MLE() - cost.compute(vector1, vector2) - - @pytest.mark.unit - def test_PEM(self): - # Tests cost function - vector1 = np.array([1, 2, 3]) - vector2 = np.array([2, 3, 4]) - - cost = pybop.PEM() - cost.compute(vector1, vector2) - - @pytest.mark.unit - def test_MAP(self): - # Tests cost function - vector1 = np.array([1, 2, 3]) - vector2 = np.array([2, 3, 4]) - - cost = pybop.MAP() - cost.compute(vector1, vector2) + model = pybop.lithium_ion.SPM() + parameters = [ + pybop.Parameter( + "Negative electrode active material volume fraction", + prior=pybop.Gaussian(0.5, 0.02), + bounds=[0.375, 0.625], + ) + ] + + # Form dataset + x0 = np.array([0.52]) + solution = self.getdata(model, x0) + + dataset = [ + pybop.Dataset("Time [s]", solution["Time [s]"].data), + pybop.Dataset("Current function [A]", solution["Current [A]"].data), + pybop.Dataset("Voltage [V]", solution["Terminal voltage [V]"].data), + ] + + signal = "Voltage [V]" + problem = pybop.Problem(model, parameters, signal, dataset) + cost = pybop.RootMeanSquaredError(problem) + cost.compute([0.5]) + + assert type(cost.compute([0.5])) == np.float64 + assert cost.compute([0.5]) >= 0 + + def getdata(self, model, x0): + model.parameter_set = model.pybamm_model.default_parameter_values + model.parameter_set.update( + { + "Negative electrode active material volume fraction": x0[0], + } + ) + + sim = model.predict(t_eval=np.linspace(0, 10, 100)) + return sim diff --git a/tests/unit/test_optimisation.py b/tests/unit/test_optimisation.py index 82cc3e32b..0f83d5a96 100644 --- a/tests/unit/test_optimisation.py +++ b/tests/unit/test_optimisation.py @@ -13,7 +13,7 @@ def test_prior_sampling(self): # Tests prior sampling model = pybop.lithium_ion.SPM() - Dataset = [ + dataset = [ pybop.Dataset("Time [s]", np.linspace(0, 3600, 100)), pybop.Dataset("Current function [A]", np.zeros(100)), pybop.Dataset("Terminal voltage [V]", np.ones(100)), @@ -28,15 +28,12 @@ def test_prior_sampling(self): ] signal = "Terminal voltage [V]" - cost = pybop.RMSE() + problem = pybop.Problem(model, param, signal, dataset) + cost = pybop.RootMeanSquaredError(problem) for i in range(50): opt = pybop.Optimisation( - cost, - model, - optimiser=pybop.NLoptOptimize(n_param=len(param)), - parameters=param, - dataset=Dataset, - signal=signal, + cost=cost, optimiser=pybop.NLoptOptimize(n_param=len(param)) ) + assert opt.x0 <= 0.77 and opt.x0 >= 0.73 diff --git a/tests/unit/test_parameterisations.py b/tests/unit/test_parameterisations.py index 89676c49b..90e26bd5a 100644 --- a/tests/unit/test_parameterisations.py +++ b/tests/unit/test_parameterisations.py @@ -23,40 +23,35 @@ def test_spm(self, init_soc): dataset = [ pybop.Dataset("Time [s]", solution["Time [s]"].data), pybop.Dataset("Current function [A]", solution["Current [A]"].data), - pybop.Dataset("Voltage [V]", solution["Terminal voltage [V]"].data), + pybop.Dataset( + "Terminal voltage [V]", solution["Terminal voltage [V]"].data + ), ] # Fitting parameters parameters = [ pybop.Parameter( "Negative electrode active material volume fraction", - prior=pybop.Gaussian(0.5, 0.02), + prior=pybop.Gaussian(0.5, 0.05), bounds=[0.375, 0.625], ), pybop.Parameter( "Positive electrode active material volume fraction", - prior=pybop.Gaussian(0.65, 0.02), + prior=pybop.Gaussian(0.65, 0.05), bounds=[0.525, 0.75], ), ] # Define the cost to optimise - cost = pybop.RMSE() - signal = "Voltage [V]" + signal = "Terminal voltage [V]" + problem = pybop.Problem(model, parameters, signal, dataset, init_soc=init_soc) + cost = pybop.RootMeanSquaredError(problem) # Select optimiser optimiser = pybop.NLoptOptimize(n_param=len(parameters)) # Build the optimisation problem - parameterisation = pybop.Optimisation( - cost=cost, - model=model, - optimiser=optimiser, - parameters=parameters, - dataset=dataset, - signal=signal, - init_soc=init_soc, - ) + parameterisation = pybop.Optimisation(cost=cost, optimiser=optimiser) # Run the optimisation problem x, _, final_cost, _ = parameterisation.run() @@ -79,26 +74,29 @@ def test_spme_multiple_optimisers(self, init_soc): dataset = [ pybop.Dataset("Time [s]", solution["Time [s]"].data), pybop.Dataset("Current function [A]", solution["Current [A]"].data), - pybop.Dataset("Voltage [V]", solution["Terminal voltage [V]"].data), + pybop.Dataset( + "Terminal voltage [V]", solution["Terminal voltage [V]"].data + ), ] # Fitting parameters parameters = [ pybop.Parameter( "Negative electrode active material volume fraction", - prior=pybop.Gaussian(0.5, 0.02), + prior=pybop.Gaussian(0.5, 0.05), bounds=[0.375, 0.625], ), pybop.Parameter( "Positive electrode active material volume fraction", - prior=pybop.Gaussian(0.65, 0.02), + prior=pybop.Gaussian(0.65, 0.05), bounds=[0.525, 0.75], ), ] # Define the cost to optimise - cost = pybop.RMSE() - signal = "Voltage [V]" + signal = "Terminal voltage [V]" + problem = pybop.Problem(model, parameters, signal, dataset, init_soc=init_soc) + cost = pybop.RootMeanSquaredError(problem) # Select optimisers optimisers = [ @@ -108,15 +106,7 @@ def test_spme_multiple_optimisers(self, init_soc): # Test each optimiser for optimiser in optimisers: - parameterisation = pybop.Optimisation( - cost=cost, - model=model, - optimiser=optimiser, - parameters=parameters, - dataset=dataset, - signal=signal, - init_soc=init_soc, - ) + parameterisation = pybop.Optimisation(cost=cost, optimiser=optimiser) # Run the optimisation problem x, _, final_cost, _ = parameterisation.run() @@ -142,40 +132,35 @@ def test_model_misparameterisation(self, init_soc): dataset = [ pybop.Dataset("Time [s]", solution["Time [s]"].data), pybop.Dataset("Current function [A]", solution["Current [A]"].data), - pybop.Dataset("Voltage [V]", solution["Terminal voltage [V]"].data), + pybop.Dataset( + "Terminal voltage [V]", solution["Terminal voltage [V]"].data + ), ] # Fitting parameters parameters = [ pybop.Parameter( "Negative electrode active material volume fraction", - prior=pybop.Gaussian(0.5, 0.02), + prior=pybop.Gaussian(0.5, 0.05), bounds=[0.375, 0.625], ), pybop.Parameter( "Positive electrode active material volume fraction", - prior=pybop.Gaussian(0.65, 0.02), + prior=pybop.Gaussian(0.65, 0.05), bounds=[0.525, 0.75], ), ] # Define the cost to optimise - cost = pybop.RMSE() - signal = "Voltage [V]" + signal = "Terminal voltage [V]" + problem = pybop.Problem(model, parameters, signal, dataset, init_soc=init_soc) + cost = pybop.RootMeanSquaredError(problem) # Select optimiser optimiser = pybop.NLoptOptimize(n_param=len(parameters)) # Build the optimisation problem - parameterisation = pybop.Optimisation( - cost=cost, - model=model, - optimiser=optimiser, - parameters=parameters, - dataset=dataset, - signal=signal, - init_soc=init_soc, - ) + parameterisation = pybop.Optimisation(cost=cost, optimiser=optimiser) # Run the optimisation problem x, _, final_cost, _ = parameterisation.run() diff --git a/tests/unit/test_problem.py b/tests/unit/test_problem.py index 1878b509f..6556bf702 100644 --- a/tests/unit/test_problem.py +++ b/tests/unit/test_problem.py @@ -37,10 +37,10 @@ def test_problem(self): pybop.Dataset("Voltage [V]", solution["Terminal voltage [V]"].data), ] - problem = pybop.SingleOutputProblem(model, parameters, signal, dataset) + problem = pybop.Problem(model, parameters, signal, dataset) assert problem._model == model - assert problem._dataset == dataset + assert problem._model._built_model is not None def getdata(self, model, x0): model.parameter_set = model.pybamm_model.default_parameter_values From d7baa5d2f95cd4f207ebf4cb655ebaa528f64c00 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 6 Nov 2023 17:48:08 +0000 Subject: [PATCH 163/210] chore: update pre-commit hooks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.1.3 → v0.1.4](https://github.com/astral-sh/ruff-pre-commit/compare/v0.1.3...v0.1.4) - [github.com/pre-commit/pre-commit-hooks: v4.4.0 → v4.5.0](https://github.com/pre-commit/pre-commit-hooks/compare/v4.4.0...v4.5.0) --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 14fed65a6..8fca335a6 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,7 +4,7 @@ ci: repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.1.3" + rev: "v0.1.4" hooks: - id: ruff args: [--fix, --show-fixes] @@ -12,7 +12,7 @@ repos: - id: ruff-format - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.4.0 + rev: v4.5.0 hooks: - id: check-added-large-files - id: check-case-conflict From 76ba9924e7aa7f6de096edcfcb80b30b73acae14 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Tue, 7 Nov 2023 09:51:31 +0000 Subject: [PATCH 164/210] Additions for init. pints implementation, rework cost function implementation in optimiser class --- examples/scripts/grad_descent.py | 58 +++++-- examples/scripts/rmse_estimation.py | 4 +- pybop/__init__.py | 2 +- pybop/_problem.py | 15 +- pybop/costs/error_costs.py | 13 +- pybop/optimisation.py | 2 +- pybop/optimisers/base_optimiser.py | 2 +- pybop/optimisers/nlopt_optimize.py | 2 +- pybop/optimisers/pints_optimiser.py | 242 ++++++++++++++------------- pybop/optimisers/scipy_minimize.py | 4 +- tests/unit/test_parameterisations.py | 12 +- 11 files changed, 198 insertions(+), 158 deletions(-) diff --git a/examples/scripts/grad_descent.py b/examples/scripts/grad_descent.py index 3a75f5d3d..518d58100 100644 --- a/examples/scripts/grad_descent.py +++ b/examples/scripts/grad_descent.py @@ -1,26 +1,50 @@ import pybop -import pints import numpy as np import matplotlib.pyplot as plt model = pybop.lithium_ion.SPMe() model.signal = "Terminal voltage [V]" -inputs = { - "Negative electrode active material volume fraction": 0.58, - "Positive electrode active material volume fraction": 0.44, - "Current function [A]": 1, -} -t_eval = np.arange(0, 900, 2) -model.build(fit_parameters=inputs) +# Fitting parameters +parameters = [ + pybop.Parameter( + "Negative electrode active material volume fraction", + prior=pybop.Gaussian(0.53, 0.02), + bounds=[0.6, 0.9], + ), + pybop.Parameter( + "Positive electrode active material volume fraction", + prior=pybop.Gaussian(0.62, 0.02), + bounds=[0.5, 0.8], + ), + # pybop.Parameter( + # "Current function [A]", + # prior=pybop.Gaussian(1.1, 0.05), + # bounds=[0.8, 1.3], + # ), +] -values = model.predict(inputs=inputs, t_eval=t_eval) +model.parameter_set.update( + { + "Negative electrode active material volume fraction": 0.53, + "Positive electrode active material volume fraction": 0.62, + "Current function [A]": 1.1, + } +) +t_eval = np.arange(0, 900, 2) +values = model.predict(t_eval=t_eval) voltage = values["Terminal voltage [V]"].data time = values["Time [s]"].data sigma = 0.001 CorruptValues = voltage + np.random.normal(0, sigma, len(voltage)) +dataset = [ + pybop.Dataset("Time [s]", time), + pybop.Dataset("Current function [A]", values["Current [A]"].data), + pybop.Dataset("Terminal voltage [V]", CorruptValues), +] + # Show the generated data plt.figure() plt.xlabel("Time") @@ -29,18 +53,18 @@ plt.plot(time, voltage) plt.show() - -problem = pints.SingleOutputProblem(model, time, CorruptValues) +signal = "Terminal voltage [V]" +problem = pybop.Problem(model, parameters, signal, dataset) # Select a score function -score = pints.SumOfSquaresError(problem) +cost = pybop.RootMeanSquaredError(problem) -x0 = np.array([0.48, 0.55, 1.4]) -opt = pints.OptimisationController(score, x0, method=pints.GradientDescent) +x0 = np.array([0.53, 0.62, 1.1]) +opt = pybop.Optimisation(cost, optimiser=pybop.GradientDescent()) -opt.optimiser().set_learning_rate(0.025) -opt.set_max_unchanged_iterations(50) -opt.set_max_iterations(200) +opt.optimiser.set_learning_rate = 0.025 +opt.optimiser.set_max_unchanged_iterations=50 +opt.optimiser.set_max_iterations=200 x1, f1 = opt.run() print("Estimated parameters:") diff --git a/examples/scripts/rmse_estimation.py b/examples/scripts/rmse_estimation.py index 7af0abe64..810e044f3 100644 --- a/examples/scripts/rmse_estimation.py +++ b/examples/scripts/rmse_estimation.py @@ -6,7 +6,7 @@ dataset = [ pybop.Dataset("Time [s]", Measurements[:, 0]), pybop.Dataset("Current function [A]", Measurements[:, 1]), - pybop.Dataset("Voltage [V]", Measurements[:, 2]), + pybop.Dataset("Terminal voltage [V]", Measurements[:, 2]), ] # Define model @@ -30,7 +30,7 @@ ] # Define the cost to optimise -signal = "Voltage [V]" +signal = "Terminal voltage [V]" problem = pybop.Problem(model, parameters, signal, dataset, init_soc=0.97) cost = pybop.RootMeanSquaredError(problem) diff --git a/pybop/__init__.py b/pybop/__init__.py index 90165d6f1..f5c0bd93d 100644 --- a/pybop/__init__.py +++ b/pybop/__init__.py @@ -50,7 +50,7 @@ from .optimisers.base_optimiser import BaseOptimiser from .optimisers.nlopt_optimize import NLoptOptimize from .optimisers.scipy_minimize import SciPyMinimize -from .optimisers.pints_optimiser import PintsOptimiser, PintsError, PintsBoundaries +from .optimisers.pints_optimiser import GradientDescent # # Parameter classes diff --git a/pybop/_problem.py b/pybop/_problem.py index ef808b613..f750ef424 100644 --- a/pybop/_problem.py +++ b/pybop/_problem.py @@ -58,7 +58,7 @@ def __init__( for i, param in enumerate(self.parameters): param.update(value=self.x0[i]) - self.fit_parameters = {o.name: o for o in parameters} + self.fit_parameters = {o.name: o.value for o in parameters} # if self._model._built_model is None: self._model.build( dataset=self._dataset, @@ -81,11 +81,12 @@ def evaluateS1(self, parameters): Evaluate the model with the given parameters and return the signal and its derivatives. """ + for i, key in enumerate(self.fit_parameters): + self.fit_parameters[key] = parameters[i] - y, dy_dp = self._model.simulateS1( - inputs=parameters, - t_eval=self._model.time_data, - calculate_sensitivities=True, - )[self.signal] + y, dy = self._model.simulateS1( + inputs=self.fit_parameters, + t_eval=self._time_data, + ) - return (np.asarray(y), np.asarray(dy_dp)) + return (np.asarray(y), np.asarray(dy)) diff --git a/pybop/costs/error_costs.py b/pybop/costs/error_costs.py index 0536eccaa..9c8a8d257 100644 --- a/pybop/costs/error_costs.py +++ b/pybop/costs/error_costs.py @@ -39,7 +39,7 @@ def n_parameters(self): """ Returns the dimension of the parameter space. """ - return self._problem.n_parameters() + return self._problem.n_parameters class RootMeanSquaredError(ProblemCost): @@ -53,10 +53,19 @@ def __init__(self, problem): if not isinstance(problem, pybop.Problem): raise ValueError("This cost function only supports pybop problems") - def compute(self, x): + def compute(self, x, grad=None): # Compute the cost try: return np.sqrt(np.mean((self._problem.evaluate(x) - self._target) ** 2)) except Exception as e: raise ValueError(f"Error in RMSE calculation: {e}") + + def evaluateS1(self, x): + # Compute the cost + y, dy = self._problem.evaluateS1(x) + dy = dy.reshape((450, 1, 2)) + r = y - self._target + e = np.sum(np.sum(r**2, axis=0), axis=0) + de = 2 * np.sum(np.sum((r.T * dy.T), axis=2), axis=1) + return e, de diff --git a/pybop/optimisation.py b/pybop/optimisation.py index b16551cc4..66c5b6120 100644 --- a/pybop/optimisation.py +++ b/pybop/optimisation.py @@ -22,7 +22,7 @@ def run(self): """ results = self.optimiser.optimise( - cost_function=self.cost_function, + cost_function=self.cost, x0=self.x0, bounds=self.bounds, ) diff --git a/pybop/optimisers/base_optimiser.py b/pybop/optimisers/base_optimiser.py index 43d8a891f..1938c1db2 100644 --- a/pybop/optimisers/base_optimiser.py +++ b/pybop/optimisers/base_optimiser.py @@ -18,7 +18,7 @@ def optimise(self, cost_function, x0=None, bounds=None): self.bounds = bounds # Run optimisation - result = self._runoptimise(self.cost_function, self.x0, self.bounds) + result = self._runoptimise(self.cost_function, x0=self.x0, bounds=self.bounds) return result diff --git a/pybop/optimisers/nlopt_optimize.py b/pybop/optimisers/nlopt_optimize.py index 83c62d051..d770632bb 100644 --- a/pybop/optimisers/nlopt_optimize.py +++ b/pybop/optimisers/nlopt_optimize.py @@ -34,7 +34,7 @@ def _runoptimise(self, cost_function, x0, bounds): """ # Pass settings to the optimiser - self.optim.set_min_objective(cost_function) + self.optim.set_min_objective(cost_function.compute) self.optim.set_lower_bounds(bounds["lower"]) self.optim.set_upper_bounds(bounds["upper"]) diff --git a/pybop/optimisers/pints_optimiser.py b/pybop/optimisers/pints_optimiser.py index 4aa52d746..569d96c92 100644 --- a/pybop/optimisers/pints_optimiser.py +++ b/pybop/optimisers/pints_optimiser.py @@ -1,24 +1,25 @@ -import pybop import pints -from pybop.optimisers.base_optimiser import BaseOptimiser -from pints import ErrorMeasure +from .base_optimiser import BaseOptimiser -class PintsOptimiser(BaseOptimiser): +class GradientDescent(BaseOptimiser): """ Class for the PINTS optimisation. Extends the BaseOptimiser class. """ def __init__(self, x0=None, xtol=None, method=None): super().__init__() - self.name = "PINTS Optimiser" + self.name = "Gradient Descent Optimiser" + self.set_learning_rate = 0.025 + self.max_iterations = 100 + self.set_max_unchanged_iterations = 10 - if method is not None: - self.method = method - else: - self.method = pints.CMAES + # if method is not None: + # self.method = method + # else: + # self.method = pints.GradientDescent - def _runoptimise(self, cost_function, x0, bounds=None): + def _runoptimise(self, cost_function, x0, bounds): """ Run the PINTS optimisation method. @@ -30,18 +31,23 @@ def _runoptimise(self, cost_function, x0, bounds=None): bounds: bounds array """ - # Wrap bounds - boundaries = pybop.PintsBoundaries(bounds, x0) - - # Wrap error measure - error = pybop.PintsError(cost_function, x0) + # Using the ask-and-tell interface + # self.method = pints.GradientDescent + # e = pints.SequentialEvaluator(cost_function.computeS1) + # error = pybop.PintsError(cost_function, x0) + # for i in range(50): + # xs = self.method.ask() + # fs = e.evaluate(xs) + # self.method.tell(fs) # Set up optimisation controller controller = pints.OptimisationController( - error, x0, boundaries=boundaries, method=self.method + cost_function, x0, method=self.method ) - controller.set_max_unchanged_iterations(20) # default 200 + controller.set_max_unchanged_iterations(self.set_max_unchanged_iterations) + controller.set_max_iterations(self.max_iterations) + controller.optimiser().set_learning_rate(self.set_learning_rate) # Run the optimser x, final_cost = controller.run() @@ -56,104 +62,104 @@ def _runoptimise(self, cost_function, x0, bounds=None): return x, output, final_cost, num_evals -class PintsError(ErrorMeasure): - """ - An interface class for PyBOP that extends the PINTS ErrorMeasure class. - - From PINTS: - Abstract base class for objects that calculate some scalar measure of - goodness-of-fit (for a model and a data set), such that a smaller value - means a better fit. - - ErrorMeasures are callable objects: If ``e`` is an instance of an - :class:`ErrorMeasure` class you can calculate the error by calling ``e(p)`` - where ``p`` is a point in parameter space. - """ - - def __init__(self, cost_function, x0): - self.cost_function = cost_function - self.x0 = x0 - - def __call__(self, x): - cost = self.cost_function(x) - - return cost - - def evaluateS1(self, x): - """ - Evaluates this error measure, and returns the result plus the partial - derivatives of the result with respect to the parameters. - - The returned data has the shape ``(e, e')`` where ``e`` is a scalar - value and ``e'`` is a sequence of length ``n_parameters``. - - *This is an optional method that is not always implemented.* - """ - raise NotImplementedError - - def n_parameters(self): - """ - Returns the dimension of the parameter space this measure is defined - over. - """ - return len(self.x0) - - -class PintsBoundaries(object): - """ - An interface class for PyBOP that extends the PINTS ErrorMeasure class. - - From PINTS: - Abstract class representing boundaries on a parameter space. - """ - - def __init__(self, bounds, x0): - self.bounds = bounds - self.x0 = x0 - - def check(self, parameters): - """ - Returns ``True`` if and only if the given point in parameter space is - within the boundaries. - - Parameters - ---------- - parameters - A point in parameter space - """ - result = False - if ( - parameters[0] >= self.bounds["lower"][0] - and parameters[1] >= self.bounds["lower"][1] - and parameters[0] <= self.bounds["upper"][0] - and parameters[1] <= self.bounds["upper"][1] - ): - result = True - - return result - - def n_parameters(self): - """ - Returns the dimension of the parameter space these boundaries are - defined on. - """ - return len(self.x0) - - def sample(self, n=1): - """ - Returns ``n`` random samples from within the boundaries, for example to - use as starting points for an optimisation. - - The returned value is a NumPy array with shape ``(n, d)`` where ``n`` - is the requested number of samples, and ``d`` is the dimension of the - parameter space these boundaries are defined on. - - *Note that implementing :meth:`sample()` is optional, so some boundary - types may not support it.* - - Parameters - ---------- - n : int - The number of points to sample - """ - raise NotImplementedError +# class PintsError(ErrorMeasure): +# """ +# An interface class for PyBOP that extends the PINTS ErrorMeasure class. + +# From PINTS: +# Abstract base class for objects that calculate some scalar measure of +# goodness-of-fit (for a model and a data set), such that a smaller value +# means a better fit. + +# ErrorMeasures are callable objects: If ``e`` is an instance of an +# :class:`ErrorMeasure` class you can calculate the error by calling ``e(p)`` +# where ``p`` is a point in parameter space. +# """ + +# def __init__(self, cost_function, x0): +# self.cost_function = cost_function +# self.x0 = x0 + +# def __call__(self, x): +# cost = self.cost_function(x) + +# return cost + +# def evaluateS1(self, x): +# """ +# Evaluates this error measure, and returns the result plus the partial +# derivatives of the result with respect to the parameters. + +# The returned data has the shape ``(e, e')`` where ``e`` is a scalar +# value and ``e'`` is a sequence of length ``n_parameters``. + +# *This is an optional method that is not always implemented.* +# """ +# raise NotImplementedError + +# def n_parameters(self): +# """ +# Returns the dimension of the parameter space this measure is defined +# over. +# """ +# return len(self.x0) + + +# class PintsBoundaries(object): +# """ +# An interface class for PyBOP that extends the PINTS ErrorMeasure class. + +# From PINTS: +# Abstract class representing boundaries on a parameter space. +# """ + +# def __init__(self, bounds, x0): +# self.bounds = bounds +# self.x0 = x0 + +# def check(self, parameters): +# """ +# Returns ``True`` if and only if the given point in parameter space is +# within the boundaries. + +# Parameters +# ---------- +# parameters +# A point in parameter space +# """ +# result = False +# if ( +# parameters[0] >= self.bounds["lower"][0] +# and parameters[1] >= self.bounds["lower"][1] +# and parameters[0] <= self.bounds["upper"][0] +# and parameters[1] <= self.bounds["upper"][1] +# ): +# result = True + +# return result + +# def n_parameters(self): +# """ +# Returns the dimension of the parameter space these boundaries are +# defined on. +# """ +# return len(self.x0) + +# def sample(self, n=1): +# """ +# Returns ``n`` random samples from within the boundaries, for example to +# use as starting points for an optimisation. + +# The returned value is a NumPy array with shape ``(n, d)`` where ``n`` +# is the requested number of samples, and ``d`` is the dimension of the +# parameter space these boundaries are defined on. + +# *Note that implementing :meth:`sample()` is optional, so some boundary +# types may not support it.* + +# Parameters +# ---------- +# n : int +# The number of points to sample +# """ +# raise NotImplementedError diff --git a/pybop/optimisers/scipy_minimize.py b/pybop/optimisers/scipy_minimize.py index 8f24c1d2a..f4e912732 100644 --- a/pybop/optimisers/scipy_minimize.py +++ b/pybop/optimisers/scipy_minimize.py @@ -33,9 +33,9 @@ def _runoptimise(self, cost_function, x0, bounds): bounds = ( (lower, upper) for lower, upper in zip(bounds["lower"], bounds["upper"]) ) - output = minimize(cost_function, x0, method=self.method, bounds=bounds) + output = minimize(cost_function.compute, x0, method=self.method, bounds=bounds) else: - output = minimize(cost_function, x0, method=self.method) + output = minimize(cost_function.compute, x0, method=self.method) # Get performance statistics x = output.x diff --git a/tests/unit/test_parameterisations.py b/tests/unit/test_parameterisations.py index 90e26bd5a..be6fc2373 100644 --- a/tests/unit/test_parameterisations.py +++ b/tests/unit/test_parameterisations.py @@ -32,12 +32,12 @@ def test_spm(self, init_soc): parameters = [ pybop.Parameter( "Negative electrode active material volume fraction", - prior=pybop.Gaussian(0.5, 0.05), + prior=pybop.Gaussian(0.5, 0.02), bounds=[0.375, 0.625], ), pybop.Parameter( "Positive electrode active material volume fraction", - prior=pybop.Gaussian(0.65, 0.05), + prior=pybop.Gaussian(0.65, 0.02), bounds=[0.525, 0.75], ), ] @@ -83,12 +83,12 @@ def test_spme_multiple_optimisers(self, init_soc): parameters = [ pybop.Parameter( "Negative electrode active material volume fraction", - prior=pybop.Gaussian(0.5, 0.05), + prior=pybop.Gaussian(0.5, 0.02), bounds=[0.375, 0.625], ), pybop.Parameter( "Positive electrode active material volume fraction", - prior=pybop.Gaussian(0.65, 0.05), + prior=pybop.Gaussian(0.65, 0.02), bounds=[0.525, 0.75], ), ] @@ -141,12 +141,12 @@ def test_model_misparameterisation(self, init_soc): parameters = [ pybop.Parameter( "Negative electrode active material volume fraction", - prior=pybop.Gaussian(0.5, 0.05), + prior=pybop.Gaussian(0.5, 0.02), bounds=[0.375, 0.625], ), pybop.Parameter( "Positive electrode active material volume fraction", - prior=pybop.Gaussian(0.65, 0.05), + prior=pybop.Gaussian(0.65, 0.02), bounds=[0.525, 0.75], ), ] From bb79dda4015eaaefbb4cbf22275776052d79d9db Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Tue, 7 Nov 2023 17:12:24 +0000 Subject: [PATCH 165/210] Pints controller options, example Updts, current function input bugfix --- examples/scripts/grad_descent.py | 49 +++++++++++++++-------------- examples/scripts/rmse_estimation.py | 17 +++++++++- pybop/__init__.py | 2 +- pybop/costs/error_costs.py | 20 +++++++++++- pybop/models/base_model.py | 18 ++++++----- pybop/optimisers/pints_optimiser.py | 27 ++++++---------- 6 files changed, 82 insertions(+), 51 deletions(-) diff --git a/examples/scripts/grad_descent.py b/examples/scripts/grad_descent.py index 518d58100..a2b9696c5 100644 --- a/examples/scripts/grad_descent.py +++ b/examples/scripts/grad_descent.py @@ -2,26 +2,27 @@ import numpy as np import matplotlib.pyplot as plt -model = pybop.lithium_ion.SPMe() +parameter_set = pybop.ParameterSet("pybamm", "Chen2020") +model = pybop.lithium_ion.SPMe(parameter_set=parameter_set) model.signal = "Terminal voltage [V]" # Fitting parameters parameters = [ pybop.Parameter( "Negative electrode active material volume fraction", - prior=pybop.Gaussian(0.53, 0.02), + prior=pybop.Gaussian(0.57, 0.05), bounds=[0.6, 0.9], ), pybop.Parameter( "Positive electrode active material volume fraction", - prior=pybop.Gaussian(0.62, 0.02), + prior=pybop.Gaussian(0.58, 0.05), bounds=[0.5, 0.8], ), - # pybop.Parameter( - # "Current function [A]", - # prior=pybop.Gaussian(1.1, 0.05), - # bounds=[0.8, 1.3], - # ), + pybop.Parameter( + "Current function [A]", + prior=pybop.Gaussian(1.2, 0.05), + bounds=[0.8, 1.3], + ), ] model.parameter_set.update( @@ -31,6 +32,7 @@ "Current function [A]": 1.1, } ) + t_eval = np.arange(0, 900, 2) values = model.predict(t_eval=t_eval) voltage = values["Terminal voltage [V]"].data @@ -57,26 +59,27 @@ problem = pybop.Problem(model, parameters, signal, dataset) # Select a score function -cost = pybop.RootMeanSquaredError(problem) - -x0 = np.array([0.53, 0.62, 1.1]) +cost = pybop.SumSquaredError(problem) opt = pybop.Optimisation(cost, optimiser=pybop.GradientDescent()) -opt.optimiser.set_learning_rate = 0.025 -opt.optimiser.set_max_unchanged_iterations=50 -opt.optimiser.set_max_iterations=200 +opt.optimiser.learning_rate = 0.025 +opt.optimiser.max_unchanged_iterations=1 +opt.optimiser.max_iterations=50 -x1, f1 = opt.run() -print("Estimated parameters:") -print(x1) +x, output, final_cost, num_evals = opt.run() +print("Estimated parameters:", x) # Show the generated data -simulated_values = problem.evaluate(x1[:3]) +simulated_values = problem.evaluate(x[:3]) -plt.figure() -plt.xlabel("Time") -plt.ylabel("Values") -plt.plot(time, CorruptValues) +plt.figure(figsize=(5, 5), dpi=100, facecolor="w", edgecolor="k", linewidth=2, frameon=False) +plt.xlabel("Time", fontsize=20) +plt.ylabel("Values", fontsize=20) +plt.plot(time, CorruptValues, label="Measured") plt.fill_between(time, simulated_values - sigma, simulated_values + sigma, alpha=0.2) -plt.plot(time, simulated_values) +plt.plot(time, simulated_values, label="Simulated") +plt.legend( + bbox_to_anchor=(0.85, 1), loc="upper left", fontsize=20 +) +plt.tick_params(axis='both', labelsize=20) plt.show() diff --git a/examples/scripts/rmse_estimation.py b/examples/scripts/rmse_estimation.py index 810e044f3..9766e40ce 100644 --- a/examples/scripts/rmse_estimation.py +++ b/examples/scripts/rmse_estimation.py @@ -1,5 +1,6 @@ import pybop import pandas as pd +import matplotlib.pyplot as plt # Form dataset Measurements = pd.read_csv("examples/scripts/Chen_example.csv", comment="#").to_numpy() @@ -31,7 +32,7 @@ # Define the cost to optimise signal = "Terminal voltage [V]" -problem = pybop.Problem(model, parameters, signal, dataset, init_soc=0.97) +problem = pybop.Problem(model, parameters, signal, dataset, init_soc=0.98) cost = pybop.RootMeanSquaredError(problem) # Build the optimisation problem @@ -42,6 +43,20 @@ # Run the optimisation problem x, output, final_cost, num_evals = parameterisation.run() +# Show the generated data +simulated_values = problem.evaluate(x) + +plt.figure() +plt.xlabel("Time") +plt.ylabel("Values") +plt.plot(dataset[0].data, dataset[2].data, label="Measured") +plt.plot(dataset[0].data, simulated_values, label="Simulated") +plt.legend( + bbox_to_anchor=(1.05, 1), loc="upper left", borderaxespad=0.0, frameon=False +) +plt.show() + + # get MAP estimate, starting at a random initial point in parameter space # parameterisation.map(x0=[p.sample() for p in parameters]) diff --git a/pybop/__init__.py b/pybop/__init__.py index f5c0bd93d..fe0502d56 100644 --- a/pybop/__init__.py +++ b/pybop/__init__.py @@ -26,7 +26,7 @@ # # Cost function class # -from .costs.error_costs import RootMeanSquaredError +from .costs.error_costs import RootMeanSquaredError, SumSquaredError # # Dataset class diff --git a/pybop/costs/error_costs.py b/pybop/costs/error_costs.py index 9c8a8d257..b0ad06276 100644 --- a/pybop/costs/error_costs.py +++ b/pybop/costs/error_costs.py @@ -61,10 +61,28 @@ def compute(self, x, grad=None): except Exception as e: raise ValueError(f"Error in RMSE calculation: {e}") + +class SumSquaredError(ProblemCost): + """ + Defines the sum squared error cost function. + """ + + def __init__(self, problem): + super(SumSquaredError, self).__init__(problem) + + if not isinstance(problem, pybop.Problem): + raise ValueError("This cost function only supports pybop problems") + + def compute(self, x, grad=None): + # Compute the cost + + return np.sum((np.sum(((self._problem.evaluate(x) - self._target)**2), + axis=0)), axis=0) + def evaluateS1(self, x): # Compute the cost y, dy = self._problem.evaluateS1(x) - dy = dy.reshape((450, 1, 2)) + dy = dy.reshape((450, 1, self._problem.n_parameters)) r = y - self._target e = np.sum(np.sum(r**2, axis=0), axis=0) de = 2 * np.sum(np.sum((r.T * dy.T), axis=2), axis=1) diff --git a/pybop/models/base_model.py b/pybop/models/base_model.py index 891901ccb..92f3f3dbc 100644 --- a/pybop/models/base_model.py +++ b/pybop/models/base_model.py @@ -31,6 +31,7 @@ def build( if self.fit_parameters is not None: self.fit_keys = list(self.fit_parameters.keys()) + if init_soc is not None: self.set_init_soc(init_soc) @@ -83,14 +84,16 @@ def set_params(self): for i in self.fit_parameters.keys(): self._parameter_set[i] = "[input]" + if self.dataset is not None and self.fit_parameters is not None: - self.parameter_set["Current function [A]"] = pybamm.Interpolant( - self.dataset["Time [s]"].data, - self.dataset["Current function [A]"].data, - pybamm.t, - ) - # Set t_eval - self.time_data = self._parameter_set["Current function [A]"].x[0] + if "Current function [A]" not in self.fit_keys: + self.parameter_set["Current function [A]"] = pybamm.Interpolant( + self.dataset["Time [s]"].data, + self.dataset["Current function [A]"].data, + pybamm.t, + ) + # Set t_eval + self.time_data = self._parameter_set["Current function [A]"].x[0] self._model_with_set_params = self._parameter_set.process_model( self._unprocessed_model, inplace=False @@ -124,6 +127,7 @@ def simulateS1(self, inputs, t_eval): Run the forward model and return the function evaulation and it's gradient aligning with Pints' ForwardModel simulateS1 method. """ + if self._built_model is None: raise ValueError("Model must be built before calling simulate") else: diff --git a/pybop/optimisers/pints_optimiser.py b/pybop/optimisers/pints_optimiser.py index 569d96c92..13cecd2bc 100644 --- a/pybop/optimisers/pints_optimiser.py +++ b/pybop/optimisers/pints_optimiser.py @@ -10,14 +10,14 @@ class GradientDescent(BaseOptimiser): def __init__(self, x0=None, xtol=None, method=None): super().__init__() self.name = "Gradient Descent Optimiser" - self.set_learning_rate = 0.025 - self.max_iterations = 100 - self.set_max_unchanged_iterations = 10 + self.learning_rate = 0.025 + self.max_iterations = 200 + self.max_unchanged_iterations = 10 - # if method is not None: - # self.method = method - # else: - # self.method = pints.GradientDescent + if method is not None: + self.method = method + else: + self.method = pints.GradientDescent def _runoptimise(self, cost_function, x0, bounds): """ @@ -31,23 +31,14 @@ def _runoptimise(self, cost_function, x0, bounds): bounds: bounds array """ - # Using the ask-and-tell interface - # self.method = pints.GradientDescent - # e = pints.SequentialEvaluator(cost_function.computeS1) - # error = pybop.PintsError(cost_function, x0) - # for i in range(50): - # xs = self.method.ask() - # fs = e.evaluate(xs) - # self.method.tell(fs) - # Set up optimisation controller controller = pints.OptimisationController( cost_function, x0, method=self.method ) - controller.set_max_unchanged_iterations(self.set_max_unchanged_iterations) + controller.set_max_unchanged_iterations(self.max_unchanged_iterations) controller.set_max_iterations(self.max_iterations) - controller.optimiser().set_learning_rate(self.set_learning_rate) + controller.optimiser().set_learning_rate(self.learning_rate) # Run the optimser x, final_cost = controller.run() From 99457db3c28bf0aec3ec705ba9ba2da9e77b2046 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Tue, 7 Nov 2023 18:44:57 +0000 Subject: [PATCH 166/210] Updt readme + contributing --- CONTRIBUTING.md | 21 ++----- README.md | 145 +++++++++++++++++++++--------------------------- 2 files changed, 68 insertions(+), 98 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f65361cd2..5926bedc1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,7 +6,7 @@ If you'd like to contribute to PyBOP, please have a look at the [pre-commit](#pr Before you commit any code, please perform the following checks: -- [All tests pass](#testing): `$ nox -s unit_test` +- [All tests pass](#testing): `$ nox -s unit` ### Installing and using pre-commit @@ -35,7 +35,7 @@ We use [GIT](https://en.wikipedia.org/wiki/Git) and [GitHub](https://en.wikipedi 2. Create a [branch](https://help.github.com/articles/creating-and-deleting-branches-within-your-repository/) of this repo (ideally on your own [fork](https://help.github.com/articles/fork-a-repo/)), where all changes will be made 3. Download the source code onto your local system, by [cloning](https://help.github.com/articles/cloning-a-repository/) the repository (or your fork of the repository). 4. [Install](Developer-Install) PyBOP with the developer options. -5. [Test](#testing) if your installation worked, using the test script: `$ python run-tests.py --unit`. +5. [Test](#testing) if your installation worked: `$ pytest --unit -v`. You now have everything you need to start making changes! @@ -120,13 +120,13 @@ All code requires testing. We use the [pytest](https://docs.pytest.org/en/) pack If you have nox installed, to run unit tests, type ```bash -nox -s unit_test +nox -s unit ``` else, type ```bash -python run-tests.py +pytest --unit -v ``` ### Writing tests @@ -146,24 +146,15 @@ This also means that, if you can't fix the bug yourself, it will be much easier 1. Run individual test scripts instead of the whole test suite: ```bash - python tests/unit/path/to/test + pytest tests/unit/path/to/test ``` You can also run an individual test from a particular script, e.g. ```bash - python tests/unit/test_quick_plot.py TestQuickPlot.test_failure + pytest tests/unit/test_quick_plot.py TestQuickPlot.test_failure ``` - If you want to run several, but not all, the tests from a script, you can restrict which tests are run from a particular script by using the skipping decorator: - - ```python - @unittest.skip("") - def test_bit_of_code(self): - ... - ``` - - or by just commenting out all the tests you don't want to run. 2. Set break-points, either in your IDE or using the Python debugging module. To use the latter, add the following line where you want to set the break point ```python diff --git a/README.md b/README.md index cf39db405..447a35b4f 100644 --- a/README.md +++ b/README.md @@ -34,13 +34,12 @@ <!-- Software Specification --> ## PyBOP -PyBOP provides a comprehensive suite of tools for parameterisation and optimisation of battery models. It aims to implement Bayesian and frequentist techniques with example workflows to guide the user. PyBOP can be applied to parameterise a wide range of battery models, including the electrochemical and equivalent circuit models available in [PyBaMM](https://pybamm.org/). A major emphasis in PyBOP is understandable and actionable diagnostics for the user, while still providing extensibility for advanced probabilistic methods. By building on the state-of-the-art battery models and leveraging Python's accessibility, PyBOP enables agile and robust parameterisation and optimisation. - -The figure below gives PyBOP's current conceptual structure. The living software specification of PyBOP can be found [here](https://github.com/pybop-team/software-spec). This package is under active development, expect API (Application Programming Interface) evolution with releases. +PyBOP offers a full range of tools for the parameterisation and optimisation of battery models, utilising both Bayesian and frequentist approaches with example workflows to assist the user. PyBOP can be used to parameterise various battery models, which include electrochemical and equivalent circuit models that are present in [PyBaMM](https://pybamm.org/). PyBOP prioritises clear and informative diagnostics for users, while also allowing for advanced probabilistic methods. +The diagram below presents PyBOP's conceptual framework. The PyBOP software specification is available at [this link](https://github.com/pybop-team/software-spec). This product is currently undergoing development, and users can expect the API to evolve with future releases. <p align="center"> - <img src="https://raw.githubusercontent.com/pybop-team/PyBOP/develop/assets/PyBOP_Architecture.png" alt="Data flows from battery cycling machines to Galv Harvesters, then to the Galv server and REST API. Metadata can be updated and data read using the web client, and data can be downloaded by the Python client." width="600" /> + <img src="https://raw.githubusercontent.com/pybop-team/PyBOP/develop/assets/PyBOP_Architecture.png" alt="Data flows from battery cycling machines to Galv Harvesters, then to the Galv server and REST API. Metadata can be updated and data read using the web client, and data can be downloaded by the Python client." width="400" /> </p> <!-- Getting Started --> @@ -48,7 +47,7 @@ The figure below gives PyBOP's current conceptual structure. The living software <!-- Installation --> ### Prerequisites -To use and/or contribute to PyBOP, you must first install Python 3 (specifically, 3.8-3.11). For example, on a Debian-based distribution (Debian, Ubuntu - including via WSL, Linux Mint), open a terminal and enter: +To use and/or contribute to PyBOP, first install Python (3.8-3.11). On a Debian-based distribution, this looks like: ```bash sudo apt update @@ -59,38 +58,24 @@ For further information, please refer to the similar [installation instructions ### Installation -Create a virtual environment called `pybop-env` within your current directory using: +Create a virtual environment called `pybop-env` within your current directory: ```bash virtualenv pybop-env ``` -Activate the environment with: +Activate the environment: ```bash source pybop-env/bin/activate ``` -You can check which version of python is installed within the virtual environment by typing: - -```bash -python --version -``` - -Later, you can deactivate the environment and go back to your original system using: +Later, you can deactivate the environment: ```bash deactivate ``` -Note that there are alternative packages that can be used to create and manage [virtual environments](https://realpython.com/python-virtual-environments-a-primer/), for example [pyenv](https://github.com/pyenv/pyenv#installation) and [pyenv-virtualenv](https://github.com/pyenv/pyenv-virtualenv#installation). In this case, follow the instructions to install these packages and then to create, activate and deactivate a virtual environment, use: - -```bash -pyenv virtualenv pybop-env -pyenv activate pybop-env -pyenv deactivate -``` - Within your virtual environment, install the `develop` branch of PyBOP: ```bash @@ -103,18 +88,8 @@ To alternatively install PyBOP from a local directory, use the following templat pip install -e "PATH_TO_PYBOP" ``` -Now, with PyBOP installed in your virtual environment, you can run Python scripts that import and use the functionality of this package. - -<!-- Example Usage --> -### Usage -PyBOP has two classes of intended use cases: -1. parameter estimation from battery test data -2. design optimisation subject to battery manufacturing/usage constraints - -These classes encompass a wide variety of optimisation problems, which depend on the choice of battery model, the available data and/or the choice of design parameters. - -### Parameter estimation -The example below shows a simple fitting routine that starts by generating synthetic data from a single particle model with modified parameter values. An RMSE cost function using the terminal voltage as the optimised signal is completed to determine the unknown parameter values. First, the synthetic data is generated: +### Example +The example below illustrates a straightforward process that begins by creating artificial data from a solo particle blueprint. The unknown parameter values are discovered by implementing an RMSE cost function using the terminal voltage as the observed signal. Initially, the simulated data is generated. ```python import pybop @@ -122,46 +97,42 @@ import pybamm import pandas as pd import numpy as np -def getdata(x0): - model = pybamm.lithium_ion.SPM() - params = model.default_parameter_values - - params.update( - { - "Negative electrode active material volume fraction": x0[0], - "Positive electrode active material volume fraction": x0[1], - } - ) - experiment = pybamm.Experiment( - [ - ( - "Discharge at 2C for 5 minutes (1 second period)", - "Rest for 2 minutes (1 second period)", - "Charge at 1C for 5 minutes (1 second period)", - "Rest for 2 minutes (1 second period)", - ), - ] - * 2 - ) - sim = pybamm.Simulation(model, experiment=experiment, parameter_values=params) - return sim.solve() - - -# Form observations -x0 = np.array([0.55, 0.63]) -solution = getdata(x0) +def getdata(self, model, x0): + model.parameter_set.update( + { + "Negative electrode active material volume fraction": x0[0], + "Positive electrode active material volume fraction": x0[1], + } + ) + experiment = pybamm.Experiment( + [ + ( + "Discharge at 1C for 3 minutes (1 second period)", + "Rest for 2 minutes (1 second period)", + "Charge at 1C for 3 minutes (1 second period)", + "Rest for 2 minutes (1 second period)", + ), + ] + * 2 + ) + sim = model.predict(init_soc=init_soc, experiment=experiment) + return sim ``` -Next, the observed variables are defined, with the model construction and parameter definitions following. Finally, the parameterisation class is constructed and parameter fitting is completed. +Next, we construct the model, define the dataset, and form the parameters. Lastly, we build the parameterisation class and complete the parameter fitting. ```python -observations = [ - pybop.Observed("Time [s]", solution["Time [s]"].data), - pybop.Observed("Current function [A]", solution["Current [A]"].data), - pybop.Observed("Voltage [V]", solution["Terminal voltage [V]"].data), -] - # Define model -model = pybop.models.lithium_ion.SPM() -model.parameter_set = model.pybamm_model.default_parameter_values +parameter_set = pybop.ParameterSet("pybamm", "Chen2020") +model = pybop.lithium_ion.SPM(parameter_set=parameter_set) + +# Form dataset +x0 = np.array([0.55, 0.63]) +solution = getdata(x0) + +dataset = [ + pybop.Dataset("Time [s]", solution["Time [s]"].data), + pybop.Dataset("Current function [A]", solution["Current [A]"].data), + pybop.Dataset("Voltage [V]", solution["Terminal voltage [V]"].data), +] # Fitting parameters params = [ @@ -177,29 +148,37 @@ params = [ ), ] -parameterisation = pybop.Parameterisation( - model, observations=observations, fit_parameters=params +# Define the cost to optimise +cost = pybop.RMSE() +signal = "Voltage [V]" + +# Select optimiser +optimiser = pybop.NLoptOptimize(n_param=len(parameters)) + +# Build the optimisation problem +parameterisation = pybop.Optimisation( + cost=cost, + model=model, + optimiser=optimiser, + parameters=parameters, + dataset=dataset, + signal=signal, ) -# get RMSE estimate using NLOpt -results, last_optim, num_evals = parameterisation.rmse( - signal="Voltage [V]", method="nlopt" # results = [0.54452026, 0.63064801] -) +# run the parameterisation +results, last_optim, num_evals = parameterisation.run() ``` <!-- Code of Conduct --> ## Code of Conduct -PyBOP aims to foster a broad consortium of developers and users, building on and -learning from the success of the [PyBaMM](https://pybamm.org/) community. Our values are: - -- Open-source (code and ideas should be shared) +PyBOP aims to foster a broad consortium of developers and users, building on and learning from the success of the [PyBaMM](https://pybamm.org/) community. Our values are: - Inclusivity and fairness (those who want to contribute may do so, and their input is appropriately recognised) -- Interoperability (aiming for modularity to enable maximum impact and inclusivity) +- Interoperability (Modularity to enable maximum impact and inclusivity) -- User-friendliness (putting user requirements first, thinking about user-assistance & workflows) +- User-friendliness (putting user requirements first via suser-assistance & workflows) <!-- Contributing --> From 433940f000da8382c9fb93be0bbe8ef5f9599eab Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Wed, 8 Nov 2023 09:12:05 +0000 Subject: [PATCH 167/210] Updt. optimisation class, signal defintion in problem class, examples updt. --- examples/scripts/grad_descent.py | 64 ++++++++-------------------- examples/scripts/rmse_estimation.py | 2 +- pybop/_problem.py | 2 +- pybop/optimisation.py | 17 -------- tests/unit/test_cost.py | 2 +- tests/unit/test_optimisation.py | 2 +- tests/unit/test_parameterisations.py | 6 +-- tests/unit/test_problem.py | 2 +- 8 files changed, 26 insertions(+), 71 deletions(-) diff --git a/examples/scripts/grad_descent.py b/examples/scripts/grad_descent.py index a2b9696c5..e8ac7f636 100644 --- a/examples/scripts/grad_descent.py +++ b/examples/scripts/grad_descent.py @@ -4,82 +4,54 @@ parameter_set = pybop.ParameterSet("pybamm", "Chen2020") model = pybop.lithium_ion.SPMe(parameter_set=parameter_set) -model.signal = "Terminal voltage [V]" # Fitting parameters parameters = [ pybop.Parameter( "Negative electrode active material volume fraction", - prior=pybop.Gaussian(0.57, 0.05), + prior=pybop.Gaussian(0.7, 0.05), bounds=[0.6, 0.9], ), pybop.Parameter( "Positive electrode active material volume fraction", prior=pybop.Gaussian(0.58, 0.05), bounds=[0.5, 0.8], - ), - pybop.Parameter( - "Current function [A]", - prior=pybop.Gaussian(1.2, 0.05), - bounds=[0.8, 1.3], - ), + ) ] -model.parameter_set.update( - { - "Negative electrode active material volume fraction": 0.53, - "Positive electrode active material volume fraction": 0.62, - "Current function [A]": 1.1, - } -) - +sigma = 0.001 t_eval = np.arange(0, 900, 2) values = model.predict(t_eval=t_eval) -voltage = values["Terminal voltage [V]"].data -time = values["Time [s]"].data - -sigma = 0.001 -CorruptValues = voltage + np.random.normal(0, sigma, len(voltage)) +CorruptValues = values["Terminal voltage [V]"].data + np.random.normal(0, sigma, len(t_eval)) dataset = [ - pybop.Dataset("Time [s]", time), + pybop.Dataset("Time [s]", t_eval), pybop.Dataset("Current function [A]", values["Current [A]"].data), pybop.Dataset("Terminal voltage [V]", CorruptValues), ] -# Show the generated data -plt.figure() -plt.xlabel("Time") -plt.ylabel("Values") -plt.plot(time, CorruptValues) -plt.plot(time, voltage) -plt.show() - -signal = "Terminal voltage [V]" -problem = pybop.Problem(model, parameters, signal, dataset) - -# Select a score function +# Generate problem, cost function, and optimisation class +problem = pybop.Problem(model, parameters, dataset) cost = pybop.SumSquaredError(problem) opt = pybop.Optimisation(cost, optimiser=pybop.GradientDescent()) opt.optimiser.learning_rate = 0.025 -opt.optimiser.max_unchanged_iterations=1 -opt.optimiser.max_iterations=50 +opt.optimiser.max_iterations=100 x, output, final_cost, num_evals = opt.run() print("Estimated parameters:", x) # Show the generated data -simulated_values = problem.evaluate(x[:3]) - -plt.figure(figsize=(5, 5), dpi=100, facecolor="w", edgecolor="k", linewidth=2, frameon=False) -plt.xlabel("Time", fontsize=20) -plt.ylabel("Values", fontsize=20) -plt.plot(time, CorruptValues, label="Measured") -plt.fill_between(time, simulated_values - sigma, simulated_values + sigma, alpha=0.2) -plt.plot(time, simulated_values, label="Simulated") +simulated_values = problem.evaluate(x) + +plt.figure(dpi=100) +plt.xlabel("Time", fontsize=12) +plt.ylabel("Values", fontsize=12) +plt.plot(t_eval, CorruptValues, label="Measured") +plt.fill_between(t_eval, simulated_values - sigma, simulated_values + sigma, alpha=0.2) +plt.plot(t_eval, simulated_values, label="Simulated") plt.legend( - bbox_to_anchor=(0.85, 1), loc="upper left", fontsize=20 + bbox_to_anchor=(0.6, 1), loc="upper left", fontsize=12 ) -plt.tick_params(axis='both', labelsize=20) +plt.tick_params(axis='both', labelsize=12) plt.show() diff --git a/examples/scripts/rmse_estimation.py b/examples/scripts/rmse_estimation.py index 9766e40ce..190788344 100644 --- a/examples/scripts/rmse_estimation.py +++ b/examples/scripts/rmse_estimation.py @@ -32,7 +32,7 @@ # Define the cost to optimise signal = "Terminal voltage [V]" -problem = pybop.Problem(model, parameters, signal, dataset, init_soc=0.98) +problem = pybop.Problem(model, parameters, dataset, signal=signal, init_soc=0.98) cost = pybop.RootMeanSquaredError(problem) # Build the optimisation problem diff --git a/pybop/_problem.py b/pybop/_problem.py index f750ef424..9f8c2bf4e 100644 --- a/pybop/_problem.py +++ b/pybop/_problem.py @@ -10,8 +10,8 @@ def __init__( self, model, parameters, - signal, dataset, + signal="Terminal voltage [V]", check_model=True, init_soc=None, x0=None, diff --git a/pybop/optimisation.py b/pybop/optimisation.py index 66c5b6120..b6a88befe 100644 --- a/pybop/optimisation.py +++ b/pybop/optimisation.py @@ -28,20 +28,3 @@ def run(self): ) return results - - def cost_function(self, x, grad=None): - """ - Compute a model prediction and associated value of the cost. - """ - - # Update the parameter dictionary - for i, key in enumerate(self.cost._problem.fit_parameters): - self.fit_parameters[key] = x[i] - - # Compute cost - res = self.cost.compute(self.fit_parameters) - - if self.verbose: - print("Parameter estimates: ", self.cost._problem.parameters, "\n") - - return res diff --git a/tests/unit/test_cost.py b/tests/unit/test_cost.py index a88a1a273..363a8b63e 100644 --- a/tests/unit/test_cost.py +++ b/tests/unit/test_cost.py @@ -31,7 +31,7 @@ def test_RootMeanSquaredError(self): ] signal = "Voltage [V]" - problem = pybop.Problem(model, parameters, signal, dataset) + problem = pybop.Problem(model, parameters, dataset, signal=signal) cost = pybop.RootMeanSquaredError(problem) cost.compute([0.5]) diff --git a/tests/unit/test_optimisation.py b/tests/unit/test_optimisation.py index 0f83d5a96..2a1de60a4 100644 --- a/tests/unit/test_optimisation.py +++ b/tests/unit/test_optimisation.py @@ -28,7 +28,7 @@ def test_prior_sampling(self): ] signal = "Terminal voltage [V]" - problem = pybop.Problem(model, param, signal, dataset) + problem = pybop.Problem(model, param, dataset, signal=signal) cost = pybop.RootMeanSquaredError(problem) for i in range(50): diff --git a/tests/unit/test_parameterisations.py b/tests/unit/test_parameterisations.py index be6fc2373..12a5560e5 100644 --- a/tests/unit/test_parameterisations.py +++ b/tests/unit/test_parameterisations.py @@ -44,7 +44,7 @@ def test_spm(self, init_soc): # Define the cost to optimise signal = "Terminal voltage [V]" - problem = pybop.Problem(model, parameters, signal, dataset, init_soc=init_soc) + problem = pybop.Problem(model, parameters, dataset, signal=signal, init_soc=init_soc) cost = pybop.RootMeanSquaredError(problem) # Select optimiser @@ -95,7 +95,7 @@ def test_spme_multiple_optimisers(self, init_soc): # Define the cost to optimise signal = "Terminal voltage [V]" - problem = pybop.Problem(model, parameters, signal, dataset, init_soc=init_soc) + problem = pybop.Problem(model, parameters, dataset, signal=signal, init_soc=init_soc) cost = pybop.RootMeanSquaredError(problem) # Select optimisers @@ -153,7 +153,7 @@ def test_model_misparameterisation(self, init_soc): # Define the cost to optimise signal = "Terminal voltage [V]" - problem = pybop.Problem(model, parameters, signal, dataset, init_soc=init_soc) + problem = pybop.Problem(model, parameters, dataset, signal=signal, init_soc=init_soc) cost = pybop.RootMeanSquaredError(problem) # Select optimiser diff --git a/tests/unit/test_problem.py b/tests/unit/test_problem.py index 6556bf702..ec415dc53 100644 --- a/tests/unit/test_problem.py +++ b/tests/unit/test_problem.py @@ -37,7 +37,7 @@ def test_problem(self): pybop.Dataset("Voltage [V]", solution["Terminal voltage [V]"].data), ] - problem = pybop.Problem(model, parameters, signal, dataset) + problem = pybop.Problem(model, parameters, dataset, signal=signal) assert problem._model == model assert problem._model._built_model is not None From cccdca3e58cd3e0cccf1ffc1c8f4d03c63e10132 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Wed, 8 Nov 2023 09:17:16 +0000 Subject: [PATCH 168/210] Updt. Fig1 size, new example --- README.md | 98 +++++++++++++++++++------------------------------------ 1 file changed, 34 insertions(+), 64 deletions(-) diff --git a/README.md b/README.md index 447a35b4f..0eb6bf3c4 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ PyBOP offers a full range of tools for the parameterisation and optimisation of The diagram below presents PyBOP's conceptual framework. The PyBOP software specification is available at [this link](https://github.com/pybop-team/software-spec). This product is currently undergoing development, and users can expect the API to evolve with future releases. <p align="center"> - <img src="https://raw.githubusercontent.com/pybop-team/PyBOP/develop/assets/PyBOP_Architecture.png" alt="Data flows from battery cycling machines to Galv Harvesters, then to the Galv server and REST API. Metadata can be updated and data read using the web client, and data can be downloaded by the Python client." width="400" /> + <img src="https://raw.githubusercontent.com/pybop-team/PyBOP/develop/assets/PyBOP_Architecture.png" alt="Data flows from battery cycling machines to Galv Harvesters, then to the Galv server and REST API. Metadata can be updated and data read using the web client, and data can be downloaded by the Python client." width="600" /> </p> <!-- Getting Started --> @@ -89,84 +89,54 @@ pip install -e "PATH_TO_PYBOP" ``` ### Example -The example below illustrates a straightforward process that begins by creating artificial data from a solo particle blueprint. The unknown parameter values are discovered by implementing an RMSE cost function using the terminal voltage as the observed signal. Initially, the simulated data is generated. +The example below illustrates a straightforward process that begins by creating artificial data from a solo particle blueprint. The unknown parameter values are discovered by implementing an RMSE cost function using the terminal voltage as the observed signal. ```python import pybop -import pybamm -import pandas as pd import numpy as np +import matplotlib.pyplot as plt -def getdata(self, model, x0): - model.parameter_set.update( - { - "Negative electrode active material volume fraction": x0[0], - "Positive electrode active material volume fraction": x0[1], - } - ) - experiment = pybamm.Experiment( - [ - ( - "Discharge at 1C for 3 minutes (1 second period)", - "Rest for 2 minutes (1 second period)", - "Charge at 1C for 3 minutes (1 second period)", - "Rest for 2 minutes (1 second period)", - ), - ] - * 2 - ) - sim = model.predict(init_soc=init_soc, experiment=experiment) - return sim -``` -Next, we construct the model, define the dataset, and form the parameters. Lastly, we build the parameterisation class and complete the parameter fitting. -```python -# Define model +# Parameter set and model definition parameter_set = pybop.ParameterSet("pybamm", "Chen2020") -model = pybop.lithium_ion.SPM(parameter_set=parameter_set) - -# Form dataset -x0 = np.array([0.55, 0.63]) -solution = getdata(x0) - -dataset = [ - pybop.Dataset("Time [s]", solution["Time [s]"].data), - pybop.Dataset("Current function [A]", solution["Current [A]"].data), - pybop.Dataset("Voltage [V]", solution["Terminal voltage [V]"].data), -] +model = pybop.lithium_ion.SPMe(parameter_set=parameter_set) # Fitting parameters -params = [ +parameters = [ pybop.Parameter( "Negative electrode active material volume fraction", - prior=pybop.Gaussian(0.5, 0.05), - bounds=[0.35, 0.75], + prior=pybop.Gaussian(0.7, 0.05), + bounds=[0.6, 0.9], ), pybop.Parameter( "Positive electrode active material volume fraction", - prior=pybop.Gaussian(0.65, 0.05), - bounds=[0.45, 0.85], - ), + prior=pybop.Gaussian(0.58, 0.05), + bounds=[0.5, 0.8], + ) ] -# Define the cost to optimise -cost = pybop.RMSE() -signal = "Voltage [V]" - -# Select optimiser -optimiser = pybop.NLoptOptimize(n_param=len(parameters)) - -# Build the optimisation problem -parameterisation = pybop.Optimisation( - cost=cost, - model=model, - optimiser=optimiser, - parameters=parameters, - dataset=dataset, - signal=signal, -) - -# run the parameterisation -results, last_optim, num_evals = parameterisation.run() +# Generate data +sigma = 0.005 +t_eval = np.arange(0, 900, 2) +values = model.predict(t_eval=t_eval) +CorruptValues = values["Terminal voltage [V]"].data + np.random.normal(0, sigma, len(t_eval)) + +# Dataset definition +dataset = [ + pybop.Dataset("Time [s]", t_eval), + pybop.Dataset("Current function [A]", values["Current [A]"].data), + pybop.Dataset("Terminal voltage [V]", CorruptValues), +] + +# Generate problem, cost function, and optimisation class +problem = pybop.Problem(model, parameters, dataset) +cost = pybop.SumSquaredError(problem) +opt = pybop.Optimisation(cost, optimiser=pybop.GradientDescent()) +opt.optimiser.learning_rate = 0.025 +opt.optimiser.max_iterations = 100 + +# Run optimisation +x, output, final_cost, num_evals = opt.run() +print("Estimated parameters:", x) ``` <!-- Code of Conduct --> From 225964b71b5b1b710174fc04ffddb418891d4776 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Wed, 8 Nov 2023 15:41:49 +0000 Subject: [PATCH 169/210] Pints integration structure change, Inherit pints.optimisers, merging functionality between pints.OptimisationController & pybop.Optimisation --- examples/scripts/grad_descent.py | 20 +-- examples/scripts/rmse_estimation.py | 19 +-- pybop/__init__.py | 2 +- pybop/costs/error_costs.py | 15 +- pybop/models/base_model.py | 2 - pybop/optimisation.py | 215 ++++++++++++++++++++++++++- pybop/optimisers/nlopt_optimize.py | 2 +- pybop/optimisers/pints_optimiser.py | 156 ------------------- pybop/optimisers/pints_optimisers.py | 10 ++ pybop/optimisers/scipy_minimize.py | 6 +- tests/unit/test_optimisation.py | 4 +- tests/unit/test_parameterisations.py | 20 ++- 12 files changed, 261 insertions(+), 210 deletions(-) delete mode 100644 pybop/optimisers/pints_optimiser.py create mode 100644 pybop/optimisers/pints_optimisers.py diff --git a/examples/scripts/grad_descent.py b/examples/scripts/grad_descent.py index e8ac7f636..93f15fdd8 100644 --- a/examples/scripts/grad_descent.py +++ b/examples/scripts/grad_descent.py @@ -16,13 +16,15 @@ "Positive electrode active material volume fraction", prior=pybop.Gaussian(0.58, 0.05), bounds=[0.5, 0.8], - ) + ), ] sigma = 0.001 t_eval = np.arange(0, 900, 2) values = model.predict(t_eval=t_eval) -CorruptValues = values["Terminal voltage [V]"].data + np.random.normal(0, sigma, len(t_eval)) +CorruptValues = values["Terminal voltage [V]"].data + np.random.normal( + 0, sigma, len(t_eval) +) dataset = [ pybop.Dataset("Time [s]", t_eval), @@ -33,12 +35,12 @@ # Generate problem, cost function, and optimisation class problem = pybop.Problem(model, parameters, dataset) cost = pybop.SumSquaredError(problem) -opt = pybop.Optimisation(cost, optimiser=pybop.GradientDescent()) +opt = pybop.Optimisation(cost, optimiser=pybop.GradientDescent) -opt.optimiser.learning_rate = 0.025 -opt.optimiser.max_iterations=100 +opt.learning_rate = 0.025 +opt.max_iterations = 100 -x, output, final_cost, num_evals = opt.run() +x = opt.run() print("Estimated parameters:", x) # Show the generated data @@ -50,8 +52,6 @@ plt.plot(t_eval, CorruptValues, label="Measured") plt.fill_between(t_eval, simulated_values - sigma, simulated_values + sigma, alpha=0.2) plt.plot(t_eval, simulated_values, label="Simulated") -plt.legend( - bbox_to_anchor=(0.6, 1), loc="upper left", fontsize=12 -) -plt.tick_params(axis='both', labelsize=12) +plt.legend(bbox_to_anchor=(0.6, 1), loc="upper left", fontsize=12) +plt.tick_params(axis="both", labelsize=12) plt.show() diff --git a/examples/scripts/rmse_estimation.py b/examples/scripts/rmse_estimation.py index 190788344..89ff873cf 100644 --- a/examples/scripts/rmse_estimation.py +++ b/examples/scripts/rmse_estimation.py @@ -37,7 +37,7 @@ # Build the optimisation problem parameterisation = pybop.Optimisation( - cost=cost, optimiser=pybop.NLoptOptimize(n_param=len(parameters)) + cost=cost, optimiser=pybop.NLoptOptimize ) # Run the optimisation problem @@ -51,20 +51,5 @@ plt.ylabel("Values") plt.plot(dataset[0].data, dataset[2].data, label="Measured") plt.plot(dataset[0].data, simulated_values, label="Simulated") -plt.legend( - bbox_to_anchor=(1.05, 1), loc="upper left", borderaxespad=0.0, frameon=False -) +plt.legend(bbox_to_anchor=(0.6, 1), loc="upper left", fontsize=12) plt.show() - - -# get MAP estimate, starting at a random initial point in parameter space -# parameterisation.map(x0=[p.sample() for p in parameters]) - -# or sample from posterior -# parameterisation.sample(1000, n_chains=4, ....) - -# or SOBER -# parameterisation.sober() - - -# Optimisation = pybop.optimisation(model, cost=cost, parameters=parameters, observation=observation) diff --git a/pybop/__init__.py b/pybop/__init__.py index fe0502d56..93f457bb5 100644 --- a/pybop/__init__.py +++ b/pybop/__init__.py @@ -50,7 +50,7 @@ from .optimisers.base_optimiser import BaseOptimiser from .optimisers.nlopt_optimize import NLoptOptimize from .optimisers.scipy_minimize import SciPyMinimize -from .optimisers.pints_optimiser import GradientDescent +from .optimisers.pints_optimisers import GradientDescent # # Parameter classes diff --git a/pybop/costs/error_costs.py b/pybop/costs/error_costs.py index b0ad06276..c5792e121 100644 --- a/pybop/costs/error_costs.py +++ b/pybop/costs/error_costs.py @@ -32,14 +32,14 @@ class ProblemCost(BaseCost): def __init__(self, problem): super(ProblemCost, self).__init__() - self._problem = problem + self.problem = problem self._target = problem._target def n_parameters(self): """ Returns the dimension of the parameter space. """ - return self._problem.n_parameters + return self.problem.n_parameters class RootMeanSquaredError(ProblemCost): @@ -56,7 +56,7 @@ def __init__(self, problem): def compute(self, x, grad=None): # Compute the cost try: - return np.sqrt(np.mean((self._problem.evaluate(x) - self._target) ** 2)) + return np.sqrt(np.mean((self.problem.evaluate(x) - self._target) ** 2)) except Exception as e: raise ValueError(f"Error in RMSE calculation: {e}") @@ -76,13 +76,14 @@ def __init__(self, problem): def compute(self, x, grad=None): # Compute the cost - return np.sum((np.sum(((self._problem.evaluate(x) - self._target)**2), - axis=0)), axis=0) + return np.sum( + (np.sum(((self.problem.evaluate(x) - self._target) ** 2), axis=0)), axis=0 + ) def evaluateS1(self, x): # Compute the cost - y, dy = self._problem.evaluateS1(x) - dy = dy.reshape((450, 1, self._problem.n_parameters)) + y, dy = self.problem.evaluateS1(x) + dy = dy.reshape((450, 1, self.problem.n_parameters)) r = y - self._target e = np.sum(np.sum(r**2, axis=0), axis=0) de = 2 * np.sum(np.sum((r.T * dy.T), axis=2), axis=1) diff --git a/pybop/models/base_model.py b/pybop/models/base_model.py index 92f3f3dbc..0584fb276 100644 --- a/pybop/models/base_model.py +++ b/pybop/models/base_model.py @@ -31,7 +31,6 @@ def build( if self.fit_parameters is not None: self.fit_keys = list(self.fit_parameters.keys()) - if init_soc is not None: self.set_init_soc(init_soc) @@ -84,7 +83,6 @@ def set_params(self): for i in self.fit_parameters.keys(): self._parameter_set[i] = "[input]" - if self.dataset is not None and self.fit_parameters is not None: if "Current function [A]" not in self.fit_keys: self.parameter_set["Current function [A]"] = pybamm.Interpolant( diff --git a/pybop/optimisation.py b/pybop/optimisation.py index b6a88befe..ec643a44e 100644 --- a/pybop/optimisation.py +++ b/pybop/optimisation.py @@ -1,3 +1,8 @@ +import pybop +import pints +import numpy as np + + class Optimisation: """ Optimisation class for PyBOP. @@ -10,21 +15,223 @@ def __init__( verbose=False, ): self.cost = cost + self.problem = cost.problem self.optimiser = optimiser self.verbose = verbose - self.x0 = cost._problem.x0 - self.bounds = cost._problem.bounds + self.x0 = cost.problem.x0 + self.bounds = cost.problem.bounds self.fit_parameters = {} + self.learning_rate = 0.025 + self.max_iterations = 200 + self.max_unchanged_iterations = 10 + self.max_evaluations = None + self.threshold = None + + # Check if minimising or maximising + self._minimising = not isinstance(cost, pints.LogPDF) + + if self._minimising: + self._function = cost + else: + self._function = pints.ProbabilityBasedError(cost) + del cost def run(self): """ Run the optimisation algorithm. + Selects between PyBOP backend or Pints backend. + returns: + x: best parameters + output: optimiser output + final_cost: final cost + num_evals: number of evaluations """ - results = self.optimiser.optimise( + if issubclass(self.optimiser, pints.Optimiser): + x, output, final_cost, num_evals = self._run_pints() + else: + if issubclass(self.optimiser, pybop.NLoptOptimize): + self.optimiser = self.optimiser(self.problem.n_parameters) + elif issubclass(self.optimiser, pybop.SciPyMinimize): + self.optimiser = self.optimiser() + + x, output, final_cost, num_evals = self._run_pybop() + + return x, output, final_cost, num_evals + + def _run_pybop(self): + """ + Run method for PyBOP optimisers. + """ + x, output, final_cost, num_evals = self.optimiser.optimise( cost_function=self.cost, x0=self.x0, bounds=self.bounds, ) + return x, output, final_cost, num_evals + + def _run_pints(self): + """ + Run method for PINTS optimisers. + This method is based on the run method in the PINTS.OptimisationController class. + """ + + # Check stopping criteria + has_stopping_criterion = False + has_stopping_criterion |= self.max_iterations is not None + has_stopping_criterion |= self.max_unchanged_iterations is not None + has_stopping_criterion |= self.max_evaluations is not None + has_stopping_criterion |= self.threshold is not None + if not has_stopping_criterion: + raise ValueError("At least one stopping criterion must be set.") + + # Iterations and function evaluations + iteration = 0 + evaluations = 0 + + # Unchanged iterations count (used for stopping or just for + # information) + unchanged_iterations = 0 + + # Choose method to evaluate + f = self._function + if self._needs_sensitivities: + f = f.evaluateS1 + + # Create evaluator object + evaluator = pints.SequentialEvaluator(f) + + # Keep track of current best and best-guess scores. + fb = fg = np.inf + + # Internally we always minimise! Keep a 2nd value to show the user. + fb_user, fg_user = (fb, fg) if self._minimising else (-fb, -fg) + + # Keep track of the last significant change + f_sig = np.inf + + # Set up progress reporting + running = True + try: + while running: + # Ask optimiser for new points + xs = self._optimiser.ask() + + # Evaluate points + fs = evaluator.evaluate(xs) + + # Tell optimiser about function values + self._optimiser.tell(fs) + + # Update the scores + fb = self._optimiser.f_best() + fg = self._optimiser.f_guess() + fb_user, fg_user = (fb, fg) if self._minimising else (-fb, -fg) + + # Check for significant changes + f_new = fg if self._use_f_guessed else fb + if np.abs(f_new - f_sig) >= self._unchanged_threshold: + unchanged_iterations = 0 + f_sig = f_new + else: + unchanged_iterations += 1 + + # Update evaluation count + evaluations += len(fs) + + # Update iteration count + iteration += 1 + + # + # Check stopping criteria + # + + # Maximum number of iterations + if ( + self._max_iterations is not None + and iteration >= self._max_iterations + ): + running = False + ( + "Maximum number of iterations (" + str(iteration) + ") reached." + ) + + # Maximum number of iterations without significant change + halt = ( + self._unchanged_max_iterations is not None + and unchanged_iterations >= self._unchanged_max_iterations + ) + if running and halt: + running = False + ( + "No significant change for " + + str(unchanged_iterations) + + " iterations." + ) + + # Maximum number of evaluations + if ( + self._max_evaluations is not None + and evaluations >= self._max_evaluations + ): + running = False + ( + "Maximum number of evaluations (" + + str(self._max_evaluations) + + ") reached." + ) + + # Threshold value + halt = self._threshold is not None and f_new < self._threshold + if running and halt: + running = False + ( + "Objective function crossed threshold: " + + str(self._threshold) + + "." + ) + + # Error in optimiser + error = self._optimiser.stop() + if error: # pragma: no cover + running = False + str(error) + + elif self._callback is not None: + self._callback(iteration - 1, self._optimiser) + + except (Exception, SystemExit, KeyboardInterrupt): # pragma: no cover + # Unexpected end! + # Show last result and exit + print("\n" + "-" * 40) + print("Unexpected termination.") + print("Current score: " + str(fg_user)) + print("Current position:") + + # Show current parameters + x_user = self._optimiser.x_guessed() + if self._transformation is not None: + x_user = self._transformation.to_model(x_user) + for p in x_user: + print(pints.strfloat(p)) + print("-" * 40) + raise + + # Save post-run statistics + self._evaluations = evaluations + self._iterations = iteration + + # Get best parameters + if self._use_f_guessed: + x = self._optimiser.x_guessed() + f = self._optimiser.f_guessed() + else: + x = self._optimiser.x_best() + f = self._optimiser.f_best() + + # Inverse transform search parameters + if self._transformation is not None: + x = self._transformation.to_model(x) - return results + # Return best position and score + return x, f if self._minimising else -f diff --git a/pybop/optimisers/nlopt_optimize.py b/pybop/optimisers/nlopt_optimize.py index d770632bb..eca5e71da 100644 --- a/pybop/optimisers/nlopt_optimize.py +++ b/pybop/optimisers/nlopt_optimize.py @@ -9,7 +9,7 @@ class NLoptOptimize(BaseOptimiser): def __init__(self, n_param, xtol=None, method=None): super().__init__() - self.name = "NLOpt Optimiser" + self.name = "NLoptOptimize" if method is not None: self.optim = nlopt.opt(method, n_param) diff --git a/pybop/optimisers/pints_optimiser.py b/pybop/optimisers/pints_optimiser.py deleted file mode 100644 index 13cecd2bc..000000000 --- a/pybop/optimisers/pints_optimiser.py +++ /dev/null @@ -1,156 +0,0 @@ -import pints -from .base_optimiser import BaseOptimiser - - -class GradientDescent(BaseOptimiser): - """ - Class for the PINTS optimisation. Extends the BaseOptimiser class. - """ - - def __init__(self, x0=None, xtol=None, method=None): - super().__init__() - self.name = "Gradient Descent Optimiser" - self.learning_rate = 0.025 - self.max_iterations = 200 - self.max_unchanged_iterations = 10 - - if method is not None: - self.method = method - else: - self.method = pints.GradientDescent - - def _runoptimise(self, cost_function, x0, bounds): - """ - Run the PINTS optimisation method. - - Inputs - ---------- - cost_function: function for optimising - method: optimisation algorithm - x0: initialisation array - bounds: bounds array - """ - - # Set up optimisation controller - controller = pints.OptimisationController( - cost_function, x0, method=self.method - ) - - controller.set_max_unchanged_iterations(self.max_unchanged_iterations) - controller.set_max_iterations(self.max_iterations) - controller.optimiser().set_learning_rate(self.learning_rate) - - # Run the optimser - x, final_cost = controller.run() - - # Get performance statistics - # output = *pass all output* - # final_cost - # num_evals - output = None - num_evals = None - - return x, output, final_cost, num_evals - - -# class PintsError(ErrorMeasure): -# """ -# An interface class for PyBOP that extends the PINTS ErrorMeasure class. - -# From PINTS: -# Abstract base class for objects that calculate some scalar measure of -# goodness-of-fit (for a model and a data set), such that a smaller value -# means a better fit. - -# ErrorMeasures are callable objects: If ``e`` is an instance of an -# :class:`ErrorMeasure` class you can calculate the error by calling ``e(p)`` -# where ``p`` is a point in parameter space. -# """ - -# def __init__(self, cost_function, x0): -# self.cost_function = cost_function -# self.x0 = x0 - -# def __call__(self, x): -# cost = self.cost_function(x) - -# return cost - -# def evaluateS1(self, x): -# """ -# Evaluates this error measure, and returns the result plus the partial -# derivatives of the result with respect to the parameters. - -# The returned data has the shape ``(e, e')`` where ``e`` is a scalar -# value and ``e'`` is a sequence of length ``n_parameters``. - -# *This is an optional method that is not always implemented.* -# """ -# raise NotImplementedError - -# def n_parameters(self): -# """ -# Returns the dimension of the parameter space this measure is defined -# over. -# """ -# return len(self.x0) - - -# class PintsBoundaries(object): -# """ -# An interface class for PyBOP that extends the PINTS ErrorMeasure class. - -# From PINTS: -# Abstract class representing boundaries on a parameter space. -# """ - -# def __init__(self, bounds, x0): -# self.bounds = bounds -# self.x0 = x0 - -# def check(self, parameters): -# """ -# Returns ``True`` if and only if the given point in parameter space is -# within the boundaries. - -# Parameters -# ---------- -# parameters -# A point in parameter space -# """ -# result = False -# if ( -# parameters[0] >= self.bounds["lower"][0] -# and parameters[1] >= self.bounds["lower"][1] -# and parameters[0] <= self.bounds["upper"][0] -# and parameters[1] <= self.bounds["upper"][1] -# ): -# result = True - -# return result - -# def n_parameters(self): -# """ -# Returns the dimension of the parameter space these boundaries are -# defined on. -# """ -# return len(self.x0) - -# def sample(self, n=1): -# """ -# Returns ``n`` random samples from within the boundaries, for example to -# use as starting points for an optimisation. - -# The returned value is a NumPy array with shape ``(n, d)`` where ``n`` -# is the requested number of samples, and ``d`` is the dimension of the -# parameter space these boundaries are defined on. - -# *Note that implementing :meth:`sample()` is optional, so some boundary -# types may not support it.* - -# Parameters -# ---------- -# n : int -# The number of points to sample -# """ -# raise NotImplementedError diff --git a/pybop/optimisers/pints_optimisers.py b/pybop/optimisers/pints_optimisers.py new file mode 100644 index 000000000..9c38599df --- /dev/null +++ b/pybop/optimisers/pints_optimisers.py @@ -0,0 +1,10 @@ +import pints + + +class GradientDescent(pints.GradientDescent): + """ + Class for the PINTS optimisation. Extends the BaseOptimiser class. + """ + + def __init__(self, x0, sigma0=0.1, boundaries=None): + super().__init__(x0, sigma0, boundaries) diff --git a/pybop/optimisers/scipy_minimize.py b/pybop/optimisers/scipy_minimize.py index f4e912732..7427655d6 100644 --- a/pybop/optimisers/scipy_minimize.py +++ b/pybop/optimisers/scipy_minimize.py @@ -9,9 +9,9 @@ class SciPyMinimize(BaseOptimiser): def __init__(self, method=None, bounds=None): super().__init__() + self.name = "SciPyMinimize" self.method = method self.bounds = bounds - self.name = "SciPy Optimiser" if self.method is None: self.method = "L-BFGS-B" @@ -33,7 +33,9 @@ def _runoptimise(self, cost_function, x0, bounds): bounds = ( (lower, upper) for lower, upper in zip(bounds["lower"], bounds["upper"]) ) - output = minimize(cost_function.compute, x0, method=self.method, bounds=bounds) + output = minimize( + cost_function.compute, x0, method=self.method, bounds=bounds + ) else: output = minimize(cost_function.compute, x0, method=self.method) diff --git a/tests/unit/test_optimisation.py b/tests/unit/test_optimisation.py index 2a1de60a4..c77055e2f 100644 --- a/tests/unit/test_optimisation.py +++ b/tests/unit/test_optimisation.py @@ -32,8 +32,6 @@ def test_prior_sampling(self): cost = pybop.RootMeanSquaredError(problem) for i in range(50): - opt = pybop.Optimisation( - cost=cost, optimiser=pybop.NLoptOptimize(n_param=len(param)) - ) + opt = pybop.Optimisation(cost=cost, optimiser=pybop.NLoptOptimize) assert opt.x0 <= 0.77 and opt.x0 >= 0.73 diff --git a/tests/unit/test_parameterisations.py b/tests/unit/test_parameterisations.py index 12a5560e5..e37031744 100644 --- a/tests/unit/test_parameterisations.py +++ b/tests/unit/test_parameterisations.py @@ -44,11 +44,13 @@ def test_spm(self, init_soc): # Define the cost to optimise signal = "Terminal voltage [V]" - problem = pybop.Problem(model, parameters, dataset, signal=signal, init_soc=init_soc) + problem = pybop.Problem( + model, parameters, dataset, signal=signal, init_soc=init_soc + ) cost = pybop.RootMeanSquaredError(problem) # Select optimiser - optimiser = pybop.NLoptOptimize(n_param=len(parameters)) + optimiser = pybop.NLoptOptimize # Build the optimisation problem parameterisation = pybop.Optimisation(cost=cost, optimiser=optimiser) @@ -95,13 +97,15 @@ def test_spme_multiple_optimisers(self, init_soc): # Define the cost to optimise signal = "Terminal voltage [V]" - problem = pybop.Problem(model, parameters, dataset, signal=signal, init_soc=init_soc) + problem = pybop.Problem( + model, parameters, dataset, signal=signal, init_soc=init_soc + ) cost = pybop.RootMeanSquaredError(problem) # Select optimisers optimisers = [ - pybop.NLoptOptimize(n_param=len(parameters)), - pybop.SciPyMinimize(), + pybop.NLoptOptimize, + pybop.SciPyMinimize, ] # Test each optimiser @@ -153,11 +157,13 @@ def test_model_misparameterisation(self, init_soc): # Define the cost to optimise signal = "Terminal voltage [V]" - problem = pybop.Problem(model, parameters, dataset, signal=signal, init_soc=init_soc) + problem = pybop.Problem( + model, parameters, dataset, signal=signal, init_soc=init_soc + ) cost = pybop.RootMeanSquaredError(problem) # Select optimiser - optimiser = pybop.NLoptOptimize(n_param=len(parameters)) + optimiser = pybop.NLoptOptimize # Build the optimisation problem parameterisation = pybop.Optimisation(cost=cost, optimiser=optimiser) From 17ccfbe02eedbd2507a17b583188b7cfc2fe57dd Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 9 Nov 2023 09:26:17 +0000 Subject: [PATCH 170/210] Add Pints requirements to optimiser & optimisation class --- examples/scripts/rmse_estimation.py | 4 +- pybop/optimisation.py | 55 ++++++++++++++---------- pybop/optimisers/nlopt_optimize.py | 6 +++ pybop/optimisers/pints_optimisers.py | 63 +++++++++++++++++++++++++++- pybop/optimisers/scipy_minimize.py | 6 +++ 5 files changed, 109 insertions(+), 25 deletions(-) diff --git a/examples/scripts/rmse_estimation.py b/examples/scripts/rmse_estimation.py index 89ff873cf..27a3e53e6 100644 --- a/examples/scripts/rmse_estimation.py +++ b/examples/scripts/rmse_estimation.py @@ -36,9 +36,7 @@ cost = pybop.RootMeanSquaredError(problem) # Build the optimisation problem -parameterisation = pybop.Optimisation( - cost=cost, optimiser=pybop.NLoptOptimize -) +parameterisation = pybop.Optimisation(cost=cost, optimiser=pybop.NLoptOptimize) # Run the optimisation problem x, output, final_cost, num_evals = parameterisation.run() diff --git a/pybop/optimisation.py b/pybop/optimisation.py index ec643a44e..73ed33365 100644 --- a/pybop/optimisation.py +++ b/pybop/optimisation.py @@ -26,6 +26,7 @@ def __init__( self.max_unchanged_iterations = 10 self.max_evaluations = None self.threshold = None + self.sigma0 = 0.1 # Check if minimising or maximising self._minimising = not isinstance(cost, pints.LogPDF) @@ -36,6 +37,25 @@ def __init__( self._function = pints.ProbabilityBasedError(cost) del cost + # Create optimiser + if self.optimiser is None or issubclass(self.optimiser, pints.Optimiser): + self.pints = True + self.optimiser = self.optimiser or pints.CMAES + self.optimiser = optimiser(self.x0, self.sigma0, self.bounds) + + elif issubclass(self.optimiser, pybop.NLoptOptimize): + self.pints = False + self.optimiser = self.optimiser(self.problem.n_parameters) + + elif issubclass(self.optimiser, pybop.SciPyMinimize): + self.pints = False + self.optimiser = self.optimiser() + else: + raise ValueError("Optimiser selected is not supported.") + + # Check if sensitivities are required + self._needs_sensitivities = self.optimiser.needs_sensitivities() + def run(self): """ Run the optimisation algorithm. @@ -47,14 +67,9 @@ def run(self): num_evals: number of evaluations """ - if issubclass(self.optimiser, pints.Optimiser): + if self.pints: x, output, final_cost, num_evals = self._run_pints() - else: - if issubclass(self.optimiser, pybop.NLoptOptimize): - self.optimiser = self.optimiser(self.problem.n_parameters) - elif issubclass(self.optimiser, pybop.SciPyMinimize): - self.optimiser = self.optimiser() - + elif not self.pints: x, output, final_cost, num_evals = self._run_pybop() return x, output, final_cost, num_evals @@ -115,17 +130,17 @@ def _run_pints(self): try: while running: # Ask optimiser for new points - xs = self._optimiser.ask() + xs = self.optimiser.ask() # Evaluate points fs = evaluator.evaluate(xs) # Tell optimiser about function values - self._optimiser.tell(fs) + self.optimiser.tell(fs) # Update the scores - fb = self._optimiser.f_best() - fg = self._optimiser.f_guess() + fb = self.optimiser.f_best() + fg = self.optimiser.f_guess() fb_user, fg_user = (fb, fg) if self._minimising else (-fb, -fg) # Check for significant changes @@ -152,9 +167,7 @@ def _run_pints(self): and iteration >= self._max_iterations ): running = False - ( - "Maximum number of iterations (" + str(iteration) + ") reached." - ) + ("Maximum number of iterations (" + str(iteration) + ") reached.") # Maximum number of iterations without significant change halt = ( @@ -192,13 +205,13 @@ def _run_pints(self): ) # Error in optimiser - error = self._optimiser.stop() + error = self.optimiser.stop() if error: # pragma: no cover running = False str(error) elif self._callback is not None: - self._callback(iteration - 1, self._optimiser) + self._callback(iteration - 1, self.optimiser) except (Exception, SystemExit, KeyboardInterrupt): # pragma: no cover # Unexpected end! @@ -209,7 +222,7 @@ def _run_pints(self): print("Current position:") # Show current parameters - x_user = self._optimiser.x_guessed() + x_user = self.optimiser.x_guessed() if self._transformation is not None: x_user = self._transformation.to_model(x_user) for p in x_user: @@ -223,11 +236,11 @@ def _run_pints(self): # Get best parameters if self._use_f_guessed: - x = self._optimiser.x_guessed() - f = self._optimiser.f_guessed() + x = self.optimiser.x_guessed() + f = self.optimiser.f_guessed() else: - x = self._optimiser.x_best() - f = self._optimiser.f_best() + x = self.optimiser.x_best() + f = self.optimiser.f_best() # Inverse transform search parameters if self._transformation is not None: diff --git a/pybop/optimisers/nlopt_optimize.py b/pybop/optimisers/nlopt_optimize.py index eca5e71da..7effdda7e 100644 --- a/pybop/optimisers/nlopt_optimize.py +++ b/pybop/optimisers/nlopt_optimize.py @@ -47,3 +47,9 @@ def _runoptimise(self, cost_function, x0, bounds): num_evals = self.optim.get_numevals() return x, output, final_cost, num_evals + + def needs_sensitivities(self): + """ + Returns True if the optimiser needs sensitivities. + """ + return False diff --git a/pybop/optimisers/pints_optimisers.py b/pybop/optimisers/pints_optimisers.py index 9c38599df..a655bf176 100644 --- a/pybop/optimisers/pints_optimisers.py +++ b/pybop/optimisers/pints_optimisers.py @@ -6,5 +6,66 @@ class GradientDescent(pints.GradientDescent): Class for the PINTS optimisation. Extends the BaseOptimiser class. """ - def __init__(self, x0, sigma0=0.1, boundaries=None): + def __init__(self, x0, sigma0=0.1, bounds=None): + boundaries = PintsBoundaries(bounds, x0) super().__init__(x0, sigma0, boundaries) + + +class PintsBoundaries(object): + """ + An interface class for PyBOP that extends the PINTS ErrorMeasure class. + + From PINTS: + Abstract class representing boundaries on a parameter space. + """ + + def __init__(self, bounds, x0): + self.bounds = bounds + self.x0 = x0 + + def check(self, parameters): + """ + Returns ``True`` if and only if the given point in parameter space is + within the boundaries. + + Parameters + ---------- + parameters + A point in parameter space + """ + result = False + if ( + parameters[0] >= self.bounds["lower"][0] + and parameters[1] >= self.bounds["lower"][1] + and parameters[0] <= self.bounds["upper"][0] + and parameters[1] <= self.bounds["upper"][1] + ): + result = True + + return result + + def n_parameters(self): + """ + Returns the dimension of the parameter space these boundaries are + defined on. + """ + return len(self.x0) + + # def sample(self, n=1): + # """ + # Returns ``n`` random samples from within the boundaries, for example to + # use as starting points for an optimisation. + + # The returned value is a NumPy array with shape ``(n, d)`` where ``n`` + # is the requested number of samples, and ``d`` is the dimension of the + # parameter space these boundaries are defined on. + + # *Note that implementing :meth:`sample()` is optional, so some boundary + # types may not support it.* + + # Parameters + # ---------- + # n : int + # The number of points to sample + # """ + # raise NotImplementedError diff --git a/pybop/optimisers/scipy_minimize.py b/pybop/optimisers/scipy_minimize.py index 7427655d6..2d6e909fd 100644 --- a/pybop/optimisers/scipy_minimize.py +++ b/pybop/optimisers/scipy_minimize.py @@ -45,3 +45,9 @@ def _runoptimise(self, cost_function, x0, bounds): num_evals = output.nfev return x, output, final_cost, num_evals + + def needs_sensitivities(self): + """ + Returns True if the optimiser needs sensitivities. + """ + return False From f0637861c4377b8dec5e49e7930f4b78630a302d Mon Sep 17 00:00:00 2001 From: NicolaCourtier <45851982+NicolaCourtier@users.noreply.github.com> Date: Thu, 9 Nov 2023 14:53:16 +0000 Subject: [PATCH 171/210] Move example code Move the example code in the Readme to the example scripts folder. This example will not run until #72 is merged. --- README.md | 76 +++++++++++---------------------- examples/scripts/SPM_example.py | 47 ++++++++++++++++++++ 2 files changed, 73 insertions(+), 50 deletions(-) create mode 100644 examples/scripts/SPM_example.py diff --git a/README.md b/README.md index 0eb6bf3c4..8592bf7dd 100644 --- a/README.md +++ b/README.md @@ -88,55 +88,31 @@ To alternatively install PyBOP from a local directory, use the following templat pip install -e "PATH_TO_PYBOP" ``` -### Example -The example below illustrates a straightforward process that begins by creating artificial data from a solo particle blueprint. The unknown parameter values are discovered by implementing an RMSE cost function using the terminal voltage as the observed signal. - -```python -import pybop -import numpy as np -import matplotlib.pyplot as plt - -# Parameter set and model definition -parameter_set = pybop.ParameterSet("pybamm", "Chen2020") -model = pybop.lithium_ion.SPMe(parameter_set=parameter_set) - -# Fitting parameters -parameters = [ - pybop.Parameter( - "Negative electrode active material volume fraction", - prior=pybop.Gaussian(0.7, 0.05), - bounds=[0.6, 0.9], - ), - pybop.Parameter( - "Positive electrode active material volume fraction", - prior=pybop.Gaussian(0.58, 0.05), - bounds=[0.5, 0.8], - ) -] - -# Generate data -sigma = 0.005 -t_eval = np.arange(0, 900, 2) -values = model.predict(t_eval=t_eval) -CorruptValues = values["Terminal voltage [V]"].data + np.random.normal(0, sigma, len(t_eval)) - -# Dataset definition -dataset = [ - pybop.Dataset("Time [s]", t_eval), - pybop.Dataset("Current function [A]", values["Current [A]"].data), - pybop.Dataset("Terminal voltage [V]", CorruptValues), -] - -# Generate problem, cost function, and optimisation class -problem = pybop.Problem(model, parameters, dataset) -cost = pybop.SumSquaredError(problem) -opt = pybop.Optimisation(cost, optimiser=pybop.GradientDescent()) -opt.optimiser.learning_rate = 0.025 -opt.optimiser.max_iterations = 100 - -# Run optimisation -x, output, final_cost, num_evals = opt.run() -print("Estimated parameters:", x) +To check whether PyBOP has been installed correctly, run one of the examples in the following section or the full set of unit tests: + +```bash +pytest --unit -v +``` + +### Using PyBOP +PyBOP has two general types of intended use case: +1. parameter estimation from battery test data +2. design optimisation subject to battery manufacturing/usage constraints + +These general cases encompass a wide variety of optimisation problems, which require careful consideration based on the choice of battery model, the available data and/or the choice of design parameters. + +PyBOP comes with a number of example notebooks and scripts which can be found in the examples folder. + +The (`spm_example` script)[https://github.com/pybop-team/PyBOP/blob/develop/examples/scripts/spm_example.py] illustrates a straightforward example that begins by creating artificial data from a single particle model (SPM). The unknown parameter values are then discovered by implementing an RMSE cost function using the terminal voltage as the observed signal. The main output is the set of estimated parameters, namely the negative and positive electrode active material volume fractions in this example. To run this example: + +```bash +python examples/scripts/spm_example.py +``` + +The (`RMSE_estimation` script)[https://github.com/pybop-team/PyBOP/blob/develop/examples/scripts/rmse_estimation.py] provides a second example which differs by importing the example `Chen_example.csv` dataset and then estimates the same SPM parameters based on the same RMSE cost function. To run this example: + +```bash +python examples/scripts/rmse_estimation.py ``` <!-- Code of Conduct --> @@ -148,7 +124,7 @@ PyBOP aims to foster a broad consortium of developers and users, building on and - Interoperability (Modularity to enable maximum impact and inclusivity) -- User-friendliness (putting user requirements first via suser-assistance & workflows) +- User-friendliness (putting user requirements first via user-assistance & workflows) <!-- Contributing --> diff --git a/examples/scripts/SPM_example.py b/examples/scripts/SPM_example.py new file mode 100644 index 000000000..82c57ea34 --- /dev/null +++ b/examples/scripts/SPM_example.py @@ -0,0 +1,47 @@ +import pybop +import numpy as np +import matplotlib.pyplot as plt + +# Parameter set and model definition +parameter_set = pybop.ParameterSet("pybamm", "Chen2020") +model = pybop.lithium_ion.SPMe(parameter_set=parameter_set) + +# Fitting parameters +parameters = [ + pybop.Parameter( + "Negative electrode active material volume fraction", + prior=pybop.Gaussian(0.7, 0.05), + bounds=[0.6, 0.9], + ), + pybop.Parameter( + "Positive electrode active material volume fraction", + prior=pybop.Gaussian(0.58, 0.05), + bounds=[0.5, 0.8], + ), +] + +# Generate data +sigma = 0.005 +t_eval = np.arange(0, 900, 2) +values = model.predict(t_eval=t_eval) +CorruptValues = values["Terminal voltage [V]"].data + np.random.normal( + 0, sigma, len(t_eval) +) + +# Dataset definition +dataset = [ + pybop.Dataset("Time [s]", t_eval), + pybop.Dataset("Current function [A]", values["Current [A]"].data), + pybop.Dataset("Terminal voltage [V]", CorruptValues), +] + +# Generate problem, cost function, and optimisation class +problem = pybop.Problem(model, parameters, dataset) +cost = pybop.SumSquaredError(problem) +opt = pybop.Optimisation(cost, optimiser=pybop.GradientDescent()) +opt.optimiser.learning_rate = 0.025 +opt.optimiser.max_iterations = 100 + +# Run optimisation +x, output, final_cost, num_evals = opt.run() +print("Estimated parameters:", x) From cc2fc86b2d16f13873c42fa5661cc826280e8ea1 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 9 Nov 2023 15:34:24 +0000 Subject: [PATCH 172/210] Finialise optimisation class for multi-backend, Add CMAES optimiser, Updt SumofErrors cost function, Adds needs_sensitivities() method to optimisers, updates tests, and updts optimisation ouput size --- examples/scripts/CMAES.py | 54 ++++++ examples/scripts/grad_descent.py | 6 +- examples/scripts/rmse_estimation.py | 2 +- pybop/__init__.py | 2 +- pybop/costs/error_costs.py | 3 +- pybop/optimisation.py | 251 ++++++++++++++++++++++----- pybop/optimisers/nlopt_optimize.py | 4 +- pybop/optimisers/pints_optimisers.py | 10 ++ pybop/optimisers/scipy_minimize.py | 3 +- tests/unit/test_parameterisations.py | 6 +- 10 files changed, 279 insertions(+), 62 deletions(-) create mode 100644 examples/scripts/CMAES.py diff --git a/examples/scripts/CMAES.py b/examples/scripts/CMAES.py new file mode 100644 index 000000000..272a253a9 --- /dev/null +++ b/examples/scripts/CMAES.py @@ -0,0 +1,54 @@ +import pybop +import numpy as np +import matplotlib.pyplot as plt + +parameter_set = pybop.ParameterSet("pybamm", "Chen2020") +model = pybop.lithium_ion.SPMe(parameter_set=parameter_set) + +# Fitting parameters +parameters = [ + pybop.Parameter( + "Negative electrode active material volume fraction", + prior=pybop.Gaussian(0.7, 0.05), + bounds=[0.6, 0.9], + ), + pybop.Parameter( + "Positive electrode active material volume fraction", + prior=pybop.Gaussian(0.58, 0.05), + bounds=[0.5, 0.8], + ), +] + +sigma = 0.001 +t_eval = np.arange(0, 900, 2) +values = model.predict(t_eval=t_eval) +CorruptValues = values["Terminal voltage [V]"].data + np.random.normal( + 0, sigma, len(t_eval) +) + +dataset = [ + pybop.Dataset("Time [s]", t_eval), + pybop.Dataset("Current function [A]", values["Current [A]"].data), + pybop.Dataset("Terminal voltage [V]", CorruptValues), +] + +# Generate problem, cost function, and optimisation class +problem = pybop.Problem(model, parameters, dataset) +cost = pybop.SumSquaredError(problem) +opt = pybop.Optimisation(cost, optimiser=pybop.CMAES, verbose=True) + +x, final_cost = opt.run() +print("Estimated parameters:", x) + +# Show the generated data +simulated_values = problem.evaluate(x) + +plt.figure(dpi=100) +plt.xlabel("Time", fontsize=12) +plt.ylabel("Values", fontsize=12) +plt.plot(t_eval, CorruptValues, label="Measured") +plt.fill_between(t_eval, simulated_values - sigma, simulated_values + sigma, alpha=0.2) +plt.plot(t_eval, simulated_values, label="Simulated") +plt.legend(bbox_to_anchor=(0.6, 1), loc="upper left", fontsize=12) +plt.tick_params(axis="both", labelsize=12) +plt.show() diff --git a/examples/scripts/grad_descent.py b/examples/scripts/grad_descent.py index 93f15fdd8..adaabdae8 100644 --- a/examples/scripts/grad_descent.py +++ b/examples/scripts/grad_descent.py @@ -36,11 +36,9 @@ problem = pybop.Problem(model, parameters, dataset) cost = pybop.SumSquaredError(problem) opt = pybop.Optimisation(cost, optimiser=pybop.GradientDescent) +opt.optimiser.set_learning_rate(0.025) -opt.learning_rate = 0.025 -opt.max_iterations = 100 - -x = opt.run() +x, final_cost = opt.run() print("Estimated parameters:", x) # Show the generated data diff --git a/examples/scripts/rmse_estimation.py b/examples/scripts/rmse_estimation.py index 27a3e53e6..19401ed45 100644 --- a/examples/scripts/rmse_estimation.py +++ b/examples/scripts/rmse_estimation.py @@ -39,7 +39,7 @@ parameterisation = pybop.Optimisation(cost=cost, optimiser=pybop.NLoptOptimize) # Run the optimisation problem -x, output, final_cost, num_evals = parameterisation.run() +x, final_cost = parameterisation.run() # Show the generated data simulated_values = problem.evaluate(x) diff --git a/pybop/__init__.py b/pybop/__init__.py index 93f457bb5..ec9afe714 100644 --- a/pybop/__init__.py +++ b/pybop/__init__.py @@ -50,7 +50,7 @@ from .optimisers.base_optimiser import BaseOptimiser from .optimisers.nlopt_optimize import NLoptOptimize from .optimisers.scipy_minimize import SciPyMinimize -from .optimisers.pints_optimisers import GradientDescent +from .optimisers.pints_optimisers import GradientDescent, CMAES # # Parameter classes diff --git a/pybop/costs/error_costs.py b/pybop/costs/error_costs.py index c5792e121..68401ae6c 100644 --- a/pybop/costs/error_costs.py +++ b/pybop/costs/error_costs.py @@ -73,9 +73,8 @@ def __init__(self, problem): if not isinstance(problem, pybop.Problem): raise ValueError("This cost function only supports pybop problems") - def compute(self, x, grad=None): + def __call__(self, x, grad=None): # Compute the cost - return np.sum( (np.sum(((self.problem.evaluate(x) - self._target) ** 2), axis=0)), axis=0 ) diff --git a/pybop/optimisation.py b/pybop/optimisation.py index 73ed33365..0d9ea451f 100644 --- a/pybop/optimisation.py +++ b/pybop/optimisation.py @@ -6,12 +6,20 @@ class Optimisation: """ Optimisation class for PyBOP. + This class provides functionality for PyBOP optimisers and Pints optimisers. + args: + cost: PyBOP cost function + optimiser: A PyBOP or Pints optimiser + sigma0: initial step size + verbose: print optimisation progress + """ def __init__( self, cost, optimiser, + sigma0=None, verbose=False, ): self.cost = cost @@ -19,25 +27,24 @@ def __init__( self.optimiser = optimiser self.verbose = verbose self.x0 = cost.problem.x0 - self.bounds = cost.problem.bounds - self.fit_parameters = {} - self.learning_rate = 0.025 - self.max_iterations = 200 - self.max_unchanged_iterations = 10 - self.max_evaluations = None - self.threshold = None - self.sigma0 = 0.1 + self.bounds = self.problem.bounds + self.sigma0 = sigma0 + + # Convert x0 to pints vector + self._x0 = pints.vector(self.x0) + + # PyBOP doesn't currently support the pints transformation class + self._transformation = None # Check if minimising or maximising self._minimising = not isinstance(cost, pints.LogPDF) - if self._minimising: - self._function = cost + self._function = self.cost else: self._function = pints.ProbabilityBasedError(cost) del cost - # Create optimiser + # Construct Optimiser if self.optimiser is None or issubclass(self.optimiser, pints.Optimiser): self.pints = True self.optimiser = self.optimiser or pints.CMAES @@ -56,47 +63,86 @@ def __init__( # Check if sensitivities are required self._needs_sensitivities = self.optimiser.needs_sensitivities() + # Track optimiser's f_best or f_guessed + self._use_f_guessed = None + self.set_f_guessed_tracking() + + # Parallelisation + self._parallel = False + self._n_workers = 1 + self.set_parallel() + + # User callback + self._callback = None + + # + # Stopping criteria + # + + # Maximum iterations + self._max_iterations = None + self.set_max_iterations() + + # Maximum unchanged iterations + self._unchanged_threshold = 1 # smallest significant f change + self._unchanged_max_iterations = None + self.set_max_unchanged_iterations() + + # Maximum evaluations + self._max_evaluations = None + + # Threshold value + self._threshold = None + + # Post-run statistics + self._evaluations = None + self._iterations = None + def run(self): """ Run the optimisation algorithm. Selects between PyBOP backend or Pints backend. returns: x: best parameters - output: optimiser output final_cost: final cost - num_evals: number of evaluations """ if self.pints: - x, output, final_cost, num_evals = self._run_pints() + x, final_cost = self._run_pints() elif not self.pints: - x, output, final_cost, num_evals = self._run_pybop() + x, final_cost = self._run_pybop() - return x, output, final_cost, num_evals + return x, final_cost def _run_pybop(self): """ - Run method for PyBOP optimisers. + Run method for PyBOP based optimisers. + returns: + x: best parameters + final_cost: final cost """ - x, output, final_cost, num_evals = self.optimiser.optimise( + x, final_cost = self.optimiser.optimise( cost_function=self.cost, x0=self.x0, bounds=self.bounds, ) - return x, output, final_cost, num_evals + return x, final_cost def _run_pints(self): """ Run method for PINTS optimisers. - This method is based on the run method in the PINTS.OptimisationController class. + This method is heavily based on the run method in the PINTS.OptimisationController class. + returns: + x: best parameters + final_cost: final cost """ # Check stopping criteria has_stopping_criterion = False - has_stopping_criterion |= self.max_iterations is not None - has_stopping_criterion |= self.max_unchanged_iterations is not None - has_stopping_criterion |= self.max_evaluations is not None - has_stopping_criterion |= self.threshold is not None + has_stopping_criterion |= self._max_iterations is not None + has_stopping_criterion |= self._unchanged_max_iterations is not None + has_stopping_criterion |= self._max_evaluations is not None + has_stopping_criterion |= self._threshold is not None if not has_stopping_criterion: raise ValueError("At least one stopping criterion must be set.") @@ -104,8 +150,7 @@ def _run_pints(self): iteration = 0 evaluations = 0 - # Unchanged iterations count (used for stopping or just for - # information) + # Unchanged iterations counter unchanged_iterations = 0 # Choose method to evaluate @@ -114,18 +159,28 @@ def _run_pints(self): f = f.evaluateS1 # Create evaluator object - evaluator = pints.SequentialEvaluator(f) + if self._parallel: + # Get number of workers + n_workers = self._n_workers + + # For population based optimisers, don't use more workers than + # particles! + if isinstance(self._optimiser, pints.PopulationBasedOptimiser): + n_workers = min(n_workers, self._optimiser.population_size()) + evaluator = pints.ParallelEvaluator(f, n_workers=n_workers) + else: + evaluator = pints.SequentialEvaluator(f) # Keep track of current best and best-guess scores. fb = fg = np.inf # Internally we always minimise! Keep a 2nd value to show the user. - fb_user, fg_user = (fb, fg) if self._minimising else (-fb, -fg) + fg_user = (fb, fg) if self._minimising else (-fb, -fg) # Keep track of the last significant change f_sig = np.inf - # Set up progress reporting + # Run the ask-and-tell loop running = True try: while running: @@ -140,8 +195,8 @@ def _run_pints(self): # Update the scores fb = self.optimiser.f_best() - fg = self.optimiser.f_guess() - fb_user, fg_user = (fb, fg) if self._minimising else (-fb, -fg) + fg = self.optimiser.f_guessed() + fg_user = (fb, fg) if self._minimising else (-fb, -fg) # Check for significant changes f_new = fg if self._use_f_guessed else fb @@ -151,23 +206,20 @@ def _run_pints(self): else: unchanged_iterations += 1 - # Update evaluation count + # Update counts evaluations += len(fs) - - # Update iteration count iteration += 1 - # - # Check stopping criteria - # - + # Check stopping criteria: # Maximum number of iterations if ( self._max_iterations is not None and iteration >= self._max_iterations ): running = False - ("Maximum number of iterations (" + str(iteration) + ") reached.") + halt_message = ( + "Maximum number of iterations (" + str(iteration) + ") reached." + ) # Maximum number of iterations without significant change halt = ( @@ -176,7 +228,7 @@ def _run_pints(self): ) if running and halt: running = False - ( + halt_message = ( "No significant change for " + str(unchanged_iterations) + " iterations." @@ -188,7 +240,7 @@ def _run_pints(self): and evaluations >= self._max_evaluations ): running = False - ( + halt_message = ( "Maximum number of evaluations (" + str(self._max_evaluations) + ") reached." @@ -198,7 +250,7 @@ def _run_pints(self): halt = self._threshold is not None and f_new < self._threshold if running and halt: running = False - ( + halt_message = ( "Objective function crossed threshold: " + str(self._threshold) + "." @@ -206,15 +258,14 @@ def _run_pints(self): # Error in optimiser error = self.optimiser.stop() - if error: # pragma: no cover + if error: running = False - str(error) + halt_message = str(error) elif self._callback is not None: self._callback(iteration - 1, self.optimiser) - except (Exception, SystemExit, KeyboardInterrupt): # pragma: no cover - # Unexpected end! + except (Exception, SystemExit, KeyboardInterrupt): # Show last result and exit print("\n" + "-" * 40) print("Unexpected termination.") @@ -230,6 +281,9 @@ def _run_pints(self): print("-" * 40) raise + if self.verbose: + print("Halt: " + halt_message) + # Save post-run statistics self._evaluations = evaluations self._iterations = iteration @@ -248,3 +302,108 @@ def _run_pints(self): # Return best position and score return x, f if self._minimising else -f + + def f_guessed_tracking(self): + """ + Returns ``True`` if f_guessed instead of f_best is being tracked, + ``False`` otherwise. See also :meth:`set_f_guessed_tracking`. + + Credit: PINTS + """ + return self._use_f_guessed + + def set_f_guessed_tracking(self, use_f_guessed=False): + """ + Sets the method used to track the optimiser progress to + :meth:`pints.Optimiser.f_guessed()` or + :meth:`pints.Optimiser.f_best()` (default). + + The tracked ``f`` value is used to evaluate stopping criteria. + + Credit: PINTS + """ + self._use_f_guessed = bool(use_f_guessed) + + def set_log_interval(self, iters=20, warm_up=3): + """ + Changes the frequency with which messages are logged. + + Parameters + ---------- + ``interval`` + A log message will be shown every ``iters`` iterations. + ``warm_up`` + A log message will be shown every iteration, for the first + ``warm_up`` iterations. + + Credit: PINTS + """ + iters = int(iters) + if iters < 1: + raise ValueError("Interval must be greater than zero.") + warm_up = max(0, int(warm_up)) + + self._message_interval = iters + self._message_warm_up = warm_up + + def set_parallel(self, parallel=False): + """ + Enables/disables parallel evaluation. + + If ``parallel=True``, the method will run using a number of worker + processes equal to the detected cpu core count. The number of workers + can be set explicitly by setting ``parallel`` to an integer greater + than 0. + Parallelisation can be disabled by setting ``parallel`` to ``0`` or + ``False``. + + Credit: PINTS + """ + if parallel is True: + self._parallel = True + self._n_workers = pints.ParallelEvaluator.cpu_count() + elif parallel >= 1: + self._parallel = True + self._n_workers = int(parallel) + else: + self._parallel = False + self._n_workers = 1 + + def set_max_iterations(self, iterations=10000): + """ + Adds a stopping criterion, allowing the routine to halt after the + given number of ``iterations``. + + This criterion is enabled by default. To disable it, use + ``set_max_iterations(None)``. + + Credit: PINTS + """ + if iterations is not None: + iterations = int(iterations) + if iterations < 0: + raise ValueError("Maximum number of iterations cannot be negative.") + self._max_iterations = iterations + + def set_max_unchanged_iterations(self, iterations=200, threshold=1e-11): + """ + Adds a stopping criterion, allowing the routine to halt if the + objective function doesn't change by more than ``threshold`` for the + given number of ``iterations``. + + This criterion is enabled by default. To disable it, use + ``set_max_unchanged_iterations(None)``. + + Credit: PINTS + """ + if iterations is not None: + iterations = int(iterations) + if iterations < 0: + raise ValueError("Maximum number of iterations cannot be negative.") + + threshold = float(threshold) + if threshold < 0: + raise ValueError("Minimum significant change cannot be negative.") + + self._unchanged_max_iterations = iterations + self._unchanged_threshold = threshold diff --git a/pybop/optimisers/nlopt_optimize.py b/pybop/optimisers/nlopt_optimize.py index 7effdda7e..bced86c08 100644 --- a/pybop/optimisers/nlopt_optimize.py +++ b/pybop/optimisers/nlopt_optimize.py @@ -42,11 +42,9 @@ def _runoptimise(self, cost_function, x0, bounds): x = self.optim.optimize(x0) # Get performance statistics - output = self.optim final_cost = self.optim.last_optimum_value() - num_evals = self.optim.get_numevals() - return x, output, final_cost, num_evals + return x, final_cost def needs_sensitivities(self): """ diff --git a/pybop/optimisers/pints_optimisers.py b/pybop/optimisers/pints_optimisers.py index a655bf176..bb6d8d74f 100644 --- a/pybop/optimisers/pints_optimisers.py +++ b/pybop/optimisers/pints_optimisers.py @@ -2,6 +2,16 @@ class GradientDescent(pints.GradientDescent): + """ + Gradient descent optimiser. Inherits from the PINTS gradient descent class. + """ + + def __init__(self, x0, sigma0=0.1, bounds=None): + boundaries = PintsBoundaries(bounds, x0) + super().__init__(x0, sigma0, boundaries) + + +class CMAES(pints.CMAES): """ Class for the PINTS optimisation. Extends the BaseOptimiser class. """ diff --git a/pybop/optimisers/scipy_minimize.py b/pybop/optimisers/scipy_minimize.py index 2d6e909fd..8bb52e780 100644 --- a/pybop/optimisers/scipy_minimize.py +++ b/pybop/optimisers/scipy_minimize.py @@ -42,9 +42,8 @@ def _runoptimise(self, cost_function, x0, bounds): # Get performance statistics x = output.x final_cost = output.fun - num_evals = output.nfev - return x, output, final_cost, num_evals + return x, final_cost def needs_sensitivities(self): """ diff --git a/tests/unit/test_parameterisations.py b/tests/unit/test_parameterisations.py index e37031744..1c9c14677 100644 --- a/tests/unit/test_parameterisations.py +++ b/tests/unit/test_parameterisations.py @@ -56,7 +56,7 @@ def test_spm(self, init_soc): parameterisation = pybop.Optimisation(cost=cost, optimiser=optimiser) # Run the optimisation problem - x, _, final_cost, _ = parameterisation.run() + x, final_cost = parameterisation.run() # Assertions np.testing.assert_allclose(final_cost, 0, atol=1e-2) @@ -113,7 +113,7 @@ def test_spme_multiple_optimisers(self, init_soc): parameterisation = pybop.Optimisation(cost=cost, optimiser=optimiser) # Run the optimisation problem - x, _, final_cost, _ = parameterisation.run() + x, final_cost = parameterisation.run() # Assertions np.testing.assert_allclose(final_cost, 0, atol=1e-2) @@ -169,7 +169,7 @@ def test_model_misparameterisation(self, init_soc): parameterisation = pybop.Optimisation(cost=cost, optimiser=optimiser) # Run the optimisation problem - x, _, final_cost, _ = parameterisation.run() + x, final_cost = parameterisation.run() # Assertions with np.testing.assert_raises(AssertionError): From 2f1abcdba9de4eb0b5c8dac8016e518f0674ec59 Mon Sep 17 00:00:00 2001 From: NicolaCourtier <45851982+NicolaCourtier@users.noreply.github.com> Date: Thu, 9 Nov 2023 15:47:15 +0000 Subject: [PATCH 173/210] Update text --- examples/scripts/SPM_example.py | 8 +++--- examples/scripts/grad_descent.py | 22 ++++++++++------ examples/scripts/mle.py | 43 +++++++++++++++++++------------- 3 files changed, 44 insertions(+), 29 deletions(-) diff --git a/examples/scripts/SPM_example.py b/examples/scripts/SPM_example.py index 82c57ea34..2740b0786 100644 --- a/examples/scripts/SPM_example.py +++ b/examples/scripts/SPM_example.py @@ -38,10 +38,10 @@ # Generate problem, cost function, and optimisation class problem = pybop.Problem(model, parameters, dataset) cost = pybop.SumSquaredError(problem) -opt = pybop.Optimisation(cost, optimiser=pybop.GradientDescent()) -opt.optimiser.learning_rate = 0.025 -opt.optimiser.max_iterations = 100 +optim = pybop.Optimisation(cost, optimiser=pybop.GradientDescent()) +optim.optimiser.learning_rate = 0.025 +optim.optimiser.max_iterations = 100 # Run optimisation -x, output, final_cost, num_evals = opt.run() +x, output, final_cost, num_evals = optim.run() print("Estimated parameters:", x) diff --git a/examples/scripts/grad_descent.py b/examples/scripts/grad_descent.py index 6e62f9b18..61ffaea88 100644 --- a/examples/scripts/grad_descent.py +++ b/examples/scripts/grad_descent.py @@ -3,8 +3,10 @@ import numpy as np import matplotlib.pyplot as plt +# Model definition model = pybop.lithium_ion.SPMe() +# Input current and fitting parameters inputs = { "Negative electrode active material volume fraction": 0.58, "Positive electrode active material volume fraction": 0.44, @@ -13,10 +15,12 @@ t_eval = np.arange(0, 900, 2) model.build(fit_parameters=inputs) +# Generate data values = model.predict(inputs=inputs, t_eval=t_eval) voltage = values["Terminal voltage [V]"].data time = values["Time [s]"].data +# Add noise sigma = 0.001 CorruptValues = voltage + np.random.normal(0, sigma, len(voltage)) @@ -28,26 +32,28 @@ plt.plot(time, voltage) plt.show() - +# Generate problem problem = pints.SingleOutputProblem(model, time, CorruptValues) # Select a score function score = pints.SumOfSquaresError(problem) +# Set the initial parameter values and optimisation class x0 = np.array([0.48, 0.55, 1.4]) -opt = pints.OptimisationController(score, x0, method=pints.GradientDescent) - -opt.optimiser().set_learning_rate(0.025) -opt.set_max_unchanged_iterations(50) -opt.set_max_iterations(200) +optim = pints.OptimisationController(score, x0, method=pints.GradientDescent) +optim.optimiser().set_learning_rate(0.025) +optim.set_max_unchanged_iterations(50) +optim.set_max_iterations(200) -x1, f1 = opt.run() +# Run optimisation +x1, f1 = optim.run() print("Estimated parameters:") print(x1) -# Show the generated data +# Generate data using the estimated parameters simulated_values = problem.evaluate(x1[:3]) +# Show the estimated data plt.figure() plt.xlabel("Time") plt.ylabel("Values") diff --git a/examples/scripts/mle.py b/examples/scripts/mle.py index a508ffa46..3d6175d3b 100644 --- a/examples/scripts/mle.py +++ b/examples/scripts/mle.py @@ -3,8 +3,10 @@ import numpy as np import matplotlib.pyplot as plt +# Model definition model = pybop.lithium_ion.SPMe() +# Input current and fitting parameters inputs = { "Negative electrode active material volume fraction": 0.58, "Positive electrode active material volume fraction": 0.44, @@ -13,44 +15,51 @@ t_eval = np.arange(0, 900, 2) model.build(fit_parameters=inputs) +# Generate data values = model.predict(inputs=inputs, t_eval=t_eval) voltage = values["Terminal voltage [V]"].data time = values["Time [s]"].data +# Add noise sigma = 0.001 -CorruptValues = voltage + np.random.normal(0, sigma, len(voltage)) +corrupt_values = voltage + np.random.normal(0, sigma, len(voltage)) # Show the generated data plt.figure() -plt.xlabel("Time") -plt.ylabel("Values") -plt.plot(time, CorruptValues) -plt.plot(time, voltage) +#plt.title("Synthetic data and corrupted signal") +plt.xlabel("Time (s)") +plt.ylabel("Voltage (V)") +plt.plot(time, corrupt_values, label="corrupted signal") +plt.plot(time, voltage, label="synthetic data") +plt.legend(loc="upper right") plt.show() - -problem = pints.SingleOutputProblem(model, time, CorruptValues) +# Generate problem, cost function, and optimisation class +problem = pints.SingleOutputProblem(model, time, corrupt_values) log_likelihood = pints.GaussianLogLikelihood(problem) boundaries = pints.RectangularBoundaries([0.4, 0.4, 0.7, 1e-5], [0.6, 0.6, 2.1, 1e-1]) - x0 = np.array([0.48, 0.55, 1.4, 1e-3]) -opt = pints.OptimisationController( +optim = pints.OptimisationController( log_likelihood, x0, boundaries=boundaries, method=pints.CMAES ) -opt.set_max_unchanged_iterations(50) -opt.set_max_iterations(200) +optim.set_max_unchanged_iterations(50) +optim.set_max_iterations(200) -x1, f1 = opt.run() +# Run optimisation +x1, f1 = optim.run() print("Estimated parameters:") print(x1) -# Show the generated data +# Generate data using the estimated parameters simulated_values = problem.evaluate(x1[:3]) +# Show the generated data plt.figure() -plt.xlabel("Time") -plt.ylabel("Values") -plt.plot(time, CorruptValues) +#plt.title("Corrupted signal and estimation") +plt.xlabel("Time (s)") +plt.ylabel("Voltage (V)") +plt.plot(time, corrupt_values, label="corrupted signal") plt.fill_between(time, simulated_values - sigma, simulated_values + sigma, alpha=0.2) -plt.plot(time, simulated_values) +plt.plot(time, simulated_values, label="estimation") +plt.legend(loc="upper right") plt.show() From bf350ee1c5437215dc3607f6c708a624c58f1d13 Mon Sep 17 00:00:00 2001 From: NicolaCourtier <45851982+NicolaCourtier@users.noreply.github.com> Date: Thu, 9 Nov 2023 15:48:25 +0000 Subject: [PATCH 174/210] Rename SPM_example to spm_example --- examples/scripts/{SPM_example.py => spm_example.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename examples/scripts/{SPM_example.py => spm_example.py} (100%) diff --git a/examples/scripts/SPM_example.py b/examples/scripts/spm_example.py similarity index 100% rename from examples/scripts/SPM_example.py rename to examples/scripts/spm_example.py From edf4b151500ca65db14764215f8ce5b383ccc2dc Mon Sep 17 00:00:00 2001 From: NicolaCourtier <45851982+NicolaCourtier@users.noreply.github.com> Date: Thu, 9 Nov 2023 15:52:08 +0000 Subject: [PATCH 175/210] Fix braces --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8592bf7dd..ba56774f3 100644 --- a/README.md +++ b/README.md @@ -103,13 +103,13 @@ These general cases encompass a wide variety of optimisation problems, which req PyBOP comes with a number of example notebooks and scripts which can be found in the examples folder. -The (`spm_example` script)[https://github.com/pybop-team/PyBOP/blob/develop/examples/scripts/spm_example.py] illustrates a straightforward example that begins by creating artificial data from a single particle model (SPM). The unknown parameter values are then discovered by implementing an RMSE cost function using the terminal voltage as the observed signal. The main output is the set of estimated parameters, namely the negative and positive electrode active material volume fractions in this example. To run this example: +The [`spm_example` script](https://github.com/pybop-team/PyBOP/blob/develop/examples/scripts/spm_example.py) illustrates a straightforward example that begins by creating artificial data from a single particle model (SPM). The unknown parameter values are then discovered by implementing an RMSE cost function using the terminal voltage as the observed signal. The main output is the set of estimated parameters, namely the negative and positive electrode active material volume fractions in this example. To run this example: ```bash python examples/scripts/spm_example.py ``` -The (`RMSE_estimation` script)[https://github.com/pybop-team/PyBOP/blob/develop/examples/scripts/rmse_estimation.py] provides a second example which differs by importing the example `Chen_example.csv` dataset and then estimates the same SPM parameters based on the same RMSE cost function. To run this example: +The [`RMSE_estimation` script](https://github.com/pybop-team/PyBOP/blob/develop/examples/scripts/rmse_estimation.py) provides a second example which differs by importing the example `Chen_example.csv` dataset and then estimates the same SPM parameters based on the same RMSE cost function. To run this example: ```bash python examples/scripts/rmse_estimation.py From f41d4263f517a22cefc903692316b9e5927474ad Mon Sep 17 00:00:00 2001 From: NicolaCourtier <45851982+NicolaCourtier@users.noreply.github.com> Date: Thu, 9 Nov 2023 16:08:27 +0000 Subject: [PATCH 176/210] Switch show to draw so scripts run to the end --- examples/scripts/grad_descent.py | 2 +- examples/scripts/mle.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/scripts/grad_descent.py b/examples/scripts/grad_descent.py index 61ffaea88..22b657574 100644 --- a/examples/scripts/grad_descent.py +++ b/examples/scripts/grad_descent.py @@ -30,7 +30,7 @@ plt.ylabel("Values") plt.plot(time, CorruptValues) plt.plot(time, voltage) -plt.show() +plt.draw() # use draw instead of show so that computation continues # Generate problem problem = pints.SingleOutputProblem(model, time, CorruptValues) diff --git a/examples/scripts/mle.py b/examples/scripts/mle.py index 3d6175d3b..1658d83f7 100644 --- a/examples/scripts/mle.py +++ b/examples/scripts/mle.py @@ -32,7 +32,7 @@ plt.plot(time, corrupt_values, label="corrupted signal") plt.plot(time, voltage, label="synthetic data") plt.legend(loc="upper right") -plt.show() +plt.draw() # use draw instead of show so that computation continues # Generate problem, cost function, and optimisation class problem = pints.SingleOutputProblem(model, time, corrupt_values) From a3b314905d2043fe3d4cbe8e099ba6191fc7d065 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 9 Nov 2023 16:15:51 +0000 Subject: [PATCH 177/210] Fix bugs and small changes added during development --- pybop/_problem.py | 17 ++++++++++------- pybop/costs/error_costs.py | 10 ++++++++-- pybop/optimisers/nlopt_optimize.py | 2 +- pybop/optimisers/pints_optimisers.py | 19 ------------------- pybop/optimisers/scipy_minimize.py | 6 ++---- tests/unit/test_cost.py | 6 +++--- 6 files changed, 24 insertions(+), 36 deletions(-) diff --git a/pybop/_problem.py b/pybop/_problem.py index 9f8c2bf4e..2cdc5544b 100644 --- a/pybop/_problem.py +++ b/pybop/_problem.py @@ -25,6 +25,7 @@ def __init__( self.init_soc = init_soc self.x0 = x0 self.n_parameters = len(self.parameters) + self.n_outputs = len([self.signal]) # Check that the dataset contains time and current for name in ["Time [s]", "Current function [A]", signal]: @@ -32,6 +33,7 @@ def __init__( raise ValueError(f"expected {name} in list of dataset") self._time_data = self._dataset["Time [s]"].data + self.n_time_data = len(self._time_data) self._target = self._dataset[signal].data if np.any(self._time_data < 0): @@ -58,14 +60,15 @@ def __init__( for i, param in enumerate(self.parameters): param.update(value=self.x0[i]) + # Set the fitting parameters and build the model self.fit_parameters = {o.name: o.value for o in parameters} - # if self._model._built_model is None: - self._model.build( - dataset=self._dataset, - fit_parameters=self.fit_parameters, - check_model=self.check_model, - init_soc=self.init_soc, - ) + if self._model._built_model is None: + self._model.build( + dataset=self._dataset, + fit_parameters=self.fit_parameters, + check_model=self.check_model, + init_soc=self.init_soc, + ) def evaluate(self, parameters): """ diff --git a/pybop/costs/error_costs.py b/pybop/costs/error_costs.py index 68401ae6c..00fa9182f 100644 --- a/pybop/costs/error_costs.py +++ b/pybop/costs/error_costs.py @@ -53,7 +53,7 @@ def __init__(self, problem): if not isinstance(problem, pybop.Problem): raise ValueError("This cost function only supports pybop problems") - def compute(self, x, grad=None): + def __call__(self, x, grad=None): # Compute the cost try: return np.sqrt(np.mean((self.problem.evaluate(x) - self._target) ** 2)) @@ -82,7 +82,13 @@ def __call__(self, x, grad=None): def evaluateS1(self, x): # Compute the cost y, dy = self.problem.evaluateS1(x) - dy = dy.reshape((450, 1, self.problem.n_parameters)) + dy = dy.reshape( + ( + self.problem.n_time_data, + self.problem.n_outputs, + self.problem.n_parameters, + ) + ) r = y - self._target e = np.sum(np.sum(r**2, axis=0), axis=0) de = 2 * np.sum(np.sum((r.T * dy.T), axis=2), axis=1) diff --git a/pybop/optimisers/nlopt_optimize.py b/pybop/optimisers/nlopt_optimize.py index bced86c08..2bc3be85c 100644 --- a/pybop/optimisers/nlopt_optimize.py +++ b/pybop/optimisers/nlopt_optimize.py @@ -34,7 +34,7 @@ def _runoptimise(self, cost_function, x0, bounds): """ # Pass settings to the optimiser - self.optim.set_min_objective(cost_function.compute) + self.optim.set_min_objective(cost_function) self.optim.set_lower_bounds(bounds["lower"]) self.optim.set_upper_bounds(bounds["upper"]) diff --git a/pybop/optimisers/pints_optimisers.py b/pybop/optimisers/pints_optimisers.py index bb6d8d74f..621e02ae6 100644 --- a/pybop/optimisers/pints_optimisers.py +++ b/pybop/optimisers/pints_optimisers.py @@ -60,22 +60,3 @@ def n_parameters(self): defined on. """ return len(self.x0) - - # def sample(self, n=1): - # """ - # Returns ``n`` random samples from within the boundaries, for example to - # use as starting points for an optimisation. - - # The returned value is a NumPy array with shape ``(n, d)`` where ``n`` - # is the requested number of samples, and ``d`` is the dimension of the - # parameter space these boundaries are defined on. - - # *Note that implementing :meth:`sample()` is optional, so some boundary - # types may not support it.* - - # Parameters - # ---------- - # n : int - # The number of points to sample - # """ - # raise NotImplementedError diff --git a/pybop/optimisers/scipy_minimize.py b/pybop/optimisers/scipy_minimize.py index 8bb52e780..083d93c53 100644 --- a/pybop/optimisers/scipy_minimize.py +++ b/pybop/optimisers/scipy_minimize.py @@ -33,11 +33,9 @@ def _runoptimise(self, cost_function, x0, bounds): bounds = ( (lower, upper) for lower, upper in zip(bounds["lower"], bounds["upper"]) ) - output = minimize( - cost_function.compute, x0, method=self.method, bounds=bounds - ) + output = minimize(cost_function, x0, method=self.method, bounds=bounds) else: - output = minimize(cost_function.compute, x0, method=self.method) + output = minimize(cost_function, x0, method=self.method) # Get performance statistics x = output.x diff --git a/tests/unit/test_cost.py b/tests/unit/test_cost.py index 363a8b63e..ec109ec95 100644 --- a/tests/unit/test_cost.py +++ b/tests/unit/test_cost.py @@ -33,10 +33,10 @@ def test_RootMeanSquaredError(self): signal = "Voltage [V]" problem = pybop.Problem(model, parameters, dataset, signal=signal) cost = pybop.RootMeanSquaredError(problem) - cost.compute([0.5]) + cost([0.5]) - assert type(cost.compute([0.5])) == np.float64 - assert cost.compute([0.5]) >= 0 + assert type(cost([0.5])) == np.float64 + assert cost([0.5]) >= 0 def getdata(self, model, x0): model.parameter_set = model.pybamm_model.default_parameter_values From 0edf919a5310244a51e5f24c342b16cf5b7d3dea Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 13 Nov 2023 17:58:50 +0000 Subject: [PATCH 178/210] chore: update pre-commit hooks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.1.4 → v0.1.5](https://github.com/astral-sh/ruff-pre-commit/compare/v0.1.4...v0.1.5) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8fca335a6..5270e26ff 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,7 +4,7 @@ ci: repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.1.4" + rev: "v0.1.5" hooks: - id: ruff args: [--fix, --show-fixes] From cc6ba0ffba1222f9c14aaa39f3fc1640d6354538 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Wed, 15 Nov 2023 12:03:04 +0000 Subject: [PATCH 179/210] Udt. Cost base class, add optimisation evolution log, updt. parameter variables, remove redundant base model methods --- examples/scripts/grad_descent.py | 12 +++---- examples/scripts/mle.py | 57 -------------------------------- pybop/costs/error_costs.py | 55 ++++++++++++++---------------- pybop/models/base_model.py | 12 ------- pybop/optimisation.py | 3 +- tests/unit/test_models.py | 6 ---- 6 files changed, 33 insertions(+), 112 deletions(-) delete mode 100644 examples/scripts/mle.py diff --git a/examples/scripts/grad_descent.py b/examples/scripts/grad_descent.py index adaabdae8..7f8e46e3e 100644 --- a/examples/scripts/grad_descent.py +++ b/examples/scripts/grad_descent.py @@ -22,23 +22,23 @@ sigma = 0.001 t_eval = np.arange(0, 900, 2) values = model.predict(t_eval=t_eval) -CorruptValues = values["Terminal voltage [V]"].data + np.random.normal( +corrupt_values = values["Terminal voltage [V]"].data + np.random.normal( 0, sigma, len(t_eval) ) dataset = [ pybop.Dataset("Time [s]", t_eval), pybop.Dataset("Current function [A]", values["Current [A]"].data), - pybop.Dataset("Terminal voltage [V]", CorruptValues), + pybop.Dataset("Terminal voltage [V]", corrupt_values), ] # Generate problem, cost function, and optimisation class problem = pybop.Problem(model, parameters, dataset) cost = pybop.SumSquaredError(problem) -opt = pybop.Optimisation(cost, optimiser=pybop.GradientDescent) -opt.optimiser.set_learning_rate(0.025) +optim = pybop.Optimisation(cost, optimiser=pybop.GradientDescent) +optim.optimiser.set_learning_rate(0.025) -x, final_cost = opt.run() +x, final_cost = optim.run() print("Estimated parameters:", x) # Show the generated data @@ -47,7 +47,7 @@ plt.figure(dpi=100) plt.xlabel("Time", fontsize=12) plt.ylabel("Values", fontsize=12) -plt.plot(t_eval, CorruptValues, label="Measured") +plt.plot(t_eval, corrupt_values, label="Measured") plt.fill_between(t_eval, simulated_values - sigma, simulated_values + sigma, alpha=0.2) plt.plot(t_eval, simulated_values, label="Simulated") plt.legend(bbox_to_anchor=(0.6, 1), loc="upper left", fontsize=12) diff --git a/examples/scripts/mle.py b/examples/scripts/mle.py deleted file mode 100644 index ad2d7514d..000000000 --- a/examples/scripts/mle.py +++ /dev/null @@ -1,57 +0,0 @@ -import pybop -import pints -import numpy as np -import matplotlib.pyplot as plt - -model = pybop.lithium_ion.SPMe() -model.signal = "Terminal voltage [V]" - -inputs = { - "Negative electrode active material volume fraction": 0.58, - "Positive electrode active material volume fraction": 0.44, - "Current function [A]": 1, -} -t_eval = np.arange(0, 900, 2) -model.build(fit_parameters=inputs) - -values = model.predict(inputs=inputs, t_eval=t_eval) -voltage = values["Terminal voltage [V]"].data -time = values["Time [s]"].data - -sigma = 0.001 -CorruptValues = voltage + np.random.normal(0, sigma, len(voltage)) - -# Show the generated data -plt.figure() -plt.xlabel("Time") -plt.ylabel("Values") -plt.plot(time, CorruptValues) -plt.plot(time, voltage) -plt.show() - - -problem = pints.SingleOutputProblem(model, time, CorruptValues) -log_likelihood = pints.GaussianLogLikelihood(problem) -boundaries = pints.RectangularBoundaries([0.4, 0.4, 0.7, 1e-5], [0.6, 0.6, 2.1, 1e-1]) - -x0 = np.array([0.48, 0.55, 1.4, 1e-3]) -opt = pints.OptimisationController( - log_likelihood, x0, boundaries=boundaries, method=pints.CMAES -) -opt.set_max_unchanged_iterations(50) -opt.set_max_iterations(200) - -x1, f1 = opt.run() -print("Estimated parameters:") -print(x1) - -# Show the generated data -simulated_values = problem.evaluate(x1[:3]) - -plt.figure() -plt.xlabel("Time") -plt.ylabel("Values") -plt.plot(time, CorruptValues) -plt.fill_between(time, simulated_values - sigma, simulated_values + sigma, alpha=0.2) -plt.plot(time, simulated_values) -plt.show() diff --git a/pybop/costs/error_costs.py b/pybop/costs/error_costs.py index 00fa9182f..f6918dc51 100644 --- a/pybop/costs/error_costs.py +++ b/pybop/costs/error_costs.py @@ -9,12 +9,13 @@ class BaseCost: Lower cost values indicate a better fit. """ - def __call__(self, x): - raise NotImplementedError + def __init__(self, problem): + self.problem = problem + self._target = problem._target - def compute(self, x): + def __call__(self, x, grad=None): """ - Calls the forward models and computes the cost. + Returns the cost function value and computes the cost. """ raise NotImplementedError @@ -25,24 +26,7 @@ def n_parameters(self): raise NotImplementedError -class ProblemCost(BaseCost): - """ - Extends the base cost function class for a single output problem. - """ - - def __init__(self, problem): - super(ProblemCost, self).__init__() - self.problem = problem - self._target = problem._target - - def n_parameters(self): - """ - Returns the dimension of the parameter space. - """ - return self.problem.n_parameters - - -class RootMeanSquaredError(ProblemCost): +class RootMeanSquaredError(BaseCost): """ Defines the root mean square error cost function. """ @@ -54,15 +38,17 @@ def __init__(self, problem): raise ValueError("This cost function only supports pybop problems") def __call__(self, x, grad=None): - # Compute the cost + """ + Computes the cost. + """ try: return np.sqrt(np.mean((self.problem.evaluate(x) - self._target) ** 2)) except Exception as e: - raise ValueError(f"Error in RMSE calculation: {e}") + raise ValueError(f"Error in cost calculation: {e}") -class SumSquaredError(ProblemCost): +class SumSquaredError(BaseCost): """ Defines the sum squared error cost function. """ @@ -74,13 +60,22 @@ def __init__(self, problem): raise ValueError("This cost function only supports pybop problems") def __call__(self, x, grad=None): - # Compute the cost - return np.sum( - (np.sum(((self.problem.evaluate(x) - self._target) ** 2), axis=0)), axis=0 - ) + """ + Computes the cost. + """ + try: + return np.sum( + (np.sum(((self.problem.evaluate(x) - self._target) ** 2), axis=0)), + axis=0, + ) + except Exception as e: + raise ValueError(f"Error in cost calculation: {e}") def evaluateS1(self, x): - # Compute the cost + """ + Compute the cost and corresponding + gradients with respect to the parameters. + """ y, dy = self.problem.evaluateS1(x) dy = dy.reshape( ( diff --git a/pybop/models/base_model.py b/pybop/models/base_model.py index 0584fb276..ced38437e 100644 --- a/pybop/models/base_model.py +++ b/pybop/models/base_model.py @@ -187,18 +187,6 @@ def predict( else: raise ValueError("This sim method currently only supports PyBaMM models") - def n_parameters(self): - """ - Returns the dimension of the parameter space. - """ - return len(self.fit_parameters) - - def n_outputs(self): - """ - Returns the number of outputs this model has. The default is 1. - """ - return 1 - @property def built_model(self): return self._built_model diff --git a/pybop/optimisation.py b/pybop/optimisation.py index 0d9ea451f..946e9b82d 100644 --- a/pybop/optimisation.py +++ b/pybop/optimisation.py @@ -29,6 +29,7 @@ def __init__( self.x0 = cost.problem.x0 self.bounds = self.problem.bounds self.sigma0 = sigma0 + self.log = [] # Convert x0 to pints vector self._x0 = pints.vector(self.x0) @@ -186,7 +187,7 @@ def _run_pints(self): while running: # Ask optimiser for new points xs = self.optimiser.ask() - + self.log.append(xs) # Evaluate points fs = evaluator.evaluate(xs) diff --git a/tests/unit/test_models.py b/tests/unit/test_models.py index 09c47d730..ba47b0bfb 100644 --- a/tests/unit/test_models.py +++ b/tests/unit/test_models.py @@ -22,9 +22,3 @@ def test_build(self): model = pybop.lithium_ion.SPM() model.build() assert model.built_model is not None - - @pytest.mark.unit - def test_n_parameters(self): - model = pybop.BaseModel() - n = model.n_outputs() - assert isinstance(n, int) From 077dad7e745c97dc9b08f234002802996abafabf Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 15 Nov 2023 12:15:13 +0000 Subject: [PATCH 180/210] style: pre-commit fixes --- examples/scripts/grad_descent.py | 2 +- examples/scripts/mle.py | 6 +++--- examples/scripts/spm_example.py | 1 - 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/examples/scripts/grad_descent.py b/examples/scripts/grad_descent.py index 22b657574..6ba619b60 100644 --- a/examples/scripts/grad_descent.py +++ b/examples/scripts/grad_descent.py @@ -30,7 +30,7 @@ plt.ylabel("Values") plt.plot(time, CorruptValues) plt.plot(time, voltage) -plt.draw() # use draw instead of show so that computation continues +plt.draw() # use draw instead of show so that computation continues # Generate problem problem = pints.SingleOutputProblem(model, time, CorruptValues) diff --git a/examples/scripts/mle.py b/examples/scripts/mle.py index 1658d83f7..b139809a8 100644 --- a/examples/scripts/mle.py +++ b/examples/scripts/mle.py @@ -26,13 +26,13 @@ # Show the generated data plt.figure() -#plt.title("Synthetic data and corrupted signal") +# plt.title("Synthetic data and corrupted signal") plt.xlabel("Time (s)") plt.ylabel("Voltage (V)") plt.plot(time, corrupt_values, label="corrupted signal") plt.plot(time, voltage, label="synthetic data") plt.legend(loc="upper right") -plt.draw() # use draw instead of show so that computation continues +plt.draw() # use draw instead of show so that computation continues # Generate problem, cost function, and optimisation class problem = pints.SingleOutputProblem(model, time, corrupt_values) @@ -55,7 +55,7 @@ # Show the generated data plt.figure() -#plt.title("Corrupted signal and estimation") +# plt.title("Corrupted signal and estimation") plt.xlabel("Time (s)") plt.ylabel("Voltage (V)") plt.plot(time, corrupt_values, label="corrupted signal") diff --git a/examples/scripts/spm_example.py b/examples/scripts/spm_example.py index 2740b0786..d352260bd 100644 --- a/examples/scripts/spm_example.py +++ b/examples/scripts/spm_example.py @@ -1,6 +1,5 @@ import pybop import numpy as np -import matplotlib.pyplot as plt # Parameter set and model definition parameter_set = pybop.ParameterSet("pybamm", "Chen2020") From 1e1f911bf2f0708253bff5a11ddb17bc9b3930d0 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Wed, 15 Nov 2023 20:08:30 +0000 Subject: [PATCH 181/210] Updt tests, iters limit on examples, refact optimiser construction, refactor PintsBoundaries.check() --- examples/scripts/CMAES.py | 5 ++-- examples/scripts/grad_descent.py | 1 + pybop/__init__.py | 2 +- pybop/costs/error_costs.py | 7 ----- pybop/optimisation.py | 33 +++++++++++++----------- pybop/optimisers/nlopt_optimize.py | 5 ++-- pybop/optimisers/pints_optimisers.py | 28 ++++++++++---------- tests/unit/test_cost.py | 21 +++++++++++++-- tests/unit/test_models.py | 4 +++ tests/unit/test_optimisation.py | 38 ++++++++++++++++++++++++++++ tests/unit/test_problem.py | 3 +++ 11 files changed, 103 insertions(+), 44 deletions(-) diff --git a/examples/scripts/CMAES.py b/examples/scripts/CMAES.py index 272a253a9..65315b41e 100644 --- a/examples/scripts/CMAES.py +++ b/examples/scripts/CMAES.py @@ -35,9 +35,10 @@ # Generate problem, cost function, and optimisation class problem = pybop.Problem(model, parameters, dataset) cost = pybop.SumSquaredError(problem) -opt = pybop.Optimisation(cost, optimiser=pybop.CMAES, verbose=True) +optim = pybop.Optimisation(cost, optimiser=pybop.CMAES) +optim.set_max_iterations(100) -x, final_cost = opt.run() +x, final_cost = optim.run() print("Estimated parameters:", x) # Show the generated data diff --git a/examples/scripts/grad_descent.py b/examples/scripts/grad_descent.py index 7f8e46e3e..8eb53a1e7 100644 --- a/examples/scripts/grad_descent.py +++ b/examples/scripts/grad_descent.py @@ -37,6 +37,7 @@ cost = pybop.SumSquaredError(problem) optim = pybop.Optimisation(cost, optimiser=pybop.GradientDescent) optim.optimiser.set_learning_rate(0.025) +optim.set_max_iterations(100) x, final_cost = optim.run() print("Estimated parameters:", x) diff --git a/pybop/__init__.py b/pybop/__init__.py index ec9afe714..29dcd88b1 100644 --- a/pybop/__init__.py +++ b/pybop/__init__.py @@ -26,7 +26,7 @@ # # Cost function class # -from .costs.error_costs import RootMeanSquaredError, SumSquaredError +from .costs.error_costs import BaseCost, RootMeanSquaredError, SumSquaredError # # Dataset class diff --git a/pybop/costs/error_costs.py b/pybop/costs/error_costs.py index f6918dc51..c36d372f5 100644 --- a/pybop/costs/error_costs.py +++ b/pybop/costs/error_costs.py @@ -1,5 +1,4 @@ import numpy as np -import pybop class BaseCost: @@ -34,9 +33,6 @@ class RootMeanSquaredError(BaseCost): def __init__(self, problem): super(RootMeanSquaredError, self).__init__(problem) - if not isinstance(problem, pybop.Problem): - raise ValueError("This cost function only supports pybop problems") - def __call__(self, x, grad=None): """ Computes the cost. @@ -56,9 +52,6 @@ class SumSquaredError(BaseCost): def __init__(self, problem): super(SumSquaredError, self).__init__(problem) - if not isinstance(problem, pybop.Problem): - raise ValueError("This cost function only supports pybop problems") - def __call__(self, x, grad=None): """ Computes the cost. diff --git a/pybop/optimisation.py b/pybop/optimisation.py index 946e9b82d..e890e45dd 100644 --- a/pybop/optimisation.py +++ b/pybop/optimisation.py @@ -46,20 +46,26 @@ def __init__( del cost # Construct Optimiser - if self.optimiser is None or issubclass(self.optimiser, pints.Optimiser): - self.pints = True - self.optimiser = self.optimiser or pints.CMAES - self.optimiser = optimiser(self.x0, self.sigma0, self.bounds) + self.pints = True - elif issubclass(self.optimiser, pybop.NLoptOptimize): + if self.optimiser is None: + self.optimiser = pints.CMAES + elif issubclass(self.optimiser, pints.Optimiser): + pass + else: self.pints = False - self.optimiser = self.optimiser(self.problem.n_parameters) - elif issubclass(self.optimiser, pybop.SciPyMinimize): - self.pints = False - self.optimiser = self.optimiser() - else: - raise ValueError("Optimiser selected is not supported.") + if issubclass(self.optimiser, pybop.NLoptOptimize): + self.optimiser = self.optimiser(self.problem.n_parameters) + + elif issubclass(self.optimiser, pybop.SciPyMinimize): + self.optimiser = self.optimiser() + + else: + raise ValueError("Unknown optimiser type") + + if self.pints: + self.optimiser = self.optimiser(self.x0, self.sigma0, self.bounds) # Check if sensitivities are required self._needs_sensitivities = self.optimiser.needs_sensitivities() @@ -76,10 +82,7 @@ def __init__( # User callback self._callback = None - # - # Stopping criteria - # - + # Define stopping criteria # Maximum iterations self._max_iterations = None self.set_max_iterations() diff --git a/pybop/optimisers/nlopt_optimize.py b/pybop/optimisers/nlopt_optimize.py index 2bc3be85c..5c0da8f47 100644 --- a/pybop/optimisers/nlopt_optimize.py +++ b/pybop/optimisers/nlopt_optimize.py @@ -10,11 +10,12 @@ class NLoptOptimize(BaseOptimiser): def __init__(self, n_param, xtol=None, method=None): super().__init__() self.name = "NLoptOptimize" + self.n_param = n_param if method is not None: - self.optim = nlopt.opt(method, n_param) + self.optim = nlopt.opt(method, self.n_param) else: - self.optim = nlopt.opt(nlopt.LN_BOBYQA, n_param) + self.optim = nlopt.opt(nlopt.LN_BOBYQA, self.n_param) if xtol is not None: self.optim.set_xtol_rel(xtol) diff --git a/pybop/optimisers/pints_optimisers.py b/pybop/optimisers/pints_optimisers.py index 621e02ae6..903d4d560 100644 --- a/pybop/optimisers/pints_optimisers.py +++ b/pybop/optimisers/pints_optimisers.py @@ -37,22 +37,20 @@ def check(self, parameters): """ Returns ``True`` if and only if the given point in parameter space is within the boundaries. - - Parameters - ---------- - parameters - A point in parameter space """ - result = False - if ( - parameters[0] >= self.bounds["lower"][0] - and parameters[1] >= self.bounds["lower"][1] - and parameters[0] <= self.bounds["upper"][0] - and parameters[1] <= self.bounds["upper"][1] - ): - result = True - - return result + + lower_bounds = self.bounds["lower"] + upper_bounds = self.bounds["upper"] + + if len(parameters) != len(lower_bounds): + raise ValueError("Parameters length mismatch") + + within_bounds = all( + low <= param <= high + for low, high, param in zip(lower_bounds, upper_bounds, parameters) + ) + + return within_bounds def n_parameters(self): """ diff --git a/tests/unit/test_cost.py b/tests/unit/test_cost.py index ec109ec95..71fc6237a 100644 --- a/tests/unit/test_cost.py +++ b/tests/unit/test_cost.py @@ -9,8 +9,8 @@ class TestCosts: """ @pytest.mark.unit - def test_RootMeanSquaredError(self): - # Tests cost function + def test_costs(self): + # Construct Problem model = pybop.lithium_ion.SPM() parameters = [ pybop.Parameter( @@ -32,12 +32,29 @@ def test_RootMeanSquaredError(self): signal = "Voltage [V]" problem = pybop.Problem(model, parameters, dataset, signal=signal) + + # Base Cost + cost = pybop.BaseCost(problem) + assert cost.problem == problem + with pytest.raises(NotImplementedError): + cost([0.5]) + with pytest.raises(NotImplementedError): + cost.n_parameters() + + # Root Mean Squared Error cost = pybop.RootMeanSquaredError(problem) cost([0.5]) assert type(cost([0.5])) == np.float64 assert cost([0.5]) >= 0 + # Root Mean Squared Error + cost = pybop.SumSquaredError(problem) + cost([0.5]) + + assert type(cost([0.5])) == np.float64 + assert cost([0.5]) >= 0 + def getdata(self, model, x0): model.parameter_set = model.pybamm_model.default_parameter_values model.parameter_set.update( diff --git a/tests/unit/test_models.py b/tests/unit/test_models.py index ba47b0bfb..5d1c095cb 100644 --- a/tests/unit/test_models.py +++ b/tests/unit/test_models.py @@ -22,3 +22,7 @@ def test_build(self): model = pybop.lithium_ion.SPM() model.build() assert model.built_model is not None + + # Test that the model can be built again + model.build() + assert model.built_model is not None diff --git a/tests/unit/test_optimisation.py b/tests/unit/test_optimisation.py index c77055e2f..8c33732a6 100644 --- a/tests/unit/test_optimisation.py +++ b/tests/unit/test_optimisation.py @@ -35,3 +35,41 @@ def test_prior_sampling(self): opt = pybop.Optimisation(cost=cost, optimiser=pybop.NLoptOptimize) assert opt.x0 <= 0.77 and opt.x0 >= 0.73 + + @pytest.mark.unit + def test_optimiser_construction(self): + # Tests construction of optimisers + + dataset = [ + pybop.Dataset("Time [s]", np.linspace(0, 360, 10)), + pybop.Dataset("Current function [A]", np.zeros(10)), + pybop.Dataset("Terminal voltage [V]", np.ones(10)), + ] + parameters = [ + pybop.Parameter( + "Negative electrode active material volume fraction", + prior=pybop.Gaussian(0.75, 0.2), + bounds=[0.73, 0.77], + ) + ] + + problem = pybop.Problem(pybop.lithium_ion.SPM(), parameters, dataset, signal="Terminal voltage [V]") + cost = pybop.SumSquaredError(problem) + + opt = pybop.Optimisation(cost=cost, optimiser=pybop.NLoptOptimize) + assert opt.optimiser is not None + assert opt.optimiser.name == "NLoptOptimize" + assert opt.optimiser.n_param == 1 + + opt = pybop.Optimisation(cost=cost, optimiser=pybop.GradientDescent) + assert opt.optimiser is not None + # assert issubclass(opt.optimiser, pybop.GradientDescent) + + opt = pybop.Optimisation(cost=cost, optimiser=pybop.SciPyMinimize) + assert opt.optimiser is not None + assert opt.optimiser.name == "SciPyMinimize" + + class randomclass: + pass + with pytest.raises(ValueError): + pybop.Optimisation(cost=cost, optimiser=randomclass) diff --git a/tests/unit/test_problem.py b/tests/unit/test_problem.py index ec415dc53..54e8f0bab 100644 --- a/tests/unit/test_problem.py +++ b/tests/unit/test_problem.py @@ -42,6 +42,9 @@ def test_problem(self): assert problem._model == model assert problem._model._built_model is not None + # Test model.simulate + model.simulate(inputs=[0.5,0.5], t_eval=np.linspace(0, 10, 100)) + def getdata(self, model, x0): model.parameter_set = model.pybamm_model.default_parameter_values From 53f6c727e31fae9539709f1ddc3403d83d3370b1 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 15 Nov 2023 20:08:46 +0000 Subject: [PATCH 182/210] style: pre-commit fixes --- tests/unit/test_optimisation.py | 5 ++++- tests/unit/test_problem.py | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/unit/test_optimisation.py b/tests/unit/test_optimisation.py index 8c33732a6..da7ff7706 100644 --- a/tests/unit/test_optimisation.py +++ b/tests/unit/test_optimisation.py @@ -53,7 +53,9 @@ def test_optimiser_construction(self): ) ] - problem = pybop.Problem(pybop.lithium_ion.SPM(), parameters, dataset, signal="Terminal voltage [V]") + problem = pybop.Problem( + pybop.lithium_ion.SPM(), parameters, dataset, signal="Terminal voltage [V]" + ) cost = pybop.SumSquaredError(problem) opt = pybop.Optimisation(cost=cost, optimiser=pybop.NLoptOptimize) @@ -71,5 +73,6 @@ def test_optimiser_construction(self): class randomclass: pass + with pytest.raises(ValueError): pybop.Optimisation(cost=cost, optimiser=randomclass) diff --git a/tests/unit/test_problem.py b/tests/unit/test_problem.py index 54e8f0bab..93879f395 100644 --- a/tests/unit/test_problem.py +++ b/tests/unit/test_problem.py @@ -43,7 +43,7 @@ def test_problem(self): assert problem._model._built_model is not None # Test model.simulate - model.simulate(inputs=[0.5,0.5], t_eval=np.linspace(0, 10, 100)) + model.simulate(inputs=[0.5, 0.5], t_eval=np.linspace(0, 10, 100)) def getdata(self, model, x0): model.parameter_set = model.pybamm_model.default_parameter_values From 8f7f4fae8ed3858c20b59a47bcbcb831b188206d Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 16 Nov 2023 10:19:43 +0000 Subject: [PATCH 183/210] Add tests, remove redundant method from optimisation, add try-except functionality to cost.evaluateS1, optimiser now optional input to Optimisation --- pybop/costs/error_costs.py | 26 ++++++++++++++----------- pybop/optimisation.py | 29 ++++------------------------ tests/unit/test_cost.py | 14 ++++++++++++++ tests/unit/test_models.py | 5 +++++ tests/unit/test_optimisation.py | 19 ++++++++++++++++-- tests/unit/test_parameterisations.py | 22 ++++++++++++++------- tests/unit/test_problem.py | 2 +- 7 files changed, 71 insertions(+), 46 deletions(-) diff --git a/pybop/costs/error_costs.py b/pybop/costs/error_costs.py index c36d372f5..d3f4c6d18 100644 --- a/pybop/costs/error_costs.py +++ b/pybop/costs/error_costs.py @@ -69,15 +69,19 @@ def evaluateS1(self, x): Compute the cost and corresponding gradients with respect to the parameters. """ - y, dy = self.problem.evaluateS1(x) - dy = dy.reshape( - ( - self.problem.n_time_data, - self.problem.n_outputs, - self.problem.n_parameters, + try: + y, dy = self.problem.evaluateS1(x) + dy = dy.reshape( + ( + self.problem.n_time_data, + self.problem.n_outputs, + self.problem.n_parameters, + ) ) - ) - r = y - self._target - e = np.sum(np.sum(r**2, axis=0), axis=0) - de = 2 * np.sum(np.sum((r.T * dy.T), axis=2), axis=1) - return e, de + r = y - self._target + e = np.sum(np.sum(r**2, axis=0), axis=0) + de = 2 * np.sum(np.sum((r.T * dy.T), axis=2), axis=1) + return e, de + + except Exception as e: + raise ValueError(f"Error in cost calculation: {e}") diff --git a/pybop/optimisation.py b/pybop/optimisation.py index e890e45dd..cf5c905bd 100644 --- a/pybop/optimisation.py +++ b/pybop/optimisation.py @@ -18,7 +18,7 @@ class Optimisation: def __init__( self, cost, - optimiser, + optimiser=None, sigma0=None, verbose=False, ): @@ -49,7 +49,7 @@ def __init__( self.pints = True if self.optimiser is None: - self.optimiser = pints.CMAES + self.optimiser = pybop.CMAES elif issubclass(self.optimiser, pints.Optimiser): pass else: @@ -190,7 +190,7 @@ def _run_pints(self): while running: # Ask optimiser for new points xs = self.optimiser.ask() - self.log.append(xs) + # Evaluate points fs = evaluator.evaluate(xs) @@ -213,6 +213,7 @@ def _run_pints(self): # Update counts evaluations += len(fs) iteration += 1 + self.log.append(xs) # Check stopping criteria: # Maximum number of iterations @@ -328,28 +329,6 @@ def set_f_guessed_tracking(self, use_f_guessed=False): """ self._use_f_guessed = bool(use_f_guessed) - def set_log_interval(self, iters=20, warm_up=3): - """ - Changes the frequency with which messages are logged. - - Parameters - ---------- - ``interval`` - A log message will be shown every ``iters`` iterations. - ``warm_up`` - A log message will be shown every iteration, for the first - ``warm_up`` iterations. - - Credit: PINTS - """ - iters = int(iters) - if iters < 1: - raise ValueError("Interval must be greater than zero.") - warm_up = max(0, int(warm_up)) - - self._message_interval = iters - self._message_warm_up = warm_up - def set_parallel(self, parallel=False): """ Enables/disables parallel evaluation. diff --git a/tests/unit/test_cost.py b/tests/unit/test_cost.py index 71fc6237a..650c576f8 100644 --- a/tests/unit/test_cost.py +++ b/tests/unit/test_cost.py @@ -55,6 +55,20 @@ def test_costs(self): assert type(cost([0.5])) == np.float64 assert cost([0.5]) >= 0 + # Test catch on non-matching vector lengths + # Sum Squared Error + cost = pybop.SumSquaredError(problem) + with pytest.raises(ValueError): + cost(["test-entry"]) + + with pytest.raises(ValueError): + cost.evaluateS1(["test-entry"]) + + # Root Mean Squared Error + cost = pybop.RootMeanSquaredError(problem) + with pytest.raises(ValueError): + cost(["test-entry"]) + def getdata(self, model, x0): model.parameter_set = model.pybamm_model.default_parameter_values model.parameter_set.update( diff --git a/tests/unit/test_models.py b/tests/unit/test_models.py index 5d1c095cb..f8fb26f75 100644 --- a/tests/unit/test_models.py +++ b/tests/unit/test_models.py @@ -17,6 +17,11 @@ def test_simulate_without_build_model(self): ): model.simulate(None, None) + with pytest.raises( + ValueError, match="Model must be built before calling simulate" + ): + model.simulateS1(None, None) + @pytest.mark.unit def test_build(self): model = pybop.lithium_ion.SPM() diff --git a/tests/unit/test_optimisation.py b/tests/unit/test_optimisation.py index 8c33732a6..4e283d9c9 100644 --- a/tests/unit/test_optimisation.py +++ b/tests/unit/test_optimisation.py @@ -53,23 +53,38 @@ def test_optimiser_construction(self): ) ] - problem = pybop.Problem(pybop.lithium_ion.SPM(), parameters, dataset, signal="Terminal voltage [V]") + problem = pybop.Problem( + pybop.lithium_ion.SPM(), parameters, dataset, signal="Terminal voltage [V]" + ) cost = pybop.SumSquaredError(problem) + # Test construction of optimisers + # NLopt opt = pybop.Optimisation(cost=cost, optimiser=pybop.NLoptOptimize) assert opt.optimiser is not None assert opt.optimiser.name == "NLoptOptimize" assert opt.optimiser.n_param == 1 + # Gradient Descent opt = pybop.Optimisation(cost=cost, optimiser=pybop.GradientDescent) assert opt.optimiser is not None - # assert issubclass(opt.optimiser, pybop.GradientDescent) + # None + opt = pybop.Optimisation(cost=cost) + assert opt.optimiser is not None + assert ( + opt.optimiser.name() + == "Covariance Matrix Adaptation Evolution Strategy (CMA-ES)" + ) + + # SciPy opt = pybop.Optimisation(cost=cost, optimiser=pybop.SciPyMinimize) assert opt.optimiser is not None assert opt.optimiser.name == "SciPyMinimize" + # Incorrect class class randomclass: pass + with pytest.raises(ValueError): pybop.Optimisation(cost=cost, optimiser=randomclass) diff --git a/tests/unit/test_parameterisations.py b/tests/unit/test_parameterisations.py index 1c9c14677..580fb0627 100644 --- a/tests/unit/test_parameterisations.py +++ b/tests/unit/test_parameterisations.py @@ -103,17 +103,23 @@ def test_spme_multiple_optimisers(self, init_soc): cost = pybop.RootMeanSquaredError(problem) # Select optimisers - optimisers = [ - pybop.NLoptOptimize, - pybop.SciPyMinimize, - ] + optimisers = [pybop.NLoptOptimize, pybop.SciPyMinimize, pybop.CMAES] # Test each optimiser for optimiser in optimisers: parameterisation = pybop.Optimisation(cost=cost, optimiser=optimiser) - # Run the optimisation problem - x, final_cost = parameterisation.run() + if optimiser == pybop.CMAES: + parameterisation.set_max_iterations(100) + parameterisation.set_f_guessed_tracking(True) + + x, final_cost = parameterisation.run() + + assert parameterisation._iterations == 100 + assert parameterisation._use_f_guessed is True + + else: + x, final_cost = parameterisation.run() # Assertions np.testing.assert_allclose(final_cost, 0, atol=1e-2) @@ -122,7 +128,9 @@ def test_spme_multiple_optimisers(self, init_soc): @pytest.mark.parametrize("init_soc", [0.3, 0.5, 0.8]) @pytest.mark.unit def test_model_misparameterisation(self, init_soc): - # Define model + # Define two different models with different parameter sets + # The optimisation should fail as the models are not the same + parameter_set = pybop.ParameterSet("pybamm", "Chen2020") model = pybop.lithium_ion.SPM(parameter_set=parameter_set) diff --git a/tests/unit/test_problem.py b/tests/unit/test_problem.py index 54e8f0bab..93879f395 100644 --- a/tests/unit/test_problem.py +++ b/tests/unit/test_problem.py @@ -43,7 +43,7 @@ def test_problem(self): assert problem._model._built_model is not None # Test model.simulate - model.simulate(inputs=[0.5,0.5], t_eval=np.linspace(0, 10, 100)) + model.simulate(inputs=[0.5, 0.5], t_eval=np.linspace(0, 10, 100)) def getdata(self, model, x0): model.parameter_set = model.pybamm_model.default_parameter_values From 11d5e60f94889cfc1b0bcb673376e3fbfc6d9038 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 16 Nov 2023 10:50:19 +0000 Subject: [PATCH 184/210] Update notebook for API changes --- examples/notebooks/rmse-estimisation.ipynb | 173 ++++++++++++--------- 1 file changed, 97 insertions(+), 76 deletions(-) diff --git a/examples/notebooks/rmse-estimisation.ipynb b/examples/notebooks/rmse-estimisation.ipynb index ff7b47771..28b4c2951 100644 --- a/examples/notebooks/rmse-estimisation.ipynb +++ b/examples/notebooks/rmse-estimisation.ipynb @@ -108,9 +108,9 @@ "experiment = pybamm.Experiment(\n", " [\n", " (\n", - " \"Discharge at 2C for 5 minutes (1 second period)\",\n", + " \"Discharge at 1C for 15 minutes (1 second period)\",\n", " \"Rest for 2 minutes (1 second period)\",\n", - " \"Charge at 1C for 5 minutes (1 second period)\",\n", + " \"Charge at 1C for 15 minutes (1 second period)\",\n", " \"Rest for 2 minutes (1 second period)\",\n", " ),\n", " ]\n", @@ -132,25 +132,15 @@ "execution_count": 6, "metadata": {}, "outputs": [ - { - "data": { - "image/png": "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S2VdBQDA2LFjtRq8H1UTXQUAwLvvvot33323whgiIiIiIiIiopfRggULMGbMGIwYMQIAEB0djbi4OCxfvhyfffZZmfjVq1drzS9duhQbN25EcnIyAgICpOVyubzKY9IVFBSgoKBAmtdoNAAAQ0PDau8PEVFtqfad6ERERERERERE9HwrLCxEeno6vL29pWV6enrw9vZGWlpaleq4c+cOioqKYGlpqbU8NTUVTZo0gZOTE8aPH48bN26UW0dERATMzc2lyc7O7vF2iIioFrERnYiIiIiIiIiojvnnn39QXFwMKysrreVWVlZQq9VVquPTTz+Fra2tVkO8r68vVq5cieTkZHz99dfYuXMn/Pz8UFxcrLOOsLAw5ObmStOVK1cAACUlJY+5Z0REzx4b0YmIiIiI6pAlS5bAxcUFCoUCCoUCnp6e+PXXXwEAN2/exEcffQQnJycYGxujWbNmmDBhAnJzc7XqeHTAOJlMhrVr12rFpKamokOHDpDL5WjRogViY2PL5FKdweyIiOj5Mnv2bKxduxabN2+GkZGRtHzQoEF488030a5dO/j7+2P79u04dOgQUlNTddYjl8ul76TSCQDu3r37LHaDiKhGsBGdiIiIiKgOadq0KWbPno309HQcPnwYPXv2RP/+/XHy5Elcu3YN165dw7x583DixAnExsYiPj4eo0aNKlNPTEyM1qBx/v7+UllmZib69u2LHj16QKVSISQkBKNHj0ZCQoIUU93B7IiIqGY1atQI+vr6yM7O1lqenZ1daX/m8+bNw+zZs5GYmAgXF5cKY5s3b45GjRrh/PnzT5wzEdHzqtoDixIRERER0fOrX79+WvNffvkllixZgv3792PUqFHYuHGjVPbqq6/iyy+/xPvvv4/79++jXr3//XlgYWFRbiNLdHQ0HB0dMX/+fABAmzZtsGfPHixcuBBKpRJA9QezK1XeAHRERFQ9hoaGcHd3R3JysvRDaElJCZKTkxEcHFzuenPmzMGXX36JhIQEdOzYsdLtXL16FTdu3ICNjU1NpU5E9NzhnehERERERHVUcXEx1q5di/z8fHh6euqMyc3NhUKh0GpAB4CgoCA0atQInTp1wvLlyyGEkMrS0tK0+scFAKVSKQ1U9ySD2XEAOiKimhMaGooffvgBK1aswOnTpzF+/Hjk5+dLP3AGBAQgLCxMiv/666/xxRdf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F/t1IqLah307EREVZ8KECfjpp58wfPhwfPnllzA0NMTdu3exfft2/Pzzz1BVVS1TOYcOHcL9+/fRs2dP1K9fH7///jvy8vJgZWVVyS2gmogj0anO+frrr5GSkoI1a9Zg5syZePfdd/HFF1+Uq4zIyEgAwNq1a3Hnzh388ccfcHd3B5B/w09ERFWH/ToRUe3Dvp2IiIpjZmaGM2fOIDc3F46OjmjXrh2mTJkCAwMDqKiUPdRpYGCAPXv24MMPP0SrVq0QEBCAX3/9FW3atKnE2lNNxZHoVKeEhYVh1apVOH78OORyOQBg69at6NChA/z9/TF+/PgylRMZGQknJyfcv38f7dq1Q+vWrfHtt99i/PjxWLNmDbZu3VqZzSAiov/Hfp2IqPZh305EVPN5eHjAw8OjUHpgYKDCflhYWKE8RU3hJYRQ2G/ZsiX27NnzFjUEunfvXuT1iYrCIDrVKb1790Z2drZCmqWlJVJSUspVztWrV9G1a1d89913CumfffaZ9O83/SIgIqKyY79ORFT7sG8nIqLKkJKSAl1dXUyYMAGLFy8uNf+4cePwyy+/VEHNqCbgdC5EZfDDDz9AV1cXUVFRAPJvyNu1a1cp1xo3bhx0dXUrpWwiIsrHfp2IqPZh305ERMUZNGgQ7ty5g8jISMyYMaNM58ybNw+RkZG4c+cOPvroo0quIVV3MsGf1IlK9PjxY7x8+RIA0KRJEyQlJcHU1BQ3btxA69atK/x6iYmJSE1NBQCYmpqWe2VpIiIqGft1IqLah307ERERVSYG0YmIiIiIiIiIiIiIisHpXIiIiIiIiIiIiIiIisEgOhERERERERERERFRMRhEJyIiIiIiIiIiIiIqBoPoRERERERERERERETFYBCdiIiIiIiIiIiIiKgYDKITERERERERERERERWDQXQiIiIiIiIiIiIiomIwiE5EREREREREREREVAwG0YmIiIiIiIiIiIiIisEgOhERERERERERERFRMRhEJyIiIiIiIiIiIiIqBoPoRERERERERERERETFYBCdiIiIiIiIiIiIiKgYDKITERERERERERERERWDQXQiIiIiIiIiIiIiomIwiE5EREREREREREREVAwG0ancLC0tsWrVKqXWITAwEAYGBkqtQ3lVh9dNGXx9fdGxY8dynSOTybBv375ij/fu3RsymQwymQyRkZHl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Z49+/PFHbdq0SSNHjlRhYWG529m4caMWLFig1NRU/fLLL1q9erWKiorUrl27KowetVXVP7YcqGEuXryooUOH6t5771W7du00evRo7d+/X97e3uVuIy0tTRcuXJCfn5+lLCkpScePHy820wUAULUY1wGg7mFsBwCUxs/PT19++aWeeuop9enTR3l5eWrZsqUiIiJkZ1f++cJubm56//33NWPGDF24cEFt27bVf/7zH11//fVVGD1qK5LoqHeeeeYZnTlzRgsWLFCjRo306aef6sEHH9TGjRvL3UZqaqokaeHChXrsscd05MgRyxOcL168WBVhAwBKwbgOAHUPYzsA1G4jRozQiBEjipWvXLnSan/btm3F6pT06SOTyWS137ZtW73//vtXEaEUGhpa4vWBkrCcC+qVbdu2af78+XrzzTdlNBplZ2enN998U1988YWWLFlS7nZSU1MVHh6un376SR07dtQzzzyjZ599VkajUQsWLKjCHgAA/opxHQDqHsZ2AEBVOHPmjBo1aqSnnnqqXPUfeughNWrUqIqjQm3BTHTUKz179lR+fr5VWatWrXTmzJkrauebb77RTTfdpOeee86q/P7777d8X9F3UwEA5ce4DgB1D2M7AKCy3XXXXQoNDZVkXsalPGbOnKl///vfkqRmzZpVVWioJZiJDpTD4sWL1ahRI+3fv1+S+QV5x44dq+RavNMJAFWPcR0A6h7GdgBAaRo3bqw2bdqoTZs28vT0LNc53t7elnMaNmxYxRGipjOYeEsdKNPx48d1/vx5SVKLFi2UmZmpZs2a6eDBg+rQoUOlXy8jI0PZ2dmSzO90MlADQOViXAeAuoexHQAAVCWS6AAAAAAAAAAAlILlXAAAAAAAAAAAKAVJdAAAAAAAAAAASkESHQAAAAAAAACAUpBEBwAAAAAAAACgFCTRAQAAAAAAAAAoBUl0AAAAAAAAAABKQRIdAAAAAAAAAIBSkEQHAAAAAAAAAKAUJNEBAAAAAAAAACgFSXQAAAAAAAAAAErx/wG5zswtkpVtsAAAAABJRU5ErkJggg==", - "text/plain": [ - "<Figure size 1500x700 with 8 Axes>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "733a23c5511b4df7be43966d0fcc268b", + "model_id": "b81d2479a67e475cafce6cab6d366680", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "interactive(children=(FloatSlider(value=0.0, description='t', max=1680.0, step=16.8), Output()), _dom_classes=…" + "interactive(children=(FloatSlider(value=0.0, description='t', max=1.1333333333333333, step=0.01133333333333333…" ] }, "metadata": {}, @@ -159,7 +149,7 @@ { "data": { "text/plain": [ - "<pybamm.plotting.quick_plot.QuickPlot at 0x7fd9141a5f50>" + "<pybamm.plotting.quick_plot.QuickPlot at 0x126561bd0>" ] }, "execution_count": 6, @@ -185,7 +175,7 @@ "outputs": [], "source": [ "corrupt_V = synthetic_sol[\"Terminal voltage [V]\"].data\n", - "corrupt_V += np.random.normal(0, 0.005, len(corrupt_V))" + "corrupt_V += np.random.normal(0, 0.001, len(corrupt_V))" ] }, { @@ -209,10 +199,10 @@ "outputs": [], "source": [ "model = pybop.lithium_ion.SPM()\n", - "observations = [\n", - " pybop.Observed(\"Time [s]\", synthetic_sol[\"Time [s]\"].data),\n", - " pybop.Observed(\"Current function [A]\", synthetic_sol[\"Current [A]\"].data),\n", - " pybop.Observed(\"Voltage [V]\", corrupt_V),\n", + "dataset = [\n", + " pybop.Dataset(\"Time [s]\", synthetic_sol[\"Time [s]\"].data),\n", + " pybop.Dataset(\"Current function [A]\", synthetic_sol[\"Current [A]\"].data),\n", + " pybop.Dataset(\"Voltage [V]\", corrupt_V),\n", "]" ] }, @@ -229,7 +219,7 @@ "metadata": {}, "outputs": [], "source": [ - "fit_params = [\n", + "parameters = [\n", " pybop.Parameter(\n", " \"Negative electrode active material volume fraction\",\n", " prior=pybop.Gaussian(0.5, 0.02),\n", @@ -247,7 +237,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We can now construct PyBOP's parameterisation class. This class provides the parameterisation methods needed to fit the forward model." + "We can now construct a cost function and define the fitting signal." ] }, { @@ -256,8 +246,31 @@ "metadata": {}, "outputs": [], "source": [ - "parameterisation = pybop.Parameterisation(\n", - " model, observations=observations, fit_parameters=fit_params\n", + "# Define the cost to optimise\n", + "cost = pybop.RMSE()\n", + "signal = \"Voltage [V]\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's construct PyBOP's optimisation class. This class provides the methods needed to fit the forward model." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "parameterisation = pybop.Optimisation(\n", + " cost=cost,\n", + " model=model,\n", + " optimiser=pybop.NLoptOptimize(n_param=len(parameters)),\n", + " parameters=parameters,\n", + " dataset=dataset,\n", + " signal=signal,\n", ")" ] }, @@ -270,56 +283,57 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Last Voltage Values: 3.7996611982185766 3.7975057810794395\n", - "Last Voltage Values: 3.7998126133693533 3.7975057810794395\n", - "Last Voltage Values: 3.8031854726522285 3.7975057810794395\n", - "Last Voltage Values: 3.799468931833036 3.7975057810794395\n", - "Last Voltage Values: 3.795602883298669 3.7975057810794395\n", - "Last Voltage Values: 3.799699771891773 3.7975057810794395\n", - "Last Voltage Values: 3.7996774395763646 3.7975057810794395\n", - "Last Voltage Values: 3.799593518890104 3.7975057810794395\n", - "Last Voltage Values: 3.799509395374853 3.7975057810794395\n", - "Last Voltage Values: 3.799536439260354 3.7975057810794395\n", - "Last Voltage Values: 3.799500287332914 3.7975057810794395\n", - "Last Voltage Values: 3.7995753351359633 3.7975057810794395\n", - "Last Voltage Values: 3.7995384590593297 3.7975057810794395\n", - "Last Voltage Values: 3.7995486528904316 3.7975057810794395\n", - "Last Voltage Values: 3.799516169359653 3.7975057810794395\n", - "Last Voltage Values: 3.7995185726290273 3.7975057810794395\n", - "Last Voltage Values: 3.7995203555320374 3.7975057810794395\n", - "Last Voltage Values: 3.7995147509521265 3.7975057810794395\n", - "Last Voltage Values: 3.7995176549369756 3.7975057810794395\n", - "Last Voltage Values: 3.79951475648217 3.7975057810794395\n", - "Last Voltage Values: 3.799511594116657 3.7975057810794395\n", - "Last Voltage Values: 3.7995343783536892 3.7975057810794395\n", - "Last Voltage Values: 3.799509412527155 3.7975057810794395\n", - "Last Voltage Values: 3.7995128802129674 3.7975057810794395\n", - "Last Voltage Values: 3.799512401383983 3.7975057810794395\n", - "Last Voltage Values: 3.7995112796265267 3.7975057810794395\n", - "Last Voltage Values: 3.7995122788212523 3.7975057810794395\n", - "Last Voltage Values: 3.7995113814292405 3.7975057810794395\n", - "Last Voltage Values: 3.7995114700840316 3.7975057810794395\n", - "Last Voltage Values: 3.799511298272937 3.7975057810794395\n", - "Last Voltage Values: 3.799511135780194 3.7975057810794395\n", - "Last Voltage Values: 3.799510972324501 3.7975057810794395\n", - "Last Voltage Values: 3.7995318559387594 3.7975057810794395\n", - "Last Voltage Values: 3.799510973343803 3.7975057810794395\n", - "Last Voltage Values: 3.799511115021574 3.7975057810794395\n", - "Last Voltage Values: 3.7995110103732177 3.7975057810794395\n" + "Cost: 0.0014306419900053451\n", + "Cost: 0.001878140952546479\n", + "Cost: 0.0056853760898525705\n", + "Cost: 0.0011144296137402825\n", + "Cost: 0.004234408585704868\n", + "Cost: 0.002260880733148505\n", + "Cost: 0.0010374243859739255\n", + "Cost: 0.0011340799888696297\n", + "Cost: 0.001093836134793644\n", + "Cost: 0.001042723321241934\n", + "Cost: 0.0010266172137603305\n", + "Cost: 0.00103588203364289\n", + "Cost: 0.001007039288536067\n", + "Cost: 0.000990040153496016\n", + "Cost: 0.0009820913602296417\n", + "Cost: 0.0009795434928262323\n", + "Cost: 0.0009945581830178092\n", + "Cost: 0.0009921144772808324\n", + "Cost: 0.0009825846380214938\n", + "Cost: 0.0009915338481534652\n", + "Cost: 0.0009789337894256292\n", + "Cost: 0.0009823901578605396\n", + "Cost: 0.0009786983892344486\n", + "Cost: 0.0009785339841692688\n", + "Cost: 0.000978719434079295\n", + "Cost: 0.000978406378769787\n", + "Cost: 0.0009784181875287846\n", + "Cost: 0.0009792572769492622\n", + "Cost: 0.0009789609220288331\n", + "Cost: 0.000979061722139482\n", + "Cost: 0.0009784215735618952\n", + "Cost: 0.0009790240608910446\n", + "Cost: 0.0009784386249667666\n", + "Cost: 0.0009784283248914902\n", + "Cost: 0.0009784142223954373\n", + "Cost: 0.0009791106518699038\n", + "Cost: 0.0009784113851583095\n", + "Cost: 0.0009791097832152831\n", + "Cost: 0.0009784096923936012\n" ] } ], "source": [ - "results, last_optim, num_evals = parameterisation.rmse(\n", - " signal=\"Voltage [V]\", method=\"nlopt\"\n", - ")" + "x, output, final_cost, num_evals = parameterisation.run()" ] }, { @@ -331,22 +345,22 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array([0.49301982, 0.63682677])" + "array([0.50138974, 0.63221165])" ] }, - "execution_count": 12, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "results" + "x" ] }, { @@ -365,14 +379,14 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "params.update(\n", " {\n", - " \"Negative electrode active material volume fraction\": results[0],\n", - " \"Positive electrode active material volume fraction\": results[1],\n", + " \"Negative electrode active material volume fraction\": x[0],\n", + " \"Positive electrode active material volume fraction\": x[1],\n", " }\n", ")\n", "optsol = sim.solve()[\"Terminal voltage [V]\"].data" @@ -387,22 +401,22 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "<matplotlib.legend.Legend at 0x7fd910dc2290>" + "<matplotlib.legend.Legend at 0x12721faf0>" ] }, - "execution_count": 14, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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", + "image/png": "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qFEjsmXLhqIorFy5Mt7zqqry5ZdfkjVrVjw8PKhVqxanTp2KV+bOnTu0bt0ab29v0qVLR4cOHbh//368MocOHaJq1aq4u7uTM2dOvvrqq6TetRfu20cfffTEcaxXr168Ms66b0FBQbzxxhukTZuWTJky0bRpU06cOBGvTGJ9DkNCQihTpgxubm7kz5+fefPmab5vNWrUeOLYdenSxen3LTg4mBIlSjgmxAsMDGTNmjWO5131mL3MvrnqMXuacePGOebYe8SVj108qkgWixYtUk0mkzpnzhz1yJEjaqdOndR06dKp169f1zq05xo2bJhatGhRNSwszPFz8+ZNx/NdunRRc+bMqW7cuFHdu3evWrFiRbVSpUqO561Wq1qsWDG1Vq1a6v79+9XVq1ervr6+6sCBA5N9X1avXq0OHjxYXb58uQqoK1asiPf8uHHjVB8fH3XlypXqwYMH1caNG6t58uRRo6OjHWXq1aunlixZUt25c6e6detWNX/+/GrLli0dz0dERKiZM2dWW7durR4+fFj95ZdfVA8PD3XWrFma7lu7du3UevXqxTuOd+7ciVfGWfetbt266ty5c9XDhw+rBw4cUBs0aKDmypVLvX//vqNMYnwOz549q3p6eqp9+vRRjx49qk6bNk3V6/Xq2rVrNd236tWrq506dYp37CIiIpx+337//Xd11apV6smTJ9UTJ06ogwYNUo1Go3r48GFVVV33mL3MvrnqMfuv3bt3q/7+/mqJEiXUnj17Oh535WP3OEmAkkn58uXV7t27O/622WxqtmzZ1KCgIA2jerFhw4apJUuWfOpz4eHhqtFoVJcuXep47NixYyqg7tixQ1XVuC9mnU6nXrt2zVEmODhY9fb2VmNjY5M09uf5b5Jgt9vVLFmyqBMmTHA8Fh4errq5uam//PKLqqqqevToURVQ9+zZ4yizZs0aVVEU9cqVK6qqquqMGTPU9OnTx9u3L774Qg0ICEjiPfrXsxKgJk2aPPM1rrJvqqqqN27cUAF18+bNqqom3ufw888/V4sWLRrvvZo3b67WrVs3qXfJ4b/7pqpxX6aPf/n8l6vsm6qqavr06dUffvghRR2zRx7tm6qmjGN27949tUCBAur69evj7U9KOnbSBJYMzGYz+/bto1atWo7HdDodtWrVYseOHRpG9nJOnTpFtmzZyJs3L61bt+bixYsA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", "text/plain": [ "<Figure size 640x480 with 1 Axes>" ] @@ -418,6 +432,13 @@ "plt.ylabel(\"Voltage (V)\")\n", "plt.legend()" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -436,7 +457,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.4" + "version": "3.10.12" } }, "nbformat": 4, From 881ab843cc56ab847cf779921b305b990aa2a5fd Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 16 Nov 2023 15:16:39 +0000 Subject: [PATCH 185/210] Add BaseModel tests --- tests/unit/test_models.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/unit/test_models.py b/tests/unit/test_models.py index f8fb26f75..e5c8cc4bc 100644 --- a/tests/unit/test_models.py +++ b/tests/unit/test_models.py @@ -1,5 +1,6 @@ import pybop import pytest +import numpy as np class TestModels: @@ -22,6 +23,29 @@ def test_simulate_without_build_model(self): ): model.simulateS1(None, None) + @pytest.mark.unit + def test_predict_without_pybamm(self): + # Define model + model = pybop.lithium_ion.SPM() + model._unprocessed_model = None + + with pytest.raises(ValueError): + model.predict(None,None) + + @pytest.mark.unit + def test_predict_with_inputs(self): + # Define model + model = pybop.lithium_ion.SPM() + t_eval = np.linspace(0, 10, 100) + inputs = { + "Negative electrode active material volume fraction": 0.52, + "Positive electrode active material volume fraction": 0.63, + } + + + res = model.predict(t_eval=t_eval,inputs=inputs) + assert len(res["Terminal voltage [V]"].data) == 100 + @pytest.mark.unit def test_build(self): model = pybop.lithium_ion.SPM() From bfde78a8824572f4b591361789ffa2f5c862f236 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 16 Nov 2023 15:17:38 +0000 Subject: [PATCH 186/210] style: pre-commit fixes --- tests/unit/test_models.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/tests/unit/test_models.py b/tests/unit/test_models.py index e5c8cc4bc..ce73000a6 100644 --- a/tests/unit/test_models.py +++ b/tests/unit/test_models.py @@ -30,7 +30,7 @@ def test_predict_without_pybamm(self): model._unprocessed_model = None with pytest.raises(ValueError): - model.predict(None,None) + model.predict(None, None) @pytest.mark.unit def test_predict_with_inputs(self): @@ -38,12 +38,11 @@ def test_predict_with_inputs(self): model = pybop.lithium_ion.SPM() t_eval = np.linspace(0, 10, 100) inputs = { - "Negative electrode active material volume fraction": 0.52, - "Positive electrode active material volume fraction": 0.63, + "Negative electrode active material volume fraction": 0.52, + "Positive electrode active material volume fraction": 0.63, } - - res = model.predict(t_eval=t_eval,inputs=inputs) + res = model.predict(t_eval=t_eval, inputs=inputs) assert len(res["Terminal voltage [V]"].data) == 100 @pytest.mark.unit From 1119914a18fe0cc74c278e3d85d834b7e5c71369 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Thu, 16 Nov 2023 15:46:08 +0000 Subject: [PATCH 187/210] Add Optimisation.max_evalutions(), Add halting tests for Optimisation --- pybop/optimisation.py | 16 ++++++++++++++++ tests/unit/test_optimisation.py | 34 +++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/pybop/optimisation.py b/pybop/optimisation.py index cf5c905bd..ac8ffdfd3 100644 --- a/pybop/optimisation.py +++ b/pybop/optimisation.py @@ -329,6 +329,22 @@ def set_f_guessed_tracking(self, use_f_guessed=False): """ self._use_f_guessed = bool(use_f_guessed) + def set_max_evaluations(self, evaluations=None): + """ + Adds a stopping criterion, allowing the routine to halt after the + given number of ``evaluations``. + + This criterion is disabled by default. To enable, pass in any positive + integer. To disable again, use ``set_max_evaluations(None)``. + + Credit: PINTS + """ + if evaluations is not None: + evaluations = int(evaluations) + if evaluations < 0: + raise ValueError("Maximum number of evaluations cannot be negative.") + self._max_evaluations = evaluations + def set_parallel(self, parallel=False): """ Enables/disables parallel evaluation. diff --git a/tests/unit/test_optimisation.py b/tests/unit/test_optimisation.py index 4e283d9c9..b9d3b0414 100644 --- a/tests/unit/test_optimisation.py +++ b/tests/unit/test_optimisation.py @@ -88,3 +88,37 @@ class randomclass: with pytest.raises(ValueError): pybop.Optimisation(cost=cost, optimiser=randomclass) + + @pytest.mark.unit + def test_halting(self): + # Tests halting criteria + model = pybop.lithium_ion.SPM() + + dataset = [ + pybop.Dataset("Time [s]", np.linspace(0, 3600, 100)), + pybop.Dataset("Current function [A]", np.zeros(100)), + pybop.Dataset("Terminal voltage [V]", np.ones(100)), + ] + + param = [ + pybop.Parameter( + "Negative electrode active material volume fraction", + prior=pybop.Gaussian(0.75, 0.2), + bounds=[0.73, 0.77], + ) + ] + + problem = pybop.Problem(model, param, dataset, signal="Terminal voltage [V]") + cost = pybop.SumSquaredError(problem) + + # Test max evalutions + optim = pybop.Optimisation(cost=cost, optimiser=pybop.GradientDescent) + optim.set_max_evaluations(10) + x, __ = optim.run() + assert optim._iterations == 10 + + # Test max unchanged iterations + optim = pybop.Optimisation(cost=cost, optimiser=pybop.GradientDescent) + optim.set_max_unchanged_iterations(1) + x, __ = optim.run() + assert optim._iterations == 2 From 2d520798a82cdff7d898f05e60ff4dc32912f144 Mon Sep 17 00:00:00 2001 From: NicolaCourtier <45851982+NicolaCourtier@users.noreply.github.com> Date: Fri, 17 Nov 2023 00:22:56 +0000 Subject: [PATCH 188/210] Update rmse-estimisation.ipynb --- examples/notebooks/rmse-estimisation.ipynb | 189 ++++----------------- 1 file changed, 37 insertions(+), 152 deletions(-) diff --git a/examples/notebooks/rmse-estimisation.ipynb b/examples/notebooks/rmse-estimisation.ipynb index 28b4c2951..3b9b257fa 100644 --- a/examples/notebooks/rmse-estimisation.ipynb +++ b/examples/notebooks/rmse-estimisation.ipynb @@ -11,18 +11,9 @@ }, { "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Note: you may need to restart the kernel to use updated packages.\n", - "Note: you may need to restart the kernel to use updated packages.\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%pip install --upgrade pip ipywidgets pybamm -q\n", "%pip install git+https://github.com/pybop-team/PyBOP.git@develop -q" @@ -37,7 +28,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -63,7 +54,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -80,7 +71,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -101,7 +92,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -129,34 +120,9 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "b81d2479a67e475cafce6cab6d366680", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "interactive(children=(FloatSlider(value=0.0, description='t', max=1.1333333333333333, step=0.01133333333333333…" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "<pybamm.plotting.quick_plot.QuickPlot at 0x126561bd0>" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "sim.plot()" ] @@ -165,12 +131,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now, let's corrupt the synthetic data with 5mV of gaussian noise centered around zero," + "Now, let's corrupt the synthetic data with 1mV of gaussian noise centered around zero," ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -194,7 +160,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -202,7 +168,7 @@ "dataset = [\n", " pybop.Dataset(\"Time [s]\", synthetic_sol[\"Time [s]\"].data),\n", " pybop.Dataset(\"Current function [A]\", synthetic_sol[\"Current [A]\"].data),\n", - " pybop.Dataset(\"Voltage [V]\", corrupt_V),\n", + " pybop.Dataset(\"Terminal voltage [V]\", corrupt_V),\n", "]" ] }, @@ -215,7 +181,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -237,40 +203,37 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We can now construct a cost function and define the fitting signal." + "We can now define the fitting signal, a problem (which combines the model with the dataset) and construct a cost function." ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Define the cost to optimise\n", - "cost = pybop.RMSE()\n", - "signal = \"Voltage [V]\"" + "signal = \"Terminal voltage [V]\"\n", + "problem = pybop.Problem(model, parameters, dataset, signal=signal, init_soc=0.98)\n", + "cost = pybop.RootMeanSquaredError(problem)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Let's construct PyBOP's optimisation class. This class provides the methods needed to fit the forward model." + "Let's construct PyBOP's optimisation class. This class provides the methods needed to fit the forward model. For this example, we use a root-mean square cost function with the BOBYQA algorithm implemented in NLOpt." ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ "parameterisation = pybop.Optimisation(\n", " cost=cost,\n", - " model=model,\n", - " optimiser=pybop.NLoptOptimize(n_param=len(parameters)),\n", - " parameters=parameters,\n", - " dataset=dataset,\n", - " signal=signal,\n", + " optimiser=pybop.NLoptOptimize,\n", ")" ] }, @@ -278,62 +241,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Finally, we run the estimation algorithm. For this example, we use a root-mean square cost function with the BOBYQA algorithm implemented in NLOpt" + "Finally, we run the estimation algorithm." ] }, { "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Cost: 0.0014306419900053451\n", - "Cost: 0.001878140952546479\n", - "Cost: 0.0056853760898525705\n", - "Cost: 0.0011144296137402825\n", - "Cost: 0.004234408585704868\n", - "Cost: 0.002260880733148505\n", - "Cost: 0.0010374243859739255\n", - "Cost: 0.0011340799888696297\n", - "Cost: 0.001093836134793644\n", - "Cost: 0.001042723321241934\n", - "Cost: 0.0010266172137603305\n", - "Cost: 0.00103588203364289\n", - "Cost: 0.001007039288536067\n", - "Cost: 0.000990040153496016\n", - "Cost: 0.0009820913602296417\n", - "Cost: 0.0009795434928262323\n", - "Cost: 0.0009945581830178092\n", - "Cost: 0.0009921144772808324\n", - "Cost: 0.0009825846380214938\n", - "Cost: 0.0009915338481534652\n", - "Cost: 0.0009789337894256292\n", - "Cost: 0.0009823901578605396\n", - "Cost: 0.0009786983892344486\n", - "Cost: 0.0009785339841692688\n", - "Cost: 0.000978719434079295\n", - "Cost: 0.000978406378769787\n", - "Cost: 0.0009784181875287846\n", - "Cost: 0.0009792572769492622\n", - "Cost: 0.0009789609220288331\n", - "Cost: 0.000979061722139482\n", - "Cost: 0.0009784215735618952\n", - "Cost: 0.0009790240608910446\n", - "Cost: 0.0009784386249667666\n", - "Cost: 0.0009784283248914902\n", - "Cost: 0.0009784142223954373\n", - "Cost: 0.0009791106518699038\n", - "Cost: 0.0009784113851583095\n", - "Cost: 0.0009791097832152831\n", - "Cost: 0.0009784096923936012\n" - ] - } - ], - "source": [ - "x, output, final_cost, num_evals = parameterisation.run()" + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "x, final_cost = parameterisation.run()" ] }, { @@ -345,20 +262,9 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([0.50138974, 0.63221165])" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "x" ] @@ -374,12 +280,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "First, run SPM forward model with the estimated parameters," + "First, run the SPM forward model with the estimated parameters," ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -401,30 +307,9 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "<matplotlib.legend.Legend at 0x12721faf0>" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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qFEjsmXLhqIorFy5Mt7zqqry5ZdfkjVrVjw8PKhVqxanTp2KV+bOnTu0bt0ab29v0qVLR4cOHbh//368MocOHaJq1aq4u7uTM2dOvvrqq6TetRfu20cfffTEcaxXr168Ms66b0FBQbzxxhukTZuWTJky0bRpU06cOBGvTGJ9DkNCQihTpgxubm7kz5+fefPmab5vNWrUeOLYdenSxen3LTg4mBIlSjgmxAsMDGTNmjWO5131mL3MvrnqMXuacePGOebYe8SVj108qkgWixYtUk0mkzpnzhz1yJEjaqdOndR06dKp169f1zq05xo2bJhatGhRNSwszPFz8+ZNx/NdunRRc+bMqW7cuFHdu3evWrFiRbVSpUqO561Wq1qsWDG1Vq1a6v79+9XVq1ervr6+6sCBA5N9X1avXq0OHjxYXb58uQqoK1asiPf8uHHjVB8fH3XlypXqwYMH1caNG6t58uRRo6OjHWXq1aunlixZUt25c6e6detWNX/+/GrLli0dz0dERKiZM2dWW7durR4+fFj95ZdfVA8PD3XWrFma7lu7du3UevXqxTuOd+7ciVfGWfetbt266ty5c9XDhw+rBw4cUBs0aKDmypVLvX//vqNMYnwOz549q3p6eqp9+vRRjx49qk6bNk3V6/Xq2rVrNd236tWrq506dYp37CIiIpx+337//Xd11apV6smTJ9UTJ06ogwYNUo1Go3r48GFVVV33mL3MvrnqMfuv3bt3q/7+/mqJEiXUnj17Oh535WP3OEmAkkn58uXV7t27O/622WxqtmzZ1KCgIA2jerFhw4apJUuWfOpz4eHhqtFoVJcuXep47NixYyqg7tixQ1XVuC9mnU6nXrt2zVEmODhY9fb2VmNjY5M09uf5b5Jgt9vVLFmyqBMmTHA8Fh4errq5uam//PKLqqqqevToURVQ9+zZ4yizZs0aVVEU9cqVK6qqquqMGTPU9OnTx9u3L774Qg0ICEjiPfrXsxKgJk2aPPM1rrJvqqqqN27cUAF18+bNqqom3ufw888/V4sWLRrvvZo3b67WrVs3qXfJ4b/7pqpxX6aPf/n8l6vsm6qqavr06dUffvghRR2zRx7tm6qmjGN27949tUCBAur69evj7U9KOnbSBJYMzGYz+/bto1atWo7HdDodtWrVYseOHRpG9nJOnTpFtmzZyJs3L61bt+bixYsA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", - "text/plain": [ - "<Figure size 640x480 with 1 Axes>" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "plt.plot(corrupt_V, label=\"Groundtruth\")\n", "plt.plot(optsol, label=\"Estimated\")\n", From 7047af7f8fb1a08f421d642dca219f87462f3dc8 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 17 Nov 2023 09:12:41 +0000 Subject: [PATCH 189/210] Turn off f_guessed for performance assertion --- tests/unit/test_parameterisations.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/unit/test_parameterisations.py b/tests/unit/test_parameterisations.py index 580fb0627..e102da3fe 100644 --- a/tests/unit/test_parameterisations.py +++ b/tests/unit/test_parameterisations.py @@ -110,13 +110,14 @@ def test_spme_multiple_optimisers(self, init_soc): parameterisation = pybop.Optimisation(cost=cost, optimiser=optimiser) if optimiser == pybop.CMAES: - parameterisation.set_max_iterations(100) parameterisation.set_f_guessed_tracking(True) + assert parameterisation._use_f_guessed is True - x, final_cost = parameterisation.run() + parameterisation.set_f_guessed_tracking(False) + parameterisation.set_max_iterations(100) + x, final_cost = parameterisation.run() assert parameterisation._iterations == 100 - assert parameterisation._use_f_guessed is True else: x, final_cost = parameterisation.run() From 8846725590dcae95167cfccb8c551d5e7e187520 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 17 Nov 2023 09:36:44 +0000 Subject: [PATCH 190/210] tighten parameter bounds --- tests/unit/test_parameterisations.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/test_parameterisations.py b/tests/unit/test_parameterisations.py index e102da3fe..e5ab70d79 100644 --- a/tests/unit/test_parameterisations.py +++ b/tests/unit/test_parameterisations.py @@ -155,7 +155,7 @@ def test_model_misparameterisation(self, init_soc): pybop.Parameter( "Negative electrode active material volume fraction", prior=pybop.Gaussian(0.5, 0.02), - bounds=[0.375, 0.625], + bounds=[0.45, 0.625], ), pybop.Parameter( "Positive electrode active material volume fraction", From 4604f11819d934061525777f9f599e2b69387cdb Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 17 Nov 2023 10:08:20 +0000 Subject: [PATCH 191/210] Updt. notebook name --- examples/notebooks/{rmse-estimisation.ipynb => spm_nlopt.ipynb} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename examples/notebooks/{rmse-estimisation.ipynb => spm_nlopt.ipynb} (100%) diff --git a/examples/notebooks/rmse-estimisation.ipynb b/examples/notebooks/spm_nlopt.ipynb similarity index 100% rename from examples/notebooks/rmse-estimisation.ipynb rename to examples/notebooks/spm_nlopt.ipynb From 7bc92d92dc934059ebf61532b3f0bd283f3625d3 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 17 Nov 2023 10:43:55 +0000 Subject: [PATCH 192/210] Split-model, add solved state --- examples/notebooks/spm_nlopt.ipynb | 1139 +++++++++++++++++++--------- 1 file changed, 791 insertions(+), 348 deletions(-) diff --git a/examples/notebooks/spm_nlopt.ipynb b/examples/notebooks/spm_nlopt.ipynb index 3b9b257fa..811575160 100644 --- a/examples/notebooks/spm_nlopt.ipynb +++ b/examples/notebooks/spm_nlopt.ipynb @@ -1,350 +1,793 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## A NMC/Gr parameterisation example using PyBOP\n", - "\n", - "This notebook introduces a synthetic re-parameterisation of the single-particle model with corrupted observations. To start, we import the PyBOP package for parameterisation and the PyBaMM package to generate the initial synethic data," - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%pip install --upgrade pip ipywidgets pybamm -q\n", - "%pip install git+https://github.com/pybop-team/PyBOP.git@develop -q" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, we import the added packages plus any additional dependencies," - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pybop\n", - "import pybamm\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Generate Synthetic Data" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We need to generate the synthetic data required for later reparameterisation. To do this we will run the PyBaMM forward model and store the generated data. This will be integrated into PyBOP in a future release for fast synthetic generation. For now, we define the PyBaMM model with a default parameter set," - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "synthetic_model = pybamm.lithium_ion.SPM()\n", - "params = synthetic_model.default_parameter_values" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can now modify individual parameters with the bespoke values and run the simulation." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "params.update(\n", - " {\n", - " \"Negative electrode active material volume fraction\": 0.52,\n", - " \"Positive electrode active material volume fraction\": 0.63,\n", - " }\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Define the experiment and run the forward model to capture the synthetic data." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "experiment = pybamm.Experiment(\n", - " [\n", - " (\n", - " \"Discharge at 1C for 15 minutes (1 second period)\",\n", - " \"Rest for 2 minutes (1 second period)\",\n", - " \"Charge at 1C for 15 minutes (1 second period)\",\n", - " \"Rest for 2 minutes (1 second period)\",\n", - " ),\n", - " ]\n", - " * 2\n", - ")\n", - "sim = pybamm.Simulation(synthetic_model, experiment=experiment, parameter_values=params)\n", - "synthetic_sol = sim.solve()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plot the synthetic data," - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sim.plot()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now, let's corrupt the synthetic data with 1mV of gaussian noise centered around zero," - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "corrupt_V = synthetic_sol[\"Terminal voltage [V]\"].data\n", - "corrupt_V += np.random.normal(0, 0.001, len(corrupt_V))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Identify the Parameters" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now, to blind fit the synthetic parameters we need to define the observation variables as well as update the forward model to be of PyBOP type (This composes PyBaMM's model class). For the observed voltage variable, we used the newly corrupted voltage array, " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "model = pybop.lithium_ion.SPM()\n", - "dataset = [\n", - " pybop.Dataset(\"Time [s]\", synthetic_sol[\"Time [s]\"].data),\n", - " pybop.Dataset(\"Current function [A]\", synthetic_sol[\"Current [A]\"].data),\n", - " pybop.Dataset(\"Terminal voltage [V]\", corrupt_V),\n", - "]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, we define the targeted forward model parameters for estimation. Furthermore, PyBOP provides functionality to define a prior for the parameters. The initial parameters values used in the estimiation will be randomly drawn from the prior distribution." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "parameters = [\n", - " pybop.Parameter(\n", - " \"Negative electrode active material volume fraction\",\n", - " prior=pybop.Gaussian(0.5, 0.02),\n", - " bounds=[0.375, 0.625],\n", - " ),\n", - " pybop.Parameter(\n", - " \"Positive electrode active material volume fraction\",\n", - " prior=pybop.Gaussian(0.65, 0.02),\n", - " bounds=[0.525, 0.75],\n", - " ),\n", - "]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can now define the fitting signal, a problem (which combines the model with the dataset) and construct a cost function." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Define the cost to optimise\n", - "signal = \"Terminal voltage [V]\"\n", - "problem = pybop.Problem(model, parameters, dataset, signal=signal, init_soc=0.98)\n", - "cost = pybop.RootMeanSquaredError(problem)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's construct PyBOP's optimisation class. This class provides the methods needed to fit the forward model. For this example, we use a root-mean square cost function with the BOBYQA algorithm implemented in NLOpt." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "parameterisation = pybop.Optimisation(\n", - " cost=cost,\n", - " optimiser=pybop.NLoptOptimize,\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally, we run the estimation algorithm." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x, final_cost = parameterisation.run()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's view the identified parameters:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Plotting" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "First, run the SPM forward model with the estimated parameters," - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "params.update(\n", - " {\n", - " \"Negative electrode active material volume fraction\": x[0],\n", - " \"Positive electrode active material volume fraction\": x[1],\n", - " }\n", - ")\n", - "optsol = sim.solve()[\"Terminal voltage [V]\"].data" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now, we plot the estimated forward model against the corrupted synthetic observation," - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "plt.plot(corrupt_V, label=\"Groundtruth\")\n", - "plt.plot(optsol, label=\"Estimated\")\n", - "plt.xlabel(\"Time (s)\")\n", - "plt.ylabel(\"Voltage (V)\")\n", - "plt.legend()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "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.12" - } - }, - "nbformat": 4, - "nbformat_minor": 4 + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "expmkveO04pw" + }, + "source": [ + "## A NMC/Gr parameterisation example using PyBOP\n", + "\n", + "This notebook introduces a synthetic re-parameterisation of the single-particle model with corrupted observations. To start, we import the PyBOP package for parameterisation and the PyBaMM package to generate the initial synethic data," + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "X87NUGPW04py", + "outputId": "0d785b07-7cff-4aeb-e60a-4ff5a669afbf" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.1/2.1 MB\u001b[0m \u001b[31m19.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m139.4/139.4 kB\u001b[0m \u001b[31m14.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m15.9/15.9 MB\u001b[0m \u001b[31m78.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.3/2.3 MB\u001b[0m \u001b[31m79.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m44.9/44.9 kB\u001b[0m \u001b[31m5.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m160.1/160.1 kB\u001b[0m \u001b[31m17.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m75.3/75.3 MB\u001b[0m \u001b[31m8.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m561.4/561.4 kB\u001b[0m \u001b[31m27.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.6/1.6 MB\u001b[0m \u001b[31m51.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25h Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m423.7/423.7 kB\u001b[0m \u001b[31m6.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m260.7/260.7 kB\u001b[0m \u001b[31m15.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m284.9/284.9 kB\u001b[0m \u001b[31m15.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25h Building wheel for pybop (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", + "\u001b[0m" + ] + } + ], + "source": [ + "%pip install --upgrade pip ipywidgets pybamm -q\n", + "%pip install git+https://github.com/pybop-team/PyBOP.git@develop -q" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "jAvD5fk104p0" + }, + "source": [ + "Next, we import the added packages plus any additional dependencies," + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "id": "SQdt4brD04p1" + }, + "outputs": [], + "source": [ + "import pybop\n", + "import pybamm\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5XU-dMtU04p2" + }, + "source": [ + "## Generate Synthetic Data" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "MlBYO-xK04p3" + }, + "source": [ + "We need to generate the synthetic data required for later reparameterisation. To do this we will run the PyBaMM forward model and store the generated data. This will be integrated into PyBOP in a future release for fast synthetic generation. For now, we define the PyBaMM model with a default parameter set," + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "id": "sBasxv8U04p3" + }, + "outputs": [], + "source": [ + "synthetic_model = pybamm.lithium_ion.SPM()\n", + "params = synthetic_model.default_parameter_values" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "wRDiC_dj04p5" + }, + "source": [ + "We can now modify individual parameters with the bespoke values and run the simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "id": "JgN4C76x04p6" + }, + "outputs": [], + "source": [ + "params.update(\n", + " {\n", + " \"Negative electrode active material volume fraction\": 0.52,\n", + " \"Positive electrode active material volume fraction\": 0.63,\n", + " }\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "KWA5Fmbv04p7" + }, + "source": [ + "Define the experiment and run the forward model to capture the synthetic data." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "id": "LvQ7eXGf04p7" + }, + "outputs": [], + "source": [ + "experiment = pybamm.Experiment(\n", + " [\n", + " (\n", + " \"Discharge at 1C for 15 minutes (1 second period)\",\n", + " \"Rest for 2 minutes (1 second period)\",\n", + " \"Charge at 1C for 15 minutes (1 second period)\",\n", + " \"Rest for 2 minutes (1 second period)\",\n", + " ),\n", + " ]\n", + " * 2\n", + ")\n", + "sim = pybamm.Simulation(synthetic_model, experiment=experiment, parameter_values=params)\n", + "synthetic_sol = sim.solve()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "u6QbgzJD04p-" + }, + "source": [ + "Plot the synthetic data," + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 602, + "referenced_widgets": [ + "8d003c14da5f4fa68284b28c15cee6e6", + "aef2fa7adcc14ad0854b73d5910ae3b4", + "7d46516469314b88be3500e2afcafcf6", + "423bffea3a1c42b49a9ad71218e5811b", + "06f2374f91c8455bb63252092512f2ed", + "56ff19291e464d63b23e63b8e2ac9ea3", + "646a8670cb204a31bb56bc2380898093" + ] + }, + "id": "_F-7UPUl04p-", + "outputId": "cf548842-64ae-4389-b16d-d3cf3239ce8f" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "interactive(children=(FloatSlider(value=0.0, description='t', max=1.1333333333333333, step=0.01133333333333333…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "8d003c14da5f4fa68284b28c15cee6e6" + } + }, + "metadata": {} + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "<pybamm.plotting.quick_plot.QuickPlot at 0x7d7b2d770eb0>" + ] + }, + "metadata": {}, + "execution_count": 25 + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "<Figure size 1500x700 with 8 Axes>" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAABdEAAAKxCAYAAAC8BuXeAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdeVxU1f8/8NeADKsDorIlAqYhmIDiRxzLHRnQj2n5KRdS3D8aaEhp8ckItcJc0ST5mAtW8nGpNFMDCUNccENHccMN0xIwU0BQAeH8/vDH/ToybIoMwuv5eNxH3Xve9973PTNzOZ65c45MCCFARERERERERERERETl6Ok6ASIiIiIiIiIiIiKi+oqd6EREREREREREREREFWAnOhERERERERERERFRBdiJTkRERERERERERERUAXaiExERERERERERERFVgJ3oREREREREREREREQVYCc6EREREREREREREVEF2IlORERERERERERERFQBdqITEREREREREREREVWAnehPyNHREZGRkbpOo1ZduXIFMpkMarW6WvFjxozBkCFDnmlOT2r//v3o2LEjDAwM6m2OpEkmk2Hr1q3P9Bzh4eGQyWSQyWR18vmti2uqrrq+9sasPr3ujwsPD4eHh4eu06Aq1EUbIyYmRronBAcHP9NzAfWr3VTX1061JykpCTKZDDk5OZXG1af3W21hO510ie30Z4vtdKL6o+zvrUwme6J/N5Xta2FhUeu5ke7Vu070MWPGQCaTYd68eRrbt27dCplMVuf5xMTEaH3zHzlyBJMmTarzfGqLtoa1vb09MjMz8fLLL+smqVoUEhICDw8PZGRkICYmRtfpPNcq+gw8qYo68TIzM+Hn51dr56lIhw4dkJmZ+Vx/fh+Xnp6OPn36wNraGkZGRmjTpg1mzZqF4uJiKeb9999HZmYmWrVqpcNMn39lf6MeX3x9fZ/ZOXX5j7za/vw/76rbgVddum5jKBQKZGZmYu7cuc/8XHXl77//hq+vL+zs7GBoaAh7e3sEBQUhLy9Pihk2bBgyMzOhVCp1mGnD9eh9Ui6Xo23btpgzZw4ePHjw1Mfu3r07MjMzYW5uDkD3n6Fnhe10qi620+s/ttOpIcrKysLUqVPRpk0bqb01aNAgJCYm6jq1StXk31W//vqr1uv5448/IJfLK/x7nJmZyS/DGrAmuk5AGyMjI3zxxRf497//jWbNmuk6Ha1atmyp6xSeSElJSYVfRujr68PGxqaOM6pdxcXFMDAwwKVLlzB58mQ2ROpQUVER5HL5E+9fV++9Jk2aPPfv88cZGBhg9OjR6Ny5MywsLHDixAlMnDgRpaWl+PzzzwEAZmZmMDMzg76+vo6zff75+vpi7dq1GtsMDQ11lM1DT/v5o9r1tK9HXbUxZDJZg7sf6unpYfDgwfj000/RsmVLXLx4EYGBgbh16xZiY2MBAMbGxjA2NuZn5hkqu08WFhZi586dCAwMhIGBAUJDQ5/quHK5vFrvWbbT6ye203WH7XTdYTudGporV67glVdegYWFBRYsWICOHTuiuLgY8fHxCAwMxLlz557ouEIIlJSUoEkTzW5KXf07p3nz5mjevHm57TExMXjrrbeQnJyMQ4cOwcvLS6PcxsZG+rKfGp569yQ6AHh7e8PGxgYRERGVxu3btw89evSAsbEx7O3tMW3aNBQUFEjlmZmZGDhwIIyNjeHk5ITY2NhyP+9cvHgxOnbsCFNTU9jb2+Odd95Bfn4+gIdPnI0dOxa5ubnSEzXh4eEANH8mOnLkSAwbNkwjt+LiYrRo0QLffPMNAKC0tBQRERFwcnKCsbEx3N3d8f3331d6fY6Ojpg7dy5GjBgBU1NTvPDCC4iKitKIqSx/4P+eTti2bRtcXV1haGiIcePGYd26dfjpp5+k60pKStL6M9HTp0/jn//8JxQKBZo2bYoePXrg0qVLWvN9kmv86quv0K5dOxgZGcHa2hr/+te/NK7/8W/wPDw8pNcAeNgBsGLFCrz22mswNTXFxIkTIZPJ8Pfff2PcuHGQyWSIiYlBSUkJxo8fL+Xm7OyMpUuXlstnzZo16NChAwwNDWFra4ugoCCpLCcnBxMmTEDLli2hUCjQt29fnDhxotLr++OPPzBixAhYWlrC1NQUXbp0waFDh6TyFStW4MUXX4RcLoezszO+/fZbjf1lMhlWrVqF119/HSYmJmjXrh22bdumEVPVa7Rq1Sq4uLjAyMgI7du3x1dffSWVlb3mP/74I/r06QMTExO4u7sjJSUFQNWfgblz52L06NFQKBTSEyMffPABXnrpJZiYmKBNmzb4+OOPpSctYmJiMHv2bJw4cUI6XtkTSI9/K5yWloa+ffvC2NgYzZs3x6RJkzTe22VPaS1cuBC2trZo3rw5AgMDNZ7qqC6ZTIb//ve/+Oc//wkTExO4uLggJSUFFy9eRO/evWFqaoru3buXe+9X9fpVpXfv3pg6dSqCg4PRrFkzWFtb4+uvv0ZBQQHGjh2Lpk2bom3btvjll18qPU6bNm0wduxYuLu7w8HBAa+99hr8/f2xd+/eGtcFVc3Q0BA2NjYaS2Vf+F67dg1vvfUWLCwsYGlpicGDB+PKlSsaMRXdexwdHQEAr7/+OmQymbRe9qTYqlWr4OTkBCMjIwDA1atXMXjwYJiZmUGhUOCtt95Cdna21rySk5NhYGCArKwsje3BwcHo0aNHpZ//wsJCvP/++3jhhRdgamoKLy8vJCUlVVpvOTk5+Pe//y09ifXyyy9j+/btUvkPP/wg1YGjoyMWLVqksb+joyM+//xzjBs3Dk2bNkXr1q2xcuVKjZiq7rk//fQTOnfuLD0JNnv2bI2nYyu75165cgV9+vQBADRr1gwymQxjxowB8PCzHBQUhODgYLRo0QIqlQpA7bQxgKpf17L3w7fffgtHR0eYm5tj+PDhuHPnTqWviTaOjo749NNPMXr0aJiZmcHBwQHbtm3DX3/9JeXg5uaGo0ePauxX1etXlbJ7+ueffw5ra2tYWFhITy/PmDEDlpaWaNWqVbkvsB7XrFkzTJkyBV26dIGDgwP69euHd955h/fDOlZ2n3RwcMCUKVPg7e0tfZZu376N0aNHo1mzZjAxMYGfnx8uXLgg7fv7779j0KBBaNasGUxNTdGhQwfs3LkTgOavQdhOZzud7XS209lOJ6p777zzDmQyGQ4fPoyhQ4fipZdeQocOHRASEoKDBw8C0D4EWU5OjvQ3Dfi/v+m//PILPD09YWhoiH379lXYrj516hT8/PxgZmYGa2trjBo1Cjdv3pSO37t3b0ybNg0zZ86EpaUlbGxsNP4mVfTvqpoQQmDt2rUYNWoURo4cidWrV9f4GPScE/VMQECAGDx4sPjxxx+FkZGRuHbtmhBCiC1btohH07148aIwNTUVS5YsEefPnxf79+8XnTp1EmPGjJFivL29hYeHhzh48KBITU0VvXr1EsbGxmLJkiVSzJIlS8Tu3btFRkaGSExMFM7OzmLKlClCCCEKCwtFZGSkUCgUIjMzU2RmZoo7d+4IIYRwcHCQjrN9+3ZhbGwslQkhxM8//yyMjY1FXl6eEEKITz/9VLRv317ExcWJS5cuibVr1wpDQ0ORlJRUYV04ODiIpk2bioiICJGeni6WLVsm9PX1xa5du6qVvxBCrF27VhgYGIju3buL/fv3i3Pnzonc3Fzx1ltvCV9fX+m6CgsLRUZGhgAgjh8/LoQQ4o8//hCWlpbijTfeEEeOHBHp6elizZo14ty5cxqvVZmaXuORI0eEvr6+iI2NFVeuXBHHjh0TS5cu1bj+R18rIYRwd3cXn3zyibQOQFhZWYk1a9aIS5cuiStXrojMzEyhUChEZGSkyMzMFHfv3hVFRUUiLCxMHDlyRFy+fFl89913wsTERGzcuFE61ldffSWMjIxEZGSkSE9PF4cPH9Y4v7e3txg0aJA4cuSIOH/+vHjvvfdE8+bNxd9//631+u7cuSPatGkjevToIfbu3SsuXLggNm7cKA4cOCCEEOLHH38UBgYGIioqSqSnp4tFixYJfX19sXv3bo3ra9WqlYiNjRUXLlwQ06ZNE2ZmZtI5q3qNvvvuO2Frayt++OEHcfnyZfHDDz8IS0tLERMTI4QQ0mvevn17sX37dpGeni7+9a9/CQcHB1FcXFzlZ0ChUIiFCxeKixcviosXLwohhJg7d67Yv3+/yMjIENu2bRPW1tbiiy++EEIIcffuXfHee++JDh06SMe7e/eudK1btmwRQgiRn58vbG1txRtvvCHS0tJEYmKicHJyEgEBAVLdBAQECIVCISZPnizOnj0rfv75Z2FiYiJWrlyp9fUQQohPPvlEuLu7l9sOQLzwwgti48aNIj09XQwZMkQ4OjqKvn37iri4OHHmzBnRrVs34evrK+1T3dev7Jq06dWrl2jatKmYO3euOH/+vJg7d67Q19cXfn5+YuXKleL8+fNiypQponnz5qKgoKDC4zzuwoULwsXFRXz00UflyrR9rqj6Hr/vafPo615UVCRcXFzEuHHjxMmTJ8WZM2fEyJEjhbOzsygsLBRCVH7vuXHjhgAg1q5dKzIzM8WNGzeEEA/fy6ampsLX11ccO3ZMnDhxQpSUlAgPDw/x6quviqNHj4qDBw8KT09P0atXLym3xz8DL730kpg/f760XlRUJFq0aCHWrFlT6ed/woQJonv37iI5OVlcvHhRLFiwQBgaGorz589rrZOSkhLRrVs30aFDB7Fr1y5x6dIl8fPPP4udO3cKIYQ4evSo0NPTE3PmzBHp6eli7dq1wtjYWKxdu1Y6hoODg7C0tBRRUVHiwoULIiIiQujp6Un3u6ruucnJyUKhUIiYmBhx6dIlsWvXLuHo6CjCw8M1XruK7rkPHjwQP/zwgwAg0tPTRWZmpsjJyRFCPPwsm5mZiRkzZohz585JOdVGG6O6r6uZmZl0z0xOThY2NjbiP//5TwXv0oftA3Nz83Lby+o5OjpaugcpFArh6+srNm3aJN0jXVxcRGlpaY1ev8ruPQEBAaJp06YiMDBQnDt3TqxevVoAECqVSnz22WfSPdLAwEBqG1bHn3/+KXr16iX8/f3LlfXq1Uu8++671T4WVY+2++Rrr70mOnfuLP2/i4uLSE5OFmq1WqhUKtG2bVtRVFQkhBBi4MCBon///uLkyZPSvWLPnj1CCCF+++03AUDcvn2b7XS209lOZzud7XSiOvb3338LmUwmPv/880rjHv+bJYQQt2/fFgDEb7/9JoT4v7/pbm5uYteuXeLixYvi77//1tquvn37tmjZsqUIDQ0VZ8+eFceOHRP9+/cXffr0kY7fq1cvoVAoRHh4uDh//rxYt26dkMlk0t/liv5dVZ3cyyQmJgobGxvx4MEDkZaWJpo2bSry8/PLxVXUzqbnX73tRBdCiG7duolx48YJIcp3oo8fP15MmjRJY9+9e/cKPT09ce/ePXH27FkBQBw5ckQqv3DhggBQ6R+mzZs3i+bNm0vrlf0js+w4xcXFokWLFuKbb76RykeMGCGGDRsmhBDi/v37wsTERGqUPXoNI0aMqDAXBwcHjcaAEEIMGzZM+Pn51Sh/AEKtVmvEafsHzuM3i9DQUOHk5CT9o+Zxjx7jSa7xhx9+EAqFQvoHzOOq2zgPDg4ut6+5ubnGP961CQwMFEOHDpXW7ezstDZmhHj43lIoFOL+/fsa21988UXx3//+V+s+//3vf0XTpk0rbLx3795dTJw4UWPbm2++KQYMGCCtAxCzZs2S1vPz8wUA8csvvwghqn6NXnzxRREbG6uxbe7cuUKpVAoh/u81X7VqlVR++vRpAUCcPXtWCFH5Z2DIkCFaz/uoBQsWCE9PT2m9sgZyWUN25cqVolmzZhp/kHbs2CH09PREVlaWEOLh+8/BwUE8ePBAinnzzTelz502lZ370XpOSUkRAMTq1aulbf/73/+EkZGRtF7d16+qxvmrr74qrT948ECYmpqKUaNGSdsyMzMFAJGSklLhccoolUphaGgoAIhJkyaJkpKScjFsnD+dgIAAoa+vL0xNTTWWzz77TIp59HX/9ttvhbOzs9TZKMTDzlNjY2MRHx8vhKj83vP48cp88sknwsDAQKPxt2vXLqGvry+uXr0qbSv7PB8+fFja79HPwBdffCFcXFyk9R9++EGYmZlJnz1tn//ff/9d6Ovriz///FNje79+/URoaKjWa4iPjxd6enoiPT1da/nIkSNF//79NbbNmDFDuLq6SusODg7i7bffltZLS0uFlZWVWLFihRCi6ntuv379yjX4v/32W2FrayutV3XPfbQD71G9evUSnTp10nreRz1JG6O6r6uJiYnG39MZM2YILy+vCnOp7NyP1nPZPejjjz+WtpXdIzMzM4UQ1X/9qupEd3Bw0LhvOTs7ix49ekjrZffI//3vfxUep8zw4cOFsbGxACAGDRok7t27Vy6GnejPxqPtw9LSUpGQkCAMDQ3F+++/L86fPy8AiP3790vxN2/eFMbGxmLTpk1CCCE6duyo8eXWox7/DLKdzna6EGyns53OdjpRXTl06JAAIH788cdK42rSib5161aNfbW1q+fOnSt8fHw0tl27dk16uKVsv0c/s0II8Y9//EN88MEH0npVn/uKci8zcuRIjb9r7u7uWv+esRO94aqXw7mU+eKLL7Bu3TqcPXu2XNmJEycQExMjjR9mZmYGlUqF0tJSZGRkID09HU2aNEHnzp2lfdq2bVvuJ/e//vor+vXrhxdeeAFNmzbFqFGj8Pfff+Pu3bvVzrNJkyZ46623sH79egBAQUEBfvrpJ/j7+wMALl68iLt376J///4a+X7zzTcV/uSyzOOTXimVSo36qE7+crkcbm5u1b6eMmq1Gj169ICBgUGVsU9yjf3794eDgwPatGmDUaNGYf369TWq9zJdunSpVlxUVBQ8PT3RsmVLmJmZYeXKlbh69SoA4MaNG7h+/Tr69eundd8TJ04gPz8fzZs317i+jIyMCq9PrVajU6dOsLS01Fp+9uxZvPLKKxrbXnnllXLv90dfO1NTUygUCty4cUM6R0WvUUFBAS5duoTx48dr5Pzpp5+Wy/nRc9ja2kp1UhVtdb9x40a88sorsLGxgZmZGWbNmiXVc3WdPXsW7u7uMDU1lba98sorKC0tRXp6urStQ4cOGmMH2traVitvbR6t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9x3y8vIejuMOoGXLltDX18fPP/+M7OxsdOvWDUZGRkhISMDnn3+O999/XzrH5MmTsXz5csycORPjxo3D7t27sWnTJuzYsUOKCQkJQUBAALp06YKuXbsiMjJSo1OGiIjqh2HDhuGvv/5CWFgYsrKy4OHhgbi4OGlei6tXr0JP7/+exezevTtiY2Mxa9Ys/Oc//0G7du2wdetWvPzyy7q6BGpohNB1BkQSdqITETUwvXv3hqiksSGTyTBnzhyNzuvHWVpaIjY2ttLzuLm5Ye/evRWWjxkzBmPGjNHY5uDggJ07d1Z63N69e+P48eOVxhARUdVu3LiB0aNHIzMzE+bm5nBzc0N8fDz69++PpKQkHDp0CADQtm1bjf0yMjLg6OgIAwMDREVFYfr06RBCoG3btli8eDEmTpwoxVbny8+qOmWIiKj+CAoKqvBJ8qSkpHLb3nzzTbz55pvPOCtiZzI9tcb6HqrF62YnOhERERFRA7R69eoKy6r6whUAfH194evrW+V5qvPlZ2WdMkRERERE9R3HRCciIiIiIiIiIp2oalLrRk0m03UG9QPr4cmx7h6qhXpgJzoREREREREREemEXC7XdQpERFViJzoRERERERERERERUQXYiU5ERERERERERDpRWlqq6xSIiKrETnQiIiIiIiIiItKJe/fu6TqF+q+KycAbrMZ63c9CY63LWrxudqITEREREREREREREVWAnehERERERERERET1jUym6wzqB9bDk2PdPVQL9cBOdCIiIiIiIiIiIiKiCrATnYiIiIiIiIiIiIioAuxEJyIiIiIiIiIiIiKqADvRiYiIiIiIiIiIqH4RQtcZEEnYiU5ERERERERERDrRpEkTXadQ/7EzmZ5WY30P1eJ1sxOdiIiIiIiIiIh0wtDQUNcpEBFViZ3oRERERERERERE9Y1MpusM6gfWw5Nj3T1UC/XATnQiIiIiIiIiItIJ0ViHmSCi5wo70YmIiIiIiIiISCfu3r2r6xSIiKrETnQiIiIiIiIiIiKqX/grBapH2IlORERERERERERUX7EzmZ5WY30P1eJ1sxOdiIiIiKgBWrFiBdzc3KBQKKBQKKBUKvHLL78AAG7duoWpU6fC2dkZxsbGaN26NaZNm4bc3FyNY1y9ehUDBw6EiYkJrKysMGPGDDx48EAjJikpCZ07d4ahoSHatm2LmJiY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Rb1D5ERENU+l1kQvKCjAkSNH8P7778PR0RFNmjSBra2tQsmXmJgY5ObmwsHBQZxnaWmJZs2aITo6GoC8HleHDh1gbGwstnF0dERGRgauX78utnm9j8I2hX0Uh/W3iIiIiIiIiKg+MDIygqWlZamThoYG7OzskJaWhpiYGHHdyMhIFBQUwNbWtti+586diytXriAuLk6cAHlpxm3btlXH7tUPEomyI6gZeBzeHo+dXCUch0pNoqekpCAzMxNLly6Fk5MTfv/9dwwbNgzDhw/H8ePHAchrbWloaBT5tNLY2FistZWUlKSQQC9cXristDYZGRl4+fJlsfGx/hYRERERERER0f9YWVnByckJXl5eOH/+PE6fPg1vb2+MGTMGpqamAIBHjx7B0tIS58+fBwDIZDK0b99eYQKAZs2aoUWLFhXavopKpaamqC6pryVIqEaqcDmX0hQUFAAAhg4dCl9fXwBAp06dcObMGQQFBaF3796VubkKY/0tIiIiIiIiIiJFu3btgre3N/r37w8VFRWMGDEC69atE5fn5uYiPj4eL168qPRta2lpVXqfRESVrVKT6I0bN4aamhratm2rML+wXjkg/7QyJycHaWlpClejJycni7W2ZDKZ+Onm68sLlxX+LJz3ehs9PT0OwERERERERERE5WRoaIiQkJASl5ubm0Mo46rgspYTEdVmlfqdGQ0NDXTr1g3x8fEK82/duoXmzZsDAGxsbKCuro6IiAhxeXx8PB48eAA7OzsAgJ2dHa5evapwY4vw8HDo6emJCXo7OzuFPgrbFPZBRERERERERERERPSuKnwlemZmJu7cuSM+v3fvHuLi4mBoaIhmzZph9uzZGD16NHr16oW+ffvi6NGjOHTokHhnZn19fXh6esLPzw+GhobQ09PDtGnTYGdnhx49egAABgwYgLZt22L8+PFYvnw5kpKS8OWXX2Lq1KliOZbJkydjw4YN+PzzzzFhwgRERkZi7969OHLkSCUcFiIiIiIiIiIiqmovXryAnp6essOo2XiVP72r+vo7VIn7XeEk+sWLF9G3b1/xuZ+fHwDAzc0NwcHBGDZsGIKCghAYGIjp06fDwsIC+/btQ8+ePcV1Vq9eLdbYys7OhqOjI7799ltxuaqqKg4fPowpU6bAzs4O2tracHNzw1dffSW2adGiBY4cOQJfX1+sXbsWTZs2xfff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6h6O7UREVJIuXbrg+vXrMDc3R+vWrRUmbW1tZYdHdRCT6FSv5OTk4JNPPsHo0aOxePFiTJw4scJXlMTHx+PVq1cwNTUV50VHR+PRo0cKJ+NERFQ9OLYTEdU9HNuJiKg0U6dORWpqKsaOHYsLFy4gISEBYWFh8PDwQH5+vrLDozqISXSqV+bNm4f09HSsW7cOc+bMwfvvv48JEyZUqI+4uDgAwPr163H79m389ttvcHV1BSA/2SciourFsZ2IqO7h2E5ERKUxNTXF6dOnkZ+fjwEDBqBDhw7w8fGBgYEBVFSY7qTKx5roVG9ERUVhzZo1OHbsGPT09AAAO3fuhLW1NTZt2oQpU6aUq5+4uDg4Ojri7t276NChA9q2bYtFixZhypQpWLduHXbu3FmVu0FERK/h2E5EVPdwbCciqhvc3d3h7u5eZH5wcLDC86ioqCJtiivjJQiCwvM2bdrg559/focIS95W4QexRIWYRKd6o0+fPsjNzVWYZ25ujvT09Ar1c/nyZXTr1g3/+c9/FOa/fsOit30DICKiiuHYTkRU93BsJyKiqpKeng4dHR1MnTq12JuSlkRHRwd5eXnQ1NSswuioJuP3G4jK8O2330JHRwdXr14FID8Z79ChQ5Vsa/LkydDR0amSvomI6H84thMR1T0c24mIqDQjRozA7du3ERcXh9mzZ1do3bi4OFy7dg2xsbFVFB3VdBKBH6kTlejRo0d4+fIlAKBZs2ZITU2FiYkJrl+/jrZt21b69lJSUpCRkQEAMDEx4R2liYiqAMd2IqK6h2M7ERERVSUm0YmIiIiIiIiIiIiISsByLkREREREREREREREJWASnYiIiIiIiIiIiIioBEyiExERERERERERERGVgEl0IiIiIiIiIiIiIqISMIlORERERERERERERFQCJtGJiIiIiIiIiIiIiErAJDoRERERERERERERUQmYRCciIiIiIiIiIiIiKgGT6EREREREREREREREJWASnYiIiIiIiIiIiIioBEyiExERERERERERERGVgEl0IiIiIiIiIiIiIqISMIlORERERERERERERFQCJtGJiIiIiIiIiIiIiErAJDoRERERERERERERUQmYRCciIiIiIiIiIiIiKgGT6FQh5ubmWLNmjVJjCA4OhoGBgVJjqKiacNyUISAgAJ06darQOhKJBPv37y9xeZ8+fSCRSCCRSBAXF1ehvt3d3cV1S9sGUV1Xk/8G3mbcqM/e5j2xrPekdxkrAwICxHXr4/seUVWIioqCRCJBWlpaqe1qwvkmz9NrD56nE5Gy1ORx9/79++JY9Db/kxSuW9veC6l8mESvIQpPGpYuXaowf//+/ZBIJNUeT0knwBcuXMCkSZOqPZ6qVBtP9t9Wnz594OPjUyV9F3fCO2vWLERERFT6try8vJCYmIj27dsjJiYGEokEZ8+eLbZt//79MXz4cADA2rVrkZiYWOnxENUkr/8T+vrk5ORUZdtU5j+8NW0Md3d3h7Ozc5X0Xdw/HKNHj8atW7cqfVtOTk5ITEzEwIEDkZycDHV1dezevbvYtp6enujSpQsA+bifmJiIpk2bVnpMRDXZ62OvhoYGWrduja+++gp5eXnv3Le9vT0SExOhr68PgOfpdRXP03meTlTTDRkypMT/KU6ePAmJRIIrV65UuN+a+OHZH3/8IY6R06ZNg5WVVbHtHjx4AFVVVRw8eBAAkJiYWGM/IKB3xyR6DaKpqYlly5bh2bNnyg6lREZGRmjQoIGyw1CKnJwcZYdQ6+jo6KBRo0aV3m+DBg0gk8mgpqYGGxsbWFtbY+vWrUXa3b9/H8eOHYOnpycAQF9fHzKZrNLjIappChOgr08//vijUmPiGFo1tLS00KRJk0rvVyqVQiaTQSqVwtjYGIMHDy52nM3KysLevXvFcVZHRwcymQyqqqqVHhNRTVc49t6+fRszZ85EQEAAvvnmm3fuV0NDAzKZrMwLa3ieThXB83QiqihPT0+Eh4fj77//LrJs27Zt6Nq1Kzp27KiEyCpfo0aNxDHS09MTN2/exJkzZ4q0Cw4ORpMmTTBo0CAAgEwmEz/0prqHSfQaxMHBATKZDIGBgaW2O3XqFD788ENoaWnBzMwM06dPR1ZWlrg8MTERgwcPhpaWFlq0aIGQkJAiV6+tWrUKHTp0gLa2NszMzPDZZ58hMzMTgPwrox4eHkhPTxevqAkICACgeBXcuHHjMHr0aIXYcnNz0bhxY+zYsQMAUFBQgMDAQLRo0QJaWlqwtrbGTz/9VOr+ZWdnY9asWXjvvfegra0NW1tbREVFlbrOgQMH0KVLF2hqaqJly5ZYtGiRwpU/aWlp+PTTT2FsbAxNTU20b98ehw8fLnNfFy9eDFdXV+jp6YlX9uzbtw/t2rWDVCqFubk5Vq5cqRBLSkoKhgwZIh7/Xbt2FYk3LS0NEydOhJGREfT09NCvXz9cvny5xP0r/ErR7t27YW9vL+7D8ePHFdodP34c3bt3h1QqhYmJCebOnSseB3d3dxw/fhxr164V9/X+/fsAgGvXrmHgwIHQ0dGBsbExxo8fjydPnoj99unTB9OnT8fnn38OQ0NDyGQy8TgVHisAGDZsGCQSifj8za+JXrhwAR999BEaN24MfX199O7dG5cuXSpxv8vL09MTe/bswYsXLxTmBwcHw8TEpEqvwCWqiQoToK9PDRs2LLH9w4cPMWrUKBgYGMDQ0BBDhw4Vx4dCW7duFcc+ExMTeHt7Ayj77//7779HixYtoKmpCUB+tcbQoUOho6MDPT09jBo1CsnJycXGdeLECairqyMpKUlhvo+PDz788MNSx/C3eS+RSCTYtGkTBg4cCC0tLbRs2bLIe9bVq1fRr18/aGlpoVGjRpg0aZL4/hkQEIDt27fjwIEDYjyF2yzrGBdewb5ixQqYmJigUaNGmDp1KnJzcwHIx+G//voLvr6+Yt9A0as0ExISMHToUBgbG0NHRwfdunXDH3/8Uep+l4enpyciIiLw4MEDhfmhoaHIy8uDi4vLO2+DqLYrHHubN2+OKVOmwMHBQbwy7dmzZ3B1dUXDhg3RoEEDDBw4ELdv3xbX/euvvzBkyBA0bNgQ2traaNeuHX799VcAiuVceJ7+v33lebocz9OJqLr861//gpGREYKDgxXmZ2ZmIjQ0VPxQrKyx+HUljVHlOactT+6romN6cTp16oQuXboU+UBQEAQEBwfDzc0NampqFeqTaicm0WsQVVVVLFmyBOvXry/2kz1APpA4OTlhxIgRuHLlCvbs2YNTp06JyQwAcHV1xePHjxEVFYV9+/Zh8+bNSElJUehHRUUF69atw/Xr17F9+3ZERkbi888/ByD/yuiaNWugp6cnXsE4a9asIrG4uLjg0KFDYvIAAMLCwvDixQsMGzYMABAYGIgdO3YgKCgI169fh6+vLz755JMiJ5Wv8/b2RnR0NHbv3o0rV65g5MiRcHJyUvhH43UnT56Eq6srZsyYgT///BPfffcdgoOD8fXXXwOQ/4MwcOBAnD59Gj/88AP+/PNPLF26FKqqqmXu64oVK2BtbY3Y2FjMnz8fMTExGDVqFMaMGYOrV68iICAA8+fPV3gTcXd3x8OHD3Hs2DH89NNP+Pbbb4sc/5EjRyIlJQW//fYbYmJi0KVLF/Tv3x+pqaklHhcAmD17NmbOnInY2FjY2dlhyJAhePr0KQDg0aNHGDRoELp164bLly9j06ZN2LJlC/7zn/8AkH9F0s7OTvyKZWJiIszMzJCWloZ+/fqhc+fOuHjxIo4ePYrk5GSMGjVKYdvbt2+HtrY2zp07h+XLl+Orr75CeHg4APlJNyD/9DkxMVF8/qbnz5/Dzc0Np06dwtmzZ9GmTRsMGjQIz58/L3W/y+Li4oLs7GyFf/wEQcD27dvh7u7OKyKJSpGbmwtHR0fo6uri5MmTOH36NHR0dODk5CRe2bdp0yZMnToVkyZNwtWrV3Hw4EG0bt0aQOl//3fu3MG+ffvw888/Iy4uDgUFBRg6dChSU1Nx/PhxhIeH4+7du0USPYV69eqFli1bYufOnQrx7tq1CxMmTCh1DK/oe0mh+fPnY8SIEbh8+TJcXFwwZswY3LhxA4D8qmtHR0c0bNgQFy5cQGhoKP744w/xPXjWrFkYNWqUwjcB7O3ty3WMAeDYsWNISEjAsWPHsH37dgQHB4vvLz///DOaNm2Kr776Suy7OJmZmRg0aBAiIiIQGxsLJycnDBkypEjyu6IGDRoEY2PjIv80bdu2DcOHD6835RaIKkJLS0v8G3d3d8fFixdx8OBBREdHQxAEDBo0SPygbOrUqcjOzsaJEydw9epVLFu2DDo6OkX65Hk6z9N5nk5EyqKmpgZXV1cEBwdDEARxfmhoKPLz8zF27NhyjcWvK2mMKs85bXlyX287pr/J09MTe/fuVbiANSoqCvfu3cOECRMq1BfVYgLVCG5ubsLQoUMFQRCEHj16CBMmTBAEQRB++eUX4fWXydPTU5g0aZLCuidPnhRUVFSEly9fCjdu3BAACBcuXBCX3759WwAgrF69usTth4aGCo0aNRKfb9u2TdDX1y/Srnnz5mI/ubm5QuPGjYUdO3aIy8eOHSuMHj1aEARBePXqldCgQQPhzJkzCn14enoKY8eOLTaOv/76S1BVVRUePXqkML9///6Cv79/sbH1799fWLJkiUL7nTt3CiYmJoIgCEJYWJigoqIixMfHF7vN0vbV2dlZYd64ceOEjz76SGHe7NmzhbZt2wqCIAjx8fECAOH8+fPi8sLXpPC4nTx5UtDT0xNevXql0E+rVq2E7777rtgY7927JwAQli5dKs7Lzc0VmjZtKixbtkwQBEH44osvBAsLC6GgoEBss3HjRkFHR0fIz88XBEEQevfuLcyYMUOh78WLFwsDBgxQmPfw4UMBgHjMevfuLfTs2VOhTbdu3YQ5c+aIzwEIv/zyi0KbhQsXCtbW1sXukyAIQn5+vqCrqyscOnSo1H5eV9w+CIIgjBkzRujdu7f4PCIiQgAg3L59u0jbsrZBVJu5ubkJqqqqgra2tsL09ddfi21e/xvYuXNnkbEjOztb0NLSEsLCwgRBEARTU1Nh3rx5JW6zpL9/dXV1ISUlRZz3+++/C6qqqsKDBw/EedevX1cYN98cN5YtWyZYWVmJz/ft2yfo6OgImZmZgiAUP4aX572kpP2YPHmywjxbW1thypQpgiAIwubNm4WGDRuK2xYEQThy5IigoqIiJCUlCYKg+H5eqDzH2M3NTWjevLmQl5cnthk5cqT4nioIiu/BhUp6D3tdu3bthPXr15faz+uK2wdBEIS5c+cKLVq0EPfjzp07gkQiEf74448ibcvaBlFd8/rfTUFBgRAeHi5IpVJh1qxZwq1btwQAwunTp8X2T548EbS0tIS9e/cKgiAIHTp0EAICAort+9ixYwIA4dmzZ4Ig8Dy9cF95ns7zdCKqfoXj5rFjx8R5H374ofDJJ58IglD2WCwIRc8Ty/t3//o5bXlyX+8ypsfGxirMf/bsmaCpqSls27ZNnDd+/Pgi468glO/8nGonXoleAy1btgzbt28Xr3x73eXLlxEcHAwdHR1xcnR0REFBAe7du4f4+HioqamJN/gCgNatWxf5Gv8ff/yB/v3747333oOuri7Gjx+Pp0+fFvmaXWnU1NQwatQo8WuQWVlZOHDggPiV7jt37uDFixf46KOPFOLdsWMHEhISiu3z6tWryM/Px/vvv6+wzvHjx0tc5/Lly/jqq68U2hdexfHixQvExcWhadOmeP/998u9b4W6du2q8PzGjRv44IMPFOZ98MEHuH37NvLz83Hjxg2x/l8hS0tLhSv0Ll++jMzMTDRq1Egh5nv37pW4j4Xs7OzEx2pqaujatav4e3Ljxg3Y2dkp1Mv84IMPkJmZWeI3GwrjOXbsmEIslpaWAKAQz5u1zUxMTIp8yluW5ORkeHl5oU2bNtDX14eenh4yMzPf+QpJAJgwYQJOnDghxrx161b07t1bvFqWqD7p27cv4uLiFKbJkycX2/by5cu4c+cOdHV1xTHA0NAQr169QkJCAlJSUvD48WP079+/wnE0b94cRkZG4vMbN27AzMwMZmZm4ry2bdvCwMCg2Pc8QH7V4J07d8SbkgUHB2PUqFHQ1tYucbtv815S6PVxtvD56+OstbW1wrY/+OADFBQUID4+vsQ+yzrGhdq1a6dwRd7bjLOZmZmYNWsWrKysYGBgAB0dHdy4caPSxtl79+7h2LFjAORXDJmbm6Nfv37v3DdRXXD48GHo6OhAU1MTAwcOxOjRoxEQECCeH9ra2optGzVqBAsLC3F8mT59Ov7zn//ggw8+wMKFC9/qxmyv43m6HM/Ty4/n6URUHpaWlrC3txdLm9y5cwcnT54US7mUNRaXV1nntOXJfb3LmP4mAwMDDB8+XNzvjIwM7Nu3T9xvqh9YtKcG6tWrFxwdHeHv7w93d3eFZZmZmfj0008xffr0Ius1a9YMt27dKrP/+/fv41//+hemTJmCr7/+GoaGhjh16hQ8PT2Rk5NToRsSubi4oHfv3khJSUF4eDi0tLTEunaFXx89cuQI3nvvPYX1pFJpsf1lZmZCVVUVMTExRb7aV9xXWgvXWbRokXhn99dpampCS0ur3PvzptKSNG8rMzMTJiYmxdaPVMbX4TMzMzFkyBAsW7asyDITExPxsbq6usIyiUSCgoKCCm3Lzc0NT58+xdq1a9G8eXNIpVLY2dlVys2g+vfvj2bNmiE4OBizZ8/Gzz//jO++++6d+yWqjbS1tcv9j2lmZiZsbGyKrQtrZGQEFZW3/7y9MsbQJk2aYMiQIdi2bRtatGiB3377rcz6u2/zXlKVyjrGhSpjnJ01axbCw8OxYsUKtG7dGlpaWvj3v/9dKeNsmzZt8OGHH2Lbtm3o06cPduzYAS8vrzJvdkhUX/Tt2xebNm2ChoYGTE1NK1QfdeLEiXB0dMSRI0fw+++/IzAwECtXrsS0adPeOh6ep1ccz9N5nk5EZfP09MS0adOwceNGbNu2Da1atULv3r0rdRuVcU5b2WO6p6cn+vfvjzt37uDYsWNQVVXFyJEjK9wP1V5MotdQS5cuRadOnWBhYaEwv0uXLvjzzz9LTI5YWFggLy8PsbGx4lUWd+7cwbNnz8Q2MTExKCgowMqVK8XkyN69exX60dDQKNenhPb29jAzM8OePXvw22+/YeTIkeJJXNu2bSGVSvHgwYNyD6idO3dGfn4+UlJS8OGHH5ZrnS5duiA+Pr7EY9KxY0f8/fffuHXrVrFXuZR3XwHAysoKp0+fVph3+vRpvP/++1BVVYWlpSXy8vIQExODbt26AZB/QpqWlqYQb1JSEtTU1MSbZpTX2bNn0atXLwAQt1NYi9fKygr79u2DIAhiQuP06dPQ1dVF06ZNS9zXLl26YN++fTA3N3+nm2Goq6uXeRxPnz6Nb7/9Vrxz9cOHDxVujPQuVFRU4OHhgS1btuC9996DhoYG/v3vf1dK30R1WZcuXbBnzx40adIEenp6xbYxNzdHREQE+vbtW+zy8vz9A/Jx6uHDh3j48KF4Nfqff/6JtLQ0tG3btsT1Jk6ciLFjx6Jp06Zo1aqVwtUtxY1rb/NeUujs2bNwdXVVeN65c2cx/uDgYGRlZYnJm9OnT0NFRUV8vy5pnC3rGJdHed6vTp8+DXd3d7HmcWZmZpGbxL4LT09PTJkyBR9//DEePXpU5MN+ovqspA8wrayskJeXh3PnzsHe3h4A8PTpU8THxyuMfWZmZpg8eTImT54Mf39//Pe//y02ic7z9OLxPL1kPE8noso0atQozJgxAyEhIdixYwemTJkijm1ljcXFKW6MKuuctjy5r3cZ04vTt29ftGjRAtu2bcOxY8cwZsyYKvlAl2oulnOpoTp06AAXFxesW7dOYf6cOXNw5swZeHt7Iy4uDrdv38aBAwfEEzRLS0s4ODhg0qRJOH/+PGJjYzFp0iRoaWmJg1rr1q2Rm5uL9evX4+7du9i5cyeCgoIUtmNubo7MzExERETgyZMnpZZ5GTduHIKCghAeHi5+RRQAdHV1MWvWLPj6+mL79u1ISEjApUuXsH79emzfvr3Yvt5//324uLjA1dUVP//8M+7du4fz588jMDAQR44cKXadBQsWYMeOHVi0aBGuX7+OGzduYPfu3fjyyy8BAL1790avXr0wYsQIhIeH4969e/jtt99w9OjRCu/rzJkzERERgcWLF+PWrVvYvn07NmzYIN7kyMLCAk5OTvj0009x7tw5xMTEYOLEiQpX2Tg4OMDOzg7Ozs74/fffcf/+fZw5cwbz5s3DxYsXS9w2AGzcuBG//PILbt68ialTp+LZs2fiTSw+++wzPHz4ENOmTcPNmzdx4MABLFy4EH5+fuKHJebm5jh37hzu37+PJ0+eoKCgAFOnTkVqairGjh2LCxcuICEhAWFhYfDw8KjQ160Kk2xJSUkKb1yva9OmDXbu3IkbN27g3LlzcHFxeacrkN7k4eGBR48e4YsvvsDYsWMrtW+i2iQ7OxtJSUkKU0n/CLu4uKBx48YYOnQoTp48iXv37iEqKgrTp08Xv2IeEBCAlStXYt26dbh9+7Y4lhcqz98/IB//Ct/fLl26hPPnz8PV1RW9e/cu8rX81zk6OkJPTw//+c9/4OHhobCsuDH8bd5LCoWGhmLr1q24desWFi5ciPPnz4vvsS4uLtDU1ISbmxuuXbuGY8eOYdq0aRg/fjyMjY3FeK5cuYL4+Hg8efIEubm55TrG5WFubo4TJ07g0aNHJb6ebdq0EW/kevnyZYwbN67CVyOWpjAJ9+mnn2LAgAEKpXmIqHht2rTB0KFD4eXlhVOnTuHy5cv45JNP8N5772Ho0KEAAB8fH4SFheHevXu4dOkSjh07Bisrq2L743l68XieXjKepxNRZdLR0cHo0aPh7++PxMREhYsqyhqLi1PcGFXWOW15cl/vMqYXRyKRYMKECdi0aROio6NZyqU+UnZRdpIr7iZe9+7dEzQ0NIQ3X6bz588LH330kaCjoyNoa2sLHTt2VLhh3OPHj4WBAwcKUqlUaN68uRASEiI0adJECAoKEtusWrVKMDExEbS0tARHR0dhx44dCjcsEgRBmDx5stCoUSMBgLBw4UJBEIq/Udiff/4pABCaN2+ucLMcQZDfWGnNmjWChYWFoK6uLhgZGQmOjo7C8ePHSzwWOTk5woIFCwRzc3NBXV1dMDExEYYNGyZcuXJFEITib9Jw9OhRwd7eXtDS0hL09PSE7t27C5s3bxaXP336VPDw8BAaNWokaGpqCu3btxcOHz5c4X0VBEH46aefhLZt2wrq6upCs2bNhG+++UZheWJiojB48GBBKpUKzZo1E3bs2FGkr4yMDGHatGmCqampoK6uLpiZmQkuLi4KN9t7XeHNLUJCQoTu3bsLGhoaQtu2bYXIyEiFdlFRUUK3bt0EDQ0NQSaTCXPmzBFyc3PF5fHx8UKPHj0ELS0tAYBw7949QRAE4datW8KwYcMEAwMDQUtLS7C0tBR8fHzE17O4mwQNHTpUcHNzE58fPHhQaN26taCmpiY0b95cEISiNyy6dOmS0LVrV0FTU1No06aNEBoaWuGbipR0w6JCAwYMKHLTqDeVtQ2i2szNzU0AUGSysLAQ27z5N5CYmCi4uroKjRs3FqRSqdCyZUvBy8tLSE9PF9sEBQWJY7mJiYkwbdo0cVl5/v4L/fXXX8LHH38saGtrC7q6usLIkSPFm3KWtt78+fMFVVVV4fHjx0WWFTeGl/VeUhwAwsaNG4WPPvpIkEqlgrm5ubBnzx6FNleuXBH69u0raGpqCoaGhoKXl5fw/PlzcXlKSor4Ho3XbrpU1jEu7jxgxowZCjdii46OFjp27ChIpVLx3ODN98R79+4Jffv2FbS0tAQzMzNhw4YNRcbNt72xaKFJkyYJAMQbIhaHNxal+qasv5vU1FRh/Pjxgr6+vnj+fevWLXG5t7e30KpVK0EqlQpGRkbC+PHjhSdPngiCUPTGooLA83Sep/M8nYiU68yZMwIAYdCgQUWWlTUWvzm2FDdGleectjy5r7cd09+8sWihhw8fCioqKkK7du1KPDa8sWjdJREEQaj6VD0p099//w0zMzPxZqJU+9y/fx8tWrRAbGwsOnXqpOxwlKpPnz7o1KkT1qxZ89Z9SCQS/PLLL3B2dq60uIioanl6euKff/7BwYMHq2wbHBvk3N3dkZaWhv379791H+bm5vDx8YGPj0+lxUVEVBPxPP1/eJ5ORMpUGbmvyhjTg4OD4ePjo1AujOoGlnOpgyIjI3Hw4EHcu3cPZ86cwZgxY2Bubi7W6COq7b799lvo6Ojg6tWrFVpv8uTJSrmpIBG9vfT0dJw6dQohISHvdIM9qpjDhw9DR0cHhw8frtB6S5YsgY6ODh48eFBFkRERUU3G83Qiqi5Vmfuyt7cX72NSETo6Opg8efI7b59qJl6JXgeFhYVh5syZuHv3LnR1dWFvb481a9agefPmyg6N3hKvcPmfR48e4eXLlwCAZs2aQUNDo9zrpqSkICMjAwBgYmLCm4AQ1QJ9+vTB+fPn8emnn2L16tVVui1e/Sb3LmNlamoqUlNTAQBGRkbQ19evkhiJiGoKnqf/D8/Tiag6VUXuKy8vT7yBqVQqrfD9f+7cuQMAUFVVRYsWLd46DqqZmEQnIiIiIiIiIiIiIipBtZRzOXHiBIYMGQJTU1NIJJJy1diMiopCly5dIJVK0bp1awQHBxdps3HjRpibm0NTUxO2trY4f/585QdPRERERERERERERPVWtSTRs7KyYG1tjY0bN5ar/b179zB48GD07dsXcXFx8PHxwcSJExEWFia22bNnD/z8/LBw4UJcunQJ1tbWcHR0REpKSlXtBhERERERERERERHVM9VezqU89UbnzJmDI0eO4Nq1a+K8MWPGIC0tDUePHgUA2Nraolu3btiwYQMAoKCgAGZmZpg2bRrmzp1bpftARERERERERERERPWDmrIDKE50dDQcHBwU5jk6OsLHxwcAkJOTg5iYGPj7+4vLVVRU4ODggOjo6BL7zc7ORnZ2tvi8oKAAqampaNSoESQSSeXuBBFROQiCgOfPn8PU1BQqKtXy5aA6r6CgAI8fP4auri7HdiJSGo7vlYtjOxHVBBzbKxfHdiKqCco7ttfIJHpSUhKMjY0V5hkbGyMjIwMvX77Es2fPkJ+fX2ybmzdvlthvYGAgFi1aVCUxExG9i4cPH6Jp06bKDqNOePz4cYXvok5EVFU4vlcOju1EVJNwbK8cHNuJqCYpa2yvkUn0quLv7w8/Pz/xeXp6Opo1a4aHDx9CT09PiZERUX2VkZEBMzMz6OrqKjuUOqPwWHJsr7+SkpKwbds2eHh4QCaT1bvtU83A8b1ycWwnopqAY3vlKjyO8fHxPGciIqUp79heI5PoMpkMycnJCvOSk5Ohp6cHLS0tqKqqQlVVtdg2pQ28UqkUUqm0yHw9PT2ejBORUvHri5Wn8FhybK+/srKyoKmpCV1dXaX8Dih7+1SzcHyvHBzbiagm4dheOQqPI8+ZiKgmKGtsr5FFvOzs7BAREaEwLzw8HHZ2dgAADQ0N2NjYKLQpKChARESE2IaIiIiIiIiIiIiI6F1VSxI9MzMTcXFxiIuLAwDcu3cPcXFxePDgAQB5mRVXV1ex/eTJk3H37l18/vnnuHnzJr799lvs3bsXvr6+Yhs/Pz/897//xfbt23Hjxg1MmTIFWVlZ8PDwqI5dIiIiIiIiIiIiIqJ6oFrKuVy8eBF9+/YVnxfWJXdzc0NwcDASExPFhDoAtGjRAkeOHIGvry/Wrl2Lpk2b4vvvv4ejo6PYZvTo0fjnn3+wYMECJCUloVOnTjh69GiRm40SEREREREREREREb2takmi9+nTB4IglLg8ODi42HViY2NL7dfb2xve3t7vGh4RERERERERERERUbFqZE10IiIiIiIiIiKq+xo0aKDsEIiIysQkOhERERERERERKYVEIlF2CEREZWISnYiIiIiIiIiIiIioBEyiExERERERERGRUmRnZys7BKqpnjwBLl1SdhRUm+XlASdOALm579wVk+hERERERERERKQUeXl5yg6BaqIXLwBbW6BrV+DuXWVHQ7WVhwfQuzewY8c7d8UkOhEREREREREREdUcgYHy5LkgAI8fKzsaqo2iooAffpA//vvvd+6OSXQiIiIiIiIiIiKqGe7cAZYvV3YUVJvl5gLe3pXaJZPoREREREREREREpHyCAEyfDuTkKDsSqs02bACuX6/ULplEJyIiIiIiIiIiIuU7eBD47TdAXR3Q15fPEwTlxkS1S2IisHCh/LGRkfxnJfwOMYlOREREREREREREyvXyJeDjI388cyZgbKzUcKiWmj0beP4c6N4dGDGi0rplEp2IiIiIiIiIiIiUKzAQuH8faNoU+PJLZUdDtdHx48CuXYBEAmzcCKhUXuqbSXQiIiIiIiIiIlKKBg0aKDsEqgni44Fly+SPV60CtLWVGw/VPjk5wJQp8seTJgFdu1Zq90yiExERERERERGRUkgkEmWHQMomCPLkZ04OMHAg8O9/F11OVJYVK4AbN4AmTeTfangda6ITERERERERERFRrfXDD8CxY4CmJrBhg7wUB/C/n0RlSUgAFi+WP161CmjYUP64En+HmEQnIiIiIiIiIiKlyM7OVnYIpEypqfKbiALAggVAy5bKjYdqH0EApk4FXr0C+vcHxo2rks0wiU5EREREREREREqRl5en7BBImebOBf75B2jb9n/JdKKKCA0FwsIADQ3g22+r7BsMTKITERERERERERFR9TpzBvjvf+WPg4LkSdDXFSZDWROdSpKeDsyYIX/8xRfA++8X34410YmIiIiIiIiIiKhWyc0FPv1U/njCBODDD5UbD9VO8+YBSUny5PncuUWXsyY6ERERERERERER1Upr1gDXrgGNGgHLlys7GqqNLlyQl28BgE2bAKm0SjfHJDoRERERERERERFVj7/+AgIC5I9XrJAn0okqIi9P/k0GQQA++QTo16/KN8kkOhFRPZOamgoXFxfo6enBwMAAnp6eyMzMLHWdzZs3o0+fPtDT04NEIkFaWlqx7Y4cOQJbW1toaWmhYcOGcHZ2FpcFBwdDIpEUO6WkpAAAoqKiil2e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5AQsXqzsiIpXm2qiExERERERERERFUcqlSo7hPrl/n15HfS8PGDcOHk9a6KKyMmR/w49fAi8/z7w44+Aqqqyo6pyTKITEREREREREZFSqKlVW5EEysqSXz389CnQpQvw/fe82psqbsYM4ORJQE8POHBAfkPReoBJdCIiIiIiIiIiorpMEAB3d+DKFaBJE2D/fkBLS9lRlQ9rotccQUHyqbCWvqWlsiMqn0r4HWISnYiIiIiIiIiIlCI3N1fZIdQPS5YAP/0EqKsD+/YBZmbKjqhsvEq+Zjl5Epg2Tf54yRJg8GDlxlMerIlORERERERERES1XU5OjrJDqPv27QPmz5c/3rgR6NlTufFQ7XP3LjB8uLyW/ujRwJw5yo6o2jGJTkREREREREREVBedOwd88om8nMXUqYCXl7Ijotrm2TNg0CDgyRN5Lf2tW+vltwSYRCciIiIiIiIiIqpr7t8HPv4YePVKngRds0bZEb0d1kRXnpwc+RXo8fHyEkCHDgENGig7qopjTXQiIiIiIiIiIiJSkJYmr1mdkgJYWwO7dwNqasqOqmLq4dXONYogAJ9+CkRFAbq6wOHDgKmpsqOqGNZEJyIiIiIiIiIioiJyc4GRI4E//5QnPQ8flidBiSpiyRIgOBhQVQX27gU6dlR2RErFJDoREREREREREVFdIAjAlCnAH38A2tryBHrTpsqOimqbH38EvvxS/nj9esDJSbnx1ABMohMREREREREREdUFy5cDW7YAKiryEi6dOys7orenqSn/+fy5cuOob06fBtzd5Y9nzpR/KFNbVeLvEJPoRERERERERESkFFKpVNkh1B179wJz58ofr10L/Otfyo3nXbVpI/9586Zy46hPbt8Ghg6V31B02DD5hzK1WeHv0I0b79wVk+hERERERERERKQUarXtZpc11YkTwPjx8sfTpwPe3sqNpzIUXkUfEaHcOOqLlBR52ZanT4GuXYEffpB/o6E269JF/vPiRfnNdt9BLT8SRERERERERERE9diNG4pXD69apeyIKsfQoYBEApw5A5w/r+xo6rasLGDIEODuXaBFC3kt/QYNlB3Vu3v/faBtW/nNdr/77p26YhKdiIiIiIiIiIiUIi8vT9kh1G6JicDAgfKrbO3sgF27AFVVZUdVOd57D/jkE/njTz6R7ytVvrw8YOxY+QcVhobAb78BxsbK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d+nSpTKZTDKZTBo5cqRlfoMGDTRr1qxC1726no+PT5nGCMflZu8AAAAAAAAAADg/k8lU6PKJEyfqzTfflGEYNorImpeXlw4ePKiqVave0HrJycn64IMPNHHixDKKDI6OkehAITp06GC52piUlFTm+xs4cKBlf5988kmZ7w8AKiL6dgAof+jbAcAxJCcnW6ZZs2bJy8vLat4zzzwjb29vu43oNplMCggIUPXq1W9ovYCAAHl7e5dRVHAGJNGBIkRFRSk5OVm33357me/rzTffVHJycpnvBwAqOvp2ACh/6NsBwP4CAgIsk7e3tyVpfXWqVq1annIuHTp00JNPPqmRI0eqRo0a8vf31zvvvKPMzEwNGjRI1atXV5MmTfTf//7Xal979+5Vly5dVK1aNfn7++uxxx7T2bNnixV3VlaWHn/8cVWvXl3169fXggULSvIyoBwiiQ4UoUqVKgoICJCbW9lXP/L29lZAQECZ7wcAKjr6dgAof+jbAcB5LVu2TL6+vtq+fbuefPJJDR8+XH379lW7du20c+dO3X///XrssceUlZUlSUpLS1PHjh0VFBSk77//XnFxcTp9+rQefvjhYu3/tddeU9u2bbVr1y498cQTGj58uA4ePFiahwgnRxIdFcZvv/2mgIAATZ061TJv8+bNcnd31/r1629oW99++60qVaqkixcvWuYdP35cJpNJP//8c7GvogIAbgx9OwCUP/TtAFDxtGrVSuPGjdMtt9yisWPHytPTU76+voqKitItt9yiCRMm6Ny5c/rhhx8kSW+99ZaCgoI0depUBQYGKigoSIsXL9bGjRv1008/3fD+u3btqieeeEJNmjTR888/L19fX23cuLG0DxNOjCQ6KoxatWpp8eLFmjRpkr7//nudP39ejz32mKKjo9WpU6cb2lZSUpKaNWsmT09Py7xdu3apRo0auvnmmyXd+FVUAMCNo28HgPKHvh0AKp6WLVtaHru6uuqmm25SixYtLPP8/f0lSWfOnJEk7d69Wxs3blS1atUsU2BgoCTpyJEjJdr/1RI0V/cFSCTRUcF07dpVUVFRCg8P17Bhw1S1alVNmzbthreze/duBQUFWc1LSkpSq1atLM9v9CoqAKB46NsBoPyhbweAiqVSpUpWz00mk9U8k8kkScrNzZUkXbhwQT169FBSUpLVdOjQId17772lsv+r+wIkkuiogGbOnKkrV65o9erVWr58uTw8PG54G0lJSWrdurXVvF27dlnNu9GrqACA4qNvB4Dyh74dAFCQO+64Q/v27VODBg3UpEkTq6lq1ar2Dg/lEEl0VDhHjhzRqVOnlJubq+PHj9/w+jk5Odq7d2+eES07d+60+jB+o1dRAQDFR98OAOUPfTsAoCAjRoxQamqq+vfvrx07dujIkSNat26dBg0apJycHHuHh3Ko7G9bDjiQS5cuacCAAXrkkUfUtGlTDRkyRHv27JGfn991b+PgwYO6ePGi6tSpY5m3ZcsW/frrr3lGuQAAyh59OwCUP/TtAIDC1KlTR999952ef/553X///crOztbNN9+ssLAwubgwZhiljyQ6KpQXX3xR6enpmj17tqpVq6YvvvhCjz/+uNauXXvd20hKSpIkzZkzR0899ZQOHz6sp556SpL5wz4AwLbo2wGg/KFvBwDnN3DgQA0cODDP/KVLl1o9T0hIyNMmv28gGYZh9fyWW27RRx99VIIIC97X1b8hwFVcmkGFkZCQoFmzZum9996Tl5eXXFxc9N577+mbb77R/Pnzr3s7SUlJCg0N1dGjR9WiRQu9+OKLeumll+Tl5aXZs2eX4REAAP6Kvh0Ayh/6dgBAWUlPT1e1atX0/PPP39B61apV07Bhw8ooKjgDRqKjwujQoYMuX75sNa9BgwZKT0+/oe3s3r1bd955p/71r39ZzX/00Uctj4t7FRUAcGPo2wGg/KFvBwCUhT59+qh9+/aSJB8fnxta9+rIdFdX11KOCs6CkehAEebNm6dq1appz549kswfxlu0aFEm+xo2bJiqVatWJtsGAPyJvh0Ayh/6dgBAYapXr64mTZqoSZMm8vX1vaF1r67XsGHDMooOjs5kcEkdKNCvv/6qP/74Q5JUv359paamqnbt2tq3b5+aN29e6vs7c+aMMjIyJEm1a9dW1apVS30fAFDR0bcDQPlD3w4AAMoSSXQAAAAAAAAAAApAORcAAAAAAAAAAApAEh0AAAAAAAAAgAKQRAcAAAAAAAAAoAAk0QEAAAAAAAAAKABJdAAAAAAAAAAACkASHQAAAAAAAACAApBEBwAAAAAAAACgACTRAQAAAAAAAAAoAEl0AAAAAAAAAAAKQBIdAAAAAAAAAIAC/D9pNV++FzK5QwAAAABJRU5ErkJggg==\n" + }, + "metadata": {} + } + ], + "source": [ + "sim.plot()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "kPlPy2oo04p-" + }, + "source": [ + "Now, let's corrupt the synthetic data with 1mV of gaussian noise centered around zero," + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "id": "IW9PFOV904p-" + }, + "outputs": [], + "source": [ + "corrupt_V = synthetic_sol[\"Terminal voltage [V]\"].data\n", + "corrupt_V += np.random.normal(0, 0.001, len(corrupt_V))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "X8-tubYY04p_" + }, + "source": [ + "## Identify the Parameters" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "PQqhvSZN04p_" + }, + "source": [ + "Now, to blind fit the synthetic parameters we need to define the observation variables as well as update the forward model to be of PyBOP type (This composes PyBaMM's model class). For the observed voltage variable, we used the newly corrupted voltage array," + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": { + "id": "zuvGHWID04p_" + }, + "outputs": [], + "source": [ + "pyb_model = pybop.lithium_ion.SPM()\n", + "dataset = [\n", + " pybop.Dataset(\"Time [s]\", synthetic_sol[\"Time [s]\"].data),\n", + " pybop.Dataset(\"Current function [A]\", synthetic_sol[\"Current [A]\"].data),\n", + " pybop.Dataset(\"Terminal voltage [V]\", corrupt_V),\n", + "]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ffS3CF_704qA" + }, + "source": [ + "Next, we define the targeted forward model parameters for estimation. Furthermore, PyBOP provides functionality to define a prior for the parameters. The initial parameters values used in the estimiation will be randomly drawn from the prior distribution." + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": { + "id": "WPCybXIJ04qA" + }, + "outputs": [], + "source": [ + "parameters = [\n", + " pybop.Parameter(\n", + " \"Negative electrode active material volume fraction\",\n", + " prior=pybop.Gaussian(0.5, 0.02),\n", + " bounds=[0.48, 0.625],\n", + " ),\n", + " pybop.Parameter(\n", + " \"Positive electrode active material volume fraction\",\n", + " prior=pybop.Gaussian(0.65, 0.02),\n", + " bounds=[0.525, 0.75],\n", + " ),\n", + "]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "n4OHa-aF04qA" + }, + "source": [ + "We can now define the fitting signal, a problem (which combines the model with the dataset) and construct a cost function." + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": { + "id": "etMzRtx404qA" + }, + "outputs": [], + "source": [ + "# Define the cost to optimise\n", + "signal = \"Terminal voltage [V]\"\n", + "problem = pybop.Problem(pyb_model, parameters, dataset, signal=signal)\n", + "cost = pybop.RootMeanSquaredError(problem)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "eQiGurUV04qB" + }, + "source": [ + "Let's construct PyBOP's optimisation class. This class provides the methods needed to fit the forward model. For this example, we use a root-mean square cost function with the BOBYQA algorithm implemented in NLOpt." + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": { + "id": "N3FtAhrT04qB" + }, + "outputs": [], + "source": [ + "parameterisation = pybop.Optimisation(\n", + " cost=cost,\n", + " optimiser=pybop.NLoptOptimize,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "caprp-bV04qB" + }, + "source": [ + "Finally, we run the estimation algorithm." + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": { + "id": "-9OVt0EQ04qB" + }, + "outputs": [], + "source": [ + "x, final_cost = parameterisation.run()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-4pZsDmS04qC" + }, + "source": [ + "Let's view the identified parameters:" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Hgz8SV4i04qC", + "outputId": "e1e42ae7-5075-4c47-dd68-1b22ecc170f6" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([0.48367449, 0.63380314])" + ] + }, + "metadata": {}, + "execution_count": 69 + } + ], + "source": [ + "x" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "KxKURtH704qC" + }, + "source": [ + "## Plotting" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-cWCOiqR04qC" + }, + "source": [ + "First, run the SPM forward model with the estimated parameters," + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": { + "id": "ZVfozY0A04qC" + }, + "outputs": [], + "source": [ + "params.update(\n", + " {\n", + " \"Negative electrode active material volume fraction\": x[0],\n", + " \"Positive electrode active material volume fraction\": x[1],\n", + " }\n", + ")\n", + "optsol = sim.solve()[\"Terminal voltage [V]\"].data" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ntIvAJmA04qD" + }, + "source": [ + "Now, we plot the estimated forward model against the corrupted synthetic observation," + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 467 + }, + "id": "tJUJ80Ve04qD", + "outputId": "855fbaa2-1e09-4935-eb1a-8caf7f99eb75" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "<matplotlib.legend.Legend at 0x7d7b24dc6d40>" + ] + }, + "metadata": {}, + "execution_count": 71 + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "<Figure size 640x480 with 1 Axes>" + ], + "image/png": "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\n" + }, + "metadata": {} + } + ], + "source": [ + "plt.plot(corrupt_V, label=\"Groundtruth\")\n", + "plt.plot(optsol, label=\"Estimated\")\n", + "plt.xlabel(\"Time (s)\")\n", + "plt.ylabel(\"Voltage (V)\")\n", + "plt.legend()" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": { + "id": "N5XYkevi04qD" + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.12" + }, + "colab": { + "provenance": [] + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "8d003c14da5f4fa68284b28c15cee6e6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "VBoxModel", + "model_module_version": "2.0.0", + "state": { + "_dom_classes": [ + "widget-interact" + ], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "VBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "VBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_aef2fa7adcc14ad0854b73d5910ae3b4", + "IPY_MODEL_7d46516469314b88be3500e2afcafcf6" + ], + "layout": "IPY_MODEL_423bffea3a1c42b49a9ad71218e5811b", + "tabbable": null, + "tooltip": null + } + }, + "aef2fa7adcc14ad0854b73d5910ae3b4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatSliderModel", + "model_module_version": "2.0.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatSliderModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "FloatSliderView", + "behavior": "drag-tap", + "continuous_update": true, + "description": "t", + "description_allow_html": false, + "disabled": false, + "layout": "IPY_MODEL_06f2374f91c8455bb63252092512f2ed", + "max": 1.1333333333333333, + "min": 0, + "orientation": "horizontal", + "readout": true, + "readout_format": ".2f", + "step": 0.011333333333333332, + "style": "IPY_MODEL_56ff19291e464d63b23e63b8e2ac9ea3", + "tabbable": null, + "tooltip": null, + "value": 0 + } + }, + "7d46516469314b88be3500e2afcafcf6": { + "model_module": "@jupyter-widgets/output", + "model_name": "OutputModel", + "model_module_version": "1.0.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/output", + "_model_module_version": "1.0.0", + "_model_name": "OutputModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/output", + "_view_module_version": "1.0.0", + "_view_name": "OutputView", + "layout": "IPY_MODEL_646a8670cb204a31bb56bc2380898093", + "msg_id": "", + "outputs": [], + "tabbable": null, + "tooltip": null + } + }, + "423bffea3a1c42b49a9ad71218e5811b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "2.0.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "06f2374f91c8455bb63252092512f2ed": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "2.0.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "56ff19291e464d63b23e63b8e2ac9ea3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "SliderStyleModel", + "model_module_version": "2.0.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "SliderStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "description_width": "", + "handle_color": null + } + }, + "646a8670cb204a31bb56bc2380898093": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "2.0.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + } + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 } From f1592968a1fe9ec1526a930d9fed59ffff8404db Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 17 Nov 2023 11:54:11 +0000 Subject: [PATCH 193/210] Update pytest flags and usage --- CONTRIBUTING.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5926bedc1..a625bedd1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -129,6 +129,19 @@ else, type pytest --unit -v ``` +To run individual test files, you can use + +```bash +pytest tests/unit/path/to/test --unit -v +``` + +And for individual tests, + +```bash +pytest tests/unit/path/to/test.py::TestClass:test_name --unit -v +``` +where `--unit` is a flag to run only unit tests and `-v` is a flag to display verbose output. + ### Writing tests Every new feature should have its own test. To create ones, have a look at the `test` directory and see if there's a test for a similar method. Copy-pasting is a good way to start. From 283ccd0eecbaaff01019aa6ab631fbd9ecce2ca0 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 17 Nov 2023 12:49:56 +0000 Subject: [PATCH 194/210] Updt example name, links in readme, and phrasing --- README.md | 18 +++++++----------- .../scripts/{spm_example.py => spm_descent.py} | 0 2 files changed, 7 insertions(+), 11 deletions(-) rename examples/scripts/{spm_example.py => spm_descent.py} (100%) diff --git a/README.md b/README.md index ba56774f3..35e0ff0da 100644 --- a/README.md +++ b/README.md @@ -95,34 +95,30 @@ pytest --unit -v ``` ### Using PyBOP -PyBOP has two general types of intended use case: +PyBOP has two general types of intended use cases: 1. parameter estimation from battery test data 2. design optimisation subject to battery manufacturing/usage constraints -These general cases encompass a wide variety of optimisation problems, which require careful consideration based on the choice of battery model, the available data and/or the choice of design parameters. +These general cases encompass a wide variety of optimisation problems that require careful consideration based on the choice of battery model, the available data and/or the choice of design parameters. -PyBOP comes with a number of example notebooks and scripts which can be found in the examples folder. +PyBOP comes with a number of [example](https://github.com/pybop-team/PyBOP/blob/develop/examples) notebooks and scripts which can be found in the examples folder. -The [`spm_example` script](https://github.com/pybop-team/PyBOP/blob/develop/examples/scripts/spm_example.py) illustrates a straightforward example that begins by creating artificial data from a single particle model (SPM). The unknown parameter values are then discovered by implementing an RMSE cost function using the terminal voltage as the observed signal. The main output is the set of estimated parameters, namely the negative and positive electrode active material volume fractions in this example. To run this example: +The [spm_descent.py](https://github.com/pybop-team/PyBOP/blob/develop/examples/scripts/spm_descent.py) script illustrates a straightforward example that starts by generating artificial data from a single particle model (SPM). The unknown parameter values are identified by implementing a sum-of-square error cost function using the terminal voltage as the observed signal and a gradient descent optimiser. To run this example: ```bash python examples/scripts/spm_example.py ``` -The [`RMSE_estimation` script](https://github.com/pybop-team/PyBOP/blob/develop/examples/scripts/rmse_estimation.py) provides a second example which differs by importing the example `Chen_example.csv` dataset and then estimates the same SPM parameters based on the same RMSE cost function. To run this example: - -```bash -python examples/scripts/rmse_estimation.py -``` +In addition, [spm_nlopt.ipynb](https://github.com/pybop-team/PyBOP/blob/develop/examples/notebooks/spm_nlopt.ipynb) provides a second example in notebook form. This example estimates the SPM parameters based on an RMSE cost function and a BOBYQA optimiser. <!-- Code of Conduct --> ## Code of Conduct PyBOP aims to foster a broad consortium of developers and users, building on and learning from the success of the [PyBaMM](https://pybamm.org/) community. Our values are: -- Inclusivity and fairness (those who want to contribute may do so, and their input is appropriately recognised) +- Inclusivity and fairness (those who wish to contribute may do so, and their input is appropriately recognised) -- Interoperability (Modularity to enable maximum impact and inclusivity) +- Interoperability (Modularity for maximum impact and inclusivity) - User-friendliness (putting user requirements first via user-assistance & workflows) diff --git a/examples/scripts/spm_example.py b/examples/scripts/spm_descent.py similarity index 100% rename from examples/scripts/spm_example.py rename to examples/scripts/spm_descent.py From 1906f8d56f4fd694af817dac848357349d750240 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 17 Nov 2023 13:10:30 +0000 Subject: [PATCH 195/210] Add colab badge --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 35e0ff0da..25d1fbd09 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,8 @@ <a href="https://github.com/pybop-team/PyBOP/blob/develop/LICENSE"> <img src="https://img.shields.io/github/license/pybop-team/PyBOP" alt="license" /> </a> + <a href="https://colab.research.google.com/github/pybop-team/PyBOP/blob/develop/"> + <img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab" /> </p> </div> From 9529456c8871e2e159d8caf9146c68ae327a73db Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 17 Nov 2023 14:31:18 +0000 Subject: [PATCH 196/210] Add jupyter notebook nox session and scheduled tests --- .github/workflows/scheduled_tests.yaml | 2 ++ noxfile.py | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/.github/workflows/scheduled_tests.yaml b/.github/workflows/scheduled_tests.yaml index cb730f66e..2de1a0f83 100644 --- a/.github/workflows/scheduled_tests.yaml +++ b/.github/workflows/scheduled_tests.yaml @@ -30,6 +30,7 @@ jobs: - name: Unit tests with nox run: | python -m nox -s unit + python -m nox -s notebooks #M-series Mac Mini build-apple-mseries: @@ -57,6 +58,7 @@ jobs: pyenv activate pybop-${{ matrix.python-version }} python -m pip install --upgrade pip wheel setuptools nox python -m nox -s unit + python -m nox -s notebooks - name: Uninstall pyenv-virtualenv & python if: always() diff --git a/noxfile.py b/noxfile.py index be62e1129..c88e483e4 100644 --- a/noxfile.py +++ b/noxfile.py @@ -16,3 +16,11 @@ def coverage(session): session.run_always("pip", "install", "-e", ".") session.install("pytest-cov") session.run("pytest", "--unit", "-v", "--cov", "--cov-report=xml") + + +@nox.session +def notebooks(session): + """Run the examples tests for Jupyter notebooks.""" + session.run_always("pip", "install", "-e", ".") + session.install("pytest", "nbmake") + session.run("pytest", "--nbmake", "examples/", external=True) From e0cdb750ef6e566c41325f5cb311eca19cac6f31 Mon Sep 17 00:00:00 2001 From: NicolaCourtier <45851982+NicolaCourtier@users.noreply.github.com> Date: Fri, 17 Nov 2023 15:29:19 +0000 Subject: [PATCH 197/210] Add checks on early termination of simulation --- tests/unit/test_cost.py | 58 ++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/tests/unit/test_cost.py b/tests/unit/test_cost.py index 650c576f8..601e52db4 100644 --- a/tests/unit/test_cost.py +++ b/tests/unit/test_cost.py @@ -8,10 +8,12 @@ class TestCosts: Class for tests cost functions """ + @pytest.mark.parametrize("cut_off", [2.5,3.777]) @pytest.mark.unit - def test_costs(self): - # Construct Problem + def test_costs(self, cut_off): + # Construct model model = pybop.lithium_ion.SPM() + parameters = [ pybop.Parameter( "Negative electrode active material volume fraction", @@ -23,51 +25,53 @@ def test_costs(self): # Form dataset x0 = np.array([0.52]) solution = self.getdata(model, x0) - dataset = [ pybop.Dataset("Time [s]", solution["Time [s]"].data), pybop.Dataset("Current function [A]", solution["Current [A]"].data), pybop.Dataset("Voltage [V]", solution["Terminal voltage [V]"].data), ] + # Construct Problem signal = "Voltage [V]" - problem = pybop.Problem(model, parameters, dataset, signal=signal) + model.parameter_set.update({"Lower voltage cut-off [V]": cut_off}) + problem = pybop.Problem(model, parameters, dataset, signal=signal, x0=x0) # Base Cost - cost = pybop.BaseCost(problem) - assert cost.problem == problem + base_cost = pybop.BaseCost(problem) + assert base_cost.problem == problem with pytest.raises(NotImplementedError): - cost([0.5]) + base_cost([0.5]) with pytest.raises(NotImplementedError): - cost.n_parameters() + base_cost.n_parameters() # Root Mean Squared Error - cost = pybop.RootMeanSquaredError(problem) - cost([0.5]) + rmse_cost = pybop.RootMeanSquaredError(problem) + rmse_cost([0.5]) - assert type(cost([0.5])) == np.float64 - assert cost([0.5]) >= 0 + # Sum Squared Error + sums_cost = pybop.SumSquaredError(problem) + sums_cost([0.5]) - # Root Mean Squared Error - cost = pybop.SumSquaredError(problem) - cost([0.5]) + # Test type of returned value + assert type(rmse_cost([0.5])) == np.float64 or np.isinf(rmse_cost([0.5])) + assert rmse_cost([0.5]) >= 0 + assert type(sums_cost([0.5])) == np.float64 or np.isinf(sums_cost([0.5])) + assert sums_cost([0.5]) >= 0 - assert type(cost([0.5])) == np.float64 - assert cost([0.5]) >= 0 + # Test option setting + sums_cost.set_fail_gradient(1) - # Test catch on non-matching vector lengths - # Sum Squared Error - cost = pybop.SumSquaredError(problem) + # Test exception for non-numeric inputs with pytest.raises(ValueError): - cost(["test-entry"]) - + rmse_cost(["StringInputShouldNotWork"]) with pytest.raises(ValueError): - cost.evaluateS1(["test-entry"]) - - # Root Mean Squared Error - cost = pybop.RootMeanSquaredError(problem) + sums_cost(["StringInputShouldNotWork"]) with pytest.raises(ValueError): - cost(["test-entry"]) + sums_cost.evaluateS1(["StringInputShouldNotWork"]) + + # Test treatment of simulations that terminated early + # by variation of the cut-off voltage. + def getdata(self, model, x0): model.parameter_set = model.pybamm_model.default_parameter_values From 16b2fbf2ab7ed02f070cad52a2325b0dd915dcab Mon Sep 17 00:00:00 2001 From: NicolaCourtier <45851982+NicolaCourtier@users.noreply.github.com> Date: Fri, 17 Nov 2023 15:30:28 +0000 Subject: [PATCH 198/210] Revert "Add checks on early termination of simulation" This reverts commit e0cdb750ef6e566c41325f5cb311eca19cac6f31. --- tests/unit/test_cost.py | 58 +++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 31 deletions(-) diff --git a/tests/unit/test_cost.py b/tests/unit/test_cost.py index 601e52db4..650c576f8 100644 --- a/tests/unit/test_cost.py +++ b/tests/unit/test_cost.py @@ -8,12 +8,10 @@ class TestCosts: Class for tests cost functions """ - @pytest.mark.parametrize("cut_off", [2.5,3.777]) @pytest.mark.unit - def test_costs(self, cut_off): - # Construct model + def test_costs(self): + # Construct Problem model = pybop.lithium_ion.SPM() - parameters = [ pybop.Parameter( "Negative electrode active material volume fraction", @@ -25,53 +23,51 @@ def test_costs(self, cut_off): # Form dataset x0 = np.array([0.52]) solution = self.getdata(model, x0) + dataset = [ pybop.Dataset("Time [s]", solution["Time [s]"].data), pybop.Dataset("Current function [A]", solution["Current [A]"].data), pybop.Dataset("Voltage [V]", solution["Terminal voltage [V]"].data), ] - # Construct Problem signal = "Voltage [V]" - model.parameter_set.update({"Lower voltage cut-off [V]": cut_off}) - problem = pybop.Problem(model, parameters, dataset, signal=signal, x0=x0) + problem = pybop.Problem(model, parameters, dataset, signal=signal) # Base Cost - base_cost = pybop.BaseCost(problem) - assert base_cost.problem == problem + cost = pybop.BaseCost(problem) + assert cost.problem == problem with pytest.raises(NotImplementedError): - base_cost([0.5]) + cost([0.5]) with pytest.raises(NotImplementedError): - base_cost.n_parameters() + cost.n_parameters() # Root Mean Squared Error - rmse_cost = pybop.RootMeanSquaredError(problem) - rmse_cost([0.5]) + cost = pybop.RootMeanSquaredError(problem) + cost([0.5]) - # Sum Squared Error - sums_cost = pybop.SumSquaredError(problem) - sums_cost([0.5]) + assert type(cost([0.5])) == np.float64 + assert cost([0.5]) >= 0 - # Test type of returned value - assert type(rmse_cost([0.5])) == np.float64 or np.isinf(rmse_cost([0.5])) - assert rmse_cost([0.5]) >= 0 - assert type(sums_cost([0.5])) == np.float64 or np.isinf(sums_cost([0.5])) - assert sums_cost([0.5]) >= 0 + # Root Mean Squared Error + cost = pybop.SumSquaredError(problem) + cost([0.5]) - # Test option setting - sums_cost.set_fail_gradient(1) + assert type(cost([0.5])) == np.float64 + assert cost([0.5]) >= 0 - # Test exception for non-numeric inputs - with pytest.raises(ValueError): - rmse_cost(["StringInputShouldNotWork"]) + # Test catch on non-matching vector lengths + # Sum Squared Error + cost = pybop.SumSquaredError(problem) with pytest.raises(ValueError): - sums_cost(["StringInputShouldNotWork"]) + cost(["test-entry"]) + with pytest.raises(ValueError): - sums_cost.evaluateS1(["StringInputShouldNotWork"]) + cost.evaluateS1(["test-entry"]) - # Test treatment of simulations that terminated early - # by variation of the cut-off voltage. - + # Root Mean Squared Error + cost = pybop.RootMeanSquaredError(problem) + with pytest.raises(ValueError): + cost(["test-entry"]) def getdata(self, model, x0): model.parameter_set = model.pybamm_model.default_parameter_values From 790bb474eeb0178cbf20236311afb4eb564ceab2 Mon Sep 17 00:00:00 2001 From: NicolaCourtier <45851982+NicolaCourtier@users.noreply.github.com> Date: Fri, 17 Nov 2023 17:28:33 +0000 Subject: [PATCH 199/210] Return Infinity if simulation terminates early (#99) * Return inf if simulation terminates early * Add rvs description * Update error_costs.py * Add x0 length errors * Add checks on early termination of simulation * Add test for evaluateS1 * Combine x0 length checking Co-authored-by: Brady Planden <55357039+BradyPlanden@users.noreply.github.com> * Initialise _de as float Co-authored-by: Brady Planden <55357039+BradyPlanden@users.noreply.github.com> * Add check on length of x0 * Align np.inf return type with standard return --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Brady Planden <55357039+BradyPlanden@users.noreply.github.com> Co-authored-by: Brady Planden <brady.planden@gmail.com> --- pybop/_problem.py | 2 + pybop/costs/error_costs.py | 57 ++++++++++++++++++++------- pybop/parameters/base_parameter.py | 3 ++ tests/unit/test_cost.py | 62 +++++++++++++++++------------- tests/unit/test_problem.py | 5 +++ 5 files changed, 88 insertions(+), 41 deletions(-) diff --git a/pybop/_problem.py b/pybop/_problem.py index 2cdc5544b..469b65047 100644 --- a/pybop/_problem.py +++ b/pybop/_problem.py @@ -55,6 +55,8 @@ def __init__( self.x0 = np.zeros(self.n_parameters) for i, param in enumerate(self.parameters): self.x0[i] = param.rvs(1) + elif len(x0) != self.n_parameters: + raise ValueError("x0 dimensions do not match number of parameters") # Add the initial values to the parameter definitions for i, param in enumerate(self.parameters): diff --git a/pybop/costs/error_costs.py b/pybop/costs/error_costs.py index d3f4c6d18..82582d52a 100644 --- a/pybop/costs/error_costs.py +++ b/pybop/costs/error_costs.py @@ -38,7 +38,12 @@ def __call__(self, x, grad=None): Computes the cost. """ try: - return np.sqrt(np.mean((self.problem.evaluate(x) - self._target) ** 2)) + prediction = self.problem.evaluate(x) + + if len(prediction) < len(self._target): + return np.float64(np.inf) # simulation stopped early + else: + return np.sqrt(np.mean((prediction - self._target) ** 2)) except Exception as e: raise ValueError(f"Error in cost calculation: {e}") @@ -47,20 +52,32 @@ def __call__(self, x, grad=None): class SumSquaredError(BaseCost): """ Defines the sum squared error cost function. + + The initial fail gradient is set equal to one, but this can be + changed at any time with :meth:`set_fail_gradient()`. """ def __init__(self, problem): super(SumSquaredError, self).__init__(problem) + # Default fail gradient + self._de = 1.0 + def __call__(self, x, grad=None): """ Computes the cost. """ try: - return np.sum( - (np.sum(((self.problem.evaluate(x) - self._target) ** 2), axis=0)), - axis=0, - ) + prediction = self.problem.evaluate(x) + + if len(prediction) < len(self._target): + return np.float64(np.inf) # simulation stopped early + else: + return np.sum( + (np.sum(((prediction - self._target) ** 2), axis=0)), + axis=0, + ) + except Exception as e: raise ValueError(f"Error in cost calculation: {e}") @@ -71,17 +88,29 @@ def evaluateS1(self, x): """ try: y, dy = self.problem.evaluateS1(x) - dy = dy.reshape( - ( - self.problem.n_time_data, - self.problem.n_outputs, - self.problem.n_parameters, + if len(y) < len(self._target): + e = np.float64(np.inf) + de = self._de * np.ones(self.problem.n_parameters) + else: + dy = dy.reshape( + ( + self.problem.n_time_data, + self.problem.n_outputs, + self.problem.n_parameters, + ) ) - ) - r = y - self._target - e = np.sum(np.sum(r**2, axis=0), axis=0) - de = 2 * np.sum(np.sum((r.T * dy.T), axis=2), axis=1) + r = y - self._target + e = np.sum(np.sum(r**2, axis=0), axis=0) + de = 2 * np.sum(np.sum((r.T * dy.T), axis=2), axis=1) + return e, de except Exception as e: raise ValueError(f"Error in cost calculation: {e}") + + def set_fail_gradient(self, de): + """ + Sets the fail gradient for this optimiser. + """ + de = float(de) + self._de = de diff --git a/pybop/parameters/base_parameter.py b/pybop/parameters/base_parameter.py index 66c3a9e3c..66ac0b136 100644 --- a/pybop/parameters/base_parameter.py +++ b/pybop/parameters/base_parameter.py @@ -15,6 +15,9 @@ def __init__(self, name, value=None, prior=None, bounds=None): raise ValueError("Lower bound must be less than upper bound") def rvs(self, n_samples): + """ + Returns a random value sample from the prior distribution. + """ sample = self.prior.rvs(n_samples) if sample < self.lower_bound: diff --git a/tests/unit/test_cost.py b/tests/unit/test_cost.py index 650c576f8..8f528e942 100644 --- a/tests/unit/test_cost.py +++ b/tests/unit/test_cost.py @@ -8,10 +8,12 @@ class TestCosts: Class for tests cost functions """ + @pytest.mark.parametrize("cut_off", [2.5, 3.777]) @pytest.mark.unit - def test_costs(self): - # Construct Problem + def test_costs(self, cut_off): + # Construct model model = pybop.lithium_ion.SPM() + parameters = [ pybop.Parameter( "Negative electrode active material volume fraction", @@ -23,51 +25,57 @@ def test_costs(self): # Form dataset x0 = np.array([0.52]) solution = self.getdata(model, x0) - dataset = [ pybop.Dataset("Time [s]", solution["Time [s]"].data), pybop.Dataset("Current function [A]", solution["Current [A]"].data), pybop.Dataset("Voltage [V]", solution["Terminal voltage [V]"].data), ] + # Construct Problem signal = "Voltage [V]" - problem = pybop.Problem(model, parameters, dataset, signal=signal) + model.parameter_set.update({"Lower voltage cut-off [V]": cut_off}) + problem = pybop.Problem(model, parameters, dataset, signal=signal, x0=x0) # Base Cost - cost = pybop.BaseCost(problem) - assert cost.problem == problem + base_cost = pybop.BaseCost(problem) + assert base_cost.problem == problem with pytest.raises(NotImplementedError): - cost([0.5]) + base_cost([0.5]) with pytest.raises(NotImplementedError): - cost.n_parameters() + base_cost.n_parameters() # Root Mean Squared Error - cost = pybop.RootMeanSquaredError(problem) - cost([0.5]) + rmse_cost = pybop.RootMeanSquaredError(problem) + rmse_cost([0.5]) - assert type(cost([0.5])) == np.float64 - assert cost([0.5]) >= 0 + # Sum Squared Error + sums_cost = pybop.SumSquaredError(problem) + sums_cost([0.5]) - # Root Mean Squared Error - cost = pybop.SumSquaredError(problem) - cost([0.5]) + # Test type of returned value + assert type(rmse_cost([0.5])) == np.float64 + assert rmse_cost([0.5]) >= 0 - assert type(cost([0.5])) == np.float64 - assert cost([0.5]) >= 0 + assert type(sums_cost([0.5])) == np.float64 + assert sums_cost([0.5]) >= 0 + e, de = sums_cost.evaluateS1([0.5]) - # Test catch on non-matching vector lengths - # Sum Squared Error - cost = pybop.SumSquaredError(problem) - with pytest.raises(ValueError): - cost(["test-entry"]) + assert type(e) == np.float64 + assert type(de) == np.ndarray - with pytest.raises(ValueError): - cost.evaluateS1(["test-entry"]) + # Test option setting + sums_cost.set_fail_gradient(1) - # Root Mean Squared Error - cost = pybop.RootMeanSquaredError(problem) + # Test exception for non-numeric inputs with pytest.raises(ValueError): - cost(["test-entry"]) + rmse_cost(["StringInputShouldNotWork"]) + with pytest.raises(ValueError): + sums_cost(["StringInputShouldNotWork"]) + with pytest.raises(ValueError): + sums_cost.evaluateS1(["StringInputShouldNotWork"]) + + # Test treatment of simulations that terminated early + # by variation of the cut-off voltage. def getdata(self, model, x0): model.parameter_set = model.pybamm_model.default_parameter_values diff --git a/tests/unit/test_problem.py b/tests/unit/test_problem.py index 93879f395..aa470d9b4 100644 --- a/tests/unit/test_problem.py +++ b/tests/unit/test_problem.py @@ -37,6 +37,11 @@ def test_problem(self): pybop.Dataset("Voltage [V]", solution["Terminal voltage [V]"].data), ] + # Test incorrect number of initial parameter values + with pytest.raises(ValueError): + pybop.Problem(model, parameters, dataset, signal=signal, x0=np.array([])) + + # Construct Problem problem = pybop.Problem(model, parameters, dataset, signal=signal) assert problem._model == model From 3523f200ec3fee4206ebbbfd7f9426cc48c3c1f3 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Fri, 17 Nov 2023 18:11:41 +0000 Subject: [PATCH 200/210] Updt max iterations for convergance, rename test method --- tests/unit/test_parameterisations.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/unit/test_parameterisations.py b/tests/unit/test_parameterisations.py index e5ab70d79..2dbd4ed40 100644 --- a/tests/unit/test_parameterisations.py +++ b/tests/unit/test_parameterisations.py @@ -64,7 +64,7 @@ def test_spm(self, init_soc): @pytest.mark.parametrize("init_soc", [0.3, 0.5, 0.8]) @pytest.mark.unit - def test_spme_multiple_optimisers(self, init_soc): + def test_spme_optimisers(self, init_soc): # Define model parameter_set = pybop.ParameterSet("pybamm", "Chen2020") model = pybop.lithium_ion.SPMe(parameter_set=parameter_set) @@ -114,10 +114,10 @@ def test_spme_multiple_optimisers(self, init_soc): assert parameterisation._use_f_guessed is True parameterisation.set_f_guessed_tracking(False) - parameterisation.set_max_iterations(100) + parameterisation.set_max_iterations(250) x, final_cost = parameterisation.run() - assert parameterisation._iterations == 100 + assert parameterisation._max_iterations == 250 else: x, final_cost = parameterisation.run() @@ -155,7 +155,7 @@ def test_model_misparameterisation(self, init_soc): pybop.Parameter( "Negative electrode active material volume fraction", prior=pybop.Gaussian(0.5, 0.02), - bounds=[0.45, 0.625], + bounds=[0.375, 0.625], ), pybop.Parameter( "Positive electrode active material volume fraction", From f67c8103ace47cd40f87fd85a1f45748efd674f4 Mon Sep 17 00:00:00 2001 From: NicolaCourtier <45851982+NicolaCourtier@users.noreply.github.com> Date: Fri, 17 Nov 2023 18:12:37 +0000 Subject: [PATCH 201/210] Pass x0, bounds and n_parameters into Cost (#101) * Unpack x0, bounds and n_parameters into Cost * Pass x0, bounds and n_parameters from Cost * Remove n_parameters function check * Allow problem=None in BaseCost * Add StandaloneCost * Add test of StandaloneCosts --- pybop/costs/error_costs.py | 12 +++++------- pybop/costs/standalone.py | 18 ++++++++++++++++++ pybop/optimisation.py | 8 ++++---- tests/unit/test_cost.py | 2 -- tests/unit/test_optimisation.py | 15 +++++++++++++++ 5 files changed, 42 insertions(+), 13 deletions(-) create mode 100644 pybop/costs/standalone.py diff --git a/pybop/costs/error_costs.py b/pybop/costs/error_costs.py index 82582d52a..2c497d45b 100644 --- a/pybop/costs/error_costs.py +++ b/pybop/costs/error_costs.py @@ -10,7 +10,11 @@ class BaseCost: def __init__(self, problem): self.problem = problem - self._target = problem._target + if problem is not None: + self._target = problem._target + self.x0 = problem.x0 + self.bounds = problem.bounds + self.n_parameters = problem.n_parameters def __call__(self, x, grad=None): """ @@ -18,12 +22,6 @@ def __call__(self, x, grad=None): """ raise NotImplementedError - def n_parameters(self): - """ - Returns the size of the parameter space. - """ - raise NotImplementedError - class RootMeanSquaredError(BaseCost): """ diff --git a/pybop/costs/standalone.py b/pybop/costs/standalone.py new file mode 100644 index 000000000..197dcca5b --- /dev/null +++ b/pybop/costs/standalone.py @@ -0,0 +1,18 @@ +import pybop +import numpy as np + + +class StandaloneCost(pybop.BaseCost): + def __init__(self, problem=None): + super().__init__(problem) + + self.x0 = np.array([4.2]) + self.n_parameters = len(self.x0) + + self.bounds = dict( + lower=[-1], + upper=[10], + ) + + def __call__(self, x, grad=None): + return x[0] ** 2 + 42 diff --git a/pybop/optimisation.py b/pybop/optimisation.py index ac8ffdfd3..6dc947de7 100644 --- a/pybop/optimisation.py +++ b/pybop/optimisation.py @@ -23,11 +23,11 @@ def __init__( verbose=False, ): self.cost = cost - self.problem = cost.problem self.optimiser = optimiser self.verbose = verbose - self.x0 = cost.problem.x0 - self.bounds = self.problem.bounds + self.x0 = cost.x0 + self.bounds = cost.bounds + self.n_parameters = cost.n_parameters self.sigma0 = sigma0 self.log = [] @@ -56,7 +56,7 @@ def __init__( self.pints = False if issubclass(self.optimiser, pybop.NLoptOptimize): - self.optimiser = self.optimiser(self.problem.n_parameters) + self.optimiser = self.optimiser(self.n_parameters) elif issubclass(self.optimiser, pybop.SciPyMinimize): self.optimiser = self.optimiser() diff --git a/tests/unit/test_cost.py b/tests/unit/test_cost.py index 8f528e942..0c7e329f3 100644 --- a/tests/unit/test_cost.py +++ b/tests/unit/test_cost.py @@ -41,8 +41,6 @@ def test_costs(self, cut_off): assert base_cost.problem == problem with pytest.raises(NotImplementedError): base_cost([0.5]) - with pytest.raises(NotImplementedError): - base_cost.n_parameters() # Root Mean Squared Error rmse_cost = pybop.RootMeanSquaredError(problem) diff --git a/tests/unit/test_optimisation.py b/tests/unit/test_optimisation.py index b9d3b0414..406c89ee3 100644 --- a/tests/unit/test_optimisation.py +++ b/tests/unit/test_optimisation.py @@ -1,6 +1,7 @@ import pybop import numpy as np import pytest +from pybop.costs.standalone import StandaloneCost class TestOptimisation: @@ -8,6 +9,20 @@ class TestOptimisation: A class to test the optimisation class. """ + @pytest.mark.unit + def test_standalone(self): + # Build an Optimisation problem with a StandaloneCost + cost = StandaloneCost() + + opt = pybop.Optimisation(cost=cost, optimiser=pybop.NLoptOptimize) + + assert len(opt.x0) == opt.n_parameters + + x, final_cost = opt.run() + + np.testing.assert_allclose(x, 0, atol=1e-2) + np.testing.assert_allclose(final_cost, 42, atol=1e-2) + @pytest.mark.unit def test_prior_sampling(self): # Tests prior sampling From 4dc8a3d3ad459919739ddb861a0ff9b8c793f22e Mon Sep 17 00:00:00 2001 From: NicolaCourtier <45851982+NicolaCourtier@users.noreply.github.com> Date: Fri, 17 Nov 2023 18:42:11 +0000 Subject: [PATCH 202/210] Update CONTRIBUTING.md --- CONTRIBUTING.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a625bedd1..d1ea9db24 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -159,14 +159,15 @@ This also means that, if you can't fix the bug yourself, it will be much easier 1. Run individual test scripts instead of the whole test suite: ```bash - pytest tests/unit/path/to/test + pytest tests/unit/path/to/test --unit -v ``` You can also run an individual test from a particular script, e.g. ```bash - pytest tests/unit/test_quick_plot.py TestQuickPlot.test_failure + pytest tests/unit/path/to/test.py::TestClass:test_name --unit -v ``` + where `--unit` is a flag to run only unit tests and `-v` is a flag to display verbose output. 2. Set break-points, either in your IDE or using the Python debugging module. To use the latter, add the following line where you want to set the break point From 500fc682a2a22a48db542c1324630dec4249a718 Mon Sep 17 00:00:00 2001 From: NicolaCourtier <45851982+NicolaCourtier@users.noreply.github.com> Date: Fri, 17 Nov 2023 18:44:12 +0000 Subject: [PATCH 203/210] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 25d1fbd09..11d7e9be8 100644 --- a/README.md +++ b/README.md @@ -103,12 +103,12 @@ PyBOP has two general types of intended use cases: These general cases encompass a wide variety of optimisation problems that require careful consideration based on the choice of battery model, the available data and/or the choice of design parameters. -PyBOP comes with a number of [example](https://github.com/pybop-team/PyBOP/blob/develop/examples) notebooks and scripts which can be found in the examples folder. +PyBOP comes with a number of [example notebooks and scripts](https://github.com/pybop-team/PyBOP/blob/develop/examples) which can be found in the examples folder. The [spm_descent.py](https://github.com/pybop-team/PyBOP/blob/develop/examples/scripts/spm_descent.py) script illustrates a straightforward example that starts by generating artificial data from a single particle model (SPM). The unknown parameter values are identified by implementing a sum-of-square error cost function using the terminal voltage as the observed signal and a gradient descent optimiser. To run this example: ```bash -python examples/scripts/spm_example.py +python examples/scripts/spm_descent.py ``` In addition, [spm_nlopt.ipynb](https://github.com/pybop-team/PyBOP/blob/develop/examples/notebooks/spm_nlopt.ipynb) provides a second example in notebook form. This example estimates the SPM parameters based on an RMSE cost function and a BOBYQA optimiser. @@ -120,7 +120,7 @@ PyBOP aims to foster a broad consortium of developers and users, building on and - Inclusivity and fairness (those who wish to contribute may do so, and their input is appropriately recognised) -- Interoperability (Modularity for maximum impact and inclusivity) +- Interoperability (modularity for maximum impact and inclusivity) - User-friendliness (putting user requirements first via user-assistance & workflows) From d2b1d17a35f0d133eff20ba4cea49911508ad61a Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Mon, 20 Nov 2023 11:22:18 +0000 Subject: [PATCH 204/210] Updt CMAES with pints.RectangularBoundaries --- pybop/optimisers/pints_optimisers.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pybop/optimisers/pints_optimisers.py b/pybop/optimisers/pints_optimisers.py index 903d4d560..cad4bed43 100644 --- a/pybop/optimisers/pints_optimisers.py +++ b/pybop/optimisers/pints_optimisers.py @@ -17,7 +17,10 @@ class CMAES(pints.CMAES): """ def __init__(self, x0, sigma0=0.1, bounds=None): - boundaries = PintsBoundaries(bounds, x0) + if bounds is not None: + boundaries = pints.RectangularBoundaries(bounds["lower"], bounds["upper"]) + else: + boundaries = PintsBoundaries(bounds, x0) super().__init__(x0, sigma0, boundaries) From ec2f86381b1d750ef7c3e471d12c1d7af4552001 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Mon, 20 Nov 2023 11:58:22 +0000 Subject: [PATCH 205/210] Refactor x0 sampling w/o bound clashes, reduce test_parameterisation SOC points 3->2, Updt. CMAES boundaries creation --- pybop/optimisers/pints_optimisers.py | 3 ++- pybop/parameters/base_parameter.py | 21 +++++++++++++-------- tests/unit/test_parameterisations.py | 6 +++--- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/pybop/optimisers/pints_optimisers.py b/pybop/optimisers/pints_optimisers.py index cad4bed43..30d414bcd 100644 --- a/pybop/optimisers/pints_optimisers.py +++ b/pybop/optimisers/pints_optimisers.py @@ -20,7 +20,8 @@ def __init__(self, x0, sigma0=0.1, bounds=None): if bounds is not None: boundaries = pints.RectangularBoundaries(bounds["lower"], bounds["upper"]) else: - boundaries = PintsBoundaries(bounds, x0) + boundaries = None # PintsBoundaries(bounds, x0) + super().__init__(x0, sigma0, boundaries) diff --git a/pybop/parameters/base_parameter.py b/pybop/parameters/base_parameter.py index 66ac0b136..5e58d5ed9 100644 --- a/pybop/parameters/base_parameter.py +++ b/pybop/parameters/base_parameter.py @@ -1,3 +1,6 @@ +import numpy as np + + class Parameter: """ "" Class for creating parameters in PyBOP. @@ -18,14 +21,16 @@ def rvs(self, n_samples): """ Returns a random value sample from the prior distribution. """ - sample = self.prior.rvs(n_samples) - - if sample < self.lower_bound: - return self.lower_bound - elif sample > self.upper_bound: - return self.upper_bound - else: - return sample + samples = self.prior.rvs(n_samples) + + # Constrain samples to be within bounds + samples = np.clip(samples, self.lower_bound, self.upper_bound) + + # Adjust samples that exactly equal bounds + samples[samples == self.lower_bound] += samples * 0.0001 + samples[samples == self.upper_bound] -= samples * 0.0001 + + return samples def update(self, value): self.value = value diff --git a/tests/unit/test_parameterisations.py b/tests/unit/test_parameterisations.py index 2dbd4ed40..0b9c41a71 100644 --- a/tests/unit/test_parameterisations.py +++ b/tests/unit/test_parameterisations.py @@ -9,7 +9,7 @@ class TestModelParameterisation: A class to test the model parameterisation methods. """ - @pytest.mark.parametrize("init_soc", [0.3, 0.5, 0.8]) + @pytest.mark.parametrize("init_soc", [0.3, 0.7]) @pytest.mark.unit def test_spm(self, init_soc): # Define model @@ -62,7 +62,7 @@ def test_spm(self, init_soc): np.testing.assert_allclose(final_cost, 0, atol=1e-2) np.testing.assert_allclose(x, x0, atol=1e-1) - @pytest.mark.parametrize("init_soc", [0.3, 0.5, 0.8]) + @pytest.mark.parametrize("init_soc", [0.3, 0.7]) @pytest.mark.unit def test_spme_optimisers(self, init_soc): # Define model @@ -126,7 +126,7 @@ def test_spme_optimisers(self, init_soc): np.testing.assert_allclose(final_cost, 0, atol=1e-2) np.testing.assert_allclose(x, x0, atol=1e-1) - @pytest.mark.parametrize("init_soc", [0.3, 0.5, 0.8]) + @pytest.mark.parametrize("init_soc", [0.3, 0.7]) @pytest.mark.unit def test_model_misparameterisation(self, init_soc): # Define two different models with different parameter sets From c82b85b91259fd63a8d526c6a54c43e0e8d276b2 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Mon, 20 Nov 2023 12:52:22 +0000 Subject: [PATCH 206/210] Updt. tests, grad descent boundaries --- pybop/optimisers/pints_optimisers.py | 10 ++++++---- tests/unit/test_optimisation.py | 5 +++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/pybop/optimisers/pints_optimisers.py b/pybop/optimisers/pints_optimisers.py index 30d414bcd..79dc85c28 100644 --- a/pybop/optimisers/pints_optimisers.py +++ b/pybop/optimisers/pints_optimisers.py @@ -7,7 +7,7 @@ class GradientDescent(pints.GradientDescent): """ def __init__(self, x0, sigma0=0.1, bounds=None): - boundaries = PintsBoundaries(bounds, x0) + boundaries = None # Bounds ignored in pints.GradDesc super().__init__(x0, sigma0, boundaries) @@ -18,11 +18,13 @@ class CMAES(pints.CMAES): def __init__(self, x0, sigma0=0.1, bounds=None): if bounds is not None: - boundaries = pints.RectangularBoundaries(bounds["lower"], bounds["upper"]) + self.boundaries = pints.RectangularBoundaries( + bounds["lower"], bounds["upper"] + ) else: - boundaries = None # PintsBoundaries(bounds, x0) + self.boundaries = None - super().__init__(x0, sigma0, boundaries) + super().__init__(x0, sigma0, self.boundaries) class PintsBoundaries(object): diff --git a/tests/unit/test_optimisation.py b/tests/unit/test_optimisation.py index 406c89ee3..5bbb4998b 100644 --- a/tests/unit/test_optimisation.py +++ b/tests/unit/test_optimisation.py @@ -92,6 +92,11 @@ def test_optimiser_construction(self): == "Covariance Matrix Adaptation Evolution Strategy (CMA-ES)" ) + # None with no bounds + cost.bounds = None + opt = pybop.Optimisation(cost=cost) + assert opt.optimiser.boundaries is None + # SciPy opt = pybop.Optimisation(cost=cost, optimiser=pybop.SciPyMinimize) assert opt.optimiser is not None From 854e1ec9ac1d569c77ef26100183e99331241916 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Mon, 20 Nov 2023 13:16:08 +0000 Subject: [PATCH 207/210] Remove PintsBoundaries class as not required --- pybop/optimisers/pints_optimisers.py | 39 ---------------------------- 1 file changed, 39 deletions(-) diff --git a/pybop/optimisers/pints_optimisers.py b/pybop/optimisers/pints_optimisers.py index 79dc85c28..709f028a8 100644 --- a/pybop/optimisers/pints_optimisers.py +++ b/pybop/optimisers/pints_optimisers.py @@ -25,42 +25,3 @@ def __init__(self, x0, sigma0=0.1, bounds=None): self.boundaries = None super().__init__(x0, sigma0, self.boundaries) - - -class PintsBoundaries(object): - """ - An interface class for PyBOP that extends the PINTS ErrorMeasure class. - - From PINTS: - Abstract class representing boundaries on a parameter space. - """ - - def __init__(self, bounds, x0): - self.bounds = bounds - self.x0 = x0 - - def check(self, parameters): - """ - Returns ``True`` if and only if the given point in parameter space is - within the boundaries. - """ - - lower_bounds = self.bounds["lower"] - upper_bounds = self.bounds["upper"] - - if len(parameters) != len(lower_bounds): - raise ValueError("Parameters length mismatch") - - within_bounds = all( - low <= param <= high - for low, high, param in zip(lower_bounds, upper_bounds, parameters) - ) - - return within_bounds - - def n_parameters(self): - """ - Returns the dimension of the parameter space these boundaries are - defined on. - """ - return len(self.x0) From a66be81e409df321562c83d0df618e4821e9dbd2 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Mon, 20 Nov 2023 14:06:00 +0000 Subject: [PATCH 208/210] Restore simple f_guessed test --- tests/unit/test_parameterisations.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/unit/test_parameterisations.py b/tests/unit/test_parameterisations.py index 0b9c41a71..142e590d0 100644 --- a/tests/unit/test_parameterisations.py +++ b/tests/unit/test_parameterisations.py @@ -112,6 +112,8 @@ def test_spme_optimisers(self, init_soc): if optimiser == pybop.CMAES: parameterisation.set_f_guessed_tracking(True) assert parameterisation._use_f_guessed is True + parameterisation.set_max_iterations(1) + x, final_cost = parameterisation.run() parameterisation.set_f_guessed_tracking(False) parameterisation.set_max_iterations(250) From 3437b9534dec5e3166fce282a3ab50ca5f922b34 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Mon, 20 Nov 2023 15:08:03 +0000 Subject: [PATCH 209/210] Bounds message for GradDescent, Add hyperparameter for parameter bound clipping with setter --- pybop/optimisers/pints_optimisers.py | 3 +++ pybop/parameters/base_parameter.py | 19 +++++++++++++------ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/pybop/optimisers/pints_optimisers.py b/pybop/optimisers/pints_optimisers.py index 709f028a8..6524cb607 100644 --- a/pybop/optimisers/pints_optimisers.py +++ b/pybop/optimisers/pints_optimisers.py @@ -7,6 +7,9 @@ class GradientDescent(pints.GradientDescent): """ def __init__(self, x0, sigma0=0.1, bounds=None): + if bounds is not None: + print("Boundaries ignored by GradientDescent") + boundaries = None # Bounds ignored in pints.GradDesc super().__init__(x0, sigma0, boundaries) diff --git a/pybop/parameters/base_parameter.py b/pybop/parameters/base_parameter.py index 5e58d5ed9..fa8754831 100644 --- a/pybop/parameters/base_parameter.py +++ b/pybop/parameters/base_parameter.py @@ -13,8 +13,9 @@ def __init__(self, name, value=None, prior=None, bounds=None): self.bounds = bounds self.lower_bound = self.bounds[0] self.upper_bound = self.bounds[1] + self.margin = 1e-4 - if self.lower_bound > self.upper_bound: + if self.lower_bound >= self.upper_bound: raise ValueError("Lower bound must be less than upper bound") def rvs(self, n_samples): @@ -24,11 +25,8 @@ def rvs(self, n_samples): samples = self.prior.rvs(n_samples) # Constrain samples to be within bounds - samples = np.clip(samples, self.lower_bound, self.upper_bound) - - # Adjust samples that exactly equal bounds - samples[samples == self.lower_bound] += samples * 0.0001 - samples[samples == self.upper_bound] -= samples * 0.0001 + offset = self.margin * (self.upper_bound - self.lower_bound) + samples = np.clip(samples, self.lower_bound + offset, self.upper_bound - offset) return samples @@ -37,3 +35,12 @@ def update(self, value): def __repr__(self): return f"Parameter: {self.name} \n Prior: {self.prior} \n Bounds: {self.bounds} \n Value: {self.value}" + + def set_margin(self, margin): + """ + Sets the margin for the parameter. + """ + if not 0 < margin < 1: + raise ValueError("Margin must be between 0 and 1") + + self.margin = margin From dd88872e501354cd5118e4ba4d0ef022e6318833 Mon Sep 17 00:00:00 2001 From: Brady Planden <brady.planden@gmail.com> Date: Mon, 20 Nov 2023 15:37:39 +0000 Subject: [PATCH 210/210] bump to v23.11 --- pybop/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pybop/version.py b/pybop/version.py index 41a1fa8c0..915a9aedb 100644 --- a/pybop/version.py +++ b/pybop/version.py @@ -1 +1 @@ -__version__ = "23.09" +__version__ = "23.11"