From 3b26b9787bbe6cb5b32f2e0a06992f4b743a59a4 Mon Sep 17 00:00:00 2001 From: Sam Wolk <36545842+szvsw@users.noreply.github.com> Date: Mon, 12 Feb 2024 15:52:03 -0500 Subject: [PATCH] merge campus-decarb (#2) * streamlit cloud hack * path hack print * add logger * streamlit hack * add supabase dev * add power plants * add power plants and fix seeding and migrations * create npm scripts --- .gitignore | 2 + .vscode/settings.json | 16 +- README.md | 8 + data/5out.hdf | Bin 0 -> 360744 bytes data/mit_buildings_info.csv | 133 +++++++ data/seed.py | 112 ++++++ environment.yml | 6 + frontend/app.py | 230 ++++++++++- lib/models.py | 100 +++++ notebooks/.gitkeep | 0 notebooks/supa.ipynb | 295 -------------- package-lock.json | 347 +++++++++++++++++ package.json | 13 + requirements.txt | 3 +- requirements/base-requirements.txt | 3 +- supabase/.gitignore | 4 + supabase/config.toml | 159 ++++++++ .../20240211215240_remote_schema.sql | 368 ++++++++++++++++++ .../20240212191502_add_description_cols.sql | 5 + .../20240212193422_add_year_available.sql | 13 + ...20240212195858_add_desc_to_pp_scenario.sql | 3 + supabase/seed.sql | 0 22 files changed, 1509 insertions(+), 311 deletions(-) create mode 100644 data/5out.hdf create mode 100644 data/mit_buildings_info.csv create mode 100644 data/seed.py create mode 100644 environment.yml create mode 100644 notebooks/.gitkeep delete mode 100644 notebooks/supa.ipynb create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 supabase/.gitignore create mode 100644 supabase/config.toml create mode 100644 supabase/migrations/20240211215240_remote_schema.sql create mode 100644 supabase/migrations/20240212191502_add_description_cols.sql create mode 100644 supabase/migrations/20240212193422_add_year_available.sql create mode 100644 supabase/migrations/20240212195858_add_desc_to_pp_scenario.sql create mode 100644 supabase/seed.sql diff --git a/.gitignore b/.gitignore index 97a2b06..6747a97 100644 --- a/.gitignore +++ b/.gitignore @@ -157,3 +157,5 @@ cython_debug/ # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. #.idea/ + +node_modules/ \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 904a08b..8caf490 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,12 +1,18 @@ { "[python]": { - "editor.defaultFormatter": "ms-python.black-formatter", - "editor.formatOnSave": true, "editor.codeActionsOnSave": { "source.organizeImports": "explicit" - } + }, + "editor.defaultFormatter": "ms-python.black-formatter", + "editor.formatOnSave": true }, - "isort.args": ["--profile", "black"], + "isort.args": [ + "--profile", + "black" + ], "jupyter.notebookFileRoot": "${workspaceFolder}", - "python.envFile": "${workspaceFolder}/.env" + "python.envFile": "${workspaceFolder}/.env", + "terminal.integrated.env.windows": { + "PYTHONPATH": "${workspaceFolder}" + } } diff --git a/README.md b/README.md index 0acd1e0..0a6002c 100644 --- a/README.md +++ b/README.md @@ -2,3 +2,11 @@ Materials for MIT Campus Decarbonization Study ![Technology Overview](./figures/technology-overview.drawio.png) + +## Setup + +1. Install npm, conda (maybe docker) +2. npm i +3. npm run conda-setup +4. npx supabase init (?? maybe) && npx supabase login && npx supabase link +5. npm run db-refresh diff --git a/data/5out.hdf b/data/5out.hdf new file mode 100644 index 0000000000000000000000000000000000000000..3db47fb18d94cf8f701223ff07303d748e5ed904 GIT binary patch literal 360744 zcmeF(2V53Azc2cLAVpCWMNyR46-5#3H6SPm0s^Ag2nq^~qgMe%5?vGWlm_GRZtMc^=j{54V;U=B3O@_GD^G zjELp$#k|?C+^Om?v`LG?t($CV{=_)n6qF&@{{asC3Dj)bIYgsauRfIdZ53% zJ3-F8^7G8yOw!BdEScsd{LBBVYQV$Y#V`AWJLH~qUMoGB+s^VTBOyF7IXWrvcbm&j z^T^xq|Ii}2?e(wix*(yyOU!QH*}W#vGte6im{{S!vfDcj>-UirBvt>E&y=+Ab_oc` z&6nMy^7>6Hf8Tc5C-_HxQ4>%L{0)9K_;W`#}DB{5=vvduMMc zNb=$e|2eKtctT=iY)sDmBfDzz`nhAx+I4F>{W;F;cU*W(_t>z=n4URjofG%x`f3;0 z(jog={ZS7lIdKUIu?e^W*~jKSeg>t<+3OGd!BcE zdAHv`&a2Sx{rqkZxcmu`;Yr!oEqi|^FfT44yk~NBXad#?=cMIs$h)5DIZq_y_3yp? zG0TV2v$I;^zwDYc&RsV&H2htHY3`jWpTXFIIZ-Ny+<8&t&z`a~zu9>#{EzzikK2ih zzrRZ`V*bdVebxW@{n@Ezo$TEpKmF~0_Bru86J`NEzHSDn>71h^MC2{xW%!Gz*56ZA zr{Aalm#u%SR?S_UQ|~{{S28!>syhF1zCTL-@41xyd6+#J804HsPTS3E!+*YxIsKxg zw@Z+(|G)1?dH0<^K4%O3?iWc3p)rYZv5DbfIp<$2dtbj7|7c&?t9iBfN4v>xv8E&{ zGUj*W-}S@nUj5hnF*&!7-~A~2T=L5G$xYAeH!S!1cKCfP+2v&SlI;9{^vl}+6aDg! zIMd(f8}s{yp7>Ai19``jyW9UV9b;p{se5#I_w4%+b&pSujO!g9lk{&%kxBijdrWvj z&)g4z-}ybm!b78}cWh`_A`M86i;M10T_O``U~CeSTg1jj;|7@<^`GbW2oFvAOMdUj zo)Jlj|MVFCe3JjCAHO&C_H}U!pe~;N#M#f?-?Po1&n|m8CzX1-xx4&1^Ix;&tQ#8T zH#IL+k;Ogx|}* zQ~%wCbo|?^o|F35%(efv+~28x%}Q$jZMiwAf6eUlx8?p${cBd@^ta{ar2aLt^WT>H zJN2(w|JC|`--7>ozx{WO=)aKgpSAw~LQ((9`v21!`0Mjp_Pav%l;+#UV3KI!kh5Rzv;jB90Q&3>=T3CVeG{pasfD))UVuY{Ze|NK7nWYd42_o@Hg z?Ztpt{H{mS+!x}%)_;+l>LPjm`90Pe+x~gI>)d+plY3?VRqxp~kXIRhT<8Dy?^W47 zAg^4n@cu#BV^@E?_gVd=f9B=LxgOd5^Y7yS*Z0eyLODl3bI6_lt6%0+L|(tl8I8}r zzW+EbkUeIWJ>~i5ewlqo|L6U(Pj0=x{vDq;`&Yf^)WrXn{qpa|JN_7-$Qeid<8w1- zL?pXE{#{)5c7h4$!X&t+kUY0B&d78 z4xI``<#MZLKzg_BtJzSc46ic}a=)zu7D8f{sU(z#ikU2jY=C>4l~6nNnXv|n=czZ= zL%RIB-DapdoA%fSdGUtpc0zJK^6efdN6%|;0J7$1h8%+W)3>8Xq1aTTz)46WyRt>e{^zP!BVy`UQ$c4Pw4S`YvMIFR0ee{c4yW@nNS~en`rE z8*K(`UA)DOU$`b09lY*_F__cqrHKe;ul7^gLcXGPLSPsxw0$Nv&y~-g~G?T zPB^3{Vn75`2RErG$ot*P9}7wCqHPkOeCj$Q8M38`H~K-{akTK|*f$ zGIALtd&_J}g)-6S<7&ui3~jO=>dcM9H$kybpWF&*P?5qrp(^CsZV%)q66WuRL@c|f zploop%2CMP7{#1`dUf4xr=jT9Xywe(wR!Q1ltB>Oop-L;glk zJYE%WK;}(Kz2*KS7Y0P>^vIq9EP9J2D2U_-7mAA-6C6F$t0fUQPNz zIe*abfsh5RKRE>If*FN|LvgH7yHSu1X+D1}RQ2NSO@KU0R+$3Hs!P46L&*)d&4SFv z`Rg30FLh@Npcp@M^kPU`96P%ds&5~Prb520a`0+MdbeM^4$4YnA8v#!V^{U9P|toE zzXJ;2QoD9TYU=fKA5?0fn}WRmy75OKak_KyIF!#UN}PslS+g$ZpzajA>>?D!IkbLT9cn`{rGdwaOi#R&@G1T7870^%7%;AmW1r>g*T<4UPBt#LD9YTkn)h)b~{=Ls;kq@t3f{Lh+hpzTE3rM z3(B7r?>IrWvt5OHP{)prYzRfwog14#dhhXv=1|Qo*`x*J{+`2ILQ-JBNlz$`tSQt6 zvO%{3{h+Q>aDD(3FPq#8f;6>vm5xw#UDUe^0^%oKIc>>4%?t zS3$MDmfA|bgm^@IDRAj2BbsH?e0KTzj3&R{B_jY2av2@ z@a7Seq37y9gRIog!7rh{T=VE_C?aPy_76y6%2zNjLwx0c zNF&JZj@W1db;`C6=1}-OY+MLZGwb0+pgPp@WHHDG^et2p66aNcrJ;PDKCdif%gyeU zgSvC0DwUup9@V=lr03^vtq#@bvtMdL-uy>%CrCa!jIImirmkljKo&WrXcMT*sSeGd zxcPdKE2J~ZJ#>f4%fGrO7Zb*C?s$(cX=A*)&3EePsI?&E`@Sls7gXGlA& zwB}G*rg!cR`6<(7Js=t0@M$EJje6DU4cWVS$#GDxJ+n6vim>kneIYI5;4uKIv@Vke zLq2)(RRKw>gQZ47`74W$fovCDIUee`wl60^QEj;MG)V7n=|2;yc@GYzKps#m|9nUa zx_d8z@@Vq(C6EnHOHU&5)OzSARPsmrf7f1?9MJ zNA^PITEqMx)L%RM9fo4-q}j(HjXrSuBvci%%AbY&j$PyhNM`$OybPt!un%dFnQUo% z1L}kKhuwyvpVi5`kk)o9^Z=@-Nr8_bU%F!6Q%E{p(=VX3GO6+!va|Jjzk_;Y#MX~c zG@bk93#1=UHU9zChOeWDIpTX(KbsE{+PSC+l<5;Ym_s&g{~`;hJzr&7LSblEy%?l> zed9|&l_++Wg1pA&A7vnUc&|k{C>ItTUlFpP78k2PT`0-AIus|CcdiMkNLyMPss{O= z)`9#@y;=<*S<^GQF_hir>}>{F=~D)-P+$4d${mV{_LDszb?}T>N!LEhd|MG)4^_#n%^_-0oCCm-jR?Gbe$dzNu9*>SSVjC zE1L+}imPFLpzdP4wm%fs_1+AE^g@sN0;(}7gGWHlP97Nz$(PS&h{4ZBP|irguVq`by=!kc=?ueE`bFb+;aZ?0xu`qfoD#-TWjJ;U`9&fwb)B zGv}eYR<-D5$fpE%NQ1;<{GxOy$==LcknMhMe;4X_+xYuX*tgmF5Yh*Oe>{O|{)QGW zAP>AdE(;P1%ZqQJJjSd)LN+A6^B1V=EnWH@imb~|enGk_U#)xv5YOu*=ZD-Te6JZK zmuDGRKso++D@({)e41nh^|vZlt)bY~p;ReIdynH~psKVdl|r8J>_r7gQc62lfzsEz zzddB8gAY1Dt=1dYhN6FlR~<;53Qw;O)wAa5jUZnZSGE}>otK2UKw0ea8aK$!8NO)+ z^(g21UQjd(8|(w=rNYb>sFxb>#Mi{g4l`us#Gy z-DaJSLisXg=?TbE7e6@-b=QkE&qGndAo&uc7i;gm3f0(d2I-Ky%xHBBlCMW5Wk9** z{gr!=MO7;G5b6p+{0S7dN2flAbk@!nub^u4#OW>M`EB}tfaIX(!Ou|k9bo(&GRL)E zzo33{Ynov}#4jnBZVYM1re)2bDjE}35b`sN))aqC#& zLeXQo8HLpDh;Id`uD_dA8S<$WZ&!oFvt4-yC=EtOI6}5(#|CGp6CS^>2SxRgjT=Fl z=`pM+R15l_V34<4W8nr#p<4m1pgdk+UTesPHqmXMuHUhEvcM?tZ@!lD>RV*)edp{hK}J{j`6+vEB{ zGUw5bfl&ID_%Q@BGmjR-p+3}a+$bmptiCW7Qs;ump5KI9g;55Pi8?` zd|}PGkexr5v;gYSKldz#qIoTYWsrUjX_X4qrm2%wLmqkP$~s8OzqQ!}<<0VZD`YbQ zQg=Y@HS)!7D2%o{?T2*#!+r{?Wb1=RAg|fV_yi=6`+A**a`CEZ=OF8F-hw4|k@}D8!!r z=*obikPl9uTO5*lX1XMluNqdig=}T7XgjDw=5HwvMai?DD?xhcd$Vd#jdK`P19I1{ zXKF$6ZE_K3D7PMLUk|eA*9#j$U9ntd6DaPqwP%pd9v;^MDxa-8T0(A;`P~x|RjfrD zDEqmO^MkB*p9=v{KTR#(9*U*cJ9UJ#lj+hfP+2v6!XZB!Su+fhQS*{|LfQ1po?eiB z{6=D+-cX}eJQO{2KC_<7B`_7m=tga(mE^VYN%eM-F*Q0iu{!y zL(;W=^fM@}BeuMR?82PSuc01us@Z!e*w>MtApK&0<||a2I~Dl}d9R7>4GJN?!v2Lu zP~Lj^zyz|HW$g<bX;jjp158p3#CjfULLaG z<((=)T_kNuRVYpyKdBDshiOEJ3lxDxyf~y5 zuG6|hbu8g}56FisE7J>-`d7R6hBC`&O&nya>b_2dn)j&J7Ydt{K?5MYeB$t6sK$Rb z9R_)eYQ7^O`5ruL43yi(-x?2D@4e+FLtW`b&uLI(*lw5!X-b>-DNy+iX*3^l(~V*g zB!})EUjk)+ON$kdIk^O^g8Etf+_g|FTY7f`q@Ax++5%NEqv-9BpR2QF7bK&@KktRI z+3aQqA^UWE&iioO3PC;5OxcynEZj4)a0rKg49$bdR>v^?nQ0B9Zy8+og z?;W?HP8$6EE))(MTpvLCC}Zp+s1_Bz@D%d)toTbvEaN-9hVtZ+CGQ{`cKPu~s2k?1 z`4x({&PhKYT^qKC6h?gaS;Po(+v6=wAW8c;(HzQ2Rjyb-*0O_55vYHT4Jii2&fP0Y zKpOY#c`2x>mUb!&`8}_G*`P+DKxDn6oZ;yuMKJ4xH5I2 zdMUd%fIRim>c)_S7`|=>WeMkcu8>{qKFA&Fu`>^QK;d%C)Em;TAAEeF+ERIzKjcyE zZ?%J@;@EP*P~P6vvomC~o~{ppx=pF~-JrdkB0n1w`SuZ*)U_|Bq)0vJv|jN zyAPH#p}t^!O4Nxyw zJ9aY^?QWmn25BLS;=7!Q?lO+ zsQf$+WI=8=z~~($hu5_J2<3oVQ@=pwT=4pLsGm0}Lo5-$ym$9}kak(LIzLp!FJzfP ze*RZo3rNN|4zh%@dFWv)$UaXqEdlkW!#<^;h@)@IgR)NHO z$9j7xjUK;qfNXz>Mzx_%_7HWTsM-H`eMld#F4!2V#W($%LEfRjTo*`+G`Z^r<*DdO z9*_-R807_Zqw|}6pm_K5Q(H*a)oRubsxUsX1LS3du)D5y$6&8j= z{VU)>1QfeQR*Qx-etT>zRMj4BPk{Ws_4i~*=C^X~4`o2Vv4bEhxcdB1sE^(#HUf&l z=AA}ETCeevaZtUAdOQ*Gl?xoELfnWFXFyr<=kD2%U8+guK|L;{!G|e;`t`XW^b##4Qiih2&ZKwG&V-H7j!lvQCY3&d$%e3hAh`bNoQIAZ+=$oFo2_ZgC;%!c2gtWjM2 zg6yIDal;~rU)ZN$ekg)g`kO&oIDJk*s7{#PEeyG6Sjh^KhP|S!p?ouMvkhcx&U~_k zy4&}r6pGRgBP&39wae+sP)(d{X%D&k!5{}ner7FjgmMRc;0#%8+iLZpt};Bf5fpmM z_NI`|eejJz)wY8-6CD{4_jQ#d23`$m`WdvkjI!}y(dh?{qF;Mh6P%;713Rzu~p}J+aq95cl z{hkkmq|LC}L!mU@(swvy2k!451$7@Qqj6Bwa%(*i(kDq%r$8lFT$>Jg@HN}nkQ6oP zJ{QW<^;a)|Y(zxXVyGL>t-B10_ooJ?Lc0Fzq18}@S2tY`dD+fBn;^M9apqPir|iGE z12T_SbPv?TuIGLzcKfbZkS2(CN1(Fb-0%eC5AF>;4atI{$In3-*rMPi$SjiluR?un z`JC%e3`xtl32FWOl`^2psuy(+@>M-IXF?J>=hI^-ZB8|P4%y`|BVIv0-v0C(C|Y!~ z`~d0q2|=Hs+O}`OH^_Uxy#EuD%4Mq=7Dar9PpmOyDMPoLLhZZhTLCCc@3|C)^iYwp zMWO2NdcHX1PKm{AAbGy5qb-!nu1Y(|IvYPO4|TD64wa!e*CVkSq@z=I*MO?o$zQb~ z|Mc128In!aCf0*8qT}U;kd>QIvMJOz_I71ZOn7erkLiWhAb$h56xlHW{Mf-$nT_CkwW*Z9C$t&H$ARlJ5x+f%!>SpzV@@;tC z7|7Pn9vBaG_Y;Sbps@XH(ht(Ksy+juniM>92;?ot-y8LxEhMo zd{OHl4XLwvBUB~AKW%~h;;g1SAQ^Xj#BL~EKAqYJ+1DzT3hFH#f{s8DHEzLiNGtBS ze+sJG&#In-d{*h$i;(zuZ@&U%{=wg_L3VJx%T1{JW{kN5g=69K8q%lDi)BK!B(CFQ z$U82P&mgh7{OBc=XAB+QKsM4j@jcW{!ghax;={~eUm@La%>5@+Jw8q_utL0DmCHtu zq_;0=3gy(XT?;_wxqEpbs12SyD+0xyQniain&{QHBvjQ0?Jo^^=DK`#kSx68Ssu!E zg{D@5tWfi7RiQo}Yg+?~p|V>oNE=*QF1d-a97xWVQDP@J#*X)vT? zx-}gJRr47mMneAi$f+@qY<^#O0+f-Jf+j;&K4`%-sBezGKNE@>JFCut)cZ-ye5j0U zwl9Kwzvs6lkn|bgvI5GQYsajD?D4I0YoT6Tu-HZ@IyCLL1=1ohaywL~7CqVp`S1%h z_CeB^Bp!tFo#XDqkgW^-bqwmT>F%eXD05`OSxB$FyL17n$rVdpfxK0_uGb)5K$hQt za@US$w;_vv?5LrxR#lLK{>dI?I+0U z_3ri+>Q@U_{eWWS`B$VE;`y&SMo^V>9B2ahC4R^plJV0_3PI_5xJ?nrzP+7M4C<{F zZkB)|I*^uzw9=>^WudyWeO)=oXFqyd5fa}L4XZ+F;xV*3WUAk>no##!UBC&7+Be(Q zh4h*EoCZ)WZJf~<@=nnen?q7;VJ}xG&z{@l4%w)mA3dOMTC1ry6dyxI_(HmI>M4Jy zdLAkq1UY@%E*O#<!3#HENvjMWX z#rJQ9x^2sR+o3S;>$wZkBP*xug=%1W+5yPxnAskN1}y3T)f25RfG zbuK`0;roEgkdAdYlm->+YH|beFO%EchGfgZ8F!)V_4>wr$SRbhkD$KQw#QQ_W)5HX z0@5~H-)2E&oY~+VBOT~3vOqU_|tPk%`K?(Z7}rKwdu0okDzo+F^{ zpEPAO6izGB#zFc#t@I?QmgVm@74pvYSIvN=c*LvOP@bDpXC7puPYqZIb+fNZLh;Go zWI3dpI<;8|Rm8*@YalPT|HgVqZoahJ4CVB)J+?vS<-2Yt)cM5QJy7i1)ZhT5$@hjF zg36)jv7?YbaxHKYlEsN_&p_FJdCGanEYt2>g8HO!#WW~})$5fGX``N-Zb9`n-Z9Npp4qvr9Na8Uo2|` z^=;c{O`(|8#?b{*pCNtRpvu2-Un|HD-Zk`sq@Sgy50s8BQ`$oIG(Ig5>Lp7{cYvbf zmC#O*S{beC3e}l9uRo!>9bQQ1__XCIJe&;2Ft~rjNVP z52~qq>;^&Z`8<3mB!;%@hC{i>`|T*m5(hUJ2X*xgLncCznQ?Rqqzeldm;qHg)^;}J zh2m4@LULlsodr-1y<9;;)*xT6Wl+C%-joW(>adTiA?-G+$$F?t9Us04@+%)tZiQrG zmBKrrbnDP=4`e^a&fgF9_TBds6fw`L9EG$>>6jBx-Sygb8uB@VzMg}m?Rs_zO0$g7 zS0OuG=-hRv2Q;_31%-25a0a9=jQ>s$VD5QPX8CpYC^NxoNz239g5i{x6Ojo*YoQfs7wa11(2&XqZdQc|JK>1P}VMJl?vIjCc&$r zUfO%{Iw(3VdbknNVi&4!h3f3D_#Kdsa@@5Wl4hYl_d)q_nwx@by%E^u98}XrExQPL>m5(8K$7oqt?N+kEz##DWJw#ln^EA!~U4Fx9aP`X#RQ3$f10d_^9-Z3(~I25tl*Or8|>Z3QMq0-h3>>!`pYDjrV z{QDiP1f}_E^J>Vf7dwVL2#FQY2dgKEWs$cB)2J-4w5Bqe@+Xb$Ct znoU|jHa28TGYwpQIO!hh&Laa1xZkjTZNXtZ3B30Z^ZwUwsG^ zBhJPTgS5$yog<-o@9=XBse4wDc5BV6dwM|=0j>Q z;^`u&c5kh<6!L`3ku*Fm+FqEs#I3I^B^n3qPP}?}Dvrt^_lK.DE6KfvUy9>DM6to|S$B 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

uH^_tt9;y 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 ydg%BcOCd(wG>7H_*Azr~uAt+8t&;JLAvi1Q0 literal 0 HcmV?d00001 diff --git a/data/mit_buildings_info.csv b/data/mit_buildings_info.csv new file mode 100644 index 0000000..a3bf21d --- /dev/null +++ b/data/mit_buildings_info.csv @@ -0,0 +1,133 @@ +,BUILDING_NUMBER,BUILDING_NAME_LONG,BUILDING_GROUP_LEVEL1,CLUSTER_NUM,BUILDING_TYPE,BUILDING_USE,SITE,CAMPUS_SECTOR,YEAR_CONST_BEGAN,YEAR_OCCUPIED,LATITUDE_WGS,LONGITUDE_WGS,OWNERSHIP_TYPE,BUILDING_HEIGHT,NUM_OF_ROOMS,EXT_GROSS_AREA,ASSIGNABLE_AREA,NON_ASSIGNABLE_AREA,BLDG_SRV,CIRCULAT,CLASSRMS,GENERAL,HEALTH,LABS,MECHANIC,OFFICES,RESIDENT,SPECIAL,STUDY,SUPPORT,UNCLASS,USEABLE_AREA,STRUCT_AREA,LEVEL3_CATEGORY,LEVEL2_CATEGORY,PI_CONNECTION,METER_STATUS,TotalUsable,SumZoneTypes +0,1,Henry L Pierce Engineering Laboratory,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,MAIN GROUP,1913.0,1917.0,42.3580859,-71.09235723,OWNED,81.4,403.0,116038.74,75943.9,29171.29,2154.71,19795.43,13107.48,147.58,0.0,28105.06,7221.15,34476.15,0.0,0.0,0.0,107.63,0.0,105115.19,10923.55,Chilled Water,Produced,Y,Chilled Water Only,105115.19,105115.19 +1,10,Richard Cockburn MacLaurin Buildings (10),Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,MAIN GROUP,1913.0,1916.0,42.35967738,-71.09201647,OWNED,149.2,567.0,144463.46,85571.66,42925.24,1476.08,25779.02,5249.28,2419.93,0.0,8922.65,15670.14,46632.49,0.0,0.0,21986.92,360.39,0.0,128496.9,15966.56,Chilled Water,Produced,Y,Chilled Water Only,128496.9,128496.9 +2,11,Homberg Building,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,MAIN GROUP,1927.0,1928.0,42.35952201,-71.09277267,OWNED,72.5,189.0,26777.38,19086.24,4860.08,14.0,3277.76,0.0,214.59,0.0,0.0,1568.32,16056.74,0.0,0.0,0.0,2814.91,0.0,23946.32,2831.06,Chilled Water,Produced,N,No Individual Metering,23946.32,23946.32 +3,12,Lisa T. Su Building,Non-CUP,Office & Mixed Use,ACADEMIC,AER,MIT,MAIN GROUP,,,,,OWNED,0.0,376.0,237776.9,94638.32,116713.3,2078.16,46431.53,0.0,0.0,0.0,82613.41,68203.61,10676.35,0.0,0.0,0.0,1348.56,0.0,211351.62,26425.28,Chilled Water,Produced,,,211351.62,211351.62 +4,13,Vannevar Bush Building,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,MAIN GROUP,1963.0,1965.0,42.35994386,-71.09255152,OWNED,69.1,578.0,183539.92,95795.57,72485.61,2522.57,42250.99,2578.22,0.0,0.0,60757.54,27712.05,31324.56,0.0,0.0,0.0,741.04,394.21,168281.18,15258.74,Chilled Water,Produced,Y,Fully Metered,168810.17,168810.17 +5,14,Charles Hayden Memorial Library,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,MAIN GROUP,1948.0,1951.0,42.35918261,-71.089304,OWNED,70.4,92.0,142706.51,89203.75,48792.34,3336.98,30325.77,4197.1,1078.3,0.0,5865.97,15129.59,32809.91,0.0,353.65,42976.29,1922.53,0.0,137996.09,4710.42,Chilled Water,Produced,Y,Chilled Water & Electric,137996.09,137996.09 +6,16,Dorrance Building,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,MAIN GROUP,1950.0,1952.0,42.36043478,-71.09059277,OWNED,122.9,374.0,116006.44,57891.59,46843.43,2877.56,28142.23,9231.58,315.74,0.0,26841.44,15823.64,21165.45,0.0,0.0,0.0,337.38,0.0,104735.02,11271.42,Chilled Water,Produced,Y,Steam Only,104822.52,104822.52 +7,17,Wright Brothers Wind Tunnel,Non-CUP,Lab Dominant,ACADEMIC,AER,MIT,MAIN GROUP,1937.0,1939.0,42.360113,-71.09349326,OWNED,22.0,14.0,6074.7,4861.22,263.41,29.75,232.4,0.0,0.0,0.0,4861.22,1.26,0.0,0.0,0.0,0.0,0.0,0.0,5124.63,950.07,Electricity,Produced,Y,No Individual Metering,10750.53,10750.53 +8,18,Camille Edouard Dreyfus Building,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,MAIN GROUP,1967.0,1969.0,42.36006975,-71.08982131,OWNED,82.5,529.0,133732.1,75653.17,41215.37,1290.79,21045.71,0.0,0.0,0.0,64331.73,18878.87,11321.44,0.0,0.0,0.0,0.0,0.0,116868.54,16863.56,Chilled Water,Produced,Y,Fully Metered,116875.37,116875.37 +9,2,THE SIMONS BUILDING,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,MAIN GROUP,1913.0,1916.0,42.35881273,-71.09018269,OWNED,82.6,384.0,133168.22,73699.9,43053.58,2369.95,26166.93,9760.72,0.0,0.0,22451.38,14516.7,41173.38,0.0,0.0,0.0,314.42,0.0,116753.48,16414.74,Chilled Water,Produced,Y,Chilled Water & Electric,116753.48,116753.48 +10,24,Building 24,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,MAIN GROUP,1941.0,1941.0,42.3606665,-71.09201464,OWNED,84.1,316.0,78022.39,48984.22,22154.34,1363.82,16328.18,6835.5,1011.35,0.0,8946.74,4462.34,29619.57,0.0,0.0,0.0,2571.06,0.0,71138.56,6883.83,Chilled Water,Produced,Y,Fully Metered,71138.56,71138.56 +11,26,Karl Taylor Compton Laboratories,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,MAIN GROUP,1955.0,1957.0,42.36085795,-71.09115294,OWNED,78.7,387.0,133479.58,80363.1,42700.18,2919.16,24971.12,17120.44,0.0,0.0,27643.78,14809.9,35219.3,0.0,0.0,0.0,379.58,0.0,123063.28,10416.3,Chilled Water,Produced,Y,Fully Metered,122979,122979 +12,3,Richard Cockburn MacLaurin Buildings (3),Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,MAIN GROUP,1913.0,1916.0,42.35900694,-71.09239741,OWNED,85.5,544.0,160694.2,104693.45,40630.76,2517.73,28624.15,5999.82,0.0,0.0,47613.55,9488.88,49092.05,0.0,0.0,682.9,1305.13,0.0,145324.21,15369.99,Chilled Water,Produced,Y,Chilled Water Only,145324.21,145324.21 +13,31,Sloan Laboratories For Aircraft & Automotive Engineering,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,MAIN GROUP,1928.0,1928.0,42.36037362,-71.09306201,OWNED,46.2,334.0,76205.74,52864.96,15926.53,1099.15,5288.7,1958.52,181.44,0.0,31746.86,9538.68,18502.69,0.0,0.0,0.0,211.87,263.58,68791.49,7414.25,Chilled Water,Produced,Y,Fully Metered,69513.85,69513.85 +14,32,Ray and Maria Stata Center,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,MAIN GROUP,2004.0,2004.0,42.36159672,-71.09056854,OWNED,140.0,1316.0,463889.51,286099.28,121910.35,7446.09,73834.0,20289.12,35710.12,0.0,35095.63,40630.26,155127.18,0.0,0.0,3720.96,36156.27,0.0,408009.63,55879.8799999999,Chilled Water,Produced,Y,Fully Metered,408009.63,408009.63 +15,32P,Ray and Maria Stata Center Garage,Non-CUP,Lab Dominant,SERVICE,GAR,MIT,MAIN GROUP,2003.0,2003.0,,,OWNED,0.0,33.0,239353.28,219250.33,10269.82,0.0,2432.82,0.0,0.0,0.0,0.0,7837.0,924.19,0.0,0.0,0.0,218326.14,0.0,229520.15,9833.12999999998,Electricity,Produced,N,No Individual Metering,229520.15,229520.15 +16,33,Daniel Guggenheim Aeronautical Laboratory,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,MAIN GROUP,1927.0,1928.0,42.36017838,-71.09374587,OWNED,56.5,155.0,47128.95,32180.64,11482.2,692.91,8859.81,2845.47,620.0,0.0,9227.7,1929.48,19487.47,0.0,0.0,0.0,0.0,0.0,43662.84,3466.11,Chilled Water,Produced,Y,Chilled Water Only,43662.84,43662.84 +17,34,EG&G Education Center,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,MAIN GROUP,1982.0,1983.0,42.36113825,-71.09195128,OWNED,81.3,62.0,25951.44,14472.14,10198.28,45.5,6745.54,6854.96,0.0,0.0,3972.19,3407.24,3644.99,0.0,0.0,0.0,0.0,0.0,24670.42,1281.02,Chilled Water,Produced,Y,Chilled Water Only,24670.42,24670.42 +18,35,Sloan Laboratory,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,MAIN GROUP,1950.0,1952.0,42.36038118,-71.09402814,OWNED,80.3,238.0,68012.32,41629.94,18920.47,1686.19,13112.98,2889.95,0.0,0.0,17723.55,4121.3,21016.44,0.0,0.0,0.0,0.0,0.0,60550.41,7461.91,Chilled Water,Produced,Y,Chilled Water & Steam,60550.41,60550.41 +19,36,Fairchild Buildings (36),Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,MAIN GROUP,1971.0,1973.0,42.36143722,-71.09166758,OWNED,117.4,604.0,144920.44,72220.21,56625.06,5039.96,29362.67,4459.09,781.9,0.0,29862.45,22222.43,36982.89,0.0,0.0,0.0,133.88,0.0,128845.27,16075.17,Chilled Water,Produced,Y,Chilled Water & Steam,128845.27,128845.27 +20,37,Ronald E McNair Building,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,MAIN GROUP,1966.0,1969.0,42.36068424,-71.09324745,OWNED,89.7,411.0,102777.46,55558.61,32301.67,1741.83,15466.92,2691.41,0.0,0.0,21366.61,15092.92,31168.9,0.0,0.0,167.0,164.69,0.0,87860.28,14917.18,Chilled Water,Produced,Y,Chilled Water & Steam,87860.28,87860.28 +21,38,Fairchild Buildings (38),Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,MAIN GROUP,1971.0,1973.0,42.36107393,-71.0923498,OWNED,91.4,321.0,84000.79,56499.53,19288.99,57.45,7228.62,558.61,0.0,0.0,38823.35,12002.92,16513.28,0.0,0.0,0.0,604.29,0.0,75788.52,8212.26999999999,Chilled Water,Produced,Y,Chilled Water & Steam,75788.52,75788.52 +22,39,Stanley Gordon Brown Building,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,MAIN GROUP,1966.0,1968.0,42.36085666,-71.09273098,OWNED,91.1,249.0,76639.87,39376.56,30723.19,674.07,13039.41,0.0,0.0,0.0,30639.96,17009.71,8736.6,0.0,0.0,0.0,0.0,0.0,70099.75,6540.12,Chilled Water,Produced,Y,Fully Metered,70099.75,70099.75 +23,4,Richard Cockburn MacLaurin Buildings (4),Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,MAIN GROUP,1913.0,1916.0,42.35944306,-71.09108651,OWNED,79.7,495.0,162821.54,97550.05,47334.68,4010.57,30380.58,19215.12,203.83,0.0,32303.32,12943.53,42209.19,0.0,0.0,386.05,639.03,2593.51,144884.73,17936.81,Chilled Water,Produced,Y,Chilled Water Only,144930.25,144930.25 +24,41,Building 41,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,MAIN GROUP,1915.0,1917.0,42.36076007,-71.0941603,OWNED,61.2,107.0,26148.19,20055.87,4407.76,761.53,2948.28,0.0,0.0,0.0,13104.32,697.95,6812.88,0.0,0.0,0.0,138.67,0.0,24463.63,1684.56,Chilled Water,Produced,N,No Individual Metering,24463.63,24463.63 +25,42_43_N16_E40,Utility Production Buildings,CUP,Mechanical,,,MIT,,,,,,OWNED,,159.0,126283.75,13420.16,101941.31,104.49,6748.29,0.0,554.75,0.0,261.86,100034.04,4674.160000000001,0.0,0.0,0.0,7929.389999999999,42.0,120348.98,5934.77,Chilled Water,Produced,Only E40,No Individual Metering,119811.84,119853.84 +26,44,44,Non-CUP,Support Areas & Parking,ACADEMIC,AER,MIT,MAIN GROUP,1938.0,1939.0,42.36160679,-71.09247074,OWNED,29.5,51.0,16118.61,11649.47,2715.53,325.66,1010.49,0.0,0.0,0.0,7095.65,1379.38,4553.82,0.0,0.0,0.0,0.0,0.0,14365.0,1753.61,Electricity,Produced,N,No Individual Metering,, +27,46,Brain & Cognitive Sciences Complex,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,MAIN GROUP,2003.0,2005.0,42.36232777,-71.09164294,OWNED,136.4,1419.0,418299.52,220004.09,151401.78,7057.88,83107.28,2214.84,757.11,0.0,125104.03,61236.62,70017.65,322.23,14991.43,0.0,6061.11,535.69,371405.87,46893.65,Chilled Water,Produced,Y,Fully Metered,373192.06,373192.06 +28,48,Ralph M Parsons Laboratory For Water Resources & Hydrodynamics,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,MAIN GROUP,1949.0,1951.0,42.36243249,-71.09066524,OWNED,64.0,156.0,57255.46,38949.64,11466.55,887.29,7675.46,2195.3,0.0,0.0,22902.59,2903.8,13054.04,0.0,0.0,0.0,797.71,0.0,50416.19,6839.27,Chilled Water,Produced,Y,Steam Only,50416.19,50416.19 +29,5,Pratt School Of Naval Architecture And Marine Engineering,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,MAIN GROUP,1919.0,1920.0,42.35870876,-71.09292347,OWNED,70.7,276.0,80942.35,55084.19,16638.18,1118.12,12045.79,4264.01,1811.86,0.0,15280.25,3474.27,33728.07,0.0,0.0,0.0,0.0,0.0,71722.37,9219.98,Chilled Water,Produced,Y,Chilled Water Only,71722.37,71722.37 +30,50,Walker Memorial,Non-CUP,Lab & Mixed Use,SERVICE,STAC,MIT,MAIN GROUP,1916.0,1917.0,42.35936241,-71.0883196,OWNED,80.5,201.0,74063.57,46679.01,20815.11,1770.71,13777.62,0.0,27484.93,0.0,0.0,5266.78,11284.11,0.0,2941.06,0.0,4968.91,0.0,67494.12,6569.45,Electricity,Produced,Y,Chilled Water & Electric,67494.12,67494.12 +31,51,Walter C Wood Sailing Pavilion,Non-CUP,Mechanical,SERVICE,STAC,MIT,MAIN GROUP,1936.0,1937.0,42.35851706,-71.08773035,OWNED,21.3,24.0,5889.33,4450.4,909.69,32.08,532.86,0.0,0.0,0.0,0.0,344.75,214.12,0.0,4236.28,0.0,0.0,0.0,5360.09,529.24,Electricity,Produced,N,No Individual Metering,5360.09,5360.09 +32,54,Cecil And Ida Green Building,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,MAIN GROUP,1962.0,1964.0,42.36032385,-71.08932613,OWNED,275.0,654.0,129448.04,68640.0,44148.72,1627.56,28140.77,7409.62,0.0,0.0,19195.05,14380.39,42014.91,0.0,0.0,0.0,20.42,0.0,112788.72,16659.32,Chilled Water,Produced,Y,Fully Metered,113326.22,113326.22 +33,56,Uncas A Whitaker Building,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,MAIN GROUP,1963.0,1965.0,42.36069953,-71.0898625,OWNED,118.8,471.0,143940.24,78380.88,50573.95,641.74,23326.22,6874.0,395.71,0.0,46858.59,26605.99,19891.37,0.0,1345.39,0.0,3015.82,0.0,128954.83,14985.41,Chilled Water,Produced,Y,Steam Only,128944.58,128944.58 +34,57,MIT Alumni Pool,Non-CUP,Mechanical,SERVICE,STAC,MIT,MAIN GROUP,1939.0,1940.0,42.36114229,-71.09014001,OWNED,41.1,52.0,39121.04,22725.98,10516.52,204.55,2774.07,0.0,116.99,0.0,0.0,7537.9,149.66,0.0,22459.33,0.0,0.0,0.0,33242.5,5878.54,Electricity,Produced,N,No Individual Metering,33242.5,33242.5 +35,62_64,Alumni House,Non-CUP,Residential,,,MIT,,,,,,OWNED,,675.0,150586.63,98620.43,36524.08,7905.610000000001,23192.34,0.0,12185.62,0.0,0.0,5426.13,644.3499999999999,84792.19,0.0,0.0,998.27,0.0,135144.51,15442.12000000001,Electricity,Produced,Y,Steam & Electric,135144.51,135144.51 +36,66,Ralph Landau Building,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,MAIN GROUP,1973.0,1976.0,42.36092016,-71.08902925,OWNED,74.3,322.0,133709.64,71189.31,46958.45,2560.65,26710.23,5398.95,1217.61,0.0,39387.27,17687.57,24506.34,0.0,0.0,0.0,679.14,0.0,118147.76,15561.88,Chilled Water,Produced,Y,Fully Metered,118192.74,118192.74 +37,68,David H. Koch Biology Building,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,MAIN GROUP,1991.0,1994.0,42.36162167,-71.08863856,OWNED,104.8,960.0,260390.37,155141.39,81485.49,3395.48,52340.18,750.76,1834.5,0.0,120204.95,25749.83,21144.66,0.0,10820.38,0.0,386.14,0.0,236626.88,23763.49,Chilled Water,Produced,Y,Fully Metered,236623.33,236623.33 +38,6C,PDSI,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,MAIN GROUP,2007.0,2007.0,42.35967294,-71.09083617,OWNED,92.0,123.0,51288.87,16131.89,27823.8,628.83,17644.77,0.0,0.0,0.0,8373.34,9550.2,7472.32,0.0,0.0,0.0,286.23,0.0,43955.69,7333.18,Chilled Water,Produced,Y,Chilled Water & Steam,45442.29,45442.29 +39,6_6B,George Eastman Research,Non-CUP,Lab & Mixed Use,,,MIT,,,,,,OWNED,,316.0,91926.37,54532.3,24921.54,244.59,17651.48,1605.16,0.0,0.0,20964.51,7025.47,31129.7,0.0,0.0,0.0,832.93,0.0,79453.84,12472.53,Chilled Water,Produced,Only 6,Chilled Water Only,#VALUE!,#VALUE! +40,76,David H. Koch Institute For Integrative Cancer Research,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,MAIN GROUP,2005.0,2010.0,42.36229582,-71.08927563,OWNED,0.0,932.0,367688.6,205329.56,124326.6,5146.07,62525.49,0.0,7133.71,0.0,142978.59,56655.04,35059.14,0.0,11406.13,0.0,8751.99,0.0,329656.16,38032.44,Chilled Water,Produced,Y,Fully Metered,329669.09,329669.09 +41,7_7A,William Barton Rogers Buildings,Non-CUP,Lab & Mixed Use,,,MIT,,,,,,OWNED,,401.0,119055.36,65380.47,39133.380000000005,796.45,25877.16,950.01,2977.13,0.0,14039.92,12459.77,29113.03,0.0,0.0,16691.43,1608.95,0.0,104513.85,14541.51,Chilled Water,Produced,Only 7,Chilled Water Only,104359.99,104359.99 +42,8,Building 8,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,MAIN GROUP,1913.0,1916.0,42.35999279,-71.09086392,OWNED,64.0,253.0,66165.06,36941.33,21070.43,1386.26,13873.54,1146.17,16.5,0.0,14741.25,5810.63,20519.83,0.0,0.0,0.0,517.58,0.0,58011.76,8153.3,Chilled Water,Produced,Y,Chilled Water Only,58011.76,58011.76 +43,9,Samuel Tak Lee Building,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,MAIN GROUP,1966.0,1967.0,42.35974993,-71.09356175,OWNED,83.9,277.0,77414.0,38796.37,28428.83,1757.25,18453.34,8162.06,2174.68,0.0,2778.65,8218.24,24491.32,0.0,906.54,0.0,283.12,0.0,67225.2,10188.8,Chilled Water,Produced,Y,Fully Metered,67225.2,67225.2 +44,Briggs Field Operating,Briggs Field Operating,Non-CUP,Support Areas & Parking,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Electricity,Produced,,,#VALUE!,#VALUE! +45,E1,Gray House (Formerly President's House),Non-CUP,Lab & Mixed Use,RESIDENT,AER,MIT,EAST,1913.0,1917.0,42.3596025,-71.08696429,OWNED,52.0,139.0,18642.53,11190.61,4967.95,275.94,3395.22,0.0,4810.28,0.0,0.0,1296.79,1632.65,3099.31,0.0,264.12,1384.25,0.0,16158.56,2483.97,Chilled Water,Produced,N,Chilled Water & Electric,16158.56,16158.56 +46,E14,Building E14,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,EAST,,,42.36046359,-71.08733249,OWNED,0.0,360.0,173875.21,77946.22,80319.92,3062.62,32041.13,1574.07,1535.18,0.0,50568.44,45216.17,23084.26,0.0,0.0,0.0,1184.27,0.0,158266.14,15609.07,Chilled Water,Produced,Y,Fully Metered,158266.14,158266.14 +47,E15,Wiesner Building,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,EAST,1982.0,1984.0,42.36083844,-71.08763489,OWNED,68.5,463.0,120331.42,79233.13,32098.06,2030.13,17313.64,5310.45,6833.04,0.0,34458.14,12754.29,32257.97,0.0,0.0,175.61,197.92,0.0,111331.19,9000.23,Chilled Water,Produced,Y,Fully Metered,111331.19,111331.19 +48,E17,Seely G Mudd Building,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,EAST,1932.0,1975.0,42.36148439,-71.08788625,OWNED,82.8,326.0,80477.33,51159.04,21083.46,2179.81,7995.01,1475.04,0.0,0.0,8476.33,10908.64,38427.16,0.0,2530.82,0.0,249.69,0.0,72242.5,8234.82999999999,Chilled Water,Produced,Y,No Individual Metering,72242.5,72242.5 +49,E18,Horace Sayford Ford Building (E18),Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,EAST,1920.0,1964.0,42.361767,-71.08779281,OWNED,88.3,408.0,115069.29,70945.79,34660.11,1209.09,15274.65,0.0,568.96,0.0,18591.89,18176.37,37053.07,0.0,2721.39,0.0,12010.48,0.0,105605.9,9463.39,Chilled Water,Produced,Y,No Individual Metering,111617.28,111617.28 +50,E19,Horace Sayford Ford Building (E19),Non-CUP,Lab & Mixed Use,SERVICE,AER,MIT,EAST,1920.0,1964.0,42.36212904,-71.08795245,OWNED,81.0,735.0,150661.42,100290.65,39382.78,3163.58,22228.92,585.21,1290.76,0.0,11579.41,13990.28,78753.1,0.0,0.0,0.0,7992.61,89.56,139673.43,10987.99,Chilled Water,Produced,Y,Steam & Electric,139673.43,139673.43 +51,E2,70 AMHERST,Non-CUP,Special,RESIDENT,DHOA,MIT,EAST,1913.0,1916.0,42.35995565,-71.08686701,OWNED,63.7,312.0,64847.33,35759.29,18752.08,2693.94,12254.9,0.0,3625.92,0.0,289.69,3803.24,450.48,30862.04,0.0,144.0,387.16,0.0,54511.37,10335.96,Chilled Water,Produced,Y,Chilled Water & Electric,54511.37,54511.37 +52,E23,Health Services,Non-CUP,Lab & Mixed Use,SERVICE,AER,MIT,EAST,1979.0,1982.0,42.36102212,-71.08663216,OWNED,71.1,574.0,103338.41,63196.25,27193.31,1248.32,17218.92,0.0,2412.2,29200.81,81.54,8726.07,30987.86,0.0,0.0,0.0,513.84,0.0,90389.56,12948.85,Chilled Water,Produced,Y,No Individual Metering,90389.56,90389.56 +53,E25,Whitaker College Of Health Sciences & Technology,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,EAST,1979.0,1982.0,42.36166876,-71.08694971,OWNED,92.3,565.0,156676.36,90476.81,47723.7,2137.71,30255.58,4562.75,0.0,0.0,46981.23,15330.41,33798.89,0.0,3626.77,0.0,1125.1,382.07,138200.51,18475.85,Chilled Water,Produced,Y,No Individual Metering,139358.64,139358.64 +54,E38,BUILDING E38,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,EAST,1920.0,1968.0,,,OWNED,0.0,341.0,124448.22,46734.26,45653.55,3523.02,26354.9,3872.26,1858.28,0.0,1208.58,15775.63,38319.12,0.0,0.0,0.0,1476.02,0.0,92387.81,32060.41,Chilled Water,Produced,Y,Chilled Water & Steam,92387.81,92387.81 +55,E40,The Muckley Building,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,EAST,1930.0,1969.0,42.36116319,-71.08485302,OWNED,64.5,517.0,106747.05,69809.38,26466.46,2508.54,10582.49,2255.57,73.42,0.0,1776.86,13375.43,63175.37,0.0,0.0,0.0,2528.16,0.0,96275.84,10471.21,Chilled Water,Produced,Y,Fully Metered,96275.84,96275.84 +56,E51,Jack C Tang Center For Management Education,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,EAST,1944.0,1980.0,42.36055421,-71.08449242,OWNED,60.0,302.0,107990.76,52916.5,42550.6,3009.96,21865.36,27898.25,2415.5,0.0,0.0,17675.28,21258.03,0.0,0.0,0.0,1344.72,0.0,95467.1,12523.66,Chilled Water,Produced,Y,Fully Metered,95467.1,95467.1 +57,E52,MORRIS & SOPHIE CHANG BUILDING,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,EAST,1938.0,1952.0,42.36073592,-71.08367668,OWNED,97.4,576.0,161974.43,95849.81,47622.65,4109.67,30520.29,2228.46,10326.83,0.0,0.0,12992.69,83123.0,0.0,0.0,0.0,171.52,0.0,143472.46,18501.97,Chilled Water,Produced,Y,Fully Metered,143472.46,143472.46 +58,E53,Grover M Hermann Building,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,EAST,1964.0,1965.0,42.36118818,-71.08359227,OWNED,72.2,290.0,84984.92,53347.04,25085.55,2025.07,13592.74,574.88,0.0,0.0,0.0,9467.74,28587.28,0.0,0.0,24010.08,174.8,0.0,78432.59,6552.32999999999,Chilled Water,Produced,Y,Chilled Water & Steam,78432.59,78432.59 +59,E55,E55,Non-CUP,Support Areas & Parking,RESIDENT,DHOA,MIT,EAST,1965.0,1967.0,42.36173608,-71.08390876,OWNED,272.8,466.0,172309.33,120517.81,28758.1,345.93,22095.17,0.0,3206.29,0.0,0.0,6317.0,480.37,116679.8,0.0,0.0,151.35,0.0,149275.91,23033.42,Electricity,Produced,Y,Steam Only,, +60,E60,Arthur D Little Building,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,EAST,1917.0,1994.0,42.36117731,-71.08217568,OWNED,,141.0,30130.11,12961.15,12858.51,1280.76,8111.08,0.0,0.0,0.0,0.0,3466.67,12875.72,0.0,0.0,0.0,85.43,0.0,25819.66,4310.45,Chilled Water,Produced,Y,Fully Metered,25819.66,25819.66 +61,E62,Building E62,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,EAST,,,42.36134747,-71.08265495,OWNED,0.0,604.0,213581.39,113768.08,76842.54,4095.74,57146.61,23672.82,15877.94,0.0,0.0,15600.19,74121.76,0.0,0.0,0.0,95.56,0.0,190610.62,22970.77077,Chilled Water,Produced,Y,Fully Metered,190610.62,190610.62 +62,E62P,E62 Garage,Non-CUP,Lab Dominant,SERVICE,GAR,MIT,EAST,,,42.36134747,-71.08265495,OWNED,,41.0,53611.11,38285.6,11295.24,481.0,3973.17,0.0,0.0,0.0,0.0,6841.07,182.53,0.0,0.0,0.0,38103.07,0.0,49580.84,4030.269226,Electricity,Produced,,,49580.84,49580.84 +63,E94,BUILDING E94,Leased Buildings,Office,ACADEMIC,AER,MIT,EAST,,,,,LEASED,0.0,104.0,15506.61,14101.34,205.19,0.0,0.0,0.0,0.0,0.0,0.0,205.19,14101.34,0.0,0.0,0.0,0.0,0.0,14306.53,1200.08,Electricity,Purchased,,,14306.53,14306.53 +64,KS,KS,FSILGs,Support Areas & Parking,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Electricity,Purchased,,,#VALUE!,#VALUE! +65,Main Campus Area,Main Campus Area,Non-CUP,Support Areas & Parking,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Electricity,Purchased,,,, +66,N10,High Voltage Research Laboratory,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,NORTH,1964.0,1965.0,42.3608633,-71.09545096,OWNED,33.0,53.0,10084.86,8101.7,637.89,134.82,131.54,0.0,0.0,0.0,6962.46,371.53,1139.24,0.0,0.0,0.0,0.0,0.0,8739.59,1345.27,Electricity,Produced,N,No Individual Metering,8739.59,8739.59 +67,N4,Albany Street Parking Garage,Non-CUP,Lab Dominant,SERVICE,GAR,MIT,NORTH,,1966.0,42.36203429,-71.09278036,OWNED,56.3,36.0,143032.14,129868.34,5780.48,2162.59,2848.78,0.0,0.0,0.0,0.0,769.11,0.0,0.0,0.0,0.0,129868.34,0.0,135648.82,7383.32,Electricity,Produced,N,No Individual Metering,135648.82,135648.82 +68,N51,Building N51,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,NORTH,1924.0,1964.0,42.36228442,-71.09762771,OWNED,50.9,126.0,44980.93,32692.59,8432.78,1210.99,5570.18,2301.57,11317.51,0.0,4806.77,1651.61,13926.33,0.0,0.0,0.0,340.41,0.0,41125.37,3855.56,Electricity,Purchased,N,No Individual Metering,41125.37,41125.37 +69,N52,Building N52,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,NORTH,1924.0,1964.0,42.36227273,-71.09718823,OWNED,56.8,320.0,103874.44,71730.92,21208.21,923.84,14050.5,2674.29,24879.47,0.0,14390.09,6233.87,28206.81,0.0,0.0,0.0,1580.26,0.0,92939.13,10935.31,Electricity,Purchased,N,No Individual Metering,92939.13,92939.13 +70,N57,Building N57,Non-CUP,Lab & Mixed Use,SERVICE,AER,MIT,NORTH,1922.0,1964.0,42.3630114,-71.09882964,OWNED,78.2,54.0,46882.29,41521.21,3021.22,0.0,2436.87,0.0,0.0,0.0,0.0,584.35,1752.79,0.0,0.0,37423.88,2344.54,0.0,44542.43,2339.86,Electricity,Purchased,N,No Individual Metering,44542.43,44542.43 +71,N9,Superconducting Generator Test Facility,Non-CUP,Lab Dominant,ACADEMIC,AER,MIT,NORTH,,1978.0,42.36095321,-71.09519377,OWNED,32.7,16.0,5882.04,5345.17,160.86,0.0,0.0,0.0,0.0,0.0,5280.64,160.86,64.53,0.0,0.0,0.0,0.0,0.0,5506.03,376.009999999999,Electricity,Produced,N,No Individual Metering,5506.03,5506.03 +72,NE45,300 Technology Square,Leased Buildings,Lab & Mixed Use,ACADEMIC,AER,MIT,NORTHEAST,,,,,LEASED,0.0,25.0,8049.06,4444.31,137.96,0.0,0.0,0.0,0.0,0.0,3444.84,137.96,999.47,0.0,0.0,0.0,0.0,0.0,4582.27,3466.79,Electricity,Purchased,,,4582.27,4582.27 +73,NE46,400 Technology Square,Leased Buildings,Lab & Mixed Use,ACADEMIC,AER,MIT,NORTHEAST,,,,,LEASED,0.0,42.0,9215.4,8138.76,239.41,0.0,0.0,0.0,0.0,0.0,3127.6,239.41,5011.16,0.0,0.0,0.0,0.0,0.0,8378.17,837.23,Electricity,Purchased,,,#VALUE!,#VALUE! +74,NE47,500 Technology Square,Leased Buildings,Lab & Mixed Use,ACADEMIC,AER,MIT,NORTHEAST,,,42.36346458,-71.09258101,LEASED,148.0,267.0,73631.09,63249.26,2218.01,0.0,0.0,0.0,0.0,0.0,35055.93,2218.01,28193.33,0.0,0.0,0.0,0.0,0.0,65467.27,8163.81999999999,Electricity,Purchased,,,65467.27,65467.27 +75,NE48,700 Technology Square,Leased Buildings,Office,ACADEMIC,AER,MIT,NORTHEAST,,,42.3640312,-71.09272747,LEASED,84.4,141.0,18156.59,15217.35,797.4,0.0,750.73,0.0,395.91,0.0,205.03,46.67,14112.74,0.0,0.0,402.46,101.21,0.0,16014.75,2141.84,Electricity,Purchased,,,15994.23,15994.23 +76,NE49,600 Technology Square,Leased Buildings,Office,SERVICE,AER,MIT,NORTHEAST,,,42.36339002,-71.09311895,LEASED,84.9,651.0,93671.28,87560.08,647.75,0.0,0.0,0.0,119.79,0.0,0.0,647.75,87440.29,0.0,0.0,0.0,0.0,0.0,88207.83,5463.45000000001,Electricity,Purchased,,,91951.31,91951.31 +77,NW10,Edgerton House,Non-CUP,Residential,RESIDENT,DHOA,MIT,NORTHWEST,1922.0,,42.36032016,-71.09813729,OWNED,56.5,261.0,132529.78,82590.37,31474.13,864.17,24541.91,0.0,3937.21,0.0,0.0,6068.05,512.77,77693.07,0.0,0.0,447.32,0.0,114064.5,18465.28,Electricity,Purchased,N,No Individual Metering,114064.5,114064.5 +78,NW12_NW12A,Nuclear Reactor Laboratory,Non-CUP,Lab & Mixed Use,,,MIT,,,,,,OWNED,,168.0,50695.060000000005,35326.59,9761.49,827.45,6695.7,1155.63,0.0,0.0,21732.45,2238.34,10360.98,0.0,0.0,0.0,2077.53,0.0,45088.08,5606.98,Chilled Water,Produced,N,No Individual Metering,45087.77,45087.77 +79,NW13,Building NW13,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,NORTHWEST,,1963.0,42.3598849,-71.09736187,OWNED,28.3,144.0,61937.11,46938.1,9916.4,622.1,7283.31,0.0,0.0,0.0,40738.43,2010.99,3522.25,0.0,0.0,0.0,2677.42,0.0,56854.5,5082.61,Chilled Water,Produced,N,No Individual Metering,56854.5,56854.5 +80,NW14,Francis Bitter Magnet Laboratory (NW14),Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,NORTHWEST,1913.0,1962.0,42.35963208,-71.09789884,OWNED,75.7,402.0,144673.42,101485.34,34011.23,2493.97,20447.62,1541.11,0.0,0.0,77479.91,11069.64,20389.43,0.0,0.0,0.0,2074.89,0.0,135496.57,9176.85000000001,Chilled Water,Produced,Y,No Individual Metering,135469.26,135469.26 +81,NW15,Francis Bitter Magnet Laboratory (NW15),Non-CUP,Lab Dominant,ACADEMIC,AER,MIT,NORTHWEST,1961.0,1962.0,42.35934903,-71.0982566,OWNED,34.2,12.0,16137.29,14355.21,695.29,0.0,0.0,0.0,0.0,0.0,14355.21,695.29,0.0,0.0,0.0,0.0,0.0,0.0,15050.5,1086.79,Chilled Water,Produced,N,No Individual Metering,15083.87,15083.87 +82,NW16,Plasma Science And Fusion Center (NW16),Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,NORTHWEST,1980.0,1981.0,42.3600321,-71.09871532,OWNED,34.0,171.0,50148.39,31109.74,14770.8,900.49,11410.3,0.0,0.0,0.0,12421.45,2460.01,17803.84,0.0,0.0,0.0,245.19,639.26,45880.54,4267.85,Electricity,Purchased,N,No Individual Metering,45880.54,45880.54 +83,NW17,Plasma Science And Fusion Center (NW17),Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,NORTHWEST,,,42.35985638,-71.09914244,OWNED,33.8,152.0,45542.35,28512.58,12693.63,916.0,9025.91,0.0,0.0,0.0,13451.36,2751.72,14913.37,0.0,0.0,0.0,147.85,0.0,41206.21,4336.14,Electricity,Purchased,N,No Individual Metering,41206.21,41206.21 +84,NW21,Plasma Science And Fusion Center (NW21),Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,NORTHWEST,1899.0,1980.0,42.3590636,-71.09914629,OWNED,43.6,145.0,124096.66,64826.08,44998.01,788.6,7145.28,0.0,0.0,0.0,57197.75,37064.13,7050.86,0.0,0.0,0.0,577.47,0.0,109824.09,14272.57,Chilled Water,Produced,Y,Chilled Water Only,109824.09,109824.09 +85,NW22,Plasma Science And Fusion Center (NW22),Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,NORTHWEST,,1992.0,42.35963862,-71.09972313,OWNED,33.7,158.0,49002.27,39630.57,5649.71,642.22,2983.95,0.0,0.0,0.0,20612.01,2023.54,18609.94,0.0,0.0,0.0,408.62,0.0,45280.28,3721.99,Electricity,Purchased,N,No Individual Metering,45280.28,45280.28 +86,NW23,BUILDING NW23,Non-CUP,Office,SERVICE,(NULL),MIT,NORTHWEST,1925.0,2016.0,,,OWNED,0.0,312.0,51156.85,39138.86,7114.11,1362.42,2332.49,0.0,125.16,0.0,0.0,3419.2,39013.7,0.0,0.0,0.0,0.0,0.0,46252.97,4903.88,Electricity,Purchased,N,Fully Metered,46252.97,46252.97 +87,NW30,BUILDING NW30,Non-CUP,Residential,RESIDENT,DHOA,MIT,NORTHWEST,1904.0,1958.0,42.35864725,-71.09997287,OWNED,75.0,253.0,85812.19,50037.19,23321.62,588.17,17124.49,0.0,3854.54,0.0,0.0,5608.96,744.69,43169.45,0.0,383.86,1884.65,0.0,73358.81,12453.38,Chilled Water,Produced,Y,Chilled Water & Steam,73358.81,73358.81 +88,NW32,BUILDING NW32,Non-CUP,Lab & Mixed Use,ACADEMIC,(NULL),MIT,NORTHWEST,1918.0,,,,OWNED,0.0,97.0,30052.65,18918.81,6731.79,1328.91,4855.09,0.0,0.0,0.0,0.0,547.79,0.0,0.0,0.0,0.0,0.0,18918.81,25650.6,4402.05,Electricity,Purchased,N,No Individual Metering,25650.6,25650.6 +89,NW35,Ashdown House,Non-CUP,Residential,RESIDENT,DHOA,MIT,NORTHWEST,2008.0,2008.0,42.35879785,-71.10143928,OWNED,60.0,578.0,252747.43,158044.01,57551.98,772.65,41835.4,0.0,2306.19,0.0,0.0,14943.93,759.62,154635.17,0.0,0.0,343.03,0.0,215595.99,37151.44,Chilled Water,Produced,Y,Chilled Water & Steam,215595.99,215595.99 +90,NW36,BUILDING NW36,Non-CUP,Lab Dominant,SERVICE,OTH,MIT,NORTHWEST,,,,,OWNED,0.0,4.0,2045.25,1559.82,209.87,45.0,0.0,0.0,0.0,0.0,0.0,164.87,0.0,0.0,0.0,0.0,1559.82,0.0,1769.69,275.56,Electricity,Purchased,,,1769.69,1769.69 +91,NW61,Random Hall,Non-CUP,Residential,RESIDENT,DHOA,MIT,NORTHWEST,1899.0,1968.0,42.36184456,-71.0982858,OWNED,48.3,201.0,39469.53,25201.69,7821.4,1142.95,5548.38,0.0,8086.23,0.0,0.0,1130.07,225.6,16600.05,0.0,0.0,289.81,0.0,33023.09,6446.44,Electricity,Purchased,N,No Individual Metering,33023.09,33023.09 +92,NW86,70 Pacific Street Dormitory,Non-CUP,Residential,RESIDENT,DHOA,MIT,NORTHWEST,2001.0,2002.0,42.35972041,-71.10221874,OWNED,106.4,723.0,362686.82,251186.9,63816.25,1022.13,52510.35,0.0,19809.13,0.0,0.0,10283.77,2924.89,223831.64,0.0,1481.43,3139.81,0.0,315003.15,47683.67,Electricity,Purchased,Y,No Individual Metering,315003.15,315003.15 +93,Northwest Campus Area,Northwest Campus Area,Non-CUP,Support Areas & Parking,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Electricity,Purchased,,,, +94,OC19_ABCDEFGHJKLMNQ,Bates LINAC,Off Campus Buildings,Lab & Mixed Use,,,MIT,,,,,,OWNED,,269.0,188458.83000000005,134759.33000000002,17193.03,828.4,11178.55,0.0,0.0,0.0,120600.75,5186.080000000001,14158.579999999998,0.0,0.0,0.0,0.0,0.0,151952.36000000002,36506.47000000001,Electricity,Purchased,,,150036.92,150036.92 +95,OC22,Westford Optics Facility (Haystack),Off Campus Buildings,Lab Dominant,ACADEMIC,AER,HAY,OFFCAMPUS,,,42.61185877,-71.48467394,OWNED,0.0,3.0,881.78,794.16,0.03,0.0,0.0,0.0,0.0,0.0,764.13,0.03,30.03,0.0,0.0,0.0,0.0,0.0,794.19,87.59,Electricity,Purchased,,,, +96,OC23,Wallace Geophysical Observatory,Off Campus Buildings,Lab Dominant,ACADEMIC,AER,HAY,OFFCAMPUS,,1970.0,42.61006145,-71.48988791,OWNED,0.0,6.0,2034.38,1617.25,0.0,0.0,0.0,0.0,0.0,0.0,1499.97,0.0,117.28,0.0,0.0,0.0,0.0,0.0,1617.25,417.13,Electricity,Purchased,,,1617.25,1617.25 +97,Parking Areas,Parking Areas,Non-CUP,Support Areas & Parking,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Electricity,Purchased,,,#VALUE!,#VALUE! +98,W1,Fariborz Maseeh Hall,Non-CUP,Residential,RESIDENT,DHOA,MIT,WEST,1900.0,1939.0,42.35761763,-71.0935107,OWNED,74.5,558.0,189941.11,107518.76,43591.64,1509.19,33098.63,0.0,14094.47,0.0,0.0,8983.82,11622.36,81285.63,0.0,0.0,516.3,0.0,151110.4,38830.71,Electricity,Produced,Y,Steam Only,151110.4,151110.4 +99,W11,Religious Activities Center,Non-CUP,Lab & Mixed Use,SERVICE,STAC,MIT,WEST,1936.0,1967.0,42.35826109,-71.09353578,OWNED,16.4,63.0,13590.41,7922.29,4152.3,539.28,2766.4,0.0,4160.51,0.0,0.0,846.62,3761.78,0.0,0.0,0.0,0.0,0.0,12074.59,1515.82,Electricity,Purchased,N,No Individual Metering,12074.59,12074.59 +100,W15,MIT Chapel,Non-CUP,Lab & Mixed Use,SERVICE,STAC,MIT,WEST,1954.0,1955.0,42.35832688,-71.09412494,OWNED,33.2,26.0,5339.35,2815.91,1959.77,105.2,986.24,0.0,2607.98,0.0,0.0,868.33,0.0,0.0,0.0,0.0,207.93,0.0,4775.68,563.67,Chilled Water,Produced,Y,No Individual Metering,4775.68,4775.68 +101,W16,Kresge Auditorium,Non-CUP,Lab & Mixed Use,SERVICE,STAC,MIT,WEST,1953.0,1956.0,42.35813383,-71.09505791,OWNED,50.2,95.0,42145.98,20406.21,18201.3,1389.86,10146.47,11335.4,728.89,0.0,0.0,6664.97,6790.5,0.0,817.8,0.0,733.62,0.0,38607.51,3538.47,Chilled Water,Produced,Y,Fully Metered,38607.51,38607.51 +102,W20,Julius Adams Stratton Student Center,Non-CUP,Lab & Mixed Use,SERVICE,STAC,MIT,WEST,1963.0,1965.0,42.3590424,-71.09477464,OWNED,75.0,435.0,183162.0,115330.5,56425.62,3039.62,35924.34,0.0,68329.06,0.0,4307.33,17461.66,31052.56,0.0,267.54,9075.06,1689.4,609.55,171756.12,11405.88,Chilled Water,Produced,Y,Fully Metered,171756.12,171756.12 +103,W2_W4,W2_W4,Non-CUP,Residential,,,MIT,,,,,,OWNED,,629.0,138588.88,72039.78,46162.86,7698.049999999999,29630.12,0.0,7264.5,0.0,0.0,8834.689999999999,2545.1800000000003,61000.08,0.0,235.08,994.94,0.0,118202.64,20386.24,Electricity,Produced,Only W2,No Individual Metering,118202.64,118202.64 +104,W31,David Flett du Pont Athletic Gymnasium,Non-CUP,Mechanical,SERVICE,STAC,MIT,WEST,1902.0,1957.0,42.35963776,-71.09516824,OWNED,52.6,146.0,71443.5,53401.65,9744.51,1054.2,6287.56,1493.72,3973.37,0.0,0.0,2402.75,10545.3,0.0,37322.78,0.0,66.48,0.0,63146.16,8297.34,Electricity,Produced,N,Steam Only,63146.16,63146.16 +105,W32,David Flett du Pont Athletic Center,Non-CUP,Mechanical,SERVICE,STAC,MIT,WEST,1958.0,1959.0,42.35936841,-71.09513369,OWNED,36.1,90.0,46578.52,26366.32,15073.3,868.16,8999.7,0.0,0.0,0.0,0.0,5205.44,3058.89,0.0,23307.43,0.0,0.0,0.0,41439.62,5138.9,Electricity,Produced,N,No Individual Metering,41439.62,41439.62 +106,W33,Rockwell Athletic Cage,Non-CUP,Mechanical,SERVICE,STAC,MIT,WEST,1947.0,1948.0,42.35920175,-71.09597193,OWNED,22.8,7.0,34427.72,32379.24,594.57,0.0,0.0,0.0,0.0,0.0,0.0,594.57,72.19,0.0,32070.31,0.0,236.74,0.0,32973.81,1453.91,Electricity,Produced,N,No Individual Metering,32973.81,32973.81 +107,W34,Johnson Athletics Center,Non-CUP,Mechanical,SERVICE,STAC,MIT,WEST,1979.0,1980.0,42.35859572,-71.09652993,OWNED,37.9,74.0,109397.67,82217.92,20743.24,603.13,9472.45,0.0,0.0,0.0,0.0,10667.66,758.36,0.0,79009.39,0.0,2450.17,0.0,102961.16,6436.51,Chilled Water,Produced,Y,Chilled Water Only,102961.16,102961.16 +108,W35,Zesiger Sports & Fitness Center,Non-CUP,Mechanical,SERVICE,STAC,MIT,WEST,2000.0,2002.0,42.35871563,-71.09575051,OWNED,65.7,220.0,122080.04,76369.95,36482.32,2135.89,21172.24,0.0,326.56,0.0,0.0,13174.19,7680.01,0.0,67475.67,0.0,887.71,0.0,112852.27,9227.76999999999,Chilled Water,Produced,Y,Chilled Water Only,112852.27,112852.27 +109,W41,W41,Non-CUP,Support Areas & Parking,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Electricity,Purchased,,,#VALUE!,#VALUE! +110,W45,W45,Non-CUP,Support Areas & Parking,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Electricity,Purchased,N,No Individual Metering,, +111,W46,New Vassar Residence Hall,Non-CUP,Lab & Mixed Use,RESIDENT,DHOA,MIT,WEST,,,,,OWNED,0.0,515.0,177607.67,85047.66,69862.78,9851.76,47493.6,0.0,18920.44,0.0,0.0,12517.42,1403.26,55094.67,1098.03,2931.85,5599.41,0.0,154910.44,22697.23,Chilled Water,Produced,,,154910.44,154910.44 +112,W5,Ida Flansburgh Green Hall,Non-CUP,Residential,RESIDENT,DHOA,MIT,WEST,1901.0,1970.0,42.35691893,-71.09510104,OWNED,53.2,106.0,19010.96,9825.59,5593.55,1411.69,3501.9,0.0,287.27,0.0,0.0,679.96,25.4,9336.41,0.0,0.0,176.51,0.0,15419.14,3591.82,Electricity,Produced,N,No Individual Metering,15419.14,15419.14 +113,W51,Burton-Conner House,Non-CUP,Residential,RESIDENT,DHOA,MIT,WEST,1927.0,1948.0,42.35596941,-71.09812434,OWNED,72.0,690.0,167922.77,104357.88,38420.93,8640.93,23623.94,0.0,9067.24,0.0,633.83,6156.06,3340.31,89432.54,0.0,1217.46,666.5,0.0,142778.81,25143.96,Electricity,Produced,N,No Individual Metering,142339.26,142339.26 +114,W51C,405 Memorial Drive - Pi Phi,Non-CUP,Residential,RESIDENT,DHOA,MIT,WEST,,,42.35618661,-71.09724199,OWNED,0.0,86.0,17286.8,10693.24,3958.47,32.49,3387.66,0.0,2285.18,0.0,0.0,538.32,15.86,8150.44,0.0,241.76,0.0,0.0,14651.71,2635.09,Steam,Produced,N,No Individual Metering,14651.71,14651.71 +115,W53_W53A_W53B_W53C_W53D,J B Carr Indoor Tennis Facility Buildings,Non-CUP,Mechanical,,,MIT,,,,,,OWNED,,15.0,27387.85,25848.58,540.0699999999999,60.31,94.01,0.0,0.0,0.0,0.0,385.75,299.88,0.0,25548.7,0.0,0.0,0.0,26388.65,999.2,Electricity,Produced,N,No Individual Metering,26388.65,26388.65 +116,W59,Heinz Building,Non-CUP,Lab & Mixed Use,SERVICE,AER,MIT,WEST,1915.0,1979.0,42.35810548,-71.09955089,OWNED,33.5,157.0,36051.39,24915.19,6977.47,1183.93,4441.78,3077.49,434.19,0.0,0.0,1351.76,20956.26,0.0,0.0,0.0,447.25,0.0,31892.66,4158.73,Chilled Water,Produced,N,No Individual Metering,31892.66,31892.66 +117,W61,Frank S MacGregor House,Non-CUP,Residential,RESIDENT,DHOA,MIT,WEST,1968.0,1970.0,42.35546182,-71.09954663,OWNED,167.5,138.0,168261.25,96219.08,42357.74,8022.66,20532.07,0.0,10128.89,0.0,0.0,13803.01,12717.37,72950.4,0.0,0.0,422.42,0.0,138576.82,29684.43,Electricity,Produced,Y,Steam & Electric,138576.82,138576.82 +118,W64,Building W64,Non-CUP,Lab & Mixed Use,SERVICE,OTH,MIT,WEST,2013.0,2013.0,,,OWNED,0.0,62.0,13367.83,9321.57,2817.74,0.0,2336.55,0.0,8487.1,0.0,0.0,481.19,834.47,0.0,0.0,0.0,0.0,0.0,12139.31,1228.52,Electricity,Purchased,Y,No Individual Metering,12139.31,12139.31 +119,W7,Everett Moore Baker House,Non-CUP,Residential,RESIDENT,DHOA,MIT,WEST,1947.0,1949.0,42.35669783,-71.09579218,OWNED,76.4,492.0,133099.42,76877.31,42711.09,5633.69,28707.16,0.0,14523.37,0.0,433.89,8370.24,2320.76,57311.4,0.0,0.0,2287.89,0.0,119588.4,13511.02,Electricity,Produced,N,No Individual Metering,119588.4,119588.4 +120,W70,New West Campus Houses,Non-CUP,Support Areas & Parking,RESIDENT,DHOA,MIT,WEST,1974.0,1976.0,42.35516109,-71.10053232,OWNED,46.9,508.0,126147.84,60920.98,40018.4,,,,,,,,,,,,,,,,Electricity,Produced,Y,Steam & Electric,100939.38,#VALUE! +121,W71,Next House,Non-CUP,Residential,RESIDENT,DHOA,MIT,WEST,1979.0,1981.0,42.35470475,-71.10192118,OWNED,57.5,523.0,132006.46,81297.25,34825.26,7197.21,23305.3,0.0,17735.95,0.0,0.0,4322.75,1496.19,61091.16,0.0,0.0,973.95,0.0,116122.51,15883.95,Electricity,Produced,N,No Individual Metering,116233.58,116233.58 +122,W79,Simmons Hall,Non-CUP,Lab & Mixed Use,RESIDENT,DHOA,MIT,WEST,2000.0,2002.0,42.35710862,-71.1015208,OWNED,100.6,913.0,191189.7,93938.82,68095.76,7956.93,43741.07,0.0,17031.09,0.0,0.0,16397.76,3488.13,59436.21,0.0,10446.01,3537.38,0.0,162034.58,29155.12,Chilled Water,Produced,Y,Fully Metered,162034.58,162034.58 +123,W8,Harold Whitworth Pierce Boathouse,Non-CUP,Special,SERVICE,STAC,MIT,WEST,1965.0,1967.0,42.35531243,-71.09682721,OWNED,24.1,32.0,21710.72,17122.24,3226.99,429.9,1858.77,0.0,0.0,0.0,0.0,938.32,557.14,0.0,16565.1,0.0,0.0,0.0,20349.23,1361.49,Electricity,Produced,N,No Individual Metering,27447.04,27447.04 +124,W84,Tang Residence Hall,Non-CUP,Residential,RESIDENT,DHOA,MIT,WEST,1970.0,1973.0,42.35435175,-71.10347949,OWNED,240.4,387.0,152378.32,109244.79,25905.79,596.87,17749.99,0.0,1305.05,0.0,128.6,7558.93,258.95,106654.75,0.0,0.0,897.44,0.0,135150.58,17227.74,Electricity,Produced,N,No Individual Metering,135281.43,135281.43 +125,W85_W85ABC_W85DE_W85FG_W85HJK,Westgate,Non-CUP,Residential,,,MIT,,,,,,OWNED,,466.0,162224.82,121037.35,28938.070000000003,833.01,19331.33,0.0,1822.14,0.0,0.0,8773.73,175.68,118857.55,0.0,0.0,181.98,0.0,149975.42,12249.40000000001,Electricity,Produced,Y,No Individual Metering,150009.4,150009.4 +126,W89,MIT Police,Non-CUP,Office & Mixed Use,SERVICE,AER,MIT,WEST,1948.0,2006.0,42.35553858,-71.10467329,OWNED,27.9,82.0,14909.35,7808.8,4724.43,403.18,3500.37,0.0,0.0,0.0,0.0,820.88,7808.8,0.0,0.0,0.0,0.0,0.0,12533.23,2376.12,Electricity,Purchased,N,No Individual Metering,#VALUE!,#VALUE! +127,W91,Building W91,Non-CUP,Lab & Mixed Use,SERVICE,AER,MIT,WEST,1947.0,1949.0,42.35432356,-71.10442611,OWNED,40.7,116.0,35748.48,16886.53,15094.12,724.8,5194.15,0.0,359.56,0.0,0.0,9175.17,7255.16,0.0,1704.48,535.87,7031.46,0.0,31980.65,3767.83,Electricity,Produced,Y,No Individual Metering,31980.65,31980.65 +128,W92,Building W92,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,WEST,,1999.0,42.35492043,-71.1046169,OWNED,32.1,193.0,86521.66,74299.91,8317.61,1661.14,3269.39,0.0,0.0,0.0,0.0,3387.08,48805.66,0.0,0.0,0.0,25494.25,0.0,82617.52,3904.14,Electricity,Purchased,N,No Individual Metering,82617.52,82617.52 +129,W97,BUILDING W97,Non-CUP,Lab & Mixed Use,ACADEMIC,(NULL),MIT,WEST,,,,,OWNED,0.0,60.0,30550.79,18065.62,5821.34,745.7,3834.88,0.0,2172.97,0.0,13576.99,1240.76,1970.53,0.0,0.0,0.0,345.13,0.0,23886.96,6663.83,Electricity,Purchased,,,23886.96,23886.96 +130,W98,600 Memorial Drive,Non-CUP,Lab & Mixed Use,ACADEMIC,AER,MIT,WEST,,,42.35395541,-71.10664515,OWNED,91.0,553.0,82624.13,47561.94,25282.27,2322.09,18305.49,0.0,391.74,0.0,0.0,4654.69,47056.69,0.0,0.0,0.0,113.51,0.0,72844.21,9779.92,Electricity,Purchased,N,No Individual Metering,72844.21,72844.21 +131,WW15,Building WW15,Non-CUP,Lab Dominant,SERVICE,AER,MIT,WESTWEST,1969.0,,42.35536136,-71.10946972,OWNED,16.0,108.0,42145.75,37522.58,2797.37,652.34,1311.81,0.0,6507.45,0.0,0.0,833.22,5487.52,0.0,0.0,0.0,25527.61,0.0,40319.95,1825.8,Electricity,Purchased,N,No Individual Metering,40319.95,40319.95 diff --git a/data/seed.py b/data/seed.py new file mode 100644 index 0000000..5a98e73 --- /dev/null +++ b/data/seed.py @@ -0,0 +1,112 @@ +import math + +import numpy as np +import pandas as pd +from sqlmodel import Session + +from lib.models import ( + Building, + BuildingSimulationResult, + DemandScenario, + DemandScenarioBuilding, + DesignVector, + PowerPlant, + PowerPlantScenario, + engine, +) + +df = pd.read_csv("data/mit_buildings_info.csv") +results_df = pd.read_hdf("data/5out.hdf", key="results") +with Session(engine) as session: + ds = DemandScenario( + name="Test Data Scenario", description="Test Data Scenario", year_available=2030 + ) + dv = DesignVector(name="Test Design Vector") + bsrs = [] + + for i, row in df.iterrows(): + building = Building( + name=row["BUILDING_NAME_LONG"], + building_number=row["BUILDING_NUMBER"], + group_level_1=row["BUILDING_GROUP_LEVEL1"], + usage=row["CLUSTER_NUM"], + gfa=( + row["EXT_GROSS_AREA"] if not math.isnan(row["EXT_GROSS_AREA"]) else None + ), + height=( + row["BUILDING_HEIGHT"] + if not math.isnan(row["BUILDING_HEIGHT"]) + else None + ), + year=( + row["YEAR_CONST_BEGAN"] + if not math.isnan(row["YEAR_CONST_BEGAN"]) + else None + ), + ) + bsr = BuildingSimulationResult( + demand_scenario_building=DemandScenarioBuilding( + building=building, demand_scenario=ds, design_vector=dv + ), + heating=results_df[ + f"Zone Ideal Loads Supply Air Total Heating Energy" + ].values.tolist(), + cooling=results_df[ + f"Zone Ideal Loads Supply Air Total Cooling Energy" + ].values.tolist(), + lighting=results_df[f"Zone Lights Electricity Energy"].values.tolist(), + equipment=results_df[ + f"Zone Electric Equipment Electricity Energy" + ].values.tolist(), + ) + bsrs.append(bsr) + session.add_all(bsrs) + + pv = PowerPlant( + name="Photovoltaics", + description="Photovoltaic Panels on the roof", + nominal_capacity=100, + nominal_cost=0.01, + nominal_emissions_factor=0, + ) + grid = PowerPlant( + name="Grid", + description="The municipal power grid", + nominal_capacity=99999, + nominal_cost=0.24, + nominal_emissions_factor=23, + ) + cup = PowerPlant( + name="CUP", + description="The campus combined utility plant", + nominal_capacity=40000, # 40 MW + nominal_cost=0.01, + nominal_emissions_factor=0, + ) + session.add_all([pv, grid, cup]) + + t = np.linspace(0, 365 * 2 * np.pi, 8761) + t = t[:-1] + ts = pd.date_range(start="2020-01-01", end="2020-12-31", freq="h")[:-1] + y = np.sin(t - 2 * np.pi / 3).clip(0, 1) * ((-np.cos(t / 365) + 1) / 4 + 0.5) + + pv_50 = PowerPlantScenario( + power_plant=pv, + name="50% PV Coverage", + description="50% of the available roof space is covered in PV panels", + year_available=2030, + capacities=y * 500, + emissions_factors=np.zeros(8760), + cost_factors=np.zeros(8760), + ) + pv_70 = PowerPlantScenario( + power_plant=pv, + name="75% PV Coverage", + description="75% of the available roof space is covered in PV panels", + year_available=2040, + capacities=y * 75, + emissions_factors=np.zeros(8760), + cost_factors=np.zeros(8760), + ) + session.add_all([pv_50, pv_70]) + session.commit() diff --git a/environment.yml b/environment.yml new file mode 100644 index 0000000..b60837c --- /dev/null +++ b/environment.yml @@ -0,0 +1,6 @@ +name: mit-campus-decarbonization +dependencies: + - python=3.9 + - pip + - pip: + - -r requirements.txt \ No newline at end of file diff --git a/frontend/app.py b/frontend/app.py index b037e0c..cde4b69 100644 --- a/frontend/app.py +++ b/frontend/app.py @@ -1,5 +1,6 @@ import logging import sys +from typing import Optional logger = logging.getLogger(__name__) logging.basicConfig() @@ -17,6 +18,7 @@ import pandas as pd import plotly.express as px import streamlit as st +from sqlalchemy.orm import selectinload from sqlmodel import Session, select from frontend import frontend_settings as settings @@ -26,11 +28,11 @@ BuildingSimulationResult, DemandScenario, DemandScenarioBuilding, + PowerPlant, + PowerPlantScenario, engine, ) -# from lib.supa import Building - st.set_page_config(layout="wide", page_title="MIT Decarbonization") @@ -93,7 +95,31 @@ def create_demand_scenario(name: str): session.add(scenario) session.commit() st.cache_data.clear() - st.experimental_rerun() + st.rerun() + + +def create_power_plant(name: str): + with Session(engine) as session: + scenario = PowerPlant(name=name) + session.add(scenario) + session.commit() + get_power_plants.clear() + st.rerun() + + +def create_power_plant_scenario(name: str, power_plant_id: int, df: pd.DataFrame): + with Session(engine) as session: + scenario = PowerPlantScenario( + name=name, + power_plant_id=power_plant_id, + emissions_factors=df["emissions_factors"].values, + cost_factors=df["cost_factors"].values, + capacities=df["capacities"].values, + ) + session.add(scenario) + session.commit() + get_power_plant_scenarios.clear() + st.rerun() @st.cache_data @@ -179,6 +205,28 @@ def get_scenario_building_result(scenario_id: int, building_id: int): return df, df_melted +@st.cache_data +def get_power_plants() -> list[PowerPlant]: + with Session(engine) as session: + stmt = select(PowerPlant).options( + selectinload(PowerPlant.power_plant_scenarios) + ) + power_plants = session.exec(stmt).all() + + return [(p.model_dump()) for p in power_plants] + + +@st.cache_data +def get_power_plant_scenarios(power_plant_id: int) -> list[PowerPlantScenario]: + with Session(engine) as session: + stmt = select(PowerPlantScenario).where( + PowerPlantScenario.power_plant_id == power_plant_id + ) + power_plant_scenarios = session.exec(stmt).all() + + return [(p.model_dump(), p.to_df()) for p in power_plant_scenarios] + + ENDUSE_PASTEL_COLORS = { "Heating": "#FF7671", "Cooling": "#6D68E6", @@ -252,7 +300,7 @@ def render_building_scenarios(): df, df_melted, df_buildings = get_scenario_results(scenario["id"]) if df is None: st.warning("No results found for this scenario!") - render_create_scenario() + render_create_demand_scenario() return l, r = st.columns(2) @@ -283,17 +331,177 @@ def render_building_scenarios(): color_discrete_map=ENDUSE_PASTEL_COLORS, ) st.plotly_chart(fig, use_container_width=True) - render_create_scenario() + render_create_demand_scenario() -def render_create_scenario(): +def render_create_demand_scenario(): st.divider() st.markdown("### Create a new demand scenario") - name = st.text_input("Name") - if st.button("Create", disabled=name == ""): + name = st.text_input( + "Name", key="create_demand_scenario_name", help="Name of the scenario" + ) + if st.button("Create", disabled=name == "", key="create_demand_scenario_button"): create_demand_scenario(name) +def render_create_power_plant(): + st.divider() + st.markdown("### New Power Plant") + st.markdown("Create a new power plant type.") + name = st.text_input( + "Name", key="create_power_plant_name", help="Name of the power plant type" + ) + if st.button( + "Create", + disabled=name == "", + key="create_power_plant_button", + type="primary", + use_container_width=True, + ): + create_power_plant(name) + + +# TODO: use pandera, import UploadedFile type annotation +@st.cache_data +def validate_power_plant_scenario_csv(csv_file) -> Optional[pd.DataFrame]: + try: + df = pd.read_csv(csv_file) + # assert "Timestamp" in df.columns + assert "capacities" in df.columns + assert "emissions_factors" in df.columns + assert "cost_factors" in df.columns + assert len(df) == 8760 + assert df["capacities"].dtype in [int, float] + assert df["emissions_factors"].dtype in [int, float] + assert df["cost_factors"].dtype in [int, float] + # assert df["Timestamp"].dtype == "datetime64[ns]" + return df + except Exception as e: + return None + + +def render_create_power_plant_scenario(pp: PowerPlant): + st.divider() + st.markdown("### New Power Plant Scenario") + st.markdown(f"Create a new scenario for `{pp.name}` power plant type") + name = st.text_input( + "Name", key="create_power_plant_scenario_name", help="Name of the scenario" + ) + csv_file = st.file_uploader( + "Upload a CSV file with the scenario data", + type=["csv"], + accept_multiple_files=False, + key="upload_power_plant_scenario_data", + ) + df = None + if csv_file: + df = validate_power_plant_scenario_csv(csv_file) + if df is None: + st.error( + "Invalid CSV file. Please check the file format and try again. The CSV must have three columns: 'capacities', 'emissions_factors', and 'cost_factors' and 8760 rows." + ) + + disabled = name == "" or df is None + if st.button( + "Create", + disabled=disabled, + key="create_power_plant_scenario_button", + use_container_width=True, + type="primary", + ): + create_power_plant_scenario(name, pp.id, df) + + +def render_power_plants(): + l, r = st.columns(2) + chart_container = st.container() + create_plant_container, create_plant_scenario_container = st.columns(2) + + with create_plant_container: + render_create_power_plant() + + # get the power plants + power_plants = [PowerPlant.model_validate(p) for p in get_power_plants()] + + # early return if no power plants + if len(power_plants) == 0: + st.warning("No power plants found!") + return + + # select a plant + with l: + pp = st.selectbox( + "Power Plant", + power_plants, + format_func=lambda x: x.name, + help="Select a power plant to view its data", + ) + + with create_plant_scenario_container: + render_create_power_plant_scenario(pp) + + # get scenarios + pp_scenarios = [ + (PowerPlantScenario.model_validate(p)) + for p, df in get_power_plant_scenarios(pp.id) + ] + + # early return if no scenarios + if len(pp_scenarios) == 0: + with r: + st.warning("No scenarios found for this power plant!") + return + + # create a combined dataframe of all scenarios + pp_scenarios_dfs = [df for p, df in get_power_plant_scenarios(pp.id)] + stacked_scenarios = pd.concat(pp_scenarios_dfs, axis=0) + + # downloader for all scenarios + with l: + st.download_button( + f"Download {pp.name} power plant scenarios", + encode_csv(stacked_scenarios), + f"{pp.name}_scenarios.csv", + "Download all scenarios for power plant type.", + use_container_width=True, + type="primary", + ) + + # selector for single scenario + with r: + s = st.selectbox( + "Power Plant Scenario", + list(range(len(pp_scenarios))), + format_func=lambda x: pp_scenarios[x].name, + help="Select a power plant scenario to view its data", + ) + + # select scenario data + scenario_df = pp_scenarios_dfs[s] + scenario = pp_scenarios[s] + + # downloader for single scenario + with r: + st.download_button( + f"Download {pp.name} {scenario.name} scenario", + encode_csv(scenario_df), + f"{pp.name}_{scenario.name}_scenario.csv", + "Download scenario data", + use_container_width=True, + type="primary", + ) + + with chart_container: + fig = px.line( + scenario_df.reset_index(), + x="Timestamp", + y="capacities", + title=f"{pp.name} {scenario.name} Scenario", + labels={"capacities": "Capacity [kW]"}, + ) + st.plotly_chart(fig, use_container_width=True) + + def password_protect(): if settings.env == "dev": return True @@ -313,8 +521,12 @@ def password_protect(): render_title() logged_in = password_protect() if logged_in: - buildings_tab, scenarios_tab = st.tabs(["Buildings", "Scenarios"]) + buildings_tab, scenarios_tab, power_plants_tab = st.tabs( + ["Buildings", "Scenarios", "Power Plants"] + ) with buildings_tab: render_buildings() with scenarios_tab: render_building_scenarios() + with power_plants_tab: + render_power_plants() diff --git a/lib/models.py b/lib/models.py index 9707a67..6bb0cc8 100644 --- a/lib/models.py +++ b/lib/models.py @@ -86,6 +86,8 @@ class DemandScenario(SQLModel, table=True): Attributes: id (Optional[int]): The ID of the demand scenario. name (str): The name of the demand scenario. + description (Optional[str]): The description of the demand scenario. + year_available (Optional[int]): The year the demand scenario is available. buildings (list[Building]): The list of buildings associated with the demand scenario. demand_scenario_designs (list[DemandScenarioBuilding]): The list of demand scenario designs associated with the demand scenario. """ @@ -93,6 +95,12 @@ class DemandScenario(SQLModel, table=True): __tablename__ = "DemandScenario" id: Optional[int] = Field(default=None, primary_key=True) name: str = Field(..., description="Name of the demand scenario") + description: Optional[str] = Field( + None, description="Description of the demand scenario" + ) + year_available: Optional[int] = Field( + ..., description="Year the demand scenario is available" + ) buildings: list["Building"] = Relationship( back_populates="demand_scenarios", link_model=DemandScenarioBuilding ) @@ -178,3 +186,95 @@ def to_df(self) -> pd.DataFrame: class Config: arbitrary_types_allowed = True + + +class PowerPlant(SQLModel, table=True): + """ + Represents a power plant in the decarbonization model. + + Attributes: + id (Optional[int]): The ID of the power plant. + name (str): The name of the power plant. + description (Optional[str]): The description of the power plant. + nominal_capacity (Optional[float]): The nominal capacity of the power plant in kW. + nominal_cost (Optional[float]): The nominal cost of the power plant in $/kWh. + nominal_emissions_factor (Optional[float]): The nominal emissions factor of the power plant in kgCO2/kWh. + power_plant_scenarios (list[PowerPlantScenario]): The list of power plant scenarios associated with the power plant. + """ + + __tablename__ = "PowerPlant" + id: Optional[int] = Field(default=None, primary_key=True) + name: str = Field(..., description="Name of the power plant") + description: Optional[str] = Field( + None, description="Description of the power plant" + ) + nominal_capacity: Optional[float] = Field( + None, description="Nominal capacity of the power plant [kW]" + ) + nominal_cost: Optional[float] = Field( + None, description="Nominal cost of the power plant [$/kWh]" + ) + nominal_emissions_factor: Optional[float] = Field( + None, description="Nominal emissions factor of the power plant [kgCO2/kWh]" + ) + power_plant_scenarios: list["PowerPlantScenario"] = Relationship( + back_populates="power_plant" + ) + + +class PowerPlantScenario(SQLModel, table=True): + """ + Represents a power plant scenario in the decarbonization model. + + Attributes: + id (Optional[int]): The ID of the power plant scenario. + power_plant_id (int): The ID of the associated power plant. + power_plant (PowerPlant): The associated power plant. + name (str): The name of the power plant scenario. + description (Optional[str]): The description of the power plant scenario. + year_available (Optional[int]): The year the power plant scenario is available. + emissions_factors (Optional[np.ndarray]): The emissions factors for the power plant scenario. + cost_factors (Optional[np.ndarray]): The cost factors for the power plant scenario. + capacities (Optional[np.ndarray]): The capacities for the power plant scenario. + """ + + __tablename__ = "PowerPlantScenario" + id: Optional[int] = Field(default=None, primary_key=True) + power_plant_id: int = Field(..., foreign_key="PowerPlant.id") + power_plant: PowerPlant = Relationship(back_populates="power_plant_scenarios") + name: str = Field(..., description="Name of the power plant scenario") + description: Optional[str] = Field( + None, description="Description of the power plant scenario" + ) + year_available: Optional[int] = Field( + ..., description="Year the power plant scenario is available" + ) + emissions_factors: np.ndarray = Field(None, sa_column=Column(Vector(8760))) + cost_factors: np.ndarray = Field(None, sa_column=Column(Vector(8760))) + capacities: np.ndarray = Field(None, sa_column=Column(Vector(8760))) + + def to_df(self) -> pd.DataFrame: + df = pd.DataFrame( + { + "emissions_factors": self.emissions_factors, + "cost_factors": self.cost_factors, + "capacities": self.capacities, + } + ) + df.index = pd.date_range(start="1/1/2024", periods=8760, freq="h") + df.index.name = "Timestamp" + df = df.set_index( + pd.Series([self.power_plant.id] * 8760, name="power_plant_id"), append=True + ) + df = df.set_index( + pd.Series([self.power_plant.name] * 8760, name="power_plant_name"), + append=True, + ) + df = df.set_index( + pd.Series([self.name] * 8760, name="scenario_name"), append=True + ) + df = df.set_index(pd.Series([self.id] * 8760, name="scenario_id"), append=True) + return df + + class Config: + arbitrary_types_allowed = True diff --git a/notebooks/.gitkeep b/notebooks/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/notebooks/supa.ipynb b/notebooks/supa.ipynb deleted file mode 100644 index 638c931..0000000 --- a/notebooks/supa.ipynb +++ /dev/null @@ -1,295 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from supabase import create_client\n", - "from supabase.lib.client_options import ClientOptions\n", - "import os\n", - "\n", - "client_options = ClientOptions(postgrest_client_timeout=60)\n", - "client = create_client(supabase_url=os.getenv('SUPABASE_URL'), supabase_key=os.getenv('SUPABASE_SERVICE_ROLE_KEY'), options=client_options)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "client.table('Building').insert({\"name\": \"test\", \"gfa\": 1000,}).execute()\n", - "client.table(\"DesignVector\").insert({\"name\": \"testdesign\"}).execute()\n", - "client.table(\"DemandScenario\").insert({\"name\": \"testdemand\"}).execute()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "client.table(\"DemandScenarioBuilding\").insert({\"demand_scenario_id\": 1, \"building_id\": 1, \"design_vector_id\": 1}).execute()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "client.table(\"BuildingSimulationResult\").insert({\n", - "\t\"id\": 1,\n", - "\t\"heating\": np.random.rand(8760).tolist(),\n", - "\t\"cooling\": np.random.rand(8760).tolist(),\n", - "\t\"lighting\": np.random.rand(8760).tolist(),\n", - "\t\"equipment\": np.random.rand(8760).tolist(),\n", - "\t\"pumps\": np.random.rand(8760).tolist(),\n", - "\t\"fans\": np.random.rand(8760).tolist(),\n", - "\t\"water\": np.random.rand(8760).tolist(),\n", - "\t\"misc\": np.random.rand(8760).tolist(),\n", - "\n", - "}).execute()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "res = client.table(\"BuildingSimulationResult\").select(\"*\").execute()\n", - "import json\n", - "np.array(json.loads(res.data[0][\"heating\"])).shape" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from pydantic import BaseModel, Field, validate_call\n", - "from datetime import datetime\n", - "\n", - "class BuildingBase(BaseModel, extra=\"forbid\"):\n", - " name: str = Field(..., description=\"Name of the building\")\n", - " gfa: float = Field(..., gt=100, description=\"Gross Floor Area of the building, m2\")\n", - "\n", - "class Building(BuildingBase):\n", - " id: int = Field(..., description=\"Unique identifier for the building\")\n", - " created_at: str = Field(..., description=\"Timestamp of the creation of the building\")\n", - "\n", - " @classmethod\n", - " def get(cls, id: int):\n", - " building = client.table(\"Building\").select(\"*\").eq(\"id\", id).execute()\n", - " if len(building.data) == 0:\n", - " raise ValueError(f\"Building with id {id} not found\")\n", - "\n", - " return cls(**building.data[0])\n", - " \n", - " @classmethod\n", - " @validate_call()\n", - " def create(cls, building: BuildingBase):\n", - " building = client.table(\"Building\").insert(building.model_dump()).execute()\n", - " return cls(**building.data[0])\n", - "\n", - " \n", - " def commit(self):\n", - " client.table(\"Building\").upsert(self.model_dump()).execute()\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - " \n", - "\n", - "building = Building.get(1)\n", - "building.gfa = 2000\n", - "building.commit()\n", - "\n", - "building = Building.create({\"name\": \"test2\", \"gfa\": 3000})\n", - "building.id" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from pydantic import model_validator\n", - "from typing import Optional\n", - "import pandas as pd\n", - "import numpy as np\n", - "class BuildingSimulationResult(BaseModel, arbitrary_types_allowed=True, extra=\"forbid\"):\n", - " id: int\n", - " created_at: Optional[str] = Field(None, description=\"Timestamp of the creation of the record\")\n", - " heating: np.ndarray\n", - " cooling: np.ndarray\n", - " lighting: np.ndarray\n", - " equipment: np.ndarray\n", - " pumps: np.ndarray\n", - " fans: np.ndarray\n", - " water: np.ndarray\n", - " misc: np.ndarray\n", - "\n", - " # set up all np.ndarrays to serialize to list\n", - " class Config:\n", - " json_encoders = {\n", - " np.ndarray: lambda v: v.tolist()\n", - " }\n", - " \n", - " \n", - " @property\n", - " def building_id(self):\n", - " res = client.table(\"DemandScenarioBuilding\").select(\"building_id\").eq(\"id\", self.id).execute()\n", - " return res.data[0].get(\"building_id\")\n", - " \n", - " @property\n", - " def demand_scenario_id(self):\n", - " res = client.table(\"DemandScenarioBuilding\").select(\"demand_scenario_id\").eq(\"id\", self.id).execute()\n", - " return res.data[0].get(\"demand_scenario_id\")\n", - " \n", - " @property\n", - " def design_vector_id(self):\n", - " res = client.table(\"DemandScenarioBuilding\").select(\"design_vector_id\").eq(\"id\", self.id).execute()\n", - " return res.data[0].get(\"design_vector_id\")\n", - " \n", - "\n", - "\n", - " @model_validator(mode=\"before\")\n", - " def cast_fields_to_numpy(cls, v):\n", - " for key in v:\n", - " if cls.model_fields[key].annotation == np.ndarray:\n", - " if type(v[key]) == list:\n", - " v[key] = np.array(v[key])\n", - " elif type(v[key]) == str:\n", - " v[key] = np.array(json.loads(v[key]))\n", - " elif type(v[key]) == pd.Series:\n", - " v[key] = v[key].values\n", - " else:\n", - " pass\n", - "\n", - " assert v[key].shape == (8760,), f\"Field {key} must have shape (8760,) but has shape {v[key].shape}\"\n", - " return v\n", - "\n", - " @classmethod\n", - " def get(cls, id: int):\n", - " res = client.table(\"BuildingSimulationResult\").select(\"*\").eq(\"id\", id).execute()\n", - " if len(res.data) == 0:\n", - " raise ValueError(f\"BuildingSimulationResult with id {id} not found\")\n", - "\n", - " return cls(**res.data[0])\n", - " \n", - " def to_df(self) -> pd.DataFrame:\n", - " df = pd.DataFrame({\n", - " \"heating\": self.heating,\n", - " \"cooling\": self.cooling,\n", - " \"lighting\": self.lighting,\n", - " \"equipment\": self.equipment,\n", - " \"pumps\": self.pumps,\n", - " \"fans\": self.fans,\n", - " \"water\": self.water,\n", - " \"misc\": self.misc,\n", - " }, index=pd.date_range(start=\"2024-01-01 00:00:00\", periods=8760, freq=\"H\", name=\"timestep\") )\n", - " df = df.set_index(pd.Series([self.id]*8760, name=\"building_id\"), append=True, )\n", - " raise ValueError(\"Not finished implementing; decide on multiindex!\")\n", - " df = df.unstack(level=\"timestep\")\n", - " return df\n", - " \n", - " # def from_df(self, df: pd.DataFrame):\n", - " # series = df.loc[self.id]\n", - " # self.heating = series.heating.values\n", - " # self.cooling = series.cooling.values\n", - " # self.lighting = series.lighting.values\n", - " # self.equipment = series.equipment.values\n", - " # self.pumps = series.pumps.values\n", - " # self.fans = series.fans.values\n", - " # self.water = series.water.values\n", - " # self.misc = series.misc.values\n", - "\n", - " def commit(self):\n", - " client.table(\"BuildingSimulationResult\").upsert(self.model_dump(mode=\"json\", exclude=[\"created_at\"])).execute()\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "building_result = BuildingSimulationResult.get(1).to_df()\n", - "building_result[\"heating\"] = 1\n", - "building_r = BuildingSimulationResult.get(1)\n", - "building_r.from_df(building_result)\n", - "building_r.commit()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# create 200 buildings\n", - "for i in range(2, 201):\n", - "\tbuilding = Building.create({\"name\": f\"test{i}\", \"gfa\": 1000})\n", - "\tres = client.table(\"DemandScenarioBuilding\").insert({\"demand_scenario_id\": 1, \"building_id\": building.id, \"design_vector_id\": 1}).execute()\n", - "\tds_id = res.data[0][\"id\"]\n", - "\tsim_result = BuildingSimulationResult(id=building.id, heating=np.random.rand(8760), cooling=np.random.rand(8760), lighting=np.random.rand(8760), equipment=np.random.rand(8760), pumps=np.random.rand(8760), fans=np.random.rand(8760), water=np.random.rand(8760), misc=np.random.rand(8760))\n", - "\tsim_result.commit()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "res = client.table(\"BuildingSimulationResult\").select(\"*\").execute()\n", - "buildings = []\n", - "for row in res.data:\n", - "\tbuilding = BuildingSimulationResult(**row)\n", - "\tbuildings.append(building.to_df())\n", - "buildings = pd.concat(buildings,axis=0)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "campus-decarb", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.18" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..4d3947c --- /dev/null +++ b/package-lock.json @@ -0,0 +1,347 @@ +{ + "name": "mit-campus-decarbonization", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "supabase": "^1.142.2" + } + }, + "node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/bin-links": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-4.0.3.tgz", + "integrity": "sha512-obsRaULtJurnfox/MDwgq6Yo9kzbv1CPTk/1/s7Z/61Lezc8IKkFCOXNeVLXz0456WRzBQmSsDWlai2tIhBsfA==", + "dev": true, + "dependencies": { + "cmd-shim": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "read-cmd-shim": "^4.0.0", + "write-file-atomic": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/cmd-shim": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-6.0.2.tgz", + "integrity": "sha512-+FFYbB0YLaAkhkcrjkyNLYDiOsFSfRjwjY19LXk/psmMx1z00xlCv7hhQoTGXXIKi+YXHL/iiFo8NqMVQX9nOw==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-cmd-shim": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz", + "integrity": "sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/supabase": { + "version": "1.142.2", + "resolved": "https://registry.npmjs.org/supabase/-/supabase-1.142.2.tgz", + "integrity": "sha512-CWe6+WIGnWg8rHXngDwlJX1A3DyEpZLD2EMnA0YKUU1WdnpbdUQsu5vVWbiybFxOC2SPdbylzEyV5iFy6qa7Nw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "bin-links": "^4.0.3", + "https-proxy-agent": "^7.0.2", + "node-fetch": "^3.3.2", + "tar": "6.2.0" + }, + "bin": { + "supabase": "bin/supabase" + }, + "engines": { + "npm": ">=8" + } + }, + "node_modules/tar": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.2.tgz", + "integrity": "sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..3cb6459 --- /dev/null +++ b/package.json @@ -0,0 +1,13 @@ +{ + "devDependencies": { + "supabase": "^1.142.2" + }, + "scripts": { + "conda-setup": "conda env create -f environment.yml", + "conda-update": "conda env update -f environment.yml", + "db-reset": "npx supabase db reset", + "db-seed": "conda activate mit-campus-decarbonization && python data/seed.py", + "db-refresh": "npm run reset-db && npm run db-refresh", + "fe-start": "conda activate mit-campus-decarbonization && streamlit run frontend/app.py" + } +} \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 3f1eca1..96dfe07 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ -r requirements/base-requirements.txt --r requirements/fe-requirements.txt \ No newline at end of file +-r requirements/fe-requirements.txt +-r requirements/api-requirements.txt \ No newline at end of file diff --git a/requirements/base-requirements.txt b/requirements/base-requirements.txt index 8081724..e730293 100644 --- a/requirements/base-requirements.txt +++ b/requirements/base-requirements.txt @@ -4,4 +4,5 @@ pandera supabase psycopg2-binary pgvector -sqlmodel \ No newline at end of file +sqlmodel +tables \ No newline at end of file diff --git a/supabase/.gitignore b/supabase/.gitignore new file mode 100644 index 0000000..a3ad880 --- /dev/null +++ b/supabase/.gitignore @@ -0,0 +1,4 @@ +# Supabase +.branches +.temp +.env diff --git a/supabase/config.toml b/supabase/config.toml new file mode 100644 index 0000000..33c4ac9 --- /dev/null +++ b/supabase/config.toml @@ -0,0 +1,159 @@ +# A string used to distinguish different Supabase projects on the same host. Defaults to the +# working directory name when running `supabase init`. +project_id = "mit-campus-decarbonization" + +[api] +enabled = true +# Port to use for the API URL. +port = 54321 +# Schemas to expose in your API. Tables, views and stored procedures in this schema will get API +# endpoints. public and storage are always included. +schemas = ["public", "storage", "graphql_public"] +# Extra schemas to add to the search_path of every request. public is always included. +extra_search_path = ["public", "extensions"] +# The maximum number of rows returns from a view, table, or stored procedure. Limits payload size +# for accidental or malicious requests. +max_rows = 1000 + +[db] +# Port to use for the local database URL. +port = 54322 +# Port used by db diff command to initialize the shadow database. +shadow_port = 54320 +# The database major version to use. This has to be the same as your remote database's. Run `SHOW +# server_version;` on the remote database to check. +major_version = 15 + +[db.pooler] +enabled = false +# Port to use for the local connection pooler. +port = 54329 +# Specifies when a server connection can be reused by other clients. +# Configure one of the supported pooler modes: `transaction`, `session`. +pool_mode = "transaction" +# How many server connections to allow per user/database pair. +default_pool_size = 20 +# Maximum number of client connections allowed. +max_client_conn = 100 + +[realtime] +enabled = true +# Bind realtime via either IPv4 or IPv6. (default: IPv6) +# ip_version = "IPv6" +# The maximum length in bytes of HTTP request headers. (default: 4096) +# max_header_length = 4096 + +[studio] +enabled = true +# Port to use for Supabase Studio. +port = 54323 +# External URL of the API server that frontend connects to. +api_url = "http://127.0.0.1" + +# Email testing server. Emails sent with the local dev setup are not actually sent - rather, they +# are monitored, and you can view the emails that would have been sent from the web interface. +[inbucket] +enabled = true +# Port to use for the email testing server web interface. +port = 54324 +# Uncomment to expose additional ports for testing user applications that send emails. +# smtp_port = 54325 +# pop3_port = 54326 + +[storage] +enabled = true +# The maximum file size allowed (e.g. "5MB", "500KB"). +file_size_limit = "50MiB" + +[auth] +enabled = true +# The base URL of your website. Used as an allow-list for redirects and for constructing URLs used +# in emails. +site_url = "http://127.0.0.1:3000" +# A list of *exact* URLs that auth providers are permitted to redirect to post authentication. +additional_redirect_urls = ["https://127.0.0.1:3000"] +# How long tokens are valid for, in seconds. Defaults to 3600 (1 hour), maximum 604,800 (1 week). +jwt_expiry = 3600 +# If disabled, the refresh token will never expire. +enable_refresh_token_rotation = true +# Allows refresh tokens to be reused after expiry, up to the specified interval in seconds. +# Requires enable_refresh_token_rotation = true. +refresh_token_reuse_interval = 10 +# Allow/disallow new user signups to your project. +enable_signup = true +# Allow/disallow testing manual linking of accounts +enable_manual_linking = false + +[auth.email] +# Allow/disallow new user signups via email to your project. +enable_signup = true +# If enabled, a user will be required to confirm any email change on both the old, and new email +# addresses. If disabled, only the new email is required to confirm. +double_confirm_changes = true +# If enabled, users need to confirm their email address before signing in. +enable_confirmations = false + +# Uncomment to customize email template +# [auth.email.template.invite] +# subject = "You have been invited" +# content_path = "./supabase/templates/invite.html" + +[auth.sms] +# Allow/disallow new user signups via SMS to your project. +enable_signup = true +# If enabled, users need to confirm their phone number before signing in. +enable_confirmations = false +# Template for sending OTP to users +template = "Your code is {{ .Code }} ." + +# Use pre-defined map of phone number to OTP for testing. +[auth.sms.test_otp] +# 4152127777 = "123456" + +# This hook runs before a token is issued and allows you to add additional claims based on the authentication method used. +[auth.hook.custom_access_token] +# enabled = true +# uri = "pg-functions:////" + + +# Configure one of the supported SMS providers: `twilio`, `twilio_verify`, `messagebird`, `textlocal`, `vonage`. +[auth.sms.twilio] +enabled = false +account_sid = "" +message_service_sid = "" +# DO NOT commit your Twilio auth token to git. Use environment variable substitution instead: +auth_token = "env(SUPABASE_AUTH_SMS_TWILIO_AUTH_TOKEN)" + +# Use an external OAuth provider. The full list of providers are: `apple`, `azure`, `bitbucket`, +# `discord`, `facebook`, `github`, `gitlab`, `google`, `keycloak`, `linkedin_oidc`, `notion`, `twitch`, +# `twitter`, `slack`, `spotify`, `workos`, `zoom`. +[auth.external.apple] +enabled = false +client_id = "" +# DO NOT commit your OAuth provider secret to git. Use environment variable substitution instead: +secret = "env(SUPABASE_AUTH_EXTERNAL_APPLE_SECRET)" +# Overrides the default auth redirectUrl. +redirect_uri = "" +# Overrides the default auth provider URL. Used to support self-hosted gitlab, single-tenant Azure, +# or any other third-party OIDC providers. +url = "" + +[analytics] +enabled = false +port = 54327 +vector_port = 54328 +# Configure one of the supported backends: `postgres`, `bigquery`. +backend = "postgres" + +# Experimental features may be deprecated any time +[experimental] +# Configures Postgres storage engine to use OrioleDB (S3) +orioledb_version = "" +# Configures S3 bucket URL, eg. .s3-.amazonaws.com +s3_host = "env(S3_HOST)" +# Configures S3 bucket region, eg. us-east-1 +s3_region = "env(S3_REGION)" +# Configures AWS_ACCESS_KEY_ID for S3 bucket +s3_access_key = "env(S3_ACCESS_KEY)" +# Configures AWS_SECRET_ACCESS_KEY for S3 bucket +s3_secret_key = "env(S3_SECRET_KEY)" diff --git a/supabase/migrations/20240211215240_remote_schema.sql b/supabase/migrations/20240211215240_remote_schema.sql new file mode 100644 index 0000000..cc954f7 --- /dev/null +++ b/supabase/migrations/20240211215240_remote_schema.sql @@ -0,0 +1,368 @@ +create extension if not exists "vector" with schema "extensions"; + +SET statement_timeout = 0; +SET lock_timeout = 0; +SET idle_in_transaction_session_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SELECT pg_catalog.set_config('search_path', '', false); +SET check_function_bodies = false; +SET xmloption = content; +SET client_min_messages = warning; +SET row_security = off; + +CREATE SCHEMA IF NOT EXISTS "public"; + +ALTER SCHEMA "public" OWNER TO "pg_database_owner"; + +CREATE OR REPLACE FUNCTION "public"."get_buildings_in_scenario"(id bigint) RETURNS bigint + LANGUAGE "plpgsql" + AS $$ +BEGIN + RETURN (SELECT building_id FROM "DemandScenarioBuilding" WHERE demand_scenario_id = id); +END; +$$; + +ALTER FUNCTION "public"."get_buildings_in_scenario"(id bigint) OWNER TO "postgres"; + +CREATE OR REPLACE FUNCTION "public"."get_demand_scenario_id"(building_simulation_result_id bigint) RETURNS bigint + LANGUAGE "plpgsql" + AS $$ +BEGIN + RETURN (SELECT demand_scenario_id FROM "DemandScenarioBuilding" WHERE id = building_simulation_result_id); +END; +$$; + +ALTER FUNCTION "public"."get_demand_scenario_id"(building_simulation_result_id bigint) OWNER TO "postgres"; + +SET default_tablespace = ''; + +SET default_table_access_method = "heap"; + +CREATE TABLE IF NOT EXISTS "public"."Building" ( + "id" bigint NOT NULL, + "name" text, + "gfa" real, + "building_number" text, + "group_level_1" text, + "usage" text, + "height" real, + "year" smallint +); + +ALTER TABLE "public"."Building" OWNER TO "postgres"; + +CREATE TABLE IF NOT EXISTS "public"."BuildingSimulationResult" ( + "id" bigint NOT NULL, + "heating" extensions.vector(8760), + "cooling" extensions.vector(8760), + "lighting" extensions.vector(8760), + "equipment" extensions.vector(8760), + "fans" extensions.vector(8760), + "pumps" extensions.vector(8760), + "misc" extensions.vector(8760), + "water" extensions.vector(8760) +); + +ALTER TABLE "public"."BuildingSimulationResult" OWNER TO "postgres"; + +ALTER TABLE "public"."Building" ALTER COLUMN "id" ADD GENERATED BY DEFAULT AS IDENTITY ( + SEQUENCE NAME "public"."Building_id_seq" + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1 +); + +CREATE TABLE IF NOT EXISTS "public"."DemandScenario" ( + "id" bigint NOT NULL, + "name" text +); + +ALTER TABLE "public"."DemandScenario" OWNER TO "postgres"; + +CREATE TABLE IF NOT EXISTS "public"."DemandScenarioBuilding" ( + "id" bigint NOT NULL, + "building_id" bigint, + "design_vector_id" bigint, + "demand_scenario_id" bigint +); + +ALTER TABLE "public"."DemandScenarioBuilding" OWNER TO "postgres"; + +ALTER TABLE "public"."DemandScenarioBuilding" ALTER COLUMN "id" ADD GENERATED BY DEFAULT AS IDENTITY ( + SEQUENCE NAME "public"."DemandScenarioBuilding_id_seq" + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1 +); + +ALTER TABLE "public"."DemandScenario" ALTER COLUMN "id" ADD GENERATED BY DEFAULT AS IDENTITY ( + SEQUENCE NAME "public"."DemandScenario_id_seq" + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1 +); + +CREATE TABLE IF NOT EXISTS "public"."DesignVector" ( + "id" bigint NOT NULL, + "name" text +); + +ALTER TABLE "public"."DesignVector" OWNER TO "postgres"; + +ALTER TABLE "public"."DesignVector" ALTER COLUMN "id" ADD GENERATED BY DEFAULT AS IDENTITY ( + SEQUENCE NAME "public"."DesignVector_id_seq" + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1 +); + +CREATE TABLE IF NOT EXISTS "public"."PowerPlant" ( + "id" bigint NOT NULL, + "name" text, + "nominal_capacity" real, + "nominal_cost" real, + "nominal_emissions_factor" real +); + +ALTER TABLE "public"."PowerPlant" OWNER TO "postgres"; + +CREATE TABLE IF NOT EXISTS "public"."PowerPlantScenario" ( + "id" bigint NOT NULL, + "power_plant_id" bigint, + "name" text, + "emissions_factors" extensions.vector(8760), + "cost_factors" extensions.vector(8760), + "capacities" extensions.vector(8760) +); + +ALTER TABLE "public"."PowerPlantScenario" OWNER TO "postgres"; + +ALTER TABLE "public"."PowerPlantScenario" ALTER COLUMN "id" ADD GENERATED BY DEFAULT AS IDENTITY ( + SEQUENCE NAME "public"."PowerPlantScenario_id_seq" + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1 +); + +ALTER TABLE "public"."PowerPlant" ALTER COLUMN "id" ADD GENERATED BY DEFAULT AS IDENTITY ( + SEQUENCE NAME "public"."PowerPlant_id_seq" + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1 +); + +CREATE TABLE IF NOT EXISTS "public"."SupplyScenario" ( + "id" bigint NOT NULL, + "name" text +); + +ALTER TABLE "public"."SupplyScenario" OWNER TO "postgres"; + +CREATE TABLE IF NOT EXISTS "public"."SupplyScenarioPlant" ( + "id" bigint NOT NULL, + "plant_scenario_id" bigint, + "supply_scenario_id" bigint +); + +ALTER TABLE "public"."SupplyScenarioPlant" OWNER TO "postgres"; + +ALTER TABLE "public"."SupplyScenarioPlant" ALTER COLUMN "id" ADD GENERATED BY DEFAULT AS IDENTITY ( + SEQUENCE NAME "public"."SupplyScenarioPlant_id_seq" + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1 +); + +ALTER TABLE "public"."SupplyScenario" ALTER COLUMN "id" ADD GENERATED BY DEFAULT AS IDENTITY ( + SEQUENCE NAME "public"."SupplyScenario_id_seq" + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1 +); + +ALTER TABLE ONLY "public"."BuildingSimulationResult" + ADD CONSTRAINT "BuildingSimulationResult_pkey" PRIMARY KEY ("id"); + +ALTER TABLE ONLY "public"."Building" + ADD CONSTRAINT "Building_building_number_key" UNIQUE ("building_number"); + +ALTER TABLE ONLY "public"."Building" + ADD CONSTRAINT "Building_pkey" PRIMARY KEY ("id"); + +ALTER TABLE ONLY "public"."DemandScenarioBuilding" + ADD CONSTRAINT "DemandScenarioBuilding_pkey" PRIMARY KEY ("id"); + +ALTER TABLE ONLY "public"."DemandScenario" + ADD CONSTRAINT "DemandScenario_pkey" PRIMARY KEY ("id"); + +ALTER TABLE ONLY "public"."DesignVector" + ADD CONSTRAINT "DesignVector_pkey" PRIMARY KEY ("id"); + +ALTER TABLE ONLY "public"."PowerPlantScenario" + ADD CONSTRAINT "PowerPlantScenario_pkey" PRIMARY KEY ("id"); + +ALTER TABLE ONLY "public"."PowerPlant" + ADD CONSTRAINT "PowerPlant_pkey" PRIMARY KEY ("id"); + +ALTER TABLE ONLY "public"."SupplyScenarioPlant" + ADD CONSTRAINT "SupplyScenarioPlant_pkey" PRIMARY KEY ("id"); + +ALTER TABLE ONLY "public"."SupplyScenario" + ADD CONSTRAINT "SupplyScenario_pkey" PRIMARY KEY ("id"); + +ALTER TABLE ONLY "public"."DemandScenarioBuilding" + ADD CONSTRAINT "unique_building_demand_scenario_combination" UNIQUE ("building_id", "demand_scenario_id"); + +ALTER TABLE ONLY "public"."BuildingSimulationResult" + ADD CONSTRAINT "BuildingSimulationResult_id_fkey" FOREIGN KEY (id) REFERENCES public."DemandScenarioBuilding"(id); + +ALTER TABLE ONLY "public"."DemandScenarioBuilding" + ADD CONSTRAINT "DemandScenarioBuilding_building_id_fkey" FOREIGN KEY (building_id) REFERENCES public."Building"(id); + +ALTER TABLE ONLY "public"."DemandScenarioBuilding" + ADD CONSTRAINT "DemandScenarioBuilding_demand_scenario_id_fkey" FOREIGN KEY (demand_scenario_id) REFERENCES public."DemandScenario"(id); + +ALTER TABLE ONLY "public"."DemandScenarioBuilding" + ADD CONSTRAINT "DemandScenarioBuilding_design_vector_id_fkey" FOREIGN KEY (design_vector_id) REFERENCES public."DesignVector"(id); + +ALTER TABLE ONLY "public"."PowerPlantScenario" + ADD CONSTRAINT "PowerPlantScenario_power_plant_id_fkey" FOREIGN KEY (power_plant_id) REFERENCES public."PowerPlant"(id); + +ALTER TABLE ONLY "public"."SupplyScenarioPlant" + ADD CONSTRAINT "SupplyScenarioPlant_plant_scenario_id_fkey" FOREIGN KEY (plant_scenario_id) REFERENCES public."PowerPlantScenario"(id); + +ALTER TABLE ONLY "public"."SupplyScenarioPlant" + ADD CONSTRAINT "SupplyScenarioPlant_supply_scenario_id_fkey" FOREIGN KEY (supply_scenario_id) REFERENCES public."SupplyScenario"(id); + +ALTER TABLE "public"."Building" ENABLE ROW LEVEL SECURITY; + +ALTER TABLE "public"."BuildingSimulationResult" ENABLE ROW LEVEL SECURITY; + +ALTER TABLE "public"."DemandScenario" ENABLE ROW LEVEL SECURITY; + +ALTER TABLE "public"."DemandScenarioBuilding" ENABLE ROW LEVEL SECURITY; + +ALTER TABLE "public"."DesignVector" ENABLE ROW LEVEL SECURITY; + +ALTER TABLE "public"."PowerPlant" ENABLE ROW LEVEL SECURITY; + +ALTER TABLE "public"."PowerPlantScenario" ENABLE ROW LEVEL SECURITY; + +ALTER TABLE "public"."SupplyScenario" ENABLE ROW LEVEL SECURITY; + +ALTER TABLE "public"."SupplyScenarioPlant" ENABLE ROW LEVEL SECURITY; + +GRANT USAGE ON SCHEMA "public" TO "postgres"; +GRANT USAGE ON SCHEMA "public" TO "anon"; +GRANT USAGE ON SCHEMA "public" TO "authenticated"; +GRANT USAGE ON SCHEMA "public" TO "service_role"; + +GRANT ALL ON FUNCTION "public"."get_buildings_in_scenario"(id bigint) TO "anon"; +GRANT ALL ON FUNCTION "public"."get_buildings_in_scenario"(id bigint) TO "authenticated"; +GRANT ALL ON FUNCTION "public"."get_buildings_in_scenario"(id bigint) TO "service_role"; + +GRANT ALL ON FUNCTION "public"."get_demand_scenario_id"(building_simulation_result_id bigint) TO "anon"; +GRANT ALL ON FUNCTION "public"."get_demand_scenario_id"(building_simulation_result_id bigint) TO "authenticated"; +GRANT ALL ON FUNCTION "public"."get_demand_scenario_id"(building_simulation_result_id bigint) TO "service_role"; + +GRANT ALL ON TABLE "public"."Building" TO "anon"; +GRANT ALL ON TABLE "public"."Building" TO "authenticated"; +GRANT ALL ON TABLE "public"."Building" TO "service_role"; + +GRANT ALL ON TABLE "public"."BuildingSimulationResult" TO "anon"; +GRANT ALL ON TABLE "public"."BuildingSimulationResult" TO "authenticated"; +GRANT ALL ON TABLE "public"."BuildingSimulationResult" TO "service_role"; + +GRANT ALL ON SEQUENCE "public"."Building_id_seq" TO "anon"; +GRANT ALL ON SEQUENCE "public"."Building_id_seq" TO "authenticated"; +GRANT ALL ON SEQUENCE "public"."Building_id_seq" TO "service_role"; + +GRANT ALL ON TABLE "public"."DemandScenario" TO "anon"; +GRANT ALL ON TABLE "public"."DemandScenario" TO "authenticated"; +GRANT ALL ON TABLE "public"."DemandScenario" TO "service_role"; + +GRANT ALL ON TABLE "public"."DemandScenarioBuilding" TO "anon"; +GRANT ALL ON TABLE "public"."DemandScenarioBuilding" TO "authenticated"; +GRANT ALL ON TABLE "public"."DemandScenarioBuilding" TO "service_role"; + +GRANT ALL ON SEQUENCE "public"."DemandScenarioBuilding_id_seq" TO "anon"; +GRANT ALL ON SEQUENCE "public"."DemandScenarioBuilding_id_seq" TO "authenticated"; +GRANT ALL ON SEQUENCE "public"."DemandScenarioBuilding_id_seq" TO "service_role"; + +GRANT ALL ON SEQUENCE "public"."DemandScenario_id_seq" TO "anon"; +GRANT ALL ON SEQUENCE "public"."DemandScenario_id_seq" TO "authenticated"; +GRANT ALL ON SEQUENCE "public"."DemandScenario_id_seq" TO "service_role"; + +GRANT ALL ON TABLE "public"."DesignVector" TO "anon"; +GRANT ALL ON TABLE "public"."DesignVector" TO "authenticated"; +GRANT ALL ON TABLE "public"."DesignVector" TO "service_role"; + +GRANT ALL ON SEQUENCE "public"."DesignVector_id_seq" TO "anon"; +GRANT ALL ON SEQUENCE "public"."DesignVector_id_seq" TO "authenticated"; +GRANT ALL ON SEQUENCE "public"."DesignVector_id_seq" TO "service_role"; + +GRANT ALL ON TABLE "public"."PowerPlant" TO "anon"; +GRANT ALL ON TABLE "public"."PowerPlant" TO "authenticated"; +GRANT ALL ON TABLE "public"."PowerPlant" TO "service_role"; + +GRANT ALL ON TABLE "public"."PowerPlantScenario" TO "anon"; +GRANT ALL ON TABLE "public"."PowerPlantScenario" TO "authenticated"; +GRANT ALL ON TABLE "public"."PowerPlantScenario" TO "service_role"; + +GRANT ALL ON SEQUENCE "public"."PowerPlantScenario_id_seq" TO "anon"; +GRANT ALL ON SEQUENCE "public"."PowerPlantScenario_id_seq" TO "authenticated"; +GRANT ALL ON SEQUENCE "public"."PowerPlantScenario_id_seq" TO "service_role"; + +GRANT ALL ON SEQUENCE "public"."PowerPlant_id_seq" TO "anon"; +GRANT ALL ON SEQUENCE "public"."PowerPlant_id_seq" TO "authenticated"; +GRANT ALL ON SEQUENCE "public"."PowerPlant_id_seq" TO "service_role"; + +GRANT ALL ON TABLE "public"."SupplyScenario" TO "anon"; +GRANT ALL ON TABLE "public"."SupplyScenario" TO "authenticated"; +GRANT ALL ON TABLE "public"."SupplyScenario" TO "service_role"; + +GRANT ALL ON TABLE "public"."SupplyScenarioPlant" TO "anon"; +GRANT ALL ON TABLE "public"."SupplyScenarioPlant" TO "authenticated"; +GRANT ALL ON TABLE "public"."SupplyScenarioPlant" TO "service_role"; + +GRANT ALL ON SEQUENCE "public"."SupplyScenarioPlant_id_seq" TO "anon"; +GRANT ALL ON SEQUENCE "public"."SupplyScenarioPlant_id_seq" TO "authenticated"; +GRANT ALL ON SEQUENCE "public"."SupplyScenarioPlant_id_seq" TO "service_role"; + +GRANT ALL ON SEQUENCE "public"."SupplyScenario_id_seq" TO "anon"; +GRANT ALL ON SEQUENCE "public"."SupplyScenario_id_seq" TO "authenticated"; +GRANT ALL ON SEQUENCE "public"."SupplyScenario_id_seq" TO "service_role"; + +ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON SEQUENCES TO "postgres"; +ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON SEQUENCES TO "anon"; +ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON SEQUENCES TO "authenticated"; +ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON SEQUENCES TO "service_role"; + +ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON FUNCTIONS TO "postgres"; +ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON FUNCTIONS TO "anon"; +ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON FUNCTIONS TO "authenticated"; +ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON FUNCTIONS TO "service_role"; + +ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON TABLES TO "postgres"; +ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON TABLES TO "anon"; +ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON TABLES TO "authenticated"; +ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON TABLES TO "service_role"; + +RESET ALL; diff --git a/supabase/migrations/20240212191502_add_description_cols.sql b/supabase/migrations/20240212191502_add_description_cols.sql new file mode 100644 index 0000000..16b0a94 --- /dev/null +++ b/supabase/migrations/20240212191502_add_description_cols.sql @@ -0,0 +1,5 @@ +alter table "public"."DemandScenario" add column "description" text; + +alter table "public"."PowerPlant" add column "description" text; + + diff --git a/supabase/migrations/20240212193422_add_year_available.sql b/supabase/migrations/20240212193422_add_year_available.sql new file mode 100644 index 0000000..3dccfe0 --- /dev/null +++ b/supabase/migrations/20240212193422_add_year_available.sql @@ -0,0 +1,13 @@ +alter table "public"."DemandScenario" add column "year_available" smallint; + +alter table "public"."PowerPlantScenario" add column "year_available" smallint; + +alter table "public"."DemandScenario" add constraint "DemandScenario_year_available_check" CHECK ((year_available > 2023)) not valid; + +alter table "public"."DemandScenario" validate constraint "DemandScenario_year_available_check"; + +alter table "public"."PowerPlantScenario" add constraint "PowerPlantScenario_year_available_check" CHECK ((year_available > 2023)) not valid; + +alter table "public"."PowerPlantScenario" validate constraint "PowerPlantScenario_year_available_check"; + + diff --git a/supabase/migrations/20240212195858_add_desc_to_pp_scenario.sql b/supabase/migrations/20240212195858_add_desc_to_pp_scenario.sql new file mode 100644 index 0000000..fe833e7 --- /dev/null +++ b/supabase/migrations/20240212195858_add_desc_to_pp_scenario.sql @@ -0,0 +1,3 @@ +alter table "public"."PowerPlantScenario" add column "description" text; + + diff --git a/supabase/seed.sql b/supabase/seed.sql new file mode 100644 index 0000000..e69de29