From 5067355f701afd9f0085062756f60ed08d00d5df Mon Sep 17 00:00:00 2001 From: wentian Date: Thu, 7 Sep 2023 15:01:00 +0000 Subject: [PATCH 01/41] RL template --- openfasoc/MLoptimization/README | 44 ++++ openfasoc/MLoptimization/eval.py | 118 +++++++++ openfasoc/MLoptimization/gen_spec.py | 41 ++++ openfasoc/MLoptimization/image1.png | Bin 0 -> 75531 bytes openfasoc/MLoptimization/image2.png | Bin 0 -> 50214 bytes openfasoc/MLoptimization/model.py | 47 ++++ openfasoc/MLoptimization/run_training.py | 286 ++++++++++++++++++++++ openfasoc/MLoptimization/sample_spec.yaml | 100 ++++++++ 8 files changed, 636 insertions(+) create mode 100644 openfasoc/MLoptimization/README create mode 100644 openfasoc/MLoptimization/eval.py create mode 100755 openfasoc/MLoptimization/gen_spec.py create mode 100644 openfasoc/MLoptimization/image1.png create mode 100644 openfasoc/MLoptimization/image2.png create mode 100644 openfasoc/MLoptimization/model.py create mode 100644 openfasoc/MLoptimization/run_training.py create mode 100644 openfasoc/MLoptimization/sample_spec.yaml diff --git a/openfasoc/MLoptimization/README b/openfasoc/MLoptimization/README new file mode 100644 index 000000000..7344ccddf --- /dev/null +++ b/openfasoc/MLoptimization/README @@ -0,0 +1,44 @@ +# Machine Learning Optimization +Code for reinforcement learning loop with openfasoc generators for optimizing metrics + +## Code Setup +The code is setup as follows: + +The top level directory contains two sub-directories: +* model.py: top level RL script, used to set hyperparameters and run training +* run_training.py: contains all OpenAI Gym environments. These function as the agent in the RL loop and contain information about parameter space, valid action steps and reward. +* eval.py: contains all of the code for evaluation +* gen_spec.py: contains all of the random specification generation + +## Training +Make sure that you have OpenAI Gym and Ray installed. To do this, run the following command: + +To generate the design specifications that the agent trains on, run: +``` +python3.10 gen_specs.py +``` +The result is a yaml file dumped to the ../generators/gdsfactory-gen/. + +To train the agent, open ipython from the top level directory and then: +``` +python3.10 model.py +``` +The training checkpoints will be saved in your home directory under ray\_results. Tensorboard can be used to load reward and loss plots using the command: + +``` +tensorboard --logdir path/to/checkpoint +``` + +## Validation +The evaluation script takes the trained agent and gives it new specs that the agent has never seen before. To generate new design specs, run the gen_specs.py file again with your desired number of specs to validate on. To run validation: + +``` +python3.10 eval.py +``` + +The evaluation result will be saved to the ../generators/gdsfactory-gen/. + +## Results +Please note that results vary greatly based on random seed and spec generation (both for testing and validation). An example spec file is provided that was used to generate the results below. + + \ No newline at end of file diff --git a/openfasoc/MLoptimization/eval.py b/openfasoc/MLoptimization/eval.py new file mode 100644 index 000000000..cb617e57a --- /dev/null +++ b/openfasoc/MLoptimization/eval.py @@ -0,0 +1,118 @@ +#training import +import numpy as np +import gym +import ray +import ray.tune as tune +from ray.rllib.algorithms.ppo import PPO +from run_training import Envir +from ../generators/gdsfactory-gen/sky130_nist_tapeout import single_build_and_simulation +import pickle +import yaml +from pathlib import Path +import argparse + +def unlookup(norm_spec, goal_spec): + spec = -1*np.multiply((norm_spec+1), goal_spec)/(norm_spec-1) + return spec + +specs = yaml.safe_load(Path('newnew_eval_3.yaml').read_text()) + +# +#training set up +env_config = { + "generalize":True, + "num_valid":2, + "save_specs":False, + "inputspec":specs, + "run_valid":True, + "horizon":25, + } + +config_eval = { + #"sample_batch_size": 200, + "env": Envir, + "env_config":{ + "generalize":True, + "num_valid":2, + "save_specs":False, + "inputspec":specs, + "run_valid":True, + "horizon":25, + }, + } + +parser = argparse.ArgumentParser() +parser.add_argument('--checkpoint_dir', '-cpd', type=str) +args = parser.parse_args() +env = Envir(env_config=env_config) + +agent = PPO.from_checkpoint("/home/wentian/ray_results/brandnewBound_1/PPO_Envir_7fc09_00000_0_2023-08-18_20-40-42/checkpoint_000015") + + + +norm_spec_ref = env.global_g +spec_num = len(env.specs) + + +rollouts = [] +next_states = [] +obs_reached = [] +obs_nreached = [] +action_array = [] +action_arr_comp = [] +rollout_steps = 0 +reached_spec = 0 +f = open("newnewnew_eval__3.txt", "a") + +while rollout_steps < 100: + rollout_num = [] + state, info = env.reset() + + done = False + truncated = False + reward_total = 0.0 + steps=0 + f.write('new----------------------------------------') + while not done and not truncated: + action = agent.compute_single_action(state) + action_array.append(action) + + next_state, reward, done, truncated, info = env.step(action) + f.write(str(action)+'\n') + f.write(str(reward)+'\n') + f.write(str(done)+'n') + print(next_state) + print(action) + print(reward) + print(done) + reward_total += reward + + rollout_num.append(reward) + next_states.append(next_state) + + state = next_state + + norm_ideal_spec = state[spec_num:spec_num+spec_num] + ideal_spec = unlookup(norm_ideal_spec, norm_spec_ref) + if done == True: + reached_spec += 1 + obs_reached.append(ideal_spec) + action_arr_comp.append(action_array) + action_array = [] + pickle.dump(action_arr_comp, open("action_arr_test", "wb")) + else: + obs_nreached.append(ideal_spec) #save unreached observation + action_array=[] + f.write('done----------------------------------------') + rollouts.append(rollout_num) + print("Episode reward", reward_total) + rollout_steps+=1 + #if out is not None: + #pickle.dump(rollouts, open(str(out)+'reward', "wb")) + pickle.dump(obs_reached, open("opamp_obs_reached_test","wb")) + pickle.dump(obs_nreached, open("opamp_obs_nreached_test","wb")) + + f.write("Specs reached: " + str(reached_spec) + "/" + str(len(obs_nreached))) + print("Specs reached: " + str(reached_spec) + "/" + str(len(obs_nreached))) + +print("Num specs reached: " + str(reached_spec) + "/" + str(1)) \ No newline at end of file diff --git a/openfasoc/MLoptimization/gen_spec.py b/openfasoc/MLoptimization/gen_spec.py new file mode 100755 index 000000000..60c5023f2 --- /dev/null +++ b/openfasoc/MLoptimization/gen_spec.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python3 +## Generate the design specifications and then save to a pickle file + +import numpy as np +import random +import yaml +import os +import argparse + +def gen_data(env, num_specs): + + specs_range = { + "gain_min" : [float(1000338000.0), float(3000338000.0)], + "FOM" : [float(5*10**11), float(5*10**11)] + } + specs_range_vals = list(specs_range.values()) + specs_valid = [] + for spec in specs_range_vals: + if isinstance(spec[0],int): + list_val = [random.randint(int(spec[0]),int(spec[1])) for x in range(0,num_specs)] + else: + list_val = [random.uniform(float(spec[0]),float(spec[1])) for x in range(0,num_specs)] + specs_valid.append(tuple(list_val)) + i=0 + for key,value in specs_range.items(): + specs_range[key] = specs_valid[i] + i+=1 + + output = str(specs_range) + with open(env, 'w') as f: + f.write(output.replace('(','[').replace(')',']').replace(',',',\n')) + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('--num_specs', type=str) + args = parser.parse_args() + + gen_data("newnew_eval_3.yaml", int(50)) + +if __name__=="__main__": + main() \ No newline at end of file diff --git a/openfasoc/MLoptimization/image1.png b/openfasoc/MLoptimization/image1.png new file mode 100644 index 0000000000000000000000000000000000000000..b94630ef7ad88bd814ccd718743b42f3701db562 GIT binary patch literal 75531 zcmZ_0WmH^G_BBihgeD0dAh^3b1b26r;O;aYEJ%>x?(QDk-Q8USje8T^o+k5~`Omy- zy?p4q`qEvu?zvT`_St(^hbYL2BfQ6c4+RBj=d#=%ffgiw+qf+}vh$LVmMxN~(ckw59A>vfDr+HQoH`aa80AOqk76oe$8 z^KKp`{o@irmlC?)COj-!Nl66=YX!`+`GxHI*-zVU$cJKRwX6ShY_NPenyRi=2bW~h zRJywEj;C{XGTMs7L1aLw}eE;WwCQb16KX3k?!xHQaF%i@MBldq6dTlpNpK^Sm%ED zfA#RSjjBIP|I=%dC=^JCOku?AdjIDxJ45m#{}Z0S(eMo;-0Wp0Vf;q&zjrA|>-F(} zFJcVyh9UvWcM8Yhzd{UY!|=f9Z%hAa_x~r90=DXbSrrv>)z#H`_4R6&mX@U4+}c1# z$G-Z)?*8iw@6FCPya_R}vAF}<*s^ccv)plu}^ z=?31)z5fcYfVgdClpk_Vmnh`B%Mw_yuf{b*7b1qf6a-17f59LAq+*7_;SC{0lMjUX**u35r2n- zU#5V~Wb9KdxgtS9`X^c(Kf2QA>BtiGrH9}->uf>CF+63i#renurlAkX`M<)IwM{f> z!j@qAo`H%gn&9PjfZ3@3nvr}A{L2Z`i5a@aCPY}m_)~bAy%wD^V0C!gP&tUy~7=uK>l9owZn6R=HEX8J! zx`abX6lhNFbD6p^SfW}A@`b}!umJ_}{UJJ-DU9@d+$LD~;!sYyGWE@NrC#*HXP5 zNRUj1V#t6;UUSS&R_mBvjpD4G?(>H2j{^q^?Fe)si~@xrE=IM zq}n!1O6JDHqmdUO?U?aDXnMW$bF>qYh)2XFvzQG-COq5M=x8+ptN+jVXr`^IO${4b z9^FjpC@n3WV@2e`{o+*gZV%USl*tYY4SC|IqD4+GZb8rIt8K@V3j$PiXI29)2j-lf?faf|`@wElCWR|HKvs7ay zkHv1Cr1R|{|4>{Kn<%IM;rgUhkO$@g8D6eU?-`tUs2uXLvs`Djle+O(U`az%AV>S8 zzWaXz^ecidy)^Au1Munos@h}(gX`hACjMg#EuP`vvupch`gDhn&zv0UFUO~=g^^^l zjAA2Dn&bG?{qfOUX`<(m_C^eqasg#k?RP?o#IGlNpoODLRd zYG2msq!0pW@@4a6?UQmBQ5a7i)7=X0hzKK7JHj+l|wRvs_Aaz0~3 zHoIar^~p*ilPn28t8T$>>u{V!%?T8Foej;(Dz=IdhtZG2kf!X7 zQ6uvQMxu!()h4h{@vu||*JR$IQzVGH5O5z&{p}9w8*zH6oVL4cT#MgbJyUHq)sC5r^oqn?Lv!M4d5&V<}8!H?wGVWQI^OQ2f!a_6<& zP6XWONQcCnicpEminNPh!+;%s@o?-p%kAh(pxo*}qmSp!79dY3YXn7FK%mnAI_M*K zk_^m^_G1aRz|Z^X{!Zo;@Wupd>~yV#CP6nP;=2Xvpj&5eaZypxLHI2SJPf<-YLQVi ztC4O>5R?(HClGOe__1fokKXrB(l5`>`6*vxG{8oTHTu(o zr3>;HX%QxuVgcb6{Y_pGk(ax5%U2OnS1T^KseFiA9orzLr9bn{rzkdT_^}gKH{+BbdPpIQfe2*;kPG`Ne`kzCO{eS~3Rm}=X`+Bm+V>kTlmxUNGUY{bPz z)lHl9hUlbU*iwMKtrGVSxL<3;6Fu-b@Zz*jI+U)Thn)98ggPkIO#2--!yW zVSf~4EN_n;aRH*W;rwTMV2TsMIv#8V*LLl25XSrJ3sFv~RnTeDFjRObX6W4I@ibg> zY1Vnft1PG;JtMnjNLa*`9a#HIpDX`OmXn8oJRsIjJF6?iJ9us~XnEeNILI94Qqs|( z<^A?23Qdkv@U-=E{M~|-z&Vol`CBZ0@798096rxR&m9`QDN&8GsFH)X1h?ODT~{4| z$5jKvHVtdn7_CM8Cc~fZmL|Nf6TI+D{Hr4~Jo< zMn}eCtDgFYhkE1_iu;t~b-)vBi8h{SPk$gcIcW*_?7%8L=DTc8mgy!CqUp3BH?*jB zq|YK}>=lqUJ3C7XrgaTy=hy~v&k{}WT!y9jJl}yYB7Jn8A39#N9o?Q!?0jNx+RnUE z8txBEE9Z~yUNe5jZ65=Od*d!54LD3yZU0+nO^n`vB&y?ahrwhlg^k(c+FG;PI0V<{ z@d9|-v^Tuj<&T!M>b4!8qWADY?^Y27zPW9Jmsb!0uIO({-~ z^zHk161FZCmW(&Y8zdtxw6P}Ki9;R*t>UJLsl{!szi0Y6rsQ9dK)IiQ&U`V_w*nXT!WV zt0X?pmznVzF=hBlA%Wmhy{D3T*M2Os{kF%&0Y37V3xbzytwC`DFBSSG5UP#Y;cPLp z^&+Dn&QFY3X0vhJySYklve$JyNH=|0_ID7j5?u$HphY)uu0mCc+Un5Kc>22}bEEw) zkn2d|YMRbL#?04uSGc5Ta58cDO}rq2&}X8{hH>@mkneSxo+CGl6Mu1{z!8Z)FvgYD zV;8m7?ZL3g?!pVa(Bu=pvb#nuU+Jw?A7`i7T?}TL4VT~4?$`_B&n?evce^nBi%&|` zE9d<^zh3niEljh0<}Ob7H99gP&EuNs36`AG)%CvHL1=b7$WJ`H5yy8I+0ZOW$~P!K zcb_Scy+@b566XV>kQIpIIjiKzi9c@kRwJCH#B_aAb{X@nZP_X;`9QDC<6V$iZKy1reuEcj4x zOf+fgYQ4nJZZzp&oM@0D(RoOCKOEZatc%_ZXLxzk+JY}+5AtM}iHeYUJ*v_%H;7Q#A-wL)%tyr74G#m;mwsqtawMtO!Kk9jF9mQGPYJ_2OkR+n$Z)(Lk~Fuv&z zb@dmF3782JJ`3z#cH4Z|iMVqee17|2BJmsfAY+Z!0ChvJMUVPMeVC;*GkVR#b;Kj` zTjeJg2J8BfDBfF~*h=%7t-irri)N)0Bb<}I6%eOPq1XMN=*LITxtP8c_G!zf1M8c{ zHeICWn42}%%#_lOrxUv)-h=t_)JMo%jT@nFk!eA=F!m4>?9!%x>oYVxt+d7m1W9N% z*rt2$dRKmJQR@%G%I*F0u<_EqIT7;iawhY+Hl@!iv^Ht>zC|2HEy5+>(pCy{T zmHW$fdF1K3M!h2SwYtRFY1`bVh;v2*Y@a=rg0qY@kCJQP*eTl=fs?tw#O*?t*UU?} z4d~s$0oz&KsWo{RfS3cUkn^gv-ac=etk1iH2dl+Vt82M{sAv>F z;CT3)I9Bcbb$p(#gaR0RKWE;Jnt}ez$g6KO1rd02616ay(5^$Tt+$98T`j?lO3 zkxTQp|PzzY(pH(-*eYrcP zJiVm&6S8id%TZ~TEokiSfQt21GDD9kYnhT|O3pw2xOwZ`wLoD`%QbHLyS@W~VMzYu z72gVop#;l!j@%?#?S^%?3OQp5AqsukuAcCuCQ5=`dvAQ^+s5oVqEkMTCLnH=8pL-8 zXEv5X2B`zCs(P`fm`RpfrBSM?_COZ0`j&WCj0!;UY`0+|}Die}q+=tBCI8TI!ugz;B?wZ?WK zVaL2mVmCN=@T2!^yb48XTY>NKH`38*C_}pjd_L@NfzM^K z!6ccoE0!y=r>Q#f?en0^`*Jc$jx^m=CBFruTs#A>C+@TCUuW!2yWw6>#hD&~% z_!S3@zdG;I(48^PG-$1)=8MQ?uzrsg5FayxPY&P=?BkNq#pc&mqLEnc4A{Uqx_pD1Pd3s`;N&M?UUhDJIubmRv$&| z_EzOB*9ms&j1PZ-J3xTED_zyq86aacIo9h2J6+HQ2OW?E01kDLe!pq`|cmiM*APp)9T4>Thl*w&yvgfV#!UJ0~-0&5Q9uoo$B#2Kef6XFJ>cE%7k6G zcox$wv)Ko*Ztj6bPVlg1Hvzw^AHxnF3!-hrPAAofDa`CL%41LcR{aJ`(3 z)8Ow4cvD&NrbJ`ur{_ivOGyU}n$`UiPza>K$oLQ{rNr5|I?@ie_dJ|qT>*^>rM194 zjnTkwm!cOb*5m~+*foJ_gZW0l{~dx-IoXNlp>pQ53;ep^t{|W6wIFlI`v!FF&W|%( z%rWd`dHyEN3#mF2%j5(koabRy;g{q$JsqweVXC{4t^uubU;0J+JuDJOBC*ikk%v4# zJy^x>MzL5$65z8)o2JH6$jjyZkk}ir-D7)GB1Bu(D-8X|IsYimcz0)aD0rPDP6Mp@ zgTm)`>)3&-N2{X)t%Knn(fCt{on7RUt)17;NRpgSp`oE@v3U0><4M+b3$qwcA(1T{ z8=lHfd5qe3Zr00djIC}IHt$W1Jcm+<8?0qwnT*b!+kg*#D{SG&Y8mV9ZK{q#hG>H# z+T3a1)2B<6nhclG57~{WLYbMKk=Wi%b0L97p}jxKMsUX^^R3exV_?B!@v7*hxD+Za zL~KyRc;xaB-M8gWq&9Q3*O3rz7M#1-C&mmBLBss!tT0b&$Btt}2!2pu7v*g5m%gI^ zOUOmJ^tV(%Cw8fVY^JDL`%h1 zMG5kyPLQ0Clx_=hnj5++MxL}%;`XqU#Ch(q3@9IST1B2=4Epy^w_BMoLdoqc)_AM#lqIwUy7SB7Vx=g8xQ>Bwqu zoJt`2NH;+fO(YI5EsgV!$eg*BWJYJ<3V-at5VlxE&}05IGcYW=@78@3_PfnNtvL6t zx531Br-zd(T;F;j$d$E;GPhboG~E}2kOi$Qx&yq%(8H+Yc2fUV>HCZT(h)w^*f#LD zA&XqO8Nz;>os|I4!Qklg-BZ4gpwHLcXjF=P2dotX`gQI@fD!XW+-xMc3bFA?4N4-F0ZIw|^3)DNN*!R-XA zs8d6~D)}}fTWvo$7q4-Yg1B2LPfM3h?bL(LvaD#iAL;&l_#4!$P(moK_bC!|ziYge z#z5NAgZYKdwcd}74QeNUw70Oe7uH?wSJrkh_j{|y?0jASA>B8B0eU5gYk7&J zn*z|O2UkdxG$>;-H@<&&aRy4ROHX4&gEst<5kni)?O{?vzNdDl!lx1ZLnBT~LB5~w zg(xD~4Gm?$WD>3Stkm7THuYfVO#)#%Q4`d-7n_WgmIG{44;FzkU^&ELw`Zx8T>O=o znzUW?Xfk+G7>SJ&89WY*AQ20jj31BSyEnhvCU{xQLX zDf4xF=KWC&51b*H^(VTbPj{4fCa zxkNk+$$Nt_Zh{IkzDcQv8>+Ia*)@ZQX-rO*>z4bu_R?~tW5^>vV61GmcKp6^PTJ}P zGeX_j{!4@LWf$ulU2-A;MW~#B_+O|{@o$;UA_DR~NqLCKXqm`R6Y%21@lozFUr^v_ z$jNHs$5?|>50X6N6N=Js<2)nakS~&Lh90b2@Fu*qQ6V9+iG)N5>4A`=>@%i(9wLf) z84@zF1k6D7ALCZpmO%FQo|Ef84IADq^i6jeH?0&O>$t#=mlH?#XP#!F^fbs~heDtt z$2nE?p#ex0!6?%68R17=m!>v^7rX-QrMtcdA)*d_xh#{2x2?{N!r=Sc6R`4RF~o^^sb2UEx1_ZMg%O`a#)OSjpn7*#1D z|9N$fkAg299u{ADLj zS%q6v5Dk#MSY;H1`fd>JL1Wi-yFc7A(6szKCI&T`&#SotE5bb`{|C|A+Qg2fR}I2ubJ*aG(#rM{PJbp?@a@XRvl_m~G1FJI*t#tOuRn^fgwBrF znMdY4*YoYRGq39@?+$~{U8wbPtt4BVQGeK!4Mgjt#a}Tit8YoTep#5Sf4``SH}XqZFGM0E!`#4uHFRt%FMsSM7Tc?z0A* zLYiW?J6@j7Xo&jqhVEC*N9o&d4IxTKq~~=_rYtR7i0S*S9(Dk+2y8VAp}FnBThiEP z!7ugJOT;%DJ{=hZs2&hzXc)8o9F{E<$3pgP1iktX_};dg_0k*oazf*c_cy_Y1^deK zymfE*kQHcVv6zh|{8Xy(WSMO^3K=beG0EYRhU{7|#55c2vtzVs7xM-EeY)W(Soh(K z`X$J?3A--58Q0B&j)Ym{Hn1)sSlm_XtFyA37Na}azh|}}6skD`YpgGA@c~YatE#F9 zF;k>=)r2`^5JGI{FJe8JdX64kTO@snH+gpP_B=Ksn5l1v@Gc|Zosp~0!;r#vPUWZO zCp5Yz(Fgbg){SxYrjC=xJiVtwb=8$1`K`A|JXy<@r&g`{y9M?HI5e|dv(NnzR@N;R zWH$U-Lzff$dS?_y`>%z&caB9kCSdRPeb;T)DsY7EKB6ft1QmugeG7ZUNdf%jAG+Gc z|9f(yJCdpKoRHxm3HB<$jM*SSr8<)GLSWtRy|~{K7jeRn^Gqu>D?g706NBM3xx`zc zK(WhsbzQ}mrmZc*HF3OPQa(2b6OxT80nH}E9UO?7^XTUOZ!bWO?*TRh7*-?2G#m81 zBMU&r4kqYDyQIPvhZbV2%aP5&&qHzK4#1>CH-0-q>&1E6xLu1sFe5%%8A~oZZ4?OG zJ?73dl6wH2=7fgX)Nxrd`9k%}aM$L6&wf+j31A_O?%Bh4xOr_~gt|c7f5b$OsGj7B z9NZJ|7H9$6@V+)e?Q`y*O9j|)j_r?^ynKnZLogI;uQ7-QfBPo}<&ob}q=Sh~C0OmF zh)5!bM5fv=BNAd}g^{N@;cfa=_0@XiqoJv`xqG8r@gHwnu@qTnm;)l7qB!^*c^(!` z6&pMYd9O8lIbaO7dP5FfIUqbc0+jFI)<}?8Og&-cZMWtm;tJ(F{svuVkPWiJAdRWl zy#?8NVz1aslmHYl;?z$}3EaNZYztWUzz|G7v(Y`&Of}ZIi|+)dHxT8poG&%5-Rq&` zV0qbO1;SIJd8Z&?%isIWr-X>6sh}?UZy2}o-d~KeOzeNI_KT!gIET<(6!l&ZB6^`+ zh!TsT(JN0Il2Ah9799VR#z#lfWyq1{Xh@QRN@Dx@NCGZO#0Z(_3@yc2hTh_Y6P;NH z@qE6kxpz>)dXe!0kT3T~djH9_tbQI8=gUEImKcC=d<=6^UfVbuQSzQ!XxQ#y^U*Fu zmB>)R$a{hM$Zx{tXCz9aBW~+7GN-?1Nvn0)p>C-76;GnRY{Ky?_(g`k^{zLExiIJ* zgIa(YojiVlC=(dW`cGP>V=4KK4h&7MFr7T8)fkibH`hNl8LS1FVT=Tk;h_z61Vk=e zWytG`ZDIHl8-*Wv^EUj#)*UB!foskS#rC7Nov*3ZnqI< z!F>QI?1v zKI%*VM|va~4BEzBh@w*2Ebz)9%?eaP;-M}{;9ci{u&wPuwM-C9U0?;>H(7#eEewSf zi&MJ+;}kvg{X$gXvzOU4v?Mtr-O>%J4b3(Ja3yYwFF{stK*|lXidXgB5?B+VMukD8WrVuuf?JXOsfh>p-o8ob? z9UNa-bca3mX{E>xmX26Ub~#6u1ff>cTZC1$7EUlg|6D&vCWZ#(l3a^X2`yR~Ii{zH zkQo_uw4`CpCDoEM1Q0~4U$V!e#);(hD=WRRxE6lWDWt?m*yW9cI`EC7u3Do!jO~SG z*=9Rbu~nJCtt8whc@mMY%+MNLJH&HOhMt>9DQR)(4u0&sx|4?BFDeGs$hD4BqL{^Y zw#rf(a%_BaR>RqNH5Fg!vwlm2qSbNLS5KHmALypn4LGdwm_~fWUv@}mQI?qP52$qPFTg!4#WX7T>lh!Mk_?`9^T!a6InxFt8Tf>M_N z_0oKpVcrz06RQEtWQz3j`l1Vo{YAaf9Ph06wLyZoho$k%ecT~<%S+nXd*uwojQ;Jb z9nL9QYeXJr6%Xp4M~#1QLxMPzp#;+yNoI&XLb00@@A|bu^;#rE2 z0+s!J_}M?!F>_2nFI&RJ1gM5I{R6{?^D4wkUODPi3Cfi|XAcToU&LUD0SwV?rgh}+ zV&xK1QF?op-+|vrok=_vYz$MvUhUpblPGg70EWU zAry)Eh%4JRY$zm^8DRoI-9~?oP5p0?Afv~YfBQr>0Z!jwmg%Zw$m64g6PkV|8dndx z1{(vbzBzO!>kM=dK>ND&=Bw7&>=I7gs07U5?IXP@JNu7Z{{<8JBtfIUF3b~x#}juj zJ8pkiuQjukO|mKQU4+OFLX?{o0dC2*SEUw$j2Z?b@VG&>Gjg#EUI)^D9W=(|R-8@o zQL-dyV?-G)VOI-*;*QIf4Z<{X_}d~EoxbL>>%UBGHQd+_z0-7*IMAtVKti!qJTVW` zgH+AEySGX8O!z)$sD#Fw#IZg-fmYz_k7*^!9MO;55Z8li%l0;XgoSkEfXbfDI{K~R zS6E*cXX-SHMl;S3XwMBJZchLrj zmyACFGLuH+eeRX-AZ|7KSHy`6AO(QU$Y%Ka=O42h?l)O&@^(U3ehC_1TSuFW5F3V& zyU$WaZ%1M#GYZ1wNLoM_hv~(Bs2*MYeQQTKv(3xGd(2tR>7Cr9{_2$p>$Q4fPE599 zK1q1wD?m_9EL*e6o2I-lDx<3>OFfw} zFY!|MjZ;?*;khpw3}yJKq8|F^hywLgR{xsVaqnmAMc^Q4h&WM~nps~Uwvr-(EOWb( zoMZk6l0-ifAAJiWt!%r~K-ExGK2N88K-l@xfRR)ZVha-={`Tko27>x%Qx%D4yhSf3 z;L=CNmO-M|QSxId7=r*;sUpG@&SyMHO;#nQ%_*o@5T*H(tC&o7;mcdq(>F-CJ==uDeJ5ex^ z`}4OKJ@sYVzY_s_2#UsfrhlzK3NEdrR#v1p8R3rwT{Ss5If4pSms&Dsl;bUS8|@;D z*5Ab4%PWEfTArM7F18Bpv+nZMqZv0$*O%(QlyW zMv2uc$C$bBFxK0wkVE7+zO5iwn;H3g|ATgA9#6vf?Ado8KR_EC;{=@i+hlyvfgbk^ds@0`T>5-*bXT7!y) zMwvira0Nm@P(!LE1EEEuYkCAzji1p{?MOK6wApjD+(sv<2~2Xvslb~p<9N-ywlc5f zlPK7n;NsNpcz(|FWs2QJ1vV?T#$dvtDep&m;Xm!PI+VV1B78|Ox8Gq0&etWhif*6Y z2%pzZ8&p~EywQ)PoUvX^IR-*am3?d&GmAw}#~2Xyb%1&JD2|i3 zX?_a(oGM4Kc&BD@Y z_iP&X#H7_AG)JR+HL@u(;M?gc%?yFK~`kLegAT4J)Cjc8}%+?d%@zD^~Xw#RYVu| zac;5*c143U<_bRy3QiUA<*UL>4EHBz_;&iKMx)~;k)n`TUPe~jbO7Gccjw25kNgo4 zk$v;MEZ!CKJZI4)yL7ee&?jm}L!EWWsO0B~y5A%#T28-UaoFl8WR#=GEWYw#o{%~r zA(}*dc*5t|vFQ;!!nQ#cy?LvJ%J!T*;VI_t#+X`5-uhXb^e%@QnKd>u zTCD@5`YU_3KND<(VUhDjN$8p{$O^;jgw-&HL#F?e@~BC`wzU1=zi#8z%!Wt&irxQWrD5j)!$M}$H5 zOo24kizlFXq6aHnVef>kPa+HCUCP`6|acTVPd0pVf zm$|Wv&>>1__TA6&VRZxeXzpOiXx+A)Pa3VtaC)0yVD!raKfEF$vAQl*7ep-#vWOWD zyI#ThTajjcAe^)f$+w_sg1e3WbG)Qn(YW>VT|>Z^q>ge0B>oYril%}tc9yp;mP%MY zi$c?kPh^<*1=j-MXx*T1o@O0wfghuhMM;Qg)u1~OWPi@k=j6>=r|Mh{}){ z+nyyV3Zi`aB@}aS(7wlu(qxs9B6{U}$TU-IC$(4pV#1fbOGs)wC%1fsMaxhFl2M`QnxNhCh;nYXKmN>9o$ zHYtjy7Mk>zoS^`b>BuMysdorJgUOMu-S|&fM4-kfcAXRaJQrFJ?`>WBJ$4r2uwZ12 zhCBwh3zwZ7AM{gY4LMU~(>^Pb`4J*1LedH_Gcay=tAKK)5!_)bCx8v7ZH!>G~L{_mT-QMaE~*&A>Q$ z%lqBOq@^hVREamgL4tA~Vx-%oY~J{TWWMNPpOvn1bJt1ETz64|V?|j(VP=EIo@L9o zKO=ej8JyksI9JRDOxg?AbN)i(uc(k68F*Lqm--?{1H$ntd`WRcPUa?r&KGcW3ld-P zOUzk_{AV-2TdY7=SOKTX2Y+`YIM$c1w&f#W?PZwM*Im!<_vIuaB@C+?Uo?1JZn^62CtSg5U|*^dV8)50+pyyI|5pdz`4Wb=IZ43C z^bGj3m&sP3%;#xVotXOVZWW;|9Bys|caU0L_Y=$(e-B3MGTs_^iyfYuj4tZ|qZmdY zo>{hNc0^I&xcs}zPJ~dE-!qj23ObC&!we|=z6><0b+HlXWeP1^4^6Ii3pcRhVEk9) zw})X4eBA^ixHOD_1;35g!4yoQ)zi4kpgX{)z4og28nx_m(tdf)cOIqDH%>7X?U@Zwu$5Z*x_U-4LrS5q{;Hy zX%fq3_}4Ix0w2$>!q5WQ17_sc#!-G<47hd4Cxt<$a)=iPeO4}DE5z@Bo7QGp>Ly46 z?MEqIFS$v(J~lXNd=a@x8+8p{0i`>^M0|R4Q^lhMvvTN$AI!suG7kz1AkFzfDnTJP zy@jM$fBCDABL=#d#UN8gYNn0egK-8C!Z$__#pb5@qEUz~XE#n1@}5swqH20S-zmay zEeKt}c?I~tY;Z!ei+yG><{&(Hu9*;v#ab1dlu&|8{8$@jzAJhBvVJ4xJt#+wGr+Fw zA%j1OpDC-hw5JlQ^>SkN-pg(P#a#JSTBUjvw+9CNYLlRY$p#S(3$rclg?)n%hgj8M z1j*r$t%!!1)ze-AK-Ao?xPn!8v)X0&E)kyN@bjD@&|?zA#20DOvbULx8yq)}-Z~3H zoxw!v;XbE*nBt{JqZxR2*egkaqvsx+2YHk}G}zLP=v5m5vB{&6crEL}p&)z=`K6;&F;Q6w@>c}{6e0mGnevkRb>>Qsf8>^xKjCi0id~KGYM+1_I zHLF0!HMszw$7DajyzGh2qo9z7c@W>ZFC{E04U|DiEgT#Y3jVn{wb^K}O#H=m>NnfU zjVt8fSmb^jP|QUb&b#8$&vpqE@y5@z;!+MuOJF0iWEHT-fMJzOdHX#ChH0*5PUVV< zg@4&E5tvBRsegRBV1d|)zeC2Z8dMXRobPYV#5RxtyaCUV4Em}jk%iM&!emVmOCxOY zNs`rK{~=^O7W~@6G$5ns2RxA?js{YGB5*EI2_Z9+%fWW-dUI>4U&>N81tQd8zbSSiU4xoJX3TD%Zz=l;QRS_&;16X&T|jS2B=_XgIE~mMKM2xU&VSQb4r3@ zGo#`7w4j}+q^nnZUX`H1BhqJZfPFv9pX_HmHlJr*hWN9)eAFCB;{1y6st z*5DB#6R5NAmU+lgYTt-0o#CmcxLteqI`Iq;ER zksJamjmN&ITDqPp*qC69gQFyK2B-?q84VL9i85Bzz&#n4+}UBL{x6waFxIPNk^DGz z$=tCGaqr(4zpwlTO~ugm=}t|EI$3AlEO3w+9D@F%nU-Y)8i`g?8Uy~(#H%{_y}`yV z!09t&Zn}Ke&To&q>c*hk`I$}w>M}tZ4xC1aiA^WDYwF5mj+<*yAE7zYi>`XxKhmen z5N|+a|Hg#8G62p*#~i0CPwwgZwh7yxTz82PB(w%~I)#n+XkHW)b8-yX$ifMY_ji5TtnZWDm`<18sdsOXRF#bn zJLS*LKD9-a`;wza^Sy8%-`Ar=XR!D)K-2wh5dDDEZ z^s|qaxV~~B-{n87+}VVqwY?g2JbtfLcbIm_9P&$ofnXJ*Iu$|3OC%WQO>zfhN#S0&yDgtrvjz#@a>#Zb%ThD>S;_Hn+MKuv;8QkA;N`UUO6jF&U)eSU(z#7tgJ-y;Q2rkj$zd^Xj_6S~qJn4&tv@9%VgE8R@0F zK#CAp5Q1_y^!--<8JhgOf6zn+F}n_=!5!gc`~FO8d!VvjnFzw?<=dI*d`x=vi{Mso z-gC0cI&hcb;r5@af3Ia>eZ| zbwQo|Y^jWtmBRcp+Z^03xsq>`5k2SV0<0b-(7^PDE`~1mexw74AtCzWnT#=LE?4C9 z-8*QyP@Dj3$t=&BZi70q!Y%G&3h?>%l8l2}J%qN8EkT@5rxjK_OPE-nIrN4|I48an zgEknrsFf8l#I-Jq4{rBp0ML*MN^GC>nwSK^^l_g6oMc~@&Oct_3Q97Kwj1=-Hrjbi z#%huN+;^+UIae^U{1nmBqvNfU_yyWU+Bh=1a6-^mxH3xS@9@7#u%ZJ(ehSZ;e&uvk zfOOwpasT;3&78;R0^9QVcYP}lM5L#^vQ4eA4X#OtNagdq`Q4?*kG%4pvla(^dv%A-U7lApe;~&>E0c zBDV^Pm<=OTkgwcye7mwVKb8>)z|C~OS4IW&|GCZ;r3oz@F=5Vkm{8An-i(N5jhb+ zJ8~6YsP^XaC?gSNiKH9Ef2$GLVQiCafjGy&95rcSR3Pe{K$lpSs23qYCdBs#_T&xu z3338es!K(5+VYoT+-1FHn`NpVJuOPIT(}WmeBZdhc7;&K3kbIba#K5^)V*ApL)$J2FSrfv~xoEt~wwiNw6bW>vWZBO;{_NRtd$RoQUXth$2)b{oACF z|ENs$yi?NAO~fnb|4Pp1zk~Kezns|WBX-@uidbuS#O zTR2Qo&(10ifPQsT-cMgCEw(8{;9#(3vl&p; zE!E74#P_}DiH~1KA`AVks;*9g&K9qDpYzsPNpV&FTjdJ%lbUT*`9N6W@geeBF_;e* z<=G&n@MLVq);8Sc-(G;!d{4cmd#~z=5EE$xa=QhTeJB8FtdKDw$l+Kc8UbhaxQ#+4 z>p?z)mP;lpS>K4gFhjPRMUr}3gac6z$j=Q`yDlo8MM4zS-lHqtTyj0B&KiTB&GyaRFSq*{a#* zNq+2(k+5e?#Tj8AK5c8+IoV#P7j^Hl)>Wd`G+3&om7vW_Xiv6REz3%bzDBKv=PF0w zQ|K#gkhV3i(GI2`NL#1l=7CwP#FnuX(~^1G{L2yea$0P&FeBc*i{{z>NcEwz*>M~a zXtc8g!uUZonp!)C*e1`0oY)-=uMU66)3)ygH1>moiLCS94C0K$T~O0U1mi-}$sHoM zdIlXw_aJO>__PmF6^aZ5+-n{q!7_{AXI=KE7i#qss`HmiPD;WBTqEbGE2$EDT%RcV z3`!U15Z8!}|CG?5R4|Rz1^CFJfwFletN`%uuN?DSb?uhwTnjU3xGB`BftJQcyXfHQ zl1U(8H*YiM;HIv>iM~dp&XCoe7}Y4v?Dm$Hs!iwX=3S?+Fk7)|52MCk;*J@Y=0`u7 zQ&Sxm3Y;E0*5=8FYkzdu1_z$LeGt&DD)^Dr?ZEUWei zJw8sROQn8K$}wA9!AV%^QW@iY_hfvZbx>Vs8JWg+=yZS%{FfILJ@P4;HK~j@wbM~9Au)}EA*M8HrMr8uFjk+4{IVDXgbQ42IR(_hLGF%y zkN&d*XmQaDAu!~_Y?P5ioDe@nr@(uMkT9O;;Jv|$T zXQ6O;Qp0`vIH}%BDl=o9$3Qd&M-^V3;i)8<6*HT39n)@zI1tc&BM|?mVjSL`p=G4M z>Mf~ylSRTk&}HP1{Gs$_Wd2E;Nh$6!yLGvMjnp#atOhc@V1TeeSsG{kpzDE{T(xtLAJ(l7QoUNFQM#`JR+M z*n@nrKMdQQIGYN^{4T%fm1=?xY*F+pvIVZH>{OWeLTe`jymOLxDbmMO?GtDB_8AeD6A zdH!qaPM|{>eES7X%9&!mmCh;qCV2cvYg|{HeIPdaVeQ{p{JQ{Ff_>YKGL}KZr!P6q z^t9j5xPhS@!g2P)q+iW}}fWk`&1(P96E@Di&>ueFD^N zma%eLyz{O!x3?3|Sti<-#h!}O$z(+I!D4^to0n;W!(E16$GTMFgq}Yero*LTb{A8z zsC5Hgiklj{zy5|dXv50UR4SD{LSWBfDcO~J>7Nj#^I1(q5z-eX-HU3-A}O0-sH@3% zk9Vl8Xm(Oq5*m4I2RfJ-fH}^{l^x6))OjP&OiAu22QAkU-nh=BZ`7SPB(&EBh-4%Z zq6F@zxiy#{CXDPa+V17888vCy&s_OiRFE!o@!8|h$&WLHW!PqqCY>f-}uRCE~ z1tVR*cr43F+Gce`w@(;ht4~bh6e9{4`LX$$1_x@n&8jmUMAwFSUHs{mzX#biI;K7? zK^5lEiNbAot&(sjEVB-ILc=h7JNJYdA&aXdXbZ-UL8vdq!fbQ`x_vFlbjA1CLk!zE zb*ab$WFW<(bFvNfs{WWG^^-)*H;}kP z4mG8>&QOI%LunD=pcZK6{Nc-RN()ot(V%rO=~;6h3t_8dRP$V1qSoYFtRXbIhe2~;va)Hv z%NXdR)*ReIpsOqgW~an7)tQJvm$kjw9THAp)Za2Y8v5pB1WFSNl=+gJBDM2r1OX!y z|6RMLwT?-ul*6W+=U>Ak-LQ$mCS{~(W&=aklsrFl$Ty`pB_Y+NwyUzV&DRw3^cC`2 z!47Uj#Z2tx04X&kW$?DuHkw|`N#ebblVF>n-cT+rd2On^T zsjfYAxqQ6}#A4NYM9Oas&f9knm=;1)u`GZoH+cm(-=`%xi*M66i33xwLycXiIOy6K z1(#q=dz>+T< zmxM=&%(;BI@wcOw!_)y(uMw#xPKEEh$TtcitD98%7yLKVH|Klq9Cs%jJ)VfpBLhu& z`_(Zt>II!`@Kq?Eup5Md4#syAZMhQA%?!@ycQ3$U{quV9`7ECQ5m%x-GeHI)M;mqo z&BWd+|-trnSUh#jjX-H(fFw75w47K{2LOMInPU2!2!oF9p(; zr$|$)eAI_K;^I?}8Znlm9O1q4>(m!JIe=!D*0mz>P4JJWzLPg9gpiJtd4dc*Y87de zq@^fAg^@0%If$Q{-szV&iwzkbgtA3gQKu1WTS*nUuPrN+UK%UmVNGS$3`tqXi)hW4 zVUnt)24#;21T!slsu>~^?{ps{B(Jb6Pblv_Yz+3lZY-;`iFvyn&@h2pD_qiE9*&T6 ztGilFUSUcosT|Sysi?~fNiPJ!W>*68raQ0N%oWqA-StHz`7ykR%<&xxSm&yVko_i* znh;t2`>dFf|G6lriBJY#`zYp+>Oh#%>2-vcJk4=Z3s>3;;X-t0bc3rJE7nI2()c<- zM^7U5f}?28LFk2RWn8$zj+bb{_VTFfb^-hi+yjEI$^H|SnbA;W?UTBt>d(o4AFAiG%v#j)iK{_S%w|Vn4e&{>7!C-wqSl`_`Df4 z_;0fMUxN0Lz<;^@NMt-pxDXsYy55tx2GdEl?;WD?-3iMRNKH!c`AC14ni|=Z30%{= z4Hso>5Boa&W&aCmSzmD97kehR2_XcHv{<0Mj1utIiIH!2N85&`pW!D#7Nn#}{)usA zps`i2Q_#+qPyLnj-Z?Wcm^CvVoXOwyNBsAKfM4XVwyDD;O!U>XBYiq#0&fynBGWsa z$f_zKdT@`~s^MV1@RBPd%O=Y#MgNK<-`vG>+mT2YgWg5Uv0|R?DQ4)c!k$@!HV!Vx z^dQFgw^`6#Zy%jjKh#sT$!ev3OB!9E5zmF4wbJYhz9YgnTcih0B-m1-NdDT2hF|?W zRUjn%_LNFAc=bFfN1ywcyR!60pWo#^WK5hi@x!!)yex$|``+g1pYWK>j=1KTI1|pI z-rgf@3)R!C0W7INaBH{@&1fa$V`{?D$DD-ACyK)(%h6~0w4)n3&-Ln72EmoAH*a_m znb{n>U;im(zgn=`mk^BonCl{EE^H;xznUacvXrNSm;bf+__SAW^c6Rc0FM~0Lx9_t zcP{vVNF5*f{?vDq0_lSUk_}=s^XM*Z?Y5qfbi;yRtbm+H8rvM>udY9HfoY1J3R7<; zgh|JDXNBm$Iru6zX`iHa2{6KTH~H!sWjxFDFP%uz=Zxrxl(GKiyh!<|n>Vh%&)0+A zqbxctOV3wp-}`u7j`SH+;sfF8=FI0L(HQVwaCLa-s=|tS>Gy}&V(7Hv&F8EW9*4ed z7lD^=_hOD#KFyb6?sc0SRGGI4;Woa&IWWIh*efRuI0n*38aG73I* zp)d~CVT1{(`3giDD~HuOAq(Qjg2po)KpMrMUL}n=>^o^Nc`(rSL0K#&5G-rS|^o`F$Dwo%3@#U^Xjq5|o1Vu2|&uzzW6L-;& zoC1HET5kvHqAPqAA%@_U^Rc}N!~g29)+i`+c}F=CvRgw-^dH+cD&>(jwW_~hzHXqI#)pOU!)%y}|2K}E_CrpX!f zYyy}D%MdPpt*km3F^+K#W+U5nE%*%+#vc+TWs5Qs-rz9j5c`;)afwR&2NN|V(&fPg zQWJ+qcTW@jEwuDptn;O8H|68>bTF~2kxAF#i8}SlFk?}%zZ=n;*LFs8sg*dpUq+6j z>?D@3Ed^0G@xnMy&lr&>VjTm7&w6Wef-l8Hiw~bD1fo6DRe)HWgSuZN%5|<%&t)tF zyEUU!SblE}J+IPY86Hgt%Z_W8zy0lus*Cb`4jD3N5(?8LvxXph9TUsIh^7&&v2~rB z(^n+4?mYqY*aM$XNs6L&Qu`E=TvdaqO~Sv_bNh2Kl|XWkoP;2aF;ZdqI4YM8!M07+ z8FspFYZN4KiLrY8Mx5ucm;)ZA7hcqb2G(S43s#Tj&5lL>|kZ|HeJ; zh({~F0>=+tUX`>TOj&2Q{E6ghpZ1YbH`(!$?rp)aGy4e%M%B78WoYhZ*jIW!Um3#V zFQHFZM{6F8J~%js{WhaK&m9>__@pp3@DdMvLUHZ2b2@EZrf|{675sYxxwmv6Gm&%m z1@7`}Jo7>f#7|v{5I;&3w!%NicCkZf`9`#kbiu!>yp+Z$eLPMrvh$-{bixxY$TLRS zCHhfORP~M845NywVT7oJ&-vv&nKWe_3pyNjhP`gzuW45gWK)jJTg3@;nAp;6W)x|F;xS#)aGb)s12(bnLJi)w-_~B{dqBo1XS+$?-da;EEY7SO zc%dk-$9OH{!06(Pe)=P?%-5$h40pJK+0qt=9;#Lh=WJMZOykXIC_m|?0@<`Ov0H2- z#Zq-&b*_duxl@K`w8rtbWTa+ZGw@voc2U5oPH3n&FO}g{O*Y34xq-><8Bx5QInOXN zbSlQZ+sE_dL*ac)YDIjfZrG56(<)v6ZU3a7v8TZ?0Tkju2sd;@a7LeSePo_48z+4AEA^*Q)VWQChd9sEM9xVlq z0iOs4521?%;RsJa;2%@HP1{ZP$qwoM_YW@!v+Mu0BJ%i`%%v!}1R_L$Zp0lNZEMy# zEf)C?hy8i*&;m?3Q8s5+eGB&@=3A*y9=OXr;xci=FMPN^i8&QLO}NzZH3Ychey(lG zo{u;E1Md$Mo;FxXP!Firzsj$IIbG1hq_qnwu513@c`A`p27A?6+{j}W?WV3k$tmd}5<;#VkvTjw=NJudYdO_y`sfF= z#30U!6pn!dQSp8|LVttb^%?%d#4ODxA?UQ4E2woZ?cv=fh zBPv;pSOl(-4VMc^ZgkkUpjtjL4%DS}LNCvcWDg6CzZi7{E&3SFtD{b^2$t$C)Nkp) zP}EIht&Oh4DVLu$B)aikD%MGV>W6-i>8+}`WDt(5aeEo(0S?!@>+O0!F_5sSysTPc z(8S&u3d{_ev>Q={a@l52D`qk3pdP9$qpr@YoF4smUBaYAchB6}9o9KpcjoO7@D$~t z%sQ?%92dCHOb}zr!EUU8@)(6rb!M+3rtz=e)3NtjGGA|>)~|6+_|k)atVj4e*{bL% ztNL}v=$~ms(89u(BFu7ZL>03D{;)Br)u_|p_ISd3z$nnJk6k{e-Xad5HXC<@L{PlE zv}ahORjxuxj}J_a<||5!s){eR1yU=hd&z~7IEM^=ft2LBG2T#UmrBdPO53&#=zge5-rO`& zGF#QR(j1Kji_JoRHR6XQ_@)9OdeJ)GqhhFsX2f_0Gi%?ED$e!b5RvVbf!v9*N?>&Yf=JMWayck zHrox7A)+ec(EDObNg&=aE*cJHiYay7tRd9=5tT=mxJ^vm_Xz$SAq>Eb`?tG2wff!< z8>L6ng_JLuz9Bh5jzuOWa0R%!^$qAaPxd6N@rZbqLL%pJesQMjLp*|6P4~9HJi}a@G9mFed+$bA)UC=N&}bxKyusGjt1Ilq zYi|`vIDLlg4W^bFk}d`@iZA2L7#Pzv;OSti7=8)G&2Nsrnp%gt`3|%v)UZeFJG*0f zHR^l{DYGFqx(og9Tz5$jADIvzwSZq2xvnAUkkf(dJ0F=JR|1OnAj2o|(BcOqn`Vdu zs6&_DA;sK2;?Ue&tM1NJ*f;s|LlFOMWe@3)MVbNKy|_0C%O3D6qJlY76Iu4Q&S-Ye z9a-Vm);cuI-wPU-6ep*Cg#mzo=o}3bR1~&hxnGrhwX&99KtM=En+L=uRC*flRnH(a zxk)0gH_u<@;B8mdGl?nqZPVdGfn5lPU2zUgXZX8T*toVs;a}c2pWvQ_duv;$6NA7l z8Ue{I2}Z93R?HruUOFP2Wzux&&q&^JkWx?}d|IQ9Yo#^c&CB4Bf_kYW9BOvd#=Zw>l&--kD4VxTDlc zzPNo@+_li?R?XarD0Ki@Pit=Cud<0G@#f4BK|a6^0@2TncL?^=Gf1JO6@NlSR_9Wy zXEc3~X=GSIvA8$lLZvP;N|4~Yy2zFyU79s5O>-s5*n7hU#~TiH#q3wNkB-79;e{*M z$L|+q^#Q~VMzF5dk0?XU$-|Y$CYr^6K}Ye~*L)R(4?AWjGXEzNLZY!2$np4whH4r% z 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 R?#<8uKVU*alxo<9{10!Ly@mh) literal 0 HcmV?d00001 diff --git a/openfasoc/MLoptimization/image2.png b/openfasoc/MLoptimization/image2.png new file mode 100644 index 0000000000000000000000000000000000000000..24dca66ae25c73078cdf964e676a756cf8b5fc8c GIT binary patch literal 50214 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 self.num_os-1: + self.obj_idx = 0 + idx = self.obj_idx + self.obj_idx += 1 + else: + idx = random.randint(0,self.num_os-1) + self.specs_ideal = [] + for spec in list(self.specs.values()): + self.specs_ideal.append(spec[idx]) + self.specs_ideal = np.array(self.specs_ideal) + else: + if self.multi_goal == False: + self.specs_ideal = self.g_star + else: + idx = random.randint(0,self.num_os-1) + self.specs_ideal = [] + for spec in list(self.specs.values()): + self.specs_ideal.append(spec[idx]) + self.specs_ideal = np.array(self.specs_ideal) + print("num total:"+str(self.num_os) + "new reset!!!") + + #applicable only when you have multiple goals, normalizes everything to some global_g + self.specs_ideal_norm = self.lookup(self.specs_ideal, self.global_g) + + #initialize current parameters + #self.cur_params_idx = np.array([3.0, 0.3, 2.0, 6.0, 2.0, 4.0, 3.0,1.0,2.0,3.0,4.0,0.3,6.0,3.0, 12.0, 12.0, 2.0, 1.0]) + # self.cur_params_idx = np.array([10, 4, 10, 10, 10, 10, 0, 0, 0, 0]) + self.cur_params_idx = np.array([10, 10, 4, 5, 0, 5, 7, 0, 1, 1]) + self.cur_specs = self.update(self.cur_params_idx) + cur_spec_norm = self.lookup(self.cur_specs, self.global_g) + reward = self.reward(self.cur_specs, self.specs_ideal) + self.epi_steps = 0 + #observation is a combination of current specs distance from ideal, ideal spec, and current param vals + self.ob = np.concatenate([cur_spec_norm, self.specs_ideal_norm, self.cur_params_idx]) + return self.ob, {} + + def step(self, action): + """ + :param action: is vector with elements between 0 and 1 mapped to the index of the corresponding parameter + :return: + """ + + #Take action that RL agent returns to change current params + prevreward = self.reward(self.cur_specs, self.specs_ideal) + action = list(np.reshape(np.array(action),(np.array(action).shape[0],))) + self.cur_params_idx = self.cur_params_idx + np.array([self.action_meaning[a] for a in action]) + +# self.cur_params_idx = self.cur_params_idx + np.array(self.action_arr[int(action)]) + self.cur_params_idx = np.clip(self.cur_params_idx, [0]*len(self.params_id), [(len(param_vec)-1) for param_vec in self.params]) + #Get current specs and normalize + self.cur_specs = self.update(self.cur_params_idx) + cur_spec_norm = self.lookup(self.cur_specs, self.global_g) + reward = self.reward(self.cur_specs, self.specs_ideal) + terminated = False + #f = open("newnew_5.txt", "a") + f = open("newnewnew_eval_3.txt", "a") + #incentivize reaching goal state + if(prevreward >= 2.0 and reward < 2.0): + terminated = True + if (reward >= 2.0): + if (reward < prevreward): + terminated = True + f.write('-'*10 +'\n') + f.write('params = '+str(self.cur_params_idx)+'\n') + f.write('specs:'+str(self.cur_specs)+'\n') + f.write('ideal specs:'+str(self.specs_ideal)+'\n') + f.write('re:'+str(reward)+'\n') + f.write('-'*10+'\n') + print('-'*10) + print('params = ', self.cur_params_idx) + print('specs:', self.cur_specs) + print('ideal specs:', self.specs_ideal) + print('re:', reward) + print('-'*10) + + self.ob = np.concatenate([cur_spec_norm, self.specs_ideal_norm, self.cur_params_idx]) + self.env_steps = self.env_steps + 1 + self.epi_steps = self.epi_steps + 1 + + truncated = self.epi_steps >= self.horizon + f.write('params: ' + str(self.cur_params_idx) +'\n') + f.write('cur ob:' + str(self.cur_specs) +'\n') + f.write('ideal spec:' + str(self.specs_ideal)+'\n') + f.write('cur reward:' + str(reward)+'\n') + f.write('epi step:' + str(self.epi_steps)+'\n') + f.write('env steps:' + str(self.env_steps)+'\n') + + print('cur ob:' + str(self.cur_specs)) + print('ideal spec:' + str(self.specs_ideal)) + print('cur reward:' + str(reward)) + print('epi step:' + str(self.epi_steps)) + print('env steps:' + str(self.env_steps)) + return self.ob, reward, terminated, truncated, {} + + def lookup(self, spec, goal_spec): + goal_spec = [float(e) for e in goal_spec] + norm_spec = (spec-goal_spec)/(goal_spec+spec) + for i in range(len(spec)): + if spec[i] <= -1: + norm_spec[i] = -1 + #if(norm_spec[i] > 0): + #norm_spec[i] = 0 + return norm_spec + + def reward(self, spec, goal_spec): + rel_specs = self.lookup(spec, goal_spec) + pos_val = [] + reward = 0.0 + for i,rel_spec in enumerate(rel_specs): + #if(self.specs_id[i] == 'ibias_max'): + #rel_spec = rel_spec*-1.0#/10.0 + if rel_spec < 0: + reward += rel_spec + pos_val.append(0) + else: + if(self.specs_id[i] == 'FOM'): + reward += rel_spec + pos_val.append(1) + + trueorfalse = True + for i,rel_spec in enumerate(rel_specs): + if rel_spec < -0.02: + trueorfalse = False + + if trueorfalse: + return 2.0+reward + else: + return reward + + def update(self, params_idx): + #impose constraint tail1 = in + #params_idx[0] = params_idx[3] + params = np.array([self.params[i][params_idx[i]] for i in range(len(self.params_id))]) + #param_val = np.array[OrderedDict(list(zip(self.params_id,params)))] + + #run param vals and simulate + #cur_specs = OrderedDict(sorted(self.sim_env.create_design_and_simulate(param_val[0])[1].items(), key=lambda k:k[0])) + inputparam = np.array([0.0, 0.0, 0.0, 6.0, 2.0, 4.0, 0.0, 1.0, 0.0, 3.0, 0.0, 0.0, 0.0, 3.0, 12.0, 12.0, 0.0, 0.0]) + inputparam[0:3] = params[0:3] + inputparam[6] = params[3] + inputparam[8] = params[4] + inputparam[10:13] = params[5:8] + inputparam[16:18] = params[8:10] + result = single_build_and_simulation(inputparam) + specs = np.array([0.0 , 0.0]) + specs[0] = result[0] + specs[1] = result[0]/result[6] + cur_specs = specs + + return cur_specs +#env end + +def main(): + env_config = {"generalize":True, "valid":True} + env = Envir(env_config) + env.reset() + env.step([2,2,2,2,2,2,2,2,2,2]) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/openfasoc/MLoptimization/sample_spec.yaml b/openfasoc/MLoptimization/sample_spec.yaml new file mode 100644 index 000000000..1a47d10cc --- /dev/null +++ b/openfasoc/MLoptimization/sample_spec.yaml @@ -0,0 +1,100 @@ +{'gain_min': [2486222284.8408804, + 2595551369.5626364, + 2309495771.9680934, + 1145774876.7498627, + 2079516450.1469443, + 2391451213.479562, + 2676893053.18551, + 2675006145.1962533, + 2015194984.3624444, + 2278788513.705864, + 2205636091.187187, + 1506492988.8309956, + 1112077088.809704, + 2707199150.1559224, + 2903609807.9496045, + 2062437443.5261226, + 1403056317.139003, + 2835219051.771353, + 2925021136.524023, + 1886275826.821474, + 2157488694.831938, + 2641455527.072985, + 2402196770.75093, + 1199232764.3421414, + 2976991031.6658754, + 1646354535.6840703, + 2704204845.6734324, + 2716618295.460021, + 2413570061.996591, + 2121921633.2690156, + 2303933548.53714, + 2028867678.9123795, + 2719297024.9283357, + 2173990079.053155, + 1445459741.8651175, + 2472330865.96015, + 1001989471.0531384, + 2759910539.938794, + 1536809631.1164005, + 1135029016.3512793, + 1588011527.4173698, + 2049869876.6713438, + 2427789734.566804, + 1047544300.167047, + 1914004908.9098907, + 1393488128.8226607, + 2559241796.7458553, + 1565752673.493743, + 1295775028.0897965, + 1918300980.2757072], + 'FOM': [500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0, + 500000000000.0]} \ No newline at end of file From dd762b0e99e21cc89cd8b956e6e4381be34de027 Mon Sep 17 00:00:00 2001 From: wentian Date: Thu, 7 Sep 2023 15:17:02 +0000 Subject: [PATCH 02/41] update --- openfasoc/MLoptimization/README | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/openfasoc/MLoptimization/README b/openfasoc/MLoptimization/README index 7344ccddf..653b45a72 100644 --- a/openfasoc/MLoptimization/README +++ b/openfasoc/MLoptimization/README @@ -41,4 +41,7 @@ The evaluation result will be saved to the ../generators/gdsfactory-gen/. ## Results Please note that results vary greatly based on random seed and spec generation (both for testing and validation). An example spec file is provided that was used to generate the results below. - \ No newline at end of file +

