From 1ee728c23a6059ca671783f0a455d8278b86408c Mon Sep 17 00:00:00 2001 From: Brandon Paul Date: Wed, 27 Oct 2021 11:31:23 -0700 Subject: [PATCH 01/40] ML_AI plugin first draft --- foqus_lib/framework/graph/node.py | 119 +++++++++++++++++- foqus_lib/framework/graph/nodeModelTypes.py | 1 + .../ml_ai_models/mea_column_model.h5 | Bin 0 -> 26512 bytes 3 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 foqus_lib/framework/ml_ai_models/mea_column_model.h5 diff --git a/foqus_lib/framework/graph/node.py b/foqus_lib/framework/graph/node.py index 2f6ba80df..8b711321e 100644 --- a/foqus_lib/framework/graph/node.py +++ b/foqus_lib/framework/graph/node.py @@ -28,6 +28,7 @@ import logging import traceback import re +from foqus_lib.framework.pymodel.pymodel import * from foqus_lib.framework.graph.nodeVars import * from foqus_lib.framework.graph.nodeModelTypes import nodeModelTypes from collections import OrderedDict @@ -41,7 +42,8 @@ class NodeOptionSets: NODE_OPTIONS = 1 TURBINE_OPTIONS = 2 SINTER_OPTIONS = 3 - PLUGIN_OPTONS = 4 + PLUGIN_OPTiONS = 4 + ML_AI_OPTIONS = 5 class PyCodeInterupt(Exception): @@ -80,6 +82,89 @@ def setCodeStrings(self): self.codeString[61] = "Unknow type string" +class pymodel_ml_ai(pymodel): + def __init__(self): + pymodel.__init__(self) + + # attempt to retrieve required information from loaded model, and set defaults otherwise + try: + inputs_labels = self.model.layers[1].input_labels + except: + input_labels = ['x' + str(i+1) for i in range(np.shape(self.model.layers[1].inputs[0])[1])] + try: + input_bounds = self.model.layers[1].input_bounds + input_min = [input_bounds[idx][0] for idx in input_bounds] + input_max = [input_bounds[idx][1] for idx in input_bounds] + except: + input_min = 0 * len(input_labels) + input_max = 1E5 * len(input_labels) + print("No input bound provided, using default min = 0 and max = 1E5 for all vars") + try: + output_labels = self.model.output_labels + except: + output_labels = ['z' + str(j+1) for j in range(np.shape(self.model.outputs[0])[1])] + + # attempt to retrieve optional information from loaded model, and set defaults otherwise + try: + input_defaults = self.model.input_defaults + except: + inputs_defaults = 0 * len(input_labels) + try: + output_defaults = self.model.output_defaults + except: + output_defaults = 0 * len(output_labels) + try: + input_desc = self.model.input_desc + except: + input_desc = ['input var ' + str(i+1) for i in range(len(input_labels))] + try: + output_desc = self.model.output_desc + except: + output_desc = ['output var ' + str(j+1) for i in range(len(output_labels))] + + for i in range(len(input_labels)): + self.inputs[input_labels[i]] = NodeVars( + value = input_default[i], + vmin = input_min[i], + vmax = input_max[i], + vdflt = 0.0, + unit = "", + vst = "pymodel", + vdesc = input_desc[i], + tags = [], + dtype = float) + for j in range(len(output_labels)): + self.outputs[output_labels[i]] = NodeVars( + value = output_default[i], + vmin = 0, + vmax = 1000000, + vdflt = 0.0, + unit = "", + vst = "pymodel", + vdesc = output_desc[i], + tags = [], + dtype = float) + + def run(self): + import numpy + import tensorflow.keras.models.load_model as load + inputs = [self.inputs[i].value for i in self.inputs] + print(inputs) + model = 'load(NN_model) or custom command(*args) to load NN model' + # set up input dictionary for NN surrogate + sim_parameter_dict = {self.inputs[i]: (self.inputs[i].value) for i in self.inputs} + # use model to simulate using user inputs and initial conditions (init_data) for 500 timesteps + out_dict = model.predict(sim_parameter_dict = sim_parameter_dict, + init_data = 'name of init data file', + timesteps = 500, + store_frames = False) + # set output to be value calculated at last timestep of surrogate simulation + output_var_list = [j for j in self.outputs] + output = [out_dict[var] for var in output_var_list] + for j in range(len(output_var_list)): + self.outputs[j].value = output[j] + + class Node: """ This class stores information for graph nodes. It also contains @@ -475,6 +560,17 @@ def setSim(self, newType=None, newModel=None, force=False, ids=None): desc=item["description"], optSet=NodeOptionSets.SINTER_OPTIONS, ) + elif self.modelType == nodeModelTypes.MODEL_ML_AI: + # link to pymodel class for ml/ai models + inst = pymodel_ml_ai() + # the node can have the pymodel instances variables since + # i'm not going to use the pymodel instance for anything + # else there is no need to copy them. I'll create a + # different instance for running the model. + for vkey, v in inst.inputs.items(): + self.gr.input[self.name][vkey] = v + for vkey, v in inst.outputs.items(): + self.gr.output[self.name][vkey] = v def upadteSCDefaults(self, outfile=None): if outfile is None: @@ -559,6 +655,8 @@ def runModel(self): self.runPymodelPlugin() elif self.modelType == nodeModelTypes.MODEL_TURBINE: self.runTurbineCalc(retry=self.options["Retry"].value) + elif self.modelType == nodeModelTypes.MODEL_ML_AI: + self.runPymodelMLAI() else: # This shouldn't happen from the GUI there should # be no way to select an unknown model type. @@ -945,3 +1043,22 @@ def killTurbineSession(self): logging.getLogger("foqus." + __name__).error( "Failed to kill session sid: {0} Exception: {1}".format(sid, str(e)) ) + + def runPymodelMLAI(self): + """ + Runs a Neural Network machine learning/artificial intelligence model. + """ + # create a python model instance if needed + if not self.pyModel: + self.pyModel = pymodel_ml_ai() + # set the instance inputs + for vkey, v in self.gr.input[self.name].items(): + if vkey in self.pyModel.inputs: + self.pyModel.inputs[vkey].value = v.value + # run the model + self.pyModel.setNode(self) + self.pyModel.run() + # set the node outputs + for vkey, v in self.gr.output[self.name].items(): + if vkey in self.pyModel.outputs: + v.value = self.pyModel.outputs[vkey].value diff --git a/foqus_lib/framework/graph/nodeModelTypes.py b/foqus_lib/framework/graph/nodeModelTypes.py index 4c2b78f12..457dc51b6 100644 --- a/foqus_lib/framework/graph/nodeModelTypes.py +++ b/foqus_lib/framework/graph/nodeModelTypes.py @@ -27,3 +27,4 @@ class nodeModelTypes: MODEL_TURBINE = 2 MODEL_DMF_LITE = 3 MODEL_DMF_SERV = 4 + MODEL_ML_AI = 5 diff --git a/foqus_lib/framework/ml_ai_models/mea_column_model.h5 b/foqus_lib/framework/ml_ai_models/mea_column_model.h5 new file mode 100644 index 0000000000000000000000000000000000000000..4ba83f0399f0a889c1a27b82c5fb9417d3686290 GIT binary patch literal 26512 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 Z`G0ezp}k!3yyQLjp8hKwD3u*-{2$WZI*9-P literal 0 HcmV?d00001 From 6ba10cfac69196063e6224ca74f74ea5c0ef0686 Mon Sep 17 00:00:00 2001 From: Brandon Paul Date: Thu, 28 Oct 2021 09:45:19 -0700 Subject: [PATCH 02/40] Updated init/run methods, updated nodePanel/Ui for new model type --- foqus_lib/framework/graph/node.py | 41 ++++++++++++------------- foqus_lib/gui/flowsheet/nodePanel.py | 11 +++++++ foqus_lib/gui/flowsheet/nodePanel_UI.ui | 5 +++ 3 files changed, 36 insertions(+), 21 deletions(-) diff --git a/foqus_lib/framework/graph/node.py b/foqus_lib/framework/graph/node.py index 8b711321e..a6a97cc29 100644 --- a/foqus_lib/framework/graph/node.py +++ b/foqus_lib/framework/graph/node.py @@ -24,6 +24,8 @@ import time import json import math +import numpy +from tensorflow.keras.models import load_model as load import subprocess import logging import traceback @@ -35,6 +37,7 @@ from foqus_lib.framework.foqusOptions.optionList import optionList from foqus_lib.framework.sim.turbineConfiguration import TurbineInterfaceEx from foqus_lib.framework.at_dict.at_dict import AtDict +from PyQt5.QtWidgets import QMessageBox class NodeOptionSets: @@ -85,6 +88,8 @@ def setCodeStrings(self): class pymodel_ml_ai(pymodel): def __init__(self): pymodel.__init__(self) + + self.model = load('../ml_ai_models/' + str(self.modelName) + '.h5') # attempt to retrieve required information from loaded model, and set defaults otherwise try: @@ -96,9 +101,13 @@ def __init__(self): input_min = [input_bounds[idx][0] for idx in input_bounds] input_max = [input_bounds[idx][1] for idx in input_bounds] except: - input_min = 0 * len(input_labels) - input_max = 1E5 * len(input_labels) - print("No input bound provided, using default min = 0 and max = 1E5 for all vars") + input_min = [0] * len(input_labels) + input_max = [1E5] * len(input_labels) + QMessageBox.warning( + self, + "No input bound provided or error in bound entries, ", + "using default min = 0 and max = 1E5 for all vars ", + "for model {0}").format(self.modelName) try: output_labels = self.model.output_labels except: @@ -108,11 +117,11 @@ def __init__(self): try: input_defaults = self.model.input_defaults except: - inputs_defaults = 0 * len(input_labels) + inputs_defaults = [0] * len(input_labels) try: output_defaults = self.model.output_defaults except: - output_defaults = 0 * len(output_labels) + output_defaults =[0] * len(output_labels) try: input_desc = self.model.input_desc except: @@ -137,7 +146,7 @@ def __init__(self): self.outputs[output_labels[i]] = NodeVars( value = output_default[i], vmin = 0, - vmax = 1000000, + vmax = 1E5, vdflt = 0.0, unit = "", vst = "pymodel", @@ -146,23 +155,13 @@ def __init__(self): dtype = float) def run(self): - import numpy - import tensorflow.keras.models.load_model as load + import numpy as np inputs = [self.inputs[i].value for i in self.inputs] print(inputs) - model = 'load(NN_model) or custom command(*args) to load NN model' - # set up input dictionary for NN surrogate - sim_parameter_dict = {self.inputs[i]: (self.inputs[i].value) for i in self.inputs} - # use model to simulate using user inputs and initial conditions (init_data) for 500 timesteps - out_dict = model.predict(sim_parameter_dict = sim_parameter_dict, - init_data = 'name of init data file', - timesteps = 500, - store_frames = False) - # set output to be value calculated at last timestep of surrogate simulation - output_var_list = [j for j in self.outputs] - output = [out_dict[var] for var in output_var_list] - for j in range(len(output_var_list)): - self.outputs[j].value = output[j] + # set output values to be generated from NN surrogate + outputs = self.model.predict(np.array(inputs, ndmin=2))[0] + for j in self.outputs: + self.outputs[j].value = outputs[j] class Node: diff --git a/foqus_lib/gui/flowsheet/nodePanel.py b/foqus_lib/gui/flowsheet/nodePanel.py index b61c2cb61..ed490788a 100644 --- a/foqus_lib/gui/flowsheet/nodePanel.py +++ b/foqus_lib/gui/flowsheet/nodePanel.py @@ -374,6 +374,9 @@ def getModelType(self): elif self.modelTypeBox.currentIndex()==2: # model type is plugin return nodeModelTypes.MODEL_PLUGIN + elif self.modelTypeBox.currentIndex()==5: + # model type is ml_ai + return nodeModelTypes.MODEL_ML_AI else: # this shouldn't be return nodeModelTypes.MODEL_NONE @@ -393,6 +396,8 @@ def updateModelType(self): self.modelTypeBox.setCurrentIndex(1) elif self.node.modelType == nodeModelTypes.MODEL_PLUGIN: self.modelTypeBox.setCurrentIndex(2) + elif self.node.modelType == nodeModelTypes.MODEL_ML_AI: + self.modelTypeBox.setCurrentIndex(5) self.updateSimulationList() def updateSimulationList(self): @@ -418,6 +423,12 @@ def updateSimulationList(self): self.simNameBox.addItems(sorted(sl,key=lambda s: s.lower())) elif self.modelTypeBox.currentIndex() == 2: # model type is plugin + sl = sorted( + list(self.dat.pymodels.ml_ai.keys()), # IS THIS LINE CORRECT? + key=lambda s: s.lower()) + self.simNameBox.addItems(sl) + elif self.modelTypeBox.currentIndex() == 5: + # model type is ml_ai sl = sorted( list(self.dat.pymodels.plugins.keys()), key=lambda s: s.lower()) diff --git a/foqus_lib/gui/flowsheet/nodePanel_UI.ui b/foqus_lib/gui/flowsheet/nodePanel_UI.ui index d4dbf5b35..81a1e7f5c 100644 --- a/foqus_lib/gui/flowsheet/nodePanel_UI.ui +++ b/foqus_lib/gui/flowsheet/nodePanel_UI.ui @@ -380,6 +380,11 @@ DMF Server + + + + ML_AI + From 5f4044ce4558ee075b03ce7dd34cffb9f0c6cc31 Mon Sep 17 00:00:00 2001 From: Brandon Paul Date: Fri, 29 Oct 2021 07:06:54 -0700 Subject: [PATCH 03/40] Fixed typing error --- foqus_lib/framework/graph/node.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/foqus_lib/framework/graph/node.py b/foqus_lib/framework/graph/node.py index a6a97cc29..a48c46352 100644 --- a/foqus_lib/framework/graph/node.py +++ b/foqus_lib/framework/graph/node.py @@ -45,7 +45,7 @@ class NodeOptionSets: NODE_OPTIONS = 1 TURBINE_OPTIONS = 2 SINTER_OPTIONS = 3 - PLUGIN_OPTiONS = 4 + PLUGIN_OPTIONS = 4 ML_AI_OPTIONS = 5 From 5c98bbcede126e5820f908f4307dfce700904c87 Mon Sep 17 00:00:00 2001 From: Brandon Paul Date: Fri, 29 Oct 2021 09:20:02 -0700 Subject: [PATCH 04/40] Updated nodePanel and session methods for pymodel search --- foqus_lib/framework/ml_ai_models/__init__.py | 0 .../ml_ai_models/mea_column_model.h5 | Bin 26512 -> 0 bytes .../framework/ml_ai_models/mlaiSearch.py | 65 ++++++++++++++++++ foqus_lib/framework/session/session.py | 24 ++++++- foqus_lib/gui/flowsheet/nodePanel.py | 4 +- 5 files changed, 89 insertions(+), 4 deletions(-) create mode 100644 foqus_lib/framework/ml_ai_models/__init__.py delete mode 100644 foqus_lib/framework/ml_ai_models/mea_column_model.h5 create mode 100644 foqus_lib/framework/ml_ai_models/mlaiSearch.py diff --git a/foqus_lib/framework/ml_ai_models/__init__.py b/foqus_lib/framework/ml_ai_models/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/foqus_lib/framework/ml_ai_models/mea_column_model.h5 b/foqus_lib/framework/ml_ai_models/mea_column_model.h5 deleted file mode 100644 index 4ba83f0399f0a889c1a27b82c5fb9417d3686290..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26512 zcmeHv3s_BC*YN7TyXrXUbR3s0w~%Zps=daNOT>wi5Tf0UqMPn=IU6ClCAVBk5|R*w zYOk?u6saUhLI@#*kR-{sc6;x0=)B(Zz3=z`-}nFDv7Y_xx#pZ>jXCC+V~jc0m~+iF zwxh>rYjoBiBo~K6C=mZmC7ZxjeMLQ-cSE7z6b z=PF4Hyk!qMIoj9|ETkO2Je586I|4bL-^;(>{4F?OYcs+@(ottwZ+Wt`KqhChEa4a6 z>E-Jh?&UMrJ0zGb3JrG^au_y z-z&&1*fq>6DA*^!pDq7cL80wQi8e{w;K1r%J4{7@dsVnZFr>o@CfjqGKT%llJ<6jE9-x~ z>er0$2n`Mi@N@NbTj&)esqyg-3=MG|{JUMS_!|5#b8RMwsr;Vsi^EmnUF zh_(h@{oVY$B-Tk{C%&PNto@K&a`Prn+tfj(Pm(6IBtWvf#HPsSSKFT@6$FtXO}_a* zc9gwcTT2pyz+Tc;38KwDv3XMya}yq$%G;MZ3Iq}2@? zMTQ=}Zo$EAJvFrA8jcC|_XuH4qnodxG1pLPJlOI@h7wjt0NMh@GV(oCayM=goyGn;J*xM~of^epPsIRXvcjzn@rDw>(wlYJOUbm1Trjo~l1Komx zC4h6>e1pB%f*`lKbGyc zQPSiebwQ5!OSzPg*=BFu+nOB@ptw1@$~faXQ2j5$aMAh3JnVIm(VkW z$74&Ra_8m|!j>2YdHIG)kO#0LFDnZ6nd=we<0&bX_Se_V-OIPFKZaw*j+@9enm>1t zcThhGfF$oa%HDLsh{==3IF1-4DVuC>H`QjM)7OBLogBwGIM_J4Iyl-)o;=0ThQ;FG z)`mj{KVrhTi8iC`Cw_^8#cXFkV)VF)V+|#P#}X+~%`fO-0Y;5*aANVXxTQ}zj^-Lo z7(ZzKTrOMLukAT$H`>NV(v3x5cY_rWQy$OMgl9Qqu=!A9uBoNvFcWig-Vn>dl1Bg3 zMHZfCGI-b!Q?p^lT%L(3&(dO;xdigh9cMw!%uRVF<`%pmLrqx`w6wG^89Iz-YA$`? z8%$vz8*ITd;h7IHAIi2d*wWI(!jdJ+^ov&hU{@PGrWS(-54M!hGsMht=-?q=Kz_kQ zDd{|(`7rY~(pk!RgJ&&S!V>>2sr!>m&zva}i^1$*v+~6L7A=`IYt|A;lX8J!6|+rX z+QZJ00R29Ue?Ya9bqQJ)G#I=f)Gf%%^Y`}J_$PH~+0s8cF12um62{2ATb5{9=^u{o7smE$n>=~!XbC63 zsFyQFR^#jC7S!hK1-XSt3=k`wJWJ^{Y}imU3sZ9oR=y2Ay*%6&N~K zdx5`KaEMn>Kp0!lW^0#7hFCtow9Q}a_hG-YtIY4;!CAM^#Z zY~E&{`8NJ9sUZk$8Gbok>8_hnpJidGibX*UoGY*b1zcJlF*$Bl??Qb4f`{;%S#!X8pU zx%|i;`=0zwIM6=cDwijLEDkScL;LqTx!tgq1N@6=d%M*nd-0Ov<#v`Lv~IT^AheT~ z%i#nwrTJ7@`M*fU|M%eXxOIDeX%W$~xV2;*$$*fCAN~kj|5e;t9>0;NZST1#ck7uQ`u2Gx)`Cc?e&BX*^M43}OZ>zke)>(uCl%IGOX?LBr3g7Pi=(7q)K3b+{mS$0 zD6{O6XLuVIx)JPtfd9@*E?089XlwJ&TbJ9t(mwwj?(bGx^`n zcusnQ))|`oN50BTq~QYeo_&aHoY;yRP9;OL+jWd};n1m(nLzY3BdsEC$1DDzXPS+-aVDn*c za=!$%OYYGqQejFDea0sZ)p)`v4#Ed*#ONJAL0;k>y7wn-s%-6fm{IW*TJ-?6&Z#qX zH=^Kybqy#hp9N0;ZMZ59(5o;J17jAFYlLc4_4A2z&j?K_WW`)KfKTDTbzfx4Z-VoA z7Z9eN$aP}-K;KwND;&_EoR<_}$@8sPi1FzEc`}aNYmCoKYT$0vN4TS~7VRS9(E+#I~HFdf80S7RQN2}`E7Vhd>i6&{aR zUd89uDVN~cQY|Vi=o(m8m($kKqsT~?d!TjkDH=F+M-A&MpeE3wgpD8)&E!x9;yqY& zokOj=dI$P{egQgr!%&!i9=5$~hDiwuRPj;`X1?xeOgY;LD;@5DR<knXP z9|yK(tFfxLCiD115pv5EnGf@HsA_jh+SyG={>r3cl~FY$=P$xb1D>PqDK}_I{7CB( z3&3RTV@w}VKs)-hV#ANSKr!GA7_L-AFU17B*svCp`i-Tz%E%||CXlsh(X?0nO{_GI zf?f8jk^6w6g=d?scv?Rr(bOx~y!Ip#??rsYO(Iau%!Q7EWE^?yHO91F#iOPtprb|; z=XE9`Tu!YJ^%Yo3?ljD#u2QTkmfipB!nG@v?pd~{S3k+02 zU-dQ){-Fq?Th4-DcPTB-RfP#}^0C0r2&z?IimYwL zRgjH}+tZ=?o)sD_K2C<%%!H`$xAdwpJusd-6NGy-7_Ganuy)i0xBT?w1C|Vhqjb%6AqW+6fm^`*S23mFmpIfR-Y?qBt-SsvYgx2AO)8$xv|7Yks zQjHP*GEk(w?JUl|?}d%43qfx$A1iJfVP)Mxpnr0QV?NE8bmu*q3@!xW)e2Fs@fXp1 zN(LF*F#wFu=F=?+r!ncs3dr*LgmFzf!0spoAy$p3c5Mf$4c(8I9}(1&eVeg(Z7NJM zUX4=*)?ve3UCg)9pt4seGQxaSY;{05HuFQLZ77wnH^K+JCMur%A#csuz&NoqYbsY3xrNlHigyQiv zFL6P>5~XwZIV(Hc>Ef$%k&~Vc+#B(8+PoDlUPsc&e$U{?l*?$bu8gEd7Qz+{J2;rEMu~TG_+j^auyth%#8+*F zpH#Cj&N2}%_}u}G-C6L)ZV6uB`T{>JX6?$(dMl%e7l7XTiPr0)&FFM?#O}kCDB41V z4}uxY%A5{%(^9}`Oe-xWBk{n}6|mYrJf5`)h+!=xbBBYS-#R1Hs|vjxBOpzmwZqH-NU_}u%WLmo;XWOvWkg3L zg|XoN;0_v%=>;*u4=`XF!Q_R`1tKQR())%7=uMA>8$~Kq?P@Ea68AvzgN+d3Cc;}z zt6=yqsubPL1e>F^nDO;lP!});GQ1t3@kj#*N`{lMw_npr3o|jb!%GyOFN37APGC$Z z!YWsNjP>Y43vM4o?%46b)iS1Id+wt%4RVpt^`?cL-t$MQDlxWGqG_tzI!yL?41}8_ zJ^K1@P(0unCaD+T;d7tyZh8bNdl|#Am0DEw)iQ|98HY=a9$=$k3!GEBh}))qLV8Xy zqkvKTks^Z!eR4pn&-Q08_ zPF*MUe|-b1lv{8^wJFA%HKS7;tLus@L}eR9P~bKRFHlXO5s-xOH8xOtLY2`CSwqGu z=8|HKGX68II?$aM16pG>V8e`B7;j{WeUkTscz~Ep8Mz3&6QWRK(oNv@aK~Opn&^n| z6!J*}hpLas18380;H~r^ug=w?qLw5;^-(c@PSqSt8e0lOtuJ8-o&#avYceTc52h_p zqnL~vs1tl2Hkcnq-Vr67ct{8PY76n_4zH1zD4>a+JIDpc#7JDAEz@}$>Ex$DSiuiL z=kN;<`fCN2PmckWOoH+Nb;jQ~8jPavl7q@`Ao=;atoGT-tvPSZ@d> zg#*+{vk!YAg*gJ*Zx+$__oz@=eS<-3hz?^nv;^a?k#ND_5%^Bk#}l2?(R!dVG#>sL zQ|H_voBMXf<+&>`J?SI}J;Oyaeq9YrW*pA(Z3W?sC;XQ)PlGTlQ1k!~Lfme|io?@! zWUelz6gz>yAP*uNHpAUzLbQlkfoE(5xa>RbQ+Ej<0 z8r0CTEwE+&4LW0?ANDG@2cf$b`(E|QP!YoPF_ zL?93G&^)>lD|RU|Q|kRpv$!n;i>I+aJi~To9XYqbAqq{zRDxnCiBd)^p9&xxeUxQNBio;HUTGXh4r8p_0 z9xY5?;H7X@K7Lcjg4EtHdeI&nZlFz#tE$IdL&CA@A&tFG2;k_j)iCAxMl7`%N>{Lc zSZ-1oZg{pII0_A+BpXtz$`D5DAoyd|?y5g`A4Q{J5;;U=; zvGewk8gC1*?ovK<>-Gp53{>$=gE}+*V+(NCra!JM41?+KAjUt)~$uS+@ z!0v%vKyW3F4im3IBb!_>^1F#HNg_BOx(w?Uy~hRKI!y238q~Rm<&dcK9;UiIfT0iE zFb3)%aY8c?!m!-gw@ffLQxA&oghNK;L2&qO3aR@+gkeGV@PK1D#x@M6J)fyy7|$Q) z*|L2dn}M?jl|YI>NcZYyy~0;73xka2z&4Bes5IG`^sA5ja|UF`Ys1!A(pavjQL z@*vPZt$7xcyV46vC#c6c>@MA!9m~187slX7gJ3;KKnHX=; z1GpnbV5MC=9n?P(g{{N+Nf&crr)>?0`#j+{FIa=y7C!+&ajt0jx&7Ff6@s-lTS&oK zI}&#>m_F(dHg;@;HxGwm@o{T-=1HN$4li=6_BrIWZl>(gl$t3Ve9L3yWki|)KHE_v^&aq*GSMwzGdfQyr$@zesH4Ai#wblSa0xm? zp9o8Y9Yz|Ijz%%ORD1%O#t*P&BMD6wJLyd|9LC~J8L3f7B2gciQ_-my*Jr3x>+}pT zaM65va(5pVKBtbS^bspCGP z?}ATstieZ|8a@Y2Y!5@#U}ZQq`Wi;Nx4gYA zpRd8;UA3rHRvWO?P6;=N?IO+pIIw* z`JoG>PumWO-8hW;iz4jj^bsBGIOG%E?KtC8G+cXFgIeR#0JkP!gX>+eo3ahEw|$_K z=IfHNowDe%7=q#4Fvd4|w^1V?AGS=pfXhdJ1m*tDz`6IHu6}Z!=Gi|YnZ>W6`UgZO z6&>i?Tbpt?K9Y2C8-&l^XM*dawa8sjK+e$n4BTr`XfsKNQ4M(mJa2WnY>Bamx{V)B}&P^rBPcD}!ec1tgU@6uo3X{ru&F0dzB zjXsW74sa+=VIH|Ok+sPK*3xAQRWZ+HJ>92d4jS1XqU$+Z$)Ms`%zge6mhumSwTBXn zyqAxyy_InEsrfL-?>5GckHe6+>#%U_7AVQwjW2hlVF%}PXsEagicczGpkM{&MgR`W zAt>i`D>OSW5X5ewqVyp@LVc+#>lbf?x}AN&S-cv?MBe~nkeAi7pS_V;@(>(Or$fB= z12SStZ%ACZ5gy(qsMz0ZKy^qyra$>aZz|Mex|zL3b>C?0y5Tztied$MKry^LyZe_Fu)e|Hch>?cs}Xm<=>V@!>o8pZOQK`fW>hbt2W7 z)*VkFWZq8D?Ye?YE&K^G7Lg>UzK9%ikoDnJt3a`TPjv5)2OFNwLnf{PjZPdOD=)`D zqwg^^FiuB+MH%V-mO68B>siU;-~1Dm+C(1TC%Mh4=%&hOAW zzz&>I_NhKO|{W(8Ux4@7tJN_29Col4OUGz!b zSuxq5*i1L*Jiykj&tRU=9~bp*#d)mlJg=OH)S0bF`<2jD3AW&HX*g}|W)7wc_rlR5 z8Q5{Q6555jqTw(1SU*ISdG|?&Qh2LQF+-lin54&8cESYryHdXc}? zeNasuhkDO6FhA!c>JA@?S&@@~TcW}ce#h|Sz3WI%I1N9&%0%tSs+5yBA5P^eqp!kV zsP2@*ul7nKms?)~XUi?5`0fJ88aNcrnk!P*)gPnhLR~bgQN=Tg3Kai|Dr0@$gzvqq z9J09On4SER3@|u{v9pz#lBy)EFqn?(2KRv^{qdwr;z98ItqRlKr=!rUBzN!N4$Qee zn?UgB7(Hjfdk_rmMMhaK14?`X2%=Rq$95ZR8778vp~E6%Zgz8X2zco$j|(V~pwc4StLG2H54iQ;9=qH{$DuuEbA_P@`@v&I{N z^TBPTioFnPy_K1WX#WmWhWc8_9#e#! z4pyThZpL*>57Au;CP8d5O>458Icbh@;VX&y3L@sZm}#@m6_{DXA!tP1q%!C^dYvp~P} z5>gv(VD0f-$g1UlhS^6X_Pi7&)sCh6FQ&n2$ra!w3__vN7QR!bv3U2{4kUItgHngawpg}wHf`QSwD?)o~+7HXN2>jX`)VvAGkP@ zT$N>yVo?UUc$+D5e{Cka=v;$7OH&|b_hL-jcoepWXfmenj=|4DO{)3TUOXxsk0$yE z0cmPf-JVml$>>GMjNXl^!HU z-uz9Ny)*~*c*kPX!yRO5$q`Kb@Ce14i$zb55lqTd6Sy)x3!_J!h66RFu=>>sw9+?2 z;z4=t?Tfi+y;p(sy%7#~tFD8K;s7+vI|&vF1P0E{Bn^JtOV3*yip~qGF>n@#$xP6s zCi^NnPp<=)X zHbxakJ8%CL)~R;|>mG?B!GZI*ZeR&mbYo-T0YlNJuMTDOSOaT*tfZ^+UXhEhM4{ri z%^>DI<4>~Li$wSptHgtiP|Uf4PPQJ97MFrVd~bf-<2BH4tq}EgsW7H9OW@EF1uaiEp!XlplqM1GE7q;I1L3fn>h~5p00=Nm_%Ao5l@P_&iwMYXmCmF3_+`g zp#Jn%$QYDBKc)&B$(JN$sQ+kXL0>t59BwH31W&jx23Md0-*BhQ)Vq4H8CMq6bW zI&U_HhnHiK=W!h~YV%0lv2|p~^9yvm5f7|mV}O2m0L*4RX5*oHv}zR_Czx4~TbI%Z zO*tIO?o=bB%w}U2q0S%<+DT@VcgL{aN5GIwfLjUbjEj>Oe5ziDasKO}o>C;WmQBO- zC0Zz0H=Yz)+@>uHl^H{Je?s-%YOK$$rIUWEMj`JMKdFlnHG_>)rAFm|s?J4Bvv`Kt z`_9n*-YU%EMQ3T#6=%Vg*Npy;wW(~KdXg7w0J^gU^z7-I!Dz)H7(I%O`Ea@L*gy;g z4vF;Wm?jV$7V>v_(x~-*3~ImLiM-2mN#2rRh~cF`^uQZnQOE9K6Q7|ib|0okkJn|! zTo*ya{1dp|I2vasC{g#)<8f4h0>kSUPIr5A7<9T1z)R!QnY@)b@WZkyEYMVALLxQT zI3Pdw?uA2;cD4k2=$=9{TZtkLtR`*tuSW5MrR3;&`{332b+~&}9lRO*2%Tat(440a zNZ#;ja7dj+o3D>W+mrdU_-wd{w_z{rxV{s)ecwS}#W)lSQbcz(xtNs}i=X`Jk<-u* zdY#c=>MbABFFR#|QT|1;dd5l77U!3sVS66N+*G29;Wll|uAOwNO@!*`eMl(02jN*A zDz$GXbS~?OU7x5h@k`X0UCUQuh%f>)9-aZuPhR+PeLi~5KZGL_ZLwGQAru>*A&F7P ztj4d?q`LG;p+{z-= z?mADp5j9x3a?~ahs}-2tDVbQWaUYkfH=)tuJCGOLfpSUcKyA6$2!Wyb^vlzwPb5xKw2fia*Y$ zx#EL(^W!z_(m{jr-*_L>I`zd{_vWD>_nPR3u?*^Zurb*}cXYU}kI|ap5dFNIto!LA zB&jvg)+f%Aj{3dv@?C=QeEI=KhCf2(iaHp5$`KwvJ&DyWTS&d1yFs7>puvTBGEvPH zjbj=i^+N}y_SfT3cDN(Ezrh?5-)d6$>*oM(I@*{vkxo86fZ zKUoh(T9~2Wemt!=vK2VaDiA`f!H}?9m@&wfuDFtoA&ob{bj59Ujiv`~xgG`%0Az+! zANs=W`#AqzH5%mEgHgtDD7ae-vF=MTwC_ix`=tV5@xZEL2)pmHKO4hZ^NQ|L_5$pc zYta4RUT8l048`jok#pYW!~3yUk$W)}V%ar7&5fB@6Hx_GSKorLX*ECh96|LAIfw$g z$Nc6?x){Cd6B%f`jkNCk4Eoe-F^v(`n5TLYl0_3Rq@xN|aQgu^#1K?*cpen*+)h6Z zeu=t)fpnnhd$KvP08%=sQV%@X_+(`~DZG(mrC1mZ4n4C;r$*NR8FuPTUMmp7)H761lA3Fk@%y!`l z;bTl%QA7)7UMJ0(6F}g08ZtJe(HR}`A!W%KbpNFTl|3K|osG*-P{!`pouEwhFB{m-y!>j8**ag|PcaS@N0t;Y$oKI6nOVc1|402M_Gkr=7ZCsZGk1u+}QEoL3T z;NUrM*)tP{{@9Ab`7Kth4|J$r_u@gzJ`7s!Y@~%<__UC(z-*Y5!piM7bSY4x>Msq1 zXx2uiX!xVnf@WwI?SPGMbr>d(!xT&%gsJh11NY|%Abd)u(an8ycw#-Xmkz0$5n69R`)e2xSU2C zr0&B!G7{DqkHZc6ozdGbmP|U$qlpnsWWL=={BgMwGjZVz)cRORTkneyiJ#U%i`io+ zXg&eDm&-}pM<;2E^I^al(nvcgrK94ID+qq<9-AmDx^)V>e-bAK*4aPkMW0Jki9dt8Rd%g5V7Y3sh^=lZSYm1tV3H+=fgfEcYOl!gJ{vz z00pLH%S5z}ixTMx%|Y`c!PIp)MH>|U%+ABoOB&xKzJ0E>9PoSkx8#8QJJt5*5d3it z$Upx6{s-=G*_UP3gqbE`_E~lSt9-rT&&-s6G5B@OU&Y^RJ*4pRc+1yMf6x7I=Ro_o zn_P;l1z-1^J&&-hKpuay{kr;J&dK$n{kcL~>Z+|x)Jy+U-6k2*u5Px2$ Z`G0ezp}k!3yyQLjp8hKwD3u*-{2$WZI*9-P diff --git a/foqus_lib/framework/ml_ai_models/mlaiSearch.py b/foqus_lib/framework/ml_ai_models/mlaiSearch.py new file mode 100644 index 000000000..fdcdda979 --- /dev/null +++ b/foqus_lib/framework/ml_ai_models/mlaiSearch.py @@ -0,0 +1,65 @@ +############################################################################### +# FOQUS Copyright (c) 2012 - 2021, by the software owners: Oak Ridge Institute +# for Science and Education (ORISE), TRIAD National Security, LLC., Lawrence +# Livermore National Security, LLC., The Regents of the University of +# California, through Lawrence Berkeley National Laboratory, Battelle Memorial +# Institute, Pacific Northwest Division through Pacific Northwest National +# Laboratory, Carnegie Mellon University, West Virginia University, Boston +# University, the Trustees of Princeton University, The University of Texas at +# Austin, URS Energy & Construction, Inc., et al. All rights reserved. +# +# Please see the file LICENSE.md for full copyright and license information, +# respectively. This file is also available online at the URL +# "https://github.com/CCSI-Toolset/FOQUS". +# +############################################################################### +""" mlaiSearch.py + +* This class looks for ml_ai model files and creates a list containing the + NN model names. The ml_ai models are identified by a certain string contained + in the file name. Files containing ml_ai models should have a .h5 extension. + +John Eslick, Carnegie Mellon University, 2014 +""" + +import sys +import os +import importlib +import logging +import imp + +_log = logging.getLogger("foqus." + __name__) + +class ml_ai_models(): + """ + This class maintains a list of NN ml_ai models + """ + def __init__(self, pathList): + self.pathList = pathList + self.mlaimodellist = {} + self.importMLAIModels() + + def getMLAIList(self): + ''' + check files in self.pathList to see if they are ml_ai models + ''' + for p in self.pathList: + if os.path.exists(p): + sys.path.append(p) + pgfiles = os.listdir(p) + for fname in pgfiles: + mname = fname.rsplit('.', 1) #split off extension + if len(mname) > 1 and mname[1] == 'h5': + try: + if mname[0] in self.mlaimodels: + _log.info("Reloading ML_AI Model: {}".format( + os.path.join(p, fname))) + self.mlaimodellist[mname[0]] = mname[0] + else: + logging.getLogger("foqus." + __name__).\ + info("Loading ML_AI Model: " + \ + os.path.join(p, fname)) + self.mlaimodellist[mname[0]] = mname[0] + except: + _log.exception("Error Loading ML_AI Model: {}".format( + os.path.join(p, fname))) diff --git a/foqus_lib/framework/session/session.py b/foqus_lib/framework/session/session.py index 23b291012..19e31f606 100644 --- a/foqus_lib/framework/session/session.py +++ b/foqus_lib/framework/session/session.py @@ -33,6 +33,7 @@ import foqus_lib.framework.optimizer.problem as oprob from foqus_lib.framework.sim.turbineConfiguration import * from foqus_lib.framework.plugins import pluginSearch +from foqus_lib.framework.ml_ai_models import mlaiSearch from foqus_lib.framework.surrogate import surrogate from foqus_lib.framework.optimizer import problem from foqus_lib.framework.pymodel import pymodel @@ -178,8 +179,10 @@ def makeWorkingDirStruct(wdir = None): createDir("temp") createDir("test") createDir("user_plugins") + createDir("user_ml_ai_models") createDir("ouu") open("user_plugins/__init__.py", 'a').close() + open("user_ml_ai_models/__init__.py", 'a').close() except: logging.getLogger("foqus." + __name__).exception( "Error creating working directory structure") @@ -262,6 +265,7 @@ def __init__(self, useCurrentWorkingDir=False): .format(self.currentLog, self.logSeek)) # Set up a blank FOQUS session self.loadPlugins() + self.loadMLAIModels() self.turbineChkFreq = 10 #frequency to check remote Turbine for #resutls self.resubMax = 0 @@ -339,8 +343,8 @@ def new(self, stopConsumers=True): self.archiveFolder = \ os.path.join(os.getcwd(), '%s_files' % self.ID) self.newArchiveItemsSinceLastSave = [] - # add the pymodel plugin list to the flowsheet so node can - # make instances of pymodels to run. the nodes don't have + # add the pymodel plugin and ml_ai_model lists to the flowsheet so + # the node make instances of pymodels to run. the nodes don't have # access to the session object self.flowsheet.pymodels = self.pymodels @@ -384,6 +388,22 @@ def loadPlugins(self): except: pass + def reloadMLAIModels(self): + self.pymodels.importMLAIModels() + + def loadMLAIModels(self): + ''' + Search for ml_ai_models + ''' + self.pymodels = mlaiSearch.ml_ai_models( + pathList = [ + os.path.join(os.getcwd(), 'user_ml_ai_models'), + os.path.dirname(surrogate.__file__)]) + try: + self.flowsheet.pymodels = self.pymodels + except: + pass + def saveFlowsheetValues(self, filename, indent=0): ''' Save only the values of flowsheet varaibles to a json file diff --git a/foqus_lib/gui/flowsheet/nodePanel.py b/foqus_lib/gui/flowsheet/nodePanel.py index ed490788a..547e8e780 100644 --- a/foqus_lib/gui/flowsheet/nodePanel.py +++ b/foqus_lib/gui/flowsheet/nodePanel.py @@ -424,13 +424,13 @@ def updateSimulationList(self): elif self.modelTypeBox.currentIndex() == 2: # model type is plugin sl = sorted( - list(self.dat.pymodels.ml_ai.keys()), # IS THIS LINE CORRECT? + list(self.dat.pymodels.plugins.keys()), key=lambda s: s.lower()) self.simNameBox.addItems(sl) elif self.modelTypeBox.currentIndex() == 5: # model type is ml_ai sl = sorted( - list(self.dat.pymodels.plugins.keys()), + list(self.dat.pymodels.ml_ai_models.keys()), key=lambda s: s.lower()) self.simNameBox.addItems(sl) try: From a0a55eb9b853a41b1e33e88659046406bd1739e2 Mon Sep 17 00:00:00 2001 From: Brandon Paul Date: Fri, 29 Oct 2021 10:03:37 -0700 Subject: [PATCH 05/40] Addressed pytest errors --- foqus_lib/framework/ml_ai_models/mlaiSearch.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/foqus_lib/framework/ml_ai_models/mlaiSearch.py b/foqus_lib/framework/ml_ai_models/mlaiSearch.py index fdcdda979..b8170b6ea 100644 --- a/foqus_lib/framework/ml_ai_models/mlaiSearch.py +++ b/foqus_lib/framework/ml_ai_models/mlaiSearch.py @@ -37,7 +37,7 @@ class ml_ai_models(): def __init__(self, pathList): self.pathList = pathList self.mlaimodellist = {} - self.importMLAIModels() + self.getMLAIList() def getMLAIList(self): ''' From 937d02dfc63b1a1fcdb1ab92d9f83fc3477b046c Mon Sep 17 00:00:00 2001 From: Brandon Paul Date: Mon, 1 Nov 2021 11:54:15 -0700 Subject: [PATCH 06/40] Added modelType, modelName and load_model connections to UI --- foqus_lib/framework/graph/node.py | 31 +++++++++++++------ .../framework/ml_ai_models/mlaiSearch.py | 8 ++--- foqus_lib/framework/session/session.py | 7 +++-- foqus_lib/gui/flowsheet/nodePanel.py | 2 +- 4 files changed, 31 insertions(+), 17 deletions(-) diff --git a/foqus_lib/framework/graph/node.py b/foqus_lib/framework/graph/node.py index a48c46352..790a442bf 100644 --- a/foqus_lib/framework/graph/node.py +++ b/foqus_lib/framework/graph/node.py @@ -88,8 +88,6 @@ def setCodeStrings(self): class pymodel_ml_ai(pymodel): def __init__(self): pymodel.__init__(self) - - self.model = load('../ml_ai_models/' + str(self.modelName) + '.h5') # attempt to retrieve required information from loaded model, and set defaults otherwise try: @@ -543,7 +541,7 @@ def setSim(self, newType=None, newModel=None, force=False, ids=None): self.gr.output_vectorlist[self.name][vector_name].opvname = \ (self.name,name) - # Add an extra output varialbe for simulation status + # Add an extra output variable for simulation status # I think this comes out of all simulation run through # SimSinter, but its not in the sinter config file. self.gr.output[self.name]["status"] = NodeVars( @@ -561,11 +559,16 @@ def setSim(self, newType=None, newModel=None, force=False, ids=None): ) elif self.modelType == nodeModelTypes.MODEL_ML_AI: # link to pymodel class for ml/ai models - inst = pymodel_ml_ai() - # the node can have the pymodel instances variables since - # i'm not going to use the pymodel instance for anything - # else there is no need to copy them. I'll create a - # different instance for running the model. + cwd = os.getcwd() + os.chdir(os.path.join(os.getcwd(), 'user_ml_ai_models')) + try: + self.model = load(str(self.modelName) + ".h5") + except: + QMessageBox.warning("Keras load_model() failed, check if " + "installed tensorflow version matches " + "version used to train and save model.") + os.chdir(cwd) # reset to original working directory + inst = self.model.pymodel_ml_ai() for vkey, v in inst.inputs.items(): self.gr.input[self.name][vkey] = v for vkey, v in inst.outputs.items(): @@ -1049,7 +1052,17 @@ def runPymodelMLAI(self): """ # create a python model instance if needed if not self.pyModel: - self.pyModel = pymodel_ml_ai() + # load ml_ai_model and build pymodel class object + cwd = os.getcwd() + os.chdir(os.path.join(os.getcwd(), 'user_ml_ai_models')) + try: + self.model = load(str(self.modelName) + ".h5") + except: + QMessageBox.warning("Keras load_model() failed, check if " + "installed tensorflow version matches " + "version used to train and save model.") + os.chdir(cwd) # reset to original working directory + self.pyModel = self.model.pymodel_ml_ai() # set the instance inputs for vkey, v in self.gr.input[self.name].items(): if vkey in self.pyModel.inputs: diff --git a/foqus_lib/framework/ml_ai_models/mlaiSearch.py b/foqus_lib/framework/ml_ai_models/mlaiSearch.py index b8170b6ea..c2b1dba0d 100644 --- a/foqus_lib/framework/ml_ai_models/mlaiSearch.py +++ b/foqus_lib/framework/ml_ai_models/mlaiSearch.py @@ -36,7 +36,7 @@ class ml_ai_models(): """ def __init__(self, pathList): self.pathList = pathList - self.mlaimodellist = {} + self.ml_ai_models = {} self.getMLAIList() def getMLAIList(self): @@ -51,15 +51,15 @@ def getMLAIList(self): mname = fname.rsplit('.', 1) #split off extension if len(mname) > 1 and mname[1] == 'h5': try: - if mname[0] in self.mlaimodels: + if mname[0] in self.ml_ai_models: _log.info("Reloading ML_AI Model: {}".format( os.path.join(p, fname))) - self.mlaimodellist[mname[0]] = mname[0] + self.ml_ai_models[mname[0]] = mname[0] else: logging.getLogger("foqus." + __name__).\ info("Loading ML_AI Model: " + \ os.path.join(p, fname)) - self.mlaimodellist[mname[0]] = mname[0] + self.ml_ai_models[mname[0]] = mname[0] except: _log.exception("Error Loading ML_AI Model: {}".format( os.path.join(p, fname))) diff --git a/foqus_lib/framework/session/session.py b/foqus_lib/framework/session/session.py index 19e31f606..f1aa9c70b 100644 --- a/foqus_lib/framework/session/session.py +++ b/foqus_lib/framework/session/session.py @@ -347,6 +347,7 @@ def new(self, stopConsumers=True): # the node make instances of pymodels to run. the nodes don't have # access to the session object self.flowsheet.pymodels = self.pymodels + self.flowsheet.pymodels_ml_ai = self.pymodels_ml_ai def loadSettings(self): self.foqusSettings.load(self.settingUseCWD) @@ -389,18 +390,18 @@ def loadPlugins(self): pass def reloadMLAIModels(self): - self.pymodels.importMLAIModels() + self.pymodels.getMLAIList() def loadMLAIModels(self): ''' Search for ml_ai_models ''' - self.pymodels = mlaiSearch.ml_ai_models( + self.pymodels_ml_ai = mlaiSearch.ml_ai_models( pathList = [ os.path.join(os.getcwd(), 'user_ml_ai_models'), os.path.dirname(surrogate.__file__)]) try: - self.flowsheet.pymodels = self.pymodels + self.flowsheet.pymodels_ml_ai = self.pymodels_ml_ai except: pass diff --git a/foqus_lib/gui/flowsheet/nodePanel.py b/foqus_lib/gui/flowsheet/nodePanel.py index 547e8e780..d55b8749a 100644 --- a/foqus_lib/gui/flowsheet/nodePanel.py +++ b/foqus_lib/gui/flowsheet/nodePanel.py @@ -430,7 +430,7 @@ def updateSimulationList(self): elif self.modelTypeBox.currentIndex() == 5: # model type is ml_ai sl = sorted( - list(self.dat.pymodels.ml_ai_models.keys()), + list(self.dat.pymodels_ml_ai.ml_ai_models.keys()), key=lambda s: s.lower()) self.simNameBox.addItems(sl) try: From 5f75effa9655b7abf7a8d2a4cba80970f49b884f Mon Sep 17 00:00:00 2001 From: Brandon Paul Date: Mon, 1 Nov 2021 14:59:03 -0700 Subject: [PATCH 07/40] Keras object and layer import, redefined pymodel local variables --- foqus_lib/framework/graph/node.py | 102 +++++++++++------------------- 1 file changed, 37 insertions(+), 65 deletions(-) diff --git a/foqus_lib/framework/graph/node.py b/foqus_lib/framework/graph/node.py index 790a442bf..fffb4110f 100644 --- a/foqus_lib/framework/graph/node.py +++ b/foqus_lib/framework/graph/node.py @@ -24,8 +24,7 @@ import time import json import math -import numpy -from tensorflow.keras.models import load_model as load +import numpy as np import subprocess import logging import traceback @@ -38,6 +37,14 @@ from foqus_lib.framework.sim.turbineConfiguration import TurbineInterfaceEx from foqus_lib.framework.at_dict.at_dict import AtDict from PyQt5.QtWidgets import QMessageBox +from importlib import import_module + +try: + # tensorflow should be installed, but is not required for non ML/AI models + from tensorflow.keras.models import load_model as load +except: + pass # errors will be thrown if tensorflow is called but not installed, + # otherwise no error should be thrown so passing is fine class NodeOptionSets: @@ -86,69 +93,40 @@ def setCodeStrings(self): class pymodel_ml_ai(pymodel): - def __init__(self): + def __init__(self, model): pymodel.__init__(self) # attempt to retrieve required information from loaded model, and set defaults otherwise - try: - inputs_labels = self.model.layers[1].input_labels - except: - input_labels = ['x' + str(i+1) for i in range(np.shape(self.model.layers[1].inputs[0])[1])] - try: - input_bounds = self.model.layers[1].input_bounds - input_min = [input_bounds[idx][0] for idx in input_bounds] - input_max = [input_bounds[idx][1] for idx in input_bounds] - except: - input_min = [0] * len(input_labels) - input_max = [1E5] * len(input_labels) - QMessageBox.warning( - self, - "No input bound provided or error in bound entries, ", - "using default min = 0 and max = 1E5 for all vars ", - "for model {0}").format(self.modelName) - try: - output_labels = self.model.output_labels - except: - output_labels = ['z' + str(j+1) for j in range(np.shape(self.model.outputs[0])[1])] + self.model = model - # attempt to retrieve optional information from loaded model, and set defaults otherwise - try: - input_defaults = self.model.input_defaults - except: - inputs_defaults = [0] * len(input_labels) - try: - output_defaults = self.model.output_defaults - except: - output_defaults =[0] * len(output_labels) - try: - input_desc = self.model.input_desc - except: - input_desc = ['input var ' + str(i+1) for i in range(len(input_labels))] - try: - output_desc = self.model.output_desc - except: - output_desc = ['output var ' + str(j+1) for i in range(len(output_labels))] - - for i in range(len(input_labels)): - self.inputs[input_labels[i]] = NodeVars( - value = input_default[i], - vmin = input_min[i], - vmax = input_max[i], + for i in range(np.shape(self.model.inputs[0])[1]): + input_labels = self.model.layers[1].input_labels[i] + input_bounds = self.model.layers[1].input_bounds + input_min = self.model.layers[1].input_bounds[input_labels][0] + input_max = self.model.layers[1].input_bounds[input_labels][1] + + self.inputs[self.model.layers[1].input_labels[i]] = NodeVars( + value = 0, # input_defaults[i], + vmin = input_min, + vmax = input_max, vdflt = 0.0, unit = "", vst = "pymodel", - vdesc = input_desc[i], + vdesc = 'input var ' + str(i+1), tags = [], dtype = float) - for j in range(len(output_labels)): - self.outputs[output_labels[i]] = NodeVars( - value = output_default[i], + + for j in range(np.shape(self.model.outputs[0])[1]): + output_labels = self.model.layers[1].output_labels[j] + + self.outputs[self.model.layers[1].output_labels[j]] = NodeVars( + value = 0, # output_defaults[i], vmin = 0, vmax = 1E5, vdflt = 0.0, unit = "", vst = "pymodel", - vdesc = output_desc[i], + vdesc = 'output var ' + str(j+1), tags = [], dtype = float) @@ -561,14 +539,11 @@ def setSim(self, newType=None, newModel=None, force=False, ids=None): # link to pymodel class for ml/ai models cwd = os.getcwd() os.chdir(os.path.join(os.getcwd(), 'user_ml_ai_models')) - try: - self.model = load(str(self.modelName) + ".h5") - except: - QMessageBox.warning("Keras load_model() failed, check if " - "installed tensorflow version matches " - "version used to train and save model.") + module = import_module(str(self.modelName)) # contains CustomLayer + self.model = load(str(self.modelName) + ".h5", + custom_objects = {'CustomLayer': module.CustomLayer}) os.chdir(cwd) # reset to original working directory - inst = self.model.pymodel_ml_ai() + inst = pymodel_ml_ai(self.model) for vkey, v in inst.inputs.items(): self.gr.input[self.name][vkey] = v for vkey, v in inst.outputs.items(): @@ -1055,14 +1030,11 @@ def runPymodelMLAI(self): # load ml_ai_model and build pymodel class object cwd = os.getcwd() os.chdir(os.path.join(os.getcwd(), 'user_ml_ai_models')) - try: - self.model = load(str(self.modelName) + ".h5") - except: - QMessageBox.warning("Keras load_model() failed, check if " - "installed tensorflow version matches " - "version used to train and save model.") + module = import_module(str(self.modelName)) # contains CustomLayer + self.model = load(str(self.modelName) + ".h5", + custom_objects = {'CustomLayer': module.CustomLayer}) os.chdir(cwd) # reset to original working directory - self.pyModel = self.model.pymodel_ml_ai() + self.pyModel = pymodel_ml_ai(self.model) # set the instance inputs for vkey, v in self.gr.input[self.name].items(): if vkey in self.pyModel.inputs: From 760dced729de9bbd08476797f5daa2d87d4469f7 Mon Sep 17 00:00:00 2001 From: Brandon Paul Date: Tue, 2 Nov 2021 07:39:04 -0700 Subject: [PATCH 08/40] Fixed output variable indexing --- foqus_lib/framework/graph/node.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/foqus_lib/framework/graph/node.py b/foqus_lib/framework/graph/node.py index fffb4110f..c974b44d7 100644 --- a/foqus_lib/framework/graph/node.py +++ b/foqus_lib/framework/graph/node.py @@ -136,8 +136,10 @@ def run(self): print(inputs) # set output values to be generated from NN surrogate outputs = self.model.predict(np.array(inputs, ndmin=2))[0] + outidx = 0 for j in self.outputs: - self.outputs[j].value = outputs[j] + self.outputs[j].value = outputs[outidx] + outidx += 1 class Node: From 43f2c035c2826bfc57fbf1961417cb79d607f5c8 Mon Sep 17 00:00:00 2001 From: Brandon Paul Date: Wed, 1 Dec 2021 09:45:57 -0800 Subject: [PATCH 09/40] Allow plugin to import models with new name, no custom layer or no labels --- foqus_lib/framework/graph/node.py | 61 ++++++++++++++++++++++--------- 1 file changed, 44 insertions(+), 17 deletions(-) diff --git a/foqus_lib/framework/graph/node.py b/foqus_lib/framework/graph/node.py index c974b44d7..eb6197f90 100644 --- a/foqus_lib/framework/graph/node.py +++ b/foqus_lib/framework/graph/node.py @@ -100,13 +100,21 @@ def __init__(self, model): self.model = model for i in range(np.shape(self.model.inputs[0])[1]): - input_labels = self.model.layers[1].input_labels[i] - input_bounds = self.model.layers[1].input_bounds - input_min = self.model.layers[1].input_bounds[input_labels][0] - input_max = self.model.layers[1].input_bounds[input_labels][1] + try: + input_label = self.model.layers[1].input_labels[i] + except: + input_label = 'x' + str(i+1) + try: + input_min = self.model.layers[1].input_bounds[input_label][0] + except: + input_min = 0 # not necessarily a good default + try: + input_max = self.model.layers[1].input_bounds[input_label][1] + except: + input_max = 1e5 # not necessarily a good default - self.inputs[self.model.layers[1].input_labels[i]] = NodeVars( - value = 0, # input_defaults[i], + self.inputs[input_label] = NodeVars( + value = 0, # set default value to zero, since this can be changed in the flowsheet vmin = input_min, vmax = input_max, vdflt = 0.0, @@ -117,12 +125,23 @@ def __init__(self, model): dtype = float) for j in range(np.shape(self.model.outputs[0])[1]): - output_labels = self.model.layers[1].output_labels[j] + try: + output_label = self.model.layers[1].output_labels[j] + except: + output_label = 'z' + str(j+1) + try: + output_min = self.model.layers[1].output_bounds[output_label][0] + except: + output_min = 0 # not necessarily a good default + try: + output_max = self.model.layers[1].output_bounds[output_label][1] + except: + output_max = 1e5 # not necessarily a good default - self.outputs[self.model.layers[1].output_labels[j]] = NodeVars( - value = 0, # output_defaults[i], - vmin = 0, - vmax = 1E5, + self.outputs[output_label] = NodeVars( + value = 0, # set default value to zero, since this can be changed in the flowsheet + vmin = output_min, + vmax = output_max, vdflt = 0.0, unit = "", vst = "pymodel", @@ -541,9 +560,13 @@ def setSim(self, newType=None, newModel=None, force=False, ids=None): # link to pymodel class for ml/ai models cwd = os.getcwd() os.chdir(os.path.join(os.getcwd(), 'user_ml_ai_models')) - module = import_module(str(self.modelName)) # contains CustomLayer - self.model = load(str(self.modelName) + ".h5", - custom_objects = {'CustomLayer': module.CustomLayer}) + try: # see if custom layer script exists + module = import_module(str(self.modelName)) # contains CustomLayer + self.model = load(str(self.modelName) + ".h5", + custom_objects = {str(self.modelName): + getattr(module, str(self.modelName))}) + except: # try to load model without custom layer + self.model = load(str(self.modelName) + ".h5") os.chdir(cwd) # reset to original working directory inst = pymodel_ml_ai(self.model) for vkey, v in inst.inputs.items(): @@ -1032,9 +1055,13 @@ def runPymodelMLAI(self): # load ml_ai_model and build pymodel class object cwd = os.getcwd() os.chdir(os.path.join(os.getcwd(), 'user_ml_ai_models')) - module = import_module(str(self.modelName)) # contains CustomLayer - self.model = load(str(self.modelName) + ".h5", - custom_objects = {'CustomLayer': module.CustomLayer}) + try: # see if custom layer script exists + module = import_module(str(self.modelName)) # contains CustomLayer + self.model = load(str(self.modelName) + ".h5", + custom_objects = {str(self.modelName): + getattr(module, str(self.modelName))}) + except: # try to load model without custom layer + self.model = load(str(self.modelName) + ".h5") os.chdir(cwd) # reset to original working directory self.pyModel = pymodel_ml_ai(self.model) # set the instance inputs From 987de2ae4552626ab336e8ca53274fad265f7804 Mon Sep 17 00:00:00 2001 From: Brandon Paul Date: Mon, 6 Dec 2021 12:47:50 -0800 Subject: [PATCH 10/40] ML AI Plugin documentation first draft --- .../chapt_surrogates/figs/Plugin_Console.PNG | Bin 0 -> 100416 bytes .../figs/Plugin_Flowsheet.PNG | Bin 0 -> 94496 bytes .../figs/Plugin_UserFoldersWindow.PNG | Bin 0 -> 39933 bytes docs/source/chapt_surrogates/index.rst | 1 + docs/source/chapt_surrogates/mlaiplugin.rst | 224 ++++++++++++++++++ docs/source/references.rst | 4 + 6 files changed, 229 insertions(+) create mode 100644 docs/source/chapt_surrogates/figs/Plugin_Console.PNG create mode 100644 docs/source/chapt_surrogates/figs/Plugin_Flowsheet.PNG create mode 100644 docs/source/chapt_surrogates/figs/Plugin_UserFoldersWindow.PNG create mode 100644 docs/source/chapt_surrogates/mlaiplugin.rst diff --git a/docs/source/chapt_surrogates/figs/Plugin_Console.PNG b/docs/source/chapt_surrogates/figs/Plugin_Console.PNG new file mode 100644 index 0000000000000000000000000000000000000000..2e84b681834977b26c46acfbd47c40e273d488d1 GIT binary patch literal 100416 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

