diff --git a/examples/pcsaft/PhaseDiagramBinary.ipynb b/examples/pcsaft/PhaseDiagramBinary.ipynb index 16c85750d..608c0a177 100644 --- a/examples/pcsaft/PhaseDiagramBinary.ipynb +++ b/examples/pcsaft/PhaseDiagramBinary.ipynb @@ -6,8 +6,8 @@ "metadata": {}, "outputs": [], "source": [ - "from feos.pcsaft import *\n", "from feos.eos import *\n", + "from feos import *\n", "\n", "import si_units as si\n", "import matplotlib.pyplot as plt\n", @@ -40,7 +40,7 @@ } ], "source": [ - "params = PcSaftParameters.from_json(['hexane', 'octane'], '../../parameters/pcsaft/gross2001.json')\n", + "params = Parameters.from_json(['hexane', 'octane'], '../../parameters/pcsaft/gross2001.json')\n", "saft = EquationOfState.pcsaft(params)\n", "dia_p = PhaseDiagram.binary_vle(saft, 300*si.KELVIN)\n", "dia_t = PhaseDiagram.binary_vle(saft, si.BAR)\n", @@ -93,7 +93,7 @@ } ], "source": [ - "params = PcSaftParameters.from_multiple_json([(['acetone'], '../../parameters/pcsaft/gross2006.json'), (['hexane'], '../../parameters/pcsaft/gross2001.json')])\n", + "params = Parameters.from_multiple_json([(['acetone'], '../../parameters/pcsaft/gross2006.json'), (['hexane'], '../../parameters/pcsaft/gross2001.json')])\n", "saft = EquationOfState.pcsaft(params)\n", "dia_p = PhaseDiagram.binary_vle(saft, 300*si.KELVIN)\n", "dia_t = PhaseDiagram.binary_vle(saft, 5*si.BAR)\n", @@ -146,7 +146,7 @@ } ], "source": [ - "params = PcSaftParameters.from_json(['carbon dioxide', 'hexane'], '../../parameters/pcsaft/gross2001.json')\n", + "params = Parameters.from_json(['carbon dioxide', 'hexane'], '../../parameters/pcsaft/gross2001.json')\n", "saft = EquationOfState.pcsaft(params)\n", "T_vec = [350*si.KELVIN, 450*si.KELVIN, 500*si.KELVIN]\n", "c_vec = ['k', 'r', 'b']\n", @@ -205,7 +205,7 @@ } ], "source": [ - "params = PcSaftParameters.from_multiple_json([(['water'], '../../parameters/pcsaft/gross2002.json'), (['octane'], '../../parameters/pcsaft/gross2001.json')])\n", + "params = Parameters.from_multiple_json([(['water'], '../../parameters/pcsaft/gross2002.json'), (['octane'], '../../parameters/pcsaft/gross2001.json')])\n", "\n", "saft = EquationOfState.pcsaft(params)\n", "dia_p = PhaseDiagram.lle(saft, 500*si.KELVIN, np.array([0.5, 0.5])*si.MOL, si.BAR, 5000*si.BAR)\n", @@ -247,7 +247,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABJgAAAFDCAYAAAB2lbT7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/GU6VOAAAACXBIWXMAAAsTAAALEwEAmpwYAACAqklEQVR4nOzdd3hU1fr28e9KI0BoAiIkoTcRBTT03kMvUpXOAY4UsaL8xGNHEUFFUEBFqnQpIk2a9N6bgKgQBEGUTgJJ1vvHDLyIgIEks2eS+3NduZjZs2fPzRCyMs9+1trGWouIiIiIiIiIiMi98nM6gIiIiIiIiIiI+DYVmEREREREREREJFFUYBIRERERERERkURRgUlERERERERERBJFBSYREREREREREUkUFZhERERERERERCRRVGASERERERGvZIwZY4w5aYzZfZvHjTFmmDHmkDFmpzHmUU9nFBERFxWYRERERETEW40FIu/weD2gkPurO/CZBzKJiMgtqMAkIiIiIiJeyVq7EvjzDrs0AcZbl/VAZmNMTs+kExGRG6nAJCIiIiIivioUOHrD/Sj3NhER8bAApwPci2zZstm8efM6HUNExOts2bLlD2ttdqdzOE3jhIjIraXmccIY0x3XNDrSp0//WNGiRR1OJCLiHWJjY/npp5+4cOECwD2PEz5ZYMqbNy+bN292OoaIiNcxxvzqdAZvoHFCROTWUuA4cQwIv+F+mHvbP1hrRwOjASIiIqzGCRER2L17N40aNSImJubapnseJzRFTkREREREfNVcoIP7anLlgLPW2uNOhxIR8QVnz56lSpUqxMTE0LBhQwhK3PF8soNJRERERERSPmPMZKAakM0YEwW8BgQCWGtHAvOB+sAh4BLQ2ZmkIiK+J1OmTHz++eeULVuWsmXLQgFg370fTwUmERERERHxStbatv/yuAV6eSiOiIjPi46OpkePHjRp0oTmzZvz+OOPs2XLFn777TcogwpMIiIiIiIiIiJyeydOnKBp06Zs2LCB4sWLX9/+zTff4O/vT1yhuEQdXwUmEREREREREZEUbOvWrTRp0oQ///yTb775hmbNmgFgrWX69OmUKl+KzekTd/EDLfItIiIiIiIiIpJCHT58mEqVKmGMYc2aNdeLS+C6itzBgwcpXat0ol9HBSYRERERERERkRQqf/78vPvuu2zatImSJUv+7bEZM2bg5+dHoYqFEv06Hi0wGWN+McbsMsZsN8Zsdm+7zxjzvTHmoPvPLJ7MJCIiIiIiIiKSkly6dIlOnTqxc+dOAPr27UuOHDn+ts+16XGVK1fmSvCVRL+mEx1M1a21Ja21Ee77LwNLrbWFgKXu+yIiIiIiIiIicpeioqKoXLky48ePZ8OGDbfdb+fOnezbt482bdpw6tIp0gakTdTresMUuSbAOPftcUDThD5xx44dfP7551y9ejU5comIg6ZOncrSpUudjiE+6veLv3M2+qzTMUREREREPGrDhg2ULl2agwcP8u2339KtW7fb7jtp0iQCAgJo0aIFJy6c4IGQBxL12p4uMFlgsTFmizGmu3tbDmvtcfftE0COWz3RGNPdGLPZGLP51KlTACxevJju3btz5UriW7lExLu8+uqrfPHFF07HEB8VdTaKLIOy8NCnD9F1Tlc+3/I5O3/fSVx84i69KiIiIiLirdavX0/VqlVJly4d69ato0GDBrfdNz4+nsmTJxMZGUm2bNn4/eLv3J/+/kS9fkCinn33Kllrjxlj7ge+N8bsv/FBa601xthbPdFaOxoYDRAREXHLfUQk5TDGYK3+q8u9yRSciReqv8D6qPXM+XEOY7aPASAkKITSuUpTLqwcZUPLUi6sHDlCbnleQ0RERETEpzz22GM8/fTT9OvXj2zZst1x31WrVhEVFcX7778PwPHzxymUNXELfXu0wGStPeb+86QxZhZQBvjdGJPTWnvcGJMTOOnJTCLinYwxTkcQHxbkH8SAKgMA1+KFP/31E+uj1rMhagPrj61n8NrBxMbHApA/S37Kh5V3fYWX55EcjxDg5+nzLyIiIiIid+/8+fO89NJLvPHGG2TPnv16wejfjBs3jpCQEBo3bgzA8QvHqZqnaqKyeOw3aGNMesDPWnvefbsO8CYwF+gIvOf+c05Cj6nuBpGUTf/H5V5Z/v/3jjGGgvcVpOB9BWn3SDsALl+9zNbjW1kXtY51UetY9vMyJu2aBEC6wHSUzlWa8mHlqRBegXJh5ciePrsjfw8RERERkdv5+eefady4Mfv27aNWrVo0b948Qc+7cOEC06ZNo3Xr1qRPn57LVy/z5+U/Cc0Ymqg8njxFmwOY5e5KCAC+ttYuNMZsAqYZY7oCvwKt7vbA6nQQSXk0RU6SU9rAtFTMXZGKuSsCrmLmkbNHWBe1jrVH17Iuah0frPuA2DWuLqeC9xWkYnhF11fuihTNVhQ/4w3XyRARERGR1GjlypU8/vjjxMbGsnDhQmrVqpXg586YMYOLFy/SuXNnAI6dPwZAWMawRGXyWIHJWnsYKHGL7aeBmp7KISK+QQUmSZS7/NYxxpAncx7yZM5Dm+JtALh09RJbftvC2qNrWRu1lu8Ofse4Ha6LnmYJzkL58PLXi06lQ0uTLjBdUv8tRERERET+Yd68eTRv3pz8+fMzd+5cChcufFfP/+qrryhUqBAVK7pOth45ewSA8IzhicqlRSZExCupM1Gcli4wHZXzVKZynsqAq8vp4J8HWXNkDWuPrmXN0TXMPzgfgAC/AEo9UIpKuStRKXclKoZX1OLhIiIiIpIsypYtS/v27RkyZAiZM2e+q+fu37+flStXMnDgwOufuX498ysAuTPlTlQuFZhExGupg0m8iTGGwlkLUzhrYTqXcrUTn750mvVR61lzdA1rjq7hs82f8eH6DwEodF8hKueufL3oVPC+giqcioiIiMg9OXPmDIMHD+a1114je/bsfPnll/d0nNGjRxMQEECXLl2ub/vlzC8YDOGZ1MEkIimQpshJYti7nSN3j7Kmy0qDwg1oULgBADGxMWw9vpXVR1az+uhqZv84mzHbxwCQI32O68WmyrkrU+KBErpanYiIiIj8q4MHD9KoUSMOHz5MZGQklStXvqfjXL58mXHjxtGsWTNy5Pj/3faHzxwmPFM4Qf5Bicqp32xFxCup00N8UZqANJQPL0/58PK8yIvE23h+/ONHVh1Z5So6HVnNzH0zAcgQlIGKuStSJXcVquSpQkSuCNIEpHH4byAiIiIi3mTJkiW0atUKf39/lixZcs/FJXAt7v3nn3/y3//+92/bD/15iAJZCiQ2qgpMIuK91MEkvs7P+PFg9gd5MPuDdH+sOwDHzh1j1ZFVrPx1JSt/Xcn/Lfs/AIIDgikXVo7KuStTJU8VyoeVJ31Qeifji4iIiIiDxo8fT5cuXShatCjffvst+fLlu+djWWsZNmwYRYoUoXr16n977ODpgzz+4OOJjasCk4h4J02Rk5QqNGMobYq3uX61uj8u/cHqI6uvF5zeWfUOb618iwC/AErnKk21vNWomqcqFXNXJCQoxOH0IiIiIuIppUqVomXLlowaNYqMGTMm6ljr169n8+bNjBgx4m+zRU5fOs3py6cpkq1IYuOqwCQi3kkFJkktsqXLRtOiTWlatCkA52LOsfboWlb+upIVv6xg8NrBvLv6XQL8AojIFUHVPFWplrcaFcMrkiFNBmfDi4iIiEiSOn36NJMnT6Z37948/PDDTJ48OUmOO2zYMDJlykSHDh3+tn3vqb0APJjtwUS/hgpMIuKVVGCSxPDUIt/JIWOajEQWjCSyYCQAF69cZO3Rtaz4ZQU//PoDQ9cNZdCaQfgbfx7L9RjV81anet7qVMpdSVPqRERERHzY3r17adSoEVFRUdSpU4fChQsnyXGPHj3KjBkzePrppwkJ+XtH/J5TewB46P6HEv06KjCJiFdSgUnEJX1QemoXqE3tArUBuHT1EuuOrmPFLytY/styhqwbwqA1gwj0C6RMaBlXwSlfdcqHlSdtYFqH04uIiIhIQsyfP582bdqQLl06fvjhhyQrLgF89NFHWGt5+umn//HYzt93kilNJsIzhif6dVRgEhGvpAKTyK2lC0xHzfw1qZm/JuDqcFpzdA3Lf17Osl+WMXD1QN5e9TZp/F1XtKuetzo189WkTGgZAv0DHU4vIiIiIjf75JNP6Nu3LyVLlmTOnDmEhye+2HPNmTNnGD16NG3atCFPnjz/eHzbiW2UeKBEklzFWwUmEfFKSfEDTiQ1SB+UnjoF6lCnQB0AzkafZdWRVSz/eTnLf1nO6yte57UVrxESFEKVPFWoma8mNfPV5OEcD+Nn/BxOLyIiIiJhYWG0aNGCr776ivTpk3bJg5EjR3LhwgVefPHFfzwWGx/LjhM76PFYjyR5LZ8uMKm7QSRl0/9xuWep+FsnU3AmGhZuSMPCDQHXlUFW/LKCpT8vZcnhJcw/OB+A7OmyUyNfDVfBKX9N8mfJ72RsERERkVTl999/Z926dTRt2pRmzZrRrFmzJH+NixcvMnToUOrWrUuJEiX+8fiu33dxOfYyZULLJMnr+XSB6Rp1OoikPJoiJ4nhy4t8J7Ws6bLyeLHHebzY4wAcPXuUpT8vdX0dXsrUPVMByJ8lP7Xz16Z2/trUyFeDLGmzOBlbREREJMXasWMHjRs35syZM/z888/cd999yfI6o0eP5tSpU7z66qu3fHzt0bUAlA8vnySvlyIKTCKS8qhwLJI8wjOF06lkJzqV7IS1ln1/7GPp4aV8f/h7Ju2axKgto/AzfkTkiqBO/jrULlCbcmHlCPIPcjq6iIiIiM+bNWsW7dq1I0uWLCxfvjzZikvR0dEMHjyYatWqUbFixVvus+rIKkIzhJIn0z/XZroXKjCJiNdSB5NI8jLGUCx7MYplL0afsn24GneVDcc2sPinxXx/+PvrC4anD0xPtbzVqFugLnUL1qXQfYVUBBYRERG5SwMHDuSVV16hbNmyzJo1i5w5cybba40cOZLjx48zadKkWz5urWX5L8upnb92kv1epwKTiHglTZET8bxA/0Aq5a5EpdyVeLP6m5yJPsPyn5fz/eHvWfzTYr47+B0AeTPnJbJAJHUL1qVGvhpkTJPR4eQiIiIi3i8uLo4nn3ySL774guDg4GR7nYsXL/Luu+9So0YNqlevfst9dv6+k5MXT1Irf60ke10VmETEK6nAJOK8zMGZafZgM5o96Fp08qc/f2LRT4tY9NMiJu6ayMgtIwnwC6BCeAXqFqhLZMFISj5QUlenExEREXH77bffOHr0KGXLlmXAgAFA8i8HMmLECE6ePMlbb711232uXfjl2pWIk4IKTCLilTT9RhJDi3wnjwL3FaDnfT3pWbonV+KusPboWhYdchWcXln2Cq8se4Uc6XMQWTCS+oXqUzt/bS0WLiIiIqnWpk2baNq0KUFBQRw4cIDAwMBkf80///yTd999l/r161OhQoXb7jfnxzk8lvMxcmXIlWSvrQKTiHgtdTCJeK8g/yCq5a1GtbzVeLfWu/x+4XcW/7SY+YfmM/fHuYzbMQ5/40/58PLUK1iPegXrUfKBkioei4hXOPjnQepOrOt0DBFJwY4fP86e3XsIahDEo6UepeHUhh553R8n/8iZs2f4q+Jft/05d+HKBTYc28A7Nd5J0tdWgUlEvJKmyIn4lhwhOWhfoj3tS7QnLj6Ojcc2Mv/gfBYcWnC9uylnSE7qF6pPg0INqJW/FhnSZHA6toikUudjznMu5pzTMUQkJbJwNOoox6KOkSFrBgoXLkx8YLxHfubEnI7hyOIjZCufDZvD3vE1a+SrQccSHZP09VVgEhGvpAKTiO/y93N1LpUPL89bNd7i9wu/s/DQQuYfms+MvTP4ctuX1zugGhRqQMPCDcmfJb/TsUUkFQnwC2Bd13VOxxCRFCg+Pp7WrVuTKVMmPn3vU4KCgjz22m3btmVfwD62TN5C7ty5Pfa613i8wGSM8Qc2A8estQ2NMWOBqsBZ9y6drLXbPZ1LRLyLCkwiKUeOkBx0LNmRjiU7cjXuKmuOruG7A98x7+A8+i7sS9+FfSmarSgNCzWkUZFGVAivQICfzoGJiIiI7/j111+x1pI3b16+/vprAgICPLo0wNq1a5kyZQqvvvqqI8UlcKaDqS+wD7jxmsYvWmtn3O2B9OFTJOVSgUkSQ9873ivQP/D62k2D6wzm0J+H+O7Ad3x38Ds+3vAxH6z7gPvS3keDQg1oXKQxdQvU1VQ6EUlyBq0HJyJJZ+3atTRr1ozChQuzcuVKjyzmfaO4uDj69u1Lzpw56devn0df+0YevY6wMSYMaAB8kcTHTcrDiYgXUIEp5TLGBBtjNhpjdhhj9hhj3nBvN8aYd4wxB4wx+4wxT9+wfZgx5pAxZqcx5lFn/waSlAreV5C+5fqyuP1iTvc7zYyWM2hYuCHfHfyOltNbkm1wNupOrMuIjSM4cvaI03FFRERE/mbs2LFUr16djBkz8vnnnztSn/jyyy/ZvHkzH3zwASEhIR5//Ws83cH0EdAPuPlU5DvGmP8BS4GXrbUxHs4lIl5GheMULQaoYa29YIwJBFYbYxYADwLhQFFrbbwx5n73/vWAQu6vssBn7j8lhcmQJgOPF3ucx4s9Tmx8LOuOrmPuj3OZ8+Mcei/oTe8FvSn1QCmaFm1Ks6LNKH5/cf2sEJF7ox8dIpJIcXFxvPTSSwwZMoSaNWsybdo07rvvPo/nOH36NP3796dq1aq0bdvW469/I491MBljGgInrbVbbnqoP1AUKA3cB7x0m+d3N8ZsNsZsPnXqVPKGFRGvoA6mlMm6XHDfDXR/WeAp4E1rbbx7v5PufZoA493PWw9kNsbk9HRu8awAvwAq56nM4DqDOdDnAPt77WdQrUGkDUzL6yte55GRj1Dok0K8sPgFVh9ZTVx8nNORRUREJBWJiYlh6dKl9OrViwULFjhSXAJ48cUXOXfuHMOHD3f8xJsnp8hVBBobY34BpgA1jDETrbXH3R8aYoCvgDK3erK1drS1NsJaG5E9e3bPpRYRR2iKXMpmjPE3xmwHTgLfW2s3AAWA1u6TCQuMMYXcu4cCR294epR7283HvH4i4sqVK8n8NxBPK5KtCP0q9mNNlzX89vxvjGo4isJZCzNswzAqf1WZXENz0W1uNxYcXMCVOP37i8idaQ0mEblXhw8f5sKFC6RLl45Vq1YxfPhwj6+5dM2KFSv46quveOGFFyhevLgjGW7ksQKTtba/tTbMWpsXaAMss9a2u3YW2rhKbU2B3Z7KJCLey+nquyQva22ctbYkEAaUMcYUB9IA0dbaCOBzYMxdHvP6iYjAIGcGefGMB0IeoPtj3Zn/5Hz+6PcHkx+fTPW81Zm6Zyr1v67P/YPvp/2s9szeP5vLVy87HVdERERSiOXLl1O6dGn69OkD4Oh6R5cvX6ZHjx7kz5+fV1991bEcN/KGawBPMsZkxzUTejvwX2fjiIi3UAdTymetPWOMWQ5E4upM+sb90CxcXa0Ax3CtzXRNmHubCBnTZKRN8Ta0Kd6GmNgYlhxewsx9M5m9fzYTd04kfWB66heqz+MPPk79QvV1RToRERG5J6NGjaJ3794UKlSIAQMGOB2H1157jQMHDrBkyRLSpUvndBzAoQKTtXYFsMJ9u4YTGUTEuxljiI+PdzqGJAP3SYWr7uJSWqA2MAiYDVQHfgaqAgfcT5kL9DbGTMG1uPdZa+1xjwcXr5cmIA0NCjegQeEGjGo4ihW/rGDmvpnM2j+L6XunExwQTL2C9Wj1UCsaFm5ISJBzZx1FRETEN1y9epVnn32WESNGUL9+fb7++msyZcrkaKYNGzYwZMgQunXrRs2aNR3NciNv6GASEfkHTZFL0XIC44wx/rimak+z1s4zxqzG1dX6LHAB+I97//lAfeAQcAno7EBm8TGB/oHULlCb2gVqM6L+CNYcXcOMvTOYsXcGs/bPIjggmPqF6tOqWCsaFG6gYpNIKqM1mEQkoU6ePMm0adN44YUXeO+99/D393c0z6VLl+jQoQOhoaEMHjzY0Sw3U4FJRLyWpsilTNbanUCpW2w/AzS4xXYL9Er+ZJJS+fv5UyVPFarkqcJHkR+x5sgapu+dzvS90/lm3zekDUhLg8INaFXM1dmUNjCt05FFRETEYUeOHCEsLIzQ0FD27NmDt1xs7OWXX+bAgQMsXbrU8U6qm3nyKnIiIgmmq8iJSHLwM35UzlOZYfWGEfVsFD90+oEupbqw+shqWs1oxf0f3E+7b9rx3YHvdDU6kZRMDUwicgcLFy7kkUceYdCgQQBeU1xauHAhn3zyCU8//TQ1anjfakM+XWDSh0+RlEsFJkkMfe9IQlzrbBpefzhRz0axrMMy2hZvy/yD82k4uSE5h+Sk+7fdWf7zcuLi45yOK5JqGWMijTE/GmMOGWNevsXjuY0xy40x24wxO40x9Z3IKSK+z1rLRx99RIMGDcibNy9PPPGE05GuO3nyJJ06daJ48eLXC1/exqcLTNdorRaRlEcFJhHxJH8/f6rnq87oRqM58cIJvm37LfUK1uPrXV9TY3wNwj8M5/lFz7Pt+Db9bBLxIPd6fSOAekAxoK0xpthNuw3AtZ5fKaAN8KlnU4pISnDlyhW6d+/Os88+S5MmTVi9ejV58uRxOhYA8fHxtG/fnjNnzjB58mSCg4OdjnRLKaLAJCIpjwpMIuKUIP8gGhZuyMTmEzn54kmmtZhGmdAyfLLxEx4d/SgPffoQA1cN5JczvzgdVSQ1KAMcstYettZeAaYATW7axwIZ3bczAb/920G1yLeI3GzXrl2MGzeOAQMGMGPGDEJCvOcCIIMGDWLx4sUMGzaM4sWLOx3ntrTIt4h4JRWYRMQbpAtMR8uHWtLyoZb8eflPpu+ZzqRdk3hl2Su8suwVKuWuRLuH29HqoVZkSZvF6bgiKVEocPSG+1FA2Zv2eR1YbIzpA6QHat3qQMaY7kB3gMBcgUkeVER80x9//EG2bNl47LHH+PHHH8mXL5/Tkf5m+fLlDBgwgDZt2tCtWzen49yROphExCtp6quIeJv70t5Hj4gerOy8kp/7/sw7Nd7h9KXT/Pe7/5JzSE5aTW/Fdwe+IzY+1umoIqlNW2CstTYMqA9MMMb843OOtXa0tTbCWhsREKDz7CICc+fOJX/+/MyaNQvA64pLx44do02bNhQpUoTPP//c6z8jqcAkIl5LHUxyryz63pHklTdzXv6v8v+xp+cetnTfQo/HerD8l+U0nNyQsKFhPL/oeXb+vtPpmCIpwTEg/Ib7Ye5tN+oKTAOw1q4DgoFsHkknIj7JWst7771H06ZNKVKkCGXKlHE60j9ER0fTvHlzLl26xMyZM71qyt7tqMAkIl5JU+RExBcYY3g056N8XO9jjj13jNmtZ1MhvAKfbPyEEiNLUGpUKT7Z8AmnL512OqqIr9oEFDLG5DPGBOFaxHvuTfscAWoCGGMexFVgOuXRlCLiM6Kjo2nfvj39+/endevWrFy5ktDQUKdj/Y21lqeeeoqNGzcyYcIEHnzwQacjJYgKTCLilVRgEhFfE+QfRJOiTfim9Tf89vxvDK83HH/jz9MLnybX0Fy0ntGaRYcWERcf53RUEZ9hrY0FegOLgH24rha3xxjzpjGmsXu354FuxpgdwGSgk9UvESJyG/PmzWPSpEm8/fbbfP3116RNm9bpSP8wZMgQxo4dy2uvvUbTpk2djpNgmnwsIl7J2+cXi4jcSbZ02ehVphe9yvRix4kdfLX9KybunMi0PdMIyxhGpxKd6FyqM/mz5Hc6qojXs9bOB+bftO1/N9zeC1S8m2PqKnIiqc/FixdJnz49LVq0YPv27ZQoUcLpSLc0d+5c+vXrR8uWLfnf//7370/wIupgEhGvpZOPcs/0rSNepMQDJfgo8iOOPXeM6S2n8/D9DzNw9UAKDCtA7Qm1mb5nOlfirjgdU0REJMWaPn06efPmZfv27QBeW1zatGkTbdu2JSIigrFjx+Ln51slG99KKyKphqbIiUhKkyYgDS2KtWD+k/P59ZlfebPamxw4fYBWM1oRNjSMft/348DpA07HFEkd1MAkkirEx8fz+uuv06pVKwoXLkzOnDmdjnRbhw8fpmHDhtx///18++23pEuXzulId00FJhHxSiowSWLoKnLi7cIyhvFq1Vc5/PRhFjy5gEq5KzF03VCKDC9C9XHVmbp7qrqaREREEuHixYu0bt2aN954g06dOrFs2TJy5MjhdKxbOnnyJHXr1iU2Npb58+d7bc5/owKTiHglFZhEJDXw9/MnsmAk37T+hqPPHmVgjYH8cuYX2sxsQ+4PczNg2QCOnD3idEwRERGfM3z4cGbOnMkHH3zAmDFjSJMmjdORbuns2bPUq1ePY8eO8d133/nMFeNuRQUmEfFKKjCJSGqTM0NO+lfuz09P/8T8J+ZTOrQ0A1cNJN/H+Wg8uTELDi4g3sY7HVNERMSrXb16FYDnnnuOVatW8fzzz3vtBYQuXbpEo0aN2LlzJzNnzqRcuXJOR0oUny4w6cOnSMqlApOIpFZ+xo96herxbdtv+bnvz7xc8WU2HNtA/a/rU/iTwny47kPORJ9xOqaIT9NV5ERSpgkTJlC8eHFOnjxJYGAgFSve1QUmPSo6OpomTZqwevVqJkyYQL169ZyOlGg+XWC6xlurkSJy7/T/WkQE8mTOwzs13+Hos0eZ/PhkcoTk4LnFzxE2NIye3/Vk76m9TkcUERFxXFxcHC+//DIdOnQgV65c+Pv7Ox3pjmJiYnj88cdZsmQJY8aMoU2bNk5HShIposAkIimTOphERFyC/INoU7wNa7qsYUv3LbR8qCVjto3hoU8fotb4Wsz9ca6mz4mISKp0/vx5mjVrxqBBg+jRoweLFy8ma9asTse6rejoaJo3b878+fMZOXIknTp1cjpSklGBSUS8kqbISWLoKnKSkj2a81G+avLV9UXBfzz9I02mNKHI8CIM3zicC1cuOB1RRETEY1588UXmz5/P8OHD+eyzzwgMDHQ60m1dunSJJk2aXC8u9ejRw+lIScrjBSZjjL8xZpsxZp77fj5jzAZjzCFjzFRjTJCnM4mI91GBSUTkzrKnz07/yv05/PRhpjw+haxps9JnQR/CPwyn3/f9OHr2qNMRRUREkk18vKtz95133mHJkiX06tXLq5fZOHfuHPXr1+f777/nyy+/THHFJXCmg6kvsO+G+4OAD621BYG/gK4OZBIRL6MCk4hIwgT6B9K6eGvW/2c9a7uspXb+2gxZN4R8H+fjyW+eZPuJ7U5HFBERSVJffPEFtWvX5sqVK2TNmpVq1ao5HemO/vjjD2rWrMnq1auZOHEiXbp0cTpSsvBogckYEwY0AL5w3zdADWCGe5dxQFNPZhIR76QCkySKvnUklSofXp5pLadx+OnDPFPuGb798VtKjSpF7Qm1WfzTYv1cFRERnxYbG8szzzxDt27dCAwMJDo62ulI/+rXX3+lUqVK7N69m1mzZvHEE084HSnZeLqD6SOgH3BtFcqswBlrbaz7fhQQ6uFMIuKFvLm9VUTE2+XJnIcP6nzAkWePMKjWIPac3EPdiXUpNaoUk3ZOIjY+9t8PIpKCGfR7hoiv+euvv6hfvz4ff/wxzzzzDPPmzSNjxoxOx7qj7du3U6FCBX7//XcWL15Mo0aNnI6UrDxWYDLGNAROWmu33OPzuxtjNhtjNp86dSqJ04mIN9KZdrlXWuRbxCVzcGb6VezHz31/ZkzjMVyNv0q7We0o/ElhPtv0GdGx3n/mV0REBOCJJ55gxYoVfPHFF3z44YcEBAQ4HemOFi1aROXKlfHz82PVqlVUrlzZ6UjJzpMdTBWBxsaYX4ApuKbGfQxkNsZc+84IA47d6snW2tHW2ghrbUT27Nk9kVdEHKQpciIiSSdNQBo6l+rMrqd2MafNHO5Pfz895/ck38f5eH/N+5yLOed0RBERkTsaPHgwS5YsoWtX71+2+bPPPqNBgwYUKFCA9evXU7x4cacjeYTHCkzW2v7W2jBrbV6gDbDMWvsksBxo4d6tIzDHU5lExHupwCQikvT8jB+NizRmXdd1LOuwjIfvf5iXlrxEno/y8Nry1/jz8p9ORxTxDM2QE/F61lqGDx9Oz549sdZSvHhxqlSp4nSsO4qNjaVPnz707NmTyMhIVq1aRWho6lkFyImryN3sJeA5Y8whXGsyfelwHhHxAlqDSUQk+RhjqJ6vOovbL2bjfzZSPW913lz5Jnk/ysuAZQM4fem00xFFRCQVu3r1Kk899RR9+vQhKiqKq1evOh3pX/3xxx/UqVOH4cOH8/zzzzNnzhwyZMjgdCyPcqTAZK1dYa1t6L592Fpbxlpb0Frb0lobcxfHSb6QIuI4/R8XEUl+pUNL803rb9j5353UK1SPgasGkuejPLy85GVOXdS6lyIi4lmnT5+mTp06jBo1ipdffpnZs2cTFBTkdKw72rJlCxEREaxdu5axY8fywQcf4O/v73Qsj/OGDqZEU6eDSMqjKXIiIp71cI6HmdpiKrt77qZJ0SYMXjuYfB/no/+S/upokhRHV5ET8U7x8fHUrFmTdevWMWHCBN599138/Ly3bGGt5csvv6RixYrEx8ezatUqOnbs6HQsx3jvv5SIpGoqMEli6CpyIveuWPZiTGo+ib0999K4SGMGrRlEvo/z8dry1zgTfcbpeCIikoL5+fkxcOBAVqxYQbt27ZyOc0cXLlygU6dO/Oc//6Fy5cps2bKF0qVLOx3LUSowiYhXUoFJRMRZRbIV4evHv2bnUzupU6AOb658k3wf5+Odle9w8cpFp+OJiEgKYa3lgw8+4NNPPwWgfv36lCtXzuFUd7Z9+3YiIiKYMGECr7/+OgsXLkRXu1eBSUS8lApMIiLeofj9xZnRagbbemyjcu7KDFg+gALDCjBi4wiuxF1xOp6IiPiwmJgYOnfuzIsvvsjq1au9/vf/+Ph4PvroI8qWLcu5c+dYunQpr732Wqpcb+lWVGASEa+kApMkir51RJJcyQdKMrftXNZ2WUuRbEXovaA3RYcXZeLOicTFxzkdT0REfMyJEyeoXr0648aN4/XXX2fixIlevb7ysWPHiIyM5Nlnn6Vu3brs2LGD6tWrOx3Lq6jAJCJeyZsHFxGR1Kx8eHlWdFzBgicXkDk4M+1nteex0Y/x/U/fOx1NRER8xIULFyhXrhzbt29n+vTpvPbaa167mLe1lkmTJlG8eHHWrFnDyJEjmTNnjqbE3YJ3/guKiIA6mOSeaZFvkeRljCGyYCSbu2/m6+Zfcy7mHHUm1qHuxLrs/H2n0/FERMTLhYSEXJ8W16JFC6fj3Nbx48dp1qwZ7dq1o1ixYmzfvp0ePXroZPhtqMAkIl5JU+RERLyfn/Gj7cNt2ddrH0PrDGXTsU2UHFmSznM6c+zcMafjiYiIF7HW8vbbb7Ns2TIAevXqxaOPPupwqluz1jJmzBiKFSvGokWLGDx4MCtXrqRQoUJOR/NqKjCJiFdSgUlExHekCUjDs+Wf5aenf+L58s/z9a6vKTy8MG+vfJvLVy87HU9ERBx26dIl2rZty6uvvsqsWbOcjnNH+/fvp3r16nTt2pVHHnmEHTt28MILL2gh7wRQgUlEvJIKTCIividL2iwMrjOYfb32EVkwkleXv0rREUWZunuqfqaLV9H0FhHPOXbsGFWqVGHatGm89957DBs2zOlIt3Tp0iUGDBhwvag0atQoli9fTuHChZ2O5jN8usCkX1REUi4VmEREfFf+LPmZ2WomyzsuJ0twFtrMbEOVsVXYfmK709FERMSDoqKiKF26ND/++CNz5szhpZde8roCr7WWWbNmUaxYMd555x3atGnD/v376d69u9cuPO6tUsS75W3foCKSeCowiYj4vmp5q7Gl+xZGNxzN/j/289jox+g9vzd/Xf7L6WgiIuIBoaGhtG3blrVr19KoUSOn4/zDrl27qF27Ns2bNydDhgysWLGC8ePHkyNHDqej+aQUUWASkZRHheOUyxgTbIzZaIzZYYzZY4x546bHhxljLtxwP40xZqox5pAxZoMxJq/HQ4vIPfP386fbY9040PsAPSN68tnmzyg8vDBfbP2CeBvvdDwREUli8fHxvP322/z0008YYxgyZAgPP/yw07H+5sSJE/To0YOSJUuydetWPvnkE7Zt20bVqlWdjubTVGASEa+lDqYUKwaoYa0tAZQEIo0x5QCMMRFAlpv27wr8Za0tCHwIDPq3F7Doe0fE22RJm4VP6n/C1u5bKZqtKN2+7Ublryqz6/ddTkcTEZEkcuHCBR5//HFeffVVvv76a6fj/MP58+d5/fXXKViwIGPGjKFPnz4cOnSI3r17ExAQ4HQ8n6cCk4h4JU2RS7msy7UOpUD3lzXG+AODgX43PaUJMM59ewZQ06jFTcRnlXigBCs7rWRsk7EcOH2AUqNK8eLiF7lw5cK/P1lERLzWr7/+SsWKFZk7dy4fffQRAwYMcDrSddHR0Xz00UcUKFCAN954g3r16rF3714++ugj7rvvPqfjpRgqMImIV1KBKWUzxvgbY7YDJ4HvrbUbgN7AXGvt8Zt2DwWOAlhrY4GzQNY7voC+dUS8mjGGjiU7sr/XfjqX7MwH6z7goU8fYv7B+U5HExGRe7B7925Kly7Nr7/+yvz58+nbt69XLHkRExPDZ599RsGCBXn22Wd55JFH2LBhA9OnT6dQoUJOx0tx1AMmIl5JBaaUzVobB5Q0xmQGZhljqgAtgWr3ekxjTHegO4B/Lv8kSCkiyS1ruqx83vhzOpXsRPd53WnwdQPaFm/LR5EfcX/6+52OJ6nArFmzmDlzptMxRHxebGwsadOmpVy5ckyYMIEJEyY4HQlrLStXriQqKoqKFSsyfvx4atSo4XSsFE0FJhHxSiowpQ7W2jPGmOVAdaAgcMh9tiudMeaQe92lY0A4EGWMCQAyAadvcazRwGiANOFp9M0j4kMq5q7I1u5bGbRmEG+vfJtFPy3iw7of0v6R9l5xBlxSHoPr+2ro0KFs3ryZ0NBQhxOJ+KYzZ86QMWNG/Pz8CAwMZO/evU5H+psiRYowZswYatWqpfHEA1RgEhGvpAJTymWMyQ5cdReX0gK1gUHW2gdu2OeCu7gEMBfoCKwDWgDL7L98c2iRbxHfkyYgDf+r+j9aFGtBt2+70XF2R6btmcaohqMIzagP/5I8Lly4QO3atZk7d67TUUR8ytmzZ2nbti0LFixg0KBBdO3a1elI4gW0BpOIeCUVmFK0nMByY8xOYBOuNZjm3WH/L4GsxphDwHPAyx7IKCIOKZa9GKs6r+Kjuh+x7OdlPPTpQ4zdPlZjgiSLCxcuEBIS4nQMEZ9y6NAhypcvz/fff8/IkSNVXJLr1MEkIl5JBaaUy1q7Eyj1L/uE3HA7Gtf6TCKSSvgZP/qW60uDwg3oMqcLned0Zvre6XzR6AtyZsjpdDxJQVRgErk7a9eupWHDhhhj+P7776lWrZrTkcSL+HQHkz58iqRcKjCJiEjB+wqyotMKPo78mGU/L+Phzx5mxt4ZTseSFOTChQukT5/e6RgiPiM8PJxSpUqxceNGFZfkHzxWYDLGBBtjNhpjdhhj9hhj3nBvH2uM+dkYs939VfIejp3keUXEWfp/LSIi4Opmerrs02zrsY18WfLRcnpL2s9qz9nos05HEx9nreXixYvqYBL5F1evXmX06NHEx8cTHh7O0qVLKVCggNOxxAt5soMpBqhhrS0BlAQijTHl3I+9aK0t6f7a7sFMIuLF1MEkIiLXFM1WlLVd1vJa1deYvGsyJUeVZO3RtU7HEh92+fJlrLXqYBK5gz///JPIyEh69OjB4sWLnY4jXs5jBSbrcsF9N9D9pU+PInJLmiIniaGryImkTIH+gbxe7XVWd1mNwVD5q8q8+cObxMbHOh1NfNDFixcBVGASuY19+/ZRtmxZVq9ezdixY4mMjHQ6kng5j67BZIzxN8ZsB07iumrQBvdD7xhjdhpjPjTGpPFkJhHxTiowiYjI7ZQLK8f2/27niYef4LUVr1FjXA2izkU5HUt8zLUCk6bIifzT4sWLKVeuHOfOnWP58uV07NjR6UjiAzxaYLLWxllrSwJhQBljTHGgP1AUKA3cB7x0q+caY7obYzYbYzafOnXKU5FFxCEqMEmi6FtHJMXLmCYjE5pNYEKzCWw9vpWSI0sy/+B8p2OJD1EHk8jtpU+fnqJFi7Jp0yYqVKjgdBzxEY5cRc5aewZYDkRaa4+7p8/FAF8BZW7znNHW2ghrbUT27Nk9mFZEnKACk4iIJES7R9qxtcdWwjKG0eDrBrz0/UuaMpeCGGMijTE/GmMOGWNevs0+rYwxe90XEvo6gce9XmBKly5dEiYW8V0xMTHMmTMHgIoVK7J+/Xpy587tcCrxJZ68ilx2Y0xm9+20QG1gvzEmp3ubAZoCuz2VSUS8lwpMIiKSUIWzFmZd13X897H/8v7a96k5viYnLpxwOpYkkjHGHxgB1AOKAW2NMcVu2qcQrhkRFa21DwHPJPT4ly5dAtTBJAJw8uRJatWqRdOmTdm92/WRXFd1lrvlyQ6mnMByY8xOYBOuNZjmAZOMMbuAXUA24G0PZhIRL6UBTRJDi3yLpD5pA9PyWcPPmNBsApuObaLUqFKs+nWV07EkccoAh6y1h621V4ApQJOb9ukGjLDW/gVgrT2Z0INfKzCpg0lSu507d1KmTBk2b97M5MmTKV68uNORxEd58ipyO621pay1j1hri1tr33Rvr2Gtfdi9rd0NV5oTkVROHUwiInK32j3Sjg3/2UCGoAxUH1ed4RuHazzxXaHA0RvuR7m33agwUNgYs8YYs94Yk+DLXKnAJAJz5syhQoUKXL16lVWrVtGmTRunI4kPc2QNJhGRf6MpciIicq8ezvEwm7ptokHhBvRZ0Ieuc7sSHRvtdCxJHgFAIaAa0Bb4/NqyHDe78aJBMTExmiInAvzxxx8UK1aMTZs2ERER4XQc8XEqMImIV1KBSUREEiNTcCZmtZ7Fa1Vf46vtX1F1bFWOnz/udCy5O8eA8Bvuh7m33SgKmGutvWqt/Rk4gKvg9A83XjQoTZo01wtMadOmTfrkIl4sOjqatWvXAtC1a1fWrFlDrly5HE4lKYFPF5j04VMk5VKBSUREEsvP+PF6tdf5ptU37Dm5h9Kfl2br8a1Ox5KE2wQUMsbkM8YEAW2AuTftMxtX9xLGmGy4pswdTsjB1cEkqdHx48epWrUqderU4eRJ15JlgYGBDqeSlMKnC0zXaDFgkZRHBSZJDC3yLSI3avZgM9Z0WYO/nz+VxlRixt4ZTkeSBLDWxgK9gUXAPmCatXaPMeZNY0xj926LgNPGmL3AcuBFa+3phBz/8uXLgDqYJPXYsmULpUuXZs+ePUycOJH777/f6UiSwqSIApOIpDwqMImISFIq8UAJNv5nIyUfKEnL6S0ZvGawxhkfYK2db60tbK0tYK19x73tf9baue7b1lr7nLW2mPvCQVMSclyD4dKlS/j7+6t7Q1KFadOmUblyZfz9/VmzZg1NmzZ1OpKkQCowiYhXUoFJRESSWo6QHCzruIxWD7Wi35J+9PyuJ7HxsU7HEodcunRJ3UuSaqxZs4ZHH32UTZs2UaJECafjSAoV4HQAEZFbUYFJEkXfOiJyG8EBwUx+fDL5Mudj0JpBHD13lGktp5EuUJeqT20uX76sApOkaBcvXuTYsWMULlyYIUOGEBcXR5o0aZyOJSmYOphExCupwCQiIsnFz/jxXq33+KzBZyw4tICa42ty+lKClu2RFEQFJknJjh49SqVKlahTpw4xMTEEBASouCTJTgUmEfFKWrxfEkOLfItIQvw34r9Mbzmdbce3UemrShw9e9TpSOJB0dHRKjBJirRu3TpKly7N4cOH+fTTT1VYEo9RgUlEvJY6mEREJLk1f7A5i9sv5rfzv1Hpq0ocOH3A6UjiIepgkpRo/PjxVKtWjZCQENatW0f9+vWdjiSpiApMIuKVNEVOREQ8pUqeKqzouILLVy9TaUwltp/Y7nQk8QAVmCSliY+PZ8KECVSsWJENGzZQrFgxpyNJKpOgApNxCU/uMCIi12iKnIiIeFKpnKVY1XkVwQHBVB9XnU3HNjkdKUmdiT7DoNWDnI7hVaKjowkODnY6hkiinTt3jlOnTuHn58fMmTNZtGgRWbNmdTqWpEIJuoqctdYaY+YDDydzHhER4P8XmKy1KjaJiIhHFMlWhJWdV1JjXA1qjq/JgicXUDF3Radj3bXY+Fh2n9zNhqgNrD+2nvVR69n/x36nY3mdy5cvkzFjRqdjiCTK4cOHadSoEdmyZWPFihX6nhZHJajA5LbVGFPaWpuyTueIiFdSgUkSQ4t8i8i9yps57/UiU+SkSBY+udDri0y/nf/NVUyKWs/6Y+vZ/NtmLl29BED2dNkpG1aW1g+15r3V7xFDjMNpvYc6mMTXrVixghYtWhAfH8+wYcP0O7M47m4KTGWBJ40xvwIXAYOruemRZEkmIqnajQUmERERTwrLGMYPnX6g2rhqXldkio6NZtvxbayPWs+6qHWsj1rP0XOuq98F+gVS8oGS/KfUfygbVpZyYeXIlzkfxhiWHF5CTJyKSzfSVeTEl40ePZpevXpRsGBB5s6dS6FChZyOJHJXBaa6yZZCROQmOgMjIiJOypkhJ8s7Lqf6uOpETopkSfsllA0r69EM1lqOnD1yvZC0Pmo9205s40rcFQDyZMpD+fDyPBf2HGVDy1IqZymCA27dkTN9z3TSBabjEpc8+VfwWgZDdHS0Lt8uPunSpUu8//771KpViylTppApUyanI4kAd1Fgstb+aozJAhQCbhy5fk3yVAmkzgaRlE//z+We6NtGRJJArgy5WNZhGVXHViVyUiTLOy6n5AMlk+31Ll+9zObfNl8vKK2LWseJCycASBuQlohcETxT9hnKhZWjXFg5cmbImaDjno85z5Q9U3j8wceZwIRky+9rNEVOfM2ZM2dImzYt6dKl44cffuCBBx7A39/f6Vgi1yW4wGSM+Q/QFwgDtgPlgHVAjWRJdhfU6SCS8miKnHcyxoRba4/e5rGG1tp5ns4kIpKcQjOGsrTDUip/VZnaE2qzqvMqimYrmujjWmv55cwvrItax7qj61gXtY4dv+8gNj4WgAJZClArfy3KhbqKSY/keIRA/8B7eq2Rm0dyLuYcvUr3UoHpGoM6mMSnHDhwgEaNGlGtWjVGjRpFaGio05FE/uFupsj1BUoD66211Y0xRYGByRNLRFI7FZi81vfGmEhr7S83bjTGdAFeAVRgEpEUJ0/mPNeLTHUm1GF1l9XkzpT7ro5x6eoltvy2hXVR61h7dC3ro9bz+8XfAUgfmJ4yoWXoV6Hf9e6k7OmzJ0n2kxdPMnD1QOoWqOvxKX7eLiYmRh1M4hO+//57WrVqRUBAAO3bt3c6jsht3U2BKdpaG22MwRiTxlq73xhTJNmSiUiq5ufnB0B8fLzDSeQmzwGLjTENrLUHAYwx/YEngKqOJruJrkAoIkmpUNZCLGq3iKpjq14vMmVLl+2W+/5bd1LB+wpSp0AdyoeVp1xYOR7O8TABfnfza3nCxNt4uszpwqWrl/iw7odJfnxfZq0lNjZWHUzi1ay1DB8+nGeffZZixYoxd+5c8ubN63Qskdu6m5EsyhiTGZiN6wz2Xzi4/pKIpGzqYPJO1tr5xpgYYIExpinwH6AMUMVa+5ej4W5isRhUYBKRpFPigRJ82/Zb6kysQ6PJjVjaYalr4eyrl1xrJx1dx/pj61l3dN3fupNKh5bmxQovXi8oJVV30p1Ya3lm4TN8d/A7htcbzoPZH0z21/Qp7l8vdBU58WbHjx/nlVdeoWHDhkyYMIEMGTI4HUnkju5mke9m7puvG2OWA5mAhQl9vjEmGFgJpHG/7gxr7WvGmHzAFCArsAVob629ktDjikjKpAKT97LWLjXGdAZWAGuBGtbaaGdT/VP/Jf3x99PClyKS9OoXrM+s/bPIOigrmYMz8/vF37HuikWW4CyEZgilxAMlCM0Qyv3p78fPuLpy10W5upmS26Wrl5h3YB4//fUTz5V7jp6leyb7a/oc968X6mASb3T+/HlCQkLIlSsX69evp2jRote7+0W82d0s8h0M9AQq4fqRvBq4m+/yGFwfQi4YYwKB1caYBbimW3xorZ1ijBkJdAU+u4vjikgKpKlN3skYcx7XGGBwnTCoCZw0rn8wa63N6GS+Gw1dN1TfRyKSbPyMH9Fx0fx+8XcMBj/jh8Fw4coFfjz9Iz+e/tGxbNZaYm0sTYo04YM6H+hn4S1cO4GlApN4m927d9O4cWOeeeYZnn76aYoVK+Z0JJEEu5spcuOB88An7vtPABOAlgl5snX9FL/gvhvo/rK4rkL3hHv7OOB1VGASETd1MHkXa63P9GbHvBpzvWtARCQ1uXjlIiHvhlAhvILXFpeMMS9Zawc5FkAdTOKF5s2bR9u2bQkJCaFcuXJOxxG5a3dTYCpurb2xfLrcGLP3bl7MGOOPaxpcQWAE8BNwxlob694lCtD1FkVEU+Qk0bT+koikVukC0xHoF8ifl/90Osp1xphpN94FSgKOFZjUwSTexFrLBx98wEsvvcSjjz7K7NmzCQsLczqWyF27m1O7W40x18uoxpiywOa7eTFrbZy1tiQQhmtR2KIJfa4xprsxZrMxZvOpU6fu5mVFxAepwCSJ5a1n7UVEkpsxhixps/DXZa+69sI5a20r91dLYImjadTBJF5k27ZtvPTSS7Rs2ZKVK1equCQ+6187mIwxu3D9CA4E1hpjjrjv5wH238uLWmvPuBcKLw9kNsYEuLuYwoBjt3nOaGA0QEREhD5xiqRwKjB5J2NMeWC91T+MiIhXyxKchTMxZ5yOcaN3brr/iiMp3NTBJN7gypUrBAUF8eijj7J69WrKly+vE2Ti0xLSwdQQaAREAvmAqkA19+16CX0hY0x2Y0xm9+20QG1gH7AcaOHerSMwJ6HH1OcbkZRLBSav1QHYYoyZYozpZIx5wOlAIiLyT97SwWSM+d4YU8Ja+/ON2621zs7fUweTOGzbtm0ULVqU77//HoAKFbx3zTSRhPrXDiZr7a9J9Fo5gXHudZj8gGnW2nnudZymGGPeBrYBX97tgfUfUSTlUYHJO1lrnwIwxhTFdZJhrDEmE66TBQuBNdbaOAcjiogIkDk4M39c+sPpGAAvAR8ZY34B/s9ae9zhPABY1MEkzpk5cyYdOnTgvvvuI2vWrE7HEUkyd7PId6JYa3cCpW6x/TCu9ZhERK5Tgcm7WWv345om/aG7K7U6rquKDgUinMwGoPW9RSS1yxKchYOnDzodA2vtVqC6MeZxYKEx5hvgfWvtZWeDuf4ICgpyNIakLtZa3nrrLV577TXKlSvHrFmzeOABNYNLyqHrN4uIV1KByXdYay9ba+dba/tYa50vLomIiGsNpugzTscAwLgG9R+Bz4A+wEFjTHsnM2kNJnHC7Nmzee211+jQoQPLly9XcUlSnH8tMBljyhvNQRMRD1OBKeUyxgQbYzYaY3YYY/YYY95wb59kjPnRGLPbGDPGGBPo3m6MMcOMMYeMMTuNMY86+zcQEfF+mYMzcyb6jOPjqDFmDa6L+HwIhAKdcK3nWsYYM9qxYOpgEg+Kj48HoGnTpsydO5exY8cSHBzscCqRpJeQDiYt6CoiHqe6tncyxgxJgsPEADWstSWAkkCkMaYcMAkoCjwMpAX+496/HlDI/dUd1xlwERG5g8zBmYmzcVy4csHpKN2BUGttbWvtq9baedbaQ9baPkBlx1KpwCQesmHDBh555BEOHTqEMYZGjRrp91xJsf61wGStfcpa+yjwOpAF14Ku64wxA40xVdyLdouIJAunz7zKP1RP7AGsy7VPPIHuL+ueZmet6x99IxDm3qcJMN790HogszEm551ew2gRJhFJ5TIHZwbgbMxZR3NYa/fY2w/mDTwa5gaaIieeMGnSJKpWrcqlS5e4cuWK03FEkl2C12Cy1u631n5orY0EagCrcS3ouiG5wolI6qUpcimbMcbfGLMdOAl8b63dcMNjgUB7XFelA9eUiqM3PD3Kve3mY3Y3xmw2xmzW942IpHbXCkzesg7Trbgv9uPQi7v+UAeTJIf4+Hj+7//+j3bt2lGuXDk2btxIsWLFnI4lkuzu6Spy7qs+zHd/iYgkOT8/V/372px18RoljDE/A7uA3Tf8uc9aG5vQg1hr44CSxpjMwCxjTHFr7W73w58CK621q+4mmLV2NDAawC/UTxUmEUnVMgVnAry7wOQk664wqcAkyWHYsGG8++67dOvWjeHDh+v7TFKNeyowiYgkN3Uwea2duKY0FMe1VlId4HmgkDHmqLW2+N0czFp7xhizHIgEdhtjXgOyAz1u2O0YEH7D/TD3NhERuY3rU+SinZ0i57XUwSTJwFqLMYYePXqQPXt2nnjiCa23JKlKgqfIiYh4kgpM3sta+5u1drG1doi1trO1NgLIDDRLyPONMdndnUsYY9ICtYH9xpj/AHWBttbaG1vX5gId3FeTKwectdYeT8K/kohIipMpjauDyek1mLyWCkySxFavXk316tU5d+4cadOm5cknn1RxSVKdBBeYjDH1jDEb3JeQnmaMKZ+cwRJCHzxFUi4VmLzW8FttdC/AfTCBx8gJLDfG7AQ24VqDaR4wEsgBrDPGbDfG/M+9/3zgMHAI+BzomZi/gIhIanBtipw6mG7t2u8XgYGBDieRlODLL7+kRo0a/Pbbb5w+fdrpOCKOuZspcp8C7YC9wGPAYGPMCGvt5GRJJiKpms74eCdr7ZdJcIydQKlbbL/lmOS++lCvu3kNXUVORFK7jGkyAupgupOAgAD9viGJEhsbS79+/fjwww+pXbs2U6dOJUuWLE7HEnHM3UyRO2mtXWOt/ctauwTXNIZXkimXiAigDiYREZF7kTYgLQF+AVrk+zastZoeJ4n20ksv8eGHH/L0008zf/58FZck1bubDqafjTFvA29aa68AV4EEXzFIRORuaIqcJIpOSItIKmeMIVOaTJyPOe90FO9kNT1OEu/ZZ5/l4YcfplOnTk5HEfEKd9PBFI9rAdejxpjVuNbCWGGMKZQsyUQkVVOBSUREJHEyBWfSFLnbsVrgW+7N0qVL6dChA3FxcYSFham4JHKDBHcwWWufADDGpMF1eeoS7q/PjTH5rbW5kyfi7cXExAAwc+ZMT7+0SIpx5coVDh8+TP78+b3qF62tW7cCEBUVRVhYmNZIEBERuUuZ0mTiXMw5p2N4JWutOpjkrn366ac8/fTTFC1alNOnT3P//fc7HUnEq9zNFDkArLUxwBb3l6M2btwIQIsWLRxOIiLJpUKFCmTLlo2IiAjKlClDuXLlKFeunOa4i4iI/IuMaTKqwHQ7miInd+Hq1av07duXzz77jIYNGzJp0iQyZszodCwRr3PXBSZv8uCDD7J69Wq2bHG81iXik7744guGDRtGjRo1yJw5M8uWLePMmTNkyJCBmjVr0qBBAyIiIvD39/d4trNnz/LLL7/w119/sWPHDjZu3Mjbb79NfHw8AMWKFaNSpUpUrVqVqlWrEhoa6vGM4r10FTkREciQJgNR56KcjuGVLFrkWxKuY8eOTJ48mX79+jFw4EBHfjcW8QU+XWDy9/cnffr0PPzww05HEfE5ixYtYvjw4bRp04avv/4aYwxXr15l2bJlTJ48mW+++YbZs2cTGhpKu3bt6NixIw8++KBHM1aqVOlv9y9cuMCmTZtYu3Ytq1evZsqUKYwePRqAwoULU6tWLerUqUP16tV1VklERFK9jGkyapHv29EaTHIXnn76aSIjI+nQoYPTUUS8mvHFBXQjIiLs5s2b6d69O99++y3Hjx93OpKIT/npp5+IiIggd+7crF27lvTp0/9jn8uXL/Ptt98yfvx4Fi5cSFxcHGXLlqVz5860bdvWKwo4cXFx7Nixg+XLl7Ns2TJ++OEHLl68SEBAAJUqVaJBgwY0atSIIkWKOB3VY4wxW6y1EU7ncFpAWICNjdKFTkUkdXtq3lPM3DeTky+evL5N44RLmvRpbLHCxdi2bZvTUcRLLViwgC1btjBgwACno4h4VGLGibu5ipzXiY6OJk2aNE7HEPEp58+fp2nTphhjmDVr1i2LSwBp06alVatWzJs3j2PHjjFkyBAuXLjAf//7Xx544AE6derEmjVrHL3Km7+/P48++ijPP/883333HX/++SfLly/nhRde4PTp07z44osULVqUokWL0r9/fzZv3qyr0omISKqRIU0Gzl9RB9OtWLTIt9yatZahQ4fSsGFDZs6cyeXLl52OJOIzfL7AlDZtWqdjiPiM+Ph42rdvz759+5g2bRr58+dP0PNy5MjBc889x65du9iwYQPt2rVj5syZVKpUieLFi/Pxxx/z119/JXP6fxcUFES1atV499132blzJ7/++ivDhw8nPDycwYMHU7p0aQoUKED//v3ZtWuX03FFRESSVYagDETHRnM17qrTUbyPFvmWW4iJiaFLly48//zzNGvWjNWrV+vzpshd8PkCU3BwsNMxRHzGgAEDmDNnDh9++CG1atW66+cbYyhTpgyjR4/m+PHjfPHFF4SEhPDMM8+QK1cuOnfuzMaNG72mSyh37tz06tWL77//npMnTzJmzBiKFCnC4MGDeeSRRyhRogRDhgzh999/dzqqiIhIksuQJgOAz3cxGWMijTE/GmMOGWNevsN+jxtjrDHm36d2qMAkN7HWUr9+fcaOHcv//vc/pk2bdttOfxG5NZ8vMKmiLJIw48eP591336Vbt2707t070ccLCQmha9eubNiwga1bt9KpUydmzJhB2bJlKV26NGPGjPGqluL77ruPzp07s2DBAo4fP87w4cMJDg7mhRdeIDQ0lGbNmjF//nzi4uKcjipJQFeRExFxLfIN+PRC38YYf2AEUA8oBrQ1xhS7xX4ZgL7AhoQcV1Pk5GbGGDp16sSUKVN444038PPz6Y/KIo7w2P8aY0y4MWa5MWavMWaPMaave/vrxphjxpjt7q/6CT2mOphEEmb16tV069aNGjVqMGLECIxJ2g/fpUqV4rPPPuPYsWMMHz6cy5cv07VrV8LCwujXrx8///xzkr5eYmXPnp1evXqxYcMG9u3bx3PP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", + "image/png": "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5cvHRx99RGRkJEOGDOG3336jWbNmFClShGHDhnH+/HmP51m7di0NGjSgV69evPDCC8THx3s0g4iIpHzpA9Nz8cpFXWDiJrQGk285cOAAZcuW5ccff2TMmDF8+OGH+jcU8TI+X2BSB5OkZJ999hnt27enSpUqLFmyhKxZszodyedlzpyZ5557jkOHDjFt2jTuu+8++vbtS1hYGC+88AK//fabx7IEBwcza9Ys+vTpw5AhQ3jiiSe4cuWKx15fRERSvgxBGbBYouOinY7idbQGk2+52nW+fPlyOnfu7HAaEbkZny8wqYNJUiJrLW+88Qa9evWiUaNGzJ8/n4wZMzodK0UJCAigZcuWrF27lvXr1xMREcHHH39M/vz5admyJWvWrPHI2V5/f38++eQTBg0axJQpU2jcuDEXL2qtDBERSRrpA9MDaJrcTWiKnPez1rJ48WKstTzwwAPs3buXihUrOh1LRG7B5wtM6mCSlCYuLo5evXrx5ptv0qlTJ7799lstZp/MypYty5QpU/jll1948cUXWbp0KZUqVaJ06dJMmDAh2buKjDH069ePr776ih9++IG6dety7ty5ZH3NlM5oESYREeD/F5h0Jbl/0/Qq73blyhW6d+9O3bp1mT17NqCioIi38/kCkzqYJCW5fPnytSti9OvXjzFjxmgg9aCwsDDef/99jh49ymeffcbFixfp0KEDefLk4a233uKPP/5I1tfv0qULU6ZMYcOGDdSuXZszZ84k6+uJiEjKpw6mW1OByXv9+eef1K5dmy+//JJXXnmFJk2aOB1JRBLA5wtM6mCSlOLPP/+kZs2azJkzh48//phBgwbpkqsOyZAhA0899RR79uxhwYIFlCxZktdff53cuXPTqVMntm7dmmyv3bJlS2bMmMG2bduIiIhQJ5OIiCTK1QLT5djLDifxPlqDyTvt3r2bMmXKsGHDBiZNmsQ777yDn5/PfmwVSVV89n9qVFQUxhh1d0iKcPDgQcqXL8+2bduYPn06ffv2dTqSAH5+fkRERLBgwQL2799P9+7dmTFjBo8++iiVKlVi2rRpxMTEJPnrNmnShGnTprFlyxbq16/PpUs66ywiIndHU+RuTR1M3unIkSPExMSwcuVKHn/8cafjiMgd8OkCU7p06dThIT5v5cqVlCtXjjNnzrB06VIee+wxpyPJTRQpUoRPP/2UY8eO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", "text/plain": [ "
" ] @@ -259,7 +259,7 @@ } ], "source": [ - "params = PcSaftParameters.from_multiple_json([(['acetone'], '../../parameters/pcsaft/gross2006.json'), (['water'], '../../parameters/pcsaft/gross2002.json')])\n", + "params = Parameters.from_multiple_json([(['acetone'], '../../parameters/pcsaft/gross2006.json'), (['water'], '../../parameters/pcsaft/gross2002.json')])\n", "\n", "saft = EquationOfState.pcsaft(params)\n", "dia_p = PhaseDiagram.binary_vlle(saft, 450*si.KELVIN, (0.005, 0.9), 50*si.BAR, 25*si.BAR, 101)\n", @@ -305,7 +305,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABJsAAAFDCAYAAACdog/4AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/GU6VOAAAACXBIWXMAAAsTAAALEwEAmpwYAACujUlEQVR4nOzddVzV5/vH8ddNKNidiCh2IordNeyeOTtmd+umOJ3tbGd3ze4WC6Xsglko2F2IAvfvD9h+fjcDJpwPcT2/Dx5fzufc5z7vM904XOe+r1tprRFCCCGEEEIIIYQQIiqYGR1ACCGEEEIIIYQQQsQdUmwSQgghhBBCCCGEEFFGik1CCCGEEEIIIYQQIspIsUkIIYQQQgghhBBCRBkpNgkhhBBCCCGEEEKIKCPFJiGEEEIIIYQQQggRZaTYJIQQQgghhIjxlFKLlVIPlVIXP3O/UkrNUEpdU0qdV0o5mjqjEEKIMFJsEkIIIYQQQsQGSwHnL9xfA8gZ/tUZmGuCTEIIIT5Bik1CCCGEEEKIGE9rfRR4+oUh9YDlOswpIIVSKqNp0gkhhPiYFJuEEEIIIYQQcUFm4M5Ht/3DrwkhhDAxC6MDfKs0adJoOzs7o2MIIUSM4+3t/VhrndboHEaTnxNCCPFp8fnnhFKqM2Fb7UicOHHRPHnyGJxICCFihtDQUG7dusWz18/gA//550SsLzbZ2dnh5eVldAwhhIhxlFJ+RmeICeTnhBBCfFoc/DkRAGT56LZN+LV/0VrPB+YDFCtWTMvPCSGEgDt37lCvXj1evHhBApsEvL/9/j//nJBtdEIIIYQQQoi4YBvQOvxUupLAC631PaNDCSFEbBAcHEzVqlW5fv0627dvhw/fNl+sX9kkhBBCCCGEiPuUUmuAikAapZQ/8DNgCaC1ngfsAmoC14C3QDtjkgohROxjYWHB7NmzyZQpE/ny5ePD22+rNkmxSQghhBBCCBHjaa2bf+V+DXQ3URwhhIj1QkJCGD58OBkyZKBPnz5UrVoVgODQYPQ7/U1zyzY6IYQQQgghhBBCiHjk1atXNGjQgAkTJnDt2rX/ue/x68cQ9G3zy8omIYQQQgghhBBCiHji5s2b1K1blytXrjB79my6dev2P/ffenDrm59Dik1CCCGEEEIIIYQQ8cCLFy8oWbIkHz58YO/evVSpUuVfY/wefPthpVJsEkIIIYQQQgghhIgHkidPzvjx4ylbtiw5c+b85Jg7D+588/OYrGeTUmqxUuqhUuriZ+5XSqkZSqlrSqnzSilHU2UTQgghhBBCCCGEiIuCg4Pp168f+/btA6Bdu3afLTQBBDwI+ObnNGWD8KWA8xfurwHkDP/qDMw1QSYhhBBCCCGEEEKIOOnZs2fUrFmTadOmcfz48Qg95t7je9/8vCYrNmmtjwJPvzCkHrBchzkFpFBKZTRNOiHinj59+tCnTx+jY4hoFtv/nJVSVkopD6XUOaXUJaXU6PDrlZVSp5VSF5VSy5RSFuHXI70K9sGbB4SEhkT3SxFCCCGEECJG8fX1pWTJkri6urJw4UJcXFwi9LiHjx9+83PHpJ5NmYGPNwb6h1/7V0lNKdWZsNVP2NramiScELHN2bNnjY4gTCAO/DkHAZW11q+VUpbAcaXUXmAZUEVr7auUcgHaAIv431WwJQhbBVviS0/g/8KfzFMz07JgS5oXbE7RjEVRSkXnaxJCCCGEEMJQN2/epESJElhYWHDw4EHKlSsX4cc+fvL4m5/flNvooozWer7WupjWuljatGmNjiOEEOI/Cl/N+jr8pmX4VwjwXmvtG359P9Ao/PtIr4JVSvEh9AMzPWbitMCJ3LNyM8p1FD6PfaLhFQkhhBBCCGE8Ozs7evbsiYeHR6QKTQDPnj7DzPLbykUxqdgUAGT56LZN+DUhhBBxmFLKXCl1FnhIWGHJA7BQShULH9KY///58LlVsP+cs7NSyksp5ZXaPDVPA5/SpWgXFtZZSJbkWXA54kKe2XkoOr8ok90m4//SP9penxBCCCGEEKbw4cMH+vfvj6+vL0opXFxcyJYtW6TnefX8FQmSJPimLDGp2LQNaB3ej6Mk8EJr/e1dqYQQQsRoWusQrbUDYR8yFAfyA82AaUopD+AVYaudIjPn3ytgs6bLSrdi3ZjlOYvUiVJzsPVB/Pv5M+27aZgrcwbuH4jtNFsqLq3I716/8+Ttk6h+iUIIIYQQQkSrx48fU61aNaZOncru3bu/aa43L96QJEWSb5rDZMUmpdQa4CSQWynlr5TqoJT6USn1Y/iQXcAN4BqwAOhmqmxCCCGMp7V+DhwGnLXWJ7XW5bTWxYGjwF9b6v7TKtip302lWKZitN3SlutPr5MpaSb6lOyDRycPfHv4MrriaO6/vs+PO38kw5QM1FlTh9UXVvP6/euvTS2EEEIIIYShLl26RPHixTl16hQrV66kd+/e/3muwA+BBL8OJlnKZN+UyZSn0TXXWmfUWltqrW201ou01vO01vPC79da6+5aa3utdUGttZepsgkhhDCGUiqtUipF+PfWQDXgqlIqXfi1hMBgYF74Q/7TKtiEFgn5o8kfmCkzGv/RmMAPgX/flzN1TkZWGMmV7lc43fk0fUv25ez9s7Tc1JL0k9PTYmMLdvru5EPIhyh97UIIIYQQQnwrT09PSpUqRWBgIEeOHKFly5bfNN/91/fhLaROnfqb5olJ2+iEEELEPxmBw0qp84AnsF9rvQMYqJS6ApwHtmutD4WP/8+rYO1S2LGiwQrO3j/Ljzt/RGv9P/crpSiSsQgTq03Er48fR9oeoXWh1uy9vpfaa2qTeWpmeu3uhWeA578eK4QQQgghhBEKFCjA999/j6enJyVKfPGQ5gi59/oevIH06dJ/0zxSbBJCCGEYrfV5rXURrXUhrXUBrbVL+PWBWuu8WuvcWuvfPhr/Tatga+WqxagKo1h+bjmzPGZ9dpyZMqN81vLMrT2Xe/3vsbXZVirYVWC+93yKLyxO3tl5+eXoL9x8dvO/vnQhhBBCCCH+k6CgIEaMGMGLFy+wtrZm4cKF2NjYRMncfk/84B1kyZjl64O/QIpNQggh4pWRFUZSN3dd+u7ty5FbR746PoF5AurmrssfTf7g/oD7LKizgAxJMjDy8Eiyz8hOuSXl+N3rd54FPjNBeiGEEEIIEZ89ePCASpUqMXbsWHbt2hXl8/veCWuVms0m8qfYfUyKTUIIIeIVM2XG8vrLyZEqB03+aMKdF3ci/NgUVino6NgR17au3Op9i3GVx/Hk7ZO/G4s3XNeQTVc2ERQcFI2vQAghhBBCxEdnz57FycmJs2fP8scff9C8efMof44b/jcAyG6T/ZvmkWKTEEKIeCe5VXK2NNvCu+B3NFzfkHfB7yI9R9YUWRlabiiXul3Cu7M33Yp1w+2OG43WNyLDlAx02d6F47ePS38nIYQQQgjxzQ4cOECZMmXQWnPixAkaN24cLc9zK+AWABkyZPimeaTYJIQQIl7KkyYPyxssx+uuF112dPnPRSGlFI4ZHZnmPA3/fv7sbrmbWjlrsfLCSsotKYf9DHtGuY7ixrMbUfwKhBBCCCFEfJE3b16qV6+Oh4cHRYoUibbnuXv/LgDp00uDcCGEEOI/qZ+n/t8Nwye7Tf7m+SzMLHDO4czKhit5MOABy+svJ3vK7LgcccF+hj0VllZg8ZnFvAp6FQXphRBCCCFEXPb27VumTJlCSEgImTNnZvPmzWTMmDFan/PRg0eArGwSQgghvsnICiNpkq8Jgw8MZrvP9iibN0mCJPxQ+AcOtD7ArT63GFt5LPde3aPDtg6kn5yeHzb/wIEbBwgJDYmy5xRCCCGEEHFDQEAA5cuXZ+DAgRw9etQkz/kh5AMvHr8ggXUCkiRJ8k1zSbFJCCFEvGamzFhafymOGR1psakFFx5ciPLnsE1uy7Byw/Dp4YNbezdaF27Ndp/tVFtRDbvpdgw/OBzfJ75R/rxCCCGEECL28fDwwMnJCR8fH7Zu3UqlSpVM8rx3Xt6BV5AybcpvnkuKTUIIIeK9RJaJ2NpsK0kTJKXu2ro8evMoWp5HKUWpLKWYV3se9wfcZ22jtRRMV5DxJ8aTe1ZuSi0qxTyveTwLfBYtzy+EEEIIIWK2jRs3UqFCBRImTMjJkyepU6eOyZ775rOb8AoyZPy2LXQgxSYhhBACgMzJMrO12Vbuv75Pw/UNCQoOitbns7KwommBpuxquQv/vv5MqjaJV0Gv6LqzKxmnZKTphqbsvbZXttkJIYQQQsQjNjY2lC9fHg8PDwoUKGDS5775/Ca8BLssdt88lxSbhBBCiHBOmZ1YWm8px28fp/229v/5hLrIypg0IwNKD+BC1wt4dfKic9HOHLhxAOdVzthNt2PkoZFymp0QQgghRBz1+vVrVq1aBUCJEiXYu3cvadOmNXmOa4+vwSvImS3nN88lxSYhhBDiI00LNGVs5bGsvrCan11/NulzK6UomqkoM2rM4G6/u/zR5A8KpivIuOPjsJ9hT+VllVl5fiVvP7w1aS4hhBBCCBE9/Pz8KFOmDG3atMHHx8fQLJf8LkEI2Gax/ea5pNgkhBBC/MPQskPpUKQDY46OYcmZJYZkSGiRkMb5GrOr5S78+vjxS6Vf8Hvhxw+bfyDjlIz8uONHPAI8TLb6SgghhBBCRK3jx4/j5OSEn58fu3btInfu3Ibm8bkRVuzKkiXLN88lxSYhhBDiH5RSzK01l2rZq9F5R9iWNiPZJLNhePnh/NnzT1zbuFI/T32Wn1tOiYUlKDi3IFNPTo22puZCCCGEECLqLVu2jMqVK5MiRQrc3d2pXr26oXlCdSh+fn4AZM2a9Zvnk2KTEEII8QmW5pb80eQP8qbJS6P1jbj48KLRkTBTZlSwq8Cy+su41/8e82vPJ0mCJPTf159MUzPRaH0jdv25S5qKCyGEEELEcEopKlSogLu7u+ErmgD8X/rz/sl7AOzs7L55Pik2CSGEEJ+R3Co5O1vsJEmCJDivdOb2i9tGR/pbcqvkdCraiVMdT3Gx60V6l+jNMb9j1Fpdi2zTszHKdVSMyiuEEEIIEd+9ePGCQ4cOAdC6dWv27t1LypQpDU4V5sqjK/AcEidNTIoUKb55Pik2CSGEEF+QJXkWdrfczev3r3Fe6czTwKdGR/qX/OnyM7n6ZPz7+bOhyQbypc2HyxEX7H6zo+aqmmy+spkPIR+MjimEEEIIEW9du3aNUqVKUb9+fZ4+DXs/aWYWc0oylx5dgmdhq5qUUt88X8x5ZUIIIUQMVSh9IbY228qNZzeovbp2jD0NLoF5Ahrla8SeVnu40fsGI8qP4PyD8zRc35As07Iw9MBQrj29ZnRMIYQQQoh45dChQxQvXpyHDx+yfft2UqVKZXSkf7n48CLmz83JnTNqtvRJsUkIIYSIgAp2FVjVcBWn/E/RbEMzgkODjY70RXYp7HCp5MKtPrfY3nw7JWxKMMltEjln5qTyssqsubCGoOAgo2MKIYQQQsRpc+fOpXr16mTMmBEPDw8qVKhgdKRPOn//PKHPQsmRI0eUzCfFJiGEECKCGuVrxOyas9nuu50fd/yI1troSF9lYWZB7Vy12dpsK7f73uaXSr9w8/lNWmxqQaapmei3tx8+j32MjimEEEIIESddv34dZ2dnTp48Sfbs2Y2O80kfQj5wwfcCOliTM2fOKJnTpMUmpZSzUspHKXVNKTXkE/dnVUodVEqdV0q5KqVsTJlPCCGE+JquTl35qfxPLDqziEH7B8WKgtNfMiXNxPDyw7ne6zr7Wu2jSrYqzPKYRZ7Zeai0rBLrLq7jfch7o2MKIYQQQsRqT58+5eLFsJOMJ0yYwNatW0mWLJnBqT7vyuMrvH8Q9h4wqk7Gs4iSWSJAKWUOzAaqAf6Ap1Jqm9b68kfDJgPLtdbLlFKVgV+BH0yVUQghhIiIURVH8TTwKZNPTiaFVQqGlx9udKRIMVNmVLOvRjX7ajx4/YAlZ5fwu/fvNNvYjHSJ09HeoT2dinYie8qY+embEEIIIURMdeXKFerWrUtISAg+Pj5YWloaHemrPAM84XHY93ny5ImSOU25sqk4cE1rfUNr/R5YC9T7x5h8wKHw7w9/4n4hhBDCcEoppteYzg+FfmDE4RHMdJ9pdKT/LH2S9AwpO4Trva6zp+UeSmcpzUS3ieSYkQPnlc5subolxvenEkIIIYSICfbs2UPJkiV5+fIlq1atihWFJgCPAA8sn1iSNm1a0qZNGyVzmrLYlBm489Ft//BrHzsHNAz/vgGQVCmV2gTZhBBCiEgxU2YsrreY+nnq02tPL5adXWZ0pG9ipsz4Lsd3bG66Gb8+fvxc4WcuPrxIg3UNsPvNjlGuo/B/6W90TCGEEEKIGEdrzbRp06hVqxbZs2fH09OTUqVKGR0rwtz83Uj0LBEFChSIsjljWoPwAUAFpdQZoAIQAIT8c5BSqrNSyksp5fXo0SNTZxRCCCGAsObbaxutpWr2qrTf1p6NlzcaHSlK2CSz4eeKP3Orzy22NN1CwfQFcTniQtbfslJ/bX32X99PqA41OqYQQgghRIwQGhrKvn37qFevHsePH8fW1tboSBH2NPApF+9f5G3AWwoWLBhl85qy2BQAZPnotk34tb9pre9qrRtqrYsAw8OvPf/nRFrr+VrrYlrrYlG1xEsIIYT4LxJaJGRz082UtClJs43N2OazzehIUcbCzIJ6eeqxu+Vurve6zqDSg3C740b1ldXJMysPv536jWeBz4yOKYQQQghhiEePHnH//n3Mzc3ZsGEDGzZsIHHixEbHipRjfsfgKXx49wEHB4com9eUxSZPIKdSKptSKgHQDPifd+RKqTRKqb8yDQUWmzCfEEII8Z8kSZCE3S1345jRkcbrG7Prz11GR4py2VJm49eqv3Kn7x1WNlhJmkRp6Lu3L5mnZqbTtk6cvX/W6IhCCCGEECZz/vx5nJycaN68OVprEidOjJlZTNs89nUHbhwgwYMEADg6OkbZvCb7J6G1DgZ6AHuBK8B6rfUlpZSLUqpu+LCKgI9SyhdID4w1VT4hhBDiWyRLmIy9rfZSMH1BGq5ryL7r+4yOFC0SWiSkZaGWuHVw43Tn07Qs2JJVF1ZR5PcilF5UmlXnVxEUHGR0TCGEEEKIaLN161ZKly7Nhw8fmDRpEkopoyP9J1pr9lzfQ6ZXmbC2tiZ//vxRNrdJy25a611a61xaa3ut9djwaz9prbeFf79Ba50zfExHrbW8WxVCCBFrpLBKwf4f9pMnTR7qra3HoZuHvv6gWKxIxiIsqLuAgH4BTPtuGo/fPqbV5lZkmZaFYQeHcfvFbaMjCiGEEEJEGa01v/76Kw0aNCBfvnx4enpSrFgxo2P9Zz5PfLj29Br6jqZYsWJYWFhE2dyxb42XEEIIEYOlsk7F/h/2Y5/Sntqra3PwxkGjI0W7lNYp6VOyD1d7XGVfq32UzlKaCScmkG16Nhqua4jrLVe01kbHFEIIIYT4Jm/evGHp0qU0a9aMI0eOkClTJqMjfZNNVzbBewjwCaBMmTJROrcUm4QQQogoljZxWg61OYR9Kntqr6kdZ7fU/ZOZMqOafTW2NNvCzd43GVR6EEf8jlBpWSUKzSvEfO/5vHn/xuiYQgghhBCRcv/+fd69e0eSJEk4ceIEq1atwtra2uhY30RrzdqLa8kbmJfg4GDKly8fpfNLsUkIIYSIBukSp+Nwm8PkTp2bumvqxsmm4V9im9yWX6v+in9ffxbVXYS5MqfLji7YTLNh4L6B3Hx20+iIQgghhBBf5e3tTbFixejduzcAadKkibU9mj525v4ZLjy8gM0TGywsLChXrlyUzi/FJiGEECKapEmUhoOtD5IvbT4arGvAdp/tRkcyOWtLa9oXac+ZLmc42vYo1bJXY9qpadjPsKfe2nocvHFQttgJISJMKeWslPJRSl1TSg35xP22SqnDSqkzSqnzSqmaRuQUQsQN69evp1y5cpibm9OtWzej40SpuZ5zsbaw5u6Zu5QpU4YkSZJE6fxR1/1JCCGEEP+SOlFqDrY+SPWV1Wm0vhFrGq2hUb5GRscyOaUU5bKWo1zWcvi/9Geu51zmn57PNp9t5Eubj94letOqUCsSWSYyOqoQIoZSSpkDs4FqgD/gqZTaprW+/NGwEYSdej1XKZUP2AXYmTysELGQ1hp/f3/OnDnDmTNnOH36NI8fPzY6lmFu376Nv78/SZMmJX369HGq2PQh5ANe97xIqVJyye8SkyZNivLnkGKTEEIIEc1SWqdk/w/7qbmqJt9v+J7FdRfTxqGN0bEMY5PMhrFVxjKywkjWXlzLdPfpdNnRhaEHh9KlaBe6O3Unc7LMRscUQsQ8xYFrWusbAEqptUA94ONikwaShX+fHLhr0oRCxCKPHj3Cw8MDT0/Pv78ePXoEhH1IlCdPHjJlyvRNW8ZCQkN48+ENwaHBURXbJN6/f8/d53dJbZOaLLZZCFEhhBBidKwoc/vNbbSFJk+WPKQpnIZWrVpF+XNIsUkIIYQwgRRWKdj3wz7qr61P261tef3+Nd2Ldzc6lqGsLKxo69CWNoXbcOz2MX479Rvjj49nktskvs//Pb1L9KZ45uJGxxRCxByZgTsf3fYHSvxjzChgn1KqJ5AYqPqpiZRSnYHOALa2tlEeVIiYJiQkhIsXL+Lm5sbJkydxc3Pj+vXrQFhhKV++fNSqVYuiRYvi6OhIoUKFIrWtKiQ0hD+f/snZ+2c5d/8cFx9d5NLDS9x8Hot7NNaCJ+H/i4s6OXZifp350Ta/FJuEEEIIE0mSIAk7Wuyg2YZm9Njdg5dBLxlabqjRsQynlKJ81vKUz1qeG89uMMtjFgtPL2T1hdWUzlKaPiX60CBvAyzM5G2LEOKrmgNLtdZTlFKlgBVKqQJa69CPB2mt5wPzAYoVKyaN40ScExQUhKenJ0ePHuX48eOcOHGCly9fApAhQwZKlSpFly5dKFGiBI6OjpEqLAWHBnP50WW87nrhGeDJmftnOP/gPIHBgQBYmlmSO01uimcuTjuHduRPl590idNFy+uMShcvXmTYsGH88MMPNGnSxOg40crCzCLaP9CTd21CCCGECVlZWPFHkz9ou7Utww4N4/m754yvOj5OnGoSFbKnzM7U76YyquIolp5dynT36Xy/4XuyJMtCrxK96OTYieRWyY2OKYQwRgCQ5aPbNuHXPtYBcAbQWp9USlkBaYCHJkkohEE+fPiAh4cHrq6uHD58GDc3NwIDw4o/+fLlo3nz5pQtW5YyZcpgZ2cXqfcdAS8DOOl/kpN3TnIq4BRn7p35u7CULGEyimQoQpeiXXDI4IBDBgfyps1LAvME0fI6o8vy5cvp3ak3WbJk4ceaP5LXNq/RkWI9KTYJIYQQJmZpbsmKBitIliAZE90m8ujtI+bXmS8rdz6SLGEyepXoRXen7uz8cyfTTk1j4P6BjD4ymo5FOtK7ZG/sUtgZHVMIYVqeQE6lVDbCikzNgBb/GHMbqAIsVUrlBayARyZNKYQJaK25evUq+/fv58CBA7i6uvLq1SsAChUqROfOnalYsSJly5YlTZo0EZ43VIdy6eEljt0+xlG/o5y4cwL/l/4AJDRPSNFMRelStAtOmZ0olqkYOVLlwEzF3kPuQ0JCGDZsGBMnTqRy5cqsX7+e1KlTGx0rTpB3tUIIIYQBzJQZc2rNIV3idLgcdeHR20esa7xOTmP7B3Mzc+rmrkvd3HU5fe80U09OZZbnLGZ4zKBxvsb0L9Vf+joJEU9orYOVUj2AvYA5sFhrfUkp5QJ4aa23Af2BBUqpvoQ1C2+rtZZtciJOePnyJYcOHWL37t3s2bOH27dvA2Bvb0/Lli2pUqUKFStWjHRx6eLDixy6eYjDtw5zzO8Yz949AyBz0syUtS1LKZtSlMpSCocMDrFuxdLXeHl5MXnyZLp27cr06dOxtLQ0OlKcIcUmIYQQwiBKKUZXGk36JOnpsasH1VdUZ1vzbaSyTmV0tBjJMaMjKxuuZHzV8cxwn8F87/msv7SesrZl6V+qP3Vy1cHczNzomEKIaKS13gXs+se1nz76/jJQxtS5hIgu169fZ/v27ezYsYMjR44QHBxM0qRJqVq1KsOGDaN69epky5YtUnPeen6Lfdf3ceDGAQ7fOszjt48BsE9pT8O8DSlnW45yWcuRLUW2OLvN/82bNyROnJgSJUpw+vRpChcubHSkOEeKTUIIIYTBujl1I13idLTc1JLyS8qzu+VusiTP8vUHxlM2yWyYWG0iI8uPZPGZxfzm/hsN1jUgR6oc9CvZj7YObbG2tDY6phBCCBFpoaGheHl5sXnzZrZu3cqVK1eAsL5Lffv2pWbNmpQuXZoECSK+wujth7ccunmIvdf2svf6Xv58+icQ9vO0Vs5aVM5WmUp2leLNe48jR47w/fffs2zZMpydnaXQFE2k2CSEEELEAI3zNSaVdSoarGtAyUUl2dliJw4ZHIyOFaMlTZiU3iV70714d7Zc3cJkt8l029WNn1x/omfxnnRz6kaaRBHfSiCEEEIYITg4mKNHj7Jx40a2bt1KQEAAFhYWVKhQgS5dulC7dm3s7e0jNefNZzfZ+edOdv65k8M3DxMUEkQiy0RUsqtEj+I9qG5fndypc8fZlUufM3/+fLp37469vX2k/5mKyJFikxBCCBFDVM5WmePtjlNzdU3KLSnHhiYb+C7Hd0bHivEszCxonK8xjfI24vjt40xym8TPrj8z/vh42hdpT79S/cieMrvRMYUQQoi/BQcHc+TIEf744w82bdrEo0ePsLa2xtnZmQYNGlC7dm1SpkwZ4fm01py+d5otV7ewxWcLFx9eBCBnqpx0LdaVWrlqUc62HAktEkbXS4rRgoOD6devHzNnzsTZ2Zk1a9aQIkUKo2PFaVJsEkIIYZjwI6mPAgkJ+5m0QWv9s1KqCjAJMANeE9bg9ZpSKiGwHCgKPAGaaq1vGRI+mhRMX5BTHU5Ra3Utaq2uxe+1f6eDYwejY8UKSinKZQ3rM3H50WWmuE1hvvd85nrNpXG+xgwsPZBimYoZHVMIIUQ8pbXm1KlTrF69mvXr1/Pw4UMSJ05M7dq1adKkCTVq1CBRoogfFBISGsLx28fZcHkDW3y24P/SHzNlRvms5ZlafSq1c9UmZ+qc0fiKYo+NGzcyc+ZM+vXrx8SJEzE3lx6P0U2KTUIIIYwUBFTWWr9WSlkCx5VSu4G5QD2t9RWlVDdgBNAW6AA801rnUEo1AyYATQ3KHm0yJ8vMsXbHaPJHEzpu78iNZzcYU3lMrD5a2NTypc3HonqLGFN5DDPcZzDPax7rL62nkl0lhpQdQrXs1eLd1gEhhBDGuHr1KitWrGD16tXcunULKysrateuTbNmzf5TgemI3xE2XN7ApiubePDmAVYWVnxn/x2/VPqFWrlqyRbyj3z48AFLS0u+//57MmTIQIUKFYyOFG9IsUkIIYRhwo+jfh1+0zL8S4d/JQu/nhy4G/59PWBU+PcbgFlKKRUXj7VOmjAp25tvp/uu7ow7Pg6fJz4sq7+MxAkSGx0tVsmUNBPjq45nWLlhLPBewLRT0/hu5XcUyVCEIWWH0ChvIznBTgghRJR78uQJa9euZfny5Xh4eGBubk61atVwcXGhXr16JEuW7OuThNNa4xHgweoLq1l/eT33X9/H2sKaWrlq0SRfE2rmrEmSBEmi8dXETvv27aNLly7s2bOH3LlzS6HJxKTYJIQQwlBKKXPAG8gBzNZauyulOgK7lFKBwEugZPjwzMAdAK11sFLqBZAaeGz65NHP0tyS32v/Tt40eem/rz83n99kW7NtZE6W2ehosU6yhMnoX7o/PUv0ZOX5lUw8MZGmG5pin9KeQWUG0bpwa6wsrIyOKYQQIhYLCQnhwIEDLFq0iK1bt/L+/XscHByYOnUqzZs3J0OGDJGaz/eJLyvOrWD1xdXceHaDhOYJqZmzJs0LNKdmzpryAdRnaK2ZOXMmffv2JX/+/CRMGD/7VBlN1uMLIYQwlNY6RGvtANgAxZVSBYC+QE2ttQ2wBJgamTmVUp2VUl5KKa9Hjx5FeWZTUkrRt1Rftjffju8TX4ovLI73XW+jY8VaCcwT0L5Iey51u8TG7zeSyjoVXXZ0Idv0bEw8MZGXQS+NjiiEECKW8ff3Z9SoUWTLlg1nZ2cOHTpE165dOXv2LGfOnKFv374RLjQ9DXzKPK95lF5UmtyzcjPu+DjsU9qzpN4SHgx4wKamm2iSv4kUmj7j/fv3dOnShd69e1O7dm1OnDiBnZ2d0bHiJSk2CSGEiBG01s+Bw0ANoLDW2j38rnVA6fDvA4AsAEopC8K22D35xFzztdbFtNbF0qZNG93RTaJWrlq4tXfD0sySckvKsebCGqMjxWrmZuY0zNsQ947uHGx9kILpCjL4wGBsp9ky4tAIHr2J3UVKIYQQ0SskJIRdu3ZRr149smbNiouLC3nz5mXdunUEBATw22+/Ubhw4QjNFapDOXDjAM02NCPjlIx03dmVl0EvmVh1Inf63mHfD/to69CW5FbJo/lVxX5Tp05lwYIFDB06lM2bN5M0aVKjI8Vbso1OCCGEYZRSaYEPWuvnSilroBphTb+TK6Vyaa19w69dCX/INqANcBJoDByKi/2aPqdg+oK4d3Sn8R+NabGpBWfvn2VclXHSc+gbKKWonK0ylbNVxvuuN+NPjGfcsXFMOzWNzo6d6V+6PzbJbIyOKYQQIoZ4+vQpixYtYs6cOdy6dYt06dIxePBgOnXqRLZs2SI1V8DLABafWczis4u59fwWKa1S0tmxM+2KtKNIhiJykEUkhIaGYmZmRp8+fShYsCC1atUyOlK8Z9KVTUopZ6WUj1LqmlJqyCfut1VKHVZKnVFKnVdK1TRlPiGEECaXETislDoPeAL7tdY7gE7ARqXUOeAHYGD4+EVAaqXUNaAf8K+fJXFd+iTpOdj6ID8W/ZGJbhOptboWzwKfGR0rTiiaqSh/NPmDS90u0ThfY2Z6zCT79Ox03t6Z60+vGx1PCCGEgc6fP0+nTp2wsbFh0KBBZM2alXXr1nHnzh3GjRsX4UJTqA5l//X9NFzXkKy/ZeUn15/InjI7qxuu5m7/u8ysORPHjI5SaIqEHTt2UKJECZ49e4aVlZUUmmIIk61sCm8AO5uwT6j9AU+l1Dat9eWPho0A1mut5yql8gG7ADtTZRRCCGFaWuvzQJFPXN8MbP7E9XdAExNEi9ESmCdgbu25FMlYhB67elB8YXG2NN1C/nT5jY4WJ+RNm5dl9ZcxuuJoJp6YyOIzi1l0ZhHNCjRjWNlh8s9ZCCHiidDQUPbs2cPUqVM5ePAg1tbWtGrVih49elCoUKFIzfX83XOWnFnCXK+5/Pn0T9IkSkP/Uv3pXLQz9qnso+kVxG1aayZNmsSQIUMoUqQIgYGBpEyZ0uhYIpwpVzYVB65prW9ord8Dawk7wvpjnzvqWgghhBD/0LloZw63OcyroFcUX1hc+jhFMbsUdsypNYebvW/Sr2Q/tl7dSoG5BWi8vjFn7581Op4QQoho8u7dOxYsWECBAgWoVasWV69eZcKECfj7+zN//vxIFZquPr5Kt53dyDw1M/329SNt4rSsaLCCO33vMKHaBCk0/Ufv3r2jTZs2DB48mCZNmnDs2DEyZcpkdCzxEVMWm/4+rjqcf/i1j40CWiml/Alb1dTzUxPFpVOGhBBCiG9RxrYMp7ucpkiGIrTY1IJeu3vxPuS90bHilIxJMzKp+iT8+vgxotwI9t/YT5Hfi1B3TV08AzyNjieEECKKvHz5kokTJ5ItWzY6d+6MlZUVK1eu5ObNmwwaNIhUqVJFaB6tNXuv7eW7ld+Rd3ZeFp1ZxPf5v+d059OcaH+CVoVaYWVhFc2vJm7r27cvK1aswMXFhbVr15IoUSKjI4l/iGmn0TUHloYfdV0TWKGU+lfGuHjKkBBCCPFfZUqaicNtDtOnRB9mesyk4tKK+L/0NzpWnJM6UWrGVB6DXx8/XCq6cPz2cYovLI7zSmdO3D5hdDwhhBD/0aNHjxg2bBi2trYMHjyYggULcuDAAby9vWnZsiWWlpYRmud9yHuWn1tO4XmFcV7lzIUHFxhTaQx3+t5hSb0lFMn4r84B4j8aOXIkmzdvZuTIkdLfKoYyZbHp7+Oqw9mEX/tYB2A9gNb6JGAFpDFJOiGEECIWszS3ZJrzNNY1Xsf5B+dx/N2Rfdf3GR0rTkphlYKRFUbi18eP8VXG433Pm7JLylJleRWO+h01Op4QQogIun//PgMGDMDOzo7x48dTvXp1vLy82LdvH1WqVIlwEeNV0Csmu00m+/TstNnSBo1mab2l3OpzixHlR5AucbpofiXxw8aNG2ncuDEhISFkypSJ+vXrGx1JfIEpi02eQE6lVDalVAKgGWFHWH/sNlAFQCmVl7Bik+yTE0IIISLo+/zf49nJk3SJ0+G80pnhB4cTHBpsdKw4KWnCpAwuO5hbvW8xpfoULj28RIWlFai8rDJHbh0xOp4QQojPuHfvHn369CFbtmxMmzaNRo0acfnyZdavX0/RokUjPM/TwKeMch1F1t+yMnD/QHKlzsWuFrs4/+N52ji0IYF5gmh8FfGH1hoXFxcaN25MQEAAL1++NDqSiACTFZu01sFAD2AvcIWwU+cuKaVclFJ1w4f1BzqFH3W9BmirtdamyiiEEELEBXnT5sWjkwfti7Rn3PFxVF5WWbbVRaPECRLTr1Q/bvS+wbTvpnHl8RUqLqtIxaUVcb3lanQ8IYQQ4R4/fsygQYOwt7dn1qxZNG/enKtXr7J8+XLy5MkT4XkevH7AoP2DyPpbVkYfGU35rOVx7+jOoTaHqJGzhmzrikJv376lWbNm/Pzzz7Ru3ZrDhw/LiXOxhIUpn0xrvYuwxt8fX/vpo+8vA2VMmUkIIYSIixJZJmJh3YVUsqtElx1dcJjnwNL6S6mdq7bR0eKsRJaJ6FOyD12KdmG+93wmnJhApWWVqJC1AqMrjqaCXQWjIwohRLz04sULpk6dyrRp03j9+jWtWrXip59+IkeOHJGa5+Gbh0w8MZE5nnMICgmiWYFmDC07lALpCkRTctGsWTN27NjBxIkTGTBggBTyYpGY1iBcCCGEEFGoZaGWeHf2xiaZDXXW1KHnrp4Efgg0OlacZm1pTe+Svbne6zrTnafj+8SXissqUnlZZY75HTM6nhBCxBtBQUFMnz4de3t7XFxccHZ25uLFiyxfvjxShabHbx8zeP9gsk3PxrRT02icrzFXu19lVcNVUmiKZiNHjmTr1q0MHDhQCk2xjBSbhBBCiDgud5rcuHd0p2/JvszynEXxhcW5+PCi0bHiPGtLa3qV6MX1Xtf57bvfuPzoMuWXlqfaimqcvHPS6HhCCBFnhYaGsmbNGvLmzUufPn1wcHDAy8uL9evXky9fvgjP8zLoJaNcR5FtejYmuU2iQZ4GXO52meUNlpMzdc5ofAXx2+rVqxkxYgQATk5O1KlTx+BE4r+QYpMQQggRDyS0SMjU76ayu+VuHr15RLH5xZjpPhNpjRj9/lrpdKP3DSZXm8y5++covbg0ziud8QjwMDqeEELEKW5ubpQsWZIWLVqQLFky9uzZw/79+yPV+Ptd8DumnZxG9unZGX1kNM45nLnU7RIrG64kd5rc0Zg+fgsNDWXYsGG0bNmSY8eOERQUZHQk8Q2k2CSEEELEI845nDnf9TxVsleh155efLfyOwJeBhgdK15IZJmI/qX7c7P3TSZUnYDXXS9KLCxBvbX1OHf/nNHxhBAiVrt9+zbNmzenTJkyBAQEsHTpUk6fPs13330X4e1XoTqU5eeWk2tmLvrt60eRjEXw6OjBH03+IG/avNH8CuK3V69e0bBhQ3799Vc6derE/v37SZgwodGxxDeQYpMQQggRz6RLnI4dzXcwt9ZcTtw5QYG5BVhzYY3RseKNxAkSM6jMIG72vsmYSmM4cusIDr870HRDU64+vmp0PCGEiFUCAwMZNWoUuXPnZsuWLYwcORIfHx/atGmDmVnEf911veWK0wIn2mxpQ7rE6TjwwwH2/7Afp8xO0ZheQNiKpipVqrB9+3ZmzJjB77//ToIECYyOJb6RFJuEEEKIeEgpxY/FfuRsl7PkSZOHFpta0GxDM568fWJ0tHgjacKkjCg/gpu9bzK83HB2+u4k/5z8tNnShhvPbhgdTwghYrzt27eTP39+Ro8eTb169fDx8cHFxYUkSZJEeA7fJ77UW1uPSssq8ejNI1Y2WIlHJw+qZK8SjcnFx8zMzOjfvz+7d++mZ8+e0gg8jpBikxBCCBGP5Uydk2PtjjGu8jg2XdlEvjn52HRlk9Gx4pWU1in5pfIv3Ox9k74l+7L+0npyz8pNt53duPvqrtHxhBAixrlx4wa1a9embt26WFtbc+jQIdauXYutrW2E53gZ9JKB+waSf05+Dt88zLjK4/Dp4UPLQi0xU/JrsiksWrSIlStXAtC0aVOqV69ucCIRleTfIiGEECKeszCzYGi5oXh28iRz0sw0Wt+Iphua8ujNI6OjxStpE6dlcvXJXO91nU6OnVhwegH2M+wZtH+QrDgTQgjgw4cPTJgwgfz583PkyBEmT57M2bNnqVSpUoTn+KsvU+5ZuZlycgptCrfhz55/MrTcUKwtraMxvfhLcHAw/fr1o2PHjqxfv14OK4mjpNgkhBBCCAAKZyiMe0d3fqn0C5uvbCbfnHysu7hO3gSaWKakmZhTaw4+PXxokq8Jk90mk31GdlyOuPAq6JXR8YQQwhDu7u4UK1aMIUOGUKNGDa5cuUL//v2xtLSM8Bxn7p2h7OKytNnShqzJs+Le0Z2FdReSPkn6aEwuPvbixQvq1KnDtGnT6NWrF5s2bZJtc3GUFJuEEEII8TdLc0uGlx/OmS5nyJYiG802NqPu2rrcfnHb6GjxTvaU2VneYHnY6YHZqvCz68/Yz7BnhvsMgoLlOGghRPzw5s0bevfuTalSpXj8+DGbNm1i06ZN2NjYRHiOV0Gv6LunL8UWFOP6s+ssqbcEtw5u0vzbxN68eUPJkiU5cOAAv//+O9OnT8fCwsLoWCKaSLFJCCGEEP+SP11+3Dq4MbX6VA7dPET+OfmZ4T6DkNAQo6PFOwXSFWBT002c6nCKAukK0HtPb/LMzsOKcyvkz0MIEacdOXKEQoUKMWPGDLp27cqVK1do0KBBhB+vtWbTlU3knZ2X6e7T6ezYmavdr9LWoa30ZTJA4sSJadWqFQcOHKBz585GxxHRTP4NE0IIIcQnWZhZ0LdUXy51u0RZ27L03tObMovLcPb+WaOjxUslbEpwsPVB9rXaRyrrVLTe0hqH3x3Y4btDtjoKIeKU169f07NnTypWrAiAq6srs2fPJlmyZBGew/+lP/XW1qPR+kakSZQGtw5uzK09l5TWKaMptficuXPn4u7uDsDw4cOpUKGCwYmEKUixSQghhBBfZJfCjl0tdrGq4SpuPLtB0flF6bunLy+DXhodLd5RSlHNvhqenTxZ33g9QcFB1FlThwpLK3Dyzkmj4wkhxDc7efIkDg4OzJo1i169enH+/PlIFSdCdSjzveeTf05+Dtw4wORqk/Hq7EVJm5LRmFp8yocPH+jWrRvdunVj/vz5RscRJibFJiGEEEJ8lVKKFgVbcLXHVTo7dma6+3Tyzs7L+ktyiowRzJQZTfI34VK3S8ytNRffJ76UXlyaBusacOXRFaPjCSFEpH348IGffvqJsmXLEhwczJEjR5g+fTqJEyeO8BzXnl6jyvIqdNnRhaIZi3Kh6wX6l+6PhZn0BTK1J0+e8N133zF37lwGDRokxaZ4SIpNQgghhIiwVNapmFt7Lqc6niJDkgw03dCUaiuqcfnRZaOjxUuW5pb8WOxHrvW6xphKYzh44yAF5hag8/bO3Ht1z+h4QggRIb6+vpQpU4YxY8bwww8/cP78ecqXLx/hx4fqUGa6z6TQ3EKcvnea+bXnc7D1QexT2UdjavE5d+/epUSJEpw4cYJly5YxYcIEzM3NjY4lTEyKTUIIIYSItOKZi+PR0YOZNWbifc+bQnML0XdPX168e2F0tHgpSYIkjCg/guu9rtPDqQdLzy4lx8wc/HT4J14FvTI6nhBCfJLWmqVLl1KkSBGuX7/Ohg0bWLp0aaR6M91+cZtqK6rRa08vKtpV5FK3S3Qq2gmlVDQmF1+SPn16ypUrh6urK61btzY6jjCIFJuEEEII8Z+Ym5nTo3gPfHv40qFIB6a7TyfXrFwsPrOYUB1qdLx4KW3itEyvMZ0r3a9QJ1cdxhwdg/0Me+Z4zuFDyAej4wkhxN9evXpF69atadeuHcWLF+f8+fM0atQowo/XWrPs7DIKzi2IR4AH82vPZ2eLndgks4nG1OJztNbMmTOHgIAAzM3NWbJkCaVKlTI6ljCQFJuEEEII8U3SJk7L73V+x6uzFzlS5aDDtg4Um1+MwzcPGx0t3rJPZc/axmvx6OhBvrT56L6rOwXmFmDL1S3SY0sIYbgzZ85QtGhRVq9ejYuLCwcOHCBz5swRfvyTt09o/Edj2m5ti0MGB879eE5WMxkoKCiIDh060L17d+bOnWt0HBFDSLFJCCGEEFHCMaMjx9sdZ3XD1TwJfELl5ZWpv7Y+vk98jY4WbzllduJwm8Nsb74dc2VOg3UNKL+0PO7+7kZHE0LEUwsXLqRkyZK8ffuWw4cPM3LkyEj183G95UrheYXZ7rOdSdUmcbjNYbKnzB6NicWXPHz4kCpVqrBkyRJ++uknXFxcjI4kYggpNgkhhBAiyiilaF6wOVe7X+XXKr9y6OYh8s/JT89dPXn45qHR8eIlpRS1c9XmfNfzzKs1D98nvpRcVJJmG5px89lNo+MJIeKJwMBAOnToQKdOnahQoQJnz56NVBPwDyEfGH5wOJWXVSZxgsSc6niKAaUHYKbkV1qj+Pj44OTkhLe3N2vXrmX06NGYmcmfhwgjfxOEEEIIEeWsLa0ZUnYIf/b8kw5FOjDXay72M+xxOeLC6/evjY4XL1mYWdClWBeu9bzGiHIj2OazjTyz8zBo/yCev3tudDwhRBx269YtypYty+LFixkxYgS7d+8mTZo0EX/881uUW1KOccfH0b5Ie7w7e+OY0TEaE4uIyJAhA7ly5eLYsWM0bdrU6DgihjFpsUkp5ayU8lFKXVNKDfnE/dOUUmfDv3yVUs9NmU8IIYQQUSt9kvTMqz2Pi90uUt2+Oj+7/kyOGTmY4zmH9yHvjY4XLyVNmJQxlcfg29OX5gWaM9ltMjlm5GCWxyxpIi6EiHKHDh2iaNGiXL9+nW3btjFmzJhIbZvb4bsDx98dufL4Cusar2Nh3YUkSZAkGhOLL9Fas2jRIgIDA0mePDn79++nWLFiRscSMZDJik1KKXNgNlADyAc0V0rl+3iM1rqv1tpBa+0AzAQ2mSqfEEIIIaJPnjR52Pj9Rk52OEmu1Lnovqs7uWflZunZpQSHBhsdL16ySWbD0vpL8e7sTaH0hei5uyeF5hVip+9OaSIuhPhmWmtmz55N9erVyZgxI15eXtSpUyfCjw8ODWbw/sHUWVMHuxR2nO58mu/zfx+NicXXBAYG0rJlSzp27MiyZcuMjiNiOFOubCoOXNNa39BavwfWAvW+ML45sMYkyYQQQghhEiVtSnKk7RF2t9xNauvUtNvajvxz8rP24lpCdajR8eKlIhmLcLD1QbY120aoDqX2mtpUX1mdCw8uGB1NCBFLvX//nh9//JEePXpQs2ZN3NzcyJEjR4Qff/fVXSovq8xEt4l0KdoFtw5u2Keyj8bE4mvu3r1LhQoVWLNmDePGjaNLly5GRxIxnCmLTZmBOx/d9g+/9i9KqaxANuCQCXIJIYQQwoSUUjjncMazkyebvt+EpZklzTc2p9DcQqy7uI6Q0BCjI8Y7Sinq5K7Dha4XmO48He+73jj87kCX7V2ksXsco7XmyK0j5J2d1+goIo568uQJ1apVY/78+QwdOpQtW7aQLFmyCD/+xO0TFJ1flNP3TrOywUrm1Z6HlYVVNCYWX3P69GmcnJy4fPkyW7ZsYejQoSiljI4lYriY2iC8GbBBa/3Jd5tKqc5KKS+llNejR49MHE0IIYQQUUEpRYO8DTj34zlWN1xNqA6l2cZmFJxbkNUXVkvRyQAJzBPQq0QvrvW6Rs/iPVl8djE5ZuRg4omJBAUHGR1PfIPAD4EsOr0Ih98dqLisIjee3TA6koiDrl+/TqlSpXB3d2fVqlWMGzcuwqeTaa2Z5zWPSssqkSRBEtw7utOyUMtoTiwiIkmSJKRPnx43Nzfq1fvS5iQh/p8pi00BQJaPbtuEX/uUZnxhC53Wer7WupjWuljatGmjMKIQQgghTM3czJzmBZtzsdtF1jVeh5kyo+WmluSfk58lZ5ZII3EDpLJOxW/Ov3Gx60Uq2lVk8IHB5JuTj01XNkk/p1gm4GUAww8OJ8u0LHTc3hGtNQvqLCB/2vxGR/tPvnbgUPiY75VSl5VSl5RSq02dMb46deoUJUuW5OnTpxw8eJAWLVpE+LFBwUF02t6Jrju7UjV7VTw6epA/Xez8OxpXhIaGsmHDBrTW5MqVC29vbwoVKmR0LBGLmLLY5AnkVEplU0olIKygtO2fg5RSeYCUwEkTZhNCCCGEwcyUGd/n/57zXc/zR5M/SGSZiPbb2pNjRg6mn5rOm/dvjI4Y7+ROk5ttzbexr9U+ElkmotH6RlReXplz988ZHU18hUeABy02tsBuuh2/Hv+VsrZlOdT6EOd+PEeHIh1i5cqmiBw4pJTKCQwFymit8wN9TJ0zPtq4cSOVKlUiefLknDx5kjJlykT4sfdf36fisoosOrOIYWWHsb35dlJap4y+sOKr3rx5Q5MmTWjSpAm7d+8GkG1zItJMVmzSWgcDPYC9wBVgvdb6klLKRSlV96OhzYC1Wj42E0IIIeIlM2VG43yN8e7sze6Wu8mWMht99vbBbrodo11H8+iNbKE3tWr21TjT5Qxzas7hwoMLFPm9iPRzioGCQ4NZf2k9pReVpsTCEuz8cyc9i/fkWq9rbGm2hUrZKqGU4uGbh7wIemF03P8iIgcOdQJma62fAWit5S9pNJs9ezZNmjTBwcGBkydPkjNnzgg/9vyD8xRfUJzzD86zockGxlYZi7mZeTSmFV9z+/ZtypQpw5YtW5g6dSo1atQwOpKIpUzas0lrvUtrnUtrba+1Hht+7Set9baPxozSWn9ySawQQggh4o+/GokfaXuE4+2OU9KmJKOOjML2N1u67uiK7xNfoyPGKxZmFnR16sqfPf+kd4neLD67mJwzczLFbYpsdTTYs8BnTDoxiezTs9N0Q1MevnnIdOfp+Pf1Z+p3U8meMvv/jPd54mNQ0m8WkQOHcgG5lFInlFKnlFLOJksXz2itcXFxoUePHtSpU4dDhw4RmRYnO3x3UGZxGUJ1KMfbHadRvkbRmFZExMmTJ3FycuLmzZvs3LmTvn37yoom8Z/F1AbhQgghhBB/K2Nbhu3Nt3O522V+KPQDS84uIc+sPNRbW49DNw9JHyETSmmdkmnO07jQ9QJlspRhwP4BFJhTgB2+O+TPwcT+fPInPXb1IMu0LAw6MIgcqXKwrdk2fHr40KtEL5ImTPrJx119fNXESU3KAsgJVASaAwuUUin+OUgOHPo2oaGh9O7dm59//pk2bdqwceNGrK2tI/RYrTVTT06l7pq65E6dG49OHhTJWCSaE4uIePXqFSlTpuTUqVM4O0udVnwbKTYJIYQQItbImzYv8+vMx6+PH8PLDcftjhtVlleh8LzCLDy9kMAPgUZHjDfypMnDrpa72NViF2bKjDpr6lBzdc24XsgwnNaaI7eOUG9tPXLPys2C0wtokr8JZ7uc5VCbQ9TJXeer25AuP7pMIstEJkocpSJy4JA/sE1r/UFrfRPwJaz49D/kwKH/7sOHD7Ru3ZqZM2fSr18/Fi9ejIWFRYQeGxIaQvdd3em/rz+N8jXiaLujZEqaKZoTiy8JCQnhyJEjAFSvXp0LFy6QN29eg1OJuECKTUIIIYSIddInSc+YymO43ec2i+ouQilFp+2dsJlmw6D9g7j+9LrREeONGjlrcL7reaZWn8rJOycpOLcgfff05fm750ZHi1M+hHxg1flVFFtQjIrLKuJ2x40R5Ufg18ePJfWWUDhD4QjPdenRJfKmiZW/TEbkwKEthK1qQimVhrBtdbGvG3oM9f79e77//ntWrVrFr7/+yuTJkzEzi9ivlIEfAmn8R2Pmes1lUOlBrGu8LrYWPeOMly9fUq9ePSpVqsTFixcBsLS0NDiViCuk2CSEEEKIWMva0pr2RdpztstZXNu4UtGuIlNPTiXHzBw4r3Rmm882QkJDjI4Z5yUwT0DfUn3x7elLe4f2THefTq6ZuVjgvUD++X+j5++eM/HERLJNz0arza14++Et82vP53af27hUciFDkgyRnvPCgwsUTF8wGtJGrwgeOLQXeKKUugwcBgZqrZ8YkzhueffuHQ0bNmTLli3MmjWLIUOGRLifz5O3T6iyvApbr25lZo2ZTKg2ATMlv4oa6fr165QqVYo9e/Ywe/ZsChQoYHQkEcdEbL2jEEIIIUQMppSigl0FKthVIOBlAAtPL2T+6fnUW1sPm2Q2tHdoT/si7cmaIqvRUeO0dInT8Xud3/mx2I/02tOLzjs6M9drLjNqzKCsbVmj48Uqt57f4rdTv7HozCJev39N5WyVmV9nPs45nL/pl/QHrx/w4M0DCqUrFIVpTUdrvQvY9Y9rP330vQb6hX+JKBIYGEj9+vXZt28fv//+O507d47wY289v4XzSmduPb/FH03+kEbgMYCrqyuNGjVCa82+ffuoXLmy0ZFEHCTlZCGEEELEKZmTZebnij9zq/ctNjTZQP60+RlzdAzZpmfDeaUzGy5vICg4yOiYcVqRjEU42vYoaxqt4dHbR5RbUo4WG1vg/9Lf6GgxnmeAJ802NMN+hj2zPWdTP099Tnc+zcHWB6mZs+Y3rwY5c/8MgDRkFhH25s0bateuzf79+1m8eHGkCk0XH16k9KLSPHzzkAOtD0ihKYY4c+YM6dOnx8PDQwpNItpIsUkIIYRhlFJWSikPpdQ5pdQlpdTo8OvHlFJnw7/uKqW2hF9XSqkZSqlrSqnzSilHQ1+AiNEszS1plK8Re1rt4Wbvm4wsP5JLjy7R5I8mZJqaiZ67euJ911tOUIsmSimaFWjG1e5XGVl+JJuvbib3rNz8cvQXaeT+D6E6lB2+O6iwtALFFxZn97Xd9C/Vn5u9b7KiwYooLQx53/UGwCGDQ5TNKeKuwMBA6tWrh6urK8uXL6ddu3YRfqxHgAfll5RHKcWxdsdkdaPBgoODuXDhAgB9+vTBy8uLHDlyGJxKxGVSbBJCCGGkIKCy1row4AA4K6VKaq3Laa0dtNYOwElgU/j4GoSdKpQT6AzMNX1kERtlTZGV0ZVGc6v3LXa12EW17NVYcHoBxRYUo9C8Qkw8MZE7L+4YHTNOSpwgMS6VXLjS/Qo1ctRg5OGR5JuTj42XN8b7Qt+74HcsPL2Q/HPyU2dNHW49v8XU6lO50/cOE6tNxCaZTZQ/p+ddT3KmykkKqxRRPreIW96/f0/jxo05dOgQS5cupVWrVhF+7OGbh6myvAoprVNyvN1x8qfLH41Jxdc8e/aMGjVqULZsWR4+fIhSikSJpDm7iF5SbBJCCGEYHeZ1+E3L8K+/f/tUSiUDKhN2uhBAPWB5+ONOASmUUhlNGFnEcuZm5tTIWYO1jddyf8B95tWaR9IESRl8YDBZf8tKxaUVme89n6eBT42OGufYpbBjw/cbONT6EEkTJKXxH42psrwKFx5cMDqayT0LfMavx34l2/RsdNreCSsLK1Y1XMW1ntfoW6ovyRImi5bn1Vpzyv8UJWxKRMv8Iu748OEDzZo1Y9euXcybN48ffvghwo/d5rONGqtqkDV5Vo61O0a2lNmiMan4Gh8fH0qUKMGRI0f47bffSJcundGRRDwhxSYhhBCGUkqZK6XOAg+B/Vpr94/urg8c1Fq/DL+dGfh4+Yl/+DUhIi2FVQq6FOuCWwc3rvW8xuiKo7n/+j5ddnQhw+QM1Fpdi+XnlvP83XOjo8YplbJV4nSX08yuOZtzD87h8LsDPXb14MnbuH9g2J0Xd+i3tx+2v9ky7NAwCqUvxIEfDnC682laFGyBpXn0Hjl+8/lNHrx5QGmb0tH6PCJ2CwkJoXXr1mzevJnp06dHqkfTuovraLiuIYXSF+JI2yNkSpopGpOKr9m7dy8lSpTg+fPnHDp0KFLbIIX4VlJsEkIIYSitdUj4djkboLhS6uOzd5sDayI7p1Kqs1LKSynl9ejRoyhKKuIy+1T2jKwwkivdr+Dd2ZteJXpx8eFF2mxpQ/rJ6am7pi7Lzy2XFU9RxMLMgm5O3fDt4UvXYl2Z6zWXnDNzMstjFsGhwUbHi3IXHlyg9ebWZJ+RnRnuM6iXux5nu5xlb6u9VMleJcLHx3+ro35HAaR3jvgsrTVdu3Zl7dq1jB8/nl69ekX4sasvrKbFphaUzlKag60PkjpR6mhMKiLijz/+wNbWFg8PD8qWlX/vhWlFqNgU3pA1S3SHEUIIEX9prZ8DhwFnAKVUGqA4sPOjYQHAxz+PbMKv/XOu+VrrYlrrYmnTpo22zCLuUUrhmNGRydUnc6v3LU51OEUPpx6cvX+WNlvakG5SOqour8oczzkEvPzXXz0RSakTpWZWzVmc7XKWIhmL0HN3TxzmOXDgxgGjo30zrTVH/Y5Sa3UtCs0rxMYrG+nu1J3rva6zsuFKCmcobPJMrrdcSW2dWvrniM/6+eefWbBgAUOHDmXw4MERftzK8yv5YfMPlLMtx66Wu0iaMGk0phRf8v79e+7cCVsEPnv2bNzc3LCzszM2lIiXIlRs0mHdG3dFcxYhhBDxjFIqrVIqRfj31kA14Gr43Y2BHVrrdx89ZBvQOvxDkJLAC631PVNmFvGHUooSNiWY8t0U/Pr44dHRg4GlB+L/0p/uu7pjM82GYvOLMcp1FN53vQnVoUZHjrUKpi/IgR8OsLnpZt5+eEu1FdWot7Ye155eMzpapIXqULZc3ULpxaWpsLQCHgEeuFR04U7fO/zm/BtZU2Q1JJfWmv039lM5W2XMlGxuEP82e/ZsxowZQ/v27Rk7dmyEH7f83HJab25NhawV2NliJ0kSJInGlOJLHj16RNWqValSpQpBQUEkTJiQJEnkz0MYwyISY08rpZy01p7RlkYIIUR8kxFYppQyJ+wDkPVa6x3h9zUDxv9j/C6gJnANeAtI8wFhEkopnDI74ZTZiV+r/sqVR1fYcnULO/7cgcsRF0YfGU3GJBmpkaMGNXLWoGr2qnLaVyQppaifpz7OOZz57dRvjD02lnyz89G7RG9GlB9BcqvkRkf8ovch71l1fhUT3SZy9fFVsqXIxuyas2nn0A5rS2uj43Hh4QXuvrrLd/bfGR1FxEB//PEHPXv2pE6dOvz+++8R3tq57Owy2m1tR+VsldnWfBuJLOWEM6NcuHCBunXrcu/ePRYvXkzChAmNjiTiucgUm0oALZVSfsAbQBG26KlQtCQTQggR52mtzwNFPnNfxU9c00D3aI4lxFflTZuXvGnzMrTcUB69ecTua7vZ7rudjVc2svjsYsyVOSVtSvKd/XdUzV4Vp8xOWJhF5m1X/GVlYcWQskNoU7gNww8NZ8rJKSw7twyXSi50dOwY4/45vn7/mgXeC5hycgoBrwIonL4waxqtoXG+xjEq63af7QDUyFnD4CQipnF1daVVq1aULl2atWvXYmERsb+36y6uo/229lTJXoVtzbbFiKJqfLVt2zZatmxJ0qRJOXr0KMWLFzc6khCosPftERio1CfX/Gqt/aI0USQVK1ZMe3l5GRlBiBipYsWKQNgbCBF3fenPWSnlrbUuZtpEMY/8nBCmFBwajLu/O3uu7WH3td2cvncajSZZwmRUtKtIlWxVqGRXifzp8stWpgg6fe80/fb244jfEfKlzceU6lNwzuFsdCyevH3CTI+ZzPSYydPAp5TPWp4hZYbgnMPZZA2/I8Pxd0cSWiTkZIeTf1+TnxNh4vPPiatXr1KqVCkyZcrEsWPHSJUqVYQet81nG43WN6KUTSn2tNojK5oMFBoaSvny5QkKCmLLli1kziyH9Iqo8y0/JyL8cYvW2k8plRLICVh9dJehxSYhhBBCiJjCwsyCMrZlKGNbhjGVx/D47WMO3zzMgRsHOHjzINt8tgGQ2jo15bOWp0LWCpTPWp5C6QthbmZucPqYyTGjI4fbHGbL1S0M3D+QGqtqUC17NSZVm2RIk23/l/5McZvC/NPzefvhLfVy12NwmcGUylLK5FkiyuexD2fun2FK9SlGRxExyOPHj6lduzYJEiRg586dES407b++nyZ/NMExoyM7WuyQQpNB3r17R1BQEMmTJ2fz5s0kTpyYRInkz0LEHBEuNimlOgK9CTv55yxQEjgJVI6WZEIIIWI0pVQWrfWdz9xX+6PeS0LEW2kSpaFJ/iY0yd8EgFvPb3Hk1hFc/Vw5cusIm69uBiBJgiSUtClJmSxlKJOlDMUzF4/xPYpMSSlFg7wNqJWrFnM95+Jy1IUivxehdeHWjKk0hizJo//QZJ/HPkw8MZEV51cQqkNpWaglg8sMJl/afNH+3N9q6dmlmCkzmhdobnQUEUMEBQXRoEED/P39cXV1jfBpZcf8jlFvbT3ypMnD7pa7SZYwWfQGFZ90//596tevT/LkydmzZw9y8q6IiSKzkbw34ASc0lpXUkrlAcZFTywhhBCxwH6llLPW+tbHF5VS7YHhgBSbhPgHuxR22DnY0cahDQC3X9zmmN8xTtw5wYk7J3A54oJGo1DkSZOHEjYlKJG5BE6ZnCiQrgAJLeJ3w9cE5gnoXbI3rQu35tfjvzLDfQZrL66lZ/GeDC03lFTWEVuZERmn751m/PHxbLi8gYQWCelctDMDSw807FS5yAoKDmLx2cXUzlWbjEkzGh1HxABaazp27Mjx48dZu3YtJUuWjNDjTt87Ta3VtbBNbsu+Vvui5d838XWnT5+mXr16PH36lBUrVsTIbbtCQOSKTe+01u+UUiilEmqtryqlckdbMiGEEDFdP2CfUqqW1vpPAKXUUKAFUMHQZELEErbJbWlZqCUtC7UE4GXQS075n8Ld3x33AHd2+O5g6dmlAFiaWVIwfUEcMzjimNGRwhkKUzBdQZImTGrgKzBGSuuUTKw2ke5O3fnZ9WemnAzb1jaw9EB6l+j9zf9MtNYcu32MccfGsff6XpIlTMaQskPoU7IP6RKni6JXYRorz6/k4ZuH9HDqYXQUEUOMGzeOlStX8ssvv9C0adMIPeb60+vUWFWDlNYpOdD6AOmTpI/mlOJTNmzYQOvWrUmTJg0nTpzAwcHB6EhCfFZkik3+SqkUwBbCPs1+hvRrEkKIeEtrvUspFQTsVkrVBzoCxYHyWutnhoYTIpZKljAZ1e2rU92+OhBW9Lj1/BZed704fe803ve82XR1EwvPLPz7MdlTZqdQ+kIUTFeQfGnzkT9tfnKlzhUvVkFlTZGVpfWXMqD0AEYcGsHIwyOZ7j6dQaUH0c2pG4kTJI7UfFprdv25i1+P/8qJOydImygt4yqPo5tTt1i5rfF9yHvGHhtL0YxFqZq9qtFxRAywY8cORo4cSatWrRg2bFiEHvPg9QOqr6xOSGgIe1vtxSaZTTSnFJ/y9u1b+vXrh4ODA5s3byZ9ein4iZgtMg3CG4R/O0opdRhIDuyJllRCCCFiBa31QaVUO8AVcAMqa63fGZtKiLhDKUW2lNnIljLb332ftNbceXmHc/fPcf7Bec49OMe5B+fY5rONUB0KgLkyxz6VPblT5yZ36tzkSp2LXKlzkSNVDjImzRjnTsIrkK4AW5ptwSPAg5GHRzLowCAmuU2iX6l+dHPq9tW+MiGhIWy4vIFfj//KuQfnsE1uy8waM2lfpH2sbn48030mN5/fZE6tObLVRuDr60vLli1xcHBg/vz5Efo78TLoJTVW1eDeq3scanOIPGnymCCp+Njbt29JkCABiRIl4tChQ2TJkoWECeP+hwki9otMg3AroBtQFtDAcSBS71SUUs7AdMAcWKi1Hv+JMd8Do8Kf45zWukVknkMIIYRpKKVeEfbfagUkBKoAD1XYu1ettZauoUJEA6UUtsltsU1uS53cdf6+/i74Hb5PfLn08BKXH13m8uPL+D7xZd/1fQSFBP09zsrCimwpsmGfyp7sKbKTNUVWbJPbkjV5VrKmyEraRGljbWGieObi7G21F7c7bow+MpqhB4cy/vh4ujl1o0fxHmRKmul/xr8Pec+KcyuYcGICfz79k9ypc7Ok3hJaFGxBAvMEBr2KqHHt6TV+cv2JWjlr4ZzD2eg4wmCvXr2iQYMGWFpasnnzZqytrb/6mKDgIBqua8j5B+fZ1nwbJW0i1ttJRB1/f3/q1atHhQoVmDp1Kjly5DA6khARFpltdMuBV8DM8NstgBVAk4g8WCllDswGqgH+gKdSapvW+vJHY3ICQ4EyWutnSqnYtSleCCHiEa11/GsUI0QMZmVhRaH0hSiUvtD/XA8JDeHOyzv4PPbh+rPr3Hh24+//d73lyuv3r/9nfALzBGRKmonMSTOTOVlmMiXJRPok6cmQJAPpE6cnfZL0pE2UljSJ0mBt+fVfWI1QOktp9rbai9ddLyacmMD44+OZ7DaZJvmb0LVYV4pkKMLC0wuZ5DaJgFcBFMlQhD+a/EGDPA0wNzM3Ov43e/P+DU3+aEJC84TMrTXX6DhfpZQarLWeYHSOuEprTdu2bbl69Sr79+8na9avN7fXWtN+W3sO3jzI0npLqZmzpgmSio+5u7tTv3593rx5g4uLi9FxhIi0yBSbCmitPz7b9bBS6vJnR/9bceCa1voGgFJqLVAP+HiOTsDsv3p9aK0fRmJ+IYQQQgjxD+Zm5mGn4KWw+9d9Wmuev3uO3ws//J774ffCj4CXAQS8Cvs6c+8Mu17v+ldB6i+JLROjlMJMmZElWZZofiX/XY5UOXgS+IS1F9ey+sLqv68nskxE1uRZCQoOYpTrKEa5jjIuZBTyeeJDcGgwO1vsJEvymPfnopRa//FNwAGQYlM0mTBhAps2bWLKlClUrlw5Qo8Z5TqK1RdWM7by2L9PzxSms3LlSjp27EjmzJk5cOAA+fPnNzqSEJEWmWLTaaVUSa31KQClVAnAKxKPzwzc+ei2P1DiH2Nyhc99grCtdqO01tIXSgghhBAiGiilSGmdkpTWKXHI4PDZcW/ev+HBmwc8eP2A+6/v8/jt47+/Fp1ZRCLLRLGil0twaDB3Xt7h8ZvH2KWwI23itEZHihZ+L/wonL5wTF6N8lJr3fGvG0qpmL/8KpY6evQow4cPp2nTpvTt2zdCj1l5fiUuR11o69CWoWWHRnNC8U93796lc+fOlCxZkg0bNpAmTRqjIwnxn3y12KSUukBYTw5LwE0pdTv8dlbgajTkyQlUBGyAo0qpglrr5//I1BnoDGBraxvFEYQQQkSEUqoUcEprrY3OIoSIXokTJCZ7guxkT5n9f66/DHrJtFPT6F+qPyMrjDQonfinwvMKkzpRaqNjfMnYf9webkiKOO7Ro0c0b94ce3t7FixYEKFebMf8jtFhWwcq2lXk99q/x9r+bbHR+/fvSZAgAZkyZcLV1RUHBwcSJIjdveNE/BaRBt+1gTqAM5ANqEBYMSgbUCMSzxUAfLyO1yb82sf8gW1a6w9a65uAL2HFp/+htZ6vtS6mtS6WNm3c/ERKCCFigdaAt1JqrVKqrVIqg9GBhBCmdfreaTSaopmKGh1FfCSRZSICPwQaHeNflFL7lVKFw9/n/01r/dSoTHFVaGgorVu35smTJ6xfv56kSb/eZvHa02vUX1cfuxR2bPx+Y6xvkh+b3Lx5k2LFirFkyRIAihcvLoUmEet9dWWT1tovip7LE8iplMpGWJGpGWFNxj+2BWgOLFFKpSFsW92NKHp+IYQQUUhr3RVAKZWHsA8fliqlkgOHgT3ACa11iIERhRDRzOtuWEcFp0xOBicRH7O2sCYwOOYVm4DBwG9KqVvAMK31PYPzxFmTJk1iz549zJkzBwcHh6+Ofxb4jFqra6FQ7Gyxk1TWqaI/pADCtjo2atSI4OBgbGxsjI4jRJSJyMqmKKG1DgZ6AHuBK8B6rfUlpZSLUqpu+LC9wJPwxuOHgYFa6yemyiiEECLytNZXtdbTtNbOQGXgOGEnlbobm0wIEd287nqRNXnWONv7KLaKqSubtNantdaVgB3AHqXUz0qpmHmkYSzm5ubG8OHDadKkCT/++ONXx4eEhtBiUwtuPrvJ5qabyZEqhwlSCoBFixZRtWpVUqVKhbu7O9WqVTM6khBRJjINwr+Z1noXsOsf13766HsN9Av/EkIIEctorQMJ++/8rq+NFULEfp53PSmWqZjRMcQ/WFvG2JVNqLAmQD7AXOAXoJNSaqjWeoWxyeKGFy9e0Lx5c7JmzRrhPk3DDw1nz7U9/F77d8plLWeClALg9OnTdOzYkerVq7Nu3TpSpEhhdCQhotRXVzYppUop6QwnhBBCCCE+8jTwKTee3ZAtdDGQtYV1jFzZFH7idAAwjbCTqtsS1gu2uFJqvnHJ4o5evXoREBDA6tWrSZ48+VfHr7u4jgknJtClaBc6F+1sgoQiNDQUAEdHR3bs2MHOnTul0CTipIhso5MGsEIIIf5FKTXF6AxCCON43/UGkObgMZC1hTVvP7w1OsandAYya62raa1Haq13aK2vaa17ArKk5htt2LCB5cuXM2LECEqUKPHV8Wfvn6Xd1naUyVKGGTVmmCCh8PX1pUiRIpw8eRKAWrVqYWFh0s1GQphMRBqESwNYIYQQn1LJ6ABCCOP81Ry8aEYpNsU0MXUbndb60hfurmWyIHHQvXv36NKlC05OTgwfPvyr4x+/fUz9tfVJZZ2KDd9vkJPnTODAgQM0adIEc3NzgoODjY4jRLSLcINwaQArhBBCCCH+4nXPixypcpDSOqXRUcQ/xNRtdF+itZYTqP8jrTXt27cnMDCQFStWYGlp+cXxIaEhNN/YnPuv77O56WYyJJGNK9FJa83s2bNxdnbGxsYGT09PypWThXwi7vtPa/akAawQQgigsFLqJnABuPjR/18JP4FUCBGHed31opRNKaNjiE+wtrTmQ+gHQkJDMDczNzqOiGbz5s1jz549zJ49m9y5c391/C9Hf+HAjQPMrz0fp8zScy26bd26lR49elCnTh1WrVpF0qRJjY4khElEeGWTEEII8Q/ngTLALOAJUB1YAjxRSl00MpgQIno9fPOQ2y9uS3PwGMrawhogRm6lE1Hrxo0bDBgwgO+++46uXbt+dfz+6/sZfWQ0PxT6gY6OHU2QMP4KO2gd6taty9KlS9m8ebMUmkS8IsUmIYQQ/5nW+q7Wep/WeorWup3WuhiQAmhgcDQhRDSS5uAxm7VleLEplm2lE5GjtaZz586Ym5uzcOFCvnaAeMDLAFpuaknetHmZW2vuV8eL/+7y5cuUK1eOO3fuYGZmRps2bTA3l1WGIn6JcLFJKVVDKeWulPJRSq1XSsm6aSGEiN9mfeqiDvOnqcMIIUzH664XCoVjRkejo4hPkJVN8cOSJUs4ePAgkyZNwsbG5otjg0ODabaxGW8/vGVDkw0kTpDYRCnjn127dlGyZEmuXbvGw4cPjY4jhGEis7JpDtAPKAnMByYppZpHSyohhBAxntZ6kdEZhBDG8LrnRe40uUmWMJnRUcQnyMqmuO/u3bv069eP8uXL06lTp6+OH35wOMdvH2d+nfnkTZvXBAnjH601kydPpnbt2uTIkQNPT0+KFpXVnyL+ikyx6aHW+oTW+pnW+gDwHfD1czWFEEIIIUSc4nXXi6IZ5ZeomMrKwgqQlU1xldaa7t27ExQUxIIFCzAz+/KvdHuu7WGi20S6FO1Ci4ItTJQy/pk1axYDBw6kUaNGHDt2jCxZshgdSQhDReY0uptKqV8AF631e+ADIKcNCSGEEELEI3df3eXuq7vSHDwG+2sb3bvgdwYnEdFh48aNbNmyhQkTJpArV64vjn345iFtt7SlQLoCTPtumokSxk9t2rQBoHv37l8tAAoRH0Tm34JQwhq+3lFKHQeuAa5KqZzRkkwIIYQQQsQ40hw85pNtdHHX8+fP6dGjB46OjvTr1++LY7XWtNvajufvnrO64eq//16IqHPu3DkaNmzI27dvSZYsGT179pRCkxDhIryySWvdAkAplRAoABQO/1qglMqutbaNnohCCCGEECKm8L7njZkyo0iGIkZHEZ8hDcLjrp9++olHjx6xa9cuLCy+/KvcbM/Z7PpzFzOcZ1AwfUETJYw/Nm/eTKtWrUiZMiX+/v5fXWUmRHwTmW10AGitgwDv8C8hhBBCCBGPeN31Il/afHKaVQz2d88mWdkUp5w9e5bZs2fTtWtXHB2/fBLkxYcXGbBvADVz1qRH8R4mShg/aK0ZO3YsI0eOpESJEmzevJmMGTMaHUuIGEfW+AkhhBBCiAjRWktz8Fjgr+1S0rMp7ggNDaV79+6kTp2aMWPGfHFs4IdAmm9sTgqrFCyptwSllIlSxg/Dhw9n5MiRtGzZEldXVyk0CfEZkV7ZJIQQQggh4qeAVwE8ePOAYpmKGR1FfIE0CI97li9fjpubG0uWLCFlypRfHDvs4DAuPrzI7pa7SZc4nYkSxh/t27cnderU9OvXTwp5QnyBrGwSQgghhBAR8ndzcFnZFKP93SBcejbFCc+ePWPQoEGULl2a1q1bf3HsUb+jTHefTnen7jjncDZRwrjP09OTPn36oLUmR44c9O/fXwpNQnyFFJuEEEIIIUSEeN31wlyZ45DBwego4gukZ1PcMnLkSJ48ecLs2bO/eNLZ6/evabulLdlTZmdC1QkmTBi3rVmzhvLly7NlyxYePHhgdBwhYg0pNgkhhBBCiAjxuudF/nT55Qj1GO7vYpOsbIr1Lly4wNy5c+nWrRsODg5fHDt4/2BuPb/FknpLpIF/FAgNDWXEiBG0aNECJycnPD09yZAhg9GxhIg1pNgkhBBCCCG+SpqDxx4WZhZYmFnEyZ5NSilnpZSPUuqaUmrIF8Y1UkpppVSsbjA2YMAAkidPzujRo7847uCNg8zxmkOfkn0ol7WcidLFbR07dmTs2LF06NCBAwcOkDZtWqMjCRGrSINwIYQQQgjxVXde3uHx28fSHDyWsLKwinPFJqWUOTAbqAb4A55KqW1a68v/GJcU6A24mz5l1NmzZw/79u1j2rRppEqV6rPjXga9pP229uROnZuxlceaMGHc1qJFCwoVKkTv3r2lP5MQ/4FJi01KKWdgOmAOLNRaj//H/W2BSUBA+KVZWuuFpswoRGwTEhKCn58fV69excfHh2vXrvHnn3/i7u7O+/fvSZQokdERTU5rTVBQEFprLCwssLCwiLNvEoKCgsiRI4fRMYQQ8YDXXS9AmoPHFtYW1nGxZ1Nx4JrW+gaAUmotUA+4/I9xY4AJwEDTxos6wcHBDBgwgBw5ctCtW7cvju2/tz/+L/050f6EbHH9RidOnODMmTP06NGDqlWrUrVqVaMjCRFrmazYFNFPIoB1WusepsolRGwRGhqKn58fFy5c4OLFi1y4cIHLly/j6+vLu3f//8ll8uTJyZkzJ7a2tiRJkoQqVaoYmNq0tNb4+vpy4MABtNZA2Ju1RIkSUaZMGfLly/fFxpqx0cyZMwkICOD9+/ckSJDA6DhCiDjM+643FmYWFM5Q2OgoIgKsLKx4FxK3VjYBmYE7H932B0p8PEAp5Qhk0VrvVErF2mLT4sWLuXTpEhs3bvziz/dDNw+x8MxCBpUeREmbkiZMGPcsXbqUzp07kz17djp06IC1tRTuhPgWplzZFNFPIoSI9z58+MClS5c4ffo0Z8+e5cyZM5w7d45Xr179PcbOzo78+fNTvXp18uTJQ548ecidOzepU6eOs6t4vuT+/ft069aNbdu24ejoyIIFC3B0dGT//v0MHTqU3bt34+fnxy+//EL9+vXjzD+jihUrUqtWLTZv3kzTpk2NjiOEiMO87nmRP23+v5tPi5jN2tI6zm2j+xqllBkwFWgbgbGdgc4Atra20Rsskl69esXIkSMpW7YsDRo0+Oy4wA+BdN7emRypcjCq4ijTBYxjQkJCGDx4MFOmTKFKlSqsX79eCk1CRAFTFpu++klEuEZKqfKAL9BXa33nE2OEiDO01ly7do1Tp07h4eGBl5cXZ8+e/Xu1UpIkSShcuDCtW7emcOHCFCxYkPz585M0aVKDk8cMWmvWrVtH9+7defPmDRMmTKBfv35YWIT9561atWpUrVqVjRs3MmLECBo2bEixYsUYO3Ys1apVi/VFJ2dnZ+zs7FiwYIEUm4QQ0eav5uD1c9c3OoqIICsLq7i4jS4AyPLRbRv+v/0GQFKgAOAa/vM9A7BNKVVXa+318URa6/nAfIBixYrp6AwdWRMmTODhw4ds3779i+9Txhwdw/Vn1znY+qBsn/uPtNY0bNiQbdu20aNHD6ZOnYqlpaXRsYSIE2Jag/DtwBqtdZBSqguwDKj8z0Ex+ZMIIb4mMDAQT09Pjh8/jpubG6dOneLJkycAJE6cmKJFi9KtWzecnJxwdHQkR44ccW7rV1R58uQJ3bp1Y/369RQvXpxly5aRJ0+ef41TStG4cWPq16/PihUrGD16NN999x3ly5fnl19+oVy52Htqi5mZGW3atMHFxYW7d++SKVMmoyMJIeIgvxd+PA18Ks3BYxErCyuCQoKMjhHVPIGcSqlshBWZmgEt/rpTa/0CSPPXbaWUKzDgn4WmmCwgIIApU6bQvHlzihcv/tlx5x+cZ5LbJNo6tKVytn/9uiQiSClF9erVqVGjBj/++KPRcYSIU0xZbPraJxForZ98dHMhMPFTE8XkTyKE+KfXr19z4sQJXF1dOXr0KF5eXrx//x6AvHnzUq9ePUqWLEnJkiXJly8f5ubmBieOHfbs2UP79u15/PgxY8eOZdCgQX+vZvocCwsL2rVrR4sWLViwYAHjxo2jfPnyVKtWDRcXF0qWjJ29Dpo1a8bo0aPZsGEDvXr1MjqOECIO8r7rDUDRTNIcPLaIiyubtNbBSqkewF7CDhxarLW+pJRyAby01tuMTfjtxo4dS0hICGPHfv5UuZDQEDpt70RKq5RMrjbZhOnijsOHDxMYGEjNmjXp3r270XGEiJNMWWz64icRAEqpjFrre+E36wJXTJhPiCgRFBSEm5sbBw4c4PDhw3h6ehIcHIyFhQXFihWjd+/elCtXjjJlynzxGFvxaYGBgQwaNIhZs2aRP39+du3ahYODQ6TmSJgwIT169KBDhw7MmTOH8ePHU6pUKWrUqMHo0aNxcnKKnvDRJE+ePOTLl48tW7ZIsUkIES287nphaWZJ4fTSHDy2sLKw4sW7F0bHiHJa613Arn9c++kzYyuaIlNUuXnzJgsXLqRjx45ky5bts+Nme87GI8CDVQ1XkTpRahMmjBvmzZtHz549KVq0KDVq1Ij1LRWEiKlMtjdHax0M/PVJxBVg/V+fRCil6oYP66WUuqSUOgf0IgLN/YQwmtaay5cvM3XqVGrUqEGqVKmoXLkyEyZMQGvNwIED2bt3L8+fP+fkyZNMnDiROnXqSKHpPzh79ixFixZl1qxZ9OnTBy8vr0gXmj5mbW1N//79uXnzJr/++ivu7u4UL16c2rVr4+npGXXBTaBOnTocO3aMly9fGh0lUpRSVkopD6XUufD//o8Ov66UUmOVUr5KqStKqV4fXZ+hlLqmlDoffuqQECKaed/zpkC6AiS0SGh0FBFBVhZW8a5BeGw3ZswYzMzMGD58+GfH3Hlxh+GHhvOd/Xc0L9DchOlivw8fPtCjRw+6du1K9erV2bt3rxSahIhGJu3Z9LVPIrTWQ4GhpswkxH/x+vVrDh48yK5du9izZw+3b98GwlaYdOjQgapVq1KxYkWSJUtmcNK4ITQ0lKlTpzJs2DDSpEnDvn37qFatWpTNnyRJEoYMGUL37t2ZOXMmU6ZMoXjx4tSoUYOffvopVmyvc3Z2ZsKECRw6dIj69esbHScygoDKWuvXSilL4LhSajeQl7Ct13m01qFKqXTh42sAOcO/SgBz+fRhE0KIKPJXc/BGeRsZHUVEgrWFNYHBcWsbXVzm6+vLsmXL6N27N5kzZ/7suL57+xISGsLcWnOlUBIJgYGB1KlTh4MHDzJgwADGjx8vrSuEiGbSdViICLp9+zZz5syhRo0apEmThvr167NmzRqKFi3K/Pnz8fPz48qVK8yYMYO6detKoSmKBAQEUK1aNQYOHEjt2rW5cOFClBaaPpY0aVKGDRvGrVu3GDduHB4eHpQqVYpq1apx9OjRaHnOqFK6dGkSJUrEoUOHjI4SKTrM6/CbluFfGugKuGitQ8PHPQwfUw9YHv64U0AKpVRGU+cWIj659fwWz949k+bgsYyVhRVBwXGuQXicNWrUKKysrBgyZMhnx+y/vp+NVzYyvNxwsqX8/DY78W9WVlbkzp2bJUuWMGnSJCk0CWECUmwS4jO01ly8eJExY8bg6OhI1qxZ6d69O9euXaNbt24cOnSIx48fs2nTJjp16iQnI0aDTZs2UahQIU6dOsWCBQvYuHEjqVNHf2+CpEmTMnToUG7dusXEiRM5f/48FSpUoHz58uzduxetY965BAkSJKB06dIcOXLE6CiRppQyV0qdBR4C+7XW7oA90FQp5aWU2q2Uyhk+PDNw56OH+4df++ecncMf6/Xo0aNofgVCxG3e98KagztmlF2rsYmVhZWsbIolLly4wNq1a+nduzfp0qX75Jj3Ie/pubsn9int6V+6v4kTxl579+7l8uXLKKWYPXs2bdu2NTqSEPGGFJuE+IjWGi8vL4YMGUKuXLkoWLAgP//8M1ZWVkyYMIErV67g6+vL1KlTqVSpEgkSJDA6cpz0+vVrOnXqRKNGjciePTtnzpyhY8eOJl8uniRJEgYOHMjNmzeZPn06N2/exNnZGScnJzZt2kRoaKhJ83xN+fLluXDhAs+fPzc6SqRorUO01g6EnVJaXClVAEgIvNNaFwMWAIsjOed8rXUxrXWxtGnTRnlmIeKTv5qDF0pfyOgoIhJkZVPs8fPPP5M0aVIGDBjw2TG/nfoNnyc+zKgxAysLKxOmi5201vz222/UrFmTESNGGB1HiHhJik0i3vurwDRo0CDs7e1xcnJiypQp2NvbM2/ePAICAnBzc2PQoEHkyZNH9sdHM09PTxwdHVm0aBFDhw7Fzc2NXLlyGZopUaJE9OrVi2vXrrFgwQJevHhBo0aNyJ8/P0uXLuX9+/eG5vtL6dKl0Vrj7u5udJT/RGv9HDgMOBO2YmlT+F2bgb9+yw0grJfTX2zCrwkhook0B4+dpEF47HDmzBk2b95M//79P3t4jP9Lf1yOuFAnVx1q5qxp4oSxz/v37+nUqRN9+/alXr16LF++3OhIQsRLUmwS8dbly5cZOXIkuXLlwsnJid9++428efOyePFiHjx4wJ49e+jSpQsZM0o7GFMICQlh7NixlC5dmnfv3nH48GHGjRuHpaWl0dH+ljBhQjp27MiVK1dYs2YNCRMmpF27dtjb2zN16lRevXplaD4nJyeUUrGq2KSUSquUShH+vTVQDbgKbAEqhQ+rAPiGf78NaB1+Kl1J4IXW+p5JQwsRj2it8b7rTdGMRY2OIiLJysKKoJAgQnXMWoUr/te4ceNInjw5vXv3/uyYAfsGEBwazG/Ov5kuWCz17NkzqlatyqJFixgxYgQbNmwgSZIkRscSIl6SYpOIV+7evcvkyZNxcHAgf/78jBs3Djs7OxYtWsSDBw/YuXMn7dq1++wnSyJ63Lp1i4oVKzJixAgaNWrEuXPnqFChgtGxPsvCwoJmzZpx5swZdu/ejb29Pf3798fW1pZhw4Zx754xtY9kyZKRJ08evLy8DHn+/ygjcFgpdR7wJKxn0w5gPNBIKXUB+BXoGD5+F3ADuEbY9rpupo8sRPwhzcFjr7+2Wr0PiRmrb8W/+fj4sHHjRrp3707y5Mk/OebwzcOsu7SOIWWHkD1ldhMnjH0SJUpEwoQJWb16NWPGjMHMTH7dFcIoFkYHECK6vXnzhk2bNrF8+XIOHjyI1poSJUowffp0vv/+ezJkyGB0xHhLa82qVavo3r07WmuWL19Oq1atYs1WRaUUzs7OODs74+7uzqRJkxg/fjxTpkyhVatW9O/fn3z58pk0k6OjI4cPHzbpc34LrfV5oMgnrj8Han3iuga6R38yIQT8f3PwoplkZVNs81exKfBDoPT4iaEmTJiAlZXVZ1c1BYcG03N3T+xS2DG4zGATp4td9uzZQ/HixUmVKhX79u2LNe8lhYjLpNQr4iStNceOHaNDhw5kyJCB1q1bc/36dUaOHImPjw+nTp2iV69eUmgy0JMnT2jatCk//PADhQoV4vz58/zwww+x9s1BiRIl2LBhA76+vnTo0IE1a9aQP39+atasyYEDB0x2gl2RIkW4e/cucgKbECIq/NUcvGC6gkZHEZGU0Dysx1ZQiDQJj4lu377NihUr6Nix42dPoFt0ehGXHl1icrXJWFtamzhh7KC1Zvz48dSsWRMXFxeAWPteUoi4RopNIk65f/8+48ePJ1euXJQvX55169bRpEkTjh49yvXr1xk9erThzaZF2KdPBQsWZMuWLfz666+4urpiZ2dndKwokSNHDubMmcPt27dxcXHB29ubatWq4eDgwJIlS3j3LnqbtRYuXBiAc+fORevzCCHiB2kOHnv9tZpJTqSLmaZMmQLw2RPoXga95CfXnyhrW5aGeRuaMlqs8e7dO3744QeGDh1K06ZN+fXXX42OJIT4iBSbRKwXEhLCzp07adCgATY2NgwdOpRMmTKxdOlS7t+/z+LFiylXrpx8yhEDvHnzhm7dulGjRg1SpkyJu7s7Q4YMwdzc3OhoUS5NmjSMHDkSPz8/Fi9ejNaa9u3bY2try08//RRtfZ0KFQo7tO3ChQvRMr8QIv6Q5uCx29/b6IIDDU4i/unRo0csWLCAVq1aYWtr+8kxE45P4OGbh0ytPlXew37C/fv3qVixIqtWreKXX35h9erVWFvL6i8hYhIpNolY6/79+4wdO5bs2bNTu3Zt3Nzc6N+/P1evXuXIkSO0adNGTp+IQdzc3HBwcGDevHn069cPb29vihT5V6ueOMfKyop27dpx7tw5Dh48SIkSJfjll1/ImjUrrVq1wsPDI0qfL126dKRNm5ZLly5F6bxCiPjnr+bg0q8pdpKVTTHX9OnTeffuHYMHf7oP0+0Xt5l6aiotCrbAKbOTidPFHi9fvmTTpk0MHz5cCnJCxEBSbBKxitYaV1dXmjRpQpYsWRgxYgQ5c+bkjz/+4M6dO0yYMIHcuXMbHVN85N27dwwZMoRy5crx4cMHDh06xJQpU7Cyil/NSpVSVK5cme3bt+Pj40PXrl3Ztm0bJUqUoESJEqxYsSLKttjly5ePy5cvR8lcQoj46+/m4LKyKVb6a+ujrGyKWV6+fMmsWbNo2LAhefLk+eSYYQeHAfBrFdkW9k+HDh0iODiYDBkycP78eRo0aGB0JCHEZ0ixScQKr1+/Zu7cuRQsWJBKlSpx6NAh+vTpg6+vLwcOHKBx48YkSJDA6JjiH7y8vChatCgTJkygffv2XLhwgYoVKxody3A5c+Zk+vTp+Pv7M3PmTF68eEHr1q3JkiULw4YNw8/P75vmz5s3L1evXo2itEKI+Mr7rjeWZpYUSl/I6CjiP5CVTTHTwoULefHiBUOHDv3k/Z4Bnqy6sIq+Jftim/zTW+zio9DQUEaNGkWVKlWYOXMmABYWcrC6EDGZFJtEjHbjxg369u1L5syZ6datGwkTJmTJkiX4+/szadIkcubMaXRE8QlBQUGMGDGCkiVL8uLFC3bv3s2CBQtImjSp0dFilGTJktGjRw+uXLnC/v37KVOmDBMmTCB79uzUrVuXPXv2EBoaGul5c+fOzbNnz6IhsRAiPpHm4LGbnEYX8wQHBzNjxgzKly9P0aL/XjGotab/vv6kS5yOIWWHGJAwZnr79i3NmjVj9OjRtG3blm7duhkdSQgRAVJsEjGO1prDhw9Tr149cuTIwaxZs6hVqxYnT57Ey8uLtm3bSgPAGOyv1Uxjx46lVatWXLx4EWdnZ6NjxWhKKapWrcqWLVu4ceMGQ4YMwd3dnRo1apAzZ04mTJjAw4cPIzyfnLgohPhWWmu870lz8Njsr5VN74Kj9xRUEXHbtm3Dz8+PPn36fPL+rT5bOXb7GKMrjiZZwmSmDRdD+fv7U65cOTZs2MDkyZNZvHgxCRNKAVyI2ECKTSLGeP/+PStWrMDR0ZHKlSvj5ubGsGHDuHXrFqtXr6ZkyZLS/C8GCwwMZPDgwZQoUYLnz5+za9culi5dSooUKYyOFqtkzZqVsWPHcufOHdauXYutrS1DhgzBxsaGpk2bcvDgwa+udpIVf0KIb+X3wo+ngU+lOXgs9teKNNlGF3NMnz4dOzs76tat+6/7QkJDGHFoBLlS56KjY0cD0sVMDx8+5O7du+zYsYP+/fvL7wJCxCJSbBKGe/78ORMnTiR79uy0bt2aoKAgFixYwO3bt/nll1/InDmz0RHFVxw9epTChQszceJE2rdvz8WLF6lRo4bRsWK1BAkS0LRpUw4fPsyVK1fo3r07+/fvp2rVquTKlYvx48dz//79Tz7Wzs4Oc3NzEycWQsQl3nelOXhsJyubYpYzZ85w9OhRevbs+cmf0WsuruHSo0uMqTQGCzPpReTl5QWAo6MjN27coGbNmgYnEkJElhSbhGECAgIYOHAgtra2DB48mNy5c7Nz504uXrxIx44dZatcLPDixQt+/PFHKlSoQHBwMAcOHGDBggWymimK5cmTh2nTpnH37l1WrFiBjY0NQ4cOxcbGhvr167Njxw6Cg4P/Hm9paYmtrTQVFUL8d973vLEws6Bg+oJGRxH/0d8NwqVnU4wwffp0kiRJQocOHf513/uQ9/x0+CeKZChC43yNDUgXc4SEhDBkyBCcnJzYtm0bgPxOIEQsJcUmYXJXr16lffv2ZMuWjalTp1K7dm1Onz7NwYMHqVmzJmZm8tcyptNas3nzZvLmzcuCBQvo168fFy5coEqVKkZHi9OsrKxo1aoVrq6u+Pj40K9fP06ePEmdOnWwtbVl6NCh+Pr6AmBvb29wWiFEbPZXc/C/ChYi9vmrQbisbDLe/fv3WbNmDW3btiV58uT/un/R6UXcfH6TsZXHYqbi7/vgV69e0aBBAyZMmMCPP/4oq+SFiOXi73/NhMl5e3vTuHFj8uXLx9q1a+ncuTPXrl1j9erVFClSxOh4IoJu375N/fr1adiwIenSpcPd3Z0pU6aQOHFio6PFK7ly5WLixIn4+/uzadMmihYtysSJE8mdOzdly5YlKEg+yRZC/Ddaa7zveuOYwdHoKOIbyDa6mGPevHm8f/+eXr16/eu+tx/eMuboGMralsU5R/w9UOXmzZuULl2aXbt2MXv2bObOnYulpaXRsYQQ30A2BItod/z4cX755Rf27t1L8uTJGTZsGL179yZt2rRGRxOR8NdxvT/99BNaayZNmkTv3r3ljYDBLC0tadCgAQ0aNODevXusWLGCJUuWcPXqVaOjCSFiqdsvbvMk8Ik0B4/lpEF4zBAUFMTcuXOpVavWJw/wmOUxi3uv77Gu8bp43fzay8uLgIAA9uzZQ9WqVY2OI4SIArKySUQLrTWHDx+mUqVKlCtXjtOnT/Prr7/i5+fHL7/8IoWmWMbNzY2iRYvSv39/KlSowKVLlxgwYIAUmmKYjBkzMmjQIC5fvsyiRYuMjiOEiKW870lz8LjA0swShZKVTQZbv349Dx8+pE+fPv+678W7F4w/Pp4aOWpQLms504eLAf78808AmjRpwvXr16XQJEQcYtJik1LKWSnlo5S6ppQa8oVxjZRSWilVzJT5xLfTWnPgwAHKly9P5cqV8fHxYdq0ady6dYshQ4Z8cp+6iLkeP35Mx44dKVOmDE+fPmXjxo3s2LEDOzs7o6OJL1BK0b59e6NjCCFiKe+73pgrcwqlL2R0FPENlFIktEgoDcIN9vvvv5MrV65P9rWccnIKz949Y2zlsQYkM1ZwcDB9+vQhf/78nD17FoCUKVMaG0oIEaVMVmxSSpkDs4EaQD6guVIq3yfGJQV6A+6myia+ndaagwcPUq5cOapVq8atW7eYNWsWN27coE+fPiRKlMjoiCISQkJCmDNnDrly5WLp0qUMGDCAK1eu0LBhw3i9xFsIIeKD0/dPkz9dfqwt5QSo2C6heULZRmegS5cuceLECTp37vyv909PA5/y26nfaJyvMUUyxq/epc+fP6dWrVpMnz6d7t27U6BAAaMjCSGigSlXNhUHrmmtb2it3wNrgXqfGDcGmADImt9YwtXVlQoVKlC1alX8/PyYM2cO165do3v37lhZySk2sY2bmxtOTk50794dBwcHzp8/z6RJk0iSJInR0YQQQkSzv5qDyxa6uMHKwkq20RlowYIFJEiQgDZt2vzrvhnuM3j1/hU/lf/JgGTG8fX1pWTJkhw+fJiFCxcybdo0LCykjbAQcZEpi02ZgTsf3fYPv/Y39X/t3Xt8z3X/x/HH207OdDmfcggLcxkmJMopIuQQCZOUUkmp33VVihKui4viirpwXSKSYzFzyqEr57AxOR9znByqzZrNDu/fH99t10gatu9n++55v926tX2/n3339L7hNa/v+/36GFMPqGCtXebGXHKbtm7dSqtWrWjevDlHjx5l0qRJHDlyhIEDB+Ln5+d0PLlFp0+fplevXjRp0oTz588zb9481q5dS82av9mAKCIiHup09GkuxF5Qs8lD6Bidc65cucJnn31Gly5dKF68+DXPRcVFMWHrBDrf25napWo7lNAZ8+bN49KlS6xdu5b+/fs7HUdEslC2GRBujMkDfAC8loFrBxhjdhhjdly4cCHrw8k1IiIi6NChA40bN2b37t18+OGHHD16lBdffFFNphzoypUrjBw5En9/fxYtWsTQoUM5cOAA3bt315E5EZFcJnU4eL0y9RxOIpkhr3deNZscsnDhQn7+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vIifnx8PP/ww7777Lh07dqRYsWJOxxQREckW4hPj2XN+D/93//85HUXcwM/Lj4TkBKdj5HiHDx/m4MGDvPTSSwBM3zmdJJuULQaDz5kzh969exMUFMTixYspW7as05FERLLfgPCczFrLlClTeO211/D19eXzzz+nZ8+eetcwC/z000+sXLmSxYsXs2LFCmJiYihcuDCPPvoonTt3pm3btprBJCIicgN7zu8hMTlRw8FzCe1syhyhoaEAtG/fPm0weIvKLahWrJrDyaBVq1YMHjyY0aNHky9fPqfjiIgAajZlmsjISPr378+KFSto3bo106dPp3z58k7H8hjWWvbv309oaCihoaFs2rSJ5ORkSpUqRa9evejcuTPNmzfH19fX6agiIiLZWnhkOKDh4LmFr5evBoRngtDQUGrVqkXlypVZeWQlJ6JOMKbVGMfyREZGMnbsWMaOHUvJkiX58MMPHcsiInIjajZlgi+//JIBAwbw66+/MmnSJF544QXtZsoE8fHxrF+/Pq3BdOzYMQACAwN566236NChA0FBQeTJk8fhpCIiIjlHWGQYRfyKULloZaejiBv4eftxNVnNpjsRFRXF+vXree211wD4z87/uAaD13BmMHhYWBidOnXil19+oU+fPtSrV8+RHCIiN6Nm0x2Ijo7m5ZdfZubMmdSvX5/Zs2dz7733Oh0rRzt58iSrVq1i5cqVfP3118TExJA3b15atWrFX/7yF9q3b68dYyIiIncgPFLDwXMTHaO7c19//TWJiYk8+uijXIq9RMjBEF4IegFfL/fvqF+wYAF9+/alRIkSbNq0iTp16rg9g4hIRqjZdJs2b95M7969OXHiBG+//TbDhg3Dx8fH6Vg5zpUrV/j2229ZtWoVq1atYv/+/QCUK1eOXr168eijj9KiRQvy58/vcFIREZGcLyEpgd0/7ual+15yOoq4ia+XrwaE36HQ0FD+9Kc/0ahRI6aET+Fq0lWeCnzK7TkmTpzIK6+8QpMmTfjyyy8pWbKk2zOIiGSUmk23KDExkffff5+RI0dy9913s379epo0aeJ0rBzDWsu+ffvSmkvffvst8fHx+Pn58eCDD/LMM8/Qpk0batasqXdcRUREMtmBiweIT4qnXhkdu8kttLPpziQlJbF8+XLatWuHt7c3MyNmUqdUHeqUdv+OogcffJDnn3+eCRMm4Ofn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e/fufPrpp7qxj4jkau5sNpUDTqX7/DTQ8CbX9wdWZOSFrbVMmTKFwYMHU6ZMGTZt2kRQUNBvrrt06VJaQyn9/48ePZo2rBugbNmy1KpVi+eff55atWoREBBAzZo1decIERERyVEuxV7iZNRJXmrwktNRxCE6RpdxmzZtwlrL4YKH6V6j+y0NVE9MTGTXrl2MGDGCt99+O0NveIuIeLJsOSDcGNMbCAIe/J3nBwADACpUqEC/fv2YOXMmbdq0YcaMGURFRRESEvKbxtKlS5fSXsPX15dq1apRq1YtunTpwr333ou/vz/+/v4ULVrUDb9KERERkay189xOQMPBczOfPD4AJCRpZ9Mf2bBhA17eXsSWjM3wEbrvv/+eKlWqULBgQb777jvy5tUd/0REwL3NpjNAhXSfl0957BrGmFbAUOBBa+0ND5dba6cCUwF8fX3tzJkz8ff354cffqBChQrX7FIqVaoU/v7+dO3aFX9//7SmUqVKlTSsT0RERDxa6p3o6pWp53AScYp2NmXchg0bKFq5KKaooUXlFn94/aJFiwgODqZv3758/PHHajSJiKTjzmbTdqCaMaYyribTE8CT6S8wxtQFpgBtrbXnM/KiCQkJeHt7p939TbuURERERFzCI8OpWKQif8r3J6ejiEN8vFw7m9RsurkrV66wfft2aAR9/fvinef3/5lkrWXkyJEMGzaMRo0aMWzYMDcmFRHJGdzWbLLWJhpjXgJWAV7AdGvtXmPMCGCHtTYE+AdQEFiQcs75pLW2481et3r16uzbt0+7lERERESu889H/snp6NNOxxAH3VfuPsIGhFG9WHWno2Rr27dvJyEhAcpB15pdf/e62NhYnn76aebNm0dwcDBTpkzRjiYRkRtw68wma+1yYPl1jw1L93GrW33NQoUKqdEkIiIicgMlC5SkZIGSTscQBxX2K6xjlBmwYcMGAApVLXTTI3QXLlzgm2++YezYsbz++usaBC4i8juy5YBwERERERERd1m/fj15SuWhU71OaXOu0jt48CDVq1enYsWKHDp0iCJFijiQUkQk58jjdAAREREREREnbdy8keQKyXSt8dsjdHPmzKFOnTpMmDABQI0mEZEMULNJRERERERyrdjYWGJjYvGr4kebe9qkPZ6cnMzQoUPp1asXjRo1ok+fPg6mFBHJWXSMTkREREREcq3Lly8D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", + "image/png": "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E/Dz83P79xcRuRVqNt2Co0eP0rt3b7Zu3UpwcDAfffQRhQsXdjpWtnf27FnWrVvHunXrWL16NadPnwagRo0aDBw4kDZt2tCsWTPtXhIREcliacPBy2g4eG6hAeF35rvvvuPixYs8+uij7D2/l+1nt/NhG/cN4z516hQLFixgyJAhBAYG8sknn7jte4uI3Ak1mzJo1qxZvPDCC3h5eTF37lx69OjhdKRs66effuK///0v69atY+3atRw4cACAu+66ixYtWjBs2DDatGnD3Xff7XBSERGR3CUsMowCPgWyxe3axT38vPzUbLoDoaGheHl50aZNG0ZvH413Hm+erP2kW773li1b6Ny5M1euXOHxxx+nQoUKbvm+IiKZQc2mPxAVFcWLL77I559/TtOmTZk9e7aaJNeJiYlh48aNrF27lnXr1rFz506stRQoUIBmzZrRv39/WrZsSZ06dXTnOBEREQeFR4ZTp3Qd8hjV49zC18uXy1cvOx0jx1qxYgUPPPAABQsXZPbu2bSr1o6SBbJ+VtKsWbN45plnqFChAuvWrVOjSURyHDWbbmLr1q08+eSTnDx5khEjRvDWW2/h5eXldCzHRUVFsXnzZjZs2MD69ev57rvvSExMxNfXl8aNG/Pee+/RokULGjRogK+v++/SISIiIr+VbJPZdW4XT9d92uko4ka+Xr4kJGlA+O04f/48u3btYtSoUaw+uprImEieqvNUln/fd999l/fee4/mzZuzYMECihUrluXfU0Qks6nZdAPJycmMHTuWd955h3LlyrF+/Xruv/9+p2M55vz582zcuJH169ezYcMGdu3aRXJyMt7e3tSvX5/XX3+dFi1a0KRJE81dEhERyaYOXzrMrwm/ajh4LuPr5Ut8kgaE345169YB0KpVK8ZHjKdYvmK0r94+y79v7dq1GThwIBMnTtTdrkUkx1Kz6TqRkZEEBwezZs0aunfvzpQpUyhatKjTsdzq5MmTaY2l9evXp81cypcvH40aNeKdd96hWbNmNGzYkAIFCjicVkRERDIidTh43dJ1HU4i7qSdTbdvzZo1FC1alCo1q7Dk6yUMqD8AX6+s2bV//PhxwsLC6NatG127dqVr165Z8n1ERNxFzaZ0Vq5cSXBwMDExMUybNo3+/ftjjHE6VpZKSEhg165dbNmyhS1btrB582ZOnjwJQJEiRXjggQfo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", "text/plain": [ "
" ] @@ -317,7 +317,7 @@ } ], "source": [ - "params = PcSaftParameters.from_json(['water', '1-butanol'], '../../parameters/pcsaft/gross2002.json')\n", + "params = Parameters.from_json(['water', '1-butanol'], '../../parameters/pcsaft/gross2002.json')\n", "\n", "\n", "saft = EquationOfState.pcsaft(params)\n", @@ -349,6 +349,61 @@ "ax[2].set_xlabel('$x_1$')\n", "ax[2].set_ylabel('$y_1$');" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Binary interaction parameters" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "f, ax = plt.subplots(1,3,figsize=(20,5))\n", + "\n", + "for binary_path,ls in zip([None, \"../../parameters/pcsaft/rehner2023_binary.json\"], [':', '-']):\n", + " params = Parameters.from_json([\"2-butanone\", \"ethanol\"], \"../../parameters/pcsaft/esper2023.json\", binary_path)\n", + " eos = EquationOfState.pcsaft(params)\n", + " dia_p = PhaseDiagram.binary_vle(eos, 300*si.KELVIN)\n", + " dia_t = PhaseDiagram.binary_vle(eos, 1.013*si.BAR)\n", + "\n", + " ax[0].plot(dia_p.liquid.molefracs[:,0], dia_p.liquid.pressure/si.BAR, 'k', ls=ls)\n", + " ax[0].plot(dia_p.vapor.molefracs[:,0], dia_p.vapor.pressure/si.BAR, 'k', ls=ls)\n", + " ax[0].set_xlim(0,1)\n", + " ax[0].set_xlabel('$x_1,y_1$')\n", + " ax[0].set_ylabel('$p$ / bar')\n", + "\n", + " ax[1].plot(dia_t.liquid.molefracs[:,0], dia_t.liquid.temperature/si.KELVIN, 'g', ls=ls)\n", + " ax[1].plot(dia_t.vapor.molefracs[:,0], dia_t.vapor.temperature/si.KELVIN, 'g', ls=ls)\n", + " ax[1].set_xlim(0,1)\n", + " ax[1].set_xlabel('$x_1,y_1$')\n", + " ax[1].set_ylabel('$T$ / K')\n", + "\n", + " ax[2].plot([0,1], [0,1], '--k')\n", + " ax[2].plot(dia_t.liquid.molefracs[:,0], dia_t.vapor.molefracs[:,0], 'g', ls=ls)\n", + " ax[2].plot(dia_p.liquid.molefracs[:,0], dia_p.vapor.molefracs[:,0], 'k', ls=ls)\n", + " ax[2].set_xlim(0,1)\n", + " ax[2].set_ylim(0,1)\n", + " ax[2].set_xlabel('$x_1$')\n", + " ax[2].set_ylabel('$y_1$');" + ] } ], "metadata": { diff --git a/feos-core/Cargo.toml b/feos-core/Cargo.toml index ed83b75bb..7defcf2f3 100644 --- a/feos-core/Cargo.toml +++ b/feos-core/Cargo.toml @@ -33,8 +33,8 @@ nalgebra = "0.33" num-traits = "0.2" thiserror = "2.0" serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" -indexmap = "2.0" +serde_json = { version = "1.0", features = ["preserve_order"] } +indexmap = { version = "2.0", features = ["serde"] } conv = "0.3" numpy = { version = "0.23", optional = true } pyo3 = { version = "0.23", features = ["multiple-pymethods"], optional = true } @@ -42,8 +42,18 @@ rayon = { version = "1.5", optional = true } typenum = "1.16" approx = "0.5" regex = "1.9" +pythonize = { version = "0.23", optional = true } +itertools = { version = "0.14", optional = true } [features] default = [] rayon = ["dep:rayon", "ndarray/rayon"] -python = ["pyo3", "numpy", "quantity/python", "num-dual/python_macro", "rayon"] +python = [ + "pyo3", + "numpy", + "pythonize", + "itertools", + "quantity/python", + "num-dual/python_macro", + "rayon", +] diff --git a/feos-core/src/parameter/chemical_record.rs b/feos-core/src/parameter/chemical_record.rs index 900a9ee87..4e2247d87 100644 --- a/feos-core/src/parameter/chemical_record.rs +++ b/feos-core/src/parameter/chemical_record.rs @@ -21,6 +21,7 @@ struct ChemicalRecordJSON { #[derive(Deserialize, Serialize, Debug, Clone)] #[serde(from = "ChemicalRecordJSON")] #[serde(into = "ChemicalRecordJSON")] +#[cfg_attr(feature = "python", pyo3::pyclass(get_all, set_all))] pub struct ChemicalRecord { pub identifier: Identifier, pub segments: Vec, diff --git a/feos-core/src/parameter/identifier.rs b/feos-core/src/parameter/identifier.rs index fbb56c500..374d4ffd8 100644 --- a/feos-core/src/parameter/identifier.rs +++ b/feos-core/src/parameter/identifier.rs @@ -1,4 +1,5 @@ use serde::{Deserialize, Serialize}; +use std::fmt; use std::hash::{Hash, Hasher}; /// Possible variants to identify a substance. @@ -13,7 +14,22 @@ pub enum IdentifierOption { Formula, } +impl fmt::Display for IdentifierOption { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let str = match self { + IdentifierOption::Cas => "CAS", + IdentifierOption::Name => "name", + IdentifierOption::IupacName => "IUPAC name", + IdentifierOption::Smiles => "SMILES", + IdentifierOption::Inchi => "InChI", + IdentifierOption::Formula => "formula", + }; + write!(f, "{}", str) + } +} + /// A collection of identifiers for a chemical structure or substance. +#[cfg_attr(feature = "python", pyo3::pyclass(get_all, set_all))] #[derive(Serialize, Deserialize, Debug, Clone, Default)] pub struct Identifier { /// CAS number @@ -75,16 +91,28 @@ impl Identifier { } } - pub fn as_string(&self, option: IdentifierOption) -> Option { + pub fn as_str(&self, option: IdentifierOption) -> Option<&str> { match option { - IdentifierOption::Cas => self.cas.clone(), - IdentifierOption::Name => self.name.clone(), - IdentifierOption::IupacName => self.iupac_name.clone(), - IdentifierOption::Smiles => self.smiles.clone(), - IdentifierOption::Inchi => self.inchi.clone(), - IdentifierOption::Formula => self.formula.clone(), + IdentifierOption::Cas => self.cas.as_deref(), + IdentifierOption::Name => self.name.as_deref(), + IdentifierOption::IupacName => self.iupac_name.as_deref(), + IdentifierOption::Smiles => self.smiles.as_deref(), + IdentifierOption::Inchi => self.inchi.as_deref(), + IdentifierOption::Formula => self.formula.as_deref(), } } + + // returns the first available identifier in a somewhat arbitrary + // prioritization. Used for readable outputs. + pub fn as_readable_str(&self) -> Option<&str> { + self.name + .as_deref() + .or(self.iupac_name.as_deref()) + .or(self.smiles.as_deref()) + .or(self.cas.as_deref()) + .or(self.inchi.as_deref()) + .or(self.formula.as_deref()) + } } impl std::fmt::Display for Identifier { diff --git a/feos-core/src/parameter/mod.rs b/feos-core/src/parameter/mod.rs index f6920e01a..4c85acbfb 100644 --- a/feos-core/src/parameter/mod.rs +++ b/feos-core/src/parameter/mod.rs @@ -21,7 +21,7 @@ mod segment; pub use chemical_record::{ChemicalRecord, SegmentCount}; pub use identifier::{Identifier, IdentifierOption}; pub use model_record::{BinaryRecord, FromSegments, FromSegmentsBinary, PureRecord}; -pub use segment::SegmentRecord; +pub use segment::{BinarySegmentRecord, SegmentRecord}; /// Constructor methods for parameters. /// @@ -32,8 +32,8 @@ pub trait Parameter where Self: Sized, { - type Pure: Clone + DeserializeOwned; - type Binary: Clone + DeserializeOwned + Default; + type Pure: Clone + DeserializeOwned + Serialize; + type Binary: Clone + DeserializeOwned + Serialize + Default; /// Creates parameters from records for pure substances and possibly binary parameters. fn from_records( @@ -85,7 +85,7 @@ where #[allow(clippy::expect_fun_call)] fn binary_matrix_from_records( pure_records: &[PureRecord], - binary_records: &[BinaryRecord], + binary_records: &[BinaryRecord], identifier_option: IdentifierOption, ) -> Option> { if binary_records.is_empty() { @@ -93,12 +93,12 @@ where } // Build Hashmap (id, id) -> BinaryRecord - let binary_map: HashMap<(String, String), Self::Binary> = { + let binary_map: HashMap<_, _> = { binary_records .iter() .filter_map(|br| { - let id1 = br.id1.as_string(identifier_option); - let id2 = br.id2.as_string(identifier_option); + let id1 = br.id1.as_str(identifier_option); + let id2 = br.id2.as_str(identifier_option); id1.and_then(|id1| id2.map(|id2| ((id1, id2), br.model_record.clone()))) }) .collect() @@ -107,20 +107,20 @@ where Some(Array2::from_shape_fn([n, n], |(i, j)| { let id1 = pure_records[i] .identifier - .as_string(identifier_option) + .as_str(identifier_option) .expect(&format!( "No identifier for given identifier_option for pure record {}.", i )); let id2 = pure_records[j] .identifier - .as_string(identifier_option) + .as_str(identifier_option) .expect(&format!( "No identifier for given identifier_option for pure record {}.", j )); binary_map - .get(&(id1.clone(), id2.clone())) + .get(&(id1, id2)) .or_else(|| binary_map.get(&(id2, id1))) .cloned() .unwrap_or_default() @@ -140,6 +140,27 @@ where Self::from_multiple_json(&[(substances, file_pure)], file_binary, identifier_option) } + /// Creates a json string from pure and possibly binary records. + fn to_json_str(&self, pretty: bool) -> Result<(String, Option), ParameterError> { + let (pr, br) = self.records(); + + let pr_json = if pretty { + serde_json::to_string_pretty(pr) + } else { + serde_json::to_string(pr) + }?; + let br_json = if let Some(br) = br { + Some(if pretty { + serde_json::to_string_pretty(br) + } else { + serde_json::to_string(br) + }?) + } else { + None + }; + Ok((pr_json, br_json)) + } + /// Creates parameters from substance information stored in multiple json files. fn from_multiple_json

( input: &[(Vec<&str>, P)], @@ -198,7 +219,7 @@ where fn from_segments( chemical_records: Vec, segment_records: Vec>, - binary_segment_records: Option>>, + binary_segment_records: Option>, ) -> Result where Self::Pure: FromSegments, @@ -272,10 +293,7 @@ where Self::Pure: FromSegments, Self::Binary: FromSegmentsBinary, { - let queried: IndexSet = substances - .iter() - .map(|identifier| identifier.to_string()) - .collect(); + let queried: IndexSet<_> = substances.iter().copied().collect(); let file = File::open(file_pure)?; let reader = BufReader::new(file); @@ -285,26 +303,27 @@ where .filter_map(|record| { record .identifier - .as_string(identifier_option) + .as_str(identifier_option) + .map(|i| i.to_owned()) .map(|i| (i, record)) }) .collect(); // Compare queried components and available components - let available: IndexSet = record_map + let available: IndexSet<_> = record_map .keys() - .map(|identifier| identifier.to_string()) + .map(|identifier| identifier as &str) .collect(); if !queried.is_subset(&available) { - let missing: Vec = queried.difference(&available).cloned().collect(); + let missing: Vec<_> = queried.difference(&available).cloned().collect(); let msg = format!("{:?}", missing); return Err(ParameterError::ComponentsNotFound(msg)); }; // collect all pure records that were queried let chemical_records: Vec<_> = queried - .iter() - .filter_map(|identifier| record_map.remove(&identifier.clone())) + .into_iter() + .filter_map(|identifier| record_map.remove(identifier)) .collect(); // Read segment records @@ -315,7 +334,7 @@ where let binary_records = file_binary .map(|file_binary| { let reader = BufReader::new(File::open(file_binary)?); - let binary_records: Result>, ParameterError> = + let binary_records: Result, ParameterError> = Ok(serde_json::from_reader(reader)?); binary_records }) @@ -380,13 +399,12 @@ impl fmt::Display for NoBinaryModelRecord { pub trait ParameterHetero: Sized { type Chemical: Clone; type Pure: Clone + DeserializeOwned; - type Binary: Clone + DeserializeOwned; /// Creates parameters from the molecular structure and segment information. fn from_segments>( chemical_records: Vec, segment_records: Vec>, - binary_segment_records: Option>>, + binary_segment_records: Option>, ) -> Result; /// Return the original records that were used to construct the parameters. @@ -396,7 +414,7 @@ pub trait ParameterHetero: Sized { ) -> ( &[Self::Chemical], &[SegmentRecord], - &Option>>, + &Option>, ); /// Creates parameters from segment information stored in json files. @@ -411,9 +429,9 @@ pub trait ParameterHetero: Sized { P: AsRef, ChemicalRecord: Into, { - let queried: IndexSet = substances + let queried: IndexSet<_> = substances .iter() - .map(|identifier| identifier.to_string()) + .map(|identifier| identifier as &str) .collect(); let reader = BufReader::new(File::open(file_pure)?); @@ -423,25 +441,26 @@ pub trait ParameterHetero: Sized { .filter_map(|record| { record .identifier - .as_string(identifier_option) + .as_str(identifier_option) + .map(|i| i.to_owned()) .map(|i| (i, record)) }) .collect(); // Compare queried components and available components - let available: IndexSet = record_map + let available: IndexSet<_> = record_map .keys() - .map(|identifier| identifier.to_string()) + .map(|identifier| identifier as &str) .collect(); if !queried.is_subset(&available) { - let missing: Vec = queried.difference(&available).cloned().collect(); + let missing: Vec<_> = queried.difference(&available).cloned().collect(); return Err(ParameterError::ComponentsNotFound(format!("{:?}", missing))); }; // Collect all pure records that were queried let chemical_records: Vec<_> = queried - .iter() - .filter_map(|identifier| record_map.shift_remove(&identifier.clone())) + .into_iter() + .filter_map(|identifier| record_map.shift_remove(identifier)) .collect(); // Read segment records @@ -452,10 +471,8 @@ pub trait ParameterHetero: Sized { let binary_records = file_binary .map(|file_binary| { let reader = BufReader::new(File::open(file_binary)?); - let binary_records: Result< - Vec>, - ParameterError, - > = Ok(serde_json::from_reader(reader)?); + let binary_records: Result, ParameterError> = + Ok(serde_json::from_reader(reader)?); binary_records }) .transpose()?; @@ -482,6 +499,8 @@ pub trait ParameterHetero: Sized { /// Error type for incomplete parameter information and IO problems. #[derive(Error, Debug)] pub enum ParameterError { + #[error("{0}")] + Error(String), #[error(transparent)] FileIO(#[from] io::Error), #[error(transparent)] diff --git a/feos-core/src/parameter/model_record.rs b/feos-core/src/parameter/model_record.rs index 4837a35b6..a827dfa5b 100644 --- a/feos-core/src/parameter/model_record.rs +++ b/feos-core/src/parameter/model_record.rs @@ -76,8 +76,8 @@ impl PureRecord { // build map, draining list of queried substances in the process for record in file_records { - if let Some(id) = record.identifier.as_string(identifier_option) { - queried.take(&id).map(|id| records.insert(id, record)); + if let Some(id) = record.identifier.as_str(identifier_option) { + queried.take(id).map(|id| records.insert(id, record)); } // all parameters parsed if queried.is_empty() { @@ -127,21 +127,20 @@ pub trait FromSegmentsBinary: Clone { fn from_segments_binary(segments: &[(f64, T, T)]) -> Result; } -/// A collection of parameters that model interactions between two -/// substances or segments. +/// A collection of parameters that model interactions between two substances. #[derive(Serialize, Deserialize, Debug, Clone)] -pub struct BinaryRecord { +pub struct BinaryRecord { /// Identifier of the first component - pub id1: I, + pub id1: Identifier, /// Identifier of the second component - pub id2: I, + pub id2: Identifier, /// Binary interaction parameter(s) pub model_record: B, } -impl BinaryRecord { +impl BinaryRecord { /// Crates a new `BinaryRecord`. - pub fn new(id1: I, id2: I, model_record: B) -> Self { + pub fn new(id1: Identifier, id2: Identifier, model_record: B) -> Self { Self { id1, id2, @@ -152,18 +151,13 @@ impl BinaryRecord { /// Read a list of `BinaryRecord`s from a JSON file. pub fn from_json>(file: P) -> Result, ParameterError> where - I: DeserializeOwned, B: DeserializeOwned, { Ok(serde_json::from_reader(BufReader::new(File::open(file)?))?) } } -impl std::fmt::Display for BinaryRecord -where - I: std::fmt::Display, - B: std::fmt::Display, -{ +impl std::fmt::Display for BinaryRecord { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "BinaryRecord(")?; write!(f, "\n\tid1={},", self.id1)?; diff --git a/feos-core/src/parameter/segment.rs b/feos-core/src/parameter/segment.rs index f7718c054..445ff4b54 100644 --- a/feos-core/src/parameter/segment.rs +++ b/feos-core/src/parameter/segment.rs @@ -54,3 +54,41 @@ impl std::fmt::Display for SegmentRecord { write!(f, "\n)") } } + +/// A collection of parameters that model interactions between two segments. +#[derive(Serialize, Deserialize, Debug, Clone)] +#[cfg_attr(feature = "python", pyo3::pyclass)] +pub struct BinarySegmentRecord { + /// Identifier of the first component + pub id1: String, + /// Identifier of the second component + pub id2: String, + /// Binary interaction parameter(s) + pub model_record: f64, +} + +impl BinarySegmentRecord { + /// Crates a new `BinaryRecord`. + pub fn new(id1: String, id2: String, model_record: f64) -> Self { + Self { + id1, + id2, + model_record, + } + } + + /// Read a list of `BinaryRecord`s from a JSON file. + pub fn from_json>(file: P) -> Result, ParameterError> { + Ok(serde_json::from_reader(BufReader::new(File::open(file)?))?) + } +} + +impl std::fmt::Display for BinarySegmentRecord { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "BinaryRecord(")?; + write!(f, "\n\tid1={},", self.id1)?; + write!(f, "\n\tid2={},", self.id2)?; + write!(f, "\n\tmodel_record={},", self.model_record)?; + write!(f, "\n)") + } +} diff --git a/feos-core/src/python/cubic.rs b/feos-core/src/python/cubic.rs deleted file mode 100644 index 132d9d630..000000000 --- a/feos-core/src/python/cubic.rs +++ /dev/null @@ -1,52 +0,0 @@ -use crate::cubic::{PengRobinsonParameters, PengRobinsonRecord}; -use crate::parameter::{ - BinaryRecord, Identifier, IdentifierOption, Parameter, ParameterError, PureRecord, -}; -use crate::python::parameter::PyIdentifier; -use crate::*; -use numpy::{PyArray2, PyReadonlyArray2, ToPyArray}; -use pyo3::exceptions::PyTypeError; -use pyo3::prelude::*; -use std::convert::{TryFrom, TryInto}; -use std::sync::Arc; - -/// A pure substance parameter for the Peng-Robinson equation of state. -#[pyclass(name = "PengRobinsonRecord")] -#[derive(Clone)] -pub struct PyPengRobinsonRecord(PengRobinsonRecord); - -#[pymethods] -impl PyPengRobinsonRecord { - #[new] - fn new(tc: f64, pc: f64, acentric_factor: f64) -> Self { - Self(PengRobinsonRecord::new(tc, pc, acentric_factor)) - } - - fn __repr__(&self) -> PyResult { - Ok(self.0.to_string()) - } -} - -impl_json_handling!(PyPengRobinsonRecord); - -impl_pure_record!(PengRobinsonRecord, PyPengRobinsonRecord); - -impl_binary_record!(); - -#[pyclass(name = "PengRobinsonParameters")] -#[derive(Clone)] -pub struct PyPengRobinsonParameters(pub Arc); - -impl_parameter!( - PengRobinsonParameters, - PyPengRobinsonParameters, - PyPengRobinsonRecord, - f64 -); - -#[pymethods] -impl PyPengRobinsonParameters { - fn __repr__(&self) -> PyResult { - Ok(self.0.to_string()) - } -} diff --git a/feos-core/src/python/mod.rs b/feos-core/src/python/mod.rs index b790f0403..e2b6d5a39 100644 --- a/feos-core/src/python/mod.rs +++ b/feos-core/src/python/mod.rs @@ -2,7 +2,6 @@ use crate::EosError; use pyo3::exceptions::PyRuntimeError; use pyo3::prelude::*; -pub mod cubic; mod equation_of_state; pub mod parameter; mod phase_equilibria; diff --git a/feos-core/src/python/parameter/fragmentation.rs b/feos-core/src/python/parameter/fragmentation.rs index bdda2fd00..28ab3e815 100644 --- a/feos-core/src/python/parameter/fragmentation.rs +++ b/feos-core/src/python/parameter/fragmentation.rs @@ -1,4 +1,4 @@ -use super::{ParameterError, PyChemicalRecord, PyIdentifier}; +use super::ParameterError; use crate::parameter::{ChemicalRecord, Identifier}; use pyo3::exceptions::PyValueError; use pyo3::prelude::*; @@ -6,55 +6,37 @@ use serde::{Deserialize, Serialize}; use std::collections::{HashMap, HashSet}; use std::fs::File; use std::io::BufReader; -use std::path::Path; #[derive(Clone, Serialize, Deserialize)] -pub struct SmartsRecord { +#[pyclass(name = "SmartsRecord")] +pub struct PySmartsRecord { group: String, smarts: String, #[serde(skip_serializing_if = "Option::is_none")] max: Option, } -impl SmartsRecord { - fn new(group: String, smarts: String, max: Option) -> Self { - Self { group, smarts, max } - } - - /// Read a list of `SmartsRecord`s from a JSON file. - pub fn from_json>(file: P) -> Result, ParameterError> { - Ok(serde_json::from_reader(BufReader::new(File::open(file)?))?) - } -} - -impl std::fmt::Display for SmartsRecord { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!( - f, - "SmartsRecord(group={}, smarts={}", - self.group, self.smarts - )?; - if let Some(max) = self.max { - write!(f, ", max={}", max)?; - } - write!(f, ")") - } -} - -#[pyclass(name = "SmartsRecord")] -#[derive(Clone)] -pub struct PySmartsRecord(pub SmartsRecord); - #[pymethods] impl PySmartsRecord { #[new] #[pyo3(text_signature = "(group, smarts, max=None)", signature = (group, smarts, max=None))] fn new(group: String, smarts: String, max: Option) -> Self { - Self(SmartsRecord::new(group, smarts, max)) + Self { group, smarts, max } } fn __repr__(&self) -> PyResult { - Ok(self.0.to_string()) + Ok(self.to_string()) + } + + /// Creates record from json string. + #[staticmethod] + fn from_json_str(json: &str) -> Result { + Ok(serde_json::from_str(json)?) + } + + /// Creates a json string from record. + fn to_json_str(&self) -> Result { + Ok(serde_json::to_string(&self)?) } /// Read a list of `SmartsRecord`s from a JSON file. @@ -70,19 +52,26 @@ impl PySmartsRecord { #[staticmethod] #[pyo3(text_signature = "(path)")] pub fn from_json(path: &str) -> Result, ParameterError> { - Ok(SmartsRecord::from_json(path)? - .into_iter() - .map(Self) - .collect()) + Ok(serde_json::from_reader(BufReader::new(File::open(path)?))?) } } -// This macro call is the only reason why SmartsRecord is not implemented as one -// single Python class. -impl_json_handling!(PySmartsRecord); +impl std::fmt::Display for PySmartsRecord { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "SmartsRecord(group={}, smarts={}", + self.group, self.smarts + )?; + if let Some(max) = self.max { + write!(f, ", max={}", max)?; + } + write!(f, ")") + } +} #[pymethods] -impl PyChemicalRecord { +impl ChemicalRecord { #[staticmethod] pub fn from_smiles( identifier: &Bound<'_, PyAny>, @@ -91,8 +80,8 @@ impl PyChemicalRecord { let py = identifier.py(); let identifier = if let Ok(smiles) = identifier.extract::() { Identifier::new(None, None, None, Some(&smiles), None, None) - } else if let Ok(identifier) = identifier.extract::() { - identifier.0 + } else if let Ok(identifier) = identifier.extract::() { + identifier } else { return Err(PyErr::new::( "`identifier` must be a SMILES code or `Identifier` object.".to_string(), @@ -104,7 +93,7 @@ impl PyChemicalRecord { .expect("Missing SMILES in `Identifier`"); let (segments, bonds) = fragment_molecule(py, smiles, smarts)?; let segments = segments.into_iter().map(|s| s.to_owned()).collect(); - Ok(Self(ChemicalRecord::new(identifier, segments, Some(bonds)))) + Ok(Self::new(identifier, segments, Some(bonds))) } } @@ -121,7 +110,7 @@ fn fragment_molecule( let mut matches: HashMap<_, _> = smarts .into_iter() .map(|s| { - let m = chem.call_method1("MolFromSmarts", (s.0.smarts,))?; + let m = chem.call_method1("MolFromSmarts", (s.smarts,))?; let matches = mol .call_method1("GetSubstructMatches", (m,))? .extract::>>()?; @@ -132,12 +121,12 @@ fn fragment_molecule( // Instead of just throwing an error at this point, just try to continue with the first max // occurrences. For some cases (the ethers) this just means that the symetry of C-O-C is broken. // If a necessary segment is eliminated the error will be thrown later. - if let Some(max) = s.0.max { + if let Some(max) = s.max { if matches.len() > max { matches = matches[..max].to_vec(); } } - Ok((s.0.group, matches)) + Ok((s.group, matches)) }) .collect::>()?; diff --git a/feos-core/src/python/parameter/mod.rs b/feos-core/src/python/parameter/mod.rs index fbe4f2960..f6c3b6839 100644 --- a/feos-core/src/python/parameter/mod.rs +++ b/feos-core/src/python/parameter/mod.rs @@ -1,9 +1,20 @@ -use crate::impl_json_handling; -use crate::parameter::{ - BinaryRecord, ChemicalRecord, Identifier, NoBinaryModelRecord, ParameterError, -}; -use pyo3::exceptions::{PyRuntimeError, PyTypeError}; +use crate::parameter::*; +use indexmap::{IndexMap, IndexSet}; +use itertools::Itertools; +use ndarray::Array2; +use pyo3::exceptions::PyRuntimeError; use pyo3::prelude::*; +use pyo3::pybacked::PyBackedStr; +use pyo3::types::PyDict; +use pythonize::{depythonize, pythonize, PythonizeError}; +use serde::{Deserialize, Serialize}; +mod fragmentation; +pub use fragmentation::PySmartsRecord; +use serde_json::Value; +use std::collections::{HashMap, HashSet}; +use std::fmt::Write; +use std::fs::File; +use std::io::BufReader; impl From for PyErr { fn from(e: ParameterError) -> PyErr { @@ -11,38 +22,14 @@ impl From for PyErr { } } -/// Create an identifier for a pure substance. -/// -/// Parameters -/// ---------- -/// cas : str, optional -/// CAS number. -/// name : str, optional -/// name -/// iupac_name : str, optional -/// Iupac name. -/// smiles : str, optional -/// Canonical SMILES -/// inchi : str, optional -/// Inchi number -/// formula : str, optional -/// Molecular formula. -/// -/// Returns -/// ------- -/// Identifier -#[pyclass(name = "Identifier")] -#[derive(Clone)] -pub struct PyIdentifier(pub Identifier); - #[pymethods] -impl PyIdentifier { +impl Identifier { #[new] #[pyo3( text_signature = "(cas=None, name=None, iupac_name=None, smiles=None, inchi=None, formula=None)", signature = (cas=None, name=None, iupac_name=None, smiles=None, inchi=None, formula=None) )] - fn new( + fn py_new( cas: Option<&str>, name: Option<&str>, iupac_name: Option<&str>, @@ -50,864 +37,996 @@ impl PyIdentifier { inchi: Option<&str>, formula: Option<&str>, ) -> Self { - Self(Identifier::new( - cas, name, iupac_name, smiles, inchi, formula, - )) + Self::new(cas, name, iupac_name, smiles, inchi, formula) } - #[getter] - fn get_cas(&self) -> Option { - self.0.cas.clone() + fn __repr__(&self) -> PyResult { + Ok(self.to_string()) } - #[setter] - fn set_cas(&mut self, cas: &str) { - self.0.cas = Some(cas.to_string()); + /// Creates record from json string. + #[staticmethod] + fn from_json_str(json: &str) -> Result { + Ok(serde_json::from_str(json)?) } - #[getter] - fn get_name(&self) -> Option { - self.0.name.clone() + /// Creates a json string from record. + fn to_json_str(&self) -> Result { + Ok(serde_json::to_string(&self)?) } +} - #[setter] - fn set_name(&mut self, name: &str) { - self.0.name = Some(name.to_string()); +#[pymethods] +impl ChemicalRecord { + #[new] + #[pyo3(text_signature = "(identifier, segments, bonds=None)", signature = (identifier, segments, bonds=None))] + fn py_new( + identifier: Identifier, + segments: Vec, + bonds: Option>, + ) -> Self { + Self::new(identifier, segments, bonds) } - #[getter] - fn get_iupac_name(&self) -> Option { - self.0.iupac_name.clone() + fn __repr__(&self) -> PyResult { + Ok(self.to_string()) } - #[setter] - fn set_iupac_name(&mut self, iupac_name: &str) { - self.0.iupac_name = Some(iupac_name.to_string()); + /// Creates record from json string. + #[staticmethod] + fn from_json_str(json: &str) -> Result { + Ok(serde_json::from_str(json)?) } - #[getter] - fn get_smiles(&self) -> Option { - self.0.smiles.clone() + /// Creates a json string from record. + fn to_json_str(&self) -> Result { + Ok(serde_json::to_string(&self)?) } +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +#[pyclass(name = "BinaryRecord")] +pub struct PyBinaryRecord { + #[pyo3(get)] + id1: Identifier, + #[pyo3(get)] + id2: Identifier, + model_record: Value, +} - #[setter] - fn set_smiles(&mut self, smiles: &str) { - self.0.smiles = Some(smiles.to_string()); +impl TryInto> for PyBinaryRecord +where + for<'de> M: Deserialize<'de>, +{ + type Error = ParameterError; + fn try_into(self) -> Result, ParameterError> { + Ok(serde_json::from_value(serde_json::to_value(self)?)?) + } +} + +#[pymethods] +impl PyBinaryRecord { + #[new] + #[pyo3(signature = (id1, id2, **parameters))] + fn new( + id1: Identifier, + id2: Identifier, + parameters: Option<&Bound<'_, PyDict>>, + ) -> Result { + if parameters.is_none() { + return Err(ParameterError::Error( + "No model parameters provided for BinaryRecord".to_string(), + )); + } + let model_record = + depythonize(parameters.unwrap()).map_err(|e| ParameterError::Error(e.to_string()))?; + Ok(Self { + id1, + id2, + model_record, + }) } #[getter] - fn get_inchi(&self) -> Option { - self.0.inchi.clone() + fn get_model_record<'py>(&self, py: Python<'py>) -> Result, ParameterError> { + pythonize(py, &self.model_record) + .map_err(|e| ParameterError::Error(e.to_string())) + .and_then(|d| { + d.downcast_into::() + .map_err(|e| ParameterError::Error(e.to_string())) + }) } - #[setter] - fn set_inchi(&mut self, inchi: &str) { - self.0.inchi = Some(inchi.to_string()); + pub fn to_dict<'py>(&self, py: Python<'py>) -> Result, ParameterError> { + pythonize(py, &self) + .map_err(|e| ParameterError::Error(e.to_string())) + .and_then(|d| { + d.downcast_into::() + .map_err(|e| ParameterError::Error(e.to_string())) + }) } - #[getter] - fn get_formula(&self) -> Option { - self.0.formula.clone() + #[staticmethod] + pub fn from_json_str(s: &str) -> Result { + Ok(serde_json::from_str(s)?) } - #[setter] - fn set_formula(&mut self, formula: &str) { - self.0.formula = Some(formula.to_string()); + pub fn to_json_str(&self) -> Result { + Ok(serde_json::to_string(&self)?) } - fn __repr__(&self) -> PyResult { - Ok(self.0.to_string()) + fn __repr__(&self) -> Result { + let params: Result = Python::with_gil(|py| { + Ok(self + .get_model_record(py)? + .iter() + .map(|(p, v)| format!(", {p}={v}")) + .collect::>() + .join("")) + }); + Ok(format!( + "BinaryRecord(id1={}, id2={}{})", + self.id1, self.id2, params? + )) } } -impl_json_handling!(PyIdentifier); - -/// Create a chemical record for a pure substance. -/// -/// Parameters -/// ---------- -/// identifier : Identifier -/// The identifier of the pure component. -/// segments : [str] -/// List of segments, that the molecule consists of. -/// bonds : [[int, int]], optional -/// List of bonds with the indices starting at 0 and -/// referring to the list of segments passed as first -/// argument. If no bonds are specified, the molecule -/// is assumed to be linear. -/// -/// Returns -/// ------- -/// ChemicalRecord -#[pyclass(name = "ChemicalRecord")] -#[derive(Clone)] -pub struct PyChemicalRecord(pub ChemicalRecord); - #[pymethods] -impl PyChemicalRecord { +impl BinarySegmentRecord { #[new] - #[pyo3(text_signature = "(identifier, segments, bonds=None)", signature = (identifier, segments, bonds=None))] - fn new( - identifier: PyIdentifier, - segments: Vec, - bonds: Option>, - ) -> Self { - Self(ChemicalRecord::new(identifier.0, segments, bonds)) + fn py_new(id1: String, id2: String, model_record: f64) -> PyResult { + Ok(Self::new(id1, id2, model_record)) } - #[getter] - fn get_identifier(&self) -> PyIdentifier { - PyIdentifier(self.0.identifier.clone()) + fn __repr__(&self) -> PyResult { + Ok(self.to_string()) } - #[getter] - fn get_segments(&self) -> Vec { - self.0.segments.clone() + /// Creates record from json string. + #[staticmethod] + fn from_json_str(json: &str) -> Result { + Ok(serde_json::from_str(json)?) } - #[getter] - fn get_bonds(&self) -> Vec<[usize; 2]> { - self.0.bonds.clone() + /// Creates a json string from record. + fn to_json_str(&self) -> Result { + Ok(serde_json::to_string(&self)?) } +} - fn __repr__(&self) -> PyResult { - Ok(self.0.to_string()) +#[pyclass(name = "PureRecord")] +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct PyPureRecord { + #[pyo3(get)] + identifier: Identifier, + #[pyo3(get)] + #[serde(default)] + molarweight: f64, + model_record: Value, +} + +impl TryFrom<&PureRecord> for PyPureRecord +where + M: Serialize + Clone, +{ + type Error = ParameterError; + fn try_from(value: &PureRecord) -> Result { + Ok(serde_json::from_value(serde_json::to_value( + value.clone(), + )?)?) } } -impl_json_handling!(PyChemicalRecord); - -#[macro_export] -macro_rules! impl_binary_record { - () => { - #[pyclass(name = "BinaryModelRecord")] - #[derive(Clone)] - struct PyBinaryModelRecord(f64); - impl_binary_record!(f64, PyBinaryModelRecord); - }; - ($model_record:ident, $py_model_record:ident) => { - /// Create a record for a binary interaction parameter. - /// - /// Parameters - /// ---------- - /// id1 : Identifier - /// The identifier of the first component. - /// id2 : Identifier - /// The identifier of the second component. - /// model_record : float or BinaryModelRecord - /// The binary interaction parameter. - /// - /// Returns - /// ------- - /// BinaryRecord - #[pyclass(name = "BinaryRecord")] - #[derive(Clone)] - pub struct PyBinaryRecord(pub BinaryRecord); - - impl From<$py_model_record> for $model_record { - fn from(record: $py_model_record) -> Self { - record.0 - } +impl TryInto> for PyPureRecord +where + for<'de> M: Deserialize<'de>, +{ + type Error = ParameterError; + fn try_into(self) -> Result, ParameterError> { + Ok(serde_json::from_value(serde_json::to_value(self)?)?) + } +} + +impl PyPureRecord { + fn from_json( + substances: &[PyBackedStr], + file: &PyBackedStr, + identifier_option: IdentifierOption, + ) -> Result, ParameterError> { + // create list of substances + let mut queried: HashSet<_> = substances.iter().map(|s| s.to_string()).collect(); + // raise error on duplicate detection + if queried.len() != substances.len() { + return Err(ParameterError::IncompatibleParameters( + "A substance was defined more than once.".to_string(), + )); } - #[pymethods] - impl PyBinaryRecord { - #[new] - fn new( - id1: PyIdentifier, - id2: PyIdentifier, - model_record: &Bound<'_, PyAny>, - ) -> PyResult { - if let Ok(mr) = model_record.extract::() { - Ok(Self(BinaryRecord::new(id1.0, id2.0, mr.try_into()?))) - } else if let Ok(mr) = model_record.extract::<$py_model_record>() { - Ok(Self(BinaryRecord::new(id1.0, id2.0, mr.0))) - } else { - Err(PyErr::new::(format!( - "Could not parse model_record input!" - ))) - } - } + let reader = BufReader::new(File::open::<&str>(file.as_ref())?); + let file_records: Vec = serde_json::from_reader(reader)?; + let mut records: HashMap<_, _> = HashMap::with_capacity(substances.len()); - /// Read a list of `BinaryRecord`s from a JSON file. - /// - /// Parameters - /// ---------- - /// path : str - /// Path to file containing the binary records. - /// - /// Returns - /// ------- - /// [BinaryRecord] - #[staticmethod] - #[pyo3(text_signature = "(path)")] - fn from_json(path: &str) -> Result, ParameterError> { - Ok(BinaryRecord::from_json(path)? - .into_iter() - .map(Self) - .collect()) + // build map, draining list of queried substances in the process + for record in file_records { + if let Some(id) = record.identifier.as_str(identifier_option) { + queried.take(id).map(|id| records.insert(id, record)); } - - #[getter] - fn get_id1(&self) -> PyIdentifier { - PyIdentifier(self.0.id1.clone()) + // all parameters parsed + if queried.is_empty() { + break; } + } - #[setter] - fn set_id1(&mut self, id1: PyIdentifier) { - self.0.id1 = id1.0; - } + // report missing parameters + if !queried.is_empty() { + return Err(ParameterError::ComponentsNotFound(format!("{:?}", queried))); + }; - #[getter] - fn get_id2(&self) -> PyIdentifier { - PyIdentifier(self.0.id2.clone()) - } + // collect into vec in correct order + Ok(substances + .iter() + .map(|s| records.get(&s.to_string()).unwrap().clone()) + .collect()) + } +} - #[setter] - fn set_id2(&mut self, id2: PyIdentifier) { - self.0.id2 = id2.0; - } +#[pymethods] +impl PyPureRecord { + #[new] + #[pyo3(signature = (identifier, molarweight, **parameters))] + fn new( + identifier: Identifier, + molarweight: f64, + parameters: Option<&Bound<'_, PyDict>>, + ) -> Result { + if parameters.is_none() { + return Err(ParameterError::Error( + "No model parameters provided for PureRecord".to_string(), + )); + } + let model_record = + depythonize(parameters.unwrap()).map_err(|e| ParameterError::Error(e.to_string()))?; + Ok(Self { + identifier, + molarweight, + model_record, + }) + } - #[getter] - #[expect(irrefutable_let_patterns)] - fn get_model_record<'py>(&self, py: Python<'py>) -> PyResult> { - Ok(if let Ok(mr) = f64::try_from(self.0.model_record.clone()) { - pyo3::types::PyFloat::new(py, mr).into_any() - } else { - Bound::new(py, $py_model_record(self.0.model_record.clone()))?.into_any() - }) - } + #[getter] + fn get_model_record<'py>(&self, py: Python<'py>) -> Result, ParameterError> { + pythonize(py, &self.model_record) + .map_err(|e| ParameterError::Error(e.to_string())) + .and_then(|d| { + d.downcast_into::() + .map_err(|e| ParameterError::Error(e.to_string())) + }) + } - #[setter] - fn set_model_record(&mut self, model_record: &Bound<'_, PyAny>) -> PyResult<()> { - if let Ok(mr) = model_record.extract::() { - self.0.model_record = mr.try_into()?; - } else if let Ok(mr) = model_record.extract::<$py_model_record>() { - self.0.model_record = mr.0; - } else { - return Err(PyErr::new::(format!( - "Could not parse model_record input!" - ))); - } - Ok(()) - } + pub fn to_dict<'py>(&self, py: Python<'py>) -> Result, ParameterError> { + pythonize(py, &self) + .map_err(|e| ParameterError::Error(e.to_string())) + .and_then(|d| { + d.downcast_into::() + .map_err(|e| ParameterError::Error(e.to_string())) + }) + } - fn __repr__(&self) -> PyResult { - Ok(self.0.to_string()) - } - } + #[staticmethod] + pub fn from_json_str(s: &str) -> Result { + Ok(serde_json::from_str(s)?) + } - impl_json_handling!(PyBinaryRecord); - }; + pub fn to_json_str(&self) -> Result { + Ok(serde_json::to_string(&self)?) + } + + fn __repr__(&self) -> Result { + let params: Result = Python::with_gil(|py| { + Ok(self + .get_model_record(py)? + .iter() + .map(|(p, v)| format!(", {p}={v}")) + .collect::>() + .join("")) + }); + Ok(format!( + "PureRecord(identifier={}, molarweight={}{})", + self.identifier, self.molarweight, params? + )) + } } -#[pyclass(name = "NoBinaryModelRecord")] -#[derive(Clone)] -pub struct PyNoBinaryModelRecord(pub NoBinaryModelRecord); - -impl_binary_record!(NoBinaryModelRecord, PyNoBinaryModelRecord); - -/// Create a record for a binary segment interaction parameter. -/// -/// Parameters -/// ---------- -/// id1 : str -/// The identifier of the first segment. -/// id2 : str -/// The identifier of the second segment. -/// model_record : float -/// The binary segment interaction parameter. -/// -/// Returns -/// ------- -/// BinarySegmentRecord -#[pyclass(name = "BinarySegmentRecord")] -#[derive(Clone)] -pub struct PyBinarySegmentRecord(pub BinaryRecord); +#[derive(Debug, Serialize, Deserialize, Clone)] +#[pyclass(name = "SegmentRecord")] +pub struct PySegmentRecord { + #[pyo3(get)] + identifier: String, + #[pyo3(get)] + molarweight: f64, + model_record: Value, +} + +impl TryInto> for PySegmentRecord +where + for<'de> M: Deserialize<'de>, +{ + type Error = ParameterError; + fn try_into(self) -> Result, ParameterError> { + Ok(serde_json::from_value(serde_json::to_value(self)?)?) + } +} #[pymethods] -impl PyBinarySegmentRecord { +impl PySegmentRecord { #[new] - fn new(id1: String, id2: String, model_record: f64) -> PyResult { - Ok(Self(BinaryRecord::new(id1, id2, model_record))) + #[pyo3(signature = (identifier, molarweight, **parameters))] + fn new( + identifier: String, + molarweight: f64, + parameters: Option<&Bound<'_, PyDict>>, + ) -> PyResult { + if parameters.is_none() { + return Err(ParameterError::Error( + "No model parameters provided for SegmentRecord".to_string(), + ) + .into()); + } + let model_record = + depythonize(parameters.unwrap()).map_err(|e| ParameterError::Error(e.to_string()))?; + Ok(Self { + identifier, + molarweight, + model_record, + }) + } + + #[getter] + fn get_model_record<'py>(&self, py: Python<'py>) -> Result, ParameterError> { + pythonize(py, &self.model_record) + .map_err(|e| ParameterError::Error(e.to_string())) + .and_then(|d| { + d.downcast_into::() + .map_err(|e| ParameterError::Error(e.to_string())) + }) } - /// Read a list of `BinarySegmentRecord`s from a JSON file. + pub fn to_dict<'py>(&self, py: Python<'py>) -> Result, ParameterError> { + pythonize(py, &self) + .map_err(|e| ParameterError::Error(e.to_string())) + .and_then(|d| { + d.downcast_into::() + .map_err(|e| ParameterError::Error(e.to_string())) + }) + } + + #[staticmethod] + pub fn from_json_str(s: &str) -> Result { + Ok(serde_json::from_str(s)?) + } + + pub fn to_json_str(&self) -> Result { + Ok(serde_json::to_string(&self)?) + } + + fn __repr__(&self) -> Result { + let params: Result = Python::with_gil(|py| { + Ok(self + .get_model_record(py)? + .iter() + .map(|(p, v)| format!(", {p}={v}")) + .collect::>() + .join("")) + }); + Ok(format!( + "SegmentRecord(identifier={}, molarweight={}{})", + self.identifier, self.molarweight, params? + )) + } + + /// Read a list of `SegmentRecord`s from a JSON file. /// /// Parameters /// ---------- /// path : str - /// Path to file containing the binary records. + /// Path to file containing the segment records. /// /// Returns /// ------- - /// [BinarySegmentRecord] + /// [SegmentRecord] #[staticmethod] - #[pyo3(text_signature = "(path)")] pub fn from_json(path: &str) -> Result, ParameterError> { - Ok(BinaryRecord::from_json(path)? - .into_iter() - .map(Self) - .collect()) + Ok(serde_json::from_reader(BufReader::new(File::open(path)?))?) } +} - #[getter] - fn get_id1(&self) -> String { - self.0.id1.clone() - } +#[pyclass(name = "Parameters")] +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct PyParameters { + #[pyo3(get)] + pub pure_records: Vec, + pub binary_records: Vec<([usize; 2], Value)>, +} - #[setter] - fn set_id1(&mut self, id1: String) { - self.0.id1 = id1; +impl PyParameters { + pub fn try_convert(self) -> Result { + let n = self.pure_records.len(); + let pure_records = self + .pure_records + .into_iter() + .map(|r| r.try_into()) + .collect::>()?; + let binary_records = if self.binary_records.is_empty() { + None + } else { + let mut br = Array2::default((n, n)); + for ([i, j], r) in self.binary_records { + let r: P::Binary = serde_json::from_value(r)?; + br[[i, j]] = r.clone(); + br[[j, i]] = r; + } + Some(br) + }; + P::from_records(pure_records, binary_records) } +} - #[getter] - fn get_id2(&self) -> String { - self.0.id2.clone() - } +#[pymethods] +impl PyParameters { + /// Creates parameters from records. + /// + /// Parameters + /// ---------- + /// pure_records : List[PureRecord] + /// A list of pure component parameters. + /// binary_records : List[BinaryRecord], optional, defaults to [] + /// A list containing records for binary interactions. + /// identifier_option : IdentifierOption, optional, defaults to IdentifierOption.Name + /// Identifier that is used to search binary records. + #[staticmethod] + #[pyo3( + signature = (pure_records, binary_records=vec![], identifier_option=IdentifierOption::Name), + text_signature = "(pure_records, binary_records=[], identifier_option=IdentifierOption.Name)" + )] + fn from_records( + pure_records: Vec, + binary_records: Vec, + identifier_option: IdentifierOption, + ) -> Result { + // Build Hashmap (id, id) -> BinaryRecord + let binary_map: HashMap<_, _> = { + binary_records + .iter() + .filter_map(|br| { + let id1 = br.id1.as_str(identifier_option); + let id2 = br.id2.as_str(identifier_option); + id1.and_then(|id1| id2.map(|id2| ((id1, id2), br.model_record.clone()))) + }) + .collect() + }; - #[setter] - fn set_id2(&mut self, id2: String) { - self.0.id2 = id2; + // look up pure records in Hashmap + let binary_records = pure_records + .iter() + .enumerate() + .array_combinations() + .filter_map(|[(i1, p1), (i2, p2)]| { + let id1 = p1.identifier.as_str(identifier_option).unwrap_or_else(|| { + panic!( + "No {} for pure record {} ({}).", + identifier_option, i1, p1.identifier + ) + }); + let id2 = p2.identifier.as_str(identifier_option).unwrap_or_else(|| { + panic!( + "No {} for pure record {} ({}).", + identifier_option, i2, p2.identifier + ) + }); + binary_map + .get(&(id1, id2)) + .or_else(|| binary_map.get(&(id2, id1))) + .map(|br| ([i1, i2], br.clone())) + }) + .collect(); + + Ok(Self { + pure_records, + binary_records, + }) } - #[getter] - fn get_model_record(&self) -> f64 { - self.0.model_record + /// Creates parameters for a pure component from a pure record. + /// + /// Parameters + /// ---------- + /// pure_record : PureRecord + /// The pure component parameters. + #[staticmethod] + fn new_pure(pure_record: PyPureRecord) -> Self { + Self { + pure_records: vec![pure_record], + binary_records: vec![], + } } - #[setter] - fn set_model_record(&mut self, model_record: f64) { - self.0.model_record = model_record; + /// Creates parameters for a binary system from pure records and an optional + /// binary interaction parameter or binary interaction parameter record. + /// + /// Parameters + /// ---------- + /// pure_records : [PureRecord] + /// A list of pure component parameters. + /// binary_record : float or BinaryRecord, optional + /// The binary interaction parameter or binary interaction record. + #[staticmethod] + #[pyo3(text_signature = "(pure_records, binary_record=None)", signature = (pure_records, binary_record=None))] + fn new_binary(pure_records: Vec, binary_record: Option) -> Self { + let binary_records = binary_record + .into_iter() + .map(|r| ([0, 1], r.model_record)) + .collect(); + Self { + pure_records, + binary_records, + } } - fn __repr__(&self) -> PyResult { - Ok(self.0.to_string()) + /// Creates parameters from json files. + /// + /// Parameters + /// ---------- + /// substances : List[str] + /// The substances to search. + /// pure_path : str + /// Path to file containing pure substance parameters. + /// binary_path : str, optional + /// Path to file containing binary substance parameters. + /// identifier_option : IdentifierOption, optional, defaults to IdentifierOption.Name + /// Identifier that is used to search substance. + #[staticmethod] + #[pyo3( + signature = (substances, pure_path, binary_path=None, identifier_option=IdentifierOption::Name), + text_signature = "(substances, pure_path, binary_path=None, identifier_option)" + )] + fn from_json( + substances: Vec, + pure_path: PyBackedStr, + binary_path: Option, + identifier_option: IdentifierOption, + ) -> Result { + Self::from_multiple_json( + vec![(substances, pure_path)], + binary_path, + identifier_option, + ) } -} -impl_json_handling!(PyBinarySegmentRecord); - -#[macro_export] -macro_rules! impl_pure_record { - ($model_record:ident, $py_model_record:ident) => { - /// All information required to characterize a pure component. - /// - /// Parameters - /// ---------- - /// identifier : Identifier - /// The identifier of the pure component. - /// molarweight : float - /// The molar weight (in g/mol) of the pure component. - /// model_record : ModelRecord - /// The pure component model parameters. - /// - /// Returns - /// ------- - /// PureRecord - #[pyclass(name = "PureRecord")] - #[derive(Clone)] - pub struct PyPureRecord(pub PureRecord<$model_record>); - - #[pymethods] - impl PyPureRecord { - #[new] - #[pyo3(text_signature = "(identifier, molarweight, model_record)")] - fn new( - identifier: PyIdentifier, - molarweight: f64, - model_record: $py_model_record, - ) -> PyResult { - Ok(Self(PureRecord::new( - identifier.0, - molarweight, - model_record.0, - ))) - } - - #[getter] - fn get_identifier(&self) -> PyIdentifier { - PyIdentifier(self.0.identifier.clone()) - } - - #[setter] - fn set_identifier(&mut self, identifier: PyIdentifier) { - self.0.identifier = identifier.0; - } - - #[getter] - fn get_molarweight(&self) -> f64 { - self.0.molarweight - } - - #[setter] - fn set_molarweight(&mut self, molarweight: f64) { - self.0.molarweight = molarweight; - } + /// Creates parameters from json files. + /// + /// Parameters + /// ---------- + /// input : List[Tuple[List[str], str]] + /// The substances to search and their respective parameter files. + /// E.g. [(["methane", "propane"], "parameters/alkanes.json"), (["methanol"], "parameters/alcohols.json")] + /// binary_path : str, optional + /// Path to file containing binary substance parameters. + /// identifier_option : IdentifierOption, optional, defaults to IdentifierOption.Name + /// Identifier that is used to search substance. + #[staticmethod] + #[pyo3( + signature = (input, binary_path=None, identifier_option=IdentifierOption::Name), + text_signature = "(input, binary_path=None, identifier_option)" + )] + fn from_multiple_json( + input: Vec<(Vec, PyBackedStr)>, + binary_path: Option, + identifier_option: IdentifierOption, + ) -> Result { + // total number of substances queried + let nsubstances = input.iter().map(|(substances, _)| substances.len()).sum(); + + // queried substances with removed duplicates + let queried: HashSet<_> = input + .iter() + .flat_map(|(substances, _)| substances) + .collect(); + + // check if there are duplicates + if queried.len() != nsubstances { + return Err(ParameterError::IncompatibleParameters( + "A substance was defined more than once.".to_string(), + )); + } - #[getter] - fn get_model_record(&self) -> $py_model_record { - $py_model_record(self.0.model_record.clone()) - } + let mut pure_records = Vec::with_capacity(nsubstances); - #[setter] - fn set_model_record(&mut self, model_record: $py_model_record) { - self.0.model_record = model_record.0; - } - - fn __repr__(&self) -> PyResult { - Ok(self.0.to_string()) - } + // collect parameters from files into single map + for (substances, file) in input { + pure_records.extend(PyPureRecord::from_json( + &substances, + &file, + identifier_option, + )?); } - impl_json_handling!(PyPureRecord); - }; -} + let binary_records = if let Some(path) = binary_path { + let reader = BufReader::new(File::open::<&str>(path.as_ref())?); + serde_json::from_reader(reader)? + } else { + Vec::new() + }; -#[macro_export] -macro_rules! impl_segment_record { - ($model_record:ident, $py_model_record:ident) => { - /// All information required to characterize a single segment. - /// - /// Parameters - /// ---------- - /// identifier : str - /// The identifier of the segment. - /// molarweight : float - /// The molar weight (in g/mol) of the segment. - /// model_record : ModelRecord - /// The segment model parameters. - /// - /// Returns - /// ------- - /// SegmentRecord - #[pyclass(name = "SegmentRecord")] - #[derive(Clone)] - pub struct PySegmentRecord(SegmentRecord<$model_record>); - - #[pymethods] - impl PySegmentRecord { - #[new] - #[pyo3(text_signature = "(identifier, molarweight, model_record)")] - fn new( - identifier: String, - molarweight: f64, - model_record: $py_model_record, - ) -> PyResult { - Ok(Self(SegmentRecord::new( - identifier, - molarweight, - model_record.0, - ))) - } + Self::from_records(pure_records, binary_records, identifier_option) + } - /// Read a list of `SegmentRecord`s from a JSON file. - /// - /// Parameters - /// ---------- - /// path : str - /// Path to file containing the segment records. - /// - /// Returns - /// ------- - /// [SegmentRecord] - #[staticmethod] - fn from_json(path: &str) -> Result, ParameterError> { - Ok(SegmentRecord::from_json(path)? - .into_iter() - .map(Self) - .collect()) - } + /// Generates JSON-formatted string for pure and binary records (if initialized). + /// + /// Parameters + /// ---------- + /// pretty : bool + /// Whether to use pretty (True) or dense (False) formatting. Defaults to True. + /// + /// Returns + /// ------- + /// str : The JSON-formatted string. + #[pyo3( + signature = (pretty=true), + text_signature = "(pretty=True)" + )] + fn to_json_str(&self, pretty: bool) -> Result<(String, Option), ParameterError> { + let pr_json = if pretty { + serde_json::to_string_pretty(&self.pure_records) + } else { + serde_json::to_string(&self.pure_records) + }?; + let br_json = (!self.binary_records.is_empty()) + .then(|| { + if pretty { + serde_json::to_string_pretty(&self.binary_records) + } else { + serde_json::to_string(&self.binary_records) + } + }) + .transpose()?; + Ok((pr_json, br_json)) + } - #[getter] - fn get_identifier(&self) -> String { - self.0.identifier.clone() - } + #[getter] + fn get_binary_records<'py>( + &self, + py: Python<'py>, + ) -> Result, PythonizeError> { + pythonize(py, &self.binary_records) + } - #[setter] - fn set_identifier(&mut self, identifier: String) { - self.0.identifier = identifier; - } + fn __repr__(&self) -> Result { + let (mut pr, br) = self.to_json_str(true)?; + if let Some(br) = br { + pr += "\n\n"; + pr += &br; + } + Ok(pr) + } - #[getter] - fn get_molarweight(&self) -> f64 { - self.0.molarweight + fn _repr_markdown_(&self) -> String { + // crate consistent list of component names + let component_names: Vec<_> = self + .pure_records + .iter() + .enumerate() + .map(|(i, r)| { + r.identifier + .as_readable_str() + .map_or_else(|| format!("Component {}", i + 1), |s| s.to_owned()) + }) + .collect(); + + // collect all pure component parameters + let params: IndexSet<_> = self + .pure_records + .iter() + .flat_map(|r| { + serde_json::from_value::>(r.model_record.clone()) + .unwrap() + .into_keys() + }) + .collect(); + + let mut output = String::new(); + let o = &mut output; + + // print pure component parameters in a table + write!(o, "|component|molarweight|").unwrap(); + for p in ¶ms { + write!(o, "{}|", p).unwrap(); + } + write!(o, "\n|-|-|").unwrap(); + for _ in ¶ms { + write!(o, "-|").unwrap(); + } + for (record, comp) in self.pure_records.iter().zip(&component_names) { + write!(o, "\n|{}|{}|", comp, record.molarweight).unwrap(); + let model_record = + serde_json::from_value::>(record.model_record.clone()) + .unwrap(); + for p in ¶ms { + if let Some(val) = model_record.get(p) { + write!(o, "{}|", val) + } else { + write!(o, "-|") + } + .unwrap(); } + } - #[setter] - fn set_molarweight(&mut self, molarweight: f64) { - self.0.molarweight = molarweight; - } + if !self.binary_records.is_empty() { + // collect all binary interaction parameters + let params: IndexSet<_> = self + .binary_records + .iter() + .flat_map(|(_, r)| { + serde_json::from_value::>(r.clone()) + .unwrap() + .into_keys() + }) + .collect(); - #[getter] - fn get_model_record(&self) -> $py_model_record { - $py_model_record(self.0.model_record.clone()) + // print binary interaction parameters + write!(o, "\n\n|component 1|component 2|").unwrap(); + for p in ¶ms { + write!(o, "{}|", p).unwrap(); } - - #[setter] - fn set_model_record(&mut self, model_record: $py_model_record) { - self.0.model_record = model_record.0; + write!(o, "\n|-|-|").unwrap(); + for _ in ¶ms { + write!(o, "-|").unwrap(); } - - fn __repr__(&self) -> PyResult { - Ok(self.0.to_string()) + for ([i, j], r) in &self.binary_records { + write!(o, "\n|{}|{}|", component_names[*i], component_names[*j]).unwrap(); + let model_record = + serde_json::from_value::>(r.clone()).unwrap(); + for p in ¶ms { + if let Some(val) = model_record.get(p) { + write!(o, "{}|", val) + } else { + write!(o, "-|") + } + .unwrap(); + } } } - impl_json_handling!(PySegmentRecord); - }; + output + } } -#[macro_export] -macro_rules! impl_parameter { - ($parameter:ty, $py_parameter:ty, $py_model_record:ty) => { - impl_parameter!($parameter, $py_parameter, $py_model_record, PyNoBinaryModelRecord); - }; - ($parameter:ty, $py_parameter:ty, $py_model_record:ty, $py_binary_model_record:ty) => { - use pyo3::pybacked::*; - - #[pymethods] - impl $py_parameter { - /// Creates parameters from records. - /// - /// Parameters - /// ---------- - /// pure_records : [PureRecord] - /// A list of pure component parameters. - /// binary_records : numpy.ndarray[float] or List[BinaryRecord], optional - /// A matrix of binary interaction parameters or a list - /// containing records for binary interactions. - /// identifier_option : IdentifierOption, optional, defaults to IdentifierOption.Name - /// Identifier that is used to search binary records. - #[staticmethod] - #[pyo3( - signature = (pure_records, binary_records=None, identifier_option=IdentifierOption::Name), - text_signature = "(pure_records, binary_records=None, identifier_option=None)" - )] - fn from_records( - pure_records: Vec, - binary_records: Option<&Bound<'_, PyAny>>, - identifier_option: IdentifierOption, - ) -> PyResult { - let prs: Vec<_> = pure_records.into_iter().map(|pr| pr.0).collect(); - let binary_records = binary_records - .map(|binary_records| { - if let Ok(br) = binary_records.extract::>() { - Ok(Some(br.as_array().mapv(|r| r.try_into().unwrap()))) - } else if let Ok(br) = binary_records.extract::>() { - let brs: Vec<_> = br.into_iter().map(|br| br.0).collect(); - Ok(<$parameter>::binary_matrix_from_records( - &prs, - &brs, - identifier_option, - )) - } else { - Err(PyErr::new::(format!( - "Could not parse binary input!" - ))) - } - }) - .transpose()? - .flatten(); - Ok(Self(Arc::new(Parameter::from_records(prs, binary_records)?))) - } - - /// Creates parameters for a pure component from a pure record. - /// - /// Parameters - /// ---------- - /// pure_record : PureRecord - /// The pure component parameters. - #[staticmethod] - fn new_pure(pure_record: PyPureRecord) -> PyResult { - Ok(Self(Arc::new(<$parameter>::new_pure(pure_record.0)?))) - } - - /// Creates parameters for a binary system from pure records and an optional - /// binary interaction parameter or binary interaction parameter record. - /// - /// Parameters - /// ---------- - /// pure_records : [PureRecord] - /// A list of pure component parameters. - /// binary_record : float or BinaryRecord, optional - /// The binary interaction parameter or binary interaction record. - #[staticmethod] - #[pyo3(text_signature = "(pure_records, binary_record=None)", signature = (pure_records, binary_record=None))] - fn new_binary( - pure_records: Vec, - binary_record: Option<&Bound<'_, PyAny>>, - ) -> PyResult { - let prs = pure_records.into_iter().map(|pr| pr.0).collect(); - let br = binary_record - .map(|br| { - if let Ok(r) = br.extract::() { - Ok(r.try_into()?) - } else if let Ok(r) = br.extract::<$py_binary_model_record>() { - Ok(r.into()) - } else { - Err(PyErr::new::(format!( - "Could not parse binary input!" - ))) - } - }) - .transpose()?; - Ok(Self(Arc::new(<$parameter>::new_binary(prs, br)?))) - } - - /// Creates parameters from model records with default values for the molar weight, - /// identifiers, and binary interaction parameters. - /// - /// Parameters - /// ---------- - /// model_records : [ModelRecord] - /// A list of model parameters. - #[staticmethod] - fn from_model_records(model_records: Vec<$py_model_record>) -> PyResult { - let mrs = model_records.into_iter().map(|mr| mr.0).collect(); - Ok(Self(Arc::new(<$parameter>::from_model_records(mrs)?))) - } - - /// Creates parameters from json files. - /// - /// Parameters - /// ---------- - /// substances : List[str] - /// The substances to search. - /// pure_path : str - /// Path to file containing pure substance parameters. - /// binary_path : str, optional - /// Path to file containing binary substance parameters. - /// identifier_option : IdentifierOption, optional, defaults to IdentifierOption.Name - /// Identifier that is used to search substance. - #[staticmethod] - #[pyo3( - signature = (substances, pure_path, binary_path=None, identifier_option=IdentifierOption::Name), - text_signature = "(substances, pure_path, binary_path=None, identifier_option)" - )] - fn from_json( - substances: Vec, - pure_path: String, - binary_path: Option, - identifier_option: IdentifierOption, - ) -> Result { - let substances = substances.iter().map(|s| &**s).collect(); - Ok(Self(Arc::new(<$parameter>::from_json( - substances, - pure_path, - binary_path, - identifier_option, - )?))) - } - - /// Creates parameters from json files. - /// - /// Parameters - /// ---------- - /// input : List[Tuple[List[str], str]] - /// The substances to search and their respective parameter files. - /// E.g. [(["methane", "propane"], "parameters/alkanes.json"), (["methanol"], "parameters/alcohols.json")] - /// binary_path : str, optional - /// Path to file containing binary substance parameters. - /// identifier_option : IdentifierOption, optional, defaults to IdentifierOption.Name - /// Identifier that is used to search substance. - #[staticmethod] - #[pyo3( - signature = (input, binary_path=None, identifier_option=IdentifierOption::Name), - text_signature = "(input, binary_path=None, identifier_option)" - )] - fn from_multiple_json( - input: Vec<(Vec, PyBackedStr)>, - binary_path: Option, - identifier_option: Option, - ) -> Result { - let input: Vec<(Vec<&str>, &str)> = input.iter().map(|(c, f)| (c.iter().map(|c| &**c).collect(), &**f)).collect(); - Ok(Self(Arc::new(<$parameter>::from_multiple_json( - &input, - binary_path.as_deref(), - identifier_option.unwrap_or(IdentifierOption::Name), - )?))) - } +#[pyclass(name = "GcParameters", get_all)] +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct PyGcParameters { + chemical_records: Vec, + segment_records: Vec, + binary_segment_records: Option>, +} - #[getter] - fn get_pure_records(&self) -> Vec { - self.0 - .records() - .0 - .iter() - .map(|r| PyPureRecord(r.clone())) - .collect() - } +impl PyGcParameters { + pub fn try_convert_homosegmented(self) -> Result + where + P::Pure: FromSegments, + P::Binary: FromSegmentsBinary, + { + let segment_records = self + .segment_records + .into_iter() + .map(|r| r.try_into()) + .collect::>()?; + P::from_segments( + self.chemical_records, + segment_records, + self.binary_segment_records, + ) + } - #[getter] - fn get_binary_records<'py>(&self, py: Python<'py>) -> Option>> { - self.0 - .records() - .1 - .map(|r| r.mapv(|r| f64::try_from(r).unwrap()).view().to_pyarray(py)) - } - } - }; + pub fn try_convert_heterosegmented(self) -> Result + where + P::Chemical: From, + { + let segment_records = self + .segment_records + .into_iter() + .map(|r| r.try_into()) + .collect::>()?; + P::from_segments( + self.chemical_records, + segment_records, + self.binary_segment_records, + ) + } } -#[macro_export] -macro_rules! impl_parameter_from_segments { - ($parameter:ty, $py_parameter:ty) => { - use pyo3::pybacked::*; - - #[pymethods] - impl $py_parameter { - /// Creates parameters from segment records. - /// - /// Parameters - /// ---------- - /// chemical_records : [ChemicalRecord] - /// A list of pure component chemical records. - /// segment_records : [SegmentRecord] - /// A list of records containing the parameters of - /// all individual segments. - /// binary_segment_records : [BinarySegmentRecord], optional - /// A list of binary segment-segment parameters. - #[staticmethod] - #[pyo3(text_signature = "(chemical_records, segment_records, binary_segment_records=None)", - signature = (chemical_records, segment_records, binary_segment_records=None))] - fn from_segments( - chemical_records: Vec, - segment_records: Vec, - binary_segment_records: Option>, - ) -> PyResult { - Ok(Self(Arc::new(<$parameter>::from_segments( - chemical_records.into_iter().map(|cr| cr.0).collect(), - segment_records.into_iter().map(|sr| sr.0).collect(), - binary_segment_records.map(|r| r.into_iter().map(|r| BinaryRecord{id1:r.0.id1,id2:r.0.id2,model_record:r.0.model_record.into()}).collect()), - )?))) - } - - /// Creates parameters using segments from json file. - /// - /// Parameters - /// ---------- - /// substances : List[str] - /// The substances to search. - /// pure_path : str - /// Path to file containing pure substance parameters. - /// segments_path : str - /// Path to file containing segment parameters. - /// binary_path : str, optional - /// Path to file containing binary segment-segment parameters. - /// identifier_option : IdentifierOption, optional, defaults to IdentifierOption.Name - /// Identifier that is used to search substance. - #[staticmethod] - #[pyo3( - signature = (substances, pure_path, segments_path, binary_path=None, identifier_option=IdentifierOption::Name), - text_signature = "(substances, pure_path, segments_path, binary_path=None, identifier_option)" - )] - fn from_json_segments( - substances: Vec, - pure_path: String, - segments_path: String, - binary_path: Option, - identifier_option: IdentifierOption, - ) -> PyResult { - let substances: Vec<_> = substances.iter().map(|s| &**s).collect(); - Ok(Self(Arc::new(<$parameter>::from_json_segments( - &substances, - pure_path, - segments_path, - binary_path, - identifier_option, - )?))) - } +#[pymethods] +impl PyGcParameters { + /// Creates parameters from segment records. + /// + /// Parameters + /// ---------- + /// chemical_records : [ChemicalRecord] + /// A list of pure component chemical records. + /// segment_records : [SegmentRecord] + /// A list of records containing the parameters of + /// all individual segments. + /// binary_segment_records : [BinarySegmentRecord], optional + /// A list of binary segment-segment parameters. + #[staticmethod] + #[pyo3(text_signature = "(chemical_records, segment_records, binary_segment_records=None)", + signature = (chemical_records, segment_records, binary_segment_records=None))] + fn from_segments( + chemical_records: Vec, + segment_records: Vec, + binary_segment_records: Option>, + ) -> Self { + Self { + chemical_records, + segment_records, + binary_segment_records, + } + } - /// Creates parameters from SMILES and segment records. - /// - /// Requires an installation of rdkit. - /// - /// Parameters - /// ---------- - /// identifier : [str | Identifier] - /// A list of SMILES codes or [Identifier] objects. - /// smarts_records : [SmartsRecord] - /// A list of records containing the SMARTS codes used - /// to fragment the molecule. - /// segment_records : [SegmentRecord] - /// A list of records containing the parameters of - /// all individual segments. - /// binary_segment_records : [BinarySegmentRecord], optional - /// A list of binary segment-segment parameters. - #[staticmethod] - #[pyo3(text_signature = "(identifier, smarts_records, segment_records, binary_segment_records=None)")] - #[pyo3(signature = (identifier, smarts_records, segment_records, binary_segment_records=None))] - fn from_smiles( - identifier: Vec>, - smarts_records: Vec, - segment_records: Vec, - binary_segment_records: Option>, - ) -> PyResult { - let chemical_records: Vec<_> = identifier - .into_iter() - .map(|i| PyChemicalRecord::from_smiles(&i, smarts_records.clone())) - .collect::>()?; - Self::from_segments(chemical_records, segment_records, binary_segment_records) - } + /// Creates parameters using segments from json file. + /// + /// Parameters + /// ---------- + /// substances : List[str] + /// The substances to search. + /// pure_path : str + /// Path to file containing pure substance parameters. + /// segments_path : str + /// Path to file containing segment parameters. + /// binary_path : str, optional + /// Path to file containing binary segment-segment parameters. + /// identifier_option : IdentifierOption, optional, defaults to IdentifierOption.Name + /// Identifier that is used to search substance. + #[staticmethod] + #[pyo3( + signature = (substances, pure_path, segments_path, binary_path=None, identifier_option=IdentifierOption::Name), + text_signature = "(substances, pure_path, segments_path, binary_path=None, identifier_option=IdentiferOption.Name)" + )] + fn from_json_segments( + substances: Vec, + pure_path: PyBackedStr, + segments_path: PyBackedStr, + binary_path: Option, + identifier_option: IdentifierOption, + ) -> Result { + let queried: IndexSet<_> = substances + .iter() + .map(|identifier| identifier as &str) + .collect(); + + let reader = BufReader::new(File::open(&pure_path as &str)?); + let chemical_records: Vec = serde_json::from_reader(reader)?; + let mut record_map: IndexMap<_, _> = chemical_records + .into_iter() + .filter_map(|record| { + record + .identifier + .as_str(identifier_option) + .map(|i| i.to_owned()) + .map(|i| (i, record)) + }) + .collect(); + + // Compare queried components and available components + let available: IndexSet<_> = record_map + .keys() + .map(|identifier| identifier as &str) + .collect(); + if !queried.is_subset(&available) { + let missing: Vec<_> = queried.difference(&available).cloned().collect(); + return Err(ParameterError::ComponentsNotFound(format!("{:?}", missing))); + }; - /// Creates parameters from SMILES using segments from json file. - /// - /// Requires an installation of rdkit. - /// - /// Parameters - /// ---------- - /// identifier : [str | Identifier] - /// A list of SMILES codes or [Identifier] objects. - /// smarts_path : str - /// Path to file containing SMARTS records. - /// segments_path : str - /// Path to file containing segment parameters. - /// binary_path : str, optional - /// Path to file containing binary segment-segment parameters. - #[staticmethod] - #[pyo3( - signature = (identifier, smarts_path, segments_path, binary_path=None), - text_signature = "(identifier, smarts_path, segments_path, binary_path=None)" - )] - fn from_json_smiles( - identifier: Vec>, - smarts_path: String, - segments_path: String, - binary_path: Option, - ) -> PyResult { - let smarts_records = PySmartsRecord::from_json(&smarts_path)?; - let segment_records = PySegmentRecord::from_json(&segments_path)?; - let binary_segment_records = binary_path.map(|p| PyBinarySegmentRecord::from_json(&p)).transpose()?; - Self::from_smiles( - identifier, - smarts_records, - segment_records, - binary_segment_records, - ) - } - } - }; -} + // Collect all pure records that were queried + let chemical_records: Vec<_> = queried + .into_iter() + .filter_map(|identifier| record_map.shift_remove(identifier)) + .collect(); + + // Read segment records + let segment_records: Vec = + PySegmentRecord::from_json(&segments_path as &str)?; + + // Read binary records + let binary_records = binary_path + .as_ref() + .map(|file_binary| { + let reader = BufReader::new(File::open(file_binary as &str)?); + let binary_records: Result, ParameterError> = + Ok(serde_json::from_reader(reader)?); + binary_records + }) + .transpose()?; + + Ok(Self::from_segments( + chemical_records, + segment_records, + binary_records, + )) + } -#[macro_export] -macro_rules! impl_json_handling { - ($py_parameter:ty) => { - #[pymethods] - impl $py_parameter { - /// Creates record from json string. - #[staticmethod] - fn from_json_str(json: &str) -> Result { - Ok(Self(serde_json::from_str(json)?)) - } + /// Creates parameters from SMILES and segment records. + /// + /// Requires an installation of rdkit. + /// + /// Parameters + /// ---------- + /// identifier : [str | Identifier] + /// A list of SMILES codes or [Identifier] objects. + /// smarts_records : [SmartsRecord] + /// A list of records containing the SMARTS codes used + /// to fragment the molecule. + /// segment_records : [SegmentRecord] + /// A list of records containing the parameters of + /// all individual segments. + /// binary_segment_records : [BinarySegmentRecord], optional + /// A list of binary segment-segment parameters. + #[staticmethod] + #[pyo3( + text_signature = "(identifier, smarts_records, segment_records, binary_segment_records=None)" + )] + #[pyo3(signature = (identifier, smarts_records, segment_records, binary_segment_records=None))] + fn from_smiles( + identifier: Vec>, + smarts_records: Vec, + segment_records: Vec, + binary_segment_records: Option>, + ) -> PyResult { + let chemical_records: Vec<_> = identifier + .into_iter() + .map(|i| ChemicalRecord::from_smiles(&i, smarts_records.clone())) + .collect::>()?; + Ok(Self::from_segments( + chemical_records, + segment_records, + binary_segment_records, + )) + } - /// Creates a json string from record. - fn to_json_str(&self) -> Result { - Ok(serde_json::to_string(&self.0)?) - } - } - }; + /// Creates parameters from SMILES using segments from json file. + /// + /// Requires an installation of rdkit. + /// + /// Parameters + /// ---------- + /// identifier : list[str | Identifier] + /// A list of SMILES codes or [Identifier] objects. + /// smarts_path : str + /// Path to file containing SMARTS records. + /// segments_path : str + /// Path to file containing segment parameters. + /// binary_path : str, optional + /// Path to file containing binary segment-segment parameters. + #[staticmethod] + #[pyo3( + signature = (identifier, smarts_path, segments_path, binary_path=None), + text_signature = "(identifier, smarts_path, segments_path, binary_path=None)" + )] + fn from_json_smiles( + identifier: Vec>, + smarts_path: PyBackedStr, + segments_path: PyBackedStr, + binary_path: Option, + ) -> PyResult { + let smarts_records = PySmartsRecord::from_json(&smarts_path)?; + let segment_records = PySegmentRecord::from_json(&segments_path)?; + let binary_segment_records = binary_path + .as_ref() + .map(|p| BinarySegmentRecord::from_json(p as &str)) + .transpose()?; + Self::from_smiles( + identifier, + smarts_records, + segment_records, + binary_segment_records, + ) + } } - -mod fragmentation; -pub use fragmentation::PySmartsRecord; diff --git a/feos-core/tests/parameters.rs b/feos-core/tests/parameters.rs index 1498b7028..dfb672261 100644 --- a/feos-core/tests/parameters.rs +++ b/feos-core/tests/parameters.rs @@ -1,7 +1,6 @@ use feos_core::parameter::*; use ndarray::Array2; use serde::{Deserialize, Serialize}; -use std::convert::TryFrom; #[derive(Debug, Clone, Serialize, Deserialize, Default)] struct MyPureModel { @@ -13,13 +12,6 @@ struct MyBinaryModel { b: f64, } -impl TryFrom for MyBinaryModel { - type Error = &'static str; - fn try_from(f: f64) -> Result { - Ok(Self { b: f }) - } -} - struct MyParameter { pure_records: Vec>, binary_records: Option>, diff --git a/src/epcsaft/mod.rs b/src/epcsaft/mod.rs index 5a0d05662..57a15d83a 100644 --- a/src/epcsaft/mod.rs +++ b/src/epcsaft/mod.rs @@ -7,6 +7,3 @@ pub use eos::{ElectrolytePcSaft, ElectrolytePcSaftOptions, ElectrolytePcSaftVari pub use parameters::{ ElectrolytePcSaftBinaryRecord, ElectrolytePcSaftParameters, ElectrolytePcSaftRecord, }; - -#[cfg(feature = "python")] -pub mod python; diff --git a/src/epcsaft/parameters.rs b/src/epcsaft/parameters.rs index 57b515d60..49d91f85c 100644 --- a/src/epcsaft/parameters.rs +++ b/src/epcsaft/parameters.rs @@ -643,7 +643,7 @@ impl ElectrolytePcSaftParameters { #[cfg(test)] pub mod utils { - use feos_core::parameter::{BinaryRecord, Identifier}; + use feos_core::parameter::BinaryRecord; use super::*; use std::sync::Arc; @@ -847,7 +847,7 @@ pub mod utils { ]"#; let pure_records: Vec> = serde_json::from_str(pure_json).expect("Unable to parse json."); - let binary_records: Vec> = + let binary_records: Vec> = serde_json::from_str(binary_json).expect("Unable to parse json."); let binary_matrix = ElectrolytePcSaftParameters::binary_matrix_from_records( &pure_records, @@ -1021,7 +1021,7 @@ pub mod utils { ]"#; let pure_records: Vec> = serde_json::from_str(pure_json).expect("Unable to parse json."); - let binary_records: Vec> = + let binary_records: Vec> = serde_json::from_str(binary_json).expect("Unable to parse json."); let binary_matrix = ElectrolytePcSaftParameters::binary_matrix_from_records( &pure_records, diff --git a/src/epcsaft/python.rs b/src/epcsaft/python.rs deleted file mode 100644 index 9a807702a..000000000 --- a/src/epcsaft/python.rs +++ /dev/null @@ -1,257 +0,0 @@ -use super::eos::permittivity::PermittivityRecord; -use super::parameters::{ - ElectrolytePcSaftBinaryRecord, ElectrolytePcSaftParameters, ElectrolytePcSaftRecord, -}; -use super::ElectrolytePcSaftVariants; -use feos_core::parameter::{ - BinaryRecord, Identifier, IdentifierOption, Parameter, ParameterError, PureRecord, - SegmentRecord, -}; -use feos_core::python::parameter::*; -use feos_core::*; -use numpy::{PyArray2, PyReadonlyArray2, ToPyArray}; -use pyo3::exceptions::PyTypeError; -use pyo3::prelude::*; -use std::convert::{TryFrom, TryInto}; -use std::sync::Arc; - -// Pure-substance parameters for the ePC-SAFT equation of state. -/// -/// Parameters -/// ---------- -/// m : float -/// Segment number -/// sigma : float -/// Segment diameter in units of Angstrom. -/// epsilon_k : float -/// Energetic parameter in units of Kelvin. -/// kappa_ab : float, optional -/// Association volume parameter. -/// epsilon_k_ab : float, optional -/// Association energy parameter in units of Kelvin. -/// na : float, optional -/// Number of association sites of type A. -/// nb : float, optional -/// Number of association sites of type B. -/// nc : float, optional -/// Number of association sites of type C. -/// z : float, optional -/// Charge of the electrolyte. -/// permittivity_record : PyPermittivityRecord, optional -/// Permittivity record. Defaults to `None`. -#[pyclass(name = "ElectrolytePcSaftRecord")] -#[derive(Clone)] -pub struct PyElectrolytePcSaftRecord(ElectrolytePcSaftRecord); - -#[pymethods] -impl PyElectrolytePcSaftRecord { - #[new] - #[pyo3( - text_signature = "(m, sigma, epsilon_k, kappa_ab=None, epsilon_k_ab=None, na=None, nb=None, nc=None, z=None, permittivity_record=None)", - signature = (m, sigma, epsilon_k, kappa_ab=None, epsilon_k_ab=None, na=None, nb=None, nc=None, z=None, permittivity_record=None) - )] - #[expect(clippy::too_many_arguments)] - fn new( - m: f64, - sigma: f64, - epsilon_k: f64, - kappa_ab: Option, - epsilon_k_ab: Option, - na: Option, - nb: Option, - nc: Option, - z: Option, - permittivity_record: Option, - ) -> Self { - Self(ElectrolytePcSaftRecord::new( - m, - sigma, - epsilon_k, - kappa_ab, - epsilon_k_ab, - na, - nb, - nc, - z, - permittivity_record.map(|p| p.0), - )) - } - - #[getter] - fn get_m(&self) -> f64 { - self.0.m - } - - #[getter] - fn get_sigma(&self) -> f64 { - self.0.sigma - } - - #[getter] - fn get_epsilon_k(&self) -> f64 { - self.0.epsilon_k - } - - #[getter] - fn get_kappa_ab(&self) -> Option { - self.0.association_record.map(|a| a.parameters.kappa_ab) - } - - #[getter] - fn get_epsilon_k_ab(&self) -> Option { - self.0.association_record.map(|a| a.parameters.epsilon_k_ab) - } - - #[getter] - fn get_z(&self) -> Option { - self.0.z - } - - #[getter] - fn get_na(&self) -> Option { - self.0.association_record.map(|a| a.na) - } - - #[getter] - fn get_nb(&self) -> Option { - self.0.association_record.map(|a| a.nb) - } - - #[getter] - fn get_nc(&self) -> Option { - self.0.association_record.map(|a| a.nc) - } - - fn __repr__(&self) -> PyResult { - Ok(self.0.to_string()) - } -} - -impl_json_handling!(PyElectrolytePcSaftRecord); - -impl_pure_record!(ElectrolytePcSaftRecord, PyElectrolytePcSaftRecord); -impl_segment_record!(ElectrolytePcSaftRecord, PyElectrolytePcSaftRecord); - -#[pyclass(name = "ElectrolytePcSaftBinaryRecord")] -#[derive(Clone)] -pub struct PyElectrolytePcSaftBinaryRecord(ElectrolytePcSaftBinaryRecord); - -#[pymethods] -impl PyElectrolytePcSaftBinaryRecord { - #[new] - fn new(k_ij: [f64; 4]) -> Self { - Self(ElectrolytePcSaftBinaryRecord::new( - Some(k_ij.to_vec()), - None, - None, - )) - } - - #[getter] - fn get_k_ij(&self) -> Vec { - self.0.k_ij.clone() - } - - #[setter] - fn set_k_ij(&mut self, k_ij: [f64; 4]) { - self.0.k_ij = k_ij.to_vec() - } -} - -impl_json_handling!(PyElectrolytePcSaftBinaryRecord); - -impl_binary_record!( - ElectrolytePcSaftBinaryRecord, - PyElectrolytePcSaftBinaryRecord -); - -#[pyclass(name = "ElectrolytePcSaftParameters")] -#[derive(Clone)] -pub struct PyElectrolytePcSaftParameters(pub Arc); - -impl_parameter!( - ElectrolytePcSaftParameters, - PyElectrolytePcSaftParameters, - PyElectrolytePcSaftRecord, - PyElectrolytePcSaftBinaryRecord -); - -#[pymethods] -impl PyElectrolytePcSaftParameters { - fn _repr_markdown_(&self) -> String { - self.0.to_markdown() - } -} - -/// Class permittivity record -#[pyclass(name = "PermittivityRecord", unsendable)] -#[derive(Clone)] -pub struct PyPermittivityRecord(pub PermittivityRecord); - -#[pymethods] -impl PyPermittivityRecord { - /// from_experimental_data - /// - /// Parameters - /// ---------- - /// interpolation_points : Vec> - /// - /// Returns - /// ------- - /// PermittivityRecord - /// - #[staticmethod] - #[pyo3(text_signature = "(interpolation_points)")] - pub fn from_experimental_data(interpolation_points: Vec<(f64, f64)>) -> Self { - Self(PermittivityRecord::ExperimentalData { - data: interpolation_points, - }) - } - - /// from_perturbation_theory - /// - /// Parameters - /// ---------- - /// dipole_scaling : Vec, - /// polarizability_scaling : Vec, - /// correlation_integral_parameter : Vec, - /// - /// Returns - /// ------- - /// PermittivityRecord - /// - #[staticmethod] - #[pyo3( - text_signature = "(dipole_scaling, polarizability_scaling, correlation_integral_parameter)" - )] - pub fn from_perturbation_theory( - dipole_scaling: f64, - polarizability_scaling: f64, - correlation_integral_parameter: f64, - ) -> Self { - Self(PermittivityRecord::PerturbationTheory { - dipole_scaling, - polarizability_scaling, - correlation_integral_parameter, - }) - } -} - -#[pymodule] -pub fn epcsaft(m: &Bound<'_, PyModule>) -> PyResult<()> { - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - Ok(()) -} diff --git a/src/gc_pcsaft/dft/parameter.rs b/src/gc_pcsaft/dft/parameter.rs index 808a221af..f923f7617 100644 --- a/src/gc_pcsaft/dft/parameter.rs +++ b/src/gc_pcsaft/dft/parameter.rs @@ -1,7 +1,7 @@ use crate::association::AssociationParameters; use crate::gc_pcsaft::record::GcPcSaftRecord; use feos_core::parameter::{ - BinaryRecord, ChemicalRecord, ParameterError, ParameterHetero, SegmentRecord, + BinarySegmentRecord, ChemicalRecord, ParameterError, ParameterHetero, SegmentRecord, }; use indexmap::IndexMap; use ndarray::{Array1, Array2}; @@ -28,18 +28,17 @@ pub struct GcPcSaftFunctionalParameters { pub epsilon_k_ij: Array2, pub chemical_records: Vec, segment_records: Vec>, - binary_segment_records: Option>>, + binary_segment_records: Option>, } impl ParameterHetero for GcPcSaftFunctionalParameters { type Chemical = ChemicalRecord; type Pure = GcPcSaftRecord; - type Binary = f64; fn from_segments>( chemical_records: Vec, segment_records: Vec>, - binary_segment_records: Option>>, + binary_segment_records: Option>, ) -> Result { let chemical_records: Vec<_> = chemical_records.into_iter().map(|cr| cr.into()).collect(); @@ -155,7 +154,7 @@ impl ParameterHetero for GcPcSaftFunctionalParameters { ) -> ( &[Self::Chemical], &[SegmentRecord], - &Option>>, + &Option>, ) { ( &self.chemical_records, diff --git a/src/gc_pcsaft/eos/parameter.rs b/src/gc_pcsaft/eos/parameter.rs index 6642fc2a9..f9746bac4 100644 --- a/src/gc_pcsaft/eos/parameter.rs +++ b/src/gc_pcsaft/eos/parameter.rs @@ -2,13 +2,13 @@ use crate::association::{AssociationParameters, AssociationStrength}; use crate::gc_pcsaft::record::{GcPcSaftAssociationRecord, GcPcSaftRecord}; use crate::hard_sphere::{HardSphereProperties, MonomerShape}; use feos_core::parameter::{ - BinaryRecord, ChemicalRecord, Identifier, ParameterError, ParameterHetero, SegmentCount, + BinarySegmentRecord, ChemicalRecord, Identifier, ParameterError, ParameterHetero, SegmentCount, SegmentRecord, }; -use quantity::{JOULE, KB, KELVIN}; use indexmap::IndexMap; use ndarray::{Array1, Array2}; use num_dual::DualNum; +use quantity::{JOULE, KB, KELVIN}; use std::borrow::Cow; use std::collections::HashMap; use std::fmt::Write; @@ -90,18 +90,17 @@ pub struct GcPcSaftEosParameters { pub chemical_records: Vec, segment_records: Vec>, - binary_segment_records: Option>>, + binary_segment_records: Option>, } impl ParameterHetero for GcPcSaftEosParameters { type Chemical = GcPcSaftChemicalRecord; type Pure = GcPcSaftRecord; - type Binary = f64; fn from_segments>( chemical_records: Vec, segment_records: Vec>, - binary_segment_records: Option>>, + binary_segment_records: Option>, ) -> Result { let chemical_records: Vec<_> = chemical_records.into_iter().map(|c| c.into()).collect(); @@ -257,7 +256,7 @@ impl ParameterHetero for GcPcSaftEosParameters { ) -> ( &[Self::Chemical], &[SegmentRecord], - &Option>>, + &Option>, ) { ( &self.chemical_records, @@ -476,8 +475,8 @@ pub mod test { ) } - pub fn ch3_oh() -> BinaryRecord { - BinaryRecord::new("CH3".to_string(), "OH".to_string(), -0.0087) + pub fn ch3_oh() -> BinarySegmentRecord { + BinarySegmentRecord::new("CH3".to_string(), "OH".to_string(), -0.0087) } pub fn propane() -> GcPcSaftEosParameters { diff --git a/src/gc_pcsaft/mod.rs b/src/gc_pcsaft/mod.rs index 11ee49156..c6cab9339 100644 --- a/src/gc_pcsaft/mod.rs +++ b/src/gc_pcsaft/mod.rs @@ -14,6 +14,3 @@ mod record; pub use dft::{GcPcSaftFunctional, GcPcSaftFunctionalContribution, GcPcSaftFunctionalParameters}; pub use eos::{GcPcSaft, GcPcSaftChemicalRecord, GcPcSaftEosParameters, GcPcSaftOptions}; pub use record::GcPcSaftRecord; - -#[cfg(feature = "python")] -pub mod python; diff --git a/src/gc_pcsaft/python/micelles.rs b/src/gc_pcsaft/python/micelles.rs deleted file mode 100644 index 6756ccb11..000000000 --- a/src/gc_pcsaft/python/micelles.rs +++ /dev/null @@ -1,226 +0,0 @@ -#[macro_export] -macro_rules! impl_micelle_profile { - ($func:ty) => { - /// A one-dimensional profile of a spherical or cylindrical micelle. - #[pyclass(name = "MicelleProfile")] - pub struct PyMicelleProfile(MicelleProfile); - - impl_1d_profile!(PyMicelleProfile, [get_r]); - - #[pymethods] - impl PyMicelleProfile { - /// Crate an initial density profile of a spherical micelle. - /// - /// Parameters - /// ---------- - /// bulk: State - /// The bulk state in equilibrium with the micelle. - /// n_grid: int - /// The number of grid points. - /// width: SINumber - /// The width of the system. - /// initialization: {(float, float), SIArray2} - /// Either peak and width of an external potential used to initialize - /// the micelle or a density profile directly. - /// specification: (float, SINumber), optional - /// Excess number of surfactant molecules and pressure. If None, the - /// chemical potential of the system is fixed. - /// - /// Returns - /// ------- - /// MicelleProfile - /// - #[staticmethod] - #[pyo3(text_signature = "(bulk, n_grid, width, initialization, specification=None)")] - fn new_spherical( - bulk: PyState, - n_grid: usize, - width: PySINumber, - initialization: &PyAny, - specification: Option<&PyAny>, - ) -> PyResult { - let profile = MicelleProfile::new_spherical( - &bulk.0, - n_grid, - width.into(), - parse_micelle_initialization(initialization)?, - parse_micelle_specification(specification)?, - )?; - Ok(PyMicelleProfile(profile)) - } - - /// Crate an initial density profile of a cylindrical micelle. - /// - /// Parameters - /// ---------- - /// bulk: State - /// The bulk state in equilibrium with the micelle. - /// n_grid: int - /// The number of grid points. - /// width: SINumber - /// The width of the system. - /// initialization: {(float, float), SIArray2} - /// Either peak and width of an external potential used to initialize - /// the micelle or a density profile directly. - /// specification: (float, SINumber), optional - /// Excess number of surfactant molecules and pressure. If None, the - /// chemical potential of the system is fixed. - /// - /// Returns - /// ------- - /// MicelleProfile - /// - #[staticmethod] - #[pyo3(text_signature = "(bulk, n_grid, width, initialization, specification=None)")] - fn new_cylindrical( - bulk: PyState, - n_grid: usize, - width: PySINumber, - initialization: &PyAny, - specification: Option<&PyAny>, - ) -> PyResult { - let profile = MicelleProfile::new_cylindrical( - &bulk.0, - n_grid, - width.into(), - parse_micelle_initialization(initialization)?, - parse_micelle_specification(specification)?, - )?; - Ok(PyMicelleProfile(profile)) - } - - /// Create a new micelle profile with a given specification. - /// - /// Parameters - /// ---------- - /// delta_n_surfactant: float - /// Excess number of surfactant molecules. - /// pressure: SINumber - /// Pressure. - /// - fn update_specification(&self, delta_n_surfactant: f64, pressure: PySINumber) -> Self { - Self(self.0.update_specification(MicelleSpecification::Size { - delta_n_surfactant, - pressure: pressure.into(), - }), - ) - } - - /// Solve the micelle profile in-place. The first solver is used to solve - /// the initial problem including the external potential. After the external - /// potential is cleared, the second solver is used to calculate the result. - /// - /// Parameters - /// ---------- - /// solver1 : DFTSolver, optional - /// The first solver used to solve the profile. - /// solver2 : DFTSolver, optional - /// The second solver used to solve the profile. - /// debug: bool, optional - /// If True, do not check for convergence. - /// - /// Returns - /// ------- - /// MicelleProfile - /// - #[pyo3( - signature = (solver1=None, solver2=None, debug=false), - text_signature = "(solver1=None, solver2=None, debug=False)" - )] - fn solve_micelle( - slf: &PyCell, - solver1: Option, - solver2: Option, - debug: bool, - ) -> PyResult<&PyCell> { - slf.borrow_mut().0.solve_micelle_inplace( - solver1.map(|s| s.0).as_ref(), - solver2.map(|s| s.0).as_ref(), - debug, - )?; - Ok(slf) - } - } - - #[pymethods] - impl PyMicelleProfile { - #[getter] - fn get_delta_omega(&self) -> Option { - self.0.delta_omega.map(PySINumber::from) - } - - #[getter] - fn get_delta_n(&self) -> Option { - self.0.delta_n.clone().map(PySIArray1::from) - } - - /// Use the converged micelle to calculate the critical micelle for the given - /// temperature and pressure. - /// - /// Parameters - /// ---------- - /// solver : DFTSolver, optional - /// The solver used to solve the profile. - /// max_iter : int, optional - /// The maximum number of iterations of the Newton solver. - /// tol: float, optional - /// The tolerance of the Newton solver. - /// verbosity: Verbosity, optional - /// The verbosity of the Newton solver. - /// - /// Returns - /// ------- - /// MicelleProfileResult - /// - #[pyo3(text_signature = "(solver=None, max_iter=None, tol=None, verbosity=None)")] - fn critical_micelle( - &self, - solver: Option, - max_iter: Option, - tol: Option, - verbosity: Option, - ) -> PyResult { - Ok(Self(self.0.clone().critical_micelle( - solver.map(|s| s.0).as_ref(), - (max_iter, tol, verbosity).into(), - )?, - )) - } - } - - pub fn parse_micelle_initialization( - initialization: &PyAny, - ) -> PyResult> { - if let Ok((peak, width)) = initialization.extract::<(f64, f64)>() { - Ok(MicelleInitialization::ExternalPotential(peak, width)) - } else if let Ok(density) = initialization.extract::() { - Ok(MicelleInitialization::Density(density.into())) - } else { - Err(PyErr::new::(format!( - "`initialization` must be (peak, width) or an SIArray2 containing the initial densities." - ))) - } - } - - pub fn parse_micelle_specification( - specification: Option<&PyAny>, - ) -> PyResult> { - match specification { - Some(specification) => { - if let Ok((delta_n_surfactant, pressure)) = specification.extract::<(f64, PySINumber)>() - { - Ok(MicelleSpecification::Size { - delta_n_surfactant, - pressure: pressure.into(), - }) - } else { - Err(PyErr::new::(format!( - "`specification` must be (delta_n_surfactant, pressure) or None." - ))) - } - } - None => Ok(MicelleSpecification::ChemicalPotential), - } - } - }; -} diff --git a/src/gc_pcsaft/python/mod.rs b/src/gc_pcsaft/python/mod.rs deleted file mode 100644 index 8a7fd9ac2..000000000 --- a/src/gc_pcsaft/python/mod.rs +++ /dev/null @@ -1,187 +0,0 @@ -#[cfg(feature = "dft")] -use super::dft::GcPcSaftFunctionalParameters; -use super::eos::GcPcSaftEosParameters; -use super::record::GcPcSaftRecord; -use feos_core::parameter::{ - BinaryRecord, IdentifierOption, ParameterError, ParameterHetero, SegmentRecord, -}; -use feos_core::python::parameter::{ - PyBinarySegmentRecord, PyChemicalRecord, PyIdentifier, PySmartsRecord, -}; -use feos_core::{impl_json_handling, impl_parameter_from_segments, impl_segment_record}; -#[cfg(feature = "dft")] -use numpy::{PyArray2, ToPyArray}; -use pyo3::prelude::*; -use std::sync::Arc; - -#[cfg(feature = "micelles")] -mod micelles; - -#[pyclass(name = "GcPcSaftRecord")] -#[derive(Clone)] -pub struct PyGcPcSaftRecord(GcPcSaftRecord); - -#[pymethods] -impl PyGcPcSaftRecord { - #[new] - #[pyo3( - text_signature = "(m, sigma, epsilon_k, mu=None, kappa_ab=None, epsilon_k_ab=None, na=None, nb=None, nc=None, psi_dft=None)", - signature = (m, sigma, epsilon_k, mu=None, kappa_ab=None, epsilon_k_ab=None, na=None, nb=None, nc=None, psi_dft=None) - )] - #[expect(clippy::too_many_arguments)] - fn new( - m: f64, - sigma: f64, - epsilon_k: f64, - mu: Option, - kappa_ab: Option, - epsilon_k_ab: Option, - na: Option, - nb: Option, - nc: Option, - psi_dft: Option, - ) -> Self { - Self(GcPcSaftRecord::new( - m, - sigma, - epsilon_k, - mu, - kappa_ab, - epsilon_k_ab, - na, - nb, - nc, - psi_dft, - )) - } - - #[getter] - fn get_m(&self) -> f64 { - self.0.m - } - - #[getter] - fn get_sigma(&self) -> f64 { - self.0.sigma - } - - #[getter] - fn get_epsilon_k(&self) -> f64 { - self.0.epsilon_k - } - - #[getter] - fn get_mu(&self) -> Option { - self.0.mu - } - - #[getter] - fn get_kappa_ab(&self) -> Option { - self.0.association_record.map(|a| a.parameters.kappa_ab) - } - - #[getter] - fn get_epsilon_k_ab(&self) -> Option { - self.0.association_record.map(|a| a.parameters.epsilon_k_ab) - } - - #[getter] - fn get_na(&self) -> Option { - self.0.association_record.map(|a| a.na) - } - - #[getter] - fn get_nb(&self) -> Option { - self.0.association_record.map(|a| a.nb) - } - - #[getter] - fn get_nc(&self) -> Option { - self.0.association_record.map(|a| a.nc) - } - - fn __repr__(&self) -> PyResult { - Ok(self.0.to_string()) - } -} - -impl_json_handling!(PyGcPcSaftRecord); - -impl_segment_record!(GcPcSaftRecord, PyGcPcSaftRecord); - -#[pyclass(name = "GcPcSaftEosParameters")] -#[derive(Clone)] -pub struct PyGcPcSaftEosParameters(pub Arc); - -impl_parameter_from_segments!(GcPcSaftEosParameters, PyGcPcSaftEosParameters); - -#[pymethods] -impl PyGcPcSaftEosParameters { - fn phi(&self, phi: Vec) -> PyResult { - Ok(Self(Arc::new((*self.0).clone().phi(&phi)?))) - } - - fn _repr_markdown_(&self) -> String { - self.0.to_markdown() - } - - fn __repr__(&self) -> PyResult { - Ok(self.0.to_string()) - } -} - -#[cfg(feature = "dft")] -#[pyclass(name = "GcPcSaftFunctionalParameters")] -#[derive(Clone)] -pub struct PyGcPcSaftFunctionalParameters(pub Arc); - -#[cfg(feature = "dft")] -impl_parameter_from_segments!(GcPcSaftFunctionalParameters, PyGcPcSaftFunctionalParameters); - -#[cfg(feature = "dft")] -#[pymethods] -impl PyGcPcSaftFunctionalParameters { - // fn _repr_markdown_(&self) -> String { - // self.0.to_markdown() - // } - - #[getter] - fn get_graph(&self, py: Python) -> PyResult { - let fun: Py = PyModule::from_code( - py, - c"def f(s): - import graphviz - return graphviz.Source(s.replace('\\\\\"', ''))", - c"", - c"", - )? - .getattr("f")? - .into(); - fun.call1(py, (self.0.graph(),)) - } - - #[getter] - fn get_k_ij<'py>(&self, py: Python<'py>) -> Bound<'py, PyArray2> { - self.0.k_ij.view().to_pyarray(py) - } - - fn __repr__(&self) -> PyResult { - Ok(self.0.to_string()) - } -} - -#[pymodule] -pub fn gc_pcsaft(m: &Bound<'_, PyModule>) -> PyResult<()> { - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - #[cfg(feature = "dft")] - m.add_class::()?; - Ok(()) -} diff --git a/src/pcsaft/mod.rs b/src/pcsaft/mod.rs index 918301d7e..14a74f2a8 100644 --- a/src/pcsaft/mod.rs +++ b/src/pcsaft/mod.rs @@ -11,6 +11,3 @@ pub(crate) mod parameters; pub use dft::{PcSaftFunctional, PcSaftFunctionalContribution}; pub use eos::{DQVariants, PcSaft, PcSaftOptions}; pub use parameters::{PcSaftBinaryRecord, PcSaftParameters, PcSaftRecord}; - -#[cfg(feature = "python")] -pub mod python; diff --git a/src/pcsaft/parameters.rs b/src/pcsaft/parameters.rs index 3e2c9d473..06232e800 100644 --- a/src/pcsaft/parameters.rs +++ b/src/pcsaft/parameters.rs @@ -658,7 +658,7 @@ fn format_option(value: Option) -> String { #[cfg(test)] pub mod utils { use super::*; - use feos_core::parameter::{BinaryRecord, ChemicalRecord, SegmentRecord}; + use feos_core::parameter::{BinarySegmentRecord, ChemicalRecord, SegmentRecord}; use std::sync::Arc; pub fn propane_parameters() -> Arc { @@ -887,7 +887,7 @@ pub mod utils { let kij = [("CH3", "OH", -0.2), ("CH2", "OH", -0.1)]; let binary_segment_records = kij .iter() - .map(|&(id1, id2, k_ij)| BinaryRecord::new(id1.into(), id2.into(), k_ij)) + .map(|&(id1, id2, k_ij)| BinarySegmentRecord::new(id1.into(), id2.into(), k_ij)) .collect(); let params = PcSaftParameters::from_segments( vec![propane, ethanol], diff --git a/src/pcsaft/python.rs b/src/pcsaft/python.rs deleted file mode 100644 index 64dfbd32f..000000000 --- a/src/pcsaft/python.rs +++ /dev/null @@ -1,234 +0,0 @@ -use super::parameters::{PcSaftBinaryRecord, PcSaftParameters, PcSaftRecord}; -use super::DQVariants; -use feos_core::parameter::{ - BinaryRecord, Identifier, IdentifierOption, Parameter, ParameterError, PureRecord, - SegmentRecord, -}; -use feos_core::python::parameter::*; -use feos_core::*; -use numpy::{PyArray2, PyReadonlyArray2, ToPyArray}; -use pyo3::exceptions::PyTypeError; -use pyo3::prelude::*; -use std::convert::{TryFrom, TryInto}; -use std::sync::Arc; - -/// Pure-substance parameters for the PC-Saft equation of state. -/// -/// Parameters -/// ---------- -/// m : float -/// Segment number -/// sigma : float -/// Segment diameter in units of Angstrom. -/// epsilon_k : float -/// Energetic parameter in units of Kelvin. -/// mu : float, optional -/// Dipole moment in units of Debye. -/// q : float, optional -/// Quadrupole moment in units of Debye * Angstrom. -/// kappa_ab : float, optional -/// Association volume parameter. -/// epsilon_k_ab : float, optional -/// Association energy parameter in units of Kelvin. -/// na : float, optional -/// Number of association sites of type A. -/// nb : float, optional -/// Number of association sites of type B. -/// nc : float, optional -/// Number of association sites of type C. -/// viscosity : List[float], optional -/// Entropy-scaling parameters for viscosity. Defaults to `None`. -/// diffusion : List[float], optional -/// Entropy-scaling parameters for diffusion. Defaults to `None`. -/// thermal_conductivity : List[float], optional -/// Entropy-scaling parameters for thermal_conductivity. Defaults to `None`. -#[pyclass(name = "PcSaftRecord")] -#[derive(Clone)] -pub struct PyPcSaftRecord(PcSaftRecord); - -#[pymethods] -impl PyPcSaftRecord { - #[new] - #[pyo3( - text_signature = "(m, sigma, epsilon_k, mu=None, q=None, kappa_ab=None, epsilon_k_ab=None, na=None, nb=None, nc=None, viscosity=None, diffusion=None, thermal_conductivity=None)", - signature = (m, sigma, epsilon_k, mu=None, q=None, kappa_ab=None, epsilon_k_ab=None, na=None, nb=None, nc=None, viscosity=None, diffusion=None, thermal_conductivity=None) - )] - #[expect(clippy::too_many_arguments)] - fn new( - m: f64, - sigma: f64, - epsilon_k: f64, - mu: Option, - q: Option, - kappa_ab: Option, - epsilon_k_ab: Option, - na: Option, - nb: Option, - nc: Option, - viscosity: Option<[f64; 4]>, - diffusion: Option<[f64; 5]>, - thermal_conductivity: Option<[f64; 4]>, - ) -> Self { - Self(PcSaftRecord::new( - m, - sigma, - epsilon_k, - mu, - q, - kappa_ab, - epsilon_k_ab, - na, - nb, - nc, - viscosity, - diffusion, - thermal_conductivity, - )) - } - - #[getter] - fn get_m(&self) -> f64 { - self.0.m - } - - #[getter] - fn get_sigma(&self) -> f64 { - self.0.sigma - } - - #[getter] - fn get_epsilon_k(&self) -> f64 { - self.0.epsilon_k - } - - #[getter] - fn get_mu(&self) -> Option { - self.0.mu - } - - #[getter] - fn get_q(&self) -> Option { - self.0.q - } - - #[getter] - fn get_kappa_ab(&self) -> Option { - self.0 - .association_record - .and_then(|a| a.parameters.kappa_ab) - } - - #[getter] - fn get_epsilon_k_ab(&self) -> Option { - self.0 - .association_record - .and_then(|a| a.parameters.epsilon_k_ab) - } - - #[getter] - fn get_na(&self) -> Option { - self.0.association_record.map(|a| a.na) - } - - #[getter] - fn get_nb(&self) -> Option { - self.0.association_record.map(|a| a.nb) - } - - #[getter] - fn get_nc(&self) -> Option { - self.0.association_record.map(|a| a.nc) - } - - #[getter] - fn get_viscosity(&self) -> Option<[f64; 4]> { - self.0.viscosity - } - - #[getter] - fn get_diffusion(&self) -> Option<[f64; 5]> { - self.0.diffusion - } - - #[getter] - fn get_thermal_conductivity(&self) -> Option<[f64; 4]> { - self.0.thermal_conductivity - } - - fn __repr__(&self) -> PyResult { - Ok(self.0.to_string()) - } -} - -impl_json_handling!(PyPcSaftRecord); - -impl_pure_record!(PcSaftRecord, PyPcSaftRecord); -impl_segment_record!(PcSaftRecord, PyPcSaftRecord); - -/// Create a record for a binary interaction parameter. -#[pyclass(name = "PcSaftBinaryRecord")] -#[derive(Clone)] -pub struct PyPcSaftBinaryRecord(PcSaftBinaryRecord); - -#[pymethods] -impl PyPcSaftBinaryRecord { - #[new] - #[pyo3(text_signature = "(k_ij=None, kappa_ab=None, epsilon_k_ab=None)")] - #[pyo3(signature = (k_ij=None, kappa_ab=None, epsilon_k_ab=None))] - fn new(k_ij: Option, kappa_ab: Option, epsilon_k_ab: Option) -> Self { - Self(PcSaftBinaryRecord::new(k_ij, kappa_ab, epsilon_k_ab)) - } - - fn __repr__(&self) -> PyResult { - Ok(self.0.to_string()) - } -} - -impl_json_handling!(PyPcSaftBinaryRecord); - -impl_binary_record!(PcSaftBinaryRecord, PyPcSaftBinaryRecord); - -#[pyclass(name = "PcSaftParameters")] -#[derive(Clone)] -pub struct PyPcSaftParameters(pub Arc); - -impl_parameter!( - PcSaftParameters, - PyPcSaftParameters, - PyPcSaftRecord, - PyPcSaftBinaryRecord -); -impl_parameter_from_segments!(PcSaftParameters, PyPcSaftParameters); - -#[pymethods] -impl PyPcSaftParameters { - #[getter] - fn get_k_ij<'py>(&self, py: Python<'py>) -> Option>> { - self.0 - .binary_records - .as_ref() - .map(|br| br.map(|br| br.k_ij).view().to_pyarray(py)) - } - - fn _repr_markdown_(&self) -> String { - self.0.to_markdown() - } -} - -#[pymodule] -pub fn pcsaft(m: &Bound<'_, PyModule>) -> PyResult<()> { - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - Ok(()) -} diff --git a/src/pets/mod.rs b/src/pets/mod.rs index 92e0f1242..70a0c3439 100644 --- a/src/pets/mod.rs +++ b/src/pets/mod.rs @@ -15,6 +15,3 @@ mod parameters; pub use dft::{PetsFunctional, PetsFunctionalContribution}; pub use eos::{Pets, PetsOptions}; pub use parameters::{PetsBinaryRecord, PetsParameters, PetsRecord}; - -#[cfg(feature = "python")] -pub mod python; diff --git a/src/pets/python.rs b/src/pets/python.rs deleted file mode 100644 index 75a32dfbd..000000000 --- a/src/pets/python.rs +++ /dev/null @@ -1,256 +0,0 @@ -use super::parameters::*; -use feos_core::parameter::*; -use feos_core::python::parameter::*; -use feos_core::{impl_binary_record, impl_json_handling, impl_parameter, impl_pure_record}; -use numpy::prelude::*; -use numpy::{PyArray2, PyReadonlyArray2}; -use pyo3::exceptions::{PyTypeError, PyValueError}; -use pyo3::prelude::*; -use std::convert::{TryFrom, TryInto}; -use std::sync::Arc; - -/// Create a set of PeTS parameters from records. -#[pyclass(name = "PetsRecord")] -#[derive(Clone)] -pub struct PyPetsRecord(PetsRecord); - -#[pymethods] -impl PyPetsRecord { - #[new] - #[pyo3( - text_signature = "(sigma, epsilon_k, viscosity=None, diffusion=None, thermal_conductivity=None)", - signature = (sigma, epsilon_k, viscosity=None, diffusion=None, thermal_conductivity=None) - )] - fn new( - sigma: f64, - epsilon_k: f64, - viscosity: Option<[f64; 4]>, - diffusion: Option<[f64; 5]>, - thermal_conductivity: Option<[f64; 4]>, - ) -> Self { - Self(PetsRecord::new( - sigma, - epsilon_k, - viscosity, - diffusion, - thermal_conductivity, - )) - } - - #[getter] - fn get_sigma(&self) -> f64 { - self.0.sigma - } - - #[getter] - fn get_epsilon_k(&self) -> f64 { - self.0.epsilon_k - } - - #[getter] - fn get_viscosity(&self) -> Option<[f64; 4]> { - self.0.viscosity - } - - #[getter] - fn get_diffusion(&self) -> Option<[f64; 5]> { - self.0.diffusion - } - - #[getter] - fn get_thermal_conductivity(&self) -> Option<[f64; 4]> { - self.0.thermal_conductivity - } - - fn __repr__(&self) -> PyResult { - Ok(self.0.to_string()) - } -} - -impl_json_handling!(PyPetsRecord); -impl_pure_record!(PetsRecord, PyPetsRecord); - -/// Create a record for a binary interaction parameter, i.e. k_ij. -#[pyclass(name = "PetsBinaryRecord")] -#[derive(Clone)] -pub struct PyPetsBinaryRecord(PetsBinaryRecord); -impl_binary_record!(PetsBinaryRecord, PyPetsBinaryRecord); - -#[pyclass(name = "PetsParameters")] -#[derive(Clone)] -pub struct PyPetsParameters(pub Arc); - -#[pymethods] -impl PyPetsParameters { - // Create a set of PeTS parameters from lists. - /// - /// Parameters - /// ---------- - /// sigma : List[float] - /// PeTS segment diameter in units of Angstrom. - /// epsilon_k : List[float] - /// PeTS energy parameter in units of Kelvin. - /// k_ij: numpy.ndarray[float] - /// matrix of binary interaction parameters. - /// molarweight: List[float], optional - /// molar weight in units of Gram per Mol. - /// viscosity: List[List[float]], optional - /// entropy scaling parameters for viscosity. - /// diffusion: List[List[float]], optional - /// entropy scaling parameters for self-diffusion. - /// thermal_conductivity: List[List[float]], optional - /// entropy scaling parameters for thermal conductivity. - /// Returns - /// ------- - /// PetsParameters - #[pyo3( - text_signature = "(sigma, epsilon_k, k_ij=None, molarweight=None, viscosity=None, diffusion=None, thermal_conductivity=None)", - signature = (sigma, epsilon_k, k_ij=None, molarweight=None, viscosity=None, diffusion=None, thermal_conductivity=None) - )] - #[staticmethod] - fn from_lists( - sigma: Vec, - epsilon_k: Vec, - k_ij: Option<&Bound<'_, PyArray2>>, - molarweight: Option>, - viscosity: Option>, - diffusion: Option>, - thermal_conductivity: Option>, - ) -> PyResult { - // Check if all inputs have the same length - let n = sigma.len(); - let input_length = [ - Some(sigma.len()), - Some(epsilon_k.len()), - k_ij.as_ref().map(|v| v.shape()[0]), - k_ij.as_ref().map(|v| v.shape()[1]), - molarweight.as_ref().map(|v| v.len()), - viscosity.as_ref().map(|v| v.len()), - diffusion.as_ref().map(|v| v.len()), - thermal_conductivity.as_ref().map(|v| v.len()), - ] - .into_iter() - .flatten() - .all(|v| v == n); - - if !input_length { - return Err(PyValueError::new_err( - "shape of arguments could not be used together.", - )); - } - - // Define `PureRecord`s - let pure_records = (0..n) - .map(|i| { - let identifier = Identifier::new( - Some(format!("{}", i).as_str()), - None, - None, - None, - None, - None, - ); - let model_record = PetsRecord::new( - sigma[i], - epsilon_k[i], - viscosity.as_ref().map(|v| v[i]), - diffusion.as_ref().map(|v| v[i]), - thermal_conductivity.as_ref().map(|v| v[i]), - ); - PureRecord::new( - identifier, - molarweight.as_ref().map_or(1.0, |v| v[i]), - model_record, - ) - // Hier Ideal Gas anstatt None??? - }) - .collect(); - - let binary = k_ij.map(|v| v.to_owned_array().mapv(f64::into)); - - Ok(Self(Arc::new(PetsParameters::from_records( - pure_records, - binary, - )?))) - } - - // Create a set of PeTS parameters from values. - /// - /// Parameters - /// ---------- - /// sigma : float - /// PeTS segment diameter in units of Angstrom. - /// epsilon_k : float - /// PeTS energy parameter in units of Kelvin. - /// molarweight: float, optional - /// molar weight in units of Gram per Mol. - /// viscosity: List[float], optional - /// entropy scaling parameters for viscosity. - /// diffusion: List[float], optional - /// entropy scaling parameters for self-diffusion. - /// thermal_conductivity: List[float], optional - /// entropy scaling parameters for thermal conductivity. - /// Returns - /// ------- - /// PetsParameters - #[pyo3( - text_signature = "(sigma, epsilon_k, molarweight=None, viscosity=None, diffusion=None, thermal_conductivity=None)", - signature = (sigma, epsilon_k, molarweight=None, viscosity=None, diffusion=None, thermal_conductivity=None) - )] - #[staticmethod] - fn from_values( - sigma: f64, - epsilon_k: f64, - molarweight: Option, - viscosity: Option<[f64; 4]>, - diffusion: Option<[f64; 5]>, - thermal_conductivity: Option<[f64; 4]>, - ) -> PyResult { - let pure_record = PureRecord::new( - Identifier::new( - Some(format!("{}", 1).as_str()), - None, - None, - None, - None, - None, - ), - molarweight.map_or(1.0, |v| v), - PetsRecord::new(sigma, epsilon_k, viscosity, diffusion, thermal_conductivity), - ); - Ok(Self(Arc::new(PetsParameters::new_pure(pure_record)?))) - } - - #[getter] - fn get_k_ij<'py>(&self, py: Python<'py>) -> Option>> { - self.0.k_ij.as_ref().map(|k| k.view().to_pyarray(py)) - } - - fn _repr_markdown_(&self) -> String { - self.0.to_markdown() - } - - fn __repr__(&self) -> PyResult { - Ok(self.0.to_string()) - } -} - -impl_parameter!( - PetsParameters, - PyPetsParameters, - PyPetsRecord, - PyPetsBinaryRecord -); - -#[pymodule] -pub fn pets(m: &Bound<'_, PyModule>) -> PyResult<()> { - m.add_class::()?; - m.add_class::()?; - - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - Ok(()) -} diff --git a/src/python/cubic.rs b/src/python/cubic.rs deleted file mode 100644 index 93c7ee2af..000000000 --- a/src/python/cubic.rs +++ /dev/null @@ -1,15 +0,0 @@ -use feos_core::python::cubic::*; -use feos_core::python::parameter::{PyChemicalRecord, PyIdentifier}; -use pyo3::prelude::*; - -#[pymodule] -pub fn cubic(m: &Bound<'_, PyModule>) -> PyResult<()> { - m.add_class::()?; - m.add_class::()?; - - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - Ok(()) -} diff --git a/src/python/dft.rs b/src/python/dft.rs index 2d03735bf..8ddd5ee87 100644 --- a/src/python/dft.rs +++ b/src/python/dft.rs @@ -1,24 +1,21 @@ #[cfg(feature = "gc_pcsaft")] -use crate::gc_pcsaft::python::PyGcPcSaftFunctionalParameters; -#[cfg(feature = "gc_pcsaft")] use crate::gc_pcsaft::{GcPcSaftFunctional, GcPcSaftOptions}; use crate::hard_sphere::{FMTFunctional, FMTVersion}; use crate::ideal_gas::IdealGasModel; #[cfg(feature = "pcsaft")] -use crate::pcsaft::python::PyPcSaftParameters; -#[cfg(feature = "pcsaft")] use crate::pcsaft::{DQVariants, PcSaftFunctional, PcSaftOptions}; #[cfg(feature = "pets")] -use crate::pets::python::PyPetsParameters; -#[cfg(feature = "pets")] use crate::pets::{PetsFunctional, PetsOptions}; #[cfg(feature = "saftvrqmie")] -use crate::saftvrqmie::python::PySaftVRQMieParameters; -#[cfg(feature = "saftvrqmie")] use crate::saftvrqmie::{SaftVRQMieFunctional, SaftVRQMieOptions}; use crate::ResidualModel; use super::eos::{PyEquationOfState, PyPhaseEquilibrium, PyState, PyStateVec}; +use feos_core::parameter::ParameterError; +#[cfg(feature = "gc_pcsaft")] +use feos_core::python::parameter::PyGcParameters; +#[cfg(any(feature = "pcsaft", feature = "pets", feature = "saftvrqmie"))] +use feos_core::python::parameter::PyParameters; use feos_core::*; use feos_dft::adsorption::*; use feos_dft::interface::*; @@ -67,15 +64,13 @@ impl PyHelmholtzEnergyFunctional { text_signature = "(parameters, fmt_version, max_eta=0.5, max_iter_cross_assoc=50, tol_cross_assoc=1e-10, dq_variant)" )] fn pcsaft( - parameters: PyPcSaftParameters, + parameters: PyParameters, fmt_version: FMTVersion, max_eta: f64, max_iter_cross_assoc: usize, tol_cross_assoc: f64, dq_variant: DQVariants, - ) -> PyEquationOfState { - use super::eos::PyEquationOfState; - + ) -> Result { let options = PcSaftOptions { max_eta, max_iter_cross_assoc, @@ -83,10 +78,16 @@ impl PyHelmholtzEnergyFunctional { dq_variant, }; let func = Arc::new(ResidualModel::PcSaftFunctional( - PcSaftFunctional::with_options(parameters.0, fmt_version, options), + PcSaftFunctional::with_options( + Arc::new(parameters.try_convert()?), + fmt_version, + options, + ), )); let ideal_gas = Arc::new(IdealGasModel::NoModel(func.components())); - PyEquationOfState(Arc::new(EquationOfState::new(ideal_gas, func))) + Ok(PyEquationOfState(Arc::new(EquationOfState::new( + ideal_gas, func, + )))) } /// (heterosegmented) group contribution PC-SAFT Helmholtz energy functional. @@ -114,22 +115,28 @@ impl PyHelmholtzEnergyFunctional { text_signature = "(parameters, fmt_version, max_eta=0.5, max_iter_cross_assoc=50, tol_cross_assoc=1e-10)" )] fn gc_pcsaft( - parameters: PyGcPcSaftFunctionalParameters, + parameters: PyGcParameters, fmt_version: FMTVersion, max_eta: f64, max_iter_cross_assoc: usize, tol_cross_assoc: f64, - ) -> PyEquationOfState { + ) -> Result { let options = GcPcSaftOptions { max_eta, max_iter_cross_assoc, tol_cross_assoc, }; let func = Arc::new(ResidualModel::GcPcSaftFunctional( - GcPcSaftFunctional::with_options(parameters.0, fmt_version, options), + GcPcSaftFunctional::with_options( + Arc::new(parameters.try_convert_heterosegmented()?), + fmt_version, + options, + ), )); let ideal_gas = Arc::new(IdealGasModel::NoModel(func.components())); - PyEquationOfState(Arc::new(EquationOfState::new(ideal_gas, func))) + Ok(PyEquationOfState(Arc::new(EquationOfState::new( + ideal_gas, func, + )))) } /// PeTS Helmholtz energy functional without simplifications @@ -154,18 +161,20 @@ impl PyHelmholtzEnergyFunctional { text_signature = "(parameters, fmt_version, max_eta=0.5)" )] fn pets( - parameters: PyPetsParameters, + parameters: PyParameters, fmt_version: FMTVersion, max_eta: f64, - ) -> PyEquationOfState { + ) -> Result { let options = PetsOptions { max_eta }; let func = Arc::new(ResidualModel::PetsFunctional(PetsFunctional::with_options( - parameters.0, + Arc::new(parameters.try_convert()?), fmt_version, options, ))); let ideal_gas = Arc::new(IdealGasModel::NoModel(func.components())); - PyEquationOfState(Arc::new(EquationOfState::new(ideal_gas, func))) + Ok(PyEquationOfState(Arc::new(EquationOfState::new( + ideal_gas, func, + )))) } /// Helmholtz energy functional for hard sphere systems. @@ -181,13 +190,18 @@ impl PyHelmholtzEnergyFunctional { /// ------- /// HelmholtzEnergyFunctional #[staticmethod] - fn fmt(sigma: &Bound<'_, PyArray1>, fmt_version: FMTVersion) -> PyEquationOfState { + fn fmt( + sigma: &Bound<'_, PyArray1>, + fmt_version: FMTVersion, + ) -> Result { let func = Arc::new(ResidualModel::FmtFunctional(FMTFunctional::new( &sigma.to_owned_array(), fmt_version, ))); let ideal_gas = Arc::new(IdealGasModel::NoModel(func.components())); - PyEquationOfState(Arc::new(EquationOfState::new(ideal_gas, func))) + Ok(PyEquationOfState(Arc::new(EquationOfState::new( + ideal_gas, func, + )))) } /// SAFT-VRQ Mie Helmholtz energy functional. @@ -213,20 +227,26 @@ impl PyHelmholtzEnergyFunctional { text_signature = "(parameters, fmt_version, max_eta=0.5, inc_nonadd_term=True)" )] fn saftvrqmie( - parameters: PySaftVRQMieParameters, + parameters: PyParameters, fmt_version: FMTVersion, max_eta: f64, inc_nonadd_term: bool, - ) -> PyEquationOfState { + ) -> Result { let options = SaftVRQMieOptions { max_eta, inc_nonadd_term, }; let func = Arc::new(ResidualModel::SaftVRQMieFunctional( - SaftVRQMieFunctional::with_options(parameters.0, fmt_version, options), + SaftVRQMieFunctional::with_options( + Arc::new(parameters.try_convert()?), + fmt_version, + options, + ), )); let ideal_gas = Arc::new(IdealGasModel::NoModel(func.components())); - PyEquationOfState(Arc::new(EquationOfState::new(ideal_gas, func))) + Ok(PyEquationOfState(Arc::new(EquationOfState::new( + ideal_gas, func, + )))) } } diff --git a/src/python/dippr.rs b/src/python/dippr.rs deleted file mode 100644 index 37675ecb9..000000000 --- a/src/python/dippr.rs +++ /dev/null @@ -1,86 +0,0 @@ -use std::sync::Arc; - -use crate::ideal_gas::{Dippr, DipprRecord}; -use feos_core::parameter::*; -use feos_core::python::parameter::*; -use feos_core::{impl_json_handling, impl_parameter, impl_pure_record}; -use numpy::{PyArray2, PyReadonlyArray2, ToPyArray}; -use pyo3::exceptions::PyTypeError; -use pyo3::prelude::*; -use std::convert::{TryFrom, TryInto}; - -/// DIPPR ideal gas heat capacity parameters for a pure component. -#[pyclass(name = "DipprRecord")] -#[derive(Clone)] -pub struct PyDipprRecord(pub DipprRecord); - -#[pymethods] -impl PyDipprRecord { - /// Create a set of parameters for DIPPR eq. # 100. - /// - /// Parameters - /// ---------- - /// coefs : list[float] - /// Model parameters. - /// - /// Returns - /// ------- - /// DipprRecord - #[staticmethod] - fn eq100(coefs: Vec) -> Self { - Self(DipprRecord::eq100(&coefs)) - } - - /// Create a set of parameters for DIPPR eq. # 107. - /// - /// Parameters - /// ---------- - /// a-e : float - /// Model parameters. - /// - /// Returns - /// ------- - /// DipprRecord - #[staticmethod] - fn eq107(a: f64, b: f64, c: f64, d: f64, e: f64) -> Self { - Self(DipprRecord::eq107(a, b, c, d, e)) - } - - /// Create a set of parameters for DIPPR eq. # 127. - /// - /// Parameters - /// ---------- - /// a-g : float - /// Model parameters. - /// - /// Returns - /// ------- - /// DipprRecord - #[staticmethod] - fn eq127(a: f64, b: f64, c: f64, d: f64, e: f64, f: f64, g: f64) -> Self { - Self(DipprRecord::eq127(a, b, c, d, e, f, g)) - } - - fn __repr__(&self) -> PyResult { - Ok(self.0.to_string()) - } -} - -impl_json_handling!(PyDipprRecord); -impl_pure_record!(DipprRecord, PyDipprRecord); - -/// Ideal gas model based on DIPPR correlations. -#[pyclass(name = "Dippr")] -#[derive(Clone)] -pub struct PyDippr(pub Arc); - -impl_parameter!(Dippr, PyDippr, PyDipprRecord); - -#[pymodule] -pub fn dippr(m: &Bound<'_, PyModule>) -> PyResult<()> { - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::() -} diff --git a/src/python/eos.rs b/src/python/eos.rs index ea3e6cc77..f8d59fcac 100644 --- a/src/python/eos.rs +++ b/src/python/eos.rs @@ -1,12 +1,8 @@ #[cfg(feature = "epcsaft")] -use crate::epcsaft::python::PyElectrolytePcSaftParameters; -#[cfg(feature = "epcsaft")] use crate::epcsaft::{ElectrolytePcSaft, ElectrolytePcSaftOptions, ElectrolytePcSaftVariants}; #[cfg(feature = "estimator")] use crate::estimator::*; #[cfg(feature = "gc_pcsaft")] -use crate::gc_pcsaft::python::PyGcPcSaftEosParameters; -#[cfg(feature = "gc_pcsaft")] use crate::gc_pcsaft::{GcPcSaft, GcPcSaftOptions}; use crate::ideal_gas::IdealGasModel; #[cfg(feature = "estimator")] @@ -14,31 +10,20 @@ use crate::impl_estimator; #[cfg(all(feature = "estimator", feature = "pcsaft"))] use crate::impl_estimator_entropy_scaling; #[cfg(feature = "pcsaft")] -use crate::pcsaft::python::PyPcSaftParameters; -#[cfg(feature = "pcsaft")] use crate::pcsaft::{DQVariants, PcSaft, PcSaftOptions}; #[cfg(feature = "pets")] -use crate::pets::python::PyPetsParameters; -#[cfg(feature = "pets")] use crate::pets::{Pets, PetsOptions}; #[cfg(feature = "saftvrmie")] -use crate::saftvrmie::python::PySaftVRMieParameters; -#[cfg(feature = "saftvrmie")] use crate::saftvrmie::{SaftVRMie, SaftVRMieOptions}; #[cfg(feature = "saftvrqmie")] -use crate::saftvrqmie::python::PySaftVRQMieParameters; -#[cfg(feature = "saftvrqmie")] use crate::saftvrqmie::{SaftVRQMie, SaftVRQMieOptions}; #[cfg(feature = "uvtheory")] -use crate::uvtheory::python::PyUVTheoryParameters; -#[cfg(feature = "uvtheory")] use crate::uvtheory::{Perturbation, UVTheory, UVTheoryOptions}; use crate::ResidualModel; -use super::dippr::PyDippr; -use super::joback::PyJoback; use feos_core::cubic::PengRobinson; -use feos_core::python::cubic::PyPengRobinsonParameters; +use feos_core::parameter::ParameterError; +use feos_core::python::parameter::{PyGcParameters, PyParameters}; use feos_core::python::user_defined::{PyIdealGas, PyResidual}; use feos_core::*; use ndarray::{Array1, Array2}; @@ -71,7 +56,7 @@ impl PyEquationOfState { /// Maximum packing fraction. Defaults to 0.5. /// max_iter_cross_assoc : unsigned integer, optional /// Maximum number of iterations for cross association. Defaults to 50. - /// tol_cross_assoc : float + /// tol_cross_assoc : float, optional /// Tolerance for convergence of cross association. Defaults to 1e-10. /// dq_variant : DQVariants, optional /// Combination rule used in the dipole/quadrupole term. Defaults to 'DQVariants.DQ35' @@ -88,24 +73,31 @@ impl PyEquationOfState { text_signature = "(parameters, max_eta=0.5, max_iter_cross_assoc=50, tol_cross_assoc=1e-10, dq_variant)" )] pub fn pcsaft( - parameters: PyPcSaftParameters, + parameters: &Bound<'_, PyAny>, max_eta: f64, max_iter_cross_assoc: usize, tol_cross_assoc: f64, dq_variant: DQVariants, - ) -> Self { + ) -> Result { let options = PcSaftOptions { max_eta, max_iter_cross_assoc, tol_cross_assoc, dq_variant, }; + let parameters = if let Ok(parameters) = parameters.extract::() { + parameters.try_convert() + } else if let Ok(parameters) = parameters.extract::() { + parameters.try_convert_homosegmented() + } else { + todo!() + }?; let residual = Arc::new(ResidualModel::PcSaft(PcSaft::with_options( - parameters.0, + Arc::new(parameters), options, ))); let ideal_gas = Arc::new(IdealGasModel::NoModel(residual.components())); - Self(Arc::new(EquationOfState::new(ideal_gas, residual))) + Ok(Self(Arc::new(EquationOfState::new(ideal_gas, residual)))) } /// SAFT-VR Mie equation of state. @@ -133,22 +125,22 @@ impl PyEquationOfState { text_signature = "(parameters, max_eta=0.5, max_iter_cross_assoc=50, tol_cross_assoc=1e-10)" )] pub fn saftvrmie( - parameters: PySaftVRMieParameters, + parameters: PyParameters, max_eta: f64, max_iter_cross_assoc: usize, tol_cross_assoc: f64, - ) -> Self { + ) -> Result { let options = SaftVRMieOptions { max_eta, max_iter_cross_assoc, tol_cross_assoc, }; let residual = Arc::new(ResidualModel::SaftVRMie(SaftVRMie::with_options( - parameters.0, + Arc::new(parameters.try_convert()?), options, ))); let ideal_gas = Arc::new(IdealGasModel::NoModel(residual.components())); - Self(Arc::new(EquationOfState::new(ideal_gas, residual))) + Ok(Self(Arc::new(EquationOfState::new(ideal_gas, residual)))) } /// (heterosegmented) group contribution PC-SAFT equation of state. @@ -176,22 +168,22 @@ impl PyEquationOfState { text_signature = "(parameters, max_eta=0.5, max_iter_cross_assoc=50, tol_cross_assoc=1e-10)" )] pub fn gc_pcsaft( - parameters: PyGcPcSaftEosParameters, + parameters: PyGcParameters, max_eta: f64, max_iter_cross_assoc: usize, tol_cross_assoc: f64, - ) -> Self { + ) -> Result { let options = GcPcSaftOptions { max_eta, max_iter_cross_assoc, tol_cross_assoc, }; let residual = Arc::new(ResidualModel::GcPcSaft(GcPcSaft::with_options( - parameters.0, + Arc::new(parameters.try_convert_heterosegmented()?), options, ))); let ideal_gas = Arc::new(IdealGasModel::NoModel(residual.components())); - Self(Arc::new(EquationOfState::new(ideal_gas, residual))) + Ok(Self(Arc::new(EquationOfState::new(ideal_gas, residual)))) } /// ePC-SAFT equation of state. @@ -221,12 +213,12 @@ impl PyEquationOfState { text_signature = "(parameters, max_eta=0.5, max_iter_cross_assoc=50, tol_cross_assoc=1e-10, epcsaft_variant)", )] pub fn epcsaft( - parameters: PyElectrolytePcSaftParameters, + parameters: PyParameters, max_eta: f64, max_iter_cross_assoc: usize, tol_cross_assoc: f64, epcsaft_variant: ElectrolytePcSaftVariants, - ) -> Self { + ) -> Result { let options = ElectrolytePcSaftOptions { max_eta, max_iter_cross_assoc, @@ -234,10 +226,10 @@ impl PyEquationOfState { epcsaft_variant, }; let residual = Arc::new(ResidualModel::ElectrolytePcSaft( - ElectrolytePcSaft::with_options(parameters.0, options), + ElectrolytePcSaft::with_options(Arc::new(parameters.try_convert()?), options), )); let ideal_gas = Arc::new(IdealGasModel::NoModel(residual.components())); - Self(Arc::new(EquationOfState::new(ideal_gas, residual))) + Ok(Self(Arc::new(EquationOfState::new(ideal_gas, residual)))) } /// Peng-Robinson equation of state. @@ -253,10 +245,12 @@ impl PyEquationOfState { /// The PR equation of state that can be used to compute thermodynamic /// states. #[staticmethod] - pub fn peng_robinson(parameters: PyPengRobinsonParameters) -> Self { - let residual = Arc::new(ResidualModel::PengRobinson(PengRobinson::new(parameters.0))); + pub fn peng_robinson(parameters: PyParameters) -> Result { + let residual = Arc::new(ResidualModel::PengRobinson(PengRobinson::new(Arc::new( + parameters.try_convert()?, + )))); let ideal_gas = Arc::new(IdealGasModel::NoModel(residual.components())); - Self(Arc::new(EquationOfState::new(ideal_gas, residual))) + Ok(Self(Arc::new(EquationOfState::new(ideal_gas, residual)))) } /// Residual Helmholtz energy model from a Python class. @@ -294,14 +288,14 @@ impl PyEquationOfState { #[cfg(feature = "pets")] #[staticmethod] #[pyo3(signature = (parameters, max_eta=0.5), text_signature = "(parameters, max_eta=0.5)")] - fn pets(parameters: PyPetsParameters, max_eta: f64) -> Self { + fn pets(parameters: PyParameters, max_eta: f64) -> Result { let options = PetsOptions { max_eta }; let residual = Arc::new(ResidualModel::Pets(Pets::with_options( - parameters.0, + Arc::new(parameters.try_convert()?), options, ))); let ideal_gas = Arc::new(IdealGasModel::NoModel(residual.components())); - Self(Arc::new(EquationOfState::new(ideal_gas, residual))) + Ok(Self(Arc::new(EquationOfState::new(ideal_gas, residual)))) } /// UV-Theory equation of state. @@ -327,7 +321,7 @@ impl PyEquationOfState { text_signature = "(parameters, max_eta=0.5, perturbation)" )] fn uvtheory( - parameters: PyUVTheoryParameters, + parameters: PyParameters, max_eta: f64, perturbation: Perturbation, ) -> PyResult { @@ -336,7 +330,7 @@ impl PyEquationOfState { perturbation, }; let residual = Arc::new(ResidualModel::UVTheory(UVTheory::with_options( - parameters.0, + Arc::new(parameters.try_convert()?), options, ))); let ideal_gas = Arc::new(IdealGasModel::NoModel(residual.components())); @@ -365,17 +359,21 @@ impl PyEquationOfState { signature = (parameters, max_eta=0.5, inc_nonadd_term=true), text_signature = "(parameters, max_eta=0.5, inc_nonadd_term=True)" )] - fn saftvrqmie(parameters: PySaftVRQMieParameters, max_eta: f64, inc_nonadd_term: bool) -> Self { + fn saftvrqmie( + parameters: PyParameters, + max_eta: f64, + inc_nonadd_term: bool, + ) -> Result { let options = SaftVRQMieOptions { max_eta, inc_nonadd_term, }; let residual = Arc::new(ResidualModel::SaftVRQMie(SaftVRQMie::with_options( - parameters.0, + Arc::new(parameters.try_convert()?), options, ))); let ideal_gas = Arc::new(IdealGasModel::NoModel(residual.components())); - Self(Arc::new(EquationOfState::new(ideal_gas, residual))) + Ok(Self(Arc::new(EquationOfState::new(ideal_gas, residual)))) } /// Equation of state that only contains an ideal gas contribution. @@ -415,8 +413,10 @@ impl PyEquationOfState { /// Returns /// ------- /// EquationOfState - fn joback(&self, joback: PyJoback) -> Self { - self.add_ideal_gas(IdealGasModel::Joback(joback.0)) + fn joback(&self, joback: PyGcParameters) -> Result { + Ok(self.add_ideal_gas(IdealGasModel::Joback(Arc::new( + joback.try_convert_homosegmented()?, + )))) } /// Ideal gas model based on DIPPR equations for the ideal @@ -430,8 +430,8 @@ impl PyEquationOfState { /// Returns /// ------- /// EquationOfState - fn dippr(&self, dippr: PyDippr) -> Self { - self.add_ideal_gas(IdealGasModel::Dippr(dippr.0)) + fn dippr(&self, dippr: PyParameters) -> Result { + Ok(self.add_ideal_gas(IdealGasModel::Dippr(Arc::new(dippr.try_convert()?)))) } } diff --git a/src/python/joback.rs b/src/python/joback.rs deleted file mode 100644 index 682d927a6..000000000 --- a/src/python/joback.rs +++ /dev/null @@ -1,82 +0,0 @@ -use std::sync::Arc; - -use crate::ideal_gas::{Joback, JobackRecord}; -use feos_core::parameter::*; -use feos_core::python::parameter::*; -use feos_core::{ - impl_json_handling, impl_parameter, impl_parameter_from_segments, impl_pure_record, - impl_segment_record, -}; -use numpy::{PyArray2, PyReadonlyArray2, ToPyArray}; -use pyo3::exceptions::PyTypeError; -use pyo3::prelude::*; -use std::convert::{TryFrom, TryInto}; - -/// Create a set of Joback ideal gas heat capacity parameters -/// for a segment or a pure component. -/// -/// The fourth order coefficient `e` is not present in the -/// orginial publication by Joback and Reid but is required -/// for correlations for some pure components that are modeled -/// using the same polynomial approach. -/// -/// Parameters -/// ---------- -/// a : float -/// zeroth order coefficient -/// b : float -/// first order coefficient -/// c : float -/// second order coefficient -/// d : float -/// third order coefficient -/// e : float -/// fourth order coefficient -/// -/// Returns -/// ------- -/// JobackRecord -#[pyclass(name = "JobackRecord")] -#[derive(Clone)] -pub struct PyJobackRecord(pub JobackRecord); - -#[pymethods] -impl PyJobackRecord { - #[new] - fn new(a: f64, b: f64, c: f64, d: f64, e: f64) -> Self { - Self(JobackRecord::new(a, b, c, d, e)) - } - - fn __repr__(&self) -> PyResult { - Ok(self.0.to_string()) - } -} - -impl_json_handling!(PyJobackRecord); -impl_pure_record!(JobackRecord, PyJobackRecord); -impl_segment_record!(JobackRecord, PyJobackRecord); - -/// Ideal gas model based on the Joback & Reid GC method. -#[pyclass(name = "Joback")] -#[derive(Clone)] -pub struct PyJoback(pub Arc); - -impl_parameter!(Joback, PyJoback, PyJobackRecord); -impl_parameter_from_segments!(Joback, PyJoback); - -#[pymethods] -impl PyJoback { - // fn _repr_markdown_(&self) -> String { - // self.0.to_markdown() - // } -} - -#[pymodule] -pub fn joback(m: &Bound<'_, PyModule>) -> PyResult<()> { - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::() -} diff --git a/src/python/mod.rs b/src/python/mod.rs index 891383971..41ad2814c 100644 --- a/src/python/mod.rs +++ b/src/python/mod.rs @@ -1,30 +1,13 @@ -#[cfg(feature = "epcsaft")] -use crate::epcsaft::python::epcsaft as epcsaft_module; -#[cfg(feature = "gc_pcsaft")] -use crate::gc_pcsaft::python::gc_pcsaft as gc_pcsaft_module; -#[cfg(feature = "pcsaft")] -use crate::pcsaft::python::pcsaft as pcsaft_module; -#[cfg(feature = "pets")] -use crate::pets::python::pets as pets_module; -#[cfg(feature = "saftvrmie")] -use crate::saftvrmie::python::saftvrmie as saftvrmie_module; -#[cfg(feature = "saftvrqmie")] -use crate::saftvrqmie::python::saftvrqmie as saftvrqmie_module; -#[cfg(feature = "uvtheory")] -use crate::uvtheory::python::uvtheory as uvtheory_module; - +use feos_core::parameter::{BinarySegmentRecord, ChemicalRecord, Identifier, IdentifierOption}; +use feos_core::python::parameter::{ + PyBinaryRecord, PyGcParameters, PyParameters, PyPureRecord, PySegmentRecord, PySmartsRecord, +}; use pyo3::prelude::*; use pyo3::wrap_pymodule; use std::ffi::CString; -mod cubic; -mod dippr; mod eos; -mod joback; -use cubic::cubic as cubic_module; -use dippr::dippr as dippr_module; use eos::eos as eos_module; -use joback::joback as joback_module; #[cfg(feature = "dft")] mod dft; @@ -35,49 +18,27 @@ use dft::dft as dft_module; pub fn feos(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add("__version__", env!("CARGO_PKG_VERSION"))?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_wrapped(wrap_pymodule!(eos_module))?; #[cfg(feature = "dft")] m.add_wrapped(wrap_pymodule!(dft_module))?; - m.add_wrapped(wrap_pymodule!(joback_module))?; - m.add_wrapped(wrap_pymodule!(dippr_module))?; - m.add_wrapped(wrap_pymodule!(cubic_module))?; - #[cfg(feature = "pcsaft")] - m.add_wrapped(wrap_pymodule!(pcsaft_module))?; - #[cfg(feature = "epcsaft")] - m.add_wrapped(wrap_pymodule!(epcsaft_module))?; - #[cfg(feature = "gc_pcsaft")] - m.add_wrapped(wrap_pymodule!(gc_pcsaft_module))?; - #[cfg(feature = "pets")] - m.add_wrapped(wrap_pymodule!(pets_module))?; - #[cfg(feature = "uvtheory")] - m.add_wrapped(wrap_pymodule!(uvtheory_module))?; - #[cfg(feature = "saftvrqmie")] - m.add_wrapped(wrap_pymodule!(saftvrqmie_module))?; - #[cfg(feature = "saftvrmie")] - m.add_wrapped(wrap_pymodule!(saftvrmie_module))?; set_path(m, "feos.eos", "eos")?; #[cfg(feature = "estimator")] set_path(m, "feos.eos.estimator", "eos.estimator_eos")?; #[cfg(feature = "dft")] set_path(m, "feos.dft", "dft")?; - set_path(m, "feos.joback", "joback")?; - set_path(m, "feos.dippr", "dippr")?; - set_path(m, "feos.cubic", "cubic")?; - #[cfg(feature = "pcsaft")] - set_path(m, "feos.pcsaft", "pcsaft")?; - #[cfg(feature = "epcsaft")] - set_path(m, "feos.epcsaft", "epcsaft")?; - #[cfg(feature = "gc_pcsaft")] - set_path(m, "feos.gc_pcsaft", "gc_pcsaft")?; - #[cfg(feature = "pets")] - set_path(m, "feos.pets", "pets")?; - #[cfg(feature = "uvtheory")] - set_path(m, "feos.uvtheory", "uvtheory")?; - #[cfg(feature = "saftvrqmie")] - set_path(m, "feos.saftvrqmie", "saftvrqmie")?; - #[cfg(feature = "saftvrmie")] - set_path(m, "feos.saftvrmie", "saftvrmie")?; Ok(()) } diff --git a/src/saftvrmie/mod.rs b/src/saftvrmie/mod.rs index d50fb6ef1..e4fa7a3cc 100644 --- a/src/saftvrmie/mod.rs +++ b/src/saftvrmie/mod.rs @@ -6,6 +6,3 @@ pub(crate) mod parameters; pub use eos::{SaftVRMie, SaftVRMieOptions}; pub use parameters::{test_utils, SaftVRMieBinaryRecord, SaftVRMieParameters, SaftVRMieRecord}; - -#[cfg(feature = "python")] -pub mod python; diff --git a/src/saftvrmie/python.rs b/src/saftvrmie/python.rs deleted file mode 100644 index 91b770c95..000000000 --- a/src/saftvrmie/python.rs +++ /dev/null @@ -1,277 +0,0 @@ -use super::parameters::{SaftVRMieBinaryRecord, SaftVRMieParameters, SaftVRMieRecord}; -use feos_core::parameter::{ - BinaryRecord, Identifier, IdentifierOption, Parameter, ParameterError, PureRecord, -}; -use feos_core::python::parameter::*; -use feos_core::*; -use numpy::{PyArray2, PyReadonlyArray2, ToPyArray}; -use pyo3::exceptions::PyTypeError; -use pyo3::prelude::*; -use std::convert::{TryFrom, TryInto}; -use std::sync::Arc; - -use super::eos::association::AssociationRecord; -use feos_core::impl_json_handling; - -/// Pure component association parameters -#[pyclass(name = "SaftVRMieAssociationRecord")] -#[derive(Clone)] -pub struct PySaftVRMieAssociationRecord(pub AssociationRecord); - -#[pymethods] -impl PySaftVRMieAssociationRecord { - #[new] - #[pyo3(signature = (rc_ab, epsilon_k_ab, na=0.0, nb=0.0, nc=0.0))] - fn new(rc_ab: f64, epsilon_k_ab: f64, na: f64, nb: f64, nc: f64) -> Self { - Self(AssociationRecord::new(rc_ab, epsilon_k_ab, na, nb, nc)) - } - - #[getter] - fn get_rc_ab(&self) -> f64 { - self.0.rc_ab - } - - #[getter] - fn get_epsilon_k_ab(&self) -> f64 { - self.0.epsilon_k_ab - } - - #[getter] - fn get_na(&self) -> f64 { - self.0.na - } - - #[getter] - fn get_nb(&self) -> f64 { - self.0.nb - } - - #[getter] - fn get_nc(&self) -> f64 { - self.0.nc - } - - fn __repr__(&self) -> PyResult { - Ok(self.0.to_string()) - } -} - -impl_json_handling!(PySaftVRMieAssociationRecord); - -/// Pure-substance parameters for the SAFT VR Mie equation of state. -/// -/// Parameters -/// ---------- -/// m : float -/// Segment number -/// sigma : float -/// Segment diameter in units of Angstrom. -/// epsilon_k : float -/// Energetic parameter in units of Kelvin. -/// lr : float -/// Repulsive Mie exponent. -/// la : float -/// Attractive Mie exponent. -/// rc_ab : float, optional -/// Dimensionless association distance parameter (divided by sigma). -/// epsilon_k_ab : float, optional -/// Association energy parameter in units of Kelvin. -/// na : float, optional -/// Number of association sites of type A. -/// nb : float, optional -/// Number of association sites of type B. -/// nc : float, optional -/// Number of association sites of type C. -/// viscosity : List[float], optional -/// Entropy-scaling parameters for viscosity. Defaults to `None`. -/// diffusion : List[float], optional -/// Entropy-scaling parameters for diffusion. Defaults to `None`. -/// thermal_conductivity : List[float], optional -/// Entropy-scaling parameters for thermal_conductivity. Defaults to `None`. -#[pyclass(name = "SaftVRMieRecord")] -#[derive(Clone)] -pub struct PySaftVRMieRecord(SaftVRMieRecord); - -#[pymethods] -impl PySaftVRMieRecord { - #[new] - #[pyo3( - text_signature = "(m, sigma, epsilon_k, lr, la, rc_ab=None, epsilon_k_ab=None, na=None, nb=None, nc=None, viscosity=None, diffusion=None, thermal_conductivity=None)", - signature = (m, sigma, epsilon_k, lr, la, rc_ab=None, epsilon_k_ab=None, na=None, nb=None, nc=None, viscosity=None, diffusion=None, thermal_conductivity=None) - )] - #[expect(clippy::too_many_arguments)] - fn new( - m: f64, - sigma: f64, - epsilon_k: f64, - lr: f64, - la: f64, - rc_ab: Option, - epsilon_k_ab: Option, - na: Option, - nb: Option, - nc: Option, - viscosity: Option<[f64; 4]>, - diffusion: Option<[f64; 5]>, - thermal_conductivity: Option<[f64; 4]>, - ) -> Self { - Self(SaftVRMieRecord::new( - m, - sigma, - epsilon_k, - lr, - la, - rc_ab, - epsilon_k_ab, - na, - nb, - nc, - viscosity, - diffusion, - thermal_conductivity, - )) - } - - #[getter] - fn get_m(&self) -> f64 { - self.0.m - } - - #[getter] - fn get_sigma(&self) -> f64 { - self.0.sigma - } - - #[getter] - fn get_epsilon_k(&self) -> f64 { - self.0.epsilon_k - } - - #[getter] - fn get_lr(&self) -> f64 { - self.0.lr - } - - #[getter] - fn get_la(&self) -> f64 { - self.0.la - } - - #[getter] - fn get_rc_ab(&self) -> Option { - self.0.association_record.map(|a| a.rc_ab) - } - - #[getter] - fn get_epsilon_k_ab(&self) -> Option { - self.0.association_record.map(|a| a.epsilon_k_ab) - } - - #[getter] - fn get_na(&self) -> Option { - self.0.association_record.map(|a| a.na) - } - - #[getter] - fn get_nb(&self) -> Option { - self.0.association_record.map(|a| a.nb) - } - - #[getter] - fn get_nc(&self) -> Option { - self.0.association_record.map(|a| a.nc) - } - - #[getter] - fn get_viscosity(&self) -> Option<[f64; 4]> { - self.0.viscosity - } - - #[getter] - fn get_diffusion(&self) -> Option<[f64; 5]> { - self.0.diffusion - } - - #[getter] - fn get_thermal_conductivity(&self) -> Option<[f64; 4]> { - self.0.thermal_conductivity - } - - fn __repr__(&self) -> PyResult { - Ok(self.0.to_string()) - } -} - -impl_json_handling!(PySaftVRMieRecord); -impl_pure_record!(SaftVRMieRecord, PySaftVRMieRecord); - -/// Create a record for a binary interaction parameter. -#[pyclass(name = "SaftVRMieBinaryRecord")] -#[derive(Clone)] -pub struct PySaftVRMieBinaryRecord(SaftVRMieBinaryRecord); - -#[pymethods] -impl PySaftVRMieBinaryRecord { - #[new] - #[pyo3(text_signature = "(k_ij=None, gamma_ij=None, rc_ab=None, epsilon_k_ab=None)")] - #[pyo3(signature = (k_ij=None, gamma_ij=None, rc_ab=None, epsilon_k_ab=None))] - fn new( - k_ij: Option, - gamma_ij: Option, - rc_ab: Option, - epsilon_k_ab: Option, - ) -> Self { - Self(SaftVRMieBinaryRecord::new( - k_ij, - gamma_ij, - rc_ab, - epsilon_k_ab, - )) - } - - fn __repr__(&self) -> PyResult { - Ok(self.0.to_string()) - } -} - -impl_json_handling!(PySaftVRMieBinaryRecord); -impl_binary_record!(SaftVRMieBinaryRecord, PySaftVRMieBinaryRecord); - -#[pyclass(name = "SaftVRMieParameters")] -#[derive(Clone)] -pub struct PySaftVRMieParameters(pub Arc); - -impl_parameter!( - SaftVRMieParameters, - PySaftVRMieParameters, - PySaftVRMieRecord, - PySaftVRMieBinaryRecord -); - -#[pymethods] -impl PySaftVRMieParameters { - #[getter] - fn get_k_ij<'py>(&self, py: Python<'py>) -> Option>> { - self.0 - .binary_records - .as_ref() - .map(|br| br.map(|br| br.k_ij).view().to_pyarray(py)) - } - - fn _repr_markdown_(&self) -> String { - self.0.to_markdown() - } -} - -#[pymodule] -pub fn saftvrmie(m: &Bound<'_, PyModule>) -> PyResult<()> { - m.add_class::()?; - m.add_class::()?; - - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - Ok(()) -} diff --git a/src/saftvrqmie/mod.rs b/src/saftvrqmie/mod.rs index c6f89e521..b6562afb7 100644 --- a/src/saftvrqmie/mod.rs +++ b/src/saftvrqmie/mod.rs @@ -17,6 +17,3 @@ mod parameters; pub use dft::{SaftVRQMieFunctional, SaftVRQMieFunctionalContribution}; pub use eos::{FeynmanHibbsOrder, SaftVRQMie, SaftVRQMieOptions}; pub use parameters::{SaftVRQMieBinaryRecord, SaftVRQMieParameters, SaftVRQMieRecord}; - -#[cfg(feature = "python")] -pub mod python; diff --git a/src/saftvrqmie/python.rs b/src/saftvrqmie/python.rs deleted file mode 100644 index 470fa6198..000000000 --- a/src/saftvrqmie/python.rs +++ /dev/null @@ -1,353 +0,0 @@ -//! Python bindings for the SAFT-VRQ Mie equation of state. -use crate::saftvrqmie::eos::FeynmanHibbsOrder; -use crate::saftvrqmie::parameters::{ - SaftVRQMieBinaryRecord, SaftVRQMieParameters, SaftVRQMieRecord, -}; -use feos_core::parameter::{ - BinaryRecord, Identifier, IdentifierOption, Parameter, ParameterError, PureRecord, -}; -use feos_core::python::parameter::PyIdentifier; -use feos_core::*; -use ndarray::{Array1, Array2}; -use numpy::prelude::*; -use numpy::{PyArray1, PyArray2, PyReadonlyArray2}; -use pyo3::exceptions::{PyIOError, PyTypeError}; -use pyo3::prelude::*; -use quantity::{Area, Length, Temperature, AMU, ANGSTROM, KB, KELVIN, PLANCK}; -use std::convert::{TryFrom, TryInto}; -use std::sync::Arc; - -/// Pure-substance parameters for the Saft-VRQ Mie equation of state. -/// -/// Parameters -/// ---------- -/// m : float -/// Segment number -/// sigma : float -/// Structure parameter of the Mie potential in units of -/// Angstrom. -/// epsilon_k : float -/// Energetic parameter of the Mie potential in units of -/// Kelvin. -/// lr : float -/// Repulsive exponent of the Mie potential. -/// la : float -/// Attractive exponent of the Mie potential. -/// fh : int -/// Feynman-Hibbs order. One of {0, 1, 2}. -/// `fh = 0` disables quantum corrections so that effectively, -/// the SAFT-VR Mie equation of state is used. -/// viscosity : List[float], optional -/// Entropy-scaling parameters for viscosity. Defaults to `None`. -/// diffusion : List[float], optional -/// Entropy-scaling parameters for diffusion. Defaults to `None`. -/// thermal_conductivity : List[float], optional -/// Entropy-scaling parameters for thermal_conductivity. Defaults to `None`. -#[pyclass(name = "SaftVRQMieRecord")] -#[derive(Clone)] -pub struct PySaftVRQMieRecord(SaftVRQMieRecord); - -#[pymethods] -impl PySaftVRQMieRecord { - #[new] - #[pyo3( - text_signature = "(m, sigma, epsilon_k, lr, la, fh, viscosity=None, diffusion=None, thermal_conductivity=None)", - signature = (m, sigma, epsilon_k, lr, la, fh, viscosity=None, diffusion=None, thermal_conductivity=None) - )] - #[expect(clippy::too_many_arguments)] - fn new( - m: f64, - sigma: f64, - epsilon_k: f64, - lr: f64, - la: f64, - fh: usize, - viscosity: Option<[f64; 4]>, - diffusion: Option<[f64; 5]>, - thermal_conductivity: Option<[f64; 4]>, - ) -> PyResult { - Ok(Self(SaftVRQMieRecord::new( - m, - sigma, - epsilon_k, - lr, - la, - fh, - viscosity, - diffusion, - thermal_conductivity, - )?)) - } - - #[getter] - fn get_m(&self) -> f64 { - self.0.m - } - - #[getter] - fn get_sigma(&self) -> f64 { - self.0.sigma - } - - #[getter] - fn get_epsilon_k(&self) -> f64 { - self.0.epsilon_k - } - - #[getter] - fn get_lr(&self) -> f64 { - self.0.lr - } - - #[getter] - fn get_la(&self) -> f64 { - self.0.la - } - - #[getter] - fn get_viscosity(&self) -> Option<[f64; 4]> { - self.0.viscosity - } - - #[getter] - fn get_diffusion(&self) -> Option<[f64; 5]> { - self.0.diffusion - } - - #[getter] - fn get_thermal_conductivity(&self) -> Option<[f64; 4]> { - self.0.thermal_conductivity - } - - fn __repr__(&self) -> PyResult { - Ok(self.0.to_string()) - } -} - -/// Create a binary record from k_ij and l_ij values. -#[pyclass(name = "SaftVRQMieBinaryRecord")] -#[derive(Clone)] -pub struct PySaftVRQMieBinaryRecord(SaftVRQMieBinaryRecord); - -#[pymethods] -impl PySaftVRQMieBinaryRecord { - #[new] - #[pyo3(text_signature = "(k_ij, l_ij)")] - fn new(k_ij: f64, l_ij: f64) -> Self { - Self(SaftVRQMieBinaryRecord { k_ij, l_ij }) - } - - #[getter] - fn get_k_ij(&self) -> f64 { - self.0.k_ij - } - - #[getter] - fn get_l_ij(&self) -> f64 { - self.0.l_ij - } - - #[setter] - fn set_k_ij(&mut self, k_ij: f64) { - self.0.k_ij = k_ij - } - - #[setter] - fn set_l_ij(&mut self, l_ij: f64) { - self.0.l_ij = l_ij - } -} - -#[pyclass(name = "SaftVRQMieParameters")] -#[derive(Clone)] -pub struct PySaftVRQMieParameters(pub Arc); - -impl_json_handling!(PySaftVRQMieRecord); -impl_pure_record!(SaftVRQMieRecord, PySaftVRQMieRecord); -impl_binary_record!(SaftVRQMieBinaryRecord, PySaftVRQMieBinaryRecord); -impl_parameter!( - SaftVRQMieParameters, - PySaftVRQMieParameters, - PySaftVRQMieRecord, - PySaftVRQMieBinaryRecord -); - -#[pymethods] -impl PySaftVRQMieParameters { - #[getter] - fn get_k_ij<'py>(&self, py: Python<'py>) -> Bound<'py, PyArray2> { - self.0.k_ij.view().to_pyarray(py) - } - - #[getter] - fn get_l_ij<'py>(&self, py: Python<'py>) -> Bound<'py, PyArray2> { - self.0.l_ij.view().to_pyarray(py) - } - - /// Calculate effective sigma. - /// - /// Parameters - /// ---------- - /// temperature: SINumber - /// the temperature to evaluate - /// - /// Returns - /// ------- - /// PySIArray2 - fn sigma_eff(&self, temperature: Temperature) -> Length> { - let n = self.0.m.len(); - let t = temperature.to_reduced(); - let sigma_eff_ij = Array2::from_shape_fn((n, n), |(i, j)| -> f64 { - self.0.calc_sigma_eff_ij(i, j, t) - }); - sigma_eff_ij * ANGSTROM - } - - /// Calculate effective epsilon_k. - /// - /// Parameters - /// ---------- - /// temperature: SINumber - /// the temperature to evaluate - /// - /// Returns - /// ------- - /// PySIArray2 - fn epsilon_k_eff(&self, temperature: Temperature) -> Temperature> { - let n = self.0.m.len(); - let t = temperature.to_reduced(); - let epsilon_k_eff = Array2::from_shape_fn((n, n), |(i, j)| -> f64 { - self.0.calc_epsilon_k_eff_ij(i, j, t) - }); - epsilon_k_eff * KELVIN - } - - /// Calculate temperature dependent diameter. - /// - /// Parameters - /// ---------- - /// temperature: SINumber - /// the temperature to evaluate - /// - /// Returns - /// ------- - /// PySIArray2 - fn diameter(&self, temperature: Temperature) -> Length> { - let n = self.0.m.len(); - let t = temperature.to_reduced(); - let sigma_eff_ij = Array2::from_shape_fn((n, n), |(i, j)| -> f64 { - self.0.calc_sigma_eff_ij(i, j, t) - }); - let diameter = Array2::from_shape_fn((n, n), |(i, j)| -> f64 { - self.0.hs_diameter_ij(i, j, t, sigma_eff_ij[[i, j]]) - }); - diameter * ANGSTROM - } - - /// Calculate FH pre-factor D. - /// - /// Parameters - /// ---------- - /// temperature: SINumber - /// the temperature to evaluate - /// - /// Returns - /// ------- - /// PySIArray2 - fn quantum_d(&self, temperature: Temperature) -> Area> { - let n = self.0.m.len(); - let t = temperature.to_reduced(); - let quantum_d = - Array2::from_shape_fn((n, n), |(i, j)| -> f64 { self.0.quantum_d_ij(i, j, t) }); - quantum_d * (ANGSTROM * ANGSTROM) - } - - /// Calculate de Boer parameter. - /// - /// Returns - /// ------- - /// np.ndarray - #[getter] - fn de_boer<'py>(&self, py: Python<'py>) -> PyResult>> { - let n = self.0.m.len(); - Ok(Array1::from_shape_fn(n, |i| -> f64 { - (PLANCK - / (self.0.sigma[i] - * ANGSTROM - * (self.0.molarweight[0] * AMU * self.0.epsilon_k[0] * KELVIN * KB).sqrt())) - .into_value() - }) - .view() - .to_pyarray(py)) - } - - /// Generate energy and force tables to be used with LAMMPS' `pair_style table` command. - /// - /// Parameters - /// ---------- - /// temperature : SINumber - /// temperature at which the Feynman-Hibbs corrected Mie potential - /// is evaluated. - /// n : int - /// total number of points to calculate in the table between r_min and r_max. - /// r_min : SINumber - /// minimum distance (included) - /// r_max : SINumber - /// maximum distance (included) - /// - /// Raises - /// ------ - /// IOError - /// if there are issues with writing to a file. - /// - /// Notes - /// ----- - /// - /// For a given `temperature`, `n` values between `r_min` and `r_max` (both including) are tabulated. - /// - /// Files for all pure substances and all unique pairs are generated, - /// where filenames use either the "name" field of the identifier or the index if no name is present. - /// - /// Example - /// ------- - /// - /// For a hydrogen-neon mixture at 30 K, three files will be created. - /// - /// - "hydrogen_30K.table" for H-H interactions, - /// - "neon_30K.table" for Ne-Ne interactions, - /// - "hydrogen_neon_30K.table" for H-Ne interactions. - #[pyo3(text_signature = "($self, temperature, n, r_min, r_max)")] - fn lammps_tables( - &self, - temperature: Temperature, - n: usize, - r_min: Length, - r_max: Length, - ) -> PyResult<()> { - self.0 - .lammps_tables(temperature, n, r_min, r_max) - .map_err(PyIOError::new_err) - } - - fn _repr_markdown_(&self) -> String { - self.0.to_markdown() - } - - fn __repr__(&self) -> PyResult { - Ok(self.0.to_string()) - } -} - -#[pymodule] -pub fn saftvrqmie(m: &Bound<'_, PyModule>) -> PyResult<()> { - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - Ok(()) -} diff --git a/src/uvtheory/mod.rs b/src/uvtheory/mod.rs index 174238371..dc9c9f50f 100644 --- a/src/uvtheory/mod.rs +++ b/src/uvtheory/mod.rs @@ -68,6 +68,3 @@ mod parameters; pub use eos::{Perturbation, UVTheory, UVTheoryOptions}; pub use parameters::{UVTheoryBinaryRecord, UVTheoryParameters, UVTheoryRecord}; - -#[cfg(feature = "python")] -pub mod python; diff --git a/src/uvtheory/python.rs b/src/uvtheory/python.rs deleted file mode 100644 index d03a226a0..000000000 --- a/src/uvtheory/python.rs +++ /dev/null @@ -1,144 +0,0 @@ -use super::parameters::{NoRecord, UVTheoryBinaryRecord, UVTheoryParameters, UVTheoryRecord}; -use super::Perturbation; -use feos_core::parameter::{ - BinaryRecord, Identifier, IdentifierOption, Parameter, ParameterError, PureRecord, -}; -use feos_core::python::parameter::*; -use feos_core::*; -use numpy::{PyArray2, PyReadonlyArray2, ToPyArray}; -use pyo3::exceptions::PyTypeError; -use pyo3::prelude::*; -use std::convert::{TryFrom, TryInto}; -use std::sync::Arc; - -/// Create a set of UV Theory parameters from records. -#[pyclass(name = "NoRecord")] -#[derive(Clone)] -struct PyNoRecord(NoRecord); - -/// Create a set of UV Theory parameters from records. -#[pyclass(name = "UVTheoryRecord")] -#[derive(Clone)] -pub struct PyUVTheoryRecord(UVTheoryRecord); - -#[pymethods] -impl PyUVTheoryRecord { - #[new] - #[pyo3(text_signature = "(rep, att, sigma, epsilon_k)")] - fn new(rep: f64, att: f64, sigma: f64, epsilon_k: f64) -> Self { - Self(UVTheoryRecord::new(rep, att, sigma, epsilon_k)) - } - - fn __repr__(&self) -> PyResult { - Ok(self.0.to_string()) - } -} - -impl_json_handling!(PyUVTheoryRecord); - -#[pyclass(name = "UVTheoryBinaryRecord")] -#[derive(Clone)] -pub struct PyUVTheoryBinaryRecord(UVTheoryBinaryRecord); -impl_binary_record!(UVTheoryBinaryRecord, PyUVTheoryBinaryRecord); - -#[pyclass(name = "UVTheoryParameters")] -#[derive(Clone)] -pub struct PyUVTheoryParameters(pub Arc); - -#[pymethods] -impl PyUVTheoryParameters { - /// Create a set of UV Theory parameters from lists. - /// - /// Parameters - /// ---------- - /// rep : List[float] - /// repulsive exponents - /// att : List[float] - /// attractive exponents - /// sigma : List[float] - /// Mie diameter in units of Angstrom - /// epsilon_k : List[float] - /// Mie energy parameter in units of Kelvin - /// - /// Returns - /// ------- - /// UVTheoryParameters - #[pyo3(text_signature = "(rep, att, sigma, epsilon_k)")] - #[staticmethod] - fn from_lists( - rep: Vec, - att: Vec, - sigma: Vec, - epsilon_k: Vec, - ) -> PyResult { - let n = rep.len(); - let pure_records = (0..n) - .map(|i| { - let identifier = Identifier::new( - Some(format!("{}", i).as_str()), - None, - None, - None, - None, - None, - ); - let model_record = UVTheoryRecord::new(rep[i], att[i], sigma[i], epsilon_k[i]); - PureRecord::new(identifier, 1.0, model_record) - }) - .collect(); - Ok(Self(Arc::new(UVTheoryParameters::from_records( - pure_records, - None, - )?))) - } - - /// Create UV Theory parameters for pure substance. - /// - /// Parameters - /// ---------- - /// rep : float - /// repulsive exponents - /// att : float - /// attractive exponents - /// sigma : float - /// Mie diameter in units of Angstrom - /// epsilon_k : float - /// Mie energy parameter in units of Kelvin - /// - /// Returns - /// ------- - /// UVTheoryParameters - /// - /// # Info - /// - /// Molar weight is one. No ideal gas contribution is considered. - #[pyo3(text_signature = "(rep, att, sigma, epsilon_k)")] - #[staticmethod] - fn new_simple(rep: f64, att: f64, sigma: f64, epsilon_k: f64) -> PyResult { - Ok(Self(Arc::new(UVTheoryParameters::new_simple( - rep, att, sigma, epsilon_k, - )?))) - } -} - -impl_pure_record!(UVTheoryRecord, PyUVTheoryRecord); -impl_parameter!( - UVTheoryParameters, - PyUVTheoryParameters, - PyUVTheoryRecord, - PyUVTheoryBinaryRecord -); - -#[pymodule] -pub fn uvtheory(m: &Bound<'_, PyModule>) -> PyResult<()> { - m.add_class::()?; - m.add_class::()?; - - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - Ok(()) -}