+ + +

\ No newline at end of file From 99f057f2129eef612c0b29fbbe69fc7aa19ba2a7 Mon Sep 17 00:00:00 2001 From: Wen-Tian-Pineapple <74345454+Wen-Tian-Pineapple@users.noreply.github.com> Date: Mon, 11 Sep 2023 13:16:35 -0400 Subject: [PATCH 03/41] Update README --- openfasoc/MLoptimization/README | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/openfasoc/MLoptimization/README b/openfasoc/MLoptimization/README index 653b45a72..6f5639a79 100644 --- a/openfasoc/MLoptimization/README +++ b/openfasoc/MLoptimization/README @@ -41,7 +41,4 @@ The evaluation result will be saved to the ../generators/gdsfactory-gen/. ## Results Please note that results vary greatly based on random seed and spec generation (both for testing and validation). An example spec file is provided that was used to generate the results below. -

- - -

\ No newline at end of file +![alt-text-1](image1.png) ![alt-text-2](image2.png) From 834fc0fe8a53cce6f19cd3ac456d2718a6557747 Mon Sep 17 00:00:00 2001 From: Wen-Tian-Pineapple <74345454+Wen-Tian-Pineapple@users.noreply.github.com> Date: Mon, 11 Sep 2023 13:17:21 -0400 Subject: [PATCH 04/41] Update README --- openfasoc/MLoptimization/README | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openfasoc/MLoptimization/README b/openfasoc/MLoptimization/README index 6f5639a79..b14f8a55b 100644 --- a/openfasoc/MLoptimization/README +++ b/openfasoc/MLoptimization/README @@ -41,4 +41,4 @@ The evaluation result will be saved to the ../generators/gdsfactory-gen/. ## Results Please note that results vary greatly based on random seed and spec generation (both for testing and validation). An example spec file is provided that was used to generate the results below. -![alt-text-1](image1.png) ![alt-text-2](image2.png) + From ecd26bad0c4bbeeea1e20d4f116ddbb1fbbb734b Mon Sep 17 00:00:00 2001 From: Wen-Tian-Pineapple <74345454+Wen-Tian-Pineapple@users.noreply.github.com> Date: Mon, 11 Sep 2023 13:20:02 -0400 Subject: [PATCH 05/41] Update README --- openfasoc/MLoptimization/README | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openfasoc/MLoptimization/README b/openfasoc/MLoptimization/README index b14f8a55b..bfdedbcab 100644 --- a/openfasoc/MLoptimization/README +++ b/openfasoc/MLoptimization/README @@ -41,4 +41,4 @@ The evaluation result will be saved to the ../generators/gdsfactory-gen/. ## Results Please note that results vary greatly based on random seed and spec generation (both for testing and validation). An example spec file is provided that was used to generate the results below. - + From 77b57cec517e1ce2e04b6d769d47593d7ed271d5 Mon Sep 17 00:00:00 2001 From: Wen-Tian-Pineapple <74345454+Wen-Tian-Pineapple@users.noreply.github.com> Date: Mon, 11 Sep 2023 13:20:25 -0400 Subject: [PATCH 06/41] Update README --- openfasoc/MLoptimization/README | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openfasoc/MLoptimization/README b/openfasoc/MLoptimization/README index bfdedbcab..077f72b86 100644 --- a/openfasoc/MLoptimization/README +++ b/openfasoc/MLoptimization/README @@ -41,4 +41,4 @@ The evaluation result will be saved to the ../generators/gdsfactory-gen/. ## Results Please note that results vary greatly based on random seed and spec generation (both for testing and validation). An example spec file is provided that was used to generate the results below. - + From 209b2b50a71c7e8766c1164aadd698fef692b2b8 Mon Sep 17 00:00:00 2001 From: Wen-Tian-Pineapple <74345454+Wen-Tian-Pineapple@users.noreply.github.com> Date: Mon, 11 Sep 2023 13:21:08 -0400 Subject: [PATCH 07/41] Update README --- openfasoc/MLoptimization/README | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openfasoc/MLoptimization/README b/openfasoc/MLoptimization/README index 077f72b86..cfb2a8b63 100644 --- a/openfasoc/MLoptimization/README +++ b/openfasoc/MLoptimization/README @@ -41,4 +41,5 @@ The evaluation result will be saved to the ../generators/gdsfactory-gen/. ## Results Please note that results vary greatly based on random seed and spec generation (both for testing and validation). An example spec file is provided that was used to generate the results below. - + + From 468cd49c98437de7e2b505cec0053313cdbdb541 Mon Sep 17 00:00:00 2001 From: Wen-Tian-Pineapple <74345454+Wen-Tian-Pineapple@users.noreply.github.com> Date: Mon, 11 Sep 2023 13:21:50 -0400 Subject: [PATCH 08/41] Update README --- openfasoc/MLoptimization/README | 1 + 1 file changed, 1 insertion(+) diff --git a/openfasoc/MLoptimization/README b/openfasoc/MLoptimization/README index cfb2a8b63..e96426d5a 100644 --- a/openfasoc/MLoptimization/README +++ b/openfasoc/MLoptimization/README @@ -43,3 +43,4 @@ Please note that results vary greatly based on random seed and spec generation ( + From 8b3777f5073bd3535103c90a72255914aa45bf76 Mon Sep 17 00:00:00 2001 From: Wen-Tian-Pineapple <74345454+Wen-Tian-Pineapple@users.noreply.github.com> Date: Mon, 11 Sep 2023 13:23:07 -0400 Subject: [PATCH 09/41] Update and rename README to README.md --- openfasoc/MLoptimization/{README => README.md} | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) rename openfasoc/MLoptimization/{README => README.md} (94%) diff --git a/openfasoc/MLoptimization/README b/openfasoc/MLoptimization/README.md similarity index 94% rename from openfasoc/MLoptimization/README rename to openfasoc/MLoptimization/README.md index e96426d5a..bfdedbcab 100644 --- a/openfasoc/MLoptimization/README +++ b/openfasoc/MLoptimization/README.md @@ -41,6 +41,4 @@ The evaluation result will be saved to the ../generators/gdsfactory-gen/. ## Results Please note that results vary greatly based on random seed and spec generation (both for testing and validation). An example spec file is provided that was used to generate the results below. - - - + From 7908dc84c73df181481b95c867cca9f9d3ab1bab Mon Sep 17 00:00:00 2001 From: Wen-Tian-Pineapple <74345454+Wen-Tian-Pineapple@users.noreply.github.com> Date: Mon, 11 Sep 2023 13:26:26 -0400 Subject: [PATCH 10/41] Update README.md --- openfasoc/MLoptimization/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/openfasoc/MLoptimization/README.md b/openfasoc/MLoptimization/README.md index bfdedbcab..7e661dbc3 100644 --- a/openfasoc/MLoptimization/README.md +++ b/openfasoc/MLoptimization/README.md @@ -41,4 +41,6 @@ The evaluation result will be saved to the ../generators/gdsfactory-gen/. ## Results Please note that results vary greatly based on random seed and spec generation (both for testing and validation). An example spec file is provided that was used to generate the results below. - +