Pw)9n3p#3TH39%@X%+y42DNgs`+wv_-Zx|0 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 literal 0 HcmV?d00001 diff --git a/docs/source/chapt_surrogates/figs/Plugin_Flowsheet.PNG b/docs/source/chapt_surrogates/figs/Plugin_Flowsheet.PNG new file mode 100644 index 0000000000000000000000000000000000000000..781f60adb879e69a0bcd77c5e3881d5600b6ed85 GIT binary patch literal 94496 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 cIJ^DUpZfO_N8oG6clPj!vWjEV!Z literal 0 HcmV?d00001 diff --git a/docs/source/chapt_surrogates/figs/Plugin_UserFoldersWindow.PNG b/docs/source/chapt_surrogates/figs/Plugin_UserFoldersWindow.PNG new file mode 100644 index 0000000000000000000000000000000000000000..505ba1b64944997da08a25165cdff40f3b1739a8 GIT binary patch literal 39933 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 Q#$x1q?e%xRxf^xiA95vFga7~l literal 0 HcmV?d00001 diff --git a/docs/source/chapt_surrogates/index.rst b/docs/source/chapt_surrogates/index.rst index 15d611e3f..1e9bc9eb6 100644 --- a/docs/source/chapt_surrogates/index.rst +++ b/docs/source/chapt_surrogates/index.rst @@ -7,5 +7,6 @@ Contents .. toctree:: :maxdepth: 2 + mlaiplugin reference tutorial/index diff --git a/docs/source/chapt_surrogates/mlaiplugin.rst b/docs/source/chapt_surrogates/mlaiplugin.rst new file mode 100644 index 000000000..145b261ad --- /dev/null +++ b/docs/source/chapt_surrogates/mlaiplugin.rst @@ -0,0 +1,224 @@ +Machine Learning & Artificial Intelligence Flowsheet Model Plugins +================================================================== + +In addition to data-driven model generation, surrogates may be specified +by importing external Python classes. FOQUS supports conversion of custom +Pymodel scripts as well as neural network model files into flowsheet node +surrogates. The FOQUS session script will automatically load model files +from the corresponding working directory folders when the application is +launched. + +- Plugin – Selecting this model type in the Node Editor displays available + Python model classes, which typically contain initialization and run + methods to define the model expressions. To use this tool, users must + develop a Pymodel script (see the example code below as a guide) and + place the file in the appropriate folder user_plugins in the working + directory, as shown below. This model type is demonstrated in + Section :ref:`tutorial.surrogate.fs`. + +- ML_AI – Selecting this model type in the Node Editor displays available + neural network models; this tool currently supports Tensorflow Keras + model files in hierarchical data format 5 (.h5). To use this tool, + users must train and export a Keras model and place the file in the + appropriate folder user_ml_ai_plugins in the working directory, as + shown below. Optionally, users may save Keras models with custom + attributes to display on the node, such as variable labels and bounds. + While training a Keras model with custom attributes is not required to + use the plugin tool, users must provide the necessary class script + if the Keras model does contain a custom object (see below for further + information on creating custom objects). This model type is used in the + same manner as Pymodel Plugins, per the workflow in + Section :ref:`tutorial.surrogate.fs`. + + +Custom Model Attributes +----------------------- + +The high-level neural network library of Keras integrates with TensorFlow's +machine learning library to train complex model within Python's user-friendly +framework. Largely, Keras models may be split into two types: **Sequential** +which build linearly connected model layers, and **Functional** which build +multiple interconnected layers in a complex system. More information on +Tensorflow Keras model building is described by +:ref:`(Wu et al. 2020)`. + +The ML AI Plugin supports adding neural networks of either type to FOQUS +nodes; if a custom object is needed, only the Functional API supports +serializing custom attributes. If a model is saved with a custom input layer +as shown below, FOQUS will automatically read and import the custom attributes +into the Node Editor. + +Currently, FOQUS supports the following custom attributes: + +- *input_labels* – list of string objects containing labels for each input + variable (default: x1, x2, x3, ...) +- *input_bounds* – list of tuple (pair) objects containing upper and lower + bounds for each input variable (default: (0, 1E5)) +- *output_labels* – list of string objects containing labels for each output + variable (default: z1, z2, z3, ...) +- *output_bounds* – list of tuple (pair) objects containing upper and lower + bounds for each output variable (default: (0, 1E5)) + +The following code snippet demonstrates the Python syntax to train and save +a Keras model with custom attributes. The use of Dropout features in training +is not required, but decreases the risk of overfitting by minimizing the +number of parameters in large models. Note that the custom object class, +script containing the class and the NN model file itself must all share the +same name to import the custom attributes into a FOQUS node. If certain custom +attributes are not used (for example. *output_bounds* below), users should not +include them in the custom class definition. + +Users must ensure the proper script name is used in the following places, +replacing *example_model* with the desired model name: + +- Custom class signature, *class example_model(tf.keras.layers.Layer):* +- Creating a callable object, *super(example_model, self).__init__()* +- Defining the class CONFIG, *config = super(example_model, self).get_config()* +- Creating the model, *layers = example_model(* +- Saving the model, *model.save('example_model.h5')* +- The file names of the .h5 model file and custom class script. + +.. code:: python + + # Required imports + >>> import numpy as np + >>> import pandas as pd + >>> import tensorflow as tf + + # Example follows the sequence below: + # 1) Main Code at end of file to import data and create model + # 2) Call create_model() to define inputs and outputs + # 3) Call custom layer object to define network structure, which uses + # call() to define layer connections and get_config to attach + # attributes to the custom layer + # 4) Back to create_model() to compile and train model + # 5) Back to code at end of file to save the model + + # custom class to define Keras NN layers and serialize (register) objects + >>> @tf.keras.utils.register_keras_serializable() # first non-imports line to include in working directory example_model.py + >>> class example_model(tf.keras.layers.Layer): + # give training parameters default values, and set attribute defaults to None + >>> def __init__(self, n_hidden=1, n_neurons=300, + >>> layer_act='relu', out_act='sigmoid', + >>> input_labels=None, output_labels=None, + >>> input_bounds=None, **kwargs): + + >>> super(example_model, self).__init__() # create callable object + + # add attributes from training settings + >>> self.n_hidden = n_hidden + >>> self.n_neurons = n_neurons + >>> self.layer_act = layer_act + >>> self.out_act = out_act + + # add attributes from model data + >>> self.input_labels = input_labels + >>> self.output_labels = output_labels + >>> self.input_bounds = input_bounds + + # create lists to contain new layer objects + >>> self.dense_layers = [] # hidden or output layers + >>> self.dropout = [] # for large number of neurons, certain neurons + # can be randomly dropped out to reduce overfitting + + >>> for layer in range(self.n_hidden): + >>> self.dense_layers.append( + >>> tf.keras.layers.Dense( + >>> self.n_neurons, activation=self.layer_act)) + + >>> self.dense_layers_out = tf.keras.layers.Dense( + >>> 2, activation=self.out_act) + + # define network layer connections + >>> def call(self, inputs): + + >>> x = inputs # single input layer, input defined in create_model() + >>> for layer in self.dense_layers: # hidden layers + >>> x = layer(x) # h1 = f(input), h2 = f(h1), ... using act func + >>> for layer in self.dropout: # no dropout layers used in this example + >>> x = layer(x) + >>> x = self.dense_layers_out(x) # single output layer, output = f(h_last) + + >>> return x + + # attach attributes to class CONFIG + >>> def get_config(self): + >>> config = super(example_model, self).get_config() + >>> config.update({ # add any custom attributes here + >>> 'n_hidden': self.n_hidden, + >>> 'n_neurons': self.n_neurons, + >>> 'layer_act': self.layer_act, + >>> 'out_act': self.out_act, + >>> 'input_labels': self.input_labels, + >>> 'output_labels': self.output_labels, + >>> 'input_bounds': self.input_bounds, + >>> }) + >>> return config # last line to include in working directory example_model.py + + + # method to create model + >>> def create_model(data): + + >>> inputs = tf.keras.Input(shape=(np.shape(data)[1],)) # create input layer + + >>> layers = example_model( # define the rest of network using our custom class + >>> input_labels=xlabels, + >>> output_labels=zlabels, + >>> input_bounds=xdata_bounds, + >>> ) + + >>> outputs = layers(inputs) # use network as function outputs = f(inputs) + + >>> model = tf.keras.Model(inputs=inputs, outputs=outputs) # create model + + >>> model.compile(loss='mse', optimizer='SGD', metrics=['mae', 'mse']) + + >>> model.fit(xdata, zdata, epochs=500, verbose=0) # train model + + >>> return model + + # Main code + + # import data + >>> data = pd.read_csv(r'dataset.csv') + + >>> xdata = data.iloc[:, :6] # here there are 6 input variables/columns + >>> zdata = data.iloc[:, 6:] # the rest are output variables/columns + >>> xlabels = xdata.columns.tolist() # set labels as a list (default) from pandas + >>> zlabels = zdata.columns.tolist() # is a set of IndexedDataSeries objects + >>> xdata_bounds = {i: (xdata[i].min(), xdata[i].max()) for i in xdata} # x bounds + + >>> model_data = np.array(data) # Keras requires a Numpy array as input + + # define x and z data, not used but will add to variable dictionary + >>> xdata = model_data[:, :-2] + >>> zdata = model_data[:, -2:] + + # create model + >>> model = create_model(xdata) + >>> model.summary() + + # save model + >>> model.save('example_model.h5') + +After training and saving the model, the files should be placed in the +working directory folder as shown below; if FOQUS cannot find the custom class +due to a missing or misnamed script, the node will not load the attributes. As +noted above, only the custom class lines should be included in the script: + +.. figure:: figs/plugin_userfolderswindow.png + :alt: User Folders Window + :name: fig.surrogate.pluginfolders + +Upon launching FOQUS, the console should include the line highlighted in +yellow below to show the model file has been successfully loaded: + +.. figure:: figs/plugin_console.png + :alt: User Plugin Folders + :name: fig.surrogate.pluginconsole + +The model will then appear in the Node Editor menu: + +.. figure:: figs/plugin_flowsheet.png + :alt: User Plugin Folders + :name: fig.surrogate.pluginflowsheet diff --git a/docs/source/references.rst b/docs/source/references.rst index ce51058a6..cfe076e82 100644 --- a/docs/source/references.rst +++ b/docs/source/references.rst @@ -40,3 +40,7 @@ E. Jones, T. Oliphant, P. Peterson, et al., "Scipy: Open source scientific tool .. _Bhat_2015: K. Bhat, B. Sherman, K. Ajayi, B. Ng, J. Eslick, J. Ou, and J.Kress, "Solventfit: A calibration tool for solvent-based CO2 capture models," in 2015 CCSI Industry Advisory Board (IAB) Program Review Meeting, (Reston, VA), September 2015. + +.. _Wu_2020: + +K. Wu, F. Chollet, "Serialization and saving." https://keras.io/guides/serialization_and_saving/, April 2020. From 913775b15396f7f3869861960f6630acdcbbfeea Mon Sep 17 00:00:00 2001 From: Brandon Paul Date: Wed, 15 Dec 2021 13:19:20 -0800 Subject: [PATCH 11/40] Added normalization functionality, examples, updated documentation --- .../chapt_surrogates/figs/Plugin_Console.PNG | Bin 100416 -> 116668 bytes .../figs/Plugin_Flowsheet.PNG | Bin 94496 -> 92840 bytes .../figs/Plugin_UserFoldersWindow.PNG | Bin 39933 -> 35039 bytes docs/source/chapt_surrogates/mlaiplugin.rst | 73 ++++++--- .../ML_AI_Plugin/AR_nocustomlayer.foqus | 1 + .../ML_AI_Plugin/AR_nocustomlayer.h5 | Bin 0 -> 29312 bytes .../MEA_carbon_capture_dataset_mimo.csv | 103 +++++++++++++ .../ML_AI_Plugin/mea_column_model.foqus | 1 + .../ML_AI_Plugin/mea_column_model.h5 | Bin 0 -> 26120 bytes .../ML_AI_Plugin/mea_column_model.py | 77 ++++++++++ .../ML_AI_Plugin/mea_column_model_training.py | 145 ++++++++++++++++++ foqus_lib/framework/graph/node.py | 24 ++- foqus_lib/framework/graph/nodeVars.py | 4 +- 13 files changed, 402 insertions(+), 26 deletions(-) create mode 100644 examples/other_files/ML_AI_Plugin/AR_nocustomlayer.foqus create mode 100644 examples/other_files/ML_AI_Plugin/AR_nocustomlayer.h5 create mode 100644 examples/other_files/ML_AI_Plugin/MEA_carbon_capture_dataset_mimo.csv create mode 100644 examples/other_files/ML_AI_Plugin/mea_column_model.foqus create mode 100644 examples/other_files/ML_AI_Plugin/mea_column_model.h5 create mode 100644 examples/other_files/ML_AI_Plugin/mea_column_model.py create mode 100644 examples/other_files/ML_AI_Plugin/mea_column_model_training.py diff --git a/docs/source/chapt_surrogates/figs/Plugin_Console.PNG b/docs/source/chapt_surrogates/figs/Plugin_Console.PNG index 2e84b681834977b26c46acfbd47c40e273d488d1..6ddca3e2c8ea7c9f4cea9b449c676ef779fc94a7 100644 GIT binary patch literal 116668 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

