You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
LLEPE/docs/_build/html/_modules/llepe/llepe.html

1685 lines
197 KiB

<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="python" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="python" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>llepe.llepe &mdash; LLEPE 1.0.0 documentation</title>
<script type="text/javascript" src="../../_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script src="../../_static/jquery.js"></script>
<script src="../../_static/underscore.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/language_data.js"></script>
<script type="text/javascript" src="../../_static/js/theme.js"></script>
<link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../index.html" class="icon icon-home"> LLEPE
<img src="../../_static/logo.png" class="logo" alt="Logo"/>
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p class="caption"><span class="caption-text">User Guide</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../guide/install.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guide/quickstart.html">Getting Started</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guide/about.html">About</a></li>
</ul>
<p class="caption"><span class="caption-text">Searchers</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../modules/LLEPE.html">LLEPE</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../index.html">LLEPE</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../index.html">Docs</a> &raquo;</li>
<li><a href="../index.html">Module code</a> &raquo;</li>
<li>llepe.llepe</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<h1>Source code for llepe.llepe</h1><div class="highlight"><pre>
<span></span><span class="c1"># LLEPE: Liquid-Liquid Equilibrium Parameter Estimator</span>
<span class="c1"># Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved.</span>
<span class="c1"># Released under the modified BSD license. See LICENSE for more details.</span>
<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
<span class="kn">import</span> <span class="nn">cantera</span> <span class="k">as</span> <span class="nn">ct</span>
<span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
<span class="kn">from</span> <span class="nn">scipy.optimize</span> <span class="kn">import</span> <span class="n">minimize</span>
<span class="c1"># noinspection PyPep8Naming</span>
<span class="kn">import</span> <span class="nn">xml.etree.ElementTree</span> <span class="k">as</span> <span class="nn">ET</span>
<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span>
<span class="kn">import</span> <span class="nn">shutil</span>
<span class="kn">import</span> <span class="nn">copy</span>
<span class="kn">from</span> <span class="nn">inspect</span> <span class="kn">import</span> <span class="n">signature</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">re</span>
<span class="kn">import</span> <span class="nn">pkg_resources</span>
<span class="kn">from</span> <span class="nn">.utils</span> <span class="kn">import</span> <span class="n">set_size</span>
<div class="viewcode-block" id="LLEPE"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE">[docs]</a><span class="k">class</span> <span class="nc">LLEPE</span><span class="p">:</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Liquid-Liquid Extraction Parameter estimator</span>
<span class="sd"> .. note::</span>
<span class="sd"> The order in which the extracted species (ES) appear in the csv file</span>
<span class="sd"> must be the same order as they appear in the xml, complex_names and</span>
<span class="sd"> extracted_species_ion_names.</span>
<span class="sd"> For example, say in exp_data, ES_1 is Nd ES_2 is Pr,</span>
<span class="sd"> and</span>
<span class="sd"> .. code-block:: python</span>
<span class="sd"> aq_solvent_name = &#39;H2O(L)&#39;</span>
<span class="sd"> extractant_name = &#39;(HA)2(org)&#39;</span>
<span class="sd"> diluent_name = &#39;dodecane&#39;</span>
<span class="sd"> Then:</span>
<span class="sd"> The exp_data column ordering must be (names do not matter):</span>
<span class="sd"> [h_i, h_eq, z_i, z_eq, Nd_aq_i, Nd_aq_eq, Nd_d_eq,</span>
<span class="sd"> Pr_aq_i, Pr_aq_eq, Pr_d_eq]</span>
<span class="sd"> The aqueous speciesArray must be</span>
<span class="sd"> &quot;H2O(L) H+ OH- Cl- Nd+++ Pr+++&quot;</span>
<span class="sd"> The organic speciesArray must be</span>
<span class="sd"> &quot;(HA)2(org) dodecane Nd(H(A)2)3(org) Pr(H(A)2)3(org)&quot;</span>
<span class="sd"> .. code-block:: python</span>
<span class="sd"> complex_names = [&#39;Nd(H(A)2)3(org)&#39;, &#39;Pr(H(A)2)3(org)&#39;]</span>
<span class="sd"> extracted_species_ion_names = [&#39;Nd+++&#39;, &#39;Pr+++&#39;]</span>
<span class="sd"> :param exp_data: (str or pd.DataFrame) csv file name</span>
<span class="sd"> or DataFrame with experimental data</span>
<span class="sd"> In the .csv file, the rows are different experiments and</span>
<span class="sd"> columns are the measured quantities.</span>
<span class="sd"> The ordering of the columns needs to be:</span>
<span class="sd"> [h_i, h_eq, z_i, z_eq,</span>
<span class="sd"> {ES_1}_aq_i, {ES_1}_aq_eq, {ES_1}_d_eq,</span>
<span class="sd"> {ES_2}_aq_i, {ES_2}_aq_eq, {ES_2}_d_eq,...</span>
<span class="sd"> {ES_N}_aq_i, {ES_N}_aq_eq, {ES_N}_d_eq]</span>
<span class="sd"> Naming does not matter, just the order.</span>
<span class="sd"> Where {ES_1}-{ES_N} are the extracted species names of interest</span>
<span class="sd"> e.g. Nd, Pr, La, etc.</span>
<span class="sd"> Below is an explanation of the columns.</span>
<span class="sd"> +-------+------------+------------------------------------------+</span>
<span class="sd"> | Index | Column | Meaning |</span>
<span class="sd"> +=======+============+==========================================+</span>
<span class="sd"> | 0 | h_i | Initial Concentration of |</span>
<span class="sd"> | | | H+ ions (mol/L) |</span>
<span class="sd"> +-------+------------+------------------------------------------+</span>
<span class="sd"> | 1 | h_eq | Equilibrium concentration of |</span>
<span class="sd"> | | | H+ ions (mol/L) |</span>
<span class="sd"> +-------+------------+------------------------------------------+</span>
<span class="sd"> | 2 | z_i | Initial concentration of |</span>
<span class="sd"> | | | extractant (mol/L) |</span>
<span class="sd"> +-------+------------+------------------------------------------+</span>
<span class="sd"> | 3 | z_eq | Equilibrium concentration of |</span>
<span class="sd"> | | | extractant (mol/L) |</span>
<span class="sd"> +-------+------------+------------------------------------------+</span>
<span class="sd"> | 4 | {ES}_aq_i | Initial concentration of ES ions (mol/L) |</span>
<span class="sd"> +-------+------------+------------------------------------------+</span>
<span class="sd"> | 5 | {ES}_aq_eq | Equilibrium concentration of ES ions |</span>
<span class="sd"> | | | in aqueous phase (mol/L) |</span>
<span class="sd"> +-------+------------+------------------------------------------+</span>
<span class="sd"> | 6 | {ES}_d_eq | Equilibrium Ratio between amount of |</span>
<span class="sd"> | | | ES atoms in organic to aqueous |</span>
<span class="sd"> +-------+------------+------------------------------------------+</span>
<span class="sd"> :param phases_xml_filename: (str) xml file with parameters</span>
<span class="sd"> for equilibrium calc</span>
<span class="sd"> Would recommend copying and modifying xmls located in data/xmls</span>
<span class="sd"> or in Cantera&#39;s &quot;data&quot; folder</span>
<span class="sd"> speciesArray fields need specific ordering.</span>
<span class="sd"> In aqueous phase: aq_solvent_name, H+, OH-, Cl-, ES_1, ES_2, ..., ES_N</span>
<span class="sd"> (ES_1-ES_N) represent ES ion names e.g. Nd+++, Pr+++</span>
<span class="sd"> In organic phase : extractant_name, diluant_name, ES_1, ES_2, ..., ES_N</span>
<span class="sd"> (ES_1-ES_N) represent ES complex names</span>
<span class="sd"> e.g. Nd(H(A)2)3(org), Pr(H(A)2)3(org)</span>
<span class="sd"> :param phase_names: (list) names of phases in xml file</span>
<span class="sd"> Found in the xml file under &lt;phase ... id={phase_name}&gt;</span>
<span class="sd"> :param aq_solvent_name: (str) name of aqueous solvent in xml file</span>
<span class="sd"> :param extractant_name: (str) name of extractant in xml file</span>
<span class="sd"> :param diluant_name: (str) name of diluant in xml file</span>
<span class="sd"> :param complex_names: (list) names of complexes in xml file.</span>
<span class="sd"> :param extracted_species_ion_names: (list) names of extracted species ions</span>
<span class="sd"> in xml file</span>
<span class="sd"> :param extracted_species_list: (list) names of extracted species elements.</span>
<span class="sd"> If ``None``, extracted_species_list will be extracted_species_ion_names</span>
<span class="sd"> without &#39;+&#39; e.g. &#39;Nd+++&#39;-&gt;&#39;Nd&#39;</span>
<span class="sd"> :param aq_solvent_rho: (float) density of solvent (g/L)</span>
<span class="sd"> If ``None``, molar volume/molecular weight is used from xml</span>
<span class="sd"> :param extractant_rho: (float) density of extractant (g/L)</span>
<span class="sd"> If ``None``, molar volume/molecular weight is used from xml</span>
<span class="sd"> :param diluant_rho: (float) density of diluant (g/L)</span>
<span class="sd"> If ``None``, molar volume/molecular weight is used from xml</span>
<span class="sd"> :param opt_dict: (dict) dictionary containing info about which</span>
<span class="sd"> species parameters are updated to fit model to experimental data</span>
<span class="sd"> Should have the format as below. Dictionary keys under user defined</span>
<span class="sd"> parameter name must be named as shown below (&#39;upper_element_name&#39;,</span>
<span class="sd"> &#39;upper_attrib_name&#39;, etc.). &#39;attrib_name&#39;s and &#39;attrib_value&#39;s can</span>
<span class="sd"> be None. {} denotes areas for user to fill in.</span>
<span class="sd"> .. code-block:: python</span>
<span class="sd"> opt_dict = {&quot;{user_defined_name_for_parameter_1}&quot;:</span>
<span class="sd"> {&#39;upper_element_name&#39;: {param_upper_element},</span>
<span class="sd"> &#39;upper_attrib_name&#39;: {param_upper_attrib_name},</span>
<span class="sd"> &#39;upper_attrib_value&#39;: {param_upper_attrib_value},</span>
<span class="sd"> &#39;lower_element_name&#39;: {param_lower_element},</span>
<span class="sd"> &#39;lower_attrib_name&#39;: {param_lower_attrib_name},</span>
<span class="sd"> &#39;lower_attrib_value&#39;: {param_lower_attrib_value},</span>
<span class="sd"> &#39;input_format&#39;: {str format to input input_value}</span>
<span class="sd"> &#39;input_value&#39;: {guess_value}},</span>
<span class="sd"> &quot;{user_defined_name_for_parameter_2}&quot;:</span>
<span class="sd"> ...</span>
<span class="sd"> ...</span>
<span class="sd"> }</span>
<span class="sd"> See example files for more examples.</span>
<span class="sd"> :param objective_function: (function or str) function to compute objective</span>
<span class="sd"> By default, the objective function is log mean squared error</span>
<span class="sd"> of distribution ratio</span>
<span class="sd"> .. code-block:: python</span>
<span class="sd"> np.sum((np.log10(d_pred)-np.log10(d_meas))^2)</span>
<span class="sd"> Function needs to take inputs:</span>
<span class="sd"> .. code-block:: python</span>
<span class="sd"> objective_function(predicted_dict, measured_df, kwargs)</span>
<span class="sd"> ``kwargs`` is optional</span>
<span class="sd"> Function needs to return: (float) value computed by objective function</span>
<span class="sd"> Below is the guide for referencing predicted values</span>
<span class="sd"> +---------------------------+--------------------------------+</span>
<span class="sd"> | To access | Use |</span>
<span class="sd"> +===========================+================================+</span>
<span class="sd"> | hydrogen ion conc in aq | predicted_dict[&#39;h_eq&#39;] |</span>
<span class="sd"> +---------------------------+--------------------------------+</span>
<span class="sd"> | extractant conc in org | predicted_dict[&#39;z_eq&#39;] |</span>
<span class="sd"> +---------------------------+--------------------------------+</span>
<span class="sd"> | ES ion eq conc in aq | predicted_dict[&#39;{ES}_aq_eq&#39;] |</span>
<span class="sd"> +---------------------------+--------------------------------+</span>
<span class="sd"> | ES complex eq conc in org | predicted_dict[&#39;{ES}_org_eq&#39;] |</span>
<span class="sd"> +---------------------------+--------------------------------+</span>
<span class="sd"> | ES distribution ratio | predicted_dict[&#39;{ES}_d_eq&#39;] |</span>
<span class="sd"> +---------------------------+--------------------------------+</span>
<span class="sd"> Replace &quot;{ES}&quot; with extracted species element e.g. Nd, La, etc.</span>
<span class="sd"> For measured values, use the same names, but</span>
<span class="sd"> replace ``predicted_dict`` with ``measured_df``</span>
<span class="sd"> :param optimizer: (function or str) function to perform optimization</span>
<span class="sd"> .. note::</span>
<span class="sd"> The optimized variables are not directly the species parameters,</span>
<span class="sd"> but instead are first multiplied by the initial guess before</span>
<span class="sd"> sending becoming the species parameters.</span>
<span class="sd"> For example, say</span>
<span class="sd"> .. code-block:: python</span>
<span class="sd"> opt_dict = {&#39;Nd(H(A)2)3(org):&#39;h0&#39;:-4.7e6}</span>
<span class="sd"> If the bounds on h0 need to be [-4.7e7,-4.7e5], then</span>
<span class="sd"> divide the bounds by the guess and get</span>
<span class="sd"> .. code-block:: python</span>
<span class="sd"> &quot;bounds&quot;: [(1e-1, 1e1)]</span>
<span class="sd"> By default, the optimizer is scipy&#39;s optimize function with</span>
<span class="sd"> .. code-block:: python</span>
<span class="sd"> default_kwargs= {&quot;method&quot;: &#39;SLSQP&#39;,</span>
<span class="sd"> &quot;bounds&quot;: [(1e-1, 1e1)] * len(x_guess),</span>
<span class="sd"> &quot;constraints&quot;: (),</span>
<span class="sd"> &quot;options&quot;: {&#39;disp&#39;: True,</span>
<span class="sd"> &#39;maxiter&#39;: 1000,</span>
<span class="sd"> &#39;ftol&#39;: 1e-6}}</span>
<span class="sd"> Function needs to take inputs:</span>
<span class="sd"> ``optimizer(objective_function, x_guess, kwargs)``</span>
<span class="sd"> ``kwargs`` is optional</span>
<span class="sd"> Function needs to return: ((np.ndarray, float)) Optimized parameters,</span>
<span class="sd"> objective_function value</span>
<span class="sd"> :param temp_xml_file_path: (str) path to temporary xml file.</span>
<span class="sd"> This xml file is a duplicate of the phases_xml_file name and is</span>
<span class="sd"> modified during the optimization process to avoid changing the original</span>
<span class="sd"> xml file</span>
<span class="sd"> default is local temp folder</span>
<span class="sd"> :param dependant_params_dict: (dict) dictionary containing information</span>
<span class="sd"> about parameters dependant on opt_dict. Has a similar structure to</span>
<span class="sd"> opt_dict except instead of input values, it has 3 other fields:</span>
<span class="sd"> &#39;function&#39;, &#39;kwargs&#39;, and &#39;independent_params.</span>
<span class="sd"> &#39;function&#39; is a function of the form</span>
<span class="sd"> ``function(independent_param__value_list, custom_objects_dict,</span>
<span class="sd"> **kwargs)``</span>
<span class="sd"> &#39;kwargs&#39; are the extra arguments to pass to function</span>
<span class="sd"> &#39;independent_params&#39; is a list of parameter names in opt_dict that the</span>
<span class="sd"> dependent_param is a function of.</span>
<span class="sd"> &#39;custom_objects_dict&#39; is for accessing the estimator&#39;s internal</span>
<span class="sd"> custom_objects_dict and must be included in the arguments, even if the</span>
<span class="sd"> custom_objects_dict is not set and is None.</span>
<span class="sd"> See example code for usage.</span>
<span class="sd"> :param custom_objects_dict: (dict) dictionary containing custom objects</span>
<span class="sd"> format: {&lt;object_name_string&gt;: &lt;object&gt;,...}</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
<span class="n">exp_data</span><span class="p">,</span>
<span class="n">phases_xml_filename</span><span class="p">,</span>
<span class="n">phase_names</span><span class="p">,</span>
<span class="n">aq_solvent_name</span><span class="p">,</span>
<span class="n">extractant_name</span><span class="p">,</span>
<span class="n">diluant_name</span><span class="p">,</span>
<span class="n">complex_names</span><span class="p">,</span>
<span class="n">extracted_species_ion_names</span><span class="p">,</span>
<span class="n">extracted_species_list</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">aq_solvent_rho</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">extractant_rho</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">diluant_rho</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">opt_dict</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">objective_function</span><span class="o">=</span><span class="s1">&#39;Log-MSE&#39;</span><span class="p">,</span>
<span class="n">optimizer</span><span class="o">=</span><span class="s1">&#39;scipy_minimize&#39;</span><span class="p">,</span>
<span class="n">temp_xml_file_path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">dependant_params_dict</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">custom_objects_dict</span><span class="o">=</span><span class="kc">None</span>
<span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_built_in_obj_list</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;Log-MSE&#39;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_built_in_opt_list</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;scipy_minimize&#39;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_exp_data</span> <span class="o">=</span> <span class="n">exp_data</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_phases_xml_filename</span> <span class="o">=</span> <span class="n">phases_xml_filename</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_opt_dict</span> <span class="o">=</span> <span class="n">opt_dict</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_phase_names</span> <span class="o">=</span> <span class="n">phase_names</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_aq_solvent_name</span> <span class="o">=</span> <span class="n">aq_solvent_name</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_extractant_name</span> <span class="o">=</span> <span class="n">extractant_name</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_diluant_name</span> <span class="o">=</span> <span class="n">diluant_name</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_complex_names</span> <span class="o">=</span> <span class="n">complex_names</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_extracted_species_ion_names</span> <span class="o">=</span> <span class="n">extracted_species_ion_names</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_aq_solvent_rho</span> <span class="o">=</span> <span class="n">aq_solvent_rho</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_extractant_rho</span> <span class="o">=</span> <span class="n">extractant_rho</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_diluant_rho</span> <span class="o">=</span> <span class="n">diluant_rho</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_objective_function</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">set_objective_function</span><span class="p">(</span><span class="n">objective_function</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_optimizer</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_extracted_species_list</span> <span class="o">=</span> <span class="n">extracted_species_list</span>
<span class="bp">self</span><span class="o">.</span><span class="n">set_optimizer</span><span class="p">(</span><span class="n">optimizer</span><span class="p">)</span>
<span class="k">if</span> <span class="n">temp_xml_file_path</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">temp_xml_file_path</span> <span class="o">=</span> <span class="sa">r</span><span class="s1">&#39;</span><span class="si">{0}</span><span class="s1">/temp.xml&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">getenv</span><span class="p">(</span><span class="s1">&#39;TEMP&#39;</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_temp_xml_file_path</span> <span class="o">=</span> <span class="n">temp_xml_file_path</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_dependant_params_dict</span> <span class="o">=</span> <span class="n">dependant_params_dict</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_custom_objects_dict</span> <span class="o">=</span> <span class="n">custom_objects_dict</span>
<span class="c1"># Try and except for adding package data to path.</span>
<span class="c1"># This only works for sdist, not bdist</span>
<span class="c1"># If bdist is needed, research &quot;manifest.in&quot; python setup files</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">shutil</span><span class="o">.</span><span class="n">copyfile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_phases_xml_filename</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_temp_xml_file_path</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_phases</span> <span class="o">=</span> <span class="n">ct</span><span class="o">.</span><span class="n">import_phases</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_phases_xml_filename</span><span class="p">,</span>
<span class="n">phase_names</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">FileNotFoundError</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_phases_xml_filename</span> <span class="o">=</span> \
<span class="n">pkg_resources</span><span class="o">.</span><span class="n">resource_filename</span><span class="p">(</span><span class="s1">&#39;llepe&#39;</span><span class="p">,</span>
<span class="s1">&#39;../data/xmls/</span><span class="si">{0}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">phases_xml_filename</span><span class="p">))</span>
<span class="n">shutil</span><span class="o">.</span><span class="n">copyfile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_phases_xml_filename</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_temp_xml_file_path</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_phases</span> <span class="o">=</span> <span class="n">ct</span><span class="o">.</span><span class="n">import_phases</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_phases_xml_filename</span><span class="p">,</span>
<span class="n">phase_names</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_exp_data</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_exp_df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_csv</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_exp_data</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">FileNotFoundError</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_exp_data</span> <span class="o">=</span> <span class="n">pkg_resources</span><span class="o">.</span><span class="n">resource_filename</span><span class="p">(</span>
<span class="s1">&#39;llepe&#39;</span><span class="p">,</span> <span class="s1">&#39;../data/csvs/</span><span class="si">{0}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_exp_data</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_exp_df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_csv</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_exp_data</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_exp_df</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_exp_data</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_exp_df_columns</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;h_i&#39;</span><span class="p">,</span> <span class="s1">&#39;h_eq&#39;</span><span class="p">,</span> <span class="s1">&#39;z_i&#39;</span><span class="p">,</span> <span class="s1">&#39;z_eq&#39;</span><span class="p">]</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_extracted_species_list</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_extracted_species_list</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_extracted_species_ion_names</span><span class="p">:</span>
<span class="n">species</span> <span class="o">=</span> <span class="n">name</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;+&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_extracted_species_list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">species</span><span class="p">)</span>
<span class="k">for</span> <span class="n">species</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_extracted_species_list</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_exp_df_columns</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{0}</span><span class="s1">_aq_i&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">species</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_exp_df_columns</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{0}</span><span class="s1">_aq_eq&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">species</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_exp_df_columns</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{0}</span><span class="s1">_d_eq&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">species</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_exp_df</span><span class="o">.</span><span class="n">columns</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_exp_df_columns</span>
<span class="k">for</span> <span class="n">species</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_extracted_species_list</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_exp_df</span><span class="p">[</span><span class="s1">&#39;</span><span class="si">{0}</span><span class="s1">_org_eq&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">species</span><span class="p">)]</span> <span class="o">=</span> \
<span class="bp">self</span><span class="o">.</span><span class="n">_exp_df</span><span class="p">[</span><span class="s1">&#39;</span><span class="si">{0}</span><span class="s1">_aq_eq&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">species</span><span class="p">)]</span> \
<span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">_exp_df</span><span class="p">[</span><span class="s1">&#39;</span><span class="si">{0}</span><span class="s1">_d_eq&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">species</span><span class="p">)]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_in_moles</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_aq_ind</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_org_ind</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_extracted_species_charges</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">set_in_moles</span><span class="p">(</span><span class="n">feed_vol</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_predicted_dict</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">update_predicted_dict</span><span class="p">()</span>
<span class="c1"># TODO: move scipy_minimize to optimizers</span>
<div class="viewcode-block" id="LLEPE.scipy_minimize"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.scipy_minimize">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">scipy_minimize</span><span class="p">(</span><span class="n">objective</span><span class="p">,</span> <span class="n">x_guess</span><span class="p">,</span> <span class="n">optimizer_kwargs</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot; The default optimizer for LLEPE</span>
<span class="sd"> Uses scipy.minimize</span>
<span class="sd"> By default, options are</span>
<span class="sd"> .. code-block:: python</span>
<span class="sd"> default_kwargs= {&quot;method&quot;: &#39;SLSQP&#39;,</span>
<span class="sd"> &quot;bounds&quot;: [(1e-1, 1e1)]*len(x_guess),</span>
<span class="sd"> &quot;constraints&quot;: (),</span>
<span class="sd"> &quot;options&quot;: {&#39;disp&#39;: True,</span>
<span class="sd"> &#39;maxiter&#39;: 1000,</span>
<span class="sd"> &#39;ftol&#39;: 1e-6}}</span>
<span class="sd"> :param objective: (func) the objective function</span>
<span class="sd"> :param x_guess: (np.ndarray) the initial guess (always 1)</span>
<span class="sd"> :param optimizer_kwargs: (dict) dictionary of options for minimize</span>
<span class="sd"> :returns: ((np.ndarray, float)) Optimized parameters,</span>
<span class="sd"> objective_function value</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">optimizer_kwargs</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">optimizer_kwargs</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;method&quot;</span><span class="p">:</span> <span class="s1">&#39;SLSQP&#39;</span><span class="p">,</span>
<span class="s2">&quot;bounds&quot;</span><span class="p">:</span> <span class="p">[(</span><span class="mf">1e-1</span><span class="p">,</span> <span class="mf">1e1</span><span class="p">)]</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="n">x_guess</span><span class="p">),</span>
<span class="s2">&quot;constraints&quot;</span><span class="p">:</span> <span class="p">(),</span>
<span class="s2">&quot;options&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s1">&#39;disp&#39;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
<span class="s1">&#39;maxiter&#39;</span><span class="p">:</span> <span class="mi">1000</span><span class="p">,</span>
<span class="s1">&#39;ftol&#39;</span><span class="p">:</span> <span class="mf">1e-6</span><span class="p">}}</span>
<span class="n">res</span> <span class="o">=</span> <span class="n">minimize</span><span class="p">(</span><span class="n">objective</span><span class="p">,</span> <span class="n">x_guess</span><span class="p">,</span> <span class="o">**</span><span class="n">optimizer_kwargs</span><span class="p">)</span>
<span class="n">est_parameters</span> <span class="o">=</span> <span class="n">res</span><span class="o">.</span><span class="n">x</span>
<span class="k">return</span> <span class="n">est_parameters</span><span class="p">,</span> <span class="n">res</span><span class="o">.</span><span class="n">fun</span></div>
<span class="c1"># TODO: move log_mean_squared_error to objectives</span>
<div class="viewcode-block" id="LLEPE.log_mean_squared_error"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.log_mean_squared_error">[docs]</a> <span class="k">def</span> <span class="nf">log_mean_squared_error</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">predicted_dict</span><span class="p">,</span> <span class="n">meas_df</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Default objective function for LLEPE</span>
<span class="sd"> Returns the log mean squared error of</span>
<span class="sd"> predicted distribution ratios (d=n_org/n_aq)</span>
<span class="sd"> to measured d.</span>
<span class="sd"> np.sum((np.log10(d_pred)-np.log10(d_meas))\**2)</span>
<span class="sd"> :param predicted_dict: (dict) contains predicted data</span>
<span class="sd"> :param meas_df: (pd.DataFrame) contains experimental data</span>
<span class="sd"> :return: (float) log mean squared error between predicted and measured</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">meas</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">concatenate</span><span class="p">([</span><span class="n">meas_df</span><span class="p">[</span><span class="s1">&#39;</span><span class="si">{0}</span><span class="s1">_d_eq&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">species</span><span class="p">)]</span><span class="o">.</span><span class="n">values</span>
<span class="k">for</span> <span class="n">species</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_extracted_species_list</span><span class="p">])</span>
<span class="n">pred</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">concatenate</span><span class="p">([</span>
<span class="n">predicted_dict</span><span class="p">[</span><span class="s1">&#39;</span><span class="si">{0}</span><span class="s1">_d_eq&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">species</span><span class="p">)]</span>
<span class="k">for</span> <span class="n">species</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_extracted_species_list</span><span class="p">])</span>
<span class="n">log_pred</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">log10</span><span class="p">(</span><span class="n">pred</span><span class="p">)</span>
<span class="n">log_meas</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">log10</span><span class="p">(</span><span class="n">meas</span><span class="p">)</span>
<span class="n">log_diff</span> <span class="o">=</span> <span class="p">(</span><span class="n">log_pred</span> <span class="o">-</span> <span class="n">log_meas</span><span class="p">)</span> <span class="o">**</span> <span class="mi">2</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">log_diff</span><span class="p">)</span>
<span class="k">return</span> <span class="n">obj</span></div>
<div class="viewcode-block" id="LLEPE.get_exp_df"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.get_exp_df">[docs]</a> <span class="k">def</span> <span class="nf">get_exp_df</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;Returns the experimental DataFrame</span>
<span class="sd"> :return: (pd.DataFrame) Experimental data</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_exp_df</span></div>
<div class="viewcode-block" id="LLEPE.set_exp_df"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.set_exp_df">[docs]</a> <span class="k">def</span> <span class="nf">set_exp_df</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exp_data</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Changes the experimental DataFrame to input exp_csv_filename data</span>
<span class="sd"> and renames columns to internal LLEPE names</span>
<span class="sd"> h_i, h_eq, z_i, z_eq, {ES}_aq_i, {ES}_aq_eq, {ES}_d</span>
<span class="sd"> See class docstring on &quot;exp_csv_filename&quot; for further explanations.</span>
<span class="sd"> :param exp_data: (str or pd.DataFrame)</span>
<span class="sd"> file name/path or DataFrame for experimental data csv</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_exp_data</span> <span class="o">=</span> <span class="n">exp_data</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_exp_data</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_exp_df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_csv</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_exp_data</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">FileNotFoundError</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_exp_data</span> <span class="o">=</span> <span class="n">pkg_resources</span><span class="o">.</span><span class="n">resource_filename</span><span class="p">(</span>
<span class="s1">&#39;llepe&#39;</span><span class="p">,</span> <span class="s1">&#39;../data/csvs/</span><span class="si">{0}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_exp_data</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_exp_df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_csv</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_exp_data</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_exp_df</span> <span class="o">=</span> <span class="n">exp_data</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_exp_df_columns</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;h_i&#39;</span><span class="p">,</span> <span class="s1">&#39;h_eq&#39;</span><span class="p">,</span> <span class="s1">&#39;z_i&#39;</span><span class="p">,</span> <span class="s1">&#39;z_eq&#39;</span><span class="p">]</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_extracted_species_list</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_extracted_species_list</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_extracted_species_ion_names</span><span class="p">:</span>
<span class="n">species</span> <span class="o">=</span> <span class="n">name</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;+&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_extracted_species_list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">species</span><span class="p">)</span>
<span class="k">for</span> <span class="n">species</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_extracted_species_list</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_exp_df_columns</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{0}</span><span class="s1">_aq_i&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">species</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_exp_df_columns</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{0}</span><span class="s1">_aq_eq&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">species</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_exp_df_columns</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{0}</span><span class="s1">_d_eq&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">species</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_exp_df</span><span class="o">.</span><span class="n">columns</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_exp_df_columns</span>
<span class="k">for</span> <span class="n">species</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_extracted_species_list</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_exp_df</span><span class="p">[</span><span class="s1">&#39;</span><span class="si">{0}</span><span class="s1">_org_eq&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">species</span><span class="p">)]</span> <span class="o">=</span> \
<span class="bp">self</span><span class="o">.</span><span class="n">_exp_df</span><span class="p">[</span><span class="s1">&#39;</span><span class="si">{0}</span><span class="s1">_aq_eq&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">species</span><span class="p">)]</span> \
<span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">_exp_df</span><span class="p">[</span><span class="s1">&#39;</span><span class="si">{0}</span><span class="s1">_d_eq&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">species</span><span class="p">)]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">set_in_moles</span><span class="p">(</span><span class="n">feed_vol</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">update_predicted_dict</span><span class="p">()</span>
<span class="k">return</span> <span class="kc">None</span></div>
<div class="viewcode-block" id="LLEPE.get_phases"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.get_phases">[docs]</a> <span class="k">def</span> <span class="nf">get_phases</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Returns the list of Cantera solutions</span>
<span class="sd"> :return: (list) list of Cantera solutions/phases</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_phases</span></div>
<div class="viewcode-block" id="LLEPE.set_phases"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.set_phases">[docs]</a> <span class="k">def</span> <span class="nf">set_phases</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">phases_xml_filename</span><span class="p">,</span> <span class="n">phase_names</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Change list of Cantera solutions by inputting</span>
<span class="sd"> new xml file name and phase names</span>
<span class="sd"> Also runs set_in_moles to set feed volume to 1 L</span>
<span class="sd"> :param phases_xml_filename: (str) xml file with parameters</span>
<span class="sd"> for equilibrium calc</span>
<span class="sd"> :param phase_names: (list) names of phases in xml file</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_phases_xml_filename</span> <span class="o">=</span> <span class="n">phases_xml_filename</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_phase_names</span> <span class="o">=</span> <span class="n">phase_names</span>
<span class="c1"># Try and except for adding package data to path.</span>
<span class="c1"># This only works for sdist, not bdist</span>
<span class="c1"># If bdist is needed, research &quot;manifest.in&quot; python setup files</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">shutil</span><span class="o">.</span><span class="n">copyfile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_phases_xml_filename</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_temp_xml_file_path</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_phases</span> <span class="o">=</span> <span class="n">ct</span><span class="o">.</span><span class="n">import_phases</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_phases_xml_filename</span><span class="p">,</span>
<span class="n">phase_names</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">FileNotFoundError</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_phases_xml_filename</span> <span class="o">=</span> \
<span class="n">pkg_resources</span><span class="o">.</span><span class="n">resource_filename</span><span class="p">(</span><span class="s1">&#39;llepe&#39;</span><span class="p">,</span>
<span class="s1">&#39;../data/xmls/</span><span class="si">{0}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">phases_xml_filename</span><span class="p">))</span>
<span class="n">shutil</span><span class="o">.</span><span class="n">copyfile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_phases_xml_filename</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_temp_xml_file_path</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_phases</span> <span class="o">=</span> <span class="n">ct</span><span class="o">.</span><span class="n">import_phases</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_phases_xml_filename</span><span class="p">,</span>
<span class="n">phase_names</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">set_in_moles</span><span class="p">(</span><span class="n">feed_vol</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">update_predicted_dict</span><span class="p">()</span>
<span class="k">return</span> <span class="kc">None</span></div>
<div class="viewcode-block" id="LLEPE.get_opt_dict"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.get_opt_dict">[docs]</a> <span class="k">def</span> <span class="nf">get_opt_dict</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Returns the dictionary containing optimization information</span>
<span class="sd"> :return: (dict) dictionary containing info about which</span>
<span class="sd"> species parameters are updated to fit model to experimental data</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_opt_dict</span></div>
<div class="viewcode-block" id="LLEPE.set_opt_dict"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.set_opt_dict">[docs]</a> <span class="k">def</span> <span class="nf">set_opt_dict</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">opt_dict</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Change the dictionary to input opt_dict.</span>
<span class="sd"> opt_dict specifies species parameters to be updated to</span>
<span class="sd"> fit model to data</span>
<span class="sd"> See class docstring on &quot;opt_dict&quot; for more information.</span>
<span class="sd"> :param opt_dict: (dict) dictionary containing info about which</span>
<span class="sd"> species parameters are updated to fit model to experimental data</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_opt_dict</span> <span class="o">=</span> <span class="n">opt_dict</span>
<span class="k">return</span> <span class="kc">None</span></div>
<div class="viewcode-block" id="LLEPE.get_aq_solvent_name"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.get_aq_solvent_name">[docs]</a> <span class="k">def</span> <span class="nf">get_aq_solvent_name</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;Returns aq_solvent_name</span>
<span class="sd"> :return: aq_solvent_name: (str) name of aqueous solvent in xml file</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_aq_solvent_name</span></div>
<div class="viewcode-block" id="LLEPE.set_aq_solvent_name"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.set_aq_solvent_name">[docs]</a> <span class="k">def</span> <span class="nf">set_aq_solvent_name</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">aq_solvent_name</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot; Change aq_solvent_name to input aq_solvent_name</span>
<span class="sd"> :param aq_solvent_name: (str) name of aqueous solvent in xml file</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_aq_solvent_name</span> <span class="o">=</span> <span class="n">aq_solvent_name</span>
<span class="k">return</span> <span class="kc">None</span></div>
<div class="viewcode-block" id="LLEPE.get_extractant_name"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.get_extractant_name">[docs]</a> <span class="k">def</span> <span class="nf">get_extractant_name</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;Returns extractant name</span>
<span class="sd"> :return: extractant_name: (str) name of extractant in xml file</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_extractant_name</span></div>
<div class="viewcode-block" id="LLEPE.set_extractant_name"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.set_extractant_name">[docs]</a> <span class="k">def</span> <span class="nf">set_extractant_name</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">extractant_name</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Change extractant_name to input extractant_name</span>
<span class="sd"> :param extractant_name: (str) name of extractant in xml file</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_extractant_name</span> <span class="o">=</span> <span class="n">extractant_name</span>
<span class="k">return</span> <span class="kc">None</span></div>
<div class="viewcode-block" id="LLEPE.get_diluant_name"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.get_diluant_name">[docs]</a> <span class="k">def</span> <span class="nf">get_diluant_name</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot; Returns diluant name</span>
<span class="sd"> :return: diluant_name: (str) name of diluant in xml file</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_diluant_name</span></div>
<div class="viewcode-block" id="LLEPE.set_diluant_name"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.set_diluant_name">[docs]</a> <span class="k">def</span> <span class="nf">set_diluant_name</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">diluant_name</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Change diluant_name to input diluant_name</span>
<span class="sd"> :param diluant_name: (str) name of diluant in xml file</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_diluant_name</span> <span class="o">=</span> <span class="n">diluant_name</span>
<span class="k">return</span> <span class="kc">None</span></div>
<div class="viewcode-block" id="LLEPE.get_complex_names"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.get_complex_names">[docs]</a> <span class="k">def</span> <span class="nf">get_complex_names</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;Returns list of complex names</span>
<span class="sd"> :return: complex_names: (list) names of complexes in xml file.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_complex_names</span></div>
<div class="viewcode-block" id="LLEPE.set_complex_names"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.set_complex_names">[docs]</a> <span class="k">def</span> <span class="nf">set_complex_names</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">complex_names</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Change complex names list to input complex_names</span>
<span class="sd"> :param complex_names: (list) names of complexes in xml file.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_complex_names</span> <span class="o">=</span> <span class="n">complex_names</span>
<span class="k">return</span> <span class="kc">None</span></div>
<div class="viewcode-block" id="LLEPE.get_extracted_species_ion_names"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.get_extracted_species_ion_names">[docs]</a> <span class="k">def</span> <span class="nf">get_extracted_species_ion_names</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;Returns list of extracted species ion names</span>
<span class="sd"> :return: extracted_species_ion_names: (list) names of</span>
<span class="sd"> extracted species ions in xml file</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_extracted_species_ion_names</span></div>
<div class="viewcode-block" id="LLEPE.set_extracted_species_ion_names"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.set_extracted_species_ion_names">[docs]</a> <span class="k">def</span> <span class="nf">set_extracted_species_ion_names</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">extracted_species_ion_names</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Change list of extracted species ion names to input</span>
<span class="sd"> extracted_species_ion_names</span>
<span class="sd"> :param extracted_species_ion_names: (list) names of extracted species</span>
<span class="sd"> ions in xml file</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_extracted_species_ion_names</span> <span class="o">=</span> <span class="n">extracted_species_ion_names</span>
<span class="k">return</span> <span class="kc">None</span></div>
<div class="viewcode-block" id="LLEPE.get_extracted_species_list"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.get_extracted_species_list">[docs]</a> <span class="k">def</span> <span class="nf">get_extracted_species_list</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;Returns list of extracted species names</span>
<span class="sd"> :return: extracted_species_list: (list) names of extracted species in</span>
<span class="sd"> xml file</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_extracted_species_list</span></div>
<div class="viewcode-block" id="LLEPE.set_extracted_species_list"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.set_extracted_species_list">[docs]</a> <span class="k">def</span> <span class="nf">set_extracted_species_list</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">extracted_species_list</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Change list of extracted species ion names to input</span>
<span class="sd"> extracted_species_ion_names</span>
<span class="sd"> :param extracted_species_list: (list) names of extracted species in</span>
<span class="sd"> xml file</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_extracted_species_list</span> <span class="o">=</span> <span class="n">extracted_species_list</span>
<span class="k">return</span> <span class="kc">None</span></div>
<div class="viewcode-block" id="LLEPE.get_aq_solvent_rho"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.get_aq_solvent_rho">[docs]</a> <span class="k">def</span> <span class="nf">get_aq_solvent_rho</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;Returns aqueous solvent density (g/L)</span>
<span class="sd"> :return: aq_solvent_rho: (float) density of aqueous solvent</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_aq_solvent_rho</span></div>
<div class="viewcode-block" id="LLEPE.set_aq_solvent_rho"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.set_aq_solvent_rho">[docs]</a> <span class="k">def</span> <span class="nf">set_aq_solvent_rho</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">aq_solvent_rho</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Changes aqueous solvent density (g/L) to input aq_solvent_rho</span>
<span class="sd"> :param aq_solvent_rho: (float) density of aqueous solvent</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_aq_solvent_rho</span> <span class="o">=</span> <span class="n">aq_solvent_rho</span>
<span class="k">return</span> <span class="kc">None</span></div>
<div class="viewcode-block" id="LLEPE.get_extractant_rho"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.get_extractant_rho">[docs]</a> <span class="k">def</span> <span class="nf">get_extractant_rho</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;Returns extractant density (g/L)</span>
<span class="sd"> :return: extractant_rho: (float) density of extractant</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_extractant_rho</span></div>
<div class="viewcode-block" id="LLEPE.set_extractant_rho"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.set_extractant_rho">[docs]</a> <span class="k">def</span> <span class="nf">set_extractant_rho</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">extractant_rho</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Changes extractant density (g/L) to input extractant_rho</span>
<span class="sd"> :param extractant_rho: (float) density of extractant</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_extractant_rho</span> <span class="o">=</span> <span class="n">extractant_rho</span>
<span class="k">return</span> <span class="kc">None</span></div>
<div class="viewcode-block" id="LLEPE.get_diluant_rho"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.get_diluant_rho">[docs]</a> <span class="k">def</span> <span class="nf">get_diluant_rho</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;Returns diluant density (g/L)</span>
<span class="sd"> :return: diluant_rho: (float) density of diluant</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_diluant_rho</span></div>
<div class="viewcode-block" id="LLEPE.set_diluant_rho"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.set_diluant_rho">[docs]</a> <span class="k">def</span> <span class="nf">set_diluant_rho</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">diluant_rho</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Changes diluant density (g/L) to input diluant_rho</span>
<span class="sd"> :param diluant_rho: (float) density of diluant</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_diluant_rho</span> <span class="o">=</span> <span class="n">diluant_rho</span>
<span class="k">return</span> <span class="kc">None</span></div>
<span class="c1"># TODO: Change input DataFrame structure to contain information about</span>
<span class="c1"># other species like NaCl</span>
<span class="c1"># TODO: Change DataFrame structure to contain info about O/A ratio</span>
<span class="c1"># TODO: Generalize code to more than just org and aq phase (3+ phases)</span>
<span class="c1"># TODO: Handle multiple electrolytes ie. NO3- with Cl-</span>
<div class="viewcode-block" id="LLEPE.set_in_moles"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.set_in_moles">[docs]</a> <span class="k">def</span> <span class="nf">set_in_moles</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">feed_vol</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Function that initializes mole fractions to input feed_vol</span>
<span class="sd"> This function is called at initialization</span>
<span class="sd"> Sets in_moles to a pd.DataFrame containing initial mole fractions</span>
<span class="sd"> Columns for species and rows for different experiments</span>
<span class="sd"> This function also calls update_predicted_dict</span>
<span class="sd"> :param feed_vol: (float) feed volume of mixture (L)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">phases_copy</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_phases</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<span class="n">exp_df</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_exp_df</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<span class="n">solvent_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_aq_solvent_name</span>
<span class="n">extractant_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_extractant_name</span>
<span class="n">diluant_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_diluant_name</span>
<span class="n">solvent_rho</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_aq_solvent_rho</span>
<span class="n">extractant_rho</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_extractant_rho</span>
<span class="n">diluant_rho</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_diluant_rho</span>
<span class="n">extracted_species_names</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_extracted_species_ion_names</span>
<span class="n">extracted_species_list</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_extracted_species_list</span>
<span class="n">mixed</span> <span class="o">=</span> <span class="n">ct</span><span class="o">.</span><span class="n">Mixture</span><span class="p">(</span><span class="n">phases_copy</span><span class="p">)</span>
<span class="n">aq_ind</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">solvent_ind</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">for</span> <span class="n">ind</span><span class="p">,</span> <span class="n">phase</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">phases_copy</span><span class="p">):</span>
<span class="k">if</span> <span class="n">solvent_name</span> <span class="ow">in</span> <span class="n">phase</span><span class="o">.</span><span class="n">species_names</span><span class="p">:</span>
<span class="n">aq_ind</span> <span class="o">=</span> <span class="n">ind</span>
<span class="n">solvent_ind</span> <span class="o">=</span> <span class="n">phase</span><span class="o">.</span><span class="n">species_names</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">solvent_name</span><span class="p">)</span>
<span class="k">if</span> <span class="n">aq_ind</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s1">&#39;Solvent &quot;</span><span class="si">{0}</span><span class="s1">&quot; not found </span><span class="se">\</span>
<span class="s1"> in xml file&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">solvent_name</span><span class="p">))</span>
<span class="k">if</span> <span class="n">aq_ind</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">org_ind</span> <span class="o">=</span> <span class="mi">1</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">org_ind</span> <span class="o">=</span> <span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_aq_ind</span> <span class="o">=</span> <span class="n">aq_ind</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_org_ind</span> <span class="o">=</span> <span class="n">org_ind</span>
<span class="n">extractant_ind</span> <span class="o">=</span> <span class="n">phases_copy</span><span class="p">[</span><span class="n">org_ind</span><span class="p">]</span><span class="o">.</span><span class="n">species_names</span><span class="o">.</span><span class="n">index</span><span class="p">(</span>
<span class="n">extractant_name</span><span class="p">)</span>
<span class="n">diluant_ind</span> <span class="o">=</span> <span class="n">phases_copy</span><span class="p">[</span><span class="n">org_ind</span><span class="p">]</span><span class="o">.</span><span class="n">species_names</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">diluant_name</span><span class="p">)</span>
<span class="n">extracted_species_ind_list</span> <span class="o">=</span> <span class="p">[</span><span class="n">phases_copy</span><span class="p">[</span><span class="n">aq_ind</span><span class="p">]</span><span class="o">.</span><span class="n">species_names</span><span class="o">.</span><span class="n">index</span><span class="p">(</span>
<span class="n">extracted_species_name</span><span class="p">)</span>
<span class="k">for</span> <span class="n">extracted_species_name</span> <span class="ow">in</span> <span class="n">extracted_species_names</span><span class="p">]</span>
<span class="n">extracted_species_charges</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span>
<span class="p">[</span><span class="n">phases_copy</span><span class="p">[</span><span class="n">aq_ind</span><span class="p">]</span><span class="o">.</span><span class="n">species</span><span class="p">(</span>
<span class="n">extracted_species_ind</span><span class="p">)</span><span class="o">.</span><span class="n">charge</span>
<span class="k">for</span> <span class="n">extracted_species_ind</span> <span class="ow">in</span> <span class="n">extracted_species_ind_list</span><span class="p">])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_extracted_species_charges</span> <span class="o">=</span> <span class="n">extracted_species_charges</span>
<span class="n">mix_aq</span> <span class="o">=</span> <span class="n">mixed</span><span class="o">.</span><span class="n">phase</span><span class="p">(</span><span class="n">aq_ind</span><span class="p">)</span>
<span class="n">mix_org</span> <span class="o">=</span> <span class="n">mixed</span><span class="o">.</span><span class="n">phase</span><span class="p">(</span><span class="n">org_ind</span><span class="p">)</span>
<span class="n">solvent_mw</span> <span class="o">=</span> <span class="n">mix_aq</span><span class="o">.</span><span class="n">molecular_weights</span><span class="p">[</span><span class="n">solvent_ind</span><span class="p">]</span> <span class="c1"># g/mol</span>
<span class="n">extractant_mw</span> <span class="o">=</span> <span class="n">mix_org</span><span class="o">.</span><span class="n">molecular_weights</span><span class="p">[</span><span class="n">extractant_ind</span><span class="p">]</span>
<span class="n">diluant_mw</span> <span class="o">=</span> <span class="n">mix_org</span><span class="o">.</span><span class="n">molecular_weights</span><span class="p">[</span><span class="n">diluant_ind</span><span class="p">]</span>
<span class="k">if</span> <span class="n">solvent_rho</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">solvent_rho</span> <span class="o">=</span> <span class="n">mix_aq</span><span class="p">(</span><span class="n">aq_ind</span><span class="p">)</span><span class="o">.</span><span class="n">partial_molar_volumes</span><span class="p">[</span>
<span class="n">solvent_ind</span><span class="p">]</span> <span class="o">/</span> <span class="n">solvent_mw</span> <span class="o">*</span> <span class="mf">1e6</span> <span class="c1"># g/L</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_aq_solvent_rho</span> <span class="o">=</span> <span class="n">solvent_rho</span>
<span class="k">if</span> <span class="n">extractant_rho</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">extractant_rho</span> <span class="o">=</span> <span class="n">mix_org</span><span class="p">(</span><span class="n">org_ind</span><span class="p">)</span><span class="o">.</span><span class="n">partial_molar_volumes</span><span class="p">[</span>
<span class="n">extractant_ind</span><span class="p">]</span> <span class="o">/</span> <span class="n">extractant_mw</span> <span class="o">*</span> <span class="mf">1e6</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_extractant_rho</span> <span class="o">=</span> <span class="n">extractant_rho</span>
<span class="k">if</span> <span class="n">diluant_rho</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">diluant_rho</span> <span class="o">=</span> <span class="n">mix_org</span><span class="p">(</span><span class="n">org_ind</span><span class="p">)</span><span class="o">.</span><span class="n">partial_molar_volumes</span><span class="p">[</span>
<span class="n">extractant_ind</span><span class="p">]</span> <span class="o">/</span> <span class="n">extractant_mw</span> <span class="o">*</span> <span class="mf">1e6</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_diluant_rho</span> <span class="o">=</span> <span class="n">diluant_rho</span>
<span class="n">in_moles_data</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">aq_phase_solvent_moles</span> <span class="o">=</span> <span class="n">feed_vol</span> <span class="o">*</span> <span class="n">solvent_rho</span> <span class="o">/</span> <span class="n">solvent_mw</span>
<span class="k">for</span> <span class="n">index</span><span class="p">,</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">exp_df</span><span class="o">.</span><span class="n">iterrows</span><span class="p">():</span>
<span class="n">h_plus_moles</span> <span class="o">=</span> <span class="n">feed_vol</span> <span class="o">*</span> <span class="n">row</span><span class="p">[</span><span class="s1">&#39;h_i&#39;</span><span class="p">]</span>
<span class="n">hydroxide_ions</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">extracted_species_moles</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span>
<span class="p">[</span><span class="n">feed_vol</span> <span class="o">*</span> <span class="n">row</span><span class="p">[</span><span class="s1">&#39;</span><span class="si">{0}</span><span class="s1">_aq_i&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">extracted_species</span><span class="p">)]</span>
<span class="k">for</span> <span class="n">extracted_species</span> <span class="ow">in</span> <span class="n">extracted_species_list</span><span class="p">])</span>
<span class="n">extracted_species_charge_sum</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span>
<span class="n">extracted_species_charges</span> <span class="o">*</span> <span class="n">extracted_species_moles</span><span class="p">)</span>
<span class="n">anion_moles</span> <span class="o">=</span> <span class="n">extracted_species_charge_sum</span> <span class="o">+</span> <span class="n">h_plus_moles</span>
<span class="c1"># TODO: Replace feed_vol in line 785 and line 787 with</span>
<span class="c1"># row[&#39;oa_ratio&#39;]*feed_vol (oa_ratio from restructured DataFrame)</span>
<span class="n">extractant_moles</span> <span class="o">=</span> <span class="n">feed_vol</span> <span class="o">*</span> <span class="n">row</span><span class="p">[</span><span class="s1">&#39;z_i&#39;</span><span class="p">]</span>
<span class="n">extractant_vol</span> <span class="o">=</span> <span class="n">extractant_moles</span> <span class="o">*</span> <span class="n">extractant_mw</span> <span class="o">/</span> <span class="n">extractant_rho</span>
<span class="n">diluant_vol</span> <span class="o">=</span> <span class="n">feed_vol</span> <span class="o">-</span> <span class="n">extractant_vol</span>
<span class="n">diluant_moles</span> <span class="o">=</span> <span class="n">diluant_vol</span> <span class="o">*</span> <span class="n">diluant_rho</span> <span class="o">/</span> <span class="n">diluant_mw</span>
<span class="n">complex_moles</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">extracted_species_list</span><span class="p">))</span>
<span class="n">species_moles_aq</span> <span class="o">=</span> <span class="p">[</span><span class="n">aq_phase_solvent_moles</span><span class="p">,</span>
<span class="n">h_plus_moles</span><span class="p">,</span>
<span class="n">hydroxide_ions</span><span class="p">,</span>
<span class="n">anion_moles</span><span class="p">]</span>
<span class="n">species_moles_aq</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">extracted_species_moles</span><span class="p">))</span>
<span class="n">species_moles_org</span> <span class="o">=</span> <span class="p">[</span><span class="n">extractant_moles</span><span class="p">,</span> <span class="n">diluant_moles</span><span class="p">]</span>
<span class="n">species_moles_org</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">complex_moles</span><span class="p">))</span>
<span class="k">if</span> <span class="n">aq_ind</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">species_moles</span> <span class="o">=</span> <span class="n">species_moles_aq</span> <span class="o">+</span> <span class="n">species_moles_org</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">species_moles</span> <span class="o">=</span> <span class="n">species_moles_org</span> <span class="o">+</span> <span class="n">species_moles_aq</span>
<span class="n">in_moles_data</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">species_moles</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_in_moles</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">(</span>
<span class="n">in_moles_data</span><span class="p">,</span> <span class="n">columns</span><span class="o">=</span><span class="n">mixed</span><span class="o">.</span><span class="n">species_names</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">update_predicted_dict</span><span class="p">()</span>
<span class="k">return</span> <span class="kc">None</span></div>
<div class="viewcode-block" id="LLEPE.get_in_moles"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.get_in_moles">[docs]</a> <span class="k">def</span> <span class="nf">get_in_moles</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;Returns the in_moles DataFrame which contains the initial mole</span>
<span class="sd"> fractions of each species for each experiment</span>
<span class="sd"> :return: in_moles: (pd.DataFrame) DataFrame with initial mole fractions</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_in_moles</span></div>
<div class="viewcode-block" id="LLEPE.set_objective_function"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.set_objective_function">[docs]</a> <span class="k">def</span> <span class="nf">set_objective_function</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">objective_function</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Change objective function to input objective_function.</span>
<span class="sd"> See class docstring on &quot;objective_function&quot; for instructions</span>
<span class="sd"> :param objective_function: (func) Objective function to quantify</span>
<span class="sd"> error between model and experimental data</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">callable</span><span class="p">(</span><span class="n">objective_function</span><span class="p">)</span> \
<span class="ow">and</span> <span class="n">objective_function</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_built_in_obj_list</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span>
<span class="s2">&quot;objective_function must be a function &quot;</span>
<span class="s2">&quot;or in this strings list: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_built_in_obj_list</span><span class="p">))</span>
<span class="k">if</span> <span class="n">callable</span><span class="p">(</span><span class="n">objective_function</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">signature</span><span class="p">(</span><span class="n">objective_function</span><span class="p">)</span><span class="o">.</span><span class="n">parameters</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span>
<span class="s2">&quot;objective_function must be a function &quot;</span>
<span class="s2">&quot;with at least 3 arguments:&quot;</span>
<span class="s2">&quot; f(predicted_dict, experimental_df, kwargs)&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">objective_function</span> <span class="o">==</span> <span class="s1">&#39;Log-MSE&#39;</span><span class="p">:</span>
<span class="n">objective_function</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">log_mean_squared_error</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_objective_function</span> <span class="o">=</span> <span class="n">objective_function</span>
<span class="k">return</span> <span class="kc">None</span></div>
<div class="viewcode-block" id="LLEPE.get_objective_function"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.get_objective_function">[docs]</a> <span class="k">def</span> <span class="nf">get_objective_function</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Returns objective function</span>
<span class="sd"> :return: objective_function: (func) Objective function to quantify</span>
<span class="sd"> error between model and experimental data</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_objective_function</span></div>
<div class="viewcode-block" id="LLEPE.set_optimizer"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.set_optimizer">[docs]</a> <span class="k">def</span> <span class="nf">set_optimizer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">optimizer</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Change optimizer function to input optimizer.</span>
<span class="sd"> See class docstring on &quot;optimizer&quot; for instructions</span>
<span class="sd"> :param optimizer: (func) Optimizer function to minimize objective</span>
<span class="sd"> function</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">callable</span><span class="p">(</span><span class="n">optimizer</span><span class="p">)</span> \
<span class="ow">and</span> <span class="n">optimizer</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_built_in_opt_list</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span>
<span class="s2">&quot;optimizer must be a function &quot;</span>
<span class="s2">&quot;or in this strings list: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_built_in_opt_list</span><span class="p">))</span>
<span class="k">if</span> <span class="n">callable</span><span class="p">(</span><span class="n">optimizer</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">signature</span><span class="p">(</span><span class="n">optimizer</span><span class="p">)</span><span class="o">.</span><span class="n">parameters</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span>
<span class="s2">&quot;optimizer must be a function &quot;</span>
<span class="s2">&quot;with at least 2 arguments: &quot;</span>
<span class="s2">&quot;f(objective_func,x_guess, kwargs)&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">optimizer</span> <span class="o">==</span> <span class="s1">&#39;scipy_minimize&#39;</span><span class="p">:</span>
<span class="n">optimizer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">scipy_minimize</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_optimizer</span> <span class="o">=</span> <span class="n">optimizer</span>
<span class="k">return</span> <span class="kc">None</span></div>
<div class="viewcode-block" id="LLEPE.get_optimizer"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.get_optimizer">[docs]</a> <span class="k">def</span> <span class="nf">get_optimizer</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Returns objective function</span>
<span class="sd"> :return: optimizer: (func) Optimizer function to minimize objective</span>
<span class="sd"> function</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_optimizer</span></div>
<div class="viewcode-block" id="LLEPE.get_temp_xml_file_path"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.get_temp_xml_file_path">[docs]</a> <span class="k">def</span> <span class="nf">get_temp_xml_file_path</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Returns path to temporary xml file.</span>
<span class="sd"> This xml file is a duplicate of the phases_xml_file name and is</span>
<span class="sd"> modified during the optimization process to avoid changing the original</span>
<span class="sd"> xml file.</span>
<span class="sd"> :return: temp_xml_file_path: (str) path to temporary xml file.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_temp_xml_file_path</span></div>
<div class="viewcode-block" id="LLEPE.set_temp_xml_file_path"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.set_temp_xml_file_path">[docs]</a> <span class="k">def</span> <span class="nf">set_temp_xml_file_path</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">temp_xml_file_path</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Changes temporary xml file path to input temp_xml_file_path.</span>
<span class="sd"> This xml file is a duplicate of the phases_xml_file name and is</span>
<span class="sd"> modified during the optimization process to avoid changing the original</span>
<span class="sd"> xml file.</span>
<span class="sd"> :param temp_xml_file_path: (str) path to temporary xml file.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_temp_xml_file_path</span> <span class="o">=</span> <span class="n">temp_xml_file_path</span>
<span class="k">return</span> <span class="kc">None</span></div>
<div class="viewcode-block" id="LLEPE.get_dependant_params_dict"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.get_dependant_params_dict">[docs]</a> <span class="k">def</span> <span class="nf">get_dependant_params_dict</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Returns the dependant_params_dict</span>
<span class="sd"> :return: dependant_params_dict: (dict) dictionary containing</span>
<span class="sd"> information about parameters dependant on opt_dict</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_dependant_params_dict</span></div>
<div class="viewcode-block" id="LLEPE.set_dependant_params_dict"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.set_dependant_params_dict">[docs]</a> <span class="k">def</span> <span class="nf">set_dependant_params_dict</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dependant_params_dict</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Sets the dependant_params_dict</span>
<span class="sd"> :param dependant_params_dict: (dict) dictionary containing information</span>
<span class="sd"> about parameters dependant on opt_dict</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_dependant_params_dict</span> <span class="o">=</span> <span class="n">dependant_params_dict</span>
<span class="k">return</span> <span class="kc">None</span></div>
<div class="viewcode-block" id="LLEPE.get_custom_objects_dict"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.get_custom_objects_dict">[docs]</a> <span class="k">def</span> <span class="nf">get_custom_objects_dict</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Returns the custom_objects_dict</span>
<span class="sd"> :return: custom_objects_dict: (dict) dictionary containing</span>
<span class="sd"> information about custom objects from user</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_custom_objects_dict</span></div>
<div class="viewcode-block" id="LLEPE.set_custom_objects_dict"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.set_custom_objects_dict">[docs]</a> <span class="k">def</span> <span class="nf">set_custom_objects_dict</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">custom_objects_dict</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Sets the custom_objects_dict</span>
<span class="sd"> :param custom_objects_dict: (dict) dictionary containing information</span>
<span class="sd"> about about custom objects from user</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_custom_objects_dict</span> <span class="o">=</span> <span class="n">custom_objects_dict</span>
<span class="k">return</span> <span class="kc">None</span></div>
<span class="c1"># TODO: Change DataFrame structure to contain info whether to set</span>
<span class="c1"># equilibrium pH to measured value. Will be useful for saponification</span>
<span class="c1"># TODO: Find way to add saponification to model.</span>
<span class="c1"># Maybe use fsolve to match experimental equilibrium pH</span>
<div class="viewcode-block" id="LLEPE.update_predicted_dict"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.update_predicted_dict">[docs]</a> <span class="k">def</span> <span class="nf">update_predicted_dict</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
<span class="n">phases_xml_filename</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">phase_names</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Function that computes the predicted equilibrium concentrations</span>
<span class="sd"> the fed phases_xml_filename parameters predicts given the initial</span>
<span class="sd"> mole fractions set by in_moles()</span>
<span class="sd"> :param phases_xml_filename: (str)xml file with parameters</span>
<span class="sd"> for equilibrium calc. If ``None``, the</span>
<span class="sd"> current phases_xml_filename is used.</span>
<span class="sd"> :param phase_names: (list) names of phases in xml file.</span>
<span class="sd"> If ``None``, the current phases_names is used.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">phases_xml_filename</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">phases_xml_filename</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_phases_xml_filename</span>
<span class="k">if</span> <span class="n">phase_names</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">phase_names</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_phase_names</span>
<span class="n">aq_ind</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_aq_ind</span>
<span class="n">org_ind</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_org_ind</span>
<span class="n">complex_names</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_complex_names</span>
<span class="n">extractant_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_extractant_name</span>
<span class="n">extracted_species_ion_names</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_extracted_species_ion_names</span>
<span class="n">in_moles</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_in_moles</span>
<span class="n">extracted_species_list</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_extracted_species_list</span>
<span class="n">phases_copy</span> <span class="o">=</span> <span class="n">ct</span><span class="o">.</span><span class="n">import_phases</span><span class="p">(</span><span class="n">phases_xml_filename</span><span class="p">,</span> <span class="n">phase_names</span><span class="p">)</span>
<span class="n">mix</span> <span class="o">=</span> <span class="n">ct</span><span class="o">.</span><span class="n">Mixture</span><span class="p">(</span><span class="n">phases_copy</span><span class="p">)</span>
<span class="n">key_names</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;h_eq&#39;</span><span class="p">,</span> <span class="s1">&#39;z_eq&#39;</span><span class="p">]</span>
<span class="k">for</span> <span class="n">extracted_species</span> <span class="ow">in</span> <span class="n">extracted_species_list</span><span class="p">:</span>
<span class="n">key_names</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{0}</span><span class="s1">_aq_eq&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">extracted_species</span><span class="p">))</span>
<span class="n">key_names</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{0}</span><span class="s1">_org_eq&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">extracted_species</span><span class="p">))</span>
<span class="n">key_names</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{0}</span><span class="s1">_d_eq&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">extracted_species</span><span class="p">))</span>
<span class="n">predicted_dict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;</span><span class="si">{0}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">key_name</span><span class="p">):</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">key_name</span> <span class="ow">in</span> <span class="n">key_names</span><span class="p">}</span>
<span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">in_moles</span><span class="o">.</span><span class="n">values</span><span class="p">:</span>
<span class="n">mix</span><span class="o">.</span><span class="n">species_moles</span> <span class="o">=</span> <span class="n">row</span>
<span class="n">mix</span><span class="o">.</span><span class="n">equilibrate</span><span class="p">(</span><span class="s1">&#39;TP&#39;</span><span class="p">,</span> <span class="n">log_level</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
<span class="n">extracted_species_org_array</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span>
<span class="p">[</span><span class="n">mix</span><span class="o">.</span><span class="n">species_moles</span><span class="p">[</span><span class="n">mix</span><span class="o">.</span><span class="n">species_index</span><span class="p">(</span>
<span class="n">org_ind</span><span class="p">,</span> <span class="n">complex_name</span><span class="p">)]</span> <span class="k">for</span> <span class="n">complex_name</span> <span class="ow">in</span> <span class="n">complex_names</span><span class="p">])</span>
<span class="n">extracted_species_aq_array</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span>
<span class="p">[</span><span class="n">mix</span><span class="o">.</span><span class="n">species_moles</span><span class="p">[</span><span class="n">mix</span><span class="o">.</span><span class="n">species_index</span><span class="p">(</span>
<span class="n">aq_ind</span><span class="p">,</span>
<span class="n">extracted_species_ion_name</span><span class="p">)]</span> <span class="k">for</span> <span class="n">extracted_species_ion_name</span>
<span class="ow">in</span> <span class="n">extracted_species_ion_names</span><span class="p">])</span>
<span class="n">d_array</span> <span class="o">=</span> <span class="n">extracted_species_org_array</span> <span class="o">/</span> <span class="n">extracted_species_aq_array</span>
<span class="n">hydrogen_ions</span> <span class="o">=</span> <span class="n">mix</span><span class="o">.</span><span class="n">species_moles</span><span class="p">[</span><span class="n">mix</span><span class="o">.</span><span class="n">species_index</span><span class="p">(</span><span class="n">aq_ind</span><span class="p">,</span> <span class="s1">&#39;H+&#39;</span><span class="p">)]</span>
<span class="n">extractant</span> <span class="o">=</span> <span class="n">mix</span><span class="o">.</span><span class="n">species_moles</span><span class="p">[</span><span class="n">mix</span><span class="o">.</span><span class="n">species_index</span><span class="p">(</span>
<span class="n">org_ind</span><span class="p">,</span> <span class="n">extractant_name</span><span class="p">)]</span>
<span class="k">for</span> <span class="n">index</span><span class="p">,</span> <span class="n">extracted_species</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">extracted_species_list</span><span class="p">):</span>
<span class="n">predicted_dict</span><span class="p">[</span><span class="s1">&#39;</span><span class="si">{0}</span><span class="s1">_aq_eq&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">extracted_species</span><span class="p">)]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">extracted_species_aq_array</span><span class="p">[</span><span class="n">index</span><span class="p">])</span>
<span class="n">predicted_dict</span><span class="p">[</span><span class="s1">&#39;</span><span class="si">{0}</span><span class="s1">_org_eq&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">extracted_species</span><span class="p">)]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">extracted_species_org_array</span><span class="p">[</span><span class="n">index</span><span class="p">])</span>
<span class="n">predicted_dict</span><span class="p">[</span><span class="s1">&#39;</span><span class="si">{0}</span><span class="s1">_d_eq&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">extracted_species</span><span class="p">)]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">d_array</span><span class="p">[</span><span class="n">index</span><span class="p">])</span>
<span class="n">predicted_dict</span><span class="p">[</span><span class="s1">&#39;h_eq&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">hydrogen_ions</span><span class="p">)</span>
<span class="n">predicted_dict</span><span class="p">[</span><span class="s1">&#39;z_eq&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">extractant</span><span class="p">)</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">predicted_dict</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="n">predicted_dict</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_predicted_dict</span> <span class="o">=</span> <span class="n">predicted_dict</span>
<span class="k">return</span> <span class="kc">None</span></div>
<div class="viewcode-block" id="LLEPE.get_predicted_dict"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.get_predicted_dict">[docs]</a> <span class="k">def</span> <span class="nf">get_predicted_dict</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Returns predicted dictionary of species concentrations</span>
<span class="sd"> that xml parameters predicts given current in_moles</span>
<span class="sd"> :return: predicted_dict: (dict) dictionary of species concentrations</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_predicted_dict</span></div>
<span class="k">def</span> <span class="nf">_internal_objective</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">kwargs</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> ver2 generalizes to handle accessing parameters. ver1 assumes species</span>
<span class="sd"> parameter is modified. ver2 assumes parameter is accessed by going</span>
<span class="sd"> through two elements: upper and lower</span>
<span class="sd"> Internal objective function. Uses objective function to compute value</span>
<span class="sd"> If the optimizer requires vectorized variables ie pso, this function</span>
<span class="sd"> takes care of it</span>
<span class="sd"> :param x: (list) thermo properties varied to minimize objective func</span>
<span class="sd"> :param kwargs: (list) arguments for objective_function</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">temp_xml_file_path</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_temp_xml_file_path</span>
<span class="n">exp_df</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_exp_df</span>
<span class="n">objective_function</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_objective_function</span>
<span class="n">opt_dict</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_opt_dict</span><span class="p">)</span>
<span class="n">dep_dict</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_dependant_params_dict</span><span class="p">)</span>
<span class="n">custom_objects_dict</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_custom_objects_dict</span><span class="p">)</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">xs</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="n">x</span><span class="p">])</span>
<span class="n">vectorized_x</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">vectorized_x</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">xs</span> <span class="o">=</span> <span class="n">x</span>
<span class="n">objective_values</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">xs</span><span class="p">:</span>
<span class="k">for</span> <span class="n">ind</span><span class="p">,</span> <span class="n">param_name</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">opt_dict</span><span class="o">.</span><span class="n">keys</span><span class="p">()):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">np</span><span class="o">.</span><span class="n">isnan</span><span class="p">(</span>
<span class="n">x</span><span class="p">[</span><span class="n">ind</span><span class="p">]):</span> <span class="c1"># if nan, do not update xml with nan</span>
<span class="n">opt_dict</span><span class="p">[</span><span class="n">param_name</span><span class="p">][</span><span class="s1">&#39;input_value&#39;</span><span class="p">]</span> <span class="o">*=</span> <span class="n">x</span><span class="p">[</span><span class="n">ind</span><span class="p">]</span>
<span class="k">if</span> <span class="n">custom_objects_dict</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">update_custom_objects_dict</span><span class="p">(</span><span class="n">opt_dict</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">update_xml</span><span class="p">(</span><span class="n">opt_dict</span><span class="p">,</span>
<span class="n">temp_xml_file_path</span><span class="p">,</span>
<span class="n">dependant_params_dict</span><span class="o">=</span><span class="n">dep_dict</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">update_predicted_dict</span><span class="p">(</span><span class="n">temp_xml_file_path</span><span class="p">)</span>
<span class="n">predicted_dict</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_predicted_dict</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">update_predicted_dict</span><span class="p">()</span>
<span class="k">if</span> <span class="n">kwargs</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="c1"># noinspection PyCallingNonCallable</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">objective_function</span><span class="p">(</span><span class="n">predicted_dict</span><span class="p">,</span> <span class="n">exp_df</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># noinspection PyCallingNonCallable</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">objective_function</span><span class="p">(</span><span class="n">predicted_dict</span><span class="p">,</span> <span class="n">exp_df</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="n">objective_values</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
<span class="k">if</span> <span class="n">vectorized_x</span><span class="p">:</span>
<span class="n">objective_values</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">objective_values</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">objective_values</span> <span class="o">=</span> <span class="n">objective_values</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">return</span> <span class="n">objective_values</span>
<div class="viewcode-block" id="LLEPE.fit"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.fit">[docs]</a> <span class="k">def</span> <span class="nf">fit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
<span class="n">objective_function</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">optimizer</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">objective_kwargs</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">optimizer_kwargs</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">tuple</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;Fits experimental to modeled data by minimizing objective function</span>
<span class="sd"> with optimizer. Returns dictionary with opt_dict structure</span>
<span class="sd"> :param objective_function: (function) function to compute objective</span>
<span class="sd"> If &#39;None&#39;, last set objective or default function is used</span>
<span class="sd"> :param optimizer: (function) function to perform optimization</span>
<span class="sd"> If &#39;None&#39;, last set optimizer or default is used</span>
<span class="sd"> :param optimizer_kwargs: (dict) optional arguments for optimizer</span>
<span class="sd"> :param objective_kwargs: (dict) optional arguments</span>
<span class="sd"> for objective function</span>
<span class="sd"> :returns tuple: (opt_dict (dict), opt_value (float))</span>
<span class="sd"> optimized opt_dict: Has identical structure as opt_dict</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">objective_function</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">set_objective_function</span><span class="p">(</span><span class="n">objective_function</span><span class="p">)</span>
<span class="k">if</span> <span class="n">optimizer</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">set_optimizer</span><span class="p">(</span><span class="n">optimizer</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">objective</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_internal_objective</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">objective_kwargs</span><span class="p">)</span>
<span class="n">optimizer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_optimizer</span>
<span class="n">opt_dict</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_opt_dict</span><span class="p">)</span>
<span class="n">x_guess</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">ones</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">opt_dict</span><span class="o">.</span><span class="n">keys</span><span class="p">())))</span>
<span class="k">if</span> <span class="n">optimizer_kwargs</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="c1"># noinspection PyCallingNonCallable</span>
<span class="n">est_parameters</span><span class="p">,</span> <span class="n">obj_value</span> <span class="o">=</span> <span class="n">optimizer</span><span class="p">(</span><span class="n">objective</span><span class="p">,</span> <span class="n">x_guess</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># noinspection PyCallingNonCallable</span>
<span class="n">est_parameters</span><span class="p">,</span> <span class="n">obj_value</span> <span class="o">=</span> <span class="n">optimizer</span><span class="p">(</span><span class="n">objective</span><span class="p">,</span>
<span class="n">x_guess</span><span class="p">,</span>
<span class="n">optimizer_kwargs</span><span class="p">)</span>
<span class="k">for</span> <span class="n">ind</span><span class="p">,</span> <span class="n">param_name</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">opt_dict</span><span class="o">.</span><span class="n">keys</span><span class="p">()):</span>
<span class="n">opt_dict</span><span class="p">[</span><span class="n">param_name</span><span class="p">][</span><span class="s1">&#39;input_value&#39;</span><span class="p">]</span> <span class="o">*=</span> <span class="n">est_parameters</span><span class="p">[</span><span class="n">ind</span><span class="p">]</span>
<span class="k">return</span> <span class="n">opt_dict</span><span class="p">,</span> <span class="n">obj_value</span></div>
<div class="viewcode-block" id="LLEPE.update_xml"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.update_xml">[docs]</a> <span class="k">def</span> <span class="nf">update_xml</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
<span class="n">info_dict</span><span class="p">,</span>
<span class="n">phases_xml_filename</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">dependant_params_dict</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;updates xml file with info_dict</span>
<span class="sd"> :param info_dict: (dict) Requires an identical structure to opt_dict</span>
<span class="sd"> Ignores items with keys containing &quot;custom_object_name&quot;</span>
<span class="sd"> :param phases_xml_filename: (str) xml filename if editing other xml</span>
<span class="sd"> If ``None``, the current xml will be modified and the internal</span>
<span class="sd"> Cantera phases will be refreshed to the new values.</span>
<span class="sd"> :param dependant_params_dict: (dict) dictionary containing information</span>
<span class="sd"> about parameters dependant on info_dict</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">phases_xml_filename</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">phases_xml_filename</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_phases_xml_filename</span>
<span class="n">new_dict</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="n">info_dict</span><span class="p">)</span>
<span class="n">dep_dict</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="n">dependant_params_dict</span><span class="p">)</span>
<span class="n">custom_objects_dict</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_custom_objects_dict</span><span class="p">)</span>
<span class="k">if</span> <span class="n">dep_dict</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">new_dict</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">dep_dict</span><span class="p">)</span>
<span class="k">for</span> <span class="n">param_name</span> <span class="ow">in</span> <span class="n">dep_dict</span><span class="o">.</span><span class="n">keys</span><span class="p">():</span>
<span class="n">mod_func</span> <span class="o">=</span> \
<span class="n">dep_dict</span><span class="p">[</span><span class="n">param_name</span><span class="p">][</span><span class="s1">&#39;function&#39;</span><span class="p">]</span>
<span class="n">mod_kwargs</span> <span class="o">=</span> \
<span class="n">dep_dict</span><span class="p">[</span><span class="n">param_name</span><span class="p">][</span><span class="s1">&#39;kwargs&#39;</span><span class="p">]</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">dep_dict</span><span class="p">[</span><span class="n">param_name</span><span class="p">][</span><span class="s1">&#39;independent_params&#39;</span><span class="p">],</span> <span class="nb">str</span><span class="p">):</span>
<span class="n">ind_param_names</span> <span class="o">=</span> <span class="p">[</span><span class="n">dep_dict</span><span class="p">[</span>
<span class="n">param_name</span><span class="p">][</span><span class="s1">&#39;independent_params&#39;</span><span class="p">]]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">ind_param_names</span> <span class="o">=</span> \
<span class="n">dep_dict</span><span class="p">[</span><span class="n">param_name</span><span class="p">][</span><span class="s1">&#39;independent_params&#39;</span><span class="p">]</span>
<span class="n">ind_vals</span> <span class="o">=</span> <span class="p">[</span><span class="n">new_dict</span><span class="p">[</span><span class="n">ind_param_name</span><span class="p">][</span><span class="s1">&#39;input_value&#39;</span><span class="p">]</span>
<span class="k">for</span> <span class="n">ind_param_name</span> <span class="ow">in</span> <span class="n">ind_param_names</span><span class="p">]</span>
<span class="k">if</span> <span class="n">mod_kwargs</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">new_dict</span><span class="p">[</span><span class="n">param_name</span><span class="p">][</span><span class="s1">&#39;input_value&#39;</span><span class="p">]</span> <span class="o">=</span> \
<span class="n">mod_func</span><span class="p">(</span><span class="n">ind_vals</span><span class="p">,</span>
<span class="n">custom_objects_dict</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">new_dict</span><span class="p">[</span><span class="n">param_name</span><span class="p">][</span><span class="s1">&#39;input_value&#39;</span><span class="p">]</span> <span class="o">=</span> \
<span class="n">mod_func</span><span class="p">(</span><span class="n">ind_vals</span><span class="p">,</span> <span class="n">custom_objects_dict</span><span class="p">,</span>
<span class="o">**</span><span class="n">mod_kwargs</span><span class="p">)</span>
<span class="n">tree</span> <span class="o">=</span> <span class="n">ET</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">phases_xml_filename</span><span class="p">)</span>
<span class="n">root</span> <span class="o">=</span> <span class="n">tree</span><span class="o">.</span><span class="n">getroot</span><span class="p">()</span>
<span class="c1"># Update xml file</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">new_dict</span><span class="o">.</span><span class="n">keys</span><span class="p">()):</span>
<span class="n">d</span> <span class="o">=</span> <span class="n">new_dict</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
<span class="n">now</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span>
<span class="k">if</span> <span class="s1">&#39;custom_object_name&#39;</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">d</span><span class="o">.</span><span class="n">keys</span><span class="p">()):</span>
<span class="k">continue</span>
<span class="k">if</span> <span class="p">(</span><span class="n">d</span><span class="p">[</span><span class="s1">&#39;upper_attrib_name&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
<span class="ow">and</span> <span class="n">d</span><span class="p">[</span><span class="s1">&#39;lower_attrib_name&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">):</span>
<span class="k">for</span> <span class="n">child1</span> <span class="ow">in</span> <span class="n">root</span><span class="o">.</span><span class="n">iter</span><span class="p">(</span><span class="n">d</span><span class="p">[</span><span class="s1">&#39;upper_element_name&#39;</span><span class="p">]):</span>
<span class="k">if</span> <span class="p">(</span><span class="n">child1</span><span class="o">.</span><span class="n">attrib</span><span class="p">[</span><span class="n">d</span><span class="p">[</span><span class="s1">&#39;upper_attrib_name&#39;</span><span class="p">]]</span>
<span class="o">==</span> <span class="n">d</span><span class="p">[</span><span class="s1">&#39;upper_attrib_value&#39;</span><span class="p">]):</span>
<span class="k">for</span> <span class="n">child2</span> <span class="ow">in</span> <span class="n">child1</span><span class="o">.</span><span class="n">iter</span><span class="p">(</span><span class="n">d</span><span class="p">[</span><span class="s1">&#39;lower_element_name&#39;</span><span class="p">]):</span>
<span class="k">if</span> <span class="p">(</span><span class="n">child1</span><span class="o">.</span><span class="n">attrib</span><span class="p">[</span><span class="n">d</span><span class="p">[</span><span class="s1">&#39;lower_attrib_name&#39;</span><span class="p">]]</span>
<span class="o">==</span> <span class="n">d</span><span class="p">[</span><span class="s1">&#39;lower_attrib_value&#39;</span><span class="p">]):</span>
<span class="n">child2</span><span class="o">.</span><span class="n">text</span> <span class="o">=</span> <span class="n">d</span><span class="p">[</span><span class="s1">&#39;input_format&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">d</span><span class="p">[</span><span class="s1">&#39;input_value&#39;</span><span class="p">])</span>
<span class="n">child2</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s1">&#39;updated&#39;</span><span class="p">,</span>
<span class="s1">&#39;Updated at </span><span class="si">{0}</span><span class="s1">:</span><span class="si">{1}</span><span class="s1"> </span><span class="si">{2}</span><span class="s1">-</span><span class="si">{3}</span><span class="s1">-</span><span class="si">{4}</span><span class="s1">&#39;</span>
<span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">now</span><span class="o">.</span><span class="n">hour</span><span class="p">,</span> <span class="n">now</span><span class="o">.</span><span class="n">minute</span><span class="p">,</span>
<span class="n">now</span><span class="o">.</span><span class="n">month</span><span class="p">,</span> <span class="n">now</span><span class="o">.</span><span class="n">day</span><span class="p">,</span>
<span class="n">now</span><span class="o">.</span><span class="n">year</span><span class="p">))</span>
<span class="k">elif</span> <span class="p">(</span><span class="n">d</span><span class="p">[</span><span class="s1">&#39;upper_attrib_name&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="kc">None</span>
<span class="ow">and</span> <span class="n">d</span><span class="p">[</span><span class="s1">&#39;lower_attrib_name&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">):</span>
<span class="k">for</span> <span class="n">child1</span> <span class="ow">in</span> <span class="n">root</span><span class="o">.</span><span class="n">iter</span><span class="p">(</span><span class="n">d</span><span class="p">[</span><span class="s1">&#39;upper_element_name&#39;</span><span class="p">]):</span>
<span class="k">for</span> <span class="n">child2</span> <span class="ow">in</span> <span class="n">child1</span><span class="o">.</span><span class="n">iter</span><span class="p">(</span><span class="n">d</span><span class="p">[</span><span class="s1">&#39;lower_element_name&#39;</span><span class="p">]):</span>
<span class="k">if</span> <span class="p">(</span><span class="n">child1</span><span class="o">.</span><span class="n">attrib</span><span class="p">[</span><span class="n">d</span><span class="p">[</span><span class="s1">&#39;lower_attrib_name&#39;</span><span class="p">]]</span>
<span class="o">==</span> <span class="n">d</span><span class="p">[</span><span class="s1">&#39;lower_attrib_value&#39;</span><span class="p">]):</span>
<span class="n">child2</span><span class="o">.</span><span class="n">text</span> <span class="o">=</span> <span class="n">d</span><span class="p">[</span><span class="s1">&#39;input_format&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">d</span><span class="p">[</span><span class="s1">&#39;input_value&#39;</span><span class="p">])</span>
<span class="n">child2</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s1">&#39;updated&#39;</span><span class="p">,</span>
<span class="s1">&#39;Updated at </span><span class="si">{0}</span><span class="s1">:</span><span class="si">{1}</span><span class="s1"> </span><span class="si">{2}</span><span class="s1">-</span><span class="si">{3}</span><span class="s1">-</span><span class="si">{4}</span><span class="s1">&#39;</span>
<span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">now</span><span class="o">.</span><span class="n">hour</span><span class="p">,</span> <span class="n">now</span><span class="o">.</span><span class="n">minute</span><span class="p">,</span>
<span class="n">now</span><span class="o">.</span><span class="n">month</span><span class="p">,</span> <span class="n">now</span><span class="o">.</span><span class="n">day</span><span class="p">,</span>
<span class="n">now</span><span class="o">.</span><span class="n">year</span><span class="p">))</span>
<span class="k">elif</span> <span class="p">(</span><span class="n">d</span><span class="p">[</span><span class="s1">&#39;upper_attrib_name&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
<span class="ow">and</span> <span class="n">d</span><span class="p">[</span><span class="s1">&#39;lower_attrib_name&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">):</span>
<span class="k">for</span> <span class="n">child1</span> <span class="ow">in</span> <span class="n">root</span><span class="o">.</span><span class="n">iter</span><span class="p">(</span><span class="n">d</span><span class="p">[</span><span class="s1">&#39;upper_element_name&#39;</span><span class="p">]):</span>
<span class="k">if</span> <span class="p">(</span><span class="n">child1</span><span class="o">.</span><span class="n">attrib</span><span class="p">[</span><span class="n">d</span><span class="p">[</span><span class="s1">&#39;upper_attrib_name&#39;</span><span class="p">]]</span>
<span class="o">==</span> <span class="n">d</span><span class="p">[</span><span class="s1">&#39;upper_attrib_value&#39;</span><span class="p">]):</span>
<span class="k">for</span> <span class="n">child2</span> <span class="ow">in</span> <span class="n">child1</span><span class="o">.</span><span class="n">iter</span><span class="p">(</span><span class="n">d</span><span class="p">[</span><span class="s1">&#39;lower_element_name&#39;</span><span class="p">]):</span>
<span class="n">child2</span><span class="o">.</span><span class="n">text</span> <span class="o">=</span> <span class="n">d</span><span class="p">[</span><span class="s1">&#39;input_format&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">d</span><span class="p">[</span><span class="s1">&#39;input_value&#39;</span><span class="p">])</span>
<span class="n">child2</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s1">&#39;updated&#39;</span><span class="p">,</span>
<span class="s1">&#39;Updated at </span><span class="si">{0}</span><span class="s1">:</span><span class="si">{1}</span><span class="s1"> </span><span class="si">{2}</span><span class="s1">-</span><span class="si">{3}</span><span class="s1">-</span><span class="si">{4}</span><span class="s1">&#39;</span>
<span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">now</span><span class="o">.</span><span class="n">hour</span><span class="p">,</span> <span class="n">now</span><span class="o">.</span><span class="n">minute</span><span class="p">,</span>
<span class="n">now</span><span class="o">.</span><span class="n">month</span><span class="p">,</span> <span class="n">now</span><span class="o">.</span><span class="n">day</span><span class="p">,</span>
<span class="n">now</span><span class="o">.</span><span class="n">year</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">for</span> <span class="n">child1</span> <span class="ow">in</span> <span class="n">root</span><span class="o">.</span><span class="n">iter</span><span class="p">(</span><span class="n">d</span><span class="p">[</span><span class="s1">&#39;upper_element_name&#39;</span><span class="p">]):</span>
<span class="k">for</span> <span class="n">child2</span> <span class="ow">in</span> <span class="n">child1</span><span class="o">.</span><span class="n">iter</span><span class="p">(</span><span class="n">d</span><span class="p">[</span><span class="s1">&#39;lower_element_name&#39;</span><span class="p">]):</span>
<span class="n">child2</span><span class="o">.</span><span class="n">text</span> <span class="o">=</span> <span class="n">d</span><span class="p">[</span><span class="s1">&#39;input_format&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">d</span><span class="p">[</span><span class="s1">&#39;input_value&#39;</span><span class="p">])</span>
<span class="n">child2</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s1">&#39;updated&#39;</span><span class="p">,</span> <span class="s1">&#39;Updated at </span><span class="si">{0}</span><span class="s1">:</span><span class="si">{1}</span><span class="s1"> </span><span class="si">{2}</span><span class="s1">-</span><span class="si">{3}</span><span class="s1">-</span><span class="si">{4}</span><span class="s1">&#39;</span>
<span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">now</span><span class="o">.</span><span class="n">hour</span><span class="p">,</span> <span class="n">now</span><span class="o">.</span><span class="n">minute</span><span class="p">,</span>
<span class="n">now</span><span class="o">.</span><span class="n">month</span><span class="p">,</span> <span class="n">now</span><span class="o">.</span><span class="n">day</span><span class="p">,</span>
<span class="n">now</span><span class="o">.</span><span class="n">year</span><span class="p">))</span>
<span class="n">tree</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">phases_xml_filename</span><span class="p">)</span>
<span class="k">if</span> <span class="n">phases_xml_filename</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">_phases_xml_filename</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">set_phases</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_phases_xml_filename</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_phase_names</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">None</span></div>
<div class="viewcode-block" id="LLEPE.update_custom_objects_dict"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.update_custom_objects_dict">[docs]</a> <span class="k">def</span> <span class="nf">update_custom_objects_dict</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">info_dict</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> updates internal custom_objects_dict with info_dict</span>
<span class="sd"> :param info_dict: Requires an identical structure to opt_dict</span>
<span class="sd"> Ignores items with keys containing &quot;custom_object_name&quot;</span>
<span class="sd"> :return: None</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">custom_objects_dict</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_custom_objects_dict</span><span class="p">)</span>
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">info_dict</span><span class="o">.</span><span class="n">keys</span><span class="p">()):</span>
<span class="n">d</span> <span class="o">=</span> <span class="n">info_dict</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
<span class="k">if</span> <span class="s1">&#39;upper_element_name&#39;</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">d</span><span class="o">.</span><span class="n">keys</span><span class="p">()):</span>
<span class="k">continue</span>
<span class="n">func</span> <span class="o">=</span> <span class="n">d</span><span class="p">[</span><span class="s1">&#39;function&#39;</span><span class="p">]</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">d</span><span class="p">[</span><span class="s1">&#39;input_value&#39;</span><span class="p">]</span>
<span class="n">kwargs</span> <span class="o">=</span> <span class="n">d</span><span class="p">[</span><span class="s1">&#39;kwargs&#39;</span><span class="p">]</span>
<span class="n">object_name</span> <span class="o">=</span> <span class="n">d</span><span class="p">[</span><span class="s1">&#39;custom_object_name&#39;</span><span class="p">]</span>
<span class="n">new_object</span> <span class="o">=</span> <span class="n">func</span><span class="p">(</span><span class="n">custom_objects_dict</span><span class="p">[</span><span class="n">object_name</span><span class="p">],</span>
<span class="n">value</span><span class="p">,</span>
<span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="n">custom_objects_dict</span><span class="p">[</span><span class="n">object_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">new_object</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_custom_objects_dict</span> <span class="o">=</span> <span class="n">custom_objects_dict</span>
<span class="k">return</span> <span class="kc">None</span></div>
<div class="viewcode-block" id="LLEPE.parity_plot"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.parity_plot">[docs]</a> <span class="k">def</span> <span class="nf">parity_plot</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
<span class="n">compared_value</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">c_data</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">c_label</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">plot_title</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">save_path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">print_r_squared</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">data_labels</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">legend</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Parity plot between measured and predicted compared_value.</span>
<span class="sd"> Default compared value is {ES_1}_aq_eq</span>
<span class="sd"> :param compared_value: (str) Quantity to compare predicted and</span>
<span class="sd"> experimental data. Can be any column containing &quot;eq&quot; in exp_df e.g.</span>
<span class="sd"> h_eq, z_eq, {ES}_d_eq, etc.</span>
<span class="sd"> :param plot_title: (str or boolean)</span>
<span class="sd"> If None (default): Plot title will be generated from compared_value</span>
<span class="sd"> Recommend to just explore. If h_eq, plot_title is</span>
<span class="sd"> &quot;H^+ eq conc&quot;.</span>
<span class="sd"> If str: Plot title will be plot_title string</span>
<span class="sd"> If &quot;False&quot;: No plot title</span>
<span class="sd"> :param c_data: (list or np.ndarray) data for color axis</span>
<span class="sd"> :param c_label: (str) label for color axis</span>
<span class="sd"> :param save_path: (str) save path for parity plot</span>
<span class="sd"> :param print_r_squared: (boolean) To plot or not to plot r-squared</span>
<span class="sd"> value. Prints 2 places past decimal</span>
<span class="sd"> :param data_labels: labels for the data such as paper&#39;s name where</span>
<span class="sd"> experiment is pulled from.</span>
<span class="sd"> :param legend: whether to display legend for data_labels. Has no</span>
<span class="sd"> effect if data_labels is None</span>
<span class="sd"> :return fig, ax: returns the figure and axes objects</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">exp_df</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_exp_df</span><span class="p">()</span>
<span class="n">predicted_dict</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_predicted_dict</span><span class="p">()</span>
<span class="n">extracted_species_list</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_extracted_species_list</span>
<span class="n">extractant_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_extractant_name</span><span class="p">()</span>
<span class="n">extracted_species_charges</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_extracted_species_charges</span>
<span class="k">if</span> <span class="n">compared_value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">compared_value</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">{0}</span><span class="s1">_aq_eq&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">extracted_species_list</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="n">pred</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">(</span><span class="n">predicted_dict</span><span class="p">)[</span><span class="n">compared_value</span><span class="p">]</span><span class="o">.</span><span class="n">fillna</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">.</span><span class="n">values</span>
<span class="n">meas</span> <span class="o">=</span> <span class="n">exp_df</span><span class="p">[</span><span class="n">compared_value</span><span class="p">]</span><span class="o">.</span><span class="n">fillna</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">.</span><span class="n">values</span>
<span class="n">name_breakdown</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="s1">&#39;[^_\W]+&#39;</span><span class="p">,</span> <span class="n">compared_value</span><span class="p">)</span>
<span class="n">compared_species</span> <span class="o">=</span> <span class="n">name_breakdown</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">if</span> <span class="n">compared_species</span> <span class="o">==</span> <span class="s1">&#39;h&#39;</span><span class="p">:</span>
<span class="n">feed_molarity</span> <span class="o">=</span> <span class="n">exp_df</span><span class="p">[</span><span class="s1">&#39;h_i&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">fillna</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">.</span><span class="n">values</span>
<span class="k">elif</span> <span class="n">compared_species</span> <span class="o">==</span> <span class="s1">&#39;z&#39;</span><span class="p">:</span>
<span class="n">feed_molarity</span> <span class="o">=</span> <span class="n">exp_df</span><span class="p">[</span><span class="s1">&#39;z_i&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">fillna</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">.</span><span class="n">values</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">feed_molarity</span> <span class="o">=</span> <span class="n">exp_df</span><span class="p">[</span>
<span class="s1">&#39;</span><span class="si">{0}</span><span class="s1">_aq_i&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">compared_species</span><span class="p">)]</span><span class="o">.</span><span class="n">fillna</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">.</span><span class="n">values</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">data_labels</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
<span class="n">combined_df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">({</span><span class="s1">&#39;pred&#39;</span><span class="p">:</span> <span class="n">pred</span><span class="p">,</span>
<span class="s1">&#39;meas&#39;</span><span class="p">:</span> <span class="n">meas</span><span class="p">,</span>
<span class="s1">&#39;label&#39;</span><span class="p">:</span> <span class="n">data_labels</span><span class="p">,</span>
<span class="s1">&#39;feed_molarity&#39;</span><span class="p">:</span> <span class="n">feed_molarity</span><span class="p">})</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">c_data</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="n">combined_df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">({</span><span class="s1">&#39;pred&#39;</span><span class="p">:</span> <span class="n">pred</span><span class="p">,</span>
<span class="s1">&#39;meas&#39;</span><span class="p">:</span> <span class="n">meas</span><span class="p">,</span>
<span class="n">c_data</span><span class="p">:</span> <span class="n">exp_df</span><span class="p">[</span><span class="n">c_data</span><span class="p">]</span><span class="o">.</span><span class="n">values</span><span class="p">,</span>
<span class="s1">&#39;feed_molarity&#39;</span><span class="p">:</span> <span class="n">feed_molarity</span><span class="p">})</span>
<span class="k">elif</span> <span class="n">c_data</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">combined_df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">({</span><span class="s1">&#39;pred&#39;</span><span class="p">:</span> <span class="n">pred</span><span class="p">,</span>
<span class="s1">&#39;meas&#39;</span><span class="p">:</span> <span class="n">meas</span><span class="p">,</span>
<span class="s1">&#39;c_data&#39;</span><span class="p">:</span> <span class="n">c_data</span><span class="p">,</span>
<span class="s1">&#39;feed_molarity&#39;</span><span class="p">:</span> <span class="n">feed_molarity</span><span class="p">})</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">combined_df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">({</span><span class="s1">&#39;pred&#39;</span><span class="p">:</span> <span class="n">pred</span><span class="p">,</span>
<span class="s1">&#39;meas&#39;</span><span class="p">:</span> <span class="n">meas</span><span class="p">,</span>
<span class="s1">&#39;feed_molarity&#39;</span><span class="p">:</span> <span class="n">feed_molarity</span><span class="p">})</span>
<span class="n">combined_df</span> <span class="o">=</span> <span class="n">combined_df</span><span class="p">[(</span><span class="n">combined_df</span><span class="p">[</span><span class="s1">&#39;feed_molarity&#39;</span><span class="p">]</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)]</span>
<span class="n">meas</span> <span class="o">=</span> <span class="n">combined_df</span><span class="p">[</span><span class="s1">&#39;meas&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">values</span>
<span class="n">pred</span> <span class="o">=</span> <span class="n">combined_df</span><span class="p">[</span><span class="s1">&#39;pred&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">values</span>
<span class="n">min_data</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">min</span><span class="p">([</span><span class="n">pred</span><span class="p">,</span> <span class="n">meas</span><span class="p">])</span>
<span class="n">max_data</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">max</span><span class="p">([</span><span class="n">pred</span><span class="p">,</span> <span class="n">meas</span><span class="p">])</span>
<span class="n">min_max_data</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="n">min_data</span><span class="p">,</span> <span class="n">max_data</span><span class="p">])</span>
<span class="k">if</span> <span class="n">compared_species</span> <span class="o">==</span> <span class="s1">&#39;h&#39;</span><span class="p">:</span>
<span class="n">default_title</span> <span class="o">=</span> <span class="s1">&#39;$H^+$ eq. conc. (mol/L)&#39;</span>
<span class="k">elif</span> <span class="n">compared_species</span> <span class="o">==</span> <span class="s1">&#39;z&#39;</span><span class="p">:</span>
<span class="n">default_title</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">{0}</span><span class="s1"> eq. conc. (mol/L)&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">extractant_name</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">phase</span> <span class="o">=</span> <span class="n">name_breakdown</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="k">if</span> <span class="n">phase</span> <span class="o">==</span> <span class="s1">&#39;aq&#39;</span><span class="p">:</span>
<span class="n">extracted_species_charge</span> <span class="o">=</span> <span class="n">extracted_species_charges</span><span class="p">[</span>
<span class="n">extracted_species_list</span><span class="o">.</span><span class="n">index</span><span class="p">(</span>
<span class="n">compared_species</span><span class="p">)]</span>
<span class="n">default_title</span> <span class="o">=</span> <span class="s1">&#39;$</span><span class="si">%s</span><span class="s1">^{</span><span class="si">%d</span><span class="s1">+}$ eq. conc. (mol/L)&#39;</span> \
<span class="o">%</span> <span class="p">(</span><span class="n">compared_species</span><span class="p">,</span> <span class="n">extracted_species_charge</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">phase</span> <span class="o">==</span> <span class="s1">&#39;d&#39;</span><span class="p">:</span>
<span class="n">default_title</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">{0}</span><span class="s1"> distribution ratio&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">compared_species</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">default_title</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">{0}</span><span class="s1"> complex eq. conc. (mol/L)&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">compared_species</span><span class="p">)</span>
<span class="n">fig</span><span class="p">,</span> <span class="n">ax</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</span><span class="p">()</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">data_labels</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
<span class="n">unique_labels</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">data_labels</span><span class="p">))</span>
<span class="k">for</span> <span class="n">label</span> <span class="ow">in</span> <span class="n">unique_labels</span><span class="p">:</span>
<span class="n">filtered_data</span> <span class="o">=</span> <span class="n">combined_df</span><span class="p">[</span><span class="n">combined_df</span><span class="p">[</span><span class="s1">&#39;label&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="n">label</span><span class="p">]</span>
<span class="n">filtered_meas</span> <span class="o">=</span> <span class="n">filtered_data</span><span class="p">[</span><span class="s1">&#39;meas&#39;</span><span class="p">]</span>
<span class="n">filtered_pred</span> <span class="o">=</span> <span class="n">filtered_data</span><span class="p">[</span><span class="s1">&#39;pred&#39;</span><span class="p">]</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">filtered_pred</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">ax</span><span class="o">.</span><span class="n">scatter</span><span class="p">(</span><span class="n">filtered_meas</span><span class="p">,</span>
<span class="n">filtered_pred</span><span class="p">,</span>
<span class="n">label</span><span class="o">=</span><span class="n">label</span><span class="p">)</span>
<span class="k">if</span> <span class="n">legend</span><span class="p">:</span>
<span class="n">ax</span><span class="o">.</span><span class="n">legend</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="s1">&#39;best&#39;</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">c_data</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">c_data</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="n">c_data</span> <span class="o">=</span> <span class="n">combined_df</span><span class="p">[</span><span class="n">c_data</span><span class="p">]</span><span class="o">.</span><span class="n">values</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">c_data</span> <span class="o">=</span> <span class="n">combined_df</span><span class="p">[</span><span class="s1">&#39;c_data&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">values</span>
<span class="n">p1</span> <span class="o">=</span> <span class="n">ax</span><span class="o">.</span><span class="n">scatter</span><span class="p">(</span><span class="n">meas</span><span class="p">,</span> <span class="n">pred</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="n">c_data</span><span class="p">,</span> <span class="n">alpha</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">cmap</span><span class="o">=</span><span class="s1">&#39;viridis&#39;</span><span class="p">)</span>
<span class="n">c_bar</span> <span class="o">=</span> <span class="n">fig</span><span class="o">.</span><span class="n">colorbar</span><span class="p">(</span><span class="n">p1</span><span class="p">,</span> <span class="nb">format</span><span class="o">=</span><span class="s1">&#39;</span><span class="si">%.2f</span><span class="s1">&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">c_label</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">c_bar</span><span class="o">.</span><span class="n">set_label</span><span class="p">(</span><span class="n">c_label</span><span class="p">,</span> <span class="n">rotation</span><span class="o">=</span><span class="mi">270</span><span class="p">,</span> <span class="n">labelpad</span><span class="o">=</span><span class="mi">20</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">ax</span><span class="o">.</span><span class="n">scatter</span><span class="p">(</span><span class="n">meas</span><span class="p">,</span> <span class="n">pred</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="s2">&quot;r&quot;</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">ax</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">min_max_data</span><span class="p">,</span> <span class="n">min_max_data</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s2">&quot;b&quot;</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">print_r_squared</span><span class="p">:</span>
<span class="n">ax</span><span class="o">.</span><span class="n">text</span><span class="p">(</span><span class="n">min_max_data</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
<span class="n">min_max_data</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">*</span> <span class="mf">0.9</span><span class="p">,</span>
<span class="s1">&#39;$R^2$=</span><span class="si">{0:.2f}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">r_squared</span><span class="p">(</span><span class="n">compared_value</span><span class="p">)))</span>
<span class="n">ax</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">xlabel</span><span class="o">=</span><span class="s1">&#39;Measured&#39;</span><span class="p">,</span> <span class="n">ylabel</span><span class="o">=</span><span class="s1">&#39;Predicted&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">plot_title</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">ax</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="n">default_title</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">plot_title</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="n">ax</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="n">plot_title</span><span class="p">)</span>
<span class="n">set_size</span><span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">tight_layout</span><span class="p">()</span>
<span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
<span class="k">if</span> <span class="n">save_path</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">plt</span><span class="o">.</span><span class="n">savefig</span><span class="p">(</span><span class="n">save_path</span><span class="p">,</span> <span class="n">bbox_inches</span><span class="o">=</span><span class="s1">&#39;tight&#39;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">fig</span><span class="p">,</span> <span class="n">ax</span></div>
<div class="viewcode-block" id="LLEPE.r_squared"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.r_squared">[docs]</a> <span class="k">def</span> <span class="nf">r_squared</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">compared_value</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;r-squared value comparing measured and predicted compared value</span>
<span class="sd"> Closer to 1, the better the model&#39;s predictions.</span>
<span class="sd"> :param compared_value: (str) Quantity to compare predicted and</span>
<span class="sd"> experimental data. Can be any column containing &quot;eq&quot; in exp_df e.g.</span>
<span class="sd"> h_eq, z_eq, {ES}_d_eq, etc. default is {ES}_aq_eq</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">exp_df</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_exp_df</span><span class="p">()</span>
<span class="n">predicted_dict</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_predicted_dict</span><span class="p">()</span>
<span class="n">extracted_species_list</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_extracted_species_list</span>
<span class="k">if</span> <span class="n">compared_value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">compared_value</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">{0}</span><span class="s1">_aq_eq&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">extracted_species_list</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="n">pred</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">(</span><span class="n">predicted_dict</span><span class="p">)[</span><span class="n">compared_value</span><span class="p">]</span><span class="o">.</span><span class="n">fillna</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">.</span><span class="n">values</span>
<span class="n">predicted_y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">pred</span><span class="p">)</span>
<span class="n">actual_y</span> <span class="o">=</span> <span class="n">exp_df</span><span class="p">[</span><span class="n">compared_value</span><span class="p">]</span><span class="o">.</span><span class="n">fillna</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">.</span><span class="n">values</span>
<span class="n">name_breakdown</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="s1">&#39;[^_\W]+&#39;</span><span class="p">,</span> <span class="n">compared_value</span><span class="p">)</span>
<span class="n">compared_species</span> <span class="o">=</span> <span class="n">name_breakdown</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">if</span> <span class="n">compared_species</span> <span class="o">==</span> <span class="s1">&#39;h&#39;</span><span class="p">:</span>
<span class="n">feed_molarity</span> <span class="o">=</span> <span class="n">exp_df</span><span class="p">[</span><span class="s1">&#39;h_i&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">fillna</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">.</span><span class="n">values</span>
<span class="k">elif</span> <span class="n">compared_species</span> <span class="o">==</span> <span class="s1">&#39;z&#39;</span><span class="p">:</span>
<span class="n">feed_molarity</span> <span class="o">=</span> <span class="n">exp_df</span><span class="p">[</span><span class="s1">&#39;z_i&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">fillna</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">.</span><span class="n">values</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">feed_molarity</span> <span class="o">=</span> <span class="n">exp_df</span><span class="p">[</span>
<span class="s1">&#39;</span><span class="si">{0}</span><span class="s1">_aq_i&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">compared_species</span><span class="p">)]</span><span class="o">.</span><span class="n">fillna</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">.</span><span class="n">values</span>
<span class="n">combined_df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">({</span><span class="s1">&#39;pred&#39;</span><span class="p">:</span> <span class="n">predicted_y</span><span class="p">,</span>
<span class="s1">&#39;meas&#39;</span><span class="p">:</span> <span class="n">actual_y</span><span class="p">,</span>
<span class="s1">&#39;in_moles&#39;</span><span class="p">:</span> <span class="n">feed_molarity</span><span class="p">})</span>
<span class="n">combined_df</span> <span class="o">=</span> <span class="n">combined_df</span><span class="p">[(</span><span class="n">combined_df</span><span class="p">[</span><span class="s1">&#39;in_moles&#39;</span><span class="p">]</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)]</span>
<span class="n">actual_y</span> <span class="o">=</span> <span class="n">combined_df</span><span class="p">[</span><span class="s1">&#39;meas&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">values</span>
<span class="n">predicted_y</span> <span class="o">=</span> <span class="n">combined_df</span><span class="p">[</span><span class="s1">&#39;pred&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">values</span>
<span class="n">num</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">((</span><span class="n">actual_y</span> <span class="o">-</span> <span class="n">predicted_y</span><span class="p">)</span> <span class="o">**</span> <span class="mi">2</span><span class="p">)</span>
<span class="n">den</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">((</span><span class="n">actual_y</span> <span class="o">-</span> <span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">actual_y</span><span class="p">))</span> <span class="o">**</span> <span class="mi">2</span><span class="p">)</span>
<span class="k">if</span> <span class="n">den</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">r_2</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">r_2</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">num</span> <span class="o">/</span> <span class="n">den</span><span class="p">)</span>
<span class="k">return</span> <span class="n">r_2</span></div>
<div class="viewcode-block" id="LLEPE.plot_3d_data"><a class="viewcode-back" href="../../modules/LLEPE.html#llepe.LLEPE.plot_3d_data">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">plot_3d_data</span><span class="p">(</span><span class="n">x_data</span><span class="p">,</span>
<span class="n">y_data</span><span class="p">,</span>
<span class="n">z_data</span><span class="p">,</span>
<span class="n">c_data</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">x_label</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">y_label</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">z_label</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">c_label</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> THis is for plotting 3d scatter plots.</span>
<span class="sd"> We suggest use matplotlib&#39;s ax.scatter to make 3d plots.</span>
<span class="sd"> :param x_data: (list) list of data for x axis</span>
<span class="sd"> :param y_data: (list) list of data for y axis</span>
<span class="sd"> :param z_data: (list) list of data for z axis</span>
<span class="sd"> :param c_data: (list) list of data for color axis</span>
<span class="sd"> :param x_label: (str) label for x axis</span>
<span class="sd"> :param y_label: (str) label for y axis</span>
<span class="sd"> :param z_label: (str) label for z axis</span>
<span class="sd"> :param c_label: (str) label for color axis</span>
<span class="sd"> :return:</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">fig</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">figure</span><span class="p">()</span>
<span class="n">ax</span> <span class="o">=</span> <span class="n">fig</span><span class="o">.</span><span class="n">add_subplot</span><span class="p">(</span><span class="mi">111</span><span class="p">,</span> <span class="n">projection</span><span class="o">=</span><span class="s1">&#39;3d&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">c_data</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">ax</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x_data</span><span class="p">,</span> <span class="n">y_data</span><span class="p">,</span> <span class="n">z_data</span><span class="p">,</span> <span class="s1">&#39;o&#39;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">p1</span> <span class="o">=</span> <span class="n">ax</span><span class="o">.</span><span class="n">scatter</span><span class="p">(</span><span class="n">x_data</span><span class="p">,</span>
<span class="n">y_data</span><span class="p">,</span>
<span class="n">z_data</span><span class="p">,</span> <span class="s1">&#39;o&#39;</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="n">c_data</span><span class="p">,</span>
<span class="n">cmap</span><span class="o">=</span><span class="s1">&#39;viridis&#39;</span><span class="p">,</span> <span class="n">alpha</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">c_bar</span> <span class="o">=</span> <span class="n">fig</span><span class="o">.</span><span class="n">colorbar</span><span class="p">(</span><span class="n">p1</span><span class="p">)</span>
<span class="k">if</span> <span class="n">c_label</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">c_bar</span><span class="o">.</span><span class="n">set_label</span><span class="p">(</span><span class="n">c_label</span><span class="p">,</span> <span class="n">rotation</span><span class="o">=</span><span class="mi">270</span><span class="p">,</span> <span class="n">labelpad</span><span class="o">=</span><span class="mi">20</span><span class="p">)</span>
<span class="k">if</span> <span class="n">x_label</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">ax</span><span class="o">.</span><span class="n">set_xlabel</span><span class="p">(</span><span class="s1">&#39;x&#39;</span><span class="p">,</span> <span class="n">labelpad</span><span class="o">=</span><span class="mi">15</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">ax</span><span class="o">.</span><span class="n">set_xlabel</span><span class="p">(</span><span class="n">x_label</span><span class="p">,</span> <span class="n">labelpad</span><span class="o">=</span><span class="mi">15</span><span class="p">)</span>
<span class="k">if</span> <span class="n">y_label</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">ax</span><span class="o">.</span><span class="n">set_ylabel</span><span class="p">(</span><span class="s1">&#39;y&#39;</span><span class="p">,</span> <span class="n">labelpad</span><span class="o">=</span><span class="mi">15</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">ax</span><span class="o">.</span><span class="n">set_ylabel</span><span class="p">(</span><span class="n">y_label</span><span class="p">,</span> <span class="n">labelpad</span><span class="o">=</span><span class="mi">15</span><span class="p">)</span>
<span class="k">if</span> <span class="n">z_label</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">ax</span><span class="o">.</span><span class="n">set_zlabel</span><span class="p">(</span><span class="s1">&#39;z&#39;</span><span class="p">,</span> <span class="n">labelpad</span><span class="o">=</span><span class="mi">15</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">ax</span><span class="o">.</span><span class="n">set_zlabel</span><span class="p">(</span><span class="n">z_label</span><span class="p">,</span> <span class="n">labelpad</span><span class="o">=</span><span class="mi">15</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
<span class="k">return</span> <span class="n">fig</span><span class="p">,</span> <span class="n">ax</span></div></div>
</pre></div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2020, UChicago Argonne, LLC.
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>