+ +

From 5c893e85eb456635b3130c83e7ea5f2343274378 Mon Sep 17 00:00:00 2001 From: Wen-Tian-Pineapple <74345454+Wen-Tian-Pineapple@users.noreply.github.com> Date: Thu, 9 Nov 2023 17:37:28 -0500 Subject: [PATCH 11/41] Update run_training.py --- openfasoc/MLoptimization/run_training.py | 51 +++++++++++++----------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/openfasoc/MLoptimization/run_training.py b/openfasoc/MLoptimization/run_training.py index ced833866..087fad142 100644 --- a/openfasoc/MLoptimization/run_training.py +++ b/openfasoc/MLoptimization/run_training.py @@ -5,7 +5,7 @@ from gymnasium.wrappers import EnvCompatibility from ray.rllib.env.wrappers.multi_agent_env_compatibility import MultiAgentEnvCompatibility from sky130_nist_tapeout import single_build_and_simulation -sky130_nist_tapeout.path.append('../generators/gdsfactory-gen/') +sky130_nist_tapeout.path.append('../generators/gdsfactory-gen/tapeout_and_RL') import numpy as np import random import psutil @@ -53,7 +53,7 @@ def __init__(self, env_config): # design specs if self.generalize == True: if self.valid == False: - specs = yaml.safe_load(Path('new_spec_1.yaml').read_text()) + specs = yaml.safe_load(Path('train1.yaml').read_text()) else: specs = inputspec print(inputspec) @@ -74,16 +74,20 @@ def __init__(self, env_config): # param array params = { - "diffpair_params0" : [3, 9.6, 0.6], - "diffpair_params1" : [0.3, 2.17, 0.17], - "diffpair_params2" : [2, 7, 1], - "houtput_bias0" : [3, 9.6, 0.6], - "houtput_bias2" : [2, 7, 1], - "pamp_hparams0" : [4, 10.6, 0.6], - "pamp_hparams1" : [0.3, 2.1, 0.1], - "pamp_hparams2" : [6, 15, 1], - "mim_cap_rows" : [2, 4, 1], - "rmult" : [1, 3, 1], + "diffpair_params0" : [1, 8, 1], + "diffpair_params1" : [0.5, 2.1, 0.1], + "diffpair_params2" : [1, 5, 1], + "Diffpair_bias0" : [1, 8, 1], + "Diffpair_bias1" : [1, 4.5, 0.5], + "Diffpair_bias2" : [3, 13, 1], + "pamp_hparams0" : [1, 8, 1], + "pamp_hparams1" : [0.5, 2.1, 0.1], + "pamp_hparams2" : [3, 13, 1], + "bias0" : [1, 8, 1], + "bias1" : [0.5, 2.1, 0.1], + "bias2" : [3, 13, 1], + "bias3" : [2, 4, 1], + "mim_cap_rows" : [1, 4, 1], } self.params = [] self.params_id = list(params.keys()) @@ -150,7 +154,8 @@ def reset(self, *, seed=None, options=None): #initialize current parameters #self.cur_params_idx = np.array([3.0, 0.3, 2.0, 6.0, 2.0, 4.0, 3.0,1.0,2.0,3.0,4.0,0.3,6.0,3.0, 12.0, 12.0, 2.0, 1.0]) # self.cur_params_idx = np.array([10, 4, 10, 10, 10, 10, 0, 0, 0, 0]) - self.cur_params_idx = np.array([10, 10, 4, 5, 0, 5, 7, 0, 1, 1]) + self.cur_params_idx = np.array([1, 5, 3, 5, 2, 1, 6, 0, 5, 5, 1, 1, 1, 0]) + # param array self.cur_specs = self.update(self.cur_params_idx) cur_spec_norm = self.lookup(self.cur_specs, self.global_g) reward = self.reward(self.cur_specs, self.specs_ideal) @@ -178,7 +183,7 @@ def step(self, action): reward = self.reward(self.cur_specs, self.specs_ideal) terminated = False #f = open("newnew_5.txt", "a") - f = open("newnewnew_eval_3.txt", "a") + f = open("record2.txt", "a") #incentivize reaching goal state if(prevreward >= 2.0 and reward < 2.0): terminated = True @@ -260,16 +265,16 @@ def update(self, params_idx): #run param vals and simulate #cur_specs = OrderedDict(sorted(self.sim_env.create_design_and_simulate(param_val[0])[1].items(), key=lambda k:k[0])) - inputparam = np.array([0.0, 0.0, 0.0, 6.0, 2.0, 4.0, 0.0, 1.0, 0.0, 3.0, 0.0, 0.0, 0.0, 3.0, 12.0, 12.0, 0.0, 0.0]) + inputparam = np.array([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.0, 0.0, 0.0, 0.0, 0.0, 5.0, 1.0, 16.0, 6.0, 2.0, 4.0, 12.0, 12.0, 0.0, 2.0]) inputparam[0:3] = params[0:3] - inputparam[6] = params[3] - inputparam[8] = params[4] - inputparam[10:13] = params[5:8] - inputparam[16:18] = params[8:10] - result = single_build_and_simulation(inputparam) + inputparam[3:6] = params[3:6] + inputparam[6:9] = params[6:9] + inputparam[10:14] = params[9:13] + inputparam[22] = params[13] + result = single_build_and_simulation(inputparam,-269) specs = np.array([0.0 , 0.0]) - specs[0] = result[0] - specs[1] = result[0]/result[6] + specs[0] = result["ugb"] + specs[1] = result["ugb"]/result["power"] cur_specs = specs return cur_specs @@ -283,4 +288,4 @@ def main(): if __name__ == "__main__": - main() \ No newline at end of file + main() From 5c76a6edf11b8b1420d499452884713624828f52 Mon Sep 17 00:00:00 2001 From: Wen-Tian-Pineapple <74345454+Wen-Tian-Pineapple@users.noreply.github.com> Date: Thu, 9 Nov 2023 17:38:27 -0500 Subject: [PATCH 12/41] Update model.py --- openfasoc/MLoptimization/model.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/openfasoc/MLoptimization/model.py b/openfasoc/MLoptimization/model.py index 30defd612..f32e44c7c 100644 --- a/openfasoc/MLoptimization/model.py +++ b/openfasoc/MLoptimization/model.py @@ -5,7 +5,6 @@ from ray.rllib.algorithms.ppo import PPO from run_training import Envir from sky130_nist_tapeout import single_build_and_simulation -sky130_nist_tapeout.path.append('../generators/gdsfactory-gen/') import argparse # @@ -34,14 +33,9 @@ #If checkpoint fails for any reason, training can be restored trials = tune.run( "PPO", #You can replace this string with ppo.PPOTrainer if you want / have customized it - name="brandnewBound_1", # The name can be different. - stop={"episode_reward_mean": 12, "training_iteration": 15}, + name="new_train_with_new_params_3", # The name can be different. + stop={"episode_reward_mean": 12, "training_iteration": 12}, checkpoint_freq=1, config=config_train, - #restore="/home/wentian/ray_results/brandnewBound/PPO_Envir_cc8be_00000_0_2023-08-16_01-11-16/checkpoint_000002", - #restore="/home/wentian/ray_results/brandnewBound/PPO_Envir_f6236_00000_0_2023-08-16_04-40-01/checkpoint_000003", - #restore="/home/wentian/ray_results/brandnewBound/PPO_Envir_4615a_00000_0_2023-08-16_06-58-15/checkpoint_000006" - #restore="/home/wentian/ray_results/brandnewBound/PPO_Envir_d8b02_00000_0_2023-08-17_02-07-41/checkpoint_000012", - restore="/home/wentian/ray_results/brandnewBound_1/PPO_Envir_d6a0f_00000_0_2023-08-18_05-19-43/checkpoint_000012", ) -# \ No newline at end of file +# From aa60b82738c501f53d47c1e438e97ac5d3c936c5 Mon Sep 17 00:00:00 2001 From: Wen-Tian-Pineapple <74345454+Wen-Tian-Pineapple@users.noreply.github.com> Date: Thu, 9 Nov 2023 17:39:20 -0500 Subject: [PATCH 13/41] Update eval.py --- openfasoc/MLoptimization/eval.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openfasoc/MLoptimization/eval.py b/openfasoc/MLoptimization/eval.py index cb617e57a..9aed82404 100644 --- a/openfasoc/MLoptimization/eval.py +++ b/openfasoc/MLoptimization/eval.py @@ -5,7 +5,7 @@ import ray.tune as tune from ray.rllib.algorithms.ppo import PPO from run_training import Envir -from ../generators/gdsfactory-gen/sky130_nist_tapeout import single_build_and_simulation +from ../generators/gdsfactory-gen/tapeout_and_RL/sky130_nist_tapeout import single_build_and_simulation import pickle import yaml from pathlib import Path @@ -115,4 +115,4 @@ def unlookup(norm_spec, goal_spec): f.write("Specs reached: " + str(reached_spec) + "/" + str(len(obs_nreached))) print("Specs reached: " + str(reached_spec) + "/" + str(len(obs_nreached))) -print("Num specs reached: " + str(reached_spec) + "/" + str(1)) \ No newline at end of file +print("Num specs reached: " + str(reached_spec) + "/" + str(1)) From b9b243fe7b0986697e608e85a86ce692e0b20cb4 Mon Sep 17 00:00:00 2001 From: Wen-Tian-Pineapple <74345454+Wen-Tian-Pineapple@users.noreply.github.com> Date: Thu, 9 Nov 2023 17:42:28 -0500 Subject: [PATCH 14/41] Update eval.py --- openfasoc/MLoptimization/eval.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openfasoc/MLoptimization/eval.py b/openfasoc/MLoptimization/eval.py index 9aed82404..74e9036c7 100644 --- a/openfasoc/MLoptimization/eval.py +++ b/openfasoc/MLoptimization/eval.py @@ -5,7 +5,8 @@ import ray.tune as tune from ray.rllib.algorithms.ppo import PPO from run_training import Envir -from ../generators/gdsfactory-gen/tapeout_and_RL/sky130_nist_tapeout import single_build_and_simulation +from sky130_nist_tapeout import single_build_and_simulation +sky130_nist_tapeout.path.append('../generators/gdsfactory-gen/tapeout_and_RL') import pickle import yaml from pathlib import Path From 7143c30c67c2cbf530cc439e1f515271bffc4fb2 Mon Sep 17 00:00:00 2001 From: Wen-Tian-Pineapple <74345454+Wen-Tian-Pineapple@users.noreply.github.com> Date: Thu, 9 Nov 2023 17:47:29 -0500 Subject: [PATCH 15/41] Update model.py --- openfasoc/MLoptimization/model.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/openfasoc/MLoptimization/model.py b/openfasoc/MLoptimization/model.py index f32e44c7c..a0cd902ea 100644 --- a/openfasoc/MLoptimization/model.py +++ b/openfasoc/MLoptimization/model.py @@ -16,14 +16,8 @@ #configures training of the agent with associated hyperparameters config_train = { - #"sample_batch_size": 200, "env": Envir, "train_batch_size": 1000, - #"sgd_minibatch_size": 1200, - #"num_sgd_iter": 3, - #"lr":1e-3, - #"vf_loss_coeff": 0.5, - #"rollout_fragment_length": 63, "model":{"fcnet_hiddens": [64, 64]}, "num_workers": 32, "env_config":{"generalize":True, "run_valid":False, "horizon":20}, @@ -38,4 +32,4 @@ checkpoint_freq=1, config=config_train, ) -# + From d8e0e76c6220719495fa807403ca1c495146f041 Mon Sep 17 00:00:00 2001 From: Wen-Tian-Pineapple <74345454+Wen-Tian-Pineapple@users.noreply.github.com> Date: Thu, 9 Nov 2023 17:49:10 -0500 Subject: [PATCH 16/41] Update run_training.py --- openfasoc/MLoptimization/run_training.py | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/openfasoc/MLoptimization/run_training.py b/openfasoc/MLoptimization/run_training.py index 087fad142..834452ebf 100644 --- a/openfasoc/MLoptimization/run_training.py +++ b/openfasoc/MLoptimization/run_training.py @@ -67,11 +67,6 @@ def __init__(self, env_config): self.fixed_goal_idx = -1 self.num_os = len(list(self.specs.values())[0]) - # [10, 0, 0, 0, 0, 0, 0, 0, 10, 0, 5, 0, 10, 0, 0, 0, 0, 10] - #[10, 4, 10, 0, 0, 0, 10, 0, 10, 0, 10, 0, 0, 0, 0, 0, 0, 0] - #[9. 2. 6. 6. 2. 4. 9. 1. 2. 3. 10. 0.3 6. 3. 12. 12. 2. 1.] - #[9. 1. 6. 6. 2. 4. 9. 1. 6. 3. 10. 0.3 6. 3. 12. 12. 2. 1. ] - # param array params = { "diffpair_params0" : [1, 8, 1], @@ -96,11 +91,6 @@ def __init__(self, env_config): param_vec = np.arange(value[0], value[1], value[2]) self.params.append(param_vec) - #params = data - #self.params = data - #self.params_id = ['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18'] - - #initialize sim environment self.action_meaning = [-1,0,1] self.action_space = spaces.Tuple([spaces.Discrete(len(self.action_meaning))]*len(self.params_id)) @@ -152,8 +142,6 @@ def reset(self, *, seed=None, options=None): self.specs_ideal_norm = self.lookup(self.specs_ideal, self.global_g) #initialize current parameters - #self.cur_params_idx = np.array([3.0, 0.3, 2.0, 6.0, 2.0, 4.0, 3.0,1.0,2.0,3.0,4.0,0.3,6.0,3.0, 12.0, 12.0, 2.0, 1.0]) - # self.cur_params_idx = np.array([10, 4, 10, 10, 10, 10, 0, 0, 0, 0]) self.cur_params_idx = np.array([1, 5, 3, 5, 2, 1, 6, 0, 5, 5, 1, 1, 1, 0]) # param array self.cur_specs = self.update(self.cur_params_idx) @@ -167,9 +155,8 @@ def reset(self, *, seed=None, options=None): def step(self, action): """ :param action: is vector with elements between 0 and 1 mapped to the index of the corresponding parameter - :return: + :return:cur observations & reward """ - #Take action that RL agent returns to change current params prevreward = self.reward(self.cur_specs, self.specs_ideal) action = list(np.reshape(np.array(action),(np.array(action).shape[0],))) From 1de65400325da23382ce9d23ac7852b0651736c3 Mon Sep 17 00:00:00 2001 From: Wen-Tian-Pineapple <74345454+Wen-Tian-Pineapple@users.noreply.github.com> Date: Thu, 9 Nov 2023 17:50:53 -0500 Subject: [PATCH 17/41] Delete openfasoc/MLoptimization/image1.png --- openfasoc/MLoptimization/image1.png | Bin 75531 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 openfasoc/MLoptimization/image1.png diff --git a/openfasoc/MLoptimization/image1.png b/openfasoc/MLoptimization/image1.png deleted file mode 100644 index b94630ef7ad88bd814ccd718743b42f3701db562..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75531 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 z 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 R?#<8uKVU*alxo<9{10!Ly@mh) From c8dbf3a42d8cc0a1970a1ede9ef1198be9503b24 Mon Sep 17 00:00:00 2001 From: Wen-Tian-Pineapple <74345454+Wen-Tian-Pineapple@users.noreply.github.com> Date: Thu, 9 Nov 2023 17:51:06 -0500 Subject: [PATCH 18/41] Delete openfasoc/MLoptimization/image2.png --- openfasoc/MLoptimization/image2.png | Bin 50214 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 openfasoc/MLoptimization/image2.png diff --git a/openfasoc/MLoptimization/image2.png b/openfasoc/MLoptimization/image2.png deleted file mode 100644 index 24dca66ae25c73078cdf964e676a756cf8b5fc8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50214 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 Date: Thu, 9 Nov 2023 17:51:41 -0500 Subject: [PATCH 19/41] Update run_training.py --- openfasoc/MLoptimization/run_training.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/openfasoc/MLoptimization/run_training.py b/openfasoc/MLoptimization/run_training.py index 834452ebf..1201da2fb 100644 --- a/openfasoc/MLoptimization/run_training.py +++ b/openfasoc/MLoptimization/run_training.py @@ -46,20 +46,13 @@ def __init__(self, env_config): #self.result = result self.epi_steps = 0 - specs = {} - print("num valid isssssssssssssssssssssss:" + str(self.horizon)) - if(self.valid): - print("hahahahahahaahahahahahahahahahaahah") # design specs if self.generalize == True: if self.valid == False: specs = yaml.safe_load(Path('train1.yaml').read_text()) else: specs = inputspec - print(inputspec) - print("haaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") - - + self.specs = specs self.specs_ideal = [] From 0beab7bdb70016a703375618bf624dea27ad5c69 Mon Sep 17 00:00:00 2001 From: Wen-Tian-Pineapple <74345454+Wen-Tian-Pineapple@users.noreply.github.com> Date: Thu, 9 Nov 2023 17:54:16 -0500 Subject: [PATCH 20/41] Add files via upload --- .../MLoptimization/mean_reward_versus_step.png | Bin 0 -> 50214 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 openfasoc/MLoptimization/mean_reward_versus_step.png diff --git a/openfasoc/MLoptimization/mean_reward_versus_step.png b/openfasoc/MLoptimization/mean_reward_versus_step.png new file mode 100644 index 0000000000000000000000000000000000000000..24dca66ae25c73078cdf964e676a756cf8b5fc8c GIT binary patch literal 50214 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 Date: Thu, 9 Nov 2023 17:55:41 -0500 Subject: [PATCH 21/41] Update README.md --- openfasoc/MLoptimization/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openfasoc/MLoptimization/README.md b/openfasoc/MLoptimization/README.md index 7e661dbc3..aa9d5cf66 100644 --- a/openfasoc/MLoptimization/README.md +++ b/openfasoc/MLoptimization/README.md @@ -42,5 +42,5 @@ The evaluation result will be saved to the ../generators/gdsfactory-gen/. Please note that results vary greatly based on random seed and spec generation (both for testing and validation). An example spec file is provided that was used to generate the results below.