5&o 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 literal 100416 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

Pw)9n3p#3TH39%@X%+y42DNgs`+wv_-Zx|0 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 diff --git a/docs/source/chapt_surrogates/figs/Plugin_Flowsheet.PNG b/docs/source/chapt_surrogates/figs/Plugin_Flowsheet.PNG index 781f60adb879e69a0bcd77c5e3881d5600b6ed85..d135792db21dfe35ab342e372e01e75cb25bca69 100644 GIT binary patch literal 92840 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%0DBHiP#Piu}(~=?(=DBi6G>NuvQeX{+ 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 literal 94496 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 cIJ^DUpZfO_N8oG6clPj!vWjEV!Z diff --git a/docs/source/chapt_surrogates/figs/Plugin_UserFoldersWindow.PNG b/docs/source/chapt_surrogates/figs/Plugin_UserFoldersWindow.PNG index 505ba1b64944997da08a25165cdff40f3b1739a8..10783a6b2b0a29e81a01d893d6fe231d292bf70d 100644 GIT binary patch literal 35039 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 Qz4?f&q>{vEF+;!q0jzf^WB>pF literal 39933 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 Q#$x1q?e%xRxf^xiA95vFga7~l diff --git a/docs/source/chapt_surrogates/mlaiplugin.rst b/docs/source/chapt_surrogates/mlaiplugin.rst index 145b261ad..c0278bc59 100644 --- a/docs/source/chapt_surrogates/mlaiplugin.rst +++ b/docs/source/chapt_surrogates/mlaiplugin.rst @@ -40,7 +40,9 @@ framework. Largely, Keras models may be split into two types: **Sequential** which build linearly connected model layers, and **Functional** which build multiple interconnected layers in a complex system. More information on Tensorflow Keras model building is described by -:ref:`(Wu et al. 2020)`. +:ref:`(Wu et al. 2020)`. Users may follow the recommended workflow +to install and use Tensorflow in a Python environment, as described in the +`(Tensorflow documentation)`. The ML AI Plugin supports adding neural networks of either type to FOQUS nodes; if a custom object is needed, only the Functional API supports @@ -58,15 +60,20 @@ Currently, FOQUS supports the following custom attributes: variable (default: z1, z2, z3, ...) - *output_bounds* – list of tuple (pair) objects containing upper and lower bounds for each output variable (default: (0, 1E5)) +- *normalized* – Boolean flag for whether the user is passing a normalized + neural network model; to use this flag, users must train their models with + data in the form below and add all input and output bounds custom attributes The following code snippet demonstrates the Python syntax to train and save a Keras model with custom attributes. The use of Dropout features in training is not required, but decreases the risk of overfitting by minimizing the -number of parameters in large models. Note that the custom object class, -script containing the class and the NN model file itself must all share the -same name to import the custom attributes into a FOQUS node. If certain custom -attributes are not used (for example. *output_bounds* below), users should not -include them in the custom class definition. +number of parameters in large models. Similarly, normalizing data often +results in more accurate models since features are less likely to be blurred +during fitting. Users may then enter unscaled input values and return unscaled +output values in the Node Editor. Note that the custom object class script +containing the class and the NN model file itself must all share the same name +to import the custom attributes into a FOQUS node. If certain custom attributes +are not used, users should not include them in the custom class definition. Users must ensure the proper script name is used in the following places, replacing *example_model* with the desired model name: @@ -78,6 +85,14 @@ replacing *example_model* with the desired model name: - Saving the model, *model.save('example_model.h5')* - The file names of the .h5 model file and custom class script. +For example, the model name below is 'mea_column_model'. See the example files +in the examples\other_files\ML_AI_Plugin folder for complete syntax and usage. +The folder contains a second model with no custom layer to demonstrate the +plugin defaults. To run the models, copy mea_column_model.h5, mea_column_model.py +and AR_nocustomlayer.h5 into the working directory folder user_ml_ai_models\. +The default output values are not calculated, so the node should be run to +obtain the correct output values for the entered inputs. + .. code:: python # Required imports @@ -96,14 +111,15 @@ replacing *example_model* with the desired model name: # custom class to define Keras NN layers and serialize (register) objects >>> @tf.keras.utils.register_keras_serializable() # first non-imports line to include in working directory example_model.py - >>> class example_model(tf.keras.layers.Layer): + >>> class mea_column_model(tf.keras.layers.Layer): # give training parameters default values, and set attribute defaults to None - >>> def __init__(self, n_hidden=1, n_neurons=300, + >>> def __init__(self, n_hidden=1, n_neurons=12, >>> layer_act='relu', out_act='sigmoid', >>> input_labels=None, output_labels=None, - >>> input_bounds=None, **kwargs): + >>> input_bounds=None, output_bounds=None, + >>> normalized=False, **kwargs): - >>> super(example_model, self).__init__() # create callable object + >>> super(mea_column_model, self).__init__() # create callable object # add attributes from training settings >>> self.n_hidden = n_hidden @@ -115,6 +131,8 @@ replacing *example_model* with the desired model name: >>> self.input_labels = input_labels >>> self.output_labels = output_labels >>> self.input_bounds = input_bounds + >>> self.output_bounds = output_bounds + >>> self.normalized = True # FOQUS will read this and adjust accordingly # create lists to contain new layer objects >>> self.dense_layers = [] # hidden or output layers @@ -143,7 +161,7 @@ replacing *example_model* with the desired model name: # attach attributes to class CONFIG >>> def get_config(self): - >>> config = super(example_model, self).get_config() + >>> config = super(mea_column_model, self).get_config() >>> config.update({ # add any custom attributes here >>> 'n_hidden': self.n_hidden, >>> 'n_neurons': self.n_neurons, @@ -152,8 +170,10 @@ replacing *example_model* with the desired model name: >>> 'input_labels': self.input_labels, >>> 'output_labels': self.output_labels, >>> 'input_bounds': self.input_bounds, + >>> 'output_bounds': self.output_bounds, + >>> 'normalized': self.normalized >>> }) - >>> return config # last line to include in working directory example_model.py + >>> return config # method to create model @@ -161,17 +181,19 @@ replacing *example_model* with the desired model name: >>> inputs = tf.keras.Input(shape=(np.shape(data)[1],)) # create input layer - >>> layers = example_model( # define the rest of network using our custom class + >>> layers = mea_column_model( # define the rest of network using our custom class >>> input_labels=xlabels, >>> output_labels=zlabels, >>> input_bounds=xdata_bounds, + >>> output_bounds=zdata_bounds, + >>> normalized=True >>> ) >>> outputs = layers(inputs) # use network as function outputs = f(inputs) >>> model = tf.keras.Model(inputs=inputs, outputs=outputs) # create model - >>> model.compile(loss='mse', optimizer='SGD', metrics=['mae', 'mse']) + >>> model.compile(loss='mse', optimizer='RMSprop', metrics=['mae', 'mse']) >>> model.fit(xdata, zdata, epochs=500, verbose=0) # train model @@ -180,15 +202,26 @@ replacing *example_model* with the desired model name: # Main code # import data - >>> data = pd.read_csv(r'dataset.csv') + >>> data = pd.read_csv(r'MEA_carbon_capture_dataset_mimo.csv') >>> xdata = data.iloc[:, :6] # here there are 6 input variables/columns >>> zdata = data.iloc[:, 6:] # the rest are output variables/columns >>> xlabels = xdata.columns.tolist() # set labels as a list (default) from pandas >>> zlabels = zdata.columns.tolist() # is a set of IndexedDataSeries objects >>> xdata_bounds = {i: (xdata[i].min(), xdata[i].max()) for i in xdata} # x bounds - - >>> model_data = np.array(data) # Keras requires a Numpy array as input + >>> zdata_bounds = {j: (zdata[j].min(), zdata[j].max()) for j in zdata} # z bounds + + # normalize data + >>> xmax, xmin = xdata.max(axis=0), xdata.min(axis=0) + >>> zmax, zmin = zdata.max(axis=0), zdata.min(axis=0) + >>> xdata, zdata = np.array(xdata), np.array(zdata) + >>> for i in range(len(xdata)): + >>> for j in range(len(xlabels)): + >>> xdata[i, j] = (xdata[i, j] - xmin[j])/(xmax[j] - xmin[j]) + >>> for j in range(len(zlabels)): + >>> zdata[i, j] = (zdata[i, j] - zmin[j])/(zmax[j] - zmin[j]) + + >>> model_data = np.concatenate((xdata,zdata), axis=1) # Keras requires a Numpy array as input # define x and z data, not used but will add to variable dictionary >>> xdata = model_data[:, :-2] @@ -199,7 +232,7 @@ replacing *example_model* with the desired model name: >>> model.summary() # save model - >>> model.save('example_model.h5') + >>> model.save('mea_column_model.h5') After training and saving the model, the files should be placed in the working directory folder as shown below; if FOQUS cannot find the custom class @@ -210,8 +243,8 @@ noted above, only the custom class lines should be included in the script: :alt: User Folders Window :name: fig.surrogate.pluginfolders -Upon launching FOQUS, the console should include the line highlighted in -yellow below to show the model file has been successfully loaded: +Upon launching FOQUS, the console should include the lines boxed in +red below to show the model files have been successfully loaded: .. figure:: figs/plugin_console.png :alt: User Plugin Folders diff --git a/examples/other_files/ML_AI_Plugin/AR_nocustomlayer.foqus b/examples/other_files/ML_AI_Plugin/AR_nocustomlayer.foqus new file mode 100644 index 000000000..c9e389b55 --- /dev/null +++ b/examples/other_files/ML_AI_Plugin/AR_nocustomlayer.foqus @@ -0,0 +1 @@ +{"CCSIFileMetaData":{"ID":"5666aa8216434b559f5f6f787532ca9b","CreationTime":"2021-12-15T12:23:17","ModificationTime":"2021-12-15T12:23:21","ChangeLog":{"2021-12-15T12:23:17":["00.00","9c04c22065e44cdc92426e4cc016d01a","AR_nocustomlayer",""],"2021-12-15T12:23:21":["00.00","5666aa8216434b559f5f6f787532ca9b","AR_nocustomlayer",""]},"DisplayName":"AR_nocustomlayer","OriginalFilename":"AR_nocustomlayer.json","Application":"foqus","Description":"\n\n

None

","MIMEType":"application/ccsi+foqus","Confidence":"experimental","Parents":[],"Role":"Input","UpdateMetadata":true,"Version":"00.00"},"Type":"FOQUS_Session","ID":"AR_nocustomlayer_211215122317","flowsheet":{"errorStat":100,"includeStatusOutput":true,"nodes":{"test":{"modelType":5,"modelName":"AR_nocustomlayer","x":-500.0,"y":-200.0,"z":0.0,"scriptMode":"post","pythonCode":"","calcError":0,"options":{"order":[],"options":{}},"turbApp":null,"turbSession":null,"synced":true}},"edges":[],"input":{"graph":{},"test":{"x1":{"dtype":"float","value":0.8,"min":0.0,"max":100000.0,"default":0.0,"ipvname":null,"opvname":null,"unit":"","set":"pymodel","desc":"input var 1","scaling":"None","tags":[],"dist":{"type":"U","firstParamValue":null,"secondParamValue":null}},"x2":{"dtype":"float","value":0.8,"min":0.0,"max":100000.0,"default":0.0,"ipvname":null,"opvname":null,"unit":"","set":"pymodel","desc":"input var 2","scaling":"None","tags":[],"dist":{"type":"U","firstParamValue":null,"secondParamValue":null}}}},"output":{"graph":{"error":{"dtype":"float","value":100.0,"min":0.0,"max":1.0,"default":0.0,"ipvname":null,"opvname":null,"unit":"","set":"user","desc":"Flowsheet error code","scaling":"None","tags":[],"dist":{"type":"U","firstParamValue":null,"secondParamValue":null}}},"test":{"z1":{"dtype":"float","value":0.17163236439228058,"min":0.0,"max":100000.0,"default":0.0,"ipvname":null,"opvname":null,"unit":"","set":"pymodel","desc":"output var 1","scaling":"None","tags":[],"dist":{"type":"U","firstParamValue":null,"secondParamValue":null}}}},"tearSolver":"Wegstein","tearMaxIt":40,"tearTol":0.001,"tearTolType":"abs","tearLog":false,"tearLogStub":"tear_log","tearBound":false,"wegAccMax":9.0,"wegAccMin":-9.0,"singleCount":0,"onlySingleNode":null,"simList":{},"pre_solve_nodes":[],"post_solve_nodes":[],"no_solve_nodes":[],"turbineSim":null,"input_vectorlist":{"test":{}},"output_vectorlist":{"test":{}},"results":{"__columns":["set","result","time","solution_time","err","input.test.x1","input.test.x2","output.graph.error","output.test.z1","node_err.test","turb.test"],"__indexes":[0],"__filters":{"none":{"filterTerm":null,"sortTerm":null,"no_results":true},"all":{"filterTerm":null,"sortTerm":null,"no_results":false}},"__current_filter":null,"0":["Single_runs","single_0","2021-12-15T20:22:35.073880",0.14294767379760742,100.0,0.8,0.8,100.0,0.17163236439228058,0.0,""],"calculated_columns":{}}},"optProblem":{"obj":[],"g":[],"objtype":0,"custpy":"","v":[],"vs":[],"samp":{},"solver":null,"solverOptions":{}},"surrogateProblem":{"ACOSSO":{"input":[],"output":[],"inputOptions":{},"outputOptions":{},"options":{"Data Filter":"all","Use Flowsheet Data":"Yes","Input Data File":"acosso\\xdat.csv","Output Data File":"acosso\\ydat.csv","Model File":"acosso_fit.rds","FOQUS Model (for UQ)":"acosso_surrogate_uq.py","FOQUS Model (for Flowsheet)":"acosso_surrogate_fs.py","CV":"bic","Order":2}}},"surrogateCurrent":"ACOSSO","uqSimList":[],"uqFilterResultsList":[],"sdoeSimList":[],"sdoeFilterResultsList":[],"odoeCandList":[],"odoeEvalList":[]} \ No newline at end of file diff --git a/examples/other_files/ML_AI_Plugin/AR_nocustomlayer.h5 b/examples/other_files/ML_AI_Plugin/AR_nocustomlayer.h5 new file mode 100644 index 0000000000000000000000000000000000000000..a5c1256f10764af702860aff2ea6b0f9912483c3 GIT binary patch literal 29312 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 literal 0 HcmV?d00001 diff --git a/examples/other_files/ML_AI_Plugin/MEA_carbon_capture_dataset_mimo.csv b/examples/other_files/ML_AI_Plugin/MEA_carbon_capture_dataset_mimo.csv new file mode 100644 index 000000000..f8ed1fa02 --- /dev/null +++ b/examples/other_files/ML_AI_Plugin/MEA_carbon_capture_dataset_mimo.csv @@ -0,0 +1,103 @@ +FGIN (kg/hr),FGIN_CO2MASSFRAC,SOLVENTIN (kg/hr),STRIPPER_PRESSURE (kPa),SOLVENTAMINECONC,SOLVENTCO2LOADING,CO2CAPTUREPERC,SRD (MJ/kg CO2) +2138.738837,0.192869,4989.161874,197.846835,0.337708,0.236674,73.301001,3.26989 +2831.303128,0.203359,5218.52668,185.177875,0.323419,0.265806,47.687099,3.258048 +2250.042011,0.195672,5374.956381,190.277618,0.290879,0.169974,82.254819,3.41642 +2321.96774,0.196474,5398.925266,195.555524,0.310153,0.227942,69.251542,3.338586 +2479.410419,0.200015,5601.551932,181.73308,0.289871,0.171372,75.799199,3.420519 +2018.812227,0.203671,4590.495098,197.392743,0.346165,0.160278,90.484484,3.293884 +2347.518978,0.19052,6887.28333,198.17394,0.334916,0.110817,99.981071,5.908682 +2540.590783,0.209091,6762.761361,188.223945,0.291296,0.13769,93.007754,3.766593 +2712.161713,0.19659,5487.985945,189.057198,0.344874,0.182447,77.016399,3.305744 +2799.901781,0.183237,4627.6642,180.053567,0.31096,0.123006,74.480833,4.200733 +2948.262564,0.17544,6248.465765,186.929616,0.306922,0.114444,96.519207,4.536806 +2086.796808,0.178847,6152.605544,191.514051,0.323797,0.202693,98.934736,3.636405 +2037.625956,0.206671,5289.35058,184.869491,0.348545,0.293569,61.092965,3.213896 +2242.090771,0.199297,6315.843483,199.580191,0.317448,0.157267,99.329479,3.617917 +2377.623889,0.204994,6635.715512,192.955561,0.339152,0.142293,99.806593,4.046672 +2126.678555,0.208806,6862.834622,198.892553,0.299295,0.272172,72.108796,3.44298 +2304.256133,0.197021,6170.447686,184.057717,0.322558,0.172811,96.14069,3.471971 +2573.469285,0.177543,5777.090135,188.699809,0.318929,0.198608,82.40689,3.401435 +2072.516721,0.173639,6306.418889,182.118848,0.344206,0.108836,99.983792,7.785684 +2002.093156,0.202709,5991.794541,199.111401,0.307785,0.135833,99.957895,4.128677 +2055.191547,0.192766,5461.173214,191.022049,0.284457,0.273471,62.435851,3.381983 +2175.620722,0.18574,4520.580362,197.206778,0.303881,0.107072,93.846308,4.345458 +2907.490193,0.181796,6275.134081,185.836287,0.343203,0.166188,90.835152,3.437841 +2042.436403,0.184995,5870.942314,189.648913,0.303069,0.289156,67.629023,3.389437 +2609.91167,0.175261,5314.884307,184.555975,0.309085,0.167119,82.382734,3.421181 +2646.871547,0.184405,5849.881861,183.145883,0.332151,0.271634,61.235727,3.320019 +2542.335159,0.198642,6953.150043,193.775875,0.325577,0.238967,78.375273,3.410113 +2530.152931,0.177182,6998.670255,196.515308,0.33363,0.138342,99.947667,4.628598 +2394.705061,0.203859,6009.811044,184.709814,0.31164,0.282933,57.505948,3.33933 +2232.167732,0.179184,5044.26968,188.348176,0.281119,0.2852,53.79093,3.363199 +2517.729356,0.198044,5546.456077,191.294667,0.345868,0.287836,55.134678,3.234023 +2494.991172,0.174757,5522.144483,199.441528,0.292537,0.283435,55.565132,3.375717 +2928.181575,0.186905,5181.723235,195.004093,0.316499,0.105149,82.831488,4.486932 +2970.283505,0.193276,6974.783455,199.300279,0.349295,0.125894,99.549503,4.149997 +2236.982049,0.186501,5705.731078,197.143467,0.329449,0.292267,62.991254,3.298196 +2584.390754,0.178374,5125.975056,198.820081,0.349613,0.243937,66.877696,3.261627 +2371.596874,0.191273,4794.538423,187.606558,0.30217,0.176912,72.602632,3.353218 +2261.726008,0.18406,4887.244052,190.552953,0.340665,0.28005,59.585552,3.226987 +2599.552602,0.180495,6649.624393,185.821216,0.334624,0.248085,78.731346,3.407544 +2657.915327,0.173826,6485.296346,182.87923,0.32008,0.149091,99.264685,3.944894 +2102.577311,0.183687,6199.841525,185.513499,0.330817,0.101782,99.985725,7.322455 +2111.094378,0.197149,5818.580297,187.424039,0.306491,0.154118,98.851333,3.623072 +2164.039265,0.176752,4822.766517,196.460405,0.296488,0.103732,99.566936,4.718822 +2766.582141,0.190087,6904.021552,198.617965,0.339881,0.291516,61.458955,3.354071 +2315.513384,0.205773,5672.975669,188.861707,0.298608,0.257239,60.496016,3.349052 +2171.600336,0.192156,5798.110301,186.638226,0.304373,0.236336,76.540672,3.397087 +2603.856752,0.209539,5512.2666,182.193916,0.286206,0.195505,62.651649,3.386166 +2877.669396,0.200213,6062.490447,193.225432,0.312695,0.116663,87.74101,4.158968 +2913.335423,0.201655,6024.070974,187.138858,0.343651,0.20096,71.691014,3.315085 +2506.498738,0.182415,6557.644817,187.700315,0.305561,0.163818,97.365987,3.593601 +2423.354744,0.192232,4954.496319,192.349352,0.299131,0.146239,79.334715,3.469417 +2705.759771,0.179776,5923.441441,190.93295,0.336126,0.133795,98.633891,3.921938 +2335.093973,0.182905,6346.874643,186.717327,0.317032,0.258815,76.02771,3.416726 +2409.726784,0.187239,5261.356178,183.483635,0.336662,0.245326,67.855126,3.289959 +2842.868493,0.189723,6436.47344,198.416219,0.333897,0.158357,91.635028,3.428353 +2010.114978,0.193807,6919.865883,192.523548,0.324891,0.196677,99.87484,3.898227 +2099.426218,0.20812,6690.469837,186.182151,0.30198,0.117709,99.977672,5.316329 +2936.570701,0.200907,5155.007801,193.517801,0.300893,0.189623,57.631368,3.341195 +2188.541064,0.208254,4968.032698,188.522884,0.290385,0.234639,59.861828,3.328072 +2513.219391,0.19348,6437.832079,189.897794,0.292988,0.275527,60.197772,3.430907 +2632.051257,0.204659,4674.412752,194.092342,0.310792,0.297726,38.693483,3.201686 +2835.169742,0.174075,5017.572219,183.313266,0.347027,0.230798,64.08618,3.278764 +2997.550391,0.194838,6782.905349,196.774326,0.321782,0.128481,94.162114,3.854482 +2146.643416,0.202157,5389.717953,192.002844,0.335555,0.225891,77.88599,3.299117 +2788.404219,0.187588,6268.906478,196.183485,0.347153,0.179368,89.109722,3.375089 +2749.774634,0.181475,5973.813439,187.909557,0.305722,0.266764,58.478318,3.382519 +2296.584606,0.197426,4713.485361,180.644476,0.29588,0.248948,54.778717,3.306899 +2385.845958,0.198587,6526.672086,193.484008,0.313669,0.147801,99.210606,3.711236 +2802.394039,0.199123,6369.783389,183.555469,0.320258,0.207102,73.260312,3.3826 +2717.785791,0.190839,6384.62367,193.934254,0.327201,0.192151,83.811377,3.39727 +2755.113462,0.183286,5120.743598,190.822087,0.293992,0.223973,57.721593,3.363673 +2273.661001,0.209875,5093.350835,194.986628,0.315116,0.278449,52.233474,3.246215 +2222.934618,0.197905,5612.562232,189.779949,0.342875,0.127868,99.813866,4.391442 +2864.404843,0.1813,5657.629419,191.870393,0.281168,0.174714,69.930604,3.451998 +2076.641714,0.184702,5203.613949,189.350562,0.338483,0.180854,97.290568,3.414747 +2491.365565,0.205102,4757.422193,180.354612,0.287337,0.222671,53.162306,3.331175 +2433.237915,0.206576,5911.880907,192.803819,0.287889,0.219358,66.925343,3.403431 +2404.064394,0.195214,6601.958311,195.941103,0.326651,0.264528,72.453615,3.377275 +2699.082561,0.201289,6730.016934,195.4108,0.297034,0.12446,94.956948,3.964175 +2434.102844,0.173247,5627.257447,197.568308,0.304577,0.262937,65.716073,3.381251 +2208.977269,0.180904,6115.89488,193.163088,0.314452,0.243121,82.710938,3.427451 +2729.153972,0.207684,6679.99643,183.857903,0.337968,0.210856,77.852706,3.360026 +2197.68361,0.176392,6407.4577,195.807452,0.325352,0.254301,86.289609,3.445552 +2360.600104,0.175979,4553.331946,181.209434,0.316141,0.211892,69.123892,3.320659 +2025.13694,0.178271,6723.902758,195.213893,0.341265,0.120657,99.981845,6.64178 +2639.451501,0.207308,5440.825245,181.592495,0.330618,0.298701,45.678775,3.23874 +2817.125793,0.208747,4541.061183,182.612032,0.329722,0.228638,48.372086,3.231524 +2975.74209,0.189985,4779.863331,186.433667,0.308197,0.100575,73.75723,4.88827 +2886.850889,0.201888,6842.047895,194.2267,0.322831,0.186798,80.797849,3.404128 +2353.024612,0.176957,5890.330596,191.360415,0.297595,0.208862,83.54375,3.459687 +2550.427041,0.179944,5744.85443,180.765795,0.327489,0.253113,68.246813,3.347163 +2471.607053,0.19413,6821.56773,196.907818,0.342036,0.250239,80.042344,3.379896 +2451.165197,0.191782,4608.353516,194.341161,0.328927,0.140667,80.876954,3.4988 +2444.096414,0.18525,5232.478552,189.241993,0.340999,0.144152,95.095703,3.600175 +2287.064302,0.200718,5946.246767,199.696979,0.294358,0.162727,89.305188,3.447651 +2205.810361,0.207092,4906.1729,182.785029,0.319423,0.213686,68.617601,3.292692 +2687.747971,0.189217,5580.060657,180.270033,0.312585,0.119274,90.54871,4.402867 +2666.796996,0.174524,6473.049764,182.406228,0.347971,0.233316,84.18988,3.399233 +2893.284432,0.204294,5306.330593,184.180633,0.288282,0.241295,47.681047,3.347568 +2565.690324,0.195491,5336.182526,199.892992,0.328035,0.130898,89.161796,3.642847 +2065.107438,0.194587,6078.863597,194.701881,0.295187,0.151194,99.648349,3.770705 +2771.694877,0.178,6795.15758,185.128771,0.331618,0.113004,99.885096,5.534192 diff --git a/examples/other_files/ML_AI_Plugin/mea_column_model.foqus b/examples/other_files/ML_AI_Plugin/mea_column_model.foqus new file mode 100644 index 000000000..6a9fc8ae9 --- /dev/null +++ b/examples/other_files/ML_AI_Plugin/mea_column_model.foqus @@ -0,0 +1 @@ +{"CCSIFileMetaData":{"ID":"497ceabfa07144c1a06d855fbef20223","CreationTime":"2021-12-15T09:33:55","ModificationTime":"2021-12-15T10:54:44","ChangeLog":{"2021-12-15T09:33:55":["00.00","0e6ded8a1c16477fa5be7609411e5ef5","test_mea",""],"2021-12-15T09:34:05":["00.00","8b2ee50aacce4ce09d8e04e6181819c7","test_mea",""],"2021-12-15T10:54:40":["00.00","2ee64cf69a924b0c98576a9fb7664058","test_mea",""],"2021-12-15T10:54:44":["00.00","497ceabfa07144c1a06d855fbef20223","test_mea",""]},"DisplayName":"test_mea","OriginalFilename":"test_mea.json","Application":"foqus","Description":"\n\n

None