- +

From 3d51cac76ee9ba2857a9f54ff116047ecab984ae Mon Sep 17 00:00:00 2001 From: Wen-Tian-Pineapple <74345454+Wen-Tian-Pineapple@users.noreply.github.com> Date: Tue, 28 Nov 2023 00:16:29 +0000 Subject: [PATCH 22/41] Update gen_spec.py --- openfasoc/MLoptimization/gen_spec.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/openfasoc/MLoptimization/gen_spec.py b/openfasoc/MLoptimization/gen_spec.py index 60c5023f2..6f4193f9d 100755 --- a/openfasoc/MLoptimization/gen_spec.py +++ b/openfasoc/MLoptimization/gen_spec.py @@ -6,12 +6,13 @@ import yaml import os import argparse +import path_module_thing def gen_data(env, num_specs): specs_range = { - "gain_min" : [float(1000338000.0), float(3000338000.0)], - "FOM" : [float(5*10**11), float(5*10**11)] + "gain_min" : [float(14003380.0), float(50003380.0)], + "FOM" : [float(4e11), float(4e11)] } specs_range_vals = list(specs_range.values()) specs_valid = [] @@ -34,8 +35,8 @@ def main(): parser = argparse.ArgumentParser() parser.add_argument('--num_specs', type=str) args = parser.parse_args() - - gen_data("newnew_eval_3.yaml", int(50)) + + gen_data("train.yaml", int(100)) if __name__=="__main__": - main() \ No newline at end of file + main() From c24eebce95251c3567867c0715652307e1c7f1f0 Mon Sep 17 00:00:00 2001 From: Wen-Tian-Pineapple <74345454+Wen-Tian-Pineapple@users.noreply.github.com> Date: Tue, 28 Nov 2023 00:19:08 +0000 Subject: [PATCH 23/41] Update run_training.py --- openfasoc/MLoptimization/run_training.py | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/openfasoc/MLoptimization/run_training.py b/openfasoc/MLoptimization/run_training.py index 1201da2fb..043f3bc13 100644 --- a/openfasoc/MLoptimization/run_training.py +++ b/openfasoc/MLoptimization/run_training.py @@ -64,17 +64,19 @@ def __init__(self, env_config): params = { "diffpair_params0" : [1, 8, 1], "diffpair_params1" : [0.5, 2.1, 0.1], - "diffpair_params2" : [1, 5, 1], + "diffpair_params2" : [1, 9, 1], "Diffpair_bias0" : [1, 8, 1], "Diffpair_bias1" : [1, 4.5, 0.5], "Diffpair_bias2" : [3, 13, 1], "pamp_hparams0" : [1, 8, 1], "pamp_hparams1" : [0.5, 2.1, 0.1], - "pamp_hparams2" : [3, 13, 1], + "pamp_hparams2" : [2, 11, 1], "bias0" : [1, 8, 1], "bias1" : [0.5, 2.1, 0.1], "bias2" : [3, 13, 1], "bias3" : [2, 4, 1], + "half_pload1": [3, 7, 1], + "half_pload3": [4, 9, 1], "mim_cap_rows" : [1, 4, 1], } self.params = [] @@ -101,7 +103,7 @@ def __init__(self, env_config): for spec in list(self.specs.values()): self.global_g.append(float(spec[self.fixed_goal_idx])) self.g_star = np.array(self.global_g) - self.global_g = np.array([3000338000.0, 1.0*10**13]) + self.global_g = np.array([60003380.0, 3e12]) #objective number (used for validation)g self.obj_idx = 0 @@ -135,7 +137,7 @@ def reset(self, *, seed=None, options=None): self.specs_ideal_norm = self.lookup(self.specs_ideal, self.global_g) #initialize current parameters - self.cur_params_idx = np.array([1, 5, 3, 5, 2, 1, 6, 0, 5, 5, 1, 1, 1, 0]) + self.cur_params_idx = np.array([3, 5, 7, 5, 4, 0, 3, 0, 2, 5, 15, 1, 0, 3, 4, 2]) # param array self.cur_specs = self.update(self.cur_params_idx) cur_spec_norm = self.lookup(self.cur_specs, self.global_g) @@ -238,23 +240,22 @@ def reward(self, spec, goal_spec): return reward def update(self, params_idx): - #impose constraint tail1 = in - #params_idx[0] = params_idx[3] params = np.array([self.params[i][params_idx[i]] for i in range(len(self.params_id))]) - #param_val = np.array[OrderedDict(list(zip(self.params_id,params)))] #run param vals and simulate - #cur_specs = OrderedDict(sorted(self.sim_env.create_design_and_simulate(param_val[0])[1].items(), key=lambda k:k[0])) - inputparam = np.array([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.0, 0.0, 0.0, 0.0, 0.0, 5.0, 1.0, 16.0, 6.0, 2.0, 4.0, 12.0, 12.0, 0.0, 2.0]) + inputparam = np.array([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.0, 0.0, 0.0, 0.0, 0.0, 5.0, 1.0, 16.0, 6.0, 2.0, 4.0, 0.0, 1.0, 0.0, 12.0, 12.0, 0.0, 2.0]) + inputparam[0:3] = params[0:3] inputparam[3:6] = params[3:6] inputparam[6:9] = params[6:9] inputparam[10:14] = params[9:13] - inputparam[22] = params[13] + inputparam[20] = params[13] + inputparam[22] = params[14] + inputparam[25] = params[15] result = single_build_and_simulation(inputparam,-269) specs = np.array([0.0 , 0.0]) specs[0] = result["ugb"] - specs[1] = result["ugb"]/result["power"] + specs[1] = result["ugb"]/(result["Ibias_diffpair"]+result["Ibias_commonsource"]) cur_specs = specs return cur_specs From 0615c709f9f289d33d0812219107ef2e430e9f23 Mon Sep 17 00:00:00 2001 From: Harsh Khandeparkar Date: Wed, 29 Nov 2023 21:16:42 +0530 Subject: [PATCH 24/41] fix: path_module_thing typo --- openfasoc/MLoptimization/gen_spec.py | 1 - 1 file changed, 1 deletion(-) diff --git a/openfasoc/MLoptimization/gen_spec.py b/openfasoc/MLoptimization/gen_spec.py index 6f4193f9d..eff2ffdaa 100755 --- a/openfasoc/MLoptimization/gen_spec.py +++ b/openfasoc/MLoptimization/gen_spec.py @@ -6,7 +6,6 @@ import yaml import os import argparse -import path_module_thing def gen_data(env, num_specs): From 7cf90602d652867bfa968d24db5d6c815f2ac406 Mon Sep 17 00:00:00 2001 From: Harsh Khandeparkar Date: Wed, 29 Nov 2023 21:22:33 +0530 Subject: [PATCH 25/41] fix: sys path append gdsfactory gen --- openfasoc/MLoptimization/model.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/openfasoc/MLoptimization/model.py b/openfasoc/MLoptimization/model.py index a0cd902ea..83fd8b1c2 100644 --- a/openfasoc/MLoptimization/model.py +++ b/openfasoc/MLoptimization/model.py @@ -1,9 +1,12 @@ #training import +import sys import gym import ray import ray.tune as tune from ray.rllib.algorithms.ppo import PPO from run_training import Envir +sys.path.append('../generators/gdsfactory-gen') +sys.path.append('../generators/gdsfactory-gen/tapeout_and_RL') from sky130_nist_tapeout import single_build_and_simulation import argparse From 77f7ac2a413ef2248558d8f138b3bd2075b49dde Mon Sep 17 00:00:00 2001 From: Harsh Khandeparkar Date: Wed, 29 Nov 2023 21:23:36 +0530 Subject: [PATCH 26/41] fix: added sky130_nist_tapeout to path --- openfasoc/MLoptimization/model.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openfasoc/MLoptimization/model.py b/openfasoc/MLoptimization/model.py index 83fd8b1c2..05eaddf32 100644 --- a/openfasoc/MLoptimization/model.py +++ b/openfasoc/MLoptimization/model.py @@ -7,6 +7,7 @@ from run_training import Envir sys.path.append('../generators/gdsfactory-gen') sys.path.append('../generators/gdsfactory-gen/tapeout_and_RL') +sys.path.append('../generators/gdsfactory-gen/tapeout_and_RL/sky130_nist_tapeout.py') from sky130_nist_tapeout import single_build_and_simulation import argparse From 4436c8dcee04467b072dc5b14420a3f4f27e8568 Mon Sep 17 00:00:00 2001 From: Harsh Khandeparkar Date: Wed, 29 Nov 2023 21:24:48 +0530 Subject: [PATCH 27/41] fix: moved sys path to the top --- openfasoc/MLoptimization/model.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/openfasoc/MLoptimization/model.py b/openfasoc/MLoptimization/model.py index 05eaddf32..b99688a3c 100644 --- a/openfasoc/MLoptimization/model.py +++ b/openfasoc/MLoptimization/model.py @@ -1,13 +1,14 @@ -#training import +# Add glayout to path import sys +sys.path.append('../generators/gdsfactory-gen') +sys.path.append('../generators/gdsfactory-gen/tapeout_and_RL') + +#training import import gym import ray import ray.tune as tune from ray.rllib.algorithms.ppo import PPO from run_training import Envir -sys.path.append('../generators/gdsfactory-gen') -sys.path.append('../generators/gdsfactory-gen/tapeout_and_RL') -sys.path.append('../generators/gdsfactory-gen/tapeout_and_RL/sky130_nist_tapeout.py') from sky130_nist_tapeout import single_build_and_simulation import argparse From 4910a5cb84397eadafa8a399a95d1111d0b78486 Mon Sep 17 00:00:00 2001 From: Harsh Khandeparkar Date: Wed, 29 Nov 2023 21:27:36 +0530 Subject: [PATCH 28/41] fix: import sky130_nist_tapeout --- openfasoc/MLoptimization/run_training.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/openfasoc/MLoptimization/run_training.py b/openfasoc/MLoptimization/run_training.py index 043f3bc13..9ee2cee9b 100644 --- a/openfasoc/MLoptimization/run_training.py +++ b/openfasoc/MLoptimization/run_training.py @@ -1,3 +1,7 @@ +# Add glayout to path +import sys +sys.path.append('../generators/gdsfactory-gen/tapeout_and_RL') + #env import import gymnasium as gym from gymnasium import spaces @@ -5,6 +9,7 @@ from gymnasium.wrappers import EnvCompatibility from ray.rllib.env.wrappers.multi_agent_env_compatibility import MultiAgentEnvCompatibility from sky130_nist_tapeout import single_build_and_simulation +import sky130_nist_tapeout sky130_nist_tapeout.path.append('../generators/gdsfactory-gen/tapeout_and_RL') import numpy as np import random @@ -52,7 +57,7 @@ def __init__(self, env_config): specs = yaml.safe_load(Path('train1.yaml').read_text()) else: specs = inputspec - + self.specs = specs self.specs_ideal = [] @@ -62,17 +67,17 @@ def __init__(self, env_config): # param array params = { - "diffpair_params0" : [1, 8, 1], - "diffpair_params1" : [0.5, 2.1, 0.1], + "diffpair_params0" : [1, 8, 1], + "diffpair_params1" : [0.5, 2.1, 0.1], "diffpair_params2" : [1, 9, 1], "Diffpair_bias0" : [1, 8, 1], "Diffpair_bias1" : [1, 4.5, 0.5], "Diffpair_bias2" : [3, 13, 1], - "pamp_hparams0" : [1, 8, 1], - "pamp_hparams1" : [0.5, 2.1, 0.1], + "pamp_hparams0" : [1, 8, 1], + "pamp_hparams1" : [0.5, 2.1, 0.1], "pamp_hparams2" : [2, 11, 1], - "bias0" : [1, 8, 1], - "bias1" : [0.5, 2.1, 0.1], + "bias0" : [1, 8, 1], + "bias1" : [0.5, 2.1, 0.1], "bias2" : [3, 13, 1], "bias3" : [2, 4, 1], "half_pload1": [3, 7, 1], @@ -233,7 +238,7 @@ def reward(self, spec, goal_spec): for i,rel_spec in enumerate(rel_specs): if rel_spec < -0.02: trueorfalse = False - + if trueorfalse: return 2.0+reward else: From 8c988678a519a715dcadb9250031074bc79b8d74 Mon Sep 17 00:00:00 2001 From: Harsh Khandeparkar Date: Wed, 29 Nov 2023 21:28:48 +0530 Subject: [PATCH 29/41] fix: tried removing this --- openfasoc/MLoptimization/run_training.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/openfasoc/MLoptimization/run_training.py b/openfasoc/MLoptimization/run_training.py index 9ee2cee9b..2e5545419 100644 --- a/openfasoc/MLoptimization/run_training.py +++ b/openfasoc/MLoptimization/run_training.py @@ -9,8 +9,6 @@ from gymnasium.wrappers import EnvCompatibility from ray.rllib.env.wrappers.multi_agent_env_compatibility import MultiAgentEnvCompatibility from sky130_nist_tapeout import single_build_and_simulation -import sky130_nist_tapeout -sky130_nist_tapeout.path.append('../generators/gdsfactory-gen/tapeout_and_RL') import numpy as np import random import psutil From b9e834a174645d8c262b1d691316a7892fa56feb Mon Sep 17 00:00:00 2001 From: Harsh Khandeparkar Date: Wed, 29 Nov 2023 22:11:37 +0530 Subject: [PATCH 30/41] fix: load train.yaml --- openfasoc/MLoptimization/run_training.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openfasoc/MLoptimization/run_training.py b/openfasoc/MLoptimization/run_training.py index 2e5545419..c506638c4 100644 --- a/openfasoc/MLoptimization/run_training.py +++ b/openfasoc/MLoptimization/run_training.py @@ -52,7 +52,7 @@ def __init__(self, env_config): # design specs if self.generalize == True: if self.valid == False: - specs = yaml.safe_load(Path('train1.yaml').read_text()) + specs = yaml.safe_load(Path('train.yaml').read_text()) else: specs = inputspec From e7d17bf59a7d614a7bfa910d06b27a7ce20d02d9 Mon Sep 17 00:00:00 2001 From: Harsh Khandeparkar Date: Wed, 29 Nov 2023 22:13:16 +0530 Subject: [PATCH 31/41] feat: added glayout to path --- openfasoc/MLoptimization/model.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openfasoc/MLoptimization/model.py b/openfasoc/MLoptimization/model.py index b99688a3c..109e34d33 100644 --- a/openfasoc/MLoptimization/model.py +++ b/openfasoc/MLoptimization/model.py @@ -1,6 +1,7 @@ # Add glayout to path import sys sys.path.append('../generators/gdsfactory-gen') +sys.path.append('../generators/gdsfactory-gen/glayout') sys.path.append('../generators/gdsfactory-gen/tapeout_and_RL') #training import From 145223c71def7cf600220f0726bf1aeb393b1123 Mon Sep 17 00:00:00 2001 From: Harsh Khandeparkar Date: Wed, 29 Nov 2023 22:14:59 +0530 Subject: [PATCH 32/41] fix: properly add gdsfactory-gen --- openfasoc/MLoptimization/model.py | 1 - openfasoc/MLoptimization/run_training.py | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/openfasoc/MLoptimization/model.py b/openfasoc/MLoptimization/model.py index 109e34d33..b99688a3c 100644 --- a/openfasoc/MLoptimization/model.py +++ b/openfasoc/MLoptimization/model.py @@ -1,7 +1,6 @@ # Add glayout to path import sys sys.path.append('../generators/gdsfactory-gen') -sys.path.append('../generators/gdsfactory-gen/glayout') sys.path.append('../generators/gdsfactory-gen/tapeout_and_RL') #training import diff --git a/openfasoc/MLoptimization/run_training.py b/openfasoc/MLoptimization/run_training.py index c506638c4..7c9f9b13e 100644 --- a/openfasoc/MLoptimization/run_training.py +++ b/openfasoc/MLoptimization/run_training.py @@ -12,6 +12,8 @@ import numpy as np import random import psutil +import sky130_nist_tapeout +sky130_nist_tapeout.Path.append('../generators/gdsfactory-gen') from multiprocessing import Pool from collections import OrderedDict From 63fe9326fac24e175ccb44ce187a1e54ce69d876 Mon Sep 17 00:00:00 2001 From: Harsh Khandeparkar Date: Wed, 29 Nov 2023 22:18:32 +0530 Subject: [PATCH 33/41] fix: tried everything --- .../tapeout_and_RL/sky130_nist_tapeout.py | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/openfasoc/generators/gdsfactory-gen/tapeout_and_RL/sky130_nist_tapeout.py b/openfasoc/generators/gdsfactory-gen/tapeout_and_RL/sky130_nist_tapeout.py index d9051eed1..be3302cd3 100644 --- a/openfasoc/generators/gdsfactory-gen/tapeout_and_RL/sky130_nist_tapeout.py +++ b/openfasoc/generators/gdsfactory-gen/tapeout_and_RL/sky130_nist_tapeout.py @@ -1,6 +1,7 @@ import sys +from os import path # path to glayout -sys.path.append('../') +sys.path.append(path.join(path.dirname(__file__), '../')) from gdsfactory.read.import_gds import import_gds from gdsfactory.components import text_freetype, rectangle @@ -385,9 +386,9 @@ def get_small_parameter_list(test_mode = False) -> np.array: for halfpld in half_pload: tup_to_add = opamp_parameters_serializer( half_pload=halfpld, - half_diffpair_params=diffpair_v, - half_common_source_bias=bias2_v, - mim_cap_rows=cap_array_v, + half_diffpair_params=diffpair_v, + half_common_source_bias=bias2_v, + mim_cap_rows=cap_array_v, half_common_source_params=pamp_o_v, rmult=rmult, diffpair_bias=diffpair_cmirror_v, @@ -961,7 +962,7 @@ def extract_stats( colnames_vals[key] = "place_holder" for i, colname in enumerate(colnames_vals): colnames_vals[colname] = params[:, i] - + # run statistics on distribution of training parameters individually params_stats_hists = Path("./stats/param_stats/hists1D") params_stats_hists.mkdir(parents=True) @@ -973,7 +974,7 @@ def extract_stats( save_pairwise_scatter_plot(params,str(params_stats_scatter)+"/pairscatter_params.png") # run PCA on training parameters run_pca_and_save_plot(params,str(params_stats_scatter)+"/PCA_params.png") - + # run statistics on results result_stats_dir = Path("./stats/result_stats/hist1d") result_stats_dir.mkdir(parents=True) @@ -1015,7 +1016,7 @@ def extract_stats( def create_opamp_matrix(save_dir_name: str, params: np.array, results: Optional[np.array] = None, indices: Optional[list]=None): - """create opamps with pads from the np array of opamp parameters + """create opamps with pads from the np array of opamp parameters args: save_dir_name = name of directory to save gds array and text description into params = 2d list-like container (list, np.array, tuple, etc.) where each row is in the same form as opamp_parameters_serializer @@ -1066,7 +1067,7 @@ def create_opamp_matrix(save_dir_name: str, params: np.array, results: Optional[ start_watch = time.time() parser = argparse.ArgumentParser(description="sky130 nist tapeout sample, RL generation, and statistics utility.") - + subparsers = parser.add_subparsers(title="mode", required=True, dest="mode") # Subparser for extract_stats mode @@ -1110,7 +1111,7 @@ def create_opamp_matrix(save_dir_name: str, params: np.array, results: Optional[ test.add_argument("--cload", type=float, default=float(0), help="run simulation with load capacitance units=pico Farads") test.add_argument("--noparasitics",action="store_true",help="specify that parasitics should be removed when simulating") test.add_argument("--output_second_stage",action="store_true",help="measure relevant sim metrics at the output of the second stage rather than output of third stage") - + # Subparser for create_opamp_matrix mode create_opamp_matrix_parser = subparsers.add_parser("create_opamp_matrix", help="create a matrix of opamps") create_opamp_matrix_parser.add_argument("-p", "--params", default="params.npy", help="File path for params (default: params.npy)") @@ -1123,19 +1124,19 @@ def create_opamp_matrix(save_dir_name: str, params: np.array, results: Optional[ prsr.add_argument("--PDK_ROOT",type=Path,default="/usr/bin/miniconda3/share/pdk/",help="path to the sky130 PDK library") for prsr in [gen_opamp_parser,create_opamp_matrix_parser]: prsr.add_argument("--big_pad",action="store_true",help="use 120um pad") - + args = parser.parse_args() if args.mode in ["gen_opamps","create_opamp_matrix"]: __SMALL_PAD_ = not args.big_pad - + if args.mode in ["get_training_data","test","gen_opamps","create_opamp_matrix"]: __NO_LVT_GLOBAL_ = args.no_lvt PDK_ROOT = Path(args.PDK_ROOT).resolve() if not(PDK_ROOT.is_dir()): raise ValueError("PDK_ROOT is not a valid directory\n") PDK_ROOT = str(PDK_ROOT) - + # Simulation Temperature information if vars(args).get("temp") is not None: temperature_info = [args.temp, None] @@ -1214,8 +1215,8 @@ def create_opamp_matrix(save_dir_name: str, params: np.array, results: Optional[ else: indices = None create_opamp_matrix(args.output_dir,params,results,indices) - - + + elif args.mode == "gen_opamps": global usepdk if args.pdk[0].lower()=="g": @@ -1229,10 +1230,10 @@ def create_func(argnparray, indx: int): global usepdk comp = opamp(usepdk,**opamp_parameters_de_serializer(argnparray)) comp.write_gds("./outputrawopamps/amp"+str(indx)+".gds") - + argnparray = get_small_parameter_list() with Pool(120) as cores: cores.starmap(create_func, zip(argnparray,count(0))) - + end_watch = time.time() print("\ntotal runtime was "+str((end_watch-start_watch)/3600) + " hours\n") From c6a696bc39030c6f1c02a70c9f1fabfaee72dfe7 Mon Sep 17 00:00:00 2001 From: Harsh Khandeparkar Date: Wed, 29 Nov 2023 22:21:17 +0530 Subject: [PATCH 34/41] fix: reverted --- openfasoc/MLoptimization/run_training.py | 1 - 1 file changed, 1 deletion(-) diff --git a/openfasoc/MLoptimization/run_training.py b/openfasoc/MLoptimization/run_training.py index 7c9f9b13e..781b5d177 100644 --- a/openfasoc/MLoptimization/run_training.py +++ b/openfasoc/MLoptimization/run_training.py @@ -13,7 +13,6 @@ import random import psutil import sky130_nist_tapeout -sky130_nist_tapeout.Path.append('../generators/gdsfactory-gen') from multiprocessing import Pool from collections import OrderedDict From cb56de9da2fbcb09a17f2fc6381779eddc50e22b Mon Sep 17 00:00:00 2001 From: Harsh Khandeparkar Date: Thu, 30 Nov 2023 22:40:39 +0530 Subject: [PATCH 35/41] fix: import glayout in eval.py --- openfasoc/MLoptimization/eval.py | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/openfasoc/MLoptimization/eval.py b/openfasoc/MLoptimization/eval.py index 74e9036c7..e76bdda7b 100644 --- a/openfasoc/MLoptimization/eval.py +++ b/openfasoc/MLoptimization/eval.py @@ -1,3 +1,8 @@ +# Add glayout to path +import sys +sys.path.append('../generators/gdsfactory-gen') +sys.path.append('../generators/gdsfactory-gen/tapeout_and_RL') + #training import import numpy as np import gym @@ -6,24 +11,23 @@ from ray.rllib.algorithms.ppo import PPO from run_training import Envir from sky130_nist_tapeout import single_build_and_simulation -sky130_nist_tapeout.path.append('../generators/gdsfactory-gen/tapeout_and_RL') import pickle import yaml from pathlib import Path import argparse def unlookup(norm_spec, goal_spec): - spec = -1*np.multiply((norm_spec+1), goal_spec)/(norm_spec-1) + spec = -1*np.multiply((norm_spec+1), goal_spec)/(norm_spec-1) return spec specs = yaml.safe_load(Path('newnew_eval_3.yaml').read_text()) # #training set up -env_config = { +env_config = { "generalize":True, - "num_valid":2, - "save_specs":False, + "num_valid":2, + "save_specs":False, "inputspec":specs, "run_valid":True, "horizon":25, @@ -34,8 +38,8 @@ def unlookup(norm_spec, goal_spec): "env": Envir, "env_config":{ "generalize":True, - "num_valid":2, - "save_specs":False, + "num_valid":2, + "save_specs":False, "inputspec":specs, "run_valid":True, "horizon":25, @@ -68,7 +72,7 @@ def unlookup(norm_spec, goal_spec): while rollout_steps < 100: rollout_num = [] state, info = env.reset() - + done = False truncated = False reward_total = 0.0 @@ -90,7 +94,7 @@ def unlookup(norm_spec, goal_spec): rollout_num.append(reward) next_states.append(next_state) - + state = next_state norm_ideal_spec = state[spec_num:spec_num+spec_num] @@ -102,7 +106,7 @@ def unlookup(norm_spec, goal_spec): action_array = [] pickle.dump(action_arr_comp, open("action_arr_test", "wb")) else: - obs_nreached.append(ideal_spec) #save unreached observation + obs_nreached.append(ideal_spec) #save unreached observation action_array=[] f.write('done----------------------------------------') rollouts.append(rollout_num) @@ -114,6 +118,6 @@ def unlookup(norm_spec, goal_spec): pickle.dump(obs_nreached, open("opamp_obs_nreached_test","wb")) f.write("Specs reached: " + str(reached_spec) + "/" + str(len(obs_nreached))) - print("Specs reached: " + str(reached_spec) + "/" + str(len(obs_nreached))) + print("Specs reached: " + str(reached_spec) + "/" + str(len(obs_nreached))) print("Num specs reached: " + str(reached_spec) + "/" + str(1)) From fc94b15704b3d670ee10d71979d522b07914e0d4 Mon Sep 17 00:00:00 2001 From: openfasoc-bot Date: Fri, 1 Dec 2023 02:33:03 +0000 Subject: [PATCH 36/41] [BOT] Update dependencies successful version records in the repository --- README.rst | 6 +++--- conda_versions.txt | 6 +++--- versions.txt | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.rst b/README.rst index 00d5ca1a6..3ad77a2da 100644 --- a/README.rst +++ b/README.rst @@ -46,7 +46,7 @@ For more info on getting-started, please refer to ["Getting Started" section ](h Below are the tool requirements along with their currently support versions that are updated regularly upon testing againsts the generators. - 1. `Magic `_ (version:8.3.451) + 1. `Magic `_ (version:8.3.452) 2. `Netgen `_ (version:1.5.263) @@ -55,12 +55,12 @@ Below are the tool requirements along with their currently support versions that - Please use this command to build preferably: `./build.sh -option '-j8' -noruby -without-qt-multimedia -without-qt-xml -without-qt-svg` - 4. `Yosys `_ (version:0.35+39) + 4. `Yosys `_ (version:0.35+56) 5. `OpenROAD `_ (version:2.0_10905) - 6. `Open_pdks `_ (version:1.0.286) + 6. `Open_pdks `_ (version:1.0.459) - open_pdks is required to run drc/lvs check and the simulations - After open_pdks is installed, please update the **open_pdks** key in `common/platform_config.json` with the installed path, down to the sky130A folder diff --git a/conda_versions.txt b/conda_versions.txt index 97da7534f..e9c652ceb 100644 --- a/conda_versions.txt +++ b/conda_versions.txt @@ -1,5 +1,5 @@ -magic==8.3.451_0_g84af801 +magic==8.3.452_0_g83ed73a netgen==1.5.263_0_g4250525 -open_pdks.sky130a==1.0.286_0_g52af776 +open_pdks.sky130a==1.0.459_0_g369e64e openroad==2.0_10905_ge89829335 -yosys==0.35_40_g031ad38b5 +yosys==0.35_57_g8614d9b32 diff --git a/versions.txt b/versions.txt index 0de809fbb..94231adb8 100644 --- a/versions.txt +++ b/versions.txt @@ -1,6 +1,6 @@ klayout - 0.28.12-1 OpenROAD - 2.0_10905 -yosys - 0.35+39 -magic - 8.3.451 +yosys - 0.35+56 +magic - 8.3.452 netgen - 1.5.263 -open_pdks - 1.0.286 +open_pdks - 1.0.459 From 2bd226182905f5abddcc62aca5916d98a81b17b9 Mon Sep 17 00:00:00 2001 From: Harsh Khandeparkar Date: Fri, 1 Dec 2023 15:30:37 +0530 Subject: [PATCH 37/41] feat: save the last checkpoint --- openfasoc/MLoptimization/model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openfasoc/MLoptimization/model.py b/openfasoc/MLoptimization/model.py index b99688a3c..65d3d56ff 100644 --- a/openfasoc/MLoptimization/model.py +++ b/openfasoc/MLoptimization/model.py @@ -37,4 +37,4 @@ checkpoint_freq=1, config=config_train, ) - +trials.get_last_checkpoint().to_directory('./last_checkpoint') \ No newline at end of file From e99806b6b0e93001becf5a28ff029d8d9cf18cd5 Mon Sep 17 00:00:00 2001 From: Harsh Khandeparkar Date: Sat, 2 Dec 2023 00:47:50 +0530 Subject: [PATCH 38/41] feat: load last checkpoint --- openfasoc/MLoptimization/eval.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openfasoc/MLoptimization/eval.py b/openfasoc/MLoptimization/eval.py index e76bdda7b..c14f99a2f 100644 --- a/openfasoc/MLoptimization/eval.py +++ b/openfasoc/MLoptimization/eval.py @@ -51,7 +51,7 @@ def unlookup(norm_spec, goal_spec): args = parser.parse_args() env = Envir(env_config=env_config) -agent = PPO.from_checkpoint("/home/wentian/ray_results/brandnewBound_1/PPO_Envir_7fc09_00000_0_2023-08-18_20-40-42/checkpoint_000015") +agent = PPO.from_checkpoint("./last_checkpoint") From d3e8b37151b73609d845b07ad1f912d36e1d7a0e Mon Sep 17 00:00:00 2001 From: Harsh Khandeparkar Date: Sun, 3 Dec 2023 18:07:34 +0530 Subject: [PATCH 39/41] refactor: renamed some functions --- openfasoc/MLoptimization/gen_spec.py | 8 ++--- openfasoc/MLoptimization/model.py | 54 ++++++++++++++-------------- 2 files changed, 30 insertions(+), 32 deletions(-) diff --git a/openfasoc/MLoptimization/gen_spec.py b/openfasoc/MLoptimization/gen_spec.py index eff2ffdaa..613368afa 100755 --- a/openfasoc/MLoptimization/gen_spec.py +++ b/openfasoc/MLoptimization/gen_spec.py @@ -1,14 +1,10 @@ #!/usr/bin/env python3 ## Generate the design specifications and then save to a pickle file -import numpy as np import random -import yaml -import os import argparse -def gen_data(env, num_specs): - +def generate_random_specs(env, num_specs): specs_range = { "gain_min" : [float(14003380.0), float(50003380.0)], "FOM" : [float(4e11), float(4e11)] @@ -35,7 +31,7 @@ def main(): parser.add_argument('--num_specs', type=str) args = parser.parse_args() - gen_data("train.yaml", int(100)) + generate_random_specs("train.yaml", int(100)) if __name__=="__main__": main() diff --git a/openfasoc/MLoptimization/model.py b/openfasoc/MLoptimization/model.py index 65d3d56ff..93789d0d1 100644 --- a/openfasoc/MLoptimization/model.py +++ b/openfasoc/MLoptimization/model.py @@ -4,37 +4,39 @@ sys.path.append('../generators/gdsfactory-gen/tapeout_and_RL') #training import -import gym import ray import ray.tune as tune from ray.rllib.algorithms.ppo import PPO from run_training import Envir -from sky130_nist_tapeout import single_build_and_simulation import argparse -# -#training set up -parser = argparse.ArgumentParser() -parser.add_argument('--checkpoint_dir', '-cpd', type=str) -args = parser.parse_args() -ray.init(num_cpus=33, num_gpus=0,include_dashboard=True, ignore_reinit_error=True) -#configures training of the agent with associated hyperparameters -config_train = { - "env": Envir, - "train_batch_size": 1000, - "model":{"fcnet_hiddens": [64, 64]}, - "num_workers": 32, - "env_config":{"generalize":True, "run_valid":False, "horizon":20}, - } +def train_model(save_checkpoint_dir: str = "./last_checkpoint"): + ray.init(num_cpus=33, num_gpus=0,include_dashboard=True, ignore_reinit_error=True) -#Runs training and saves the result in ~/ray_results/train_ngspice_45nm -#If checkpoint fails for any reason, training can be restored -trials = tune.run( - "PPO", #You can replace this string with ppo.PPOTrainer if you want / have customized it - name="new_train_with_new_params_3", # The name can be different. - stop={"episode_reward_mean": 12, "training_iteration": 12}, - checkpoint_freq=1, - config=config_train, -) -trials.get_last_checkpoint().to_directory('./last_checkpoint') \ No newline at end of file + #configures training of the agent with associated hyperparameters + config_train = { + "env": Envir, + "train_batch_size": 1000, + "model":{"fcnet_hiddens": [64, 64]}, + "num_workers": 32, + "env_config":{"generalize":True, "run_valid":False, "horizon":20}, + } + + #Runs training and saves the result in ~/ray_results/train_ngspice_45nm + #If checkpoint fails for any reason, training can be restored + trials = tune.run( + "PPO", #You can replace this string with ppo.PPOTrainer if you want / have customized it + name="new_train_with_new_params_3", # The name can be different. + stop={"episode_reward_mean": 12, "training_iteration": 12}, + checkpoint_freq=1, + config=config_train, + ) + trials.get_last_checkpoint().to_directory(save_checkpoint_dir) + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('--checkpoint_dir', '-cpd', type=str) + args = parser.parse_args() + + train_model() From d8f6956fad425aa287de180245d2146ca60dc645 Mon Sep 17 00:00:00 2001 From: Harsh Khandeparkar Date: Sun, 3 Dec 2023 18:10:26 +0530 Subject: [PATCH 40/41] refactor: export eval.py functionality --- openfasoc/MLoptimization/eval.py | 209 +++++++++++++++---------------- 1 file changed, 104 insertions(+), 105 deletions(-) diff --git a/openfasoc/MLoptimization/eval.py b/openfasoc/MLoptimization/eval.py index c14f99a2f..1d0b794dc 100644 --- a/openfasoc/MLoptimization/eval.py +++ b/openfasoc/MLoptimization/eval.py @@ -5,12 +5,8 @@ #training import import numpy as np -import gym -import ray -import ray.tune as tune from ray.rllib.algorithms.ppo import PPO from run_training import Envir -from sky130_nist_tapeout import single_build_and_simulation import pickle import yaml from pathlib import Path @@ -20,104 +16,107 @@ def unlookup(norm_spec, goal_spec): spec = -1*np.multiply((norm_spec+1), goal_spec)/(norm_spec-1) return spec -specs = yaml.safe_load(Path('newnew_eval_3.yaml').read_text()) - -# -#training set up -env_config = { - "generalize":True, - "num_valid":2, - "save_specs":False, - "inputspec":specs, - "run_valid":True, - "horizon":25, - } - -config_eval = { - #"sample_batch_size": 200, - "env": Envir, - "env_config":{ - "generalize":True, - "num_valid":2, - "save_specs":False, - "inputspec":specs, - "run_valid":True, - "horizon":25, - }, - } - -parser = argparse.ArgumentParser() -parser.add_argument('--checkpoint_dir', '-cpd', type=str) -args = parser.parse_args() -env = Envir(env_config=env_config) - -agent = PPO.from_checkpoint("./last_checkpoint") - - - -norm_spec_ref = env.global_g -spec_num = len(env.specs) - - -rollouts = [] -next_states = [] -obs_reached = [] -obs_nreached = [] -action_array = [] -action_arr_comp = [] -rollout_steps = 0 -reached_spec = 0 -f = open("newnewnew_eval__3.txt", "a") - -while rollout_steps < 100: - rollout_num = [] - state, info = env.reset() - - done = False - truncated = False - reward_total = 0.0 - steps=0 - f.write('new----------------------------------------') - while not done and not truncated: - action = agent.compute_single_action(state) - action_array.append(action) - - next_state, reward, done, truncated, info = env.step(action) - f.write(str(action)+'\n') - f.write(str(reward)+'\n') - f.write(str(done)+'n') - print(next_state) - print(action) - print(reward) - print(done) - reward_total += reward - - rollout_num.append(reward) - next_states.append(next_state) - - state = next_state - - norm_ideal_spec = state[spec_num:spec_num+spec_num] - ideal_spec = unlookup(norm_ideal_spec, norm_spec_ref) - if done == True: - reached_spec += 1 - obs_reached.append(ideal_spec) - action_arr_comp.append(action_array) - action_array = [] - pickle.dump(action_arr_comp, open("action_arr_test", "wb")) - else: - obs_nreached.append(ideal_spec) #save unreached observation - action_array=[] - f.write('done----------------------------------------') - rollouts.append(rollout_num) - print("Episode reward", reward_total) - rollout_steps+=1 - #if out is not None: - #pickle.dump(rollouts, open(str(out)+'reward', "wb")) - pickle.dump(obs_reached, open("opamp_obs_reached_test","wb")) - pickle.dump(obs_nreached, open("opamp_obs_nreached_test","wb")) - - f.write("Specs reached: " + str(reached_spec) + "/" + str(len(obs_nreached))) - print("Specs reached: " + str(reached_spec) + "/" + str(len(obs_nreached))) - -print("Num specs reached: " + str(reached_spec) + "/" + str(1)) +def evaluate_model(): + specs = yaml.safe_load(Path('newnew_eval_3.yaml').read_text()) + + #training set up + env_config = { + "generalize":True, + "num_valid":2, + "save_specs":False, + "inputspec":specs, + "run_valid":True, + "horizon":25, + } + + config_eval = { + #"sample_batch_size": 200, + "env": Envir, + "env_config":{ + "generalize":True, + "num_valid":2, + "save_specs":False, + "inputspec":specs, + "run_valid":True, + "horizon":25, + }, + } + + parser = argparse.ArgumentParser() + parser.add_argument('--checkpoint_dir', '-cpd', type=str) + args = parser.parse_args() + env = Envir(env_config=env_config) + + agent = PPO.from_checkpoint("./last_checkpoint") + + norm_spec_ref = env.global_g + spec_num = len(env.specs) + + rollouts = [] + next_states = [] + obs_reached = [] + obs_nreached = [] + action_array = [] + action_arr_comp = [] + rollout_steps = 0 + reached_spec = 0 + f = open("newnewnew_eval__3.txt", "a") + + while rollout_steps < 100: + rollout_num = [] + state, info = env.reset() + + done = False + truncated = False + reward_total = 0.0 + steps=0 + f.write('new----------------------------------------') + while not done and not truncated: + action = agent.compute_single_action(state) + action_array.append(action) + + next_state, reward, done, truncated, info = env.step(action) + f.write(str(action)+'\n') + f.write(str(reward)+'\n') + f.write(str(done)+'n') + print(next_state) + print(action) + print(reward) + print(done) + reward_total += reward + + rollout_num.append(reward) + next_states.append(next_state) + + state = next_state + + norm_ideal_spec = state[spec_num:spec_num+spec_num] + ideal_spec = unlookup(norm_ideal_spec, norm_spec_ref) + if done == True: + reached_spec += 1 + obs_reached.append(ideal_spec) + action_arr_comp.append(action_array) + action_array = [] + pickle.dump(action_arr_comp, open("action_arr_test", "wb")) + else: + obs_nreached.append(ideal_spec) #save unreached observation + action_array=[] + + f.write('done----------------------------------------') + rollouts.append(rollout_num) + + print("Episode reward", reward_total) + rollout_steps+=1 + + #if out is not None: + #pickle.dump(rollouts, open(str(out)+'reward', "wb")) + pickle.dump(obs_reached, open("opamp_obs_reached_test","wb")) + pickle.dump(obs_nreached, open("opamp_obs_nreached_test","wb")) + + f.write("Specs reached: " + str(reached_spec) + "/" + str(len(obs_nreached))) + print("Specs reached: " + str(reached_spec) + "/" + str(len(obs_nreached))) + + print("Num specs reached: " + str(reached_spec) + "/" + str(1)) + +if __name__ == "__main__": + evaluate_model() From a0f7b9f147505d66ab9e5819b61d7b2ec8683f66 Mon Sep 17 00:00:00 2001 From: Harsh Khandeparkar Date: Sun, 3 Dec 2023 18:24:18 +0530 Subject: [PATCH 41/41] feat: made checkpoint directory an argument in eval --- openfasoc/MLoptimization/eval.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openfasoc/MLoptimization/eval.py b/openfasoc/MLoptimization/eval.py index 1d0b794dc..1a2164837 100644 --- a/openfasoc/MLoptimization/eval.py +++ b/openfasoc/MLoptimization/eval.py @@ -16,7 +16,7 @@ def unlookup(norm_spec, goal_spec): spec = -1*np.multiply((norm_spec+1), goal_spec)/(norm_spec-1) return spec -def evaluate_model(): +def evaluate_model(checkpoint_dir: str = "./last_checkpoint"): specs = yaml.safe_load(Path('newnew_eval_3.yaml').read_text()) #training set up @@ -47,7 +47,7 @@ def evaluate_model(): args = parser.parse_args() env = Envir(env_config=env_config) - agent = PPO.from_checkpoint("./last_checkpoint") + agent = PPO.from_checkpoint(checkpoint_dir) norm_spec_ref = env.global_g spec_num = len(env.specs)