","MIMEType":"application/ccsi+foqus","Confidence":"experimental","Parents":[],"Role":"Input","UpdateMetadata":true,"Version":"00.00"},"Type":"FOQUS_Session","ID":"test_mea_211215093355","flowsheet":{"errorStat":100,"includeStatusOutput":true,"nodes":{"test":{"modelType":5,"modelName":"mea_column_model","x":-40.0,"y":-100.0,"z":0.0,"scriptMode":"post","pythonCode":"","calcError":0,"options":{"order":[],"options":{}},"turbApp":null,"turbSession":null,"synced":true}},"edges":[],"input":{"graph":{},"test":{"FGIN (kg/hr)":{"dtype":"float","value":2138.738837,"min":2002.093156,"max":2997.550391,"default":0.0,"ipvname":null,"opvname":null,"unit":"","set":"pymodel","desc":"input var 1","scaling":"None","tags":[],"dist":{"type":"U","firstParamValue":null,"secondParamValue":null}},"FGIN_CO2MASSFRAC":{"dtype":"float","value":0.192869,"min":0.173247,"max":0.209875,"default":0.0,"ipvname":null,"opvname":null,"unit":"","set":"pymodel","desc":"input var 2","scaling":"None","tags":[],"dist":{"type":"U","firstParamValue":null,"secondParamValue":null}},"SOLVENTIN (kg/hr)":{"dtype":"float","value":4989.161874,"min":4520.580362,"max":6998.670255,"default":0.0,"ipvname":null,"opvname":null,"unit":"","set":"pymodel","desc":"input var 3","scaling":"None","tags":[],"dist":{"type":"U","firstParamValue":null,"secondParamValue":null}},"STRIPPER_PRESSURE (kPa)":{"dtype":"float","value":197.846835,"min":180.053567,"max":199.892992,"default":0.0,"ipvname":null,"opvname":null,"unit":"","set":"pymodel","desc":"input var 4","scaling":"None","tags":[],"dist":{"type":"U","firstParamValue":null,"secondParamValue":null}},"SOLVENTAMINECONC":{"dtype":"float","value":0.337708,"min":0.281119,"max":0.349613,"default":0.0,"ipvname":null,"opvname":null,"unit":"","set":"pymodel","desc":"input var 5","scaling":"None","tags":[],"dist":{"type":"U","firstParamValue":null,"secondParamValue":null}},"SOLVENTCO2LOADING":{"dtype":"float","value":0.236674,"min":0.100575,"max":0.298701,"default":0.0,"ipvname":null,"opvname":null,"unit":"","set":"pymodel","desc":"input var 6","scaling":"None","tags":[],"dist":{"type":"U","firstParamValue":null,"secondParamValue":null}}}},"output":{"graph":{"error":{"dtype":"float","value":100.0,"min":0.0,"max":1.0,"default":0.0,"ipvname":null,"opvname":null,"unit":"","set":"user","desc":"Flowsheet error code","scaling":"None","tags":[],"dist":{"type":"U","firstParamValue":null,"secondParamValue":null}}},"test":{"CO2CAPTUREPERC":{"dtype":"float","value":74.27414865909816,"min":38.693483,"max":99.985725,"default":0.0,"ipvname":null,"opvname":null,"unit":"","set":"pymodel","desc":"output var 1","scaling":"None","tags":[],"dist":{"type":"U","firstParamValue":null,"secondParamValue":null}},"SRD (MJ/kg CO2)":{"dtype":"float","value":3.227919262299001,"min":3.201686,"max":7.785684,"default":0.0,"ipvname":null,"opvname":null,"unit":"","set":"pymodel","desc":"output var 2","scaling":"None","tags":[],"dist":{"type":"U","firstParamValue":null,"secondParamValue":null}}}},"tearSolver":"Wegstein","tearMaxIt":40,"tearTol":0.001,"tearTolType":"abs","tearLog":false,"tearLogStub":"tear_log","tearBound":false,"wegAccMax":9.0,"wegAccMin":-9.0,"singleCount":0,"onlySingleNode":null,"simList":{},"pre_solve_nodes":[],"post_solve_nodes":[],"no_solve_nodes":[],"turbineSim":null,"input_vectorlist":{"test":{}},"output_vectorlist":{"test":{}},"results":{"__columns":["set","result","time","solution_time","err","input.test.FGIN (kg/hr)","input.test.FGIN_CO2MASSFRAC","input.test.SOLVENTIN (kg/hr)","input.test.STRIPPER_PRESSURE (kPa)","input.test.SOLVENTAMINECONC","input.test.SOLVENTCO2LOADING","output.graph.error","output.test.CO2CAPTUREPERC","output.test.SRD (MJ/kg CO2)","node_err.test","turb.test"],"__indexes":[0,1],"__filters":{"none":{"filterTerm":null,"sortTerm":null,"no_results":true},"all":{"filterTerm":null,"sortTerm":null,"no_results":false}},"__current_filter":null,"0":["Single_runs","single_0","2021-12-15T17:50:32.536203",0.27001953125,100.0,2138.739,0.192869,0.337708,0.236674,4989.162,197.8468,100.0,99.985725,7.785684,0.0,""],"1":["Single_runs","single_0_0001","2021-12-15T18:54:21.376659",0.17123055458068848,100.0,2138.738837,0.192869,4989.161874,197.846835,0.337708,0.236674,100.0,74.27414865909816,3.227919262299001,0.0,""],"calculated_columns":{}}},"optProblem":{"obj":[],"g":[],"objtype":0,"custpy":"","v":[],"vs":[],"samp":{},"solver":null,"solverOptions":{}},"surrogateProblem":{"ACOSSO":{"input":[],"output":[],"inputOptions":{},"outputOptions":{},"options":{"Data Filter":"all","Use Flowsheet Data":"Yes","Input Data File":"acosso\\xdat.csv","Output Data File":"acosso\\ydat.csv","Model File":"acosso_fit.rds","FOQUS Model (for UQ)":"acosso_surrogate_uq.py","FOQUS Model (for Flowsheet)":"acosso_surrogate_fs.py","CV":"bic","Order":2}}},"surrogateCurrent":"ACOSSO","uqSimList":[],"uqFilterResultsList":[],"sdoeSimList":[],"sdoeFilterResultsList":[],"odoeCandList":[],"odoeEvalList":[]} \ No newline at end of file diff --git a/examples/other_files/ML_AI_Plugin/mea_column_model.h5 b/examples/other_files/ML_AI_Plugin/mea_column_model.h5 new file mode 100644 index 0000000000000000000000000000000000000000..f41e2bb6de9b56291e5c0c8bf485adaf3a059040 GIT binary patch literal 26120 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 literal 0 HcmV?d00001 diff --git a/examples/other_files/ML_AI_Plugin/mea_column_model.py b/examples/other_files/ML_AI_Plugin/mea_column_model.py new file mode 100644 index 000000000..00f9345aa --- /dev/null +++ b/examples/other_files/ML_AI_Plugin/mea_column_model.py @@ -0,0 +1,77 @@ +import os +import numpy as np +import pandas as pd +import random as rn +import tensorflow as tf + +# set seed values for reproducibility +os.environ['PYTHONHASHSEED'] = '0' +os.environ['CUDA_VISIBLE_DEVICES'] = '' +np.random.seed(46) +rn.seed(1342) +tf.random.set_seed(62) + +# custom class to define Keras NN layers +@tf.keras.utils.register_keras_serializable() +class mea_column_model(tf.keras.layers.Layer): + def __init__(self, n_hidden=1, n_neurons=12, + layer_act='relu', out_act='sigmoid', + input_labels=None, output_labels=None, + input_bounds=None, output_bounds=None, + normalized=False, **kwargs): + + super(mea_column_model, self).__init__() # create callable object + + # add attributes from training settings + self.n_hidden = n_hidden + self.n_neurons = n_neurons + self.layer_act = layer_act + self.out_act = out_act + + # add attributes from model data + self.input_labels = input_labels + self.output_labels = output_labels + self.input_bounds = input_bounds + self.output_bounds = output_bounds + self.normalized = True # FOQUS will read this and adjust accordingly + + # create lists to contain new layer objects + self.dense_layers = [] # hidden or output layers + self.dropout = [] # for large number of neurons, certain neurons + # can be randomly dropped out to reduce overfitting + + for layer in range(self.n_hidden): + self.dense_layers.append( + tf.keras.layers.Dense( + self.n_neurons, activation=self.layer_act)) + + self.dense_layers_out = tf.keras.layers.Dense( + 2, activation=self.out_act) + + # define network layer connections + def call(self, inputs): + + x = inputs # single input layer, input defined in create_model() + for layer in self.dense_layers: # hidden layers + x = layer(x) # h1 = f(input), h2 = f(h1), ... using act func + for layer in self.dropout: # no dropout layers used in this example + x = layer(x) + x = self.dense_layers_out(x) # single output layer, output = f(h_last) + + return x + + # attach attributes to class CONFIG + def get_config(self): + config = super(mea_column_model, self).get_config() + config.update({ + 'n_hidden': self.n_hidden, + 'n_neurons': self.n_neurons, + 'layer_act': self.layer_act, + 'out_act': self.out_act, + 'input_labels': self.input_labels, + 'output_labels': self.output_labels, + 'input_bounds': self.input_bounds, + 'output_bounds': self.output_bounds, + 'normalized': self.normalized + }) + return config diff --git a/examples/other_files/ML_AI_Plugin/mea_column_model_training.py b/examples/other_files/ML_AI_Plugin/mea_column_model_training.py new file mode 100644 index 000000000..77d1846bb --- /dev/null +++ b/examples/other_files/ML_AI_Plugin/mea_column_model_training.py @@ -0,0 +1,145 @@ +import os +import numpy as np +import pandas as pd +import random as rn +import tensorflow as tf + +# set seed values for reproducibility +os.environ['PYTHONHASHSEED'] = '0' +os.environ['CUDA_VISIBLE_DEVICES'] = '' +np.random.seed(46) +rn.seed(1342) +tf.random.set_seed(62) + +# Example follows the sequence below: + # 1) Code at end of file to import data and create model + # 2) Call create_model() to define inputs and outputs + # 3) Call CustomLayer to define network structure, which uses + # call() to define layer connections and get_config to attach + # attributes to CustomLayer class object + # 4) Back to create_model() to compile and train model + # 5) Back to code at end of file to save, load and test model + +# custom class to define Keras NN layers +@tf.keras.utils.register_keras_serializable() +class mea_column_model(tf.keras.layers.Layer): + def __init__(self, n_hidden=1, n_neurons=12, + layer_act='relu', out_act='sigmoid', + input_labels=None, output_labels=None, + input_bounds=None, output_bounds=None, + normalized=False, **kwargs): + + super(mea_column_model, self).__init__() # create callable object + + # add attributes from training settings + self.n_hidden = n_hidden + self.n_neurons = n_neurons + self.layer_act = layer_act + self.out_act = out_act + + # add attributes from model data + self.input_labels = input_labels + self.output_labels = output_labels + self.input_bounds = input_bounds + self.output_bounds = output_bounds + self.normalized = True # FOQUS will read this and adjust accordingly + + # create lists to contain new layer objects + self.dense_layers = [] # hidden or output layers + self.dropout = [] # for large number of neurons, certain neurons + # can be randomly dropped out to reduce overfitting + + for layer in range(self.n_hidden): + self.dense_layers.append( + tf.keras.layers.Dense( + self.n_neurons, activation=self.layer_act)) + + self.dense_layers_out = tf.keras.layers.Dense( + 2, activation=self.out_act) + + # define network layer connections + def call(self, inputs): + + x = inputs # single input layer, input defined in create_model() + for layer in self.dense_layers: # hidden layers + x = layer(x) # h1 = f(input), h2 = f(h1), ... using act func + for layer in self.dropout: # no dropout layers used in this example + x = layer(x) + x = self.dense_layers_out(x) # single output layer, output = f(h_last) + + return x + + # attach attributes to class CONFIG + def get_config(self): + config = super(mea_column_model, self).get_config() + config.update({ + 'n_hidden': self.n_hidden, + 'n_neurons': self.n_neurons, + 'layer_act': self.layer_act, + 'out_act': self.out_act, + 'input_labels': self.input_labels, + 'output_labels': self.output_labels, + 'input_bounds': self.input_bounds, + 'output_bounds': self.output_bounds, + 'normalized': self.normalized + }) + return config + + +# method to create model +def create_model(data): + + inputs = tf.keras.Input(shape=(np.shape(data)[1],)) # create input layer + + layers = mea_column_model( # define the rest of network using our custom class + input_labels=xlabels, + output_labels=zlabels, + input_bounds=xdata_bounds, + output_bounds=zdata_bounds, + normalized=True + ) + + outputs = layers(inputs) # use network as function outputs = f(inputs) + + model = tf.keras.Model(inputs=inputs, outputs=outputs) # create model + + model.compile(loss='mse', optimizer='RMSprop', metrics=['mae', 'mse']) + + model.fit(xdata, zdata, epochs=500, verbose=0) # train model + + return model + +# Main code + +# import data +data = pd.read_csv(r'MEA_carbon_capture_dataset_mimo.csv') + +xdata = data.iloc[:, :6] # there are 6 input variables/columns +zdata = data.iloc[:, 6:] # the rest are output variables/columns +xlabels = xdata.columns.tolist() # set labels as a list (default) from pandas +zlabels = zdata.columns.tolist() # is a set of IndexedDataSeries objects +xdata_bounds = {i: (xdata[i].min(), xdata[i].max()) for i in xdata} # x bounds +zdata_bounds = {j: (zdata[j].min(), zdata[j].max()) for j in zdata} # z bounds + +# normalize data +xmax, xmin = xdata.max(axis=0), xdata.min(axis=0) +zmax, zmin = zdata.max(axis=0), zdata.min(axis=0) +xdata, zdata = np.array(xdata), np.array(zdata) +for i in range(len(xdata)): + for j in range(len(xlabels)): + xdata[i, j] = (xdata[i, j] - xmin[j])/(xmax[j] - xmin[j]) + for j in range(len(zlabels)): + zdata[i, j] = (zdata[i, j] - zmin[j])/(zmax[j] - zmin[j]) + +model_data = np.concatenate((xdata,zdata), axis=1) # Keras requires a Numpy array as input + +# define x and z data, not used but will add to variable dictionary +xdata = model_data[:, :-2] +zdata = model_data[:, -2:] + +# create model +model = create_model(xdata) +model.summary() + +# save model +model.save('mea_column_model.h5') diff --git a/foqus_lib/framework/graph/node.py b/foqus_lib/framework/graph/node.py index b32aa6514..b5c724b27 100644 --- a/foqus_lib/framework/graph/node.py +++ b/foqus_lib/framework/graph/node.py @@ -114,7 +114,7 @@ def __init__(self, model): input_max = 1e5 # not necessarily a good default self.inputs[input_label] = NodeVars( - value = 0, # set default value to zero, since this can be changed in the flowsheet + value = input_min, vmin = input_min, vmax = input_max, vdflt = 0.0, @@ -139,7 +139,7 @@ def __init__(self, model): output_max = 1e5 # not necessarily a good default self.outputs[output_label] = NodeVars( - value = 0, # set default value to zero, since this can be changed in the flowsheet + value = output_min, vmin = output_min, vmax = output_max, vdflt = 0.0, @@ -149,15 +149,31 @@ def __init__(self, model): tags = [], dtype = float) + # check if user passed a model for normalized data - FOQUS will automatically scale/un-scale + try: # if attribute exists, user has specified a model form + self.normalized = self.model.layers[1].normalized + except: # otherwise user did not pass a normalized model + self.normalized = False + def run(self): import numpy as np - inputs = [self.inputs[i].value for i in self.inputs] + if self.normalized is True: # normalize inputs + inputs = [(self.inputs[i].value - self.inputs[i].min) / + (self.inputs[i].max - self.inputs[i].min) + for i in self.inputs] + else: # take actual input values + inputs = [self.inputs[i].value for i in self.inputs] print(inputs) # set output values to be generated from NN surrogate outputs = self.model.predict(np.array(inputs, ndmin=2))[0] outidx = 0 for j in self.outputs: - self.outputs[j].value = outputs[outidx] + if self.normalized is True: # un-normalize outputs + self.outputs[j].value = (outputs[outidx] * + (self.outputs[j].max - self.outputs[j].min) + + self.outputs[j].min) + else: + self.outputs[j].value = outputs[outidx] outidx += 1 diff --git a/foqus_lib/framework/graph/nodeVars.py b/foqus_lib/framework/graph/nodeVars.py index c74681e7e..c2caf9c46 100644 --- a/foqus_lib/framework/graph/nodeVars.py +++ b/foqus_lib/framework/graph/nodeVars.py @@ -533,8 +533,8 @@ def __init__( vmax = value if vdflt is None: vdflt = value - self.min = vmin # maximum value - self.max = vmax # minimum value + self.min = vmin # minimum value + self.max = vmax # maximum value self.default = vdflt # default value self.unit = unit # units of measure self.set = vst # variable set name user or sinter so I know if From a993b539957a65ca15083a6988a77e279fc6bb1a Mon Sep 17 00:00:00 2001 From: Brandon Paul Date: Wed, 15 Dec 2021 14:26:55 -0800 Subject: [PATCH 12/40] Minor documentation fixes --- docs/source/chapt_surrogates/mlaiplugin.rst | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/docs/source/chapt_surrogates/mlaiplugin.rst b/docs/source/chapt_surrogates/mlaiplugin.rst index c0278bc59..a53470265 100644 --- a/docs/source/chapt_surrogates/mlaiplugin.rst +++ b/docs/source/chapt_surrogates/mlaiplugin.rst @@ -42,7 +42,7 @@ multiple interconnected layers in a complex system. More information on Tensorflow Keras model building is described by :ref:`(Wu et al. 2020)`. Users may follow the recommended workflow to install and use Tensorflow in a Python environment, as described in the -`(Tensorflow documentation)`. +Tensorflow documentation: https://www.tensorflow.org/install. The ML AI Plugin supports adding neural networks of either type to FOQUS nodes; if a custom object is needed, only the Functional API supports @@ -62,7 +62,13 @@ Currently, FOQUS supports the following custom attributes: bounds for each output variable (default: (0, 1E5)) - *normalized* – Boolean flag for whether the user is passing a normalized neural network model; to use this flag, users must train their models with - data in the form below and add all input and output bounds custom attributes + data in the form below and add all input and output bounds custom attributes. + Normalizing uses the data bounds to scale the data values such that the + lower bound becomes 0 and the upper bound becomes 1: + +.. math:: x_{norm} = \frac{x_{data} - x_{min}}{x_{max} - x_{min}} + +.. math:: z_{norm} = \frac{z_{data} - z_{min}}{z_{max} - z_{min}} The following code snippet demonstrates the Python syntax to train and save a Keras model with custom attributes. The use of Dropout features in training @@ -86,7 +92,7 @@ replacing *example_model* with the desired model name: - The file names of the .h5 model file and custom class script. For example, the model name below is 'mea_column_model'. See the example files -in the examples\other_files\ML_AI_Plugin folder for complete syntax and usage. +in examples >> other_files >> ML_AI_Plugin for complete syntax and usage. The folder contains a second model with no custom layer to demonstrate the plugin defaults. To run the models, copy mea_column_model.h5, mea_column_model.py and AR_nocustomlayer.h5 into the working directory folder user_ml_ai_models\. From 064fd28bcbcb4c003041a5b3902d1e89f38a9fdf Mon Sep 17 00:00:00 2001 From: Brandon Paul Date: Mon, 10 Jan 2022 12:36:08 -0800 Subject: [PATCH 13/40] Improvements from testing --- docs/source/chapt_surrogates/mlaiplugin.rst | 15 ++++++++++----- .../AR_nocustomlayer.h5 | Bin .../mea_column_model.h5 | Bin .../TensorFlow_2-7_Models/AR_nocustomlayer.h5 | Bin 0 -> 26368 bytes .../TensorFlow_2-7_Models/mea_column_model.h5 | Bin 0 -> 26952 bytes .../ML_AI_Plugin/mea_column_model.py | 2 +- .../ML_AI_Plugin/mea_column_model_training.py | 2 +- 7 files changed, 12 insertions(+), 7 deletions(-) rename examples/other_files/ML_AI_Plugin/{ => TensorFlow_2-3_Models}/AR_nocustomlayer.h5 (100%) rename examples/other_files/ML_AI_Plugin/{ => TensorFlow_2-3_Models}/mea_column_model.h5 (100%) create mode 100644 examples/other_files/ML_AI_Plugin/TensorFlow_2-7_Models/AR_nocustomlayer.h5 create mode 100644 examples/other_files/ML_AI_Plugin/TensorFlow_2-7_Models/mea_column_model.h5 diff --git a/docs/source/chapt_surrogates/mlaiplugin.rst b/docs/source/chapt_surrogates/mlaiplugin.rst index a53470265..536d2ee2c 100644 --- a/docs/source/chapt_surrogates/mlaiplugin.rst +++ b/docs/source/chapt_surrogates/mlaiplugin.rst @@ -17,7 +17,7 @@ launched. Section :ref:`tutorial.surrogate.fs`. - ML_AI – Selecting this model type in the Node Editor displays available - neural network models; this tool currently supports Tensorflow Keras + neural network models; this tool currently supports TensorFlow Keras model files in hierarchical data format 5 (.h5). To use this tool, users must train and export a Keras model and place the file in the appropriate folder user_ml_ai_plugins in the working directory, as @@ -30,7 +30,6 @@ launched. same manner as Pymodel Plugins, per the workflow in Section :ref:`tutorial.surrogate.fs`. - Custom Model Attributes ----------------------- @@ -39,10 +38,16 @@ machine learning library to train complex model within Python's user-friendly framework. Largely, Keras models may be split into two types: **Sequential** which build linearly connected model layers, and **Functional** which build multiple interconnected layers in a complex system. More information on -Tensorflow Keras model building is described by +TensorFlow Keras model building is described by :ref:`(Wu et al. 2020)`. Users may follow the recommended workflow -to install and use Tensorflow in a Python environment, as described in the -Tensorflow documentation: https://www.tensorflow.org/install. +to install and use TensorFlow in a Python environment, as described in the +TensorFlow documentation: https://www.tensorflow.org/install. + +When importing TensorFlow Keras models, users should ensure their Python environment +contains the same Keras package version used to train the model files. TensorFlow +offers limited compatibility between versions. The example files include models +trained with TensorFlow 2.3 and 2.7; users with TensorFlow 2.7 should use the 2.7 +models. The ML AI Plugin supports adding neural networks of either type to FOQUS nodes; if a custom object is needed, only the Functional API supports diff --git a/examples/other_files/ML_AI_Plugin/AR_nocustomlayer.h5 b/examples/other_files/ML_AI_Plugin/TensorFlow_2-3_Models/AR_nocustomlayer.h5 similarity index 100% rename from examples/other_files/ML_AI_Plugin/AR_nocustomlayer.h5 rename to examples/other_files/ML_AI_Plugin/TensorFlow_2-3_Models/AR_nocustomlayer.h5 diff --git a/examples/other_files/ML_AI_Plugin/mea_column_model.h5 b/examples/other_files/ML_AI_Plugin/TensorFlow_2-3_Models/mea_column_model.h5 similarity index 100% rename from examples/other_files/ML_AI_Plugin/mea_column_model.h5 rename to examples/other_files/ML_AI_Plugin/TensorFlow_2-3_Models/mea_column_model.h5 diff --git a/examples/other_files/ML_AI_Plugin/TensorFlow_2-7_Models/AR_nocustomlayer.h5 b/examples/other_files/ML_AI_Plugin/TensorFlow_2-7_Models/AR_nocustomlayer.h5 new file mode 100644 index 0000000000000000000000000000000000000000..26c37e0d0efea6fa190556d7d03125069e2d4f31 GIT binary patch literal 26368 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 literal 0 HcmV?d00001 diff --git a/examples/other_files/ML_AI_Plugin/TensorFlow_2-7_Models/mea_column_model.h5 b/examples/other_files/ML_AI_Plugin/TensorFlow_2-7_Models/mea_column_model.h5 new file mode 100644 index 0000000000000000000000000000000000000000..20ae9c99923312f78a96ed46619b8e6fbcf837fa GIT binary patch literal 26952 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 Date: Mon, 10 Jan 2022 12:48:29 -0800 Subject: [PATCH 14/40] Running black from main directory --- .../ML_AI_Plugin/mea_column_model.py | 57 +++++++----- .../ML_AI_Plugin/mea_column_model_training.py | 88 ++++++++++-------- foqus_lib/framework/graph/node.py | 92 +++++++++++-------- .../framework/ml_ai_models/mlaiSearch.py | 34 ++++--- foqus_lib/framework/session/session.py | 22 +++-- foqus_lib/gui/flowsheet/nodePanel.py | 5 +- 6 files changed, 173 insertions(+), 125 deletions(-) diff --git a/examples/other_files/ML_AI_Plugin/mea_column_model.py b/examples/other_files/ML_AI_Plugin/mea_column_model.py index 201b49a29..b5707eac9 100644 --- a/examples/other_files/ML_AI_Plugin/mea_column_model.py +++ b/examples/other_files/ML_AI_Plugin/mea_column_model.py @@ -5,8 +5,10 @@ import tensorflow as tf # set seed values for reproducibility -os.environ['PYTHONHASHSEED'] = '0' -os.environ['CUDA_VISIBLE_DEVICES'] = '' # changing '' to '0' or '-1' may solve import issues +os.environ["PYTHONHASHSEED"] = "0" +os.environ[ + "CUDA_VISIBLE_DEVICES" +] = "" # changing "" to "0" or "-1" may solve import issues np.random.seed(46) rn.seed(1342) tf.random.set_seed(62) @@ -14,11 +16,19 @@ # custom class to define Keras NN layers @tf.keras.utils.register_keras_serializable() class mea_column_model(tf.keras.layers.Layer): - def __init__(self, n_hidden=1, n_neurons=12, - layer_act='relu', out_act='sigmoid', - input_labels=None, output_labels=None, - input_bounds=None, output_bounds=None, - normalized=False, **kwargs): + def __init__( + self, + n_hidden=1, + n_neurons=12, + layer_act="relu", + out_act="sigmoid", + input_labels=None, + output_labels=None, + input_bounds=None, + output_bounds=None, + normalized=False, + **kwargs + ): super(mea_column_model, self).__init__() # create callable object @@ -38,15 +48,14 @@ def __init__(self, n_hidden=1, n_neurons=12, # create lists to contain new layer objects self.dense_layers = [] # hidden or output layers self.dropout = [] # for large number of neurons, certain neurons - # can be randomly dropped out to reduce overfitting + # can be randomly dropped out to reduce overfitting for layer in range(self.n_hidden): self.dense_layers.append( - tf.keras.layers.Dense( - self.n_neurons, activation=self.layer_act)) + tf.keras.layers.Dense(self.n_neurons, activation=self.layer_act) + ) - self.dense_layers_out = tf.keras.layers.Dense( - 2, activation=self.out_act) + self.dense_layers_out = tf.keras.layers.Dense(2, activation=self.out_act) # define network layer connections def call(self, inputs): @@ -63,15 +72,17 @@ def call(self, inputs): # attach attributes to class CONFIG def get_config(self): config = super(mea_column_model, self).get_config() - config.update({ - 'n_hidden': self.n_hidden, - 'n_neurons': self.n_neurons, - 'layer_act': self.layer_act, - 'out_act': self.out_act, - 'input_labels': self.input_labels, - 'output_labels': self.output_labels, - 'input_bounds': self.input_bounds, - 'output_bounds': self.output_bounds, - 'normalized': self.normalized - }) + config.update( + { + "n_hidden": self.n_hidden, + "n_neurons": self.n_neurons, + "layer_act": self.layer_act, + "out_act": self.out_act, + "input_labels": self.input_labels, + "output_labels": self.output_labels, + "input_bounds": self.input_bounds, + "output_bounds": self.output_bounds, + "normalized": self.normalized, + } + ) return config diff --git a/examples/other_files/ML_AI_Plugin/mea_column_model_training.py b/examples/other_files/ML_AI_Plugin/mea_column_model_training.py index 4ebb8d26e..8b1c82549 100644 --- a/examples/other_files/ML_AI_Plugin/mea_column_model_training.py +++ b/examples/other_files/ML_AI_Plugin/mea_column_model_training.py @@ -5,29 +5,39 @@ import tensorflow as tf # set seed values for reproducibility -os.environ['PYTHONHASHSEED'] = '0' -os.environ['CUDA_VISIBLE_DEVICES'] = '' # changing '' to '0' or '-1' may solve import issues +os.environ["PYTHONHASHSEED"] = "0" +os.environ[ + "CUDA_VISIBLE_DEVICES" +] = "" # changing "" to "0" or "-1" may solve import issues np.random.seed(46) rn.seed(1342) tf.random.set_seed(62) # Example follows the sequence below: - # 1) Code at end of file to import data and create model - # 2) Call create_model() to define inputs and outputs - # 3) Call CustomLayer to define network structure, which uses - # call() to define layer connections and get_config to attach - # attributes to CustomLayer class object - # 4) Back to create_model() to compile and train model - # 5) Back to code at end of file to save, load and test model +# 1) Code at end of file to import data and create model +# 2) Call create_model() to define inputs and outputs +# 3) Call CustomLayer to define network structure, which uses +# call() to define layer connections and get_config to attach +# attributes to CustomLayer class object +# 4) Back to create_model() to compile and train model +# 5) Back to code at end of file to save, load and test model # custom class to define Keras NN layers @tf.keras.utils.register_keras_serializable() class mea_column_model(tf.keras.layers.Layer): - def __init__(self, n_hidden=1, n_neurons=12, - layer_act='relu', out_act='sigmoid', - input_labels=None, output_labels=None, - input_bounds=None, output_bounds=None, - normalized=False, **kwargs): + def __init__( + self, + n_hidden=1, + n_neurons=12, + layer_act="relu", + out_act="sigmoid", + input_labels=None, + output_labels=None, + input_bounds=None, + output_bounds=None, + normalized=False, + **kwargs + ): super(mea_column_model, self).__init__() # create callable object @@ -47,15 +57,14 @@ def __init__(self, n_hidden=1, n_neurons=12, # create lists to contain new layer objects self.dense_layers = [] # hidden or output layers self.dropout = [] # for large number of neurons, certain neurons - # can be randomly dropped out to reduce overfitting + # can be randomly dropped out to reduce overfitting for layer in range(self.n_hidden): self.dense_layers.append( - tf.keras.layers.Dense( - self.n_neurons, activation=self.layer_act)) + tf.keras.layers.Dense(self.n_neurons, activation=self.layer_act) + ) - self.dense_layers_out = tf.keras.layers.Dense( - 2, activation=self.out_act) + self.dense_layers_out = tf.keras.layers.Dense(2, activation=self.out_act) # define network layer connections def call(self, inputs): @@ -72,17 +81,19 @@ def call(self, inputs): # attach attributes to class CONFIG def get_config(self): config = super(mea_column_model, self).get_config() - config.update({ - 'n_hidden': self.n_hidden, - 'n_neurons': self.n_neurons, - 'layer_act': self.layer_act, - 'out_act': self.out_act, - 'input_labels': self.input_labels, - 'output_labels': self.output_labels, - 'input_bounds': self.input_bounds, - 'output_bounds': self.output_bounds, - 'normalized': self.normalized - }) + config.update( + { + "n_hidden": self.n_hidden, + "n_neurons": self.n_neurons, + "layer_act": self.layer_act, + "out_act": self.out_act, + "input_labels": self.input_labels, + "output_labels": self.output_labels, + "input_bounds": self.input_bounds, + "output_bounds": self.output_bounds, + "normalized": self.normalized, + } + ) return config @@ -96,23 +107,24 @@ def create_model(data): output_labels=zlabels, input_bounds=xdata_bounds, output_bounds=zdata_bounds, - normalized=True + normalized=True, ) outputs = layers(inputs) # use network as function outputs = f(inputs) model = tf.keras.Model(inputs=inputs, outputs=outputs) # create model - model.compile(loss='mse', optimizer='RMSprop', metrics=['mae', 'mse']) + model.compile(loss="mse", optimizer="RMSprop", metrics=["mae", "mse"]) model.fit(xdata, zdata, epochs=500, verbose=0) # train model return model + # Main code # import data -data = pd.read_csv(r'MEA_carbon_capture_dataset_mimo.csv') +data = pd.read_csv(r"MEA_carbon_capture_dataset_mimo.csv") xdata = data.iloc[:, :6] # there are 6 input variables/columns zdata = data.iloc[:, 6:] # the rest are output variables/columns @@ -127,11 +139,13 @@ def create_model(data): xdata, zdata = np.array(xdata), np.array(zdata) for i in range(len(xdata)): for j in range(len(xlabels)): - xdata[i, j] = (xdata[i, j] - xmin[j])/(xmax[j] - xmin[j]) + xdata[i, j] = (xdata[i, j] - xmin[j]) / (xmax[j] - xmin[j]) for j in range(len(zlabels)): - zdata[i, j] = (zdata[i, j] - zmin[j])/(zmax[j] - zmin[j]) + zdata[i, j] = (zdata[i, j] - zmin[j]) / (zmax[j] - zmin[j]) -model_data = np.concatenate((xdata,zdata), axis=1) # Keras requires a Numpy array as input +model_data = np.concatenate( + (xdata, zdata), axis=1 +) # Keras requires a Numpy array as input # define x and z data, not used but will add to variable dictionary xdata = model_data[:, :-2] @@ -142,4 +156,4 @@ def create_model(data): model.summary() # save model -model.save('mea_column_model.h5') +model.save("mea_column_model.h5") diff --git a/foqus_lib/framework/graph/node.py b/foqus_lib/framework/graph/node.py index b5c724b27..5bc6712b3 100644 --- a/foqus_lib/framework/graph/node.py +++ b/foqus_lib/framework/graph/node.py @@ -95,15 +95,15 @@ def setCodeStrings(self): class pymodel_ml_ai(pymodel): def __init__(self, model): pymodel.__init__(self) - + # attempt to retrieve required information from loaded model, and set defaults otherwise self.model = model - + for i in range(np.shape(self.model.inputs[0])[1]): try: input_label = self.model.layers[1].input_labels[i] except: - input_label = 'x' + str(i+1) + input_label = "x" + str(i + 1) try: input_min = self.model.layers[1].input_bounds[input_label][0] except: @@ -112,23 +112,24 @@ def __init__(self, model): input_max = self.model.layers[1].input_bounds[input_label][1] except: input_max = 1e5 # not necessarily a good default - + self.inputs[input_label] = NodeVars( - value = input_min, - vmin = input_min, - vmax = input_max, - vdflt = 0.0, - unit = "", - vst = "pymodel", - vdesc = 'input var ' + str(i+1), - tags = [], - dtype = float) - + value=input_min, + vmin=input_min, + vmax=input_max, + vdflt=0.0, + unit="", + vst="pymodel", + vdesc="input var " + str(i + 1), + tags=[], + dtype=float, + ) + for j in range(np.shape(self.model.outputs[0])[1]): try: output_label = self.model.layers[1].output_labels[j] except: - output_label = 'z' + str(j+1) + output_label = "z" + str(j + 1) try: output_min = self.model.layers[1].output_bounds[output_label][0] except: @@ -137,17 +138,18 @@ def __init__(self, model): output_max = self.model.layers[1].output_bounds[output_label][1] except: output_max = 1e5 # not necessarily a good default - + self.outputs[output_label] = NodeVars( - value = output_min, - vmin = output_min, - vmax = output_max, - vdflt = 0.0, - unit = "", - vst = "pymodel", - vdesc = 'output var ' + str(j+1), - tags = [], - dtype = float) + value=output_min, + vmin=output_min, + vmax=output_max, + vdflt=0.0, + unit="", + vst="pymodel", + vdesc="output var " + str(j + 1), + tags=[], + dtype=float, + ) # check if user passed a model for normalized data - FOQUS will automatically scale/un-scale try: # if attribute exists, user has specified a model form @@ -157,10 +159,13 @@ def __init__(self, model): def run(self): import numpy as np + if self.normalized is True: # normalize inputs - inputs = [(self.inputs[i].value - self.inputs[i].min) / - (self.inputs[i].max - self.inputs[i].min) - for i in self.inputs] + inputs = [ + (self.inputs[i].value - self.inputs[i].min) + / (self.inputs[i].max - self.inputs[i].min) + for i in self.inputs + ] else: # take actual input values inputs = [self.inputs[i].value for i in self.inputs] print(inputs) @@ -169,9 +174,10 @@ def run(self): outidx = 0 for j in self.outputs: if self.normalized is True: # un-normalize outputs - self.outputs[j].value = (outputs[outidx] * - (self.outputs[j].max - self.outputs[j].min) + - self.outputs[j].min) + self.outputs[j].value = ( + outputs[outidx] * (self.outputs[j].max - self.outputs[j].min) + + self.outputs[j].min + ) else: self.outputs[j].value = outputs[outidx] outidx += 1 @@ -585,12 +591,15 @@ def setSim(self, newType=None, newModel=None, force=False, ids=None): elif self.modelType == nodeModelTypes.MODEL_ML_AI: # link to pymodel class for ml/ai models cwd = os.getcwd() - os.chdir(os.path.join(os.getcwd(), 'user_ml_ai_models')) + os.chdir(os.path.join(os.getcwd(), "user_ml_ai_models")) try: # see if custom layer script exists module = import_module(str(self.modelName)) # contains CustomLayer - self.model = load(str(self.modelName) + ".h5", - custom_objects = {str(self.modelName): - getattr(module, str(self.modelName))}) + self.model = load( + str(self.modelName) + ".h5", + custom_objects={ + str(self.modelName): getattr(module, str(self.modelName)) + }, + ) except: # try to load model without custom layer self.model = load(str(self.modelName) + ".h5") os.chdir(cwd) # reset to original working directory @@ -1078,18 +1087,21 @@ def killTurbineSession(self): def runPymodelMLAI(self): """ - Runs a Neural Network machine learning/artificial intelligence model. + Runs a Neural Network machine learning/artificial intelligence model. """ # create a python model instance if needed if not self.pyModel: # load ml_ai_model and build pymodel class object cwd = os.getcwd() - os.chdir(os.path.join(os.getcwd(), 'user_ml_ai_models')) + os.chdir(os.path.join(os.getcwd(), "user_ml_ai_models")) try: # see if custom layer script exists module = import_module(str(self.modelName)) # contains CustomLayer - self.model = load(str(self.modelName) + ".h5", - custom_objects = {str(self.modelName): - getattr(module, str(self.modelName))}) + self.model = load( + str(self.modelName) + ".h5", + custom_objects={ + str(self.modelName): getattr(module, str(self.modelName)) + }, + ) except: # try to load model without custom layer self.model = load(str(self.modelName) + ".h5") os.chdir(cwd) # reset to original working directory diff --git a/foqus_lib/framework/ml_ai_models/mlaiSearch.py b/foqus_lib/framework/ml_ai_models/mlaiSearch.py index c2b1dba0d..67fa8d0ee 100644 --- a/foqus_lib/framework/ml_ai_models/mlaiSearch.py +++ b/foqus_lib/framework/ml_ai_models/mlaiSearch.py @@ -30,36 +30,44 @@ _log = logging.getLogger("foqus." + __name__) -class ml_ai_models(): + +class ml_ai_models: """ This class maintains a list of NN ml_ai models """ + def __init__(self, pathList): self.pathList = pathList self.ml_ai_models = {} self.getMLAIList() def getMLAIList(self): - ''' - check files in self.pathList to see if they are ml_ai models - ''' + """ + check files in self.pathList to see if they are ml_ai models + """ for p in self.pathList: if os.path.exists(p): sys.path.append(p) pgfiles = os.listdir(p) for fname in pgfiles: - mname = fname.rsplit('.', 1) #split off extension - if len(mname) > 1 and mname[1] == 'h5': + mname = fname.rsplit(".", 1) # split off extension + if len(mname) > 1 and mname[1] == "h5": try: if mname[0] in self.ml_ai_models: - _log.info("Reloading ML_AI Model: {}".format( - os.path.join(p, fname))) + _log.info( + "Reloading ML_AI Model: {}".format( + os.path.join(p, fname) + ) + ) self.ml_ai_models[mname[0]] = mname[0] else: - logging.getLogger("foqus." + __name__).\ - info("Loading ML_AI Model: " + \ - os.path.join(p, fname)) + logging.getLogger("foqus." + __name__).info( + "Loading ML_AI Model: " + os.path.join(p, fname) + ) self.ml_ai_models[mname[0]] = mname[0] except: - _log.exception("Error Loading ML_AI Model: {}".format( - os.path.join(p, fname))) + _log.exception( + "Error Loading ML_AI Model: {}".format( + os.path.join(p, fname) + ) + ) diff --git a/foqus_lib/framework/session/session.py b/foqus_lib/framework/session/session.py index 10e111343..c497569e2 100644 --- a/foqus_lib/framework/session/session.py +++ b/foqus_lib/framework/session/session.py @@ -186,8 +186,8 @@ def makeWorkingDirStruct(wdir=None): createDir("user_plugins") createDir("user_ml_ai_models") createDir("ouu") - open("user_plugins/__init__.py", 'a').close() - open("user_ml_ai_models/__init__.py", 'a').close() + open("user_plugins/__init__.py", "a").close() + open("user_ml_ai_models/__init__.py", "a").close() except: logging.getLogger("foqus." + __name__).exception( "Error creating working directory structure" @@ -287,8 +287,8 @@ def __init__(self, useCurrentWorkingDir=False): # Set up a blank FOQUS session self.loadPlugins() self.loadMLAIModels() - self.turbineChkFreq = 10 #frequency to check remote Turbine for - #results + self.turbineChkFreq = 10 # frequency to check remote Turbine for + # results self.resubMax = 0 self.new() @@ -420,13 +420,15 @@ def reloadMLAIModels(self): self.pymodels.getMLAIList() def loadMLAIModels(self): - ''' - Search for ml_ai_models - ''' + """ + Search for ml_ai_models + """ self.pymodels_ml_ai = mlaiSearch.ml_ai_models( - pathList = [ - os.path.join(os.getcwd(), 'user_ml_ai_models'), - os.path.dirname(surrogate.__file__)]) + pathList=[ + os.path.join(os.getcwd(), "user_ml_ai_models"), + os.path.dirname(surrogate.__file__), + ] + ) try: self.flowsheet.pymodels_ml_ai = self.pymodels_ml_ai except: diff --git a/foqus_lib/gui/flowsheet/nodePanel.py b/foqus_lib/gui/flowsheet/nodePanel.py index 79f69fb97..865b0a30b 100644 --- a/foqus_lib/gui/flowsheet/nodePanel.py +++ b/foqus_lib/gui/flowsheet/nodePanel.py @@ -348,7 +348,7 @@ def getModelType(self): elif self.modelTypeBox.currentIndex() == 2: # model type is plugin return nodeModelTypes.MODEL_PLUGIN - elif self.modelTypeBox.currentIndex()==5: + elif self.modelTypeBox.currentIndex() == 5: # model type is ml_ai return nodeModelTypes.MODEL_ML_AI else: @@ -404,7 +404,8 @@ def updateSimulationList(self): # model type is ml_ai sl = sorted( list(self.dat.pymodels_ml_ai.ml_ai_models.keys()), - key=lambda s: s.lower()) + key=lambda s: s.lower(), + ) self.simNameBox.addItems(sl) try: i = self.simNameBox.findText(self.node.modelName) From a24f624a7d3346203e740f3802c59573326bbf15 Mon Sep 17 00:00:00 2001 From: Brandon Paul Date: Mon, 10 Jan 2022 14:50:52 -0800 Subject: [PATCH 15/40] Minor fixes for pylint checks --- foqus_lib/framework/graph/node.py | 3 ++- foqus_lib/framework/session/session.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/foqus_lib/framework/graph/node.py b/foqus_lib/framework/graph/node.py index 5bc6712b3..9b2b7eb74 100644 --- a/foqus_lib/framework/graph/node.py +++ b/foqus_lib/framework/graph/node.py @@ -41,7 +41,8 @@ try: # tensorflow should be installed, but is not required for non ML/AI models - from tensorflow.keras.models import load_model as load + import tensorflow as tf + load = tf.keras.models.load_model except: pass # errors will be thrown if tensorflow is called but not installed, # otherwise no error should be thrown so passing is fine diff --git a/foqus_lib/framework/session/session.py b/foqus_lib/framework/session/session.py index c497569e2..0542e4c22 100644 --- a/foqus_lib/framework/session/session.py +++ b/foqus_lib/framework/session/session.py @@ -417,7 +417,7 @@ def loadPlugins(self): pass def reloadMLAIModels(self): - self.pymodels.getMLAIList() + self.pymodels_ml_ai.getMLAIList() def loadMLAIModels(self): """ From 3dd03c81ac400b29fdbfd67c8b7bffbb2a4f4845 Mon Sep 17 00:00:00 2001 From: Brandon Paul Date: Wed, 12 Jan 2022 09:12:10 -0800 Subject: [PATCH 16/40] Minor formatting fix --- foqus_lib/framework/graph/node.py | 1 + 1 file changed, 1 insertion(+) diff --git a/foqus_lib/framework/graph/node.py b/foqus_lib/framework/graph/node.py index 9b2b7eb74..dde058a91 100644 --- a/foqus_lib/framework/graph/node.py +++ b/foqus_lib/framework/graph/node.py @@ -42,6 +42,7 @@ try: # tensorflow should be installed, but is not required for non ML/AI models import tensorflow as tf + load = tf.keras.models.load_model except: pass # errors will be thrown if tensorflow is called but not installed, From 2ddd67f748ec46bc1bb4f5a60888a5a46ff8c7fc Mon Sep 17 00:00:00 2001 From: Brandon Paul Date: Tue, 8 Feb 2022 14:34:33 -0800 Subject: [PATCH 17/40] Renaming image files and extensions --- .../figs/{Plugin_Console.PNG => plugin_console.png} | Bin .../{Plugin_Flowsheet.PNG => plugin_flowsheet.png} | Bin ...ldersWindow.PNG => plugin_userfolderswindow.png} | Bin 3 files changed, 0 insertions(+), 0 deletions(-) rename docs/source/chapt_surrogates/figs/{Plugin_Console.PNG => plugin_console.png} (100%) rename docs/source/chapt_surrogates/figs/{Plugin_Flowsheet.PNG => plugin_flowsheet.png} (100%) rename docs/source/chapt_surrogates/figs/{Plugin_UserFoldersWindow.PNG => plugin_userfolderswindow.png} (100%) diff --git a/docs/source/chapt_surrogates/figs/Plugin_Console.PNG b/docs/source/chapt_surrogates/figs/plugin_console.png similarity index 100% rename from docs/source/chapt_surrogates/figs/Plugin_Console.PNG rename to docs/source/chapt_surrogates/figs/plugin_console.png diff --git a/docs/source/chapt_surrogates/figs/Plugin_Flowsheet.PNG b/docs/source/chapt_surrogates/figs/plugin_flowsheet.png similarity index 100% rename from docs/source/chapt_surrogates/figs/Plugin_Flowsheet.PNG rename to docs/source/chapt_surrogates/figs/plugin_flowsheet.png diff --git a/docs/source/chapt_surrogates/figs/Plugin_UserFoldersWindow.PNG b/docs/source/chapt_surrogates/figs/plugin_userfolderswindow.png similarity index 100% rename from docs/source/chapt_surrogates/figs/Plugin_UserFoldersWindow.PNG rename to docs/source/chapt_surrogates/figs/plugin_userfolderswindow.png From 3be6605ff42d86985286e0c3788733e60c660545 Mon Sep 17 00:00:00 2001 From: Ludovico Bianchi Date: Fri, 11 Feb 2022 16:26:50 -0600 Subject: [PATCH 18/40] Add GUI tests for ML/AI plugin --- foqus_lib/gui/tests/test_ml_ai.py | 102 ++++++++++++++++++++++++++++++ pytest_qt_extras.py | 70 +++++++++++++++++++- 2 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 foqus_lib/gui/tests/test_ml_ai.py diff --git a/foqus_lib/gui/tests/test_ml_ai.py b/foqus_lib/gui/tests/test_ml_ai.py new file mode 100644 index 000000000..15f41e0f9 --- /dev/null +++ b/foqus_lib/gui/tests/test_ml_ai.py @@ -0,0 +1,102 @@ +from pathlib import Path +import shutil +from typing import List + +import pytest +from pytest_qt_extras import QtBot, instrument +from PyQt5 import QtWidgets + +from foqus_lib.gui.main.mainWindow import mainWindow +from foqus_lib.framework.session import session as FoqusSession +from foqus_lib.gui.flowsheet.drawFlowsheet import drawFlowsheet +from foqus_lib.framework.ml_ai_models.mlaiSearch import ml_ai_models + + + +@pytest.fixture( + scope="module", + params=["other_files/ML_AI_Plugin/mea_column_model.foqus"] +) +def flowsheet_session_file(examples_dir: Path, request) -> Path: + return examples_dir / request.param + + +@pytest.fixture( + scope="session", + autouse=True, +) +def install_ml_ai_model_files(examples_dir: Path, foqus_working_dir: Path) -> Path: + """ + This is a session-scoped fixture with autouse b/c it needs to be created before the main window is instantiated. + """ + + base_path = examples_dir / "other_files" / "ML_AI_Plugin" + ts_models_base_path = base_path / "TensorFlow_2-7_Models" + dest_path = foqus_working_dir / "user_ml_ai_models" + + dest_path.mkdir(parents=False, exist_ok=True) + for path in [ + base_path / "mea_column_model.py", + ts_models_base_path / "mea_column_model.h5", + ]: + shutil.copy2(path, dest_path) + yield dest_path + + shutil.rmtree(dest_path) + + +class TestMLAIPluginFlowsheetRun: + + @pytest.fixture + def focus_flowsheet_tab(self, qtbot: QtBot, main_window, ) -> None: + qtbot.focused = main_window + with qtbot.wait_signal(main_window.fsEditAction.triggered): + qtbot.click(button="Flowsheet") + + def test_flowsheet_tab_is_active(self, qtbot: QtBot, main_window, focus_flowsheet_tab: drawFlowsheet): + assert main_window.mainWidget.currentIndex() == main_window.screenIndex["flow"] + + @pytest.fixture + def active_session(self, + main_window: mainWindow, + flowsheet_session_file: Path, + install_ml_ai_model_files: Path, + ) -> FoqusSession: + main_window.loadSessionFile(str(flowsheet_session_file), saveCurrent=False) + return main_window.dat + + def test_model_flowsheet_is_loaded(self, qtbot: QtBot, focus_flowsheet_tab, active_session: FoqusSession): + assert active_session.flowsheet is not None + + @pytest.fixture + def pymodels_ml_ai(self, active_session: FoqusSession) -> ml_ai_models: + return active_session.pymodels_ml_ai + + def test_ml_ai_models_loaded(self, pymodels_ml_ai: ml_ai_models): + assert len(pymodels_ml_ai.ml_ai_models) > 0 + + @pytest.fixture + def trigger_flowsheet_run_action(self, + qtbot: QtBot, + active_session, + main_window: mainWindow, + ): + run_action = main_window.runAction + with qtbot.replacing_with_signal( + (QtWidgets.QMessageBox, "information"), + (QtWidgets.QMessageBox, "critical"), + ) as signal: + with qtbot.wait_signal(signal, timeout=2_000): + run_action.trigger() + return run_action + + @pytest.fixture(scope="function") + def statusbar_message(self, main_window: mainWindow) -> str: + return main_window.statusBar().currentMessage() + + def test_flowsheet_run_successful(self, + trigger_flowsheet_run_action, + statusbar_message: str, + text_when_success: str = "Finished Single Simulation... Success" + ): + assert text_when_success in statusbar_message diff --git a/pytest_qt_extras.py b/pytest_qt_extras.py index b157403ea..225834231 100644 --- a/pytest_qt_extras.py +++ b/pytest_qt_extras.py @@ -214,6 +214,54 @@ def _do_nothing(*args, **kwargs): _logger.debug("monkeypatching done") +@contextlib.contextmanager +def replace_with_signal(target, signal, retval=None): + mp = MonkeyPatch() + + _logger.info(f"replacing target {target} with signal {signal}") + if isinstance(target, tuple) and len(target) == 2: + owner, name = target + instance = None + # TODO check if methodtype? + else: + instance = getattr(target, "__self__", None) + owner = instance.__class__ + name = target.__name__ + func = getattr(owner, name) + assert callable(func), f"{func} must be callable" + _logger.debug(dict(target=target, name=name, owner=owner, func=func)) + + def _proxy_call(*args, **kwargs): + call_info = CallInfo( + callee=func, + args=args, + kwargs=kwargs, + name=name, + instance=instance + ) + + signal.emit( + call_info + ) + + return retval + + mp.setattr(owner, name, _proxy_call) + + patched_info = _WrappedCallable( + wrapped=func, + name=name, + instance=instance, + wrapper=_proxy_call, + ) + + _logger.debug("returning patched object") + yield patched_info + _logger.debug("start undoing monkeypatching") + mp.undo() + _logger.debug("monkeypatching done") + + class _Signals(QtCore.QObject): __instance = None callBegin = QtCore.pyqtSignal(CallInfo) @@ -222,6 +270,7 @@ class _Signals(QtCore.QObject): actionEnd = QtCore.pyqtSignal(Action) locateBegin = QtCore.pyqtSignal(object) locateEnd = QtCore.pyqtSignal(object) + callProxy = QtCore.pyqtSignal(CallInfo) @property def by_type_and_when(self): @@ -311,7 +360,7 @@ def as_record(self): class Handler(_SerializableMixin): log = ObjLogger() dispatcher = Dispatcher( - button=W.QPushButton, + button=W.QAbstractButton, radio_button=W.QRadioButton, combo_box=W.QComboBox, group_box=W.QGroupBox, @@ -1474,6 +1523,25 @@ def wait_until_called(self, func, before=False, **kwargs): **kwargs, ) + @contextlib.contextmanager + def replacing_with_signal(self, + *targets: t.Iterable[t.Union[t.Callable, t.Tuple[type, str]]], + **kwargs + ): + signal = self._signals.callProxy + with contextlib.ExitStack() as stack: + [ + stack.enter_context( + replace_with_signal( + target=target, + signal=signal, + **kwargs + ) + ) + for target in targets + ] + yield signal + @contextlib.contextmanager def intercepting_modal( self, From eaf6b0b37722296ff6c88f2ff79ea8110336d29c Mon Sep 17 00:00:00 2001 From: Ludovico Bianchi Date: Fri, 11 Feb 2022 16:28:53 -0600 Subject: [PATCH 19/40] Skip ML/AI tests if tensorflow is not installed --- foqus_lib/gui/tests/test_ml_ai.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/foqus_lib/gui/tests/test_ml_ai.py b/foqus_lib/gui/tests/test_ml_ai.py index 15f41e0f9..6db5c12d6 100644 --- a/foqus_lib/gui/tests/test_ml_ai.py +++ b/foqus_lib/gui/tests/test_ml_ai.py @@ -12,6 +12,8 @@ from foqus_lib.framework.ml_ai_models.mlaiSearch import ml_ai_models +_ = pytest.importorskip("tensorflow", "tensorflow not installed") + @pytest.fixture( scope="module", From f2e409975fee65bf1918c402165ecfbd4b8a536d Mon Sep 17 00:00:00 2001 From: Ludovico Bianchi Date: Fri, 11 Feb 2022 16:38:55 -0600 Subject: [PATCH 20/40] Run Black --- foqus_lib/gui/tests/test_ml_ai.py | 51 ++++++++++++++++++------------- pytest_qt_extras.py | 23 ++++---------- 2 files changed, 36 insertions(+), 38 deletions(-) diff --git a/foqus_lib/gui/tests/test_ml_ai.py b/foqus_lib/gui/tests/test_ml_ai.py index 6db5c12d6..c3010ede2 100644 --- a/foqus_lib/gui/tests/test_ml_ai.py +++ b/foqus_lib/gui/tests/test_ml_ai.py @@ -16,8 +16,7 @@ @pytest.fixture( - scope="module", - params=["other_files/ML_AI_Plugin/mea_column_model.foqus"] + scope="module", params=["other_files/ML_AI_Plugin/mea_column_model.foqus"] ) def flowsheet_session_file(examples_dir: Path, request) -> Path: return examples_dir / request.param @@ -48,26 +47,34 @@ def install_ml_ai_model_files(examples_dir: Path, foqus_working_dir: Path) -> Pa class TestMLAIPluginFlowsheetRun: - @pytest.fixture - def focus_flowsheet_tab(self, qtbot: QtBot, main_window, ) -> None: + def focus_flowsheet_tab( + self, + qtbot: QtBot, + main_window, + ) -> None: qtbot.focused = main_window with qtbot.wait_signal(main_window.fsEditAction.triggered): qtbot.click(button="Flowsheet") - def test_flowsheet_tab_is_active(self, qtbot: QtBot, main_window, focus_flowsheet_tab: drawFlowsheet): + def test_flowsheet_tab_is_active( + self, qtbot: QtBot, main_window, focus_flowsheet_tab: drawFlowsheet + ): assert main_window.mainWidget.currentIndex() == main_window.screenIndex["flow"] @pytest.fixture - def active_session(self, - main_window: mainWindow, - flowsheet_session_file: Path, - install_ml_ai_model_files: Path, - ) -> FoqusSession: + def active_session( + self, + main_window: mainWindow, + flowsheet_session_file: Path, + install_ml_ai_model_files: Path, + ) -> FoqusSession: main_window.loadSessionFile(str(flowsheet_session_file), saveCurrent=False) return main_window.dat - def test_model_flowsheet_is_loaded(self, qtbot: QtBot, focus_flowsheet_tab, active_session: FoqusSession): + def test_model_flowsheet_is_loaded( + self, qtbot: QtBot, focus_flowsheet_tab, active_session: FoqusSession + ): assert active_session.flowsheet is not None @pytest.fixture @@ -78,11 +85,12 @@ def test_ml_ai_models_loaded(self, pymodels_ml_ai: ml_ai_models): assert len(pymodels_ml_ai.ml_ai_models) > 0 @pytest.fixture - def trigger_flowsheet_run_action(self, - qtbot: QtBot, - active_session, - main_window: mainWindow, - ): + def trigger_flowsheet_run_action( + self, + qtbot: QtBot, + active_session, + main_window: mainWindow, + ): run_action = main_window.runAction with qtbot.replacing_with_signal( (QtWidgets.QMessageBox, "information"), @@ -96,9 +104,10 @@ def trigger_flowsheet_run_action(self, def statusbar_message(self, main_window: mainWindow) -> str: return main_window.statusBar().currentMessage() - def test_flowsheet_run_successful(self, - trigger_flowsheet_run_action, - statusbar_message: str, - text_when_success: str = "Finished Single Simulation... Success" - ): + def test_flowsheet_run_successful( + self, + trigger_flowsheet_run_action, + statusbar_message: str, + text_when_success: str = "Finished Single Simulation... Success", + ): assert text_when_success in statusbar_message diff --git a/pytest_qt_extras.py b/pytest_qt_extras.py index 225834231..7ec98de5f 100644 --- a/pytest_qt_extras.py +++ b/pytest_qt_extras.py @@ -233,16 +233,10 @@ def replace_with_signal(target, signal, retval=None): def _proxy_call(*args, **kwargs): call_info = CallInfo( - callee=func, - args=args, - kwargs=kwargs, - name=name, - instance=instance + callee=func, args=args, kwargs=kwargs, name=name, instance=instance ) - signal.emit( - call_info - ) + signal.emit(call_info) return retval @@ -1524,19 +1518,14 @@ def wait_until_called(self, func, before=False, **kwargs): ) @contextlib.contextmanager - def replacing_with_signal(self, - *targets: t.Iterable[t.Union[t.Callable, t.Tuple[type, str]]], - **kwargs - ): + def replacing_with_signal( + self, *targets: t.Iterable[t.Union[t.Callable, t.Tuple[type, str]]], **kwargs + ): signal = self._signals.callProxy with contextlib.ExitStack() as stack: [ stack.enter_context( - replace_with_signal( - target=target, - signal=signal, - **kwargs - ) + replace_with_signal(target=target, signal=signal, **kwargs) ) for target in targets ] From 0942f950f8c0c1dd6451b9c1460a564a151f4df6 Mon Sep 17 00:00:00 2001 From: Ludovico Bianchi Date: Fri, 11 Feb 2022 16:56:36 -0600 Subject: [PATCH 21/40] Add pylint directives around import guard for tensorflow --- foqus_lib/framework/graph/node.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/foqus_lib/framework/graph/node.py b/foqus_lib/framework/graph/node.py index dde058a91..9fe2be5b9 100644 --- a/foqus_lib/framework/graph/node.py +++ b/foqus_lib/framework/graph/node.py @@ -39,6 +39,7 @@ from PyQt5.QtWidgets import QMessageBox from importlib import import_module +# pylint: disable=import-error try: # tensorflow should be installed, but is not required for non ML/AI models import tensorflow as tf @@ -47,6 +48,7 @@ except: pass # errors will be thrown if tensorflow is called but not installed, # otherwise no error should be thrown so passing is fine +# pylint: enable=import-error class NodeOptionSets: From bc2877f6e92ebd65ee96da16227699f7650920a9 Mon Sep 17 00:00:00 2001 From: Ludovico Bianchi Date: Fri, 11 Feb 2022 16:58:36 -0600 Subject: [PATCH 22/40] Install tensorflow in a subset of the environments --- .github/workflows/checks.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 6b45e4347..76643805a 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -72,6 +72,8 @@ jobs: os-version: windows-2019 - python-version: "3.8" # avoid uploading coverage for full matrix use_coverage: true + - python-version: "3.8" # this is to avoid installing optional dependencies in all environments + optional-dependencies: tensorflow env: # uncomment this to debug Qt initialization errors # QT_DEBUG_PLUGINS: '1' @@ -83,6 +85,10 @@ jobs: with: activate-environment: ${{ env.FOQUS_CONDA_ENV_NAME_DEV }} python-version: ${{ matrix.python-version }} + - name: Install optional dependencies + if: matrix.optional-dependencies + run: | + conda install --name ${{ env.FOQUS_CONDA_ENV_NAME_DEV }} --yes ${{ matrix.optional-dependencies }} - name: Set up FOQUS uses: ./.github/actions/setup-foqus with: From 8a216254b5875f67a91b3db6d68b213cdcd11d5d Mon Sep 17 00:00:00 2001 From: Ludovico Bianchi Date: Fri, 11 Feb 2022 17:07:21 -0600 Subject: [PATCH 23/40] Fix args for pytest.importorskip() --- foqus_lib/gui/tests/test_ml_ai.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/foqus_lib/gui/tests/test_ml_ai.py b/foqus_lib/gui/tests/test_ml_ai.py index c3010ede2..e419ea4c5 100644 --- a/foqus_lib/gui/tests/test_ml_ai.py +++ b/foqus_lib/gui/tests/test_ml_ai.py @@ -12,7 +12,7 @@ from foqus_lib.framework.ml_ai_models.mlaiSearch import ml_ai_models -_ = pytest.importorskip("tensorflow", "tensorflow not installed") +_ = pytest.importorskip("tensorflow", reason="tensorflow not installed") @pytest.fixture( From 4f62e2f3cd0726f0eee4591b9e46e045002f732a Mon Sep 17 00:00:00 2001 From: Ludovico Bianchi Date: Fri, 11 Feb 2022 17:08:30 -0600 Subject: [PATCH 24/40] Install tensorflow from conda-forge for Python>3.7 on macOS --- .github/workflows/checks.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 76643805a..5bef2a7c2 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -88,7 +88,7 @@ jobs: - name: Install optional dependencies if: matrix.optional-dependencies run: | - conda install --name ${{ env.FOQUS_CONDA_ENV_NAME_DEV }} --yes ${{ matrix.optional-dependencies }} + conda install -c conda-forge --name ${{ env.FOQUS_CONDA_ENV_NAME_DEV }} --yes ${{ matrix.optional-dependencies }} - name: Set up FOQUS uses: ./.github/actions/setup-foqus with: From 90e7370b30da9af0505c870fdab52870a90a9731 Mon Sep 17 00:00:00 2001 From: Ludovico Bianchi Date: Fri, 11 Feb 2022 19:05:27 -0600 Subject: [PATCH 25/40] Use pip instead of conda to install tensorflow `conda install tensorflow` seems to hang on Linux --- .github/workflows/checks.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 5bef2a7c2..79735ccd2 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -63,6 +63,7 @@ jobs: - linux - win64 - macos + optional-dependencies: [""] include: - os: macos os-version: macos-10.15 @@ -85,14 +86,10 @@ jobs: with: activate-environment: ${{ env.FOQUS_CONDA_ENV_NAME_DEV }} python-version: ${{ matrix.python-version }} - - name: Install optional dependencies - if: matrix.optional-dependencies - run: | - conda install -c conda-forge --name ${{ env.FOQUS_CONDA_ENV_NAME_DEV }} --yes ${{ matrix.optional-dependencies }} - name: Set up FOQUS uses: ./.github/actions/setup-foqus with: - pip-install-target: -r requirements-dev.txt + pip-install-target: -r requirements-dev.txt ${{ matrix.optional-dependencies }} - name: Set common pytest flags run: echo 'PYTEST_ADDOPTS=--verbose --artifacts-path "$PYTEST_ARTIFACTS_PATH"' >> $GITHUB_ENV From ae5f75a42b86a6136ecffce179d0140c2745aa39 Mon Sep 17 00:00:00 2001 From: Ludovico Bianchi Date: Fri, 11 Feb 2022 19:09:35 -0600 Subject: [PATCH 26/40] Move copying of ML/AI model files out of pytest --- .github/workflows/checks.yml | 6 ++++ foqus_lib/gui/tests/test_ml_ai.py | 56 +++++++++++++++++++------------ 2 files changed, 40 insertions(+), 22 deletions(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 79735ccd2..94ba7c309 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -26,6 +26,7 @@ defaults: env: FOQUS_CONDA_ENV_NAME_DEV: ccsi-foqus-dev PYTEST_ARTIFACTS_PATH: ".pytest-artifacts" + PYTEST_FOQUS_WORKING_DIR: /tmp/foqus_working_dir jobs: code-formatting: @@ -97,6 +98,11 @@ jobs: if: contains(matrix.os, 'linux') run: | echo "QT_QPA_PLATFORM=minimal" >> $GITHUB_ENV + - name: Copy files to FOQUS working dir + run: | + _ml_ai_user_dir="$PYTEST_FOQUS_WORKING_DIR"/user_ml_ai_models/ + mkdir -p "$_ml_ai_user_dir" + cp examples/other_files/ML_AI_Plugin/{mea_column_model.py,TensorFlow_2-7_Models/mea_column_model.h5} "$_ml_ai_user_dir" - name: Run pytest (default options) if: "! matrix.use_coverage" run: | diff --git a/foqus_lib/gui/tests/test_ml_ai.py b/foqus_lib/gui/tests/test_ml_ai.py index e419ea4c5..b4297e3ab 100644 --- a/foqus_lib/gui/tests/test_ml_ai.py +++ b/foqus_lib/gui/tests/test_ml_ai.py @@ -1,6 +1,6 @@ from pathlib import Path import shutil -from typing import List +from typing import List, Tuple import pytest from pytest_qt_extras import QtBot, instrument @@ -22,28 +22,33 @@ def flowsheet_session_file(examples_dir: Path, request) -> Path: return examples_dir / request.param -@pytest.fixture( - scope="session", - autouse=True, -) -def install_ml_ai_model_files(examples_dir: Path, foqus_working_dir: Path) -> Path: - """ - This is a session-scoped fixture with autouse b/c it needs to be created before the main window is instantiated. - """ +@pytest.fixture(scope="module") +def models_dir( + foqus_working_dir: Path, + ) -> Path: + + return foqus_working_dir / "user_ml_ai_models" - base_path = examples_dir / "other_files" / "ML_AI_Plugin" - ts_models_base_path = base_path / "TensorFlow_2-7_Models" - dest_path = foqus_working_dir / "user_ml_ai_models" - dest_path.mkdir(parents=False, exist_ok=True) - for path in [ - base_path / "mea_column_model.py", - ts_models_base_path / "mea_column_model.h5", - ]: - shutil.copy2(path, dest_path) - yield dest_path +@pytest.fixture(scope="module") +def model_files( + models_dir: Path, + suffixes: Tuple[str] = (".py", ".h5"), + ) -> List[Path]: + paths = [] + for path in sorted(models_dir.glob("*")): + if all([ + path.is_file(), + path.stat().st_size > 0, + path.suffix in suffixes, + path.name != "__init__.py", + ]): + paths.append(path) + return paths + - shutil.rmtree(dest_path) +def test_model_files_are_present(model_files: List[Path]): + assert model_files class TestMLAIPluginFlowsheetRun: @@ -67,7 +72,6 @@ def active_session( self, main_window: mainWindow, flowsheet_session_file: Path, - install_ml_ai_model_files: Path, ) -> FoqusSession: main_window.loadSessionFile(str(flowsheet_session_file), saveCurrent=False) return main_window.dat @@ -78,7 +82,14 @@ def test_model_flowsheet_is_loaded( assert active_session.flowsheet is not None @pytest.fixture - def pymodels_ml_ai(self, active_session: FoqusSession) -> ml_ai_models: + def pymodels_ml_ai( + self, + active_session: FoqusSession, + model_files: List[Path], + models_dir: Path, + ) -> ml_ai_models: + if not model_files: + pytest.skip(f"No model files found in directory: {models_dir}") return active_session.pymodels_ml_ai def test_ml_ai_models_loaded(self, pymodels_ml_ai: ml_ai_models): @@ -90,6 +101,7 @@ def trigger_flowsheet_run_action( qtbot: QtBot, active_session, main_window: mainWindow, + pymodels_ml_ai, ): run_action = main_window.runAction with qtbot.replacing_with_signal( From 3cac6c434fbf6841c09dcf768632a4c8c117f90a Mon Sep 17 00:00:00 2001 From: Ludovico Bianchi Date: Fri, 11 Feb 2022 19:14:13 -0600 Subject: [PATCH 27/40] Run Black --- foqus_lib/gui/tests/test_ml_ai.py | 36 ++++++++++++++++--------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/foqus_lib/gui/tests/test_ml_ai.py b/foqus_lib/gui/tests/test_ml_ai.py index b4297e3ab..d581aa274 100644 --- a/foqus_lib/gui/tests/test_ml_ai.py +++ b/foqus_lib/gui/tests/test_ml_ai.py @@ -24,28 +24,30 @@ def flowsheet_session_file(examples_dir: Path, request) -> Path: @pytest.fixture(scope="module") def models_dir( - foqus_working_dir: Path, - ) -> Path: + foqus_working_dir: Path, +) -> Path: return foqus_working_dir / "user_ml_ai_models" @pytest.fixture(scope="module") def model_files( - models_dir: Path, - suffixes: Tuple[str] = (".py", ".h5"), - ) -> List[Path]: + models_dir: Path, + suffixes: Tuple[str] = (".py", ".h5"), +) -> List[Path]: paths = [] for path in sorted(models_dir.glob("*")): - if all([ - path.is_file(), - path.stat().st_size > 0, - path.suffix in suffixes, - path.name != "__init__.py", - ]): + if all( + [ + path.is_file(), + path.stat().st_size > 0, + path.suffix in suffixes, + path.name != "__init__.py", + ] + ): paths.append(path) return paths - + def test_model_files_are_present(model_files: List[Path]): assert model_files @@ -83,11 +85,11 @@ def test_model_flowsheet_is_loaded( @pytest.fixture def pymodels_ml_ai( - self, - active_session: FoqusSession, - model_files: List[Path], - models_dir: Path, - ) -> ml_ai_models: + self, + active_session: FoqusSession, + model_files: List[Path], + models_dir: Path, + ) -> ml_ai_models: if not model_files: pytest.skip(f"No model files found in directory: {models_dir}") return active_session.pymodels_ml_ai From 0aa924d2762d67daad7de2deb68efd13ffda6daa Mon Sep 17 00:00:00 2001 From: Ludovico Bianchi Date: Fri, 11 Feb 2022 19:52:20 -0600 Subject: [PATCH 28/40] Disable pytest job dependency while WIP --- .github/workflows/checks.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 94ba7c309..6681a42f5 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -50,7 +50,7 @@ jobs: black --check . pytest: name: pytest (py${{ matrix.python-version }}/${{ matrix.os }}) - needs: [code-formatting] + # needs: [code-formatting] runs-on: ${{ matrix.os-version }} strategy: fail-fast: false From 4b0fec364f1a8786f6ad5c040ff38284e8828692 Mon Sep 17 00:00:00 2001 From: Ludovico Bianchi Date: Fri, 11 Feb 2022 20:02:39 -0600 Subject: [PATCH 29/40] Try if the matrix syntax is causing the job to be ignored --- .github/workflows/checks.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 6681a42f5..112724252 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -64,7 +64,6 @@ jobs: - linux - win64 - macos - optional-dependencies: [""] include: - os: macos os-version: macos-10.15 From 0f184b3059a76be127b6e361ddf5bf0aa0fd182d Mon Sep 17 00:00:00 2001 From: Ludovico Bianchi Date: Fri, 11 Feb 2022 20:20:09 -0600 Subject: [PATCH 30/40] Try narrowing scope of `foqus_session` fixture to "module" This causes the session object to be recreated for each test module --- foqus_lib/conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/foqus_lib/conftest.py b/foqus_lib/conftest.py index 8c531a245..44f0466c4 100644 --- a/foqus_lib/conftest.py +++ b/foqus_lib/conftest.py @@ -61,7 +61,7 @@ def foqus_working_dir(qtbot_params): return Path("/tmp") / "foqus_working_dir" -@pytest.fixture(scope="session") +@pytest.fixture(scope="module") def foqus_session(foqus_working_dir, psuade_path): from foqus_lib.service.flowsheet import _set_working_dir from foqus_lib.framework.session import session From 867ce736e1ba189cc72cf73d3226e81aad0fb40a Mon Sep 17 00:00:00 2001 From: Ludovico Bianchi Date: Fri, 11 Feb 2022 21:22:25 -0600 Subject: [PATCH 31/40] Try creating a separate session and working dir for each test module --- .github/workflows/checks.yml | 5 ---- foqus_lib/conftest.py | 46 +++++++++++++++++++++---------- foqus_lib/gui/tests/test_ml_ai.py | 24 +++++++++++++++- 3 files changed, 54 insertions(+), 21 deletions(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 112724252..560b1aefc 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -97,11 +97,6 @@ jobs: if: contains(matrix.os, 'linux') run: | echo "QT_QPA_PLATFORM=minimal" >> $GITHUB_ENV - - name: Copy files to FOQUS working dir - run: | - _ml_ai_user_dir="$PYTEST_FOQUS_WORKING_DIR"/user_ml_ai_models/ - mkdir -p "$_ml_ai_user_dir" - cp examples/other_files/ML_AI_Plugin/{mea_column_model.py,TensorFlow_2-7_Models/mea_column_model.h5} "$_ml_ai_user_dir" - name: Run pytest (default options) if: "! matrix.use_coverage" run: | diff --git a/foqus_lib/conftest.py b/foqus_lib/conftest.py index 44f0466c4..95ef8b606 100644 --- a/foqus_lib/conftest.py +++ b/foqus_lib/conftest.py @@ -1,3 +1,4 @@ +import contextlib import os from pathlib import Path import shutil @@ -48,31 +49,46 @@ def psuade_path(): return Path(_psuade_path).resolve() -@pytest.fixture(scope="session", params=["UQ/Rosenbrock.foqus"]) +@pytest.fixture(scope="module", params=["UQ/Rosenbrock.foqus"]) def flowsheet_session_file(examples_dir, request): return str(examples_dir / "test_files" / request.param) @pytest.fixture( - scope="session", + scope="module", + autouse=True, ) -def foqus_working_dir(qtbot_params): - # FIXME use CLI params - return Path("/tmp") / "foqus_working_dir" +def foqus_working_dir(request) -> Path: + # FIXME get base dir from env var/CLI config + base_dir = Path("/tmp") / "foqus_working_dir" + test_module_name = request.node.name + d = base_dir / test_module_name + d.mkdir(parents=True, exist_ok=True) + return d + + +@contextlib.contextmanager +def setting_working_dir(dest: Path) -> Path: + from foqus_lib.service.flowsheet import _set_working_dir + + assert dest.is_dir() + initial_working_dir = Path(os.getcwd()) + try: + _set_working_dir(dest) + yield dest + finally: + _set_working_dir(initial_working_dir) @pytest.fixture(scope="module") def foqus_session(foqus_working_dir, psuade_path): - from foqus_lib.service.flowsheet import _set_working_dir from foqus_lib.framework.session import session - _set_working_dir(foqus_working_dir) - # foqus_working_dir.mkdir(exist_ok=True, parents=True) - # reproducing what happens in foqus_lib.focus.main() - # os.chdir(foqus_working_dir) - session.makeWorkingDirStruct() - session.makeWorkingDirFiles() + with setting_working_dir(foqus_working_dir) as wdir: + session.makeWorkingDirStruct() + session.makeWorkingDirFiles() - dat = session.session(useCurrentWorkingDir=True) - dat.foqusSettings.psuade_path = str(psuade_path) - return dat + dat = session.session(useCurrentWorkingDir=True) + dat.foqusSettings.psuade_path = str(psuade_path) + yield dat + # TODO is there any cleanup to be done, considering that the directory will be changed? diff --git a/foqus_lib/gui/tests/test_ml_ai.py b/foqus_lib/gui/tests/test_ml_ai.py index d581aa274..ec024aea2 100644 --- a/foqus_lib/gui/tests/test_ml_ai.py +++ b/foqus_lib/gui/tests/test_ml_ai.py @@ -22,7 +22,7 @@ def flowsheet_session_file(examples_dir: Path, request) -> Path: return examples_dir / request.param -@pytest.fixture(scope="module") +@pytest.fixture(scope="module", autouse=True) def models_dir( foqus_working_dir: Path, ) -> Path: @@ -30,6 +30,28 @@ def models_dir( return foqus_working_dir / "user_ml_ai_models" +@pytest.fixture( + scope="module", + autouse=True, +) +def install_ml_ai_model_files(examples_dir: Path, models_dir: Path) -> Path: + """ + This is a module-level fixture with autouse b/c it needs to be created before the main window is instantiated. + """ + + base_path = examples_dir / "other_files" / "ML_AI_Plugin" + ts_models_base_path = base_path / "TensorFlow_2-7_Models" + + models_dir.mkdir(exist_ok=True, parents=False) + + for path in [ + base_path / "mea_column_model.py", + ts_models_base_path / "mea_column_model.h5", + ]: + shutil.copy2(path, models_dir) + yield models_dir + + @pytest.fixture(scope="module") def model_files( models_dir: Path, From 141995cdb770d9abb9e63a1b47aa5874136bbac7 Mon Sep 17 00:00:00 2001 From: Ludovico Bianchi Date: Tue, 15 Feb 2022 09:39:54 -0600 Subject: [PATCH 32/40] Try waiting for signals instead of dealing with modals --- foqus_lib/gui/main/mainWindow.py | 20 ++++++++------------ foqus_lib/gui/tests/test_ml_ai.py | 8 ++------ foqus_lib/gui/tests/test_uq.py | 2 +- foqus_lib/gui/uq/uqSetupFrame.py | 2 -- 4 files changed, 11 insertions(+), 21 deletions(-) diff --git a/foqus_lib/gui/main/mainWindow.py b/foqus_lib/gui/main/mainWindow.py index 62f3762c4..776eba8bd 100644 --- a/foqus_lib/gui/main/mainWindow.py +++ b/foqus_lib/gui/main/mainWindow.py @@ -76,6 +76,8 @@ class mainWindow(QMainWindow): This is the FOQUS main window class """ + simCompleted = QtCore.pyqtSignal(str, bool) + def __init__( self, title, @@ -1392,33 +1394,27 @@ def stopSim(self): self.runningSingle = False self.dat.flowsheet.onlySingleNode = None if err == 0: - QMessageBox.information( - self, + self.simCompleted.emit( "Finished in " + hhmmss(int(self.dat.flowsheet.solTime)), - "The simulation completed successfully.", + True, ) self.setStatus( "Finished Single Simulation... Success in " + hhmmss(int(self.dat.flowsheet.solTime)) ) elif err == 100: - QMessageBox.information( - self, + self.simCompleted.emit( "Finished in " + hhmmss(int(self.dat.flowsheet.solTime)) + "s", - "The single node simulation completed successfully.", + True, ) self.setStatus( "Finished Single Node Simulation... Success in " + hhmmss(int(self.dat.flowsheet.solTime)) ) else: - QMessageBox.critical( - self, + self.simCompleted.emit( "Error in " + hhmmss(int(self.dat.flowsheet.solTime)) + "s", - "The simulation completed with an error " - + str(err) - + ", " - + errText, + False, ) self.setStatus( "Error Single Simulation in " diff --git a/foqus_lib/gui/tests/test_ml_ai.py b/foqus_lib/gui/tests/test_ml_ai.py index ec024aea2..9060636b4 100644 --- a/foqus_lib/gui/tests/test_ml_ai.py +++ b/foqus_lib/gui/tests/test_ml_ai.py @@ -128,12 +128,8 @@ def trigger_flowsheet_run_action( pymodels_ml_ai, ): run_action = main_window.runAction - with qtbot.replacing_with_signal( - (QtWidgets.QMessageBox, "information"), - (QtWidgets.QMessageBox, "critical"), - ) as signal: - with qtbot.wait_signal(signal, timeout=2_000): - run_action.trigger() + with qtbot.wait_signal(main_window.simCompleted, timeout=2_000): + run_action.trigger() return run_action @pytest.fixture(scope="function") diff --git a/foqus_lib/gui/tests/test_uq.py b/foqus_lib/gui/tests/test_uq.py index 80925c6be..1f532f179 100644 --- a/foqus_lib/gui/tests/test_uq.py +++ b/foqus_lib/gui/tests/test_uq.py @@ -73,7 +73,7 @@ def test_generate_samples(self, qtbot, generate_samples): def run_simulation(self, qtbot): with qtbot.focusing_on(self.frame.simulationTable): qtbot.select_row(0) - with qtbot.waiting_for_modal(timeout=90_000): + with qtbot.wait_signal(self.frame.runsFinishedSignal, timeout=90_000): qtbot.using(column="Launch").click() @pytest.mark.usefixtures("run_simulation") diff --git a/foqus_lib/gui/uq/uqSetupFrame.py b/foqus_lib/gui/uq/uqSetupFrame.py index 1c802f6c2..60ed70ad3 100644 --- a/foqus_lib/gui/uq/uqSetupFrame.py +++ b/foqus_lib/gui/uq/uqSetupFrame.py @@ -1138,9 +1138,7 @@ def resultsBox(self, numSuccessful, numSamples): msgBox = QtWidgets.QMessageBox() msgBox.setWindowTitle("FOQUS Run Finished") msgBox.setText("%d of %d runs were successful!" % (numSuccessful, numSamples)) - result = msgBox.exec_() self.refreshFilterData(updateResult=True) - return result # =========================== START Brenda's stuff ========================= From db01accde4940691bdb1cedc138fd40292de1cc9 Mon Sep 17 00:00:00 2001 From: Ludovico Bianchi Date: Tue, 15 Feb 2022 13:56:18 -0600 Subject: [PATCH 33/40] Avoid showing UQ dialog --- foqus_lib/framework/uq/Common.py | 1 - 1 file changed, 1 deletion(-) diff --git a/foqus_lib/framework/uq/Common.py b/foqus_lib/framework/uq/Common.py index ab7f50858..e8c17e142 100644 --- a/foqus_lib/framework/uq/Common.py +++ b/foqus_lib/framework/uq/Common.py @@ -66,7 +66,6 @@ def showError(self, error, out=None): ) if out is not None: msgBox.setDetailedText(out) - msgBox.exec_() @staticmethod def getPsuadePath(): ### OBSOLETE in this release From f96d09b4bb34cacdb4b875a847ec0be1fcd584ba Mon Sep 17 00:00:00 2001 From: Ludovico Bianchi Date: Tue, 15 Feb 2022 14:10:08 -0600 Subject: [PATCH 34/40] Try using open() instead of show() for analysis dialog issue on macOS --- foqus_lib/gui/uq/uqSetupFrame.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/foqus_lib/gui/uq/uqSetupFrame.py b/foqus_lib/gui/uq/uqSetupFrame.py index 60ed70ad3..b43808309 100644 --- a/foqus_lib/gui/uq/uqSetupFrame.py +++ b/foqus_lib/gui/uq/uqSetupFrame.py @@ -1013,7 +1013,7 @@ def launchSim(self): else: raise Exception("Invalid Run Mode") self.checkThread = checkingThread(row, self) - self.checkThread.runsFinishedSignal.connect(self.runsFinishedSignal) + self.checkThread.runsFinishedSignal.connect(self.runsFinishedSignal.emit) self.checkThread.start() elif sender.text() == "Stop": if self.dat.foqusSettings.runFlowsheetMethod == 1: @@ -1128,7 +1128,7 @@ def analyzeSim(self): dialog = AnalysisDialog(row + 1, sim, self) self._analysis_dialog = dialog - res = dialog.show() + res = dialog.open() def resizeColumns(self): self.simulationTable.resizeColumnsToContents() From a46fa00c966cfd0b4a413db62c582bba273acad0 Mon Sep 17 00:00:00 2001 From: Ludovico Bianchi Date: Tue, 15 Feb 2022 09:39:54 -0600 Subject: [PATCH 35/40] Revert "Try waiting for signals instead of dealing with modals" This reverts commit 141995cdb770d9abb9e63a1b47aa5874136bbac7. --- foqus_lib/gui/main/mainWindow.py | 20 ++++++++++++-------- foqus_lib/gui/tests/test_ml_ai.py | 8 ++++++-- foqus_lib/gui/tests/test_uq.py | 2 +- foqus_lib/gui/uq/uqSetupFrame.py | 2 ++ 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/foqus_lib/gui/main/mainWindow.py b/foqus_lib/gui/main/mainWindow.py index 776eba8bd..62f3762c4 100644 --- a/foqus_lib/gui/main/mainWindow.py +++ b/foqus_lib/gui/main/mainWindow.py @@ -76,8 +76,6 @@ class mainWindow(QMainWindow): This is the FOQUS main window class """ - simCompleted = QtCore.pyqtSignal(str, bool) - def __init__( self, title, @@ -1394,27 +1392,33 @@ def stopSim(self): self.runningSingle = False self.dat.flowsheet.onlySingleNode = None if err == 0: - self.simCompleted.emit( + QMessageBox.information( + self, "Finished in " + hhmmss(int(self.dat.flowsheet.solTime)), - True, + "The simulation completed successfully.", ) self.setStatus( "Finished Single Simulation... Success in " + hhmmss(int(self.dat.flowsheet.solTime)) ) elif err == 100: - self.simCompleted.emit( + QMessageBox.information( + self, "Finished in " + hhmmss(int(self.dat.flowsheet.solTime)) + "s", - True, + "The single node simulation completed successfully.", ) self.setStatus( "Finished Single Node Simulation... Success in " + hhmmss(int(self.dat.flowsheet.solTime)) ) else: - self.simCompleted.emit( + QMessageBox.critical( + self, "Error in " + hhmmss(int(self.dat.flowsheet.solTime)) + "s", - False, + "The simulation completed with an error " + + str(err) + + ", " + + errText, ) self.setStatus( "Error Single Simulation in " diff --git a/foqus_lib/gui/tests/test_ml_ai.py b/foqus_lib/gui/tests/test_ml_ai.py index 9060636b4..ec024aea2 100644 --- a/foqus_lib/gui/tests/test_ml_ai.py +++ b/foqus_lib/gui/tests/test_ml_ai.py @@ -128,8 +128,12 @@ def trigger_flowsheet_run_action( pymodels_ml_ai, ): run_action = main_window.runAction - with qtbot.wait_signal(main_window.simCompleted, timeout=2_000): - run_action.trigger() + with qtbot.replacing_with_signal( + (QtWidgets.QMessageBox, "information"), + (QtWidgets.QMessageBox, "critical"), + ) as signal: + with qtbot.wait_signal(signal, timeout=2_000): + run_action.trigger() return run_action @pytest.fixture(scope="function") diff --git a/foqus_lib/gui/tests/test_uq.py b/foqus_lib/gui/tests/test_uq.py index 1f532f179..80925c6be 100644 --- a/foqus_lib/gui/tests/test_uq.py +++ b/foqus_lib/gui/tests/test_uq.py @@ -73,7 +73,7 @@ def test_generate_samples(self, qtbot, generate_samples): def run_simulation(self, qtbot): with qtbot.focusing_on(self.frame.simulationTable): qtbot.select_row(0) - with qtbot.wait_signal(self.frame.runsFinishedSignal, timeout=90_000): + with qtbot.waiting_for_modal(timeout=90_000): qtbot.using(column="Launch").click() @pytest.mark.usefixtures("run_simulation") diff --git a/foqus_lib/gui/uq/uqSetupFrame.py b/foqus_lib/gui/uq/uqSetupFrame.py index b43808309..5578b18de 100644 --- a/foqus_lib/gui/uq/uqSetupFrame.py +++ b/foqus_lib/gui/uq/uqSetupFrame.py @@ -1138,7 +1138,9 @@ def resultsBox(self, numSuccessful, numSamples): msgBox = QtWidgets.QMessageBox() msgBox.setWindowTitle("FOQUS Run Finished") msgBox.setText("%d of %d runs were successful!" % (numSuccessful, numSamples)) + result = msgBox.exec_() self.refreshFilterData(updateResult=True) + return result # =========================== START Brenda's stuff ========================= From dd9beb8f989af36838ee1815d0acd87f23b54f96 Mon Sep 17 00:00:00 2001 From: Ludovico Bianchi Date: Tue, 15 Feb 2022 18:43:32 -0600 Subject: [PATCH 36/40] Try using open() instead of exec() for modal dialog --- foqus_lib/gui/uq/uqSetupFrame.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/foqus_lib/gui/uq/uqSetupFrame.py b/foqus_lib/gui/uq/uqSetupFrame.py index 5578b18de..722a38251 100644 --- a/foqus_lib/gui/uq/uqSetupFrame.py +++ b/foqus_lib/gui/uq/uqSetupFrame.py @@ -1138,7 +1138,7 @@ def resultsBox(self, numSuccessful, numSamples): msgBox = QtWidgets.QMessageBox() msgBox.setWindowTitle("FOQUS Run Finished") msgBox.setText("%d of %d runs were successful!" % (numSuccessful, numSamples)) - result = msgBox.exec_() + result = msgBox.open() self.refreshFilterData(updateResult=True) return result From 45cd78de3f22bbf368970b9179ccd171fecc5d46 Mon Sep 17 00:00:00 2001 From: Ludovico Bianchi Date: Tue, 22 Feb 2022 20:09:26 -0600 Subject: [PATCH 37/40] Restore job dependency --- .github/workflows/checks.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 560b1aefc..7f8c0320b 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -50,7 +50,7 @@ jobs: black --check . pytest: name: pytest (py${{ matrix.python-version }}/${{ matrix.os }}) - # needs: [code-formatting] + needs: [code-formatting] runs-on: ${{ matrix.os-version }} strategy: fail-fast: false From a4799af70964dbc635ba9bee83304266047166c8 Mon Sep 17 00:00:00 2001 From: Brandon Paul Date: Wed, 2 Mar 2022 10:20:26 -0800 Subject: [PATCH 38/40] Improving exception handling --- foqus_lib/framework/graph/node.py | 81 +++++++++++++++++++++++++------ 1 file changed, 67 insertions(+), 14 deletions(-) diff --git a/foqus_lib/framework/graph/node.py b/foqus_lib/framework/graph/node.py index 9fe2be5b9..b553cfe33 100644 --- a/foqus_lib/framework/graph/node.py +++ b/foqus_lib/framework/graph/node.py @@ -45,9 +45,12 @@ import tensorflow as tf load = tf.keras.models.load_model -except: - pass # errors will be thrown if tensorflow is called but not installed, - # otherwise no error should be thrown so passing is fine +except ImportError: + # if TensorFlow is not available, create a proxy function that will raise + # an exception whenever code tries to use `load()` at runtime + def load(*args, **kwargs): + raise RuntimeError(f"`load()` was called with args={args}," + "kwargs={kwargs} but `tensorflow` is not available") # pylint: enable=import-error @@ -106,15 +109,33 @@ def __init__(self, model): for i in range(np.shape(self.model.inputs[0])[1]): try: input_label = self.model.layers[1].input_labels[i] - except: + except AttributeError: + logging.getLogger("foqus." + __name__).info( + "Model has no attribute input_label, using default x" + + str(i + 1) + ". If attribute should exist, check that " + + "Tensorflow Keras model was correctly saved with " + + "CustomLayer. Otherwise, this is not an error and model " + + "will load " + "as expected using default attributes.") input_label = "x" + str(i + 1) try: input_min = self.model.layers[1].input_bounds[input_label][0] - except: + except AttributeError: + logging.getLogger("foqus." + __name__).info( + "Model has no attribute input_min, using default 0" + + ". If attribute should exist, check that " + + "Tensorflow Keras model was correctly saved with " + + "CustomLayer. Otherwise, this is not an error and model " + + "will load as expected using default attributes.") input_min = 0 # not necessarily a good default try: input_max = self.model.layers[1].input_bounds[input_label][1] - except: + except AttributeError: + logging.getLogger("foqus." + __name__).info( + "Model has no attribute input_max, using default 1E5" + + ". If attribute should exist, check that " + + "Tensorflow Keras model was correctly saved with " + + "CustomLayer. Otherwise, this is not an error and model " + + "will load as expected using default attributes.") input_max = 1e5 # not necessarily a good default self.inputs[input_label] = NodeVars( @@ -132,15 +153,33 @@ def __init__(self, model): for j in range(np.shape(self.model.outputs[0])[1]): try: output_label = self.model.layers[1].output_labels[j] - except: + except AttributeError: + logging.getLogger("foqus." + __name__).info( + "Model has no attribute output_label, using default z" + + str(j + 1) + ". If attribute should exist, check that " + + "Tensorflow Keras model was correctly saved with " + + "CustomLayer. Otherwise, this is not an error and model " + + "will load as expected using default attributes.") output_label = "z" + str(j + 1) try: output_min = self.model.layers[1].output_bounds[output_label][0] - except: + except AttributeError: + logging.getLogger("foqus." + __name__).info( + "Model has no attribute output_min, using default 0" + + ". If attribute should exist, check that " + + "Tensorflow Keras model was correctly saved with " + + "CustomLayer. Otherwise, this is not an error and model " + + "will load as expected using default attributes.") output_min = 0 # not necessarily a good default try: output_max = self.model.layers[1].output_bounds[output_label][1] - except: + except AttributeError: + logging.getLogger("foqus." + __name__).info( + "Model has no attribute output_max, using default 1E5" + + ". If attribute should exist, check that " + + "Tensorflow Keras model was correctly saved with " + + "CustomLayer. Otherwise, this is not an error and model " + + "will load as expected using default attributes.") output_max = 1e5 # not necessarily a good default self.outputs[output_label] = NodeVars( @@ -158,7 +197,13 @@ def __init__(self, model): # check if user passed a model for normalized data - FOQUS will automatically scale/un-scale try: # if attribute exists, user has specified a model form self.normalized = self.model.layers[1].normalized - except: # otherwise user did not pass a normalized model + except AttributeError: # otherwise user did not pass a normalized model + logging.getLogger("foqus." + __name__).info( + "Model has no attribute normalized, using default False" + + ". If attribute should exist, check that " + + "Tensorflow Keras model was correctly saved with " + + "CustomLayer. Otherwise, this is not an error and model " + + "will load as expected using default attributes.") self.normalized = False def run(self): @@ -604,9 +649,13 @@ def setSim(self, newType=None, newModel=None, force=False, ids=None): str(self.modelName): getattr(module, str(self.modelName)) }, ) - except: # try to load model without custom layer + except ImportError: # try to load model without custom layer + logging.getLogger("foqus." + __name__).info( + "Cannot detect CustomLayer object to import, FOQUS " + + "will import model without custom attributes.") self.model = load(str(self.modelName) + ".h5") - os.chdir(cwd) # reset to original working directory + finally: + os.chdir(cwd) # reset to original working directory inst = pymodel_ml_ai(self.model) for vkey, v in inst.inputs.items(): self.gr.input[self.name][vkey] = v @@ -1106,9 +1155,13 @@ def runPymodelMLAI(self): str(self.modelName): getattr(module, str(self.modelName)) }, ) - except: # try to load model without custom layer + except ImportError: # try to load model without custom layer + logging.getLogger("foqus." + __name__).info( + "Cannot detect CustomLayer object to import, FOQUS " + + "will import model without custom attributes.") self.model = load(str(self.modelName) + ".h5") - os.chdir(cwd) # reset to original working directory + finally: + os.chdir(cwd) # reset to original working directory self.pyModel = pymodel_ml_ai(self.model) # set the instance inputs for vkey, v in self.gr.input[self.name].items(): From 285df2366335bbd155fa5fc0f84ddf81331ed34a Mon Sep 17 00:00:00 2001 From: Brandon Paul Date: Wed, 2 Mar 2022 10:27:56 -0800 Subject: [PATCH 39/40] Running black again --- foqus_lib/framework/graph/node.py | 42 +++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/foqus_lib/framework/graph/node.py b/foqus_lib/framework/graph/node.py index b553cfe33..b93deff16 100644 --- a/foqus_lib/framework/graph/node.py +++ b/foqus_lib/framework/graph/node.py @@ -49,8 +49,12 @@ # if TensorFlow is not available, create a proxy function that will raise # an exception whenever code tries to use `load()` at runtime def load(*args, **kwargs): - raise RuntimeError(f"`load()` was called with args={args}," - "kwargs={kwargs} but `tensorflow` is not available") + raise RuntimeError( + f"`load()` was called with args={args}," + "kwargs={kwargs} but `tensorflow` is not available" + ) + + # pylint: enable=import-error @@ -112,10 +116,13 @@ def __init__(self, model): except AttributeError: logging.getLogger("foqus." + __name__).info( "Model has no attribute input_label, using default x" - + str(i + 1) + ". If attribute should exist, check that " + + str(i + 1) + + ". If attribute should exist, check that " + "Tensorflow Keras model was correctly saved with " + "CustomLayer. Otherwise, this is not an error and model " - + "will load " + "as expected using default attributes.") + + "will load " + + "as expected using default attributes." + ) input_label = "x" + str(i + 1) try: input_min = self.model.layers[1].input_bounds[input_label][0] @@ -125,7 +132,8 @@ def __init__(self, model): + ". If attribute should exist, check that " + "Tensorflow Keras model was correctly saved with " + "CustomLayer. Otherwise, this is not an error and model " - + "will load as expected using default attributes.") + + "will load as expected using default attributes." + ) input_min = 0 # not necessarily a good default try: input_max = self.model.layers[1].input_bounds[input_label][1] @@ -135,7 +143,8 @@ def __init__(self, model): + ". If attribute should exist, check that " + "Tensorflow Keras model was correctly saved with " + "CustomLayer. Otherwise, this is not an error and model " - + "will load as expected using default attributes.") + + "will load as expected using default attributes." + ) input_max = 1e5 # not necessarily a good default self.inputs[input_label] = NodeVars( @@ -156,10 +165,12 @@ def __init__(self, model): except AttributeError: logging.getLogger("foqus." + __name__).info( "Model has no attribute output_label, using default z" - + str(j + 1) + ". If attribute should exist, check that " + + str(j + 1) + + ". If attribute should exist, check that " + "Tensorflow Keras model was correctly saved with " + "CustomLayer. Otherwise, this is not an error and model " - + "will load as expected using default attributes.") + + "will load as expected using default attributes." + ) output_label = "z" + str(j + 1) try: output_min = self.model.layers[1].output_bounds[output_label][0] @@ -169,7 +180,8 @@ def __init__(self, model): + ". If attribute should exist, check that " + "Tensorflow Keras model was correctly saved with " + "CustomLayer. Otherwise, this is not an error and model " - + "will load as expected using default attributes.") + + "will load as expected using default attributes." + ) output_min = 0 # not necessarily a good default try: output_max = self.model.layers[1].output_bounds[output_label][1] @@ -179,7 +191,8 @@ def __init__(self, model): + ". If attribute should exist, check that " + "Tensorflow Keras model was correctly saved with " + "CustomLayer. Otherwise, this is not an error and model " - + "will load as expected using default attributes.") + + "will load as expected using default attributes." + ) output_max = 1e5 # not necessarily a good default self.outputs[output_label] = NodeVars( @@ -203,7 +216,8 @@ def __init__(self, model): + ". If attribute should exist, check that " + "Tensorflow Keras model was correctly saved with " + "CustomLayer. Otherwise, this is not an error and model " - + "will load as expected using default attributes.") + + "will load as expected using default attributes." + ) self.normalized = False def run(self): @@ -652,7 +666,8 @@ def setSim(self, newType=None, newModel=None, force=False, ids=None): except ImportError: # try to load model without custom layer logging.getLogger("foqus." + __name__).info( "Cannot detect CustomLayer object to import, FOQUS " - + "will import model without custom attributes.") + + "will import model without custom attributes." + ) self.model = load(str(self.modelName) + ".h5") finally: os.chdir(cwd) # reset to original working directory @@ -1158,7 +1173,8 @@ def runPymodelMLAI(self): except ImportError: # try to load model without custom layer logging.getLogger("foqus." + __name__).info( "Cannot detect CustomLayer object to import, FOQUS " - + "will import model without custom attributes.") + + "will import model without custom attributes." + ) self.model = load(str(self.modelName) + ".h5") finally: os.chdir(cwd) # reset to original working directory From 25c6226b6e517aa51fe88af20b9c108229bb608e Mon Sep 17 00:00:00 2001 From: Brandon Paul Date: Wed, 2 Mar 2022 12:34:52 -0800 Subject: [PATCH 40/40] Minor changes --- foqus_lib/framework/graph/node.py | 94 ++++++++++++------------------- 1 file changed, 36 insertions(+), 58 deletions(-) diff --git a/foqus_lib/framework/graph/node.py b/foqus_lib/framework/graph/node.py index b93deff16..8bd321acb 100644 --- a/foqus_lib/framework/graph/node.py +++ b/foqus_lib/framework/graph/node.py @@ -39,6 +39,8 @@ from PyQt5.QtWidgets import QMessageBox from importlib import import_module +_logger = logging.getLogger("foqus." + __name__) + # pylint: disable=import-error try: # tensorflow should be installed, but is not required for non ML/AI models @@ -49,7 +51,7 @@ # if TensorFlow is not available, create a proxy function that will raise # an exception whenever code tries to use `load()` at runtime def load(*args, **kwargs): - raise RuntimeError( + raise ModuleNotFoundError( f"`load()` was called with args={args}," "kwargs={kwargs} but `tensorflow` is not available" ) @@ -114,7 +116,7 @@ def __init__(self, model): try: input_label = self.model.layers[1].input_labels[i] except AttributeError: - logging.getLogger("foqus." + __name__).info( + _logger.info( "Model has no attribute input_label, using default x" + str(i + 1) + ". If attribute should exist, check that " @@ -127,7 +129,7 @@ def __init__(self, model): try: input_min = self.model.layers[1].input_bounds[input_label][0] except AttributeError: - logging.getLogger("foqus." + __name__).info( + _logger.info( "Model has no attribute input_min, using default 0" + ". If attribute should exist, check that " + "Tensorflow Keras model was correctly saved with " @@ -138,7 +140,7 @@ def __init__(self, model): try: input_max = self.model.layers[1].input_bounds[input_label][1] except AttributeError: - logging.getLogger("foqus." + __name__).info( + _logger.info( "Model has no attribute input_max, using default 1E5" + ". If attribute should exist, check that " + "Tensorflow Keras model was correctly saved with " @@ -163,7 +165,7 @@ def __init__(self, model): try: output_label = self.model.layers[1].output_labels[j] except AttributeError: - logging.getLogger("foqus." + __name__).info( + _logger.info( "Model has no attribute output_label, using default z" + str(j + 1) + ". If attribute should exist, check that " @@ -175,7 +177,7 @@ def __init__(self, model): try: output_min = self.model.layers[1].output_bounds[output_label][0] except AttributeError: - logging.getLogger("foqus." + __name__).info( + _logger.info( "Model has no attribute output_min, using default 0" + ". If attribute should exist, check that " + "Tensorflow Keras model was correctly saved with " @@ -186,7 +188,7 @@ def __init__(self, model): try: output_max = self.model.layers[1].output_bounds[output_label][1] except AttributeError: - logging.getLogger("foqus." + __name__).info( + _logger.info( "Model has no attribute output_max, using default 1E5" + ". If attribute should exist, check that " + "Tensorflow Keras model was correctly saved with " @@ -211,7 +213,7 @@ def __init__(self, model): try: # if attribute exists, user has specified a model form self.normalized = self.model.layers[1].normalized except AttributeError: # otherwise user did not pass a normalized model - logging.getLogger("foqus." + __name__).info( + _logger.info( "Model has no attribute normalized, using default False" + ". If attribute should exist, check that " + "Tensorflow Keras model was correctly saved with " @@ -664,7 +666,7 @@ def setSim(self, newType=None, newModel=None, force=False, ids=None): }, ) except ImportError: # try to load model without custom layer - logging.getLogger("foqus." + __name__).info( + _logger.info( "Cannot detect CustomLayer object to import, FOQUS " + "will import model without custom attributes." ) @@ -765,9 +767,7 @@ def runModel(self): else: # This shouldn't happen from the GUI there should # be no way to select an unknown model type. - logging.getLogger("foqus." + __name__).error( - "unknown run type: " + str(self.modelType) - ) + _logger.error("unknown run type: " + str(self.modelType)) self.calcError = 9 def getValues(self): @@ -843,22 +843,18 @@ def runPython(self): idx ]["value"] except PyCodeInterupt as e: - logging.getLogger("foqus." + __name__).error( - "Node script interupt: " + str(e) - ) + _logger.error("Node script interupt: " + str(e)) if self.calcError == -1: # if no error code set go with 50 # otherwise the sim would appear to be successful self.calcError = 50 except NpCodeEx as e: - logging.getLogger("foqus." + __name__).exception( + _logger.exception( "Error in node python code: {0}, {1}".format(e.code, e.msg) ) self.calcError = e.code except Exception as e: - logging.getLogger("foqus." + __name__).exception( - "Error in node python code" - ) + _logger.exception("Error in node python code") self.calcError = 21 def generateInputJSON(self): @@ -903,7 +899,7 @@ def generateInputJSON(self): if var.optSet == NodeOptionSets.SINTER_OPTIONS: inputSetL1["Input"][vkey] = var.value s = json.dumps(runList, sort_keys=True, indent=2) - logging.getLogger("foqus." + __name__).debug("Generated Job JSON:\n" + s) + _logger.debug("Generated Job JSON:\n" + s) return s def runTurbineCalc(self, retry=False): @@ -934,7 +930,7 @@ def runTurbineCalc(self, retry=False): configProfile.updateSettings() else: configProfile.updateSettings(altConfig=altTurb) - logging.getLogger("foqus." + __name__).debug( + _logger.debug( "Alternate Turbine configuration: {0} for node: {1}".format( altTurb, self.name ) @@ -946,7 +942,7 @@ def runTurbineCalc(self, retry=False): if localRun and maxConsumerUse > 0: count = configProfile.consumerCount(self.name) if count >= maxConsumerUse: - logging.getLogger("foqus." + __name__).debug( + _logger.debug( "Max consumer use exceeded restarting consumer {0}".format( self.name ) @@ -965,7 +961,7 @@ def runTurbineCalc(self, retry=False): 5, 30, 1, configProfile.createJobsInSession, sid, inputData )[0] except Exception as e: - logging.getLogger("foqus." + __name__).exception("Failed create job") + _logger.exception("Failed create job") self.calcError = 5 configProfile.updateSettings() return @@ -973,15 +969,11 @@ def runTurbineCalc(self, retry=False): try: configProfile.retryFunction(5, 30, 1, configProfile.startSession, sid) except Exception as e: - logging.getLogger("foqus." + __name__).exception( - "Failed start job: {0}".format(jobID) - ) + _logger.exception("Failed start job: {0}".format(jobID)) self.calcError = 8 configProfile.updateSettings() return - logging.getLogger("foqus." + __name__).debug( - "Started Job: {0} Turbin SID: {1}".format(jobID, sid) - ) + _logger.debug("Started Job: {0} Turbin SID: {1}".format(jobID, sid)) # Monitor jobs, there are some timeouts if jobs fail to finish # in an allowed amount of time they are terminated try: @@ -1000,9 +992,7 @@ def runTurbineCalc(self, retry=False): app=app, checkConsumer=localRun, ) - logging.getLogger("foqus." + __name__).debug( - "Job finished successfully: " + str(jobID) - ) + _logger.debug("Job finished successfully: " + str(jobID)) except TurbineInterfaceEx as e: res = configProfile.res if e.code == 351: @@ -1017,38 +1007,34 @@ def runTurbineCalc(self, retry=False): self.calcError = 11 else: self.calcError = 7 - logging.getLogger("foqus." + __name__).error( + _logger.error( "Error while motoring job: {0}, Ex: {1}".format(str(jobID), str(e)) ) except Exception as e: self.calcError = 10 res = configProfile.res - logging.getLogger("foqus." + __name__).warning( + _logger.warning( "Error while motoring job: {0}, Ex: {1}".format(str(jobID), str(e)) ) # if error code is not -1 some other error and sim not successful readResults = True if self.calcError == -1: - logging.getLogger("foqus." + __name__).info( - "Job " + str(jobID) + " Finished Successfully" - ) + _logger.info("Job " + str(jobID) + " Finished Successfully") else: # The job failed, don't know why but I'll restart the # consumer so that the next run will be less likely to fail. if localRun and self.options["Reset on Fail"].value: - logging.getLogger("foqus." + __name__).info( + _logger.info( "Job failed, stopping consumer for {0}".format(self.modelName) ) self.resetModel() elif localRun: - logging.getLogger("foqus." + __name__).info( + _logger.info( "Job failed, will not stop consumer for {0}".format(self.modelName) ) # Possibly retry the simulation if it failed if retry and not self.gr.stop.isSet(): - logging.getLogger("foqus." + __name__).info( - "Retrying Failed Job " + str(jobID) - ) + _logger.info("Retrying Failed Job " + str(jobID)) # rerun this function # reset error code so doesn't automatically think # the retry fails. @@ -1058,13 +1044,9 @@ def runTurbineCalc(self, retry=False): # will be read in the retry call if successful readResults = False else: - logging.getLogger("foqus." + __name__).info( - "Job " + str(jobID) + " Failed will not retry" - ) + _logger.info("Job " + str(jobID) + " Failed will not retry") # Even if there was an error try to read output - logging.getLogger("foqus." + __name__).debug( - "Job " + str(jobID) + " Results:\n" + json.dumps(res) - ) + _logger.debug("Job " + str(jobID) + " Results:\n" + json.dumps(res)) if res is not None: m = res.get("Messages", "") if m is None or m == "": @@ -1089,10 +1071,8 @@ def runTurbineCalc(self, retry=False): # doesn't match the outputs in the node that's # okay may have deleted a variable. Simulation may # also have failed before producing any output. - logging.getLogger("foqus." + __name__).exception() - logging.getLogger("foqus." + __name__).debug( - "Outputs: {0}\n".format("\n".join(outputlog)) - ) + _logger.exception() + _logger.debug("Outputs: {0}\n".format("\n".join(outputlog))) # reset the turbine config back to whatever is in the settings # in case an alternative config was used. configProfile.updateSettings() @@ -1118,7 +1098,7 @@ def createTurbineSession(self, forceNew=True): if self.gr.turbConfig.sessionExists(self.turbSession): return self.turbSession except Exception as e: - logging.getLogger("foqus." + __name__).exception( + _logger.exception( "Failed to check for existence of session while" " creating session, Exception: " ) @@ -1127,9 +1107,7 @@ def createTurbineSession(self, forceNew=True): try: self.turbSession = self.gr.turbConfig.createSession() except Exception as e: - logging.getLogger("foqus." + __name__).exception( - "Failed to create a new session." - ) + _logger.exception("Failed to create a new session.") self.turbSession = 0 return 0 return self.turbSession @@ -1149,7 +1127,7 @@ def killTurbineSession(self): try: self.gr.turbConfig.killSession(sid) except Exception as e: - logging.getLogger("foqus." + __name__).error( + _logger.error( "Failed to kill session sid: {0} Exception: {1}".format(sid, str(e)) ) @@ -1171,7 +1149,7 @@ def runPymodelMLAI(self): }, ) except ImportError: # try to load model without custom layer - logging.getLogger("foqus." + __name__).info( + _logger.info( "Cannot detect CustomLayer object to import, FOQUS " + "will import model without custom attributes." )