From d74a79799d7ef9aeeb3436ca9b5a79f814e7779f Mon Sep 17 00:00:00 2001 From: Ni Wang <125902905+gnawin@users.noreply.github.com> Date: Fri, 20 Sep 2024 12:02:20 +0200 Subject: [PATCH] Add multi-year information to advanced concepts in the doc (#1082) * Add multi-year docs * improve docs * minor edit * remove files * Add error --- docs/make.jl | 1 + .../figs_multi-year/discounted_annuities.png | Bin 0 -> 20336 bytes docs/src/advanced_concepts/multi-year.md | 53 ++++++++++++++++++ src/data_structure/economic_structure.jl | 5 ++ .../check_economic_structure.jl | 48 ++++++++++++++++ 5 files changed, 107 insertions(+) create mode 100644 docs/src/advanced_concepts/figs_multi-year/discounted_annuities.png create mode 100644 docs/src/advanced_concepts/multi-year.md diff --git a/docs/make.jl b/docs/make.jl index ae4809a583..1003165803 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -60,6 +60,7 @@ pages = [ "Standard model features" => Any[ "Unit Commitment" => joinpath("advanced_concepts", "unit_commitment.md"), "Investment Optimization" => joinpath("advanced_concepts", "investment_optimization.md"), + "Multi-year Investments" => joinpath("advanced_concepts", "multi-year.md"), "Reserves" => joinpath("advanced_concepts", "reserves.md"), "Ramping" => joinpath("advanced_concepts", "ramping.md"), "Lossless nodal DC power flows" => joinpath("advanced_concepts", "Lossless_DC_power_flow.md"), diff --git a/docs/src/advanced_concepts/figs_multi-year/discounted_annuities.png b/docs/src/advanced_concepts/figs_multi-year/discounted_annuities.png new file mode 100644 index 0000000000000000000000000000000000000000..642ba3ea2e90377016b44ba8f958d32f7e337494 GIT binary patch literal 20336 zcmcF~Wm{Wav@PyZ+`YIKN^w%0;uMOzyHniVt+)gzuEnJ|MT$EVcXyYNobcXze!}?> z*?F>`z1Gw*$DAulMM(w|jT8+A1_twstmIc17+47Odocpbt5B*Ijbm2h|UG&lxmTl>tRA~)n|XTVf3F5Fq8&1 z+?Y7rIF!Xu1`>ZH0FQxRI@T-2!rIP9UjLU9>T>UlA=XnXw2O~Ug9vqH>sXBkaw8y(Q_-;sA)RHAjp z#DmBRPSo#rlsOqvON`{qDbZYb`ebSXn0_Jcf}0&SLK4;*(B$`(DMXE8QSiX&fqf85 zPRjoH9TBZh0oy%VPTR!7%6_w)l57`OMBMh{UO|Jv_F_&C|bePkH1 zfajmH8DXE=v@M>KP`^+dj%go+`xa50-*Ygo^wYwQdI-@&72CivV%R031j{4enf(xj zyqweGH7@>cQGQnwRd?b;xOmStiI*U+QFym8u{1`(9;dE2?LhjMfKsUKV#J+^o(kf5ERLxEZfu7He_w5_xHJ%tdW(wAL!Rf-iK{N-h*}$A8?Y zL48@;ZZlGD6vz?K0Lpz^T5B@i2QNLOa~+M~qn!pE6fBd;zZ^N%wNt8xt^tqHU%67Fv?han6gXgn|p*8zVzpkjv_IlTT8dg=aFNto2(4W`l1 zv{FvRjTQA~bxcemCn033!NE>sE~wd|n*~AMVz+V%ps}Os7#QUbjU-FG0+0eR90SxS z6EmnCMMK4(n35E{Eu7wd@c?u&9Sy=NYEPcq2C7eNb{Ta1Y9i6kqfQ$i8Dfu#c8?D@ zs8hN_YW$Aem_iEOUmcy~=ms3PurCyH5#;`i4Ls@f2=GEHMl5etD}|~5SPO~bJLclz zFM3(1W(#2zfX%*d-oDeXu6RFIK9a_hapnkBA*+?qQBF5XKni%`!&U%^jqda1_5wrP zX1A>u^SQQaMVN0!KV-NyEhzc{}$$?y%I|kTw`%rO0`ob1JQ&gL`gZP}u9oTll_e<6kg* z>6+Fj9;#7G!pKeK6f8OR`Jy*V7)zvaXQBn!Pi%aE3S7d$0&QPuq?bZoo~wx#kI_~{ zXFFXL!g_#j)e8*2_iwsC!W^FbUOr%$aUyOSfjwV{pKXe z#JGGN(?@4|8gEJv5>t9mFeF6%vfOy<=zQ*Y^2{>=l5f2v?7lO**HR_kZjZAvgCC>Lg39h4Sz(qFz4qB{79P^WeOHGx?N39ppsf zgy(Ndkf3!1ryUbvzHI{tD6+i;G}U31k_wYvwtN@E0c~A(IiB0kGQ$qS|60Ok2bc0K zoajMD{vm1!vMa04UH*MbKxL|<&=?U6)za&KS~@(o3^c6N0#S7r*sIGmF}({xXy8uXD;5C188M>FoN)`_=d0qg&_F1}d@~34 z;5vPBWC&`z{d<1DoplgiTl+q)*0-Yk%lymlR)g$Fbv*SAQufZN%}`ZgdiAKm3YrOG zGq_LhE%Unn`X9WxsrggC?QN~@w~`z11?73qR)feeP7L^buXuPuwzn?Jz)oPQCI*H* zC;6u~Odc3k@kL1cVEP9>9^}nvXtwWLmci4;Zw~quH;IL8@jPH_jiJNu7yOR=jJvhr z#8txrWOAcSqMa2L*ij9~$Ic?IZ1`@{&U(%&KnW*f6PlwV*)Q5&?PuPMB>=neQM)u? z=ls)HPGYqhOx2U}BIKk#;T%HHaPy&w8y(z}&+*_>Q;v-{%H4Dg{P+5{ik;3t0Q&{m z|2N$r*ZT|d<0+ljhKl++8wc1C^cj`K6)tX=fompbj)3KIcbK$^ zVKR=3(Z6pXfle9&Qx~jo$J5ens_ekITn0F8R;speLDU9Y8UhYt}>v%%tZ z=dNz?z$=*F%5K(YkZ-PNTwU)a?ENtxd7d1J2YIRAp%l~ts7r{@+gWHgll?cVURN^)}oJ`?C+;u4pCC3?urtNl5qM}JeIVA>!A zxO|2CnjEn)x_^kry1sK~vJ%Abh@5h{m2F`xCsk5%)9GWzUjf8<9eX+u1nXj9r9X@- zDG!G5X<7;QB=JxzIk%FG=NgP<=#?LQ!su@$MF@tsayXNAzNco;+%2Hyqx1bkLf-W? zIY>K2J~1y1ciqSS@b1~%*IwFQks^&VC%odSc#CdOmiSvAO?I z=lJI=R@B_{Ks1N&jcNMHtXFj;!FKpE+lxgvQI6#l`o8QizxbRJ)pRiC&CpiOx0DY7 z7KnnY{=SfZ4aXMkUdBmi{w<7wLko-Bc0V;oVFEneNf^>BY>FVY8&!i>$5;w1iUVWi zZy~(ZJM_=5qoXqkdkHdMu#so2E3Wyig5vcKCuJupL2=tw=VCZz0#$@EZ$Vuh&M2Y6 zz@L%iOB~bpvD{mRahO6=z-%+^|MBXa$dJP+&+Fsy8LtEUik6-i73lEQB_<6PffNLEGk09 zNi|KtJXn?-t&GuRVeaa`CEGY@S*qx9@xQ~fpq?EVFE$ws#Lz6@Nh1QZu+5>Z3j@-r-KQr@A8D7)M9e{GK&Lj;9V%(l*Ix z{x#=|U+A|~B3RHzE%r{hyM+C9@G+IpcMn>BS?N$RB#bsbK~r0e;H?S+Jv}Y^cv$T1 zTvh3%s)IziFzFc3QdPI9bnfNkgsk*8FC_88yDpz1JVlet+4h5IA2ms0*E2t) z{prqt(L$54tc>a#2*$P$t%i@6G3mktr+5L%rE8pl9bmaQ=5ETiC%F@2-O?DSc1NlB zs!OW@D8;GBewj1vaqAwSeYDivI|O^8Bz}OxcXlV)SNkL&6bS!`9kB{PGa~#apt=%M z4~Mgl9{uq-Pdo=LXoV+VJYcI)FK%ulpn@!7qLueuqPg#=By5@e8J>AQvVp(^@2g{m zZhmgufiRt%n17mlC1lT{cvCM$^W>GUZUo4Ll0&%JMoi2fZSf5ntG5GbC^V1OxJEYw zekwikAYORtbAm4%Cyd0c!#V1C3f}AU!1y;5!^%kIb7p5oU~j0@oLqG`R}v(2YE%-6 zXdYy12%Ihixcl(5dk43=t9}r5AMzvst;D+-LBYYi@EgQ22u8wr0&}e3ma=ijnNum+^=~uQzw+P2K)FERpI#mj&&?7vDBg*D zZuV#Y_fpg0F@FlT+Fe3EJ7ie^#g35MTV{ewTOxduawfE~hXWtJn9W*zsqOVtbEc6m z1M#N0kB+M3Os8#m5GX2{S|R%5_=(R5!ps*8-%ncc1`Emf3$d`UOqh%lX-?j7Aj1D%CC%YqPn^7cgPoimp@(7gl0Q7WHXY z=BF?r&!4EQhBQ=hp=Q=I^6$xe-L$E5slHo(7J-fgrfP3;vu8QYUx73|>WS^b7K)}Z z=qx0;Ny3rf=HU8#;*z+bPZs+gy)ehgD*J6~!plczALH@2Dw`M5^M}oZyNA+mW;R(= zJ8;L6Mi(OU)gNFm5OO}y=t5z@W&)a|xoQ@g*8+V0VjygAdCmK(oRnGtFo=8>S$V;S ztBwsGitenXKBxSbK*C_xBnpDI4gvi*P`#^7@oYmRb7g*Bkl>5+L9)E0ynPc;{5hKB zPhR7T>9evYX+?zMJqkL7@~wUFSF5gvD*R%PC*_p;A~aHuXhkvYMae}Me-151Zgc4) z0OVmBY5)%n_uVY0Ue=e0lB`V=)=)X~@E2iWWe!lW|K#3GfO{#&yd!;A@9hAa7XA4G zJM@>eV>aOx38RK^`kuL{C_$)U=X~IT5)jRgW3FEStoXA0u>xovjJ>W`?%=C)mm{7p z6R3u$aAfMVN%mW(sX4$P4V|jJK%o=f_oBDK0fUI(6Jifkz#16gcIt6ys*E7s+zY6A zUGmBq=@W;vDb6 zbcKSHl;AWaz^60o*{0V6#fjdrD{Yp?#Zj+G-UsWmfD+W1pP%EnyLCuYb&CjyGFJaqi2D8AFp*few!EYR_y`%}v*f$XDB~ z_!|P9k#w;d`%{xcGx6#VfuvnrZ<*cOOxC=y8;1g_-vbMJ(=M(39FGeE*1Q1^tEdE4 zg++5O)|gq<#pMLQ(lrzejP1cEsfu?_(Sc&VK1$zBzj}pBzZ}GDmYzUzCC;o)u*wDi zmS3A|aEEEdOUc5CZnZ^)3`=njjhDU`$*Y01h$Ax*oAchV@abC_vmw23NbKGR0IU>? zr(1jAgYeh&Oo6aI_``a^>A}B$^Oaq}#FXsW6rdoTQ1I_a%YCIi*ESH;>ycpt=MJ?y zX@m-^fuKNTcEm4taSN^wm}PlcORenW|oI$-=)2JlZ~ zsGxN&d#CdE_ZwQV>23kgs(Nc{f}EI)wI+>m4WyHS9e z8f**InPh}eAVCBAFQp&I9M~NfKXgS9)Va0je^qgPYe4>V>d;>SY@8>u?@cCqRlei@l$8}{^j?Pys>O_`i^BX`sj-P( zpZ2mbJ#7Po7=DaA{qI?AU#l2ABmYelS0c5+5^Qu z3n95#Qazu=7I5-C0*gZpSJtB0k);ZLVc9@EO2|xMo))l`9?k>49%45= zir-fV<+;ChcD>UWXP)Z;ARRl4fYX$KT?ywtXyDm6gN{ojJnq@#c|U-uFCkp77|6nv zPHEAH7e4Rb`-FN0N^3p`@e_s7cSeBPrpUUaFjD< z0_|ge%XN{1>lUgbbw1%W5C+oe6_Ps#u=46dA@Il-W65++ROc%5=u0~=^*Lig2HhXX z^bSvMc4HKVU-e}AH~>+AqZ+&C8yvE@#Icl>-NVrwtSN>9fEOxX8rsK*15lh5)RemU zIlooC_||Q!xu5yhG|R+5;_3AcOVwGyA2u(n6l>EqI`!{)S`*R)4{q9iVQcPZ3o(<4 z2FRAeXc3q3FNV$Epz-Pk&LXZ}pojj_z(-rSvm5}hkg{EkKCl5Z6aMaSkH67pku*4? z8?li8jF(sn057=D$mb_qJHGg_cKOa|O=>Jy>D z`1HrmNcR+iC(;%=xL~6*{#aHynV%^BX|L`+$WBA`xQggzQ=0{@4*EQSl%Y`ktX@Ez z==vW;7fHban!j%8iL6NqB^CTaTs@fzg4Uzt zpr5q)h8y#60Y)mU56iYkXyy_6e$7pnX}8vN=iLCIDc|tO1XP@ z?=u^ejVDI@^!n0m9~{wiPsVmE%>Y7p@b^p|B&$PyY>0Y`3kgJ0UYqJYW2pbyld0rk zyE%e^ybytw$yE4Ej^P{##dQm@uFAK(a(86hzC{ZtMJgE;JKJ1gcnkGWV0LD(l-iBc zO`nN=XhfJl(-`yRg|2@56>YviOZUSMGCwfvYICdB;;pir+?0TiH)c3HSR8-9-KnIv z5;j1OE^q{92Ucr6y%M&5W}|ULAy+4Z8fZ*Sy@+&(jbWqFQ%~YW3+gBO@3EMe{xt`V zl0&>iV7>faDwLj;gAm4%>J6fI@}ghZ{iU}7FW*z7@7{0~z{ko)>+?ed`*$kJPRl}$ zLx~gL1}#wI^JvV>Wtb16)gSN&RZ^(jtE~MKYO>2_5fu)85(R~Y^3(T>!PIO`h6S%L zt(B-@P#JtH8Swv_j5p3}PCQr^DE5853&y(>T-HqaPuPWW=*XM93@aRIF9Ne>I*}UF zQ&IO(=eabv>``ne8GQ$_QzCe6(!@lp;E$PAXTAiQA@QpLjIepwWcDJL-Og({u?& z0@;hKmK#JMJ5ZLMLtMuV?3N7T^doGXc1GG{<;dNY2>ZDPQO+r`zn=>PZwIqc$p54v zCjYGM%+Lku;l|&!pcb$;JE(MY-r=jI`qN4d&|uGv8Huict9SHVw*qQPU>)t&qjqn_ zf8g&$1)eX?UmvYb~#XVaWv-L)IAEo9fr=GoOb4x)oGg zq6{4e^Utzf=&RK{-Jez=Pu^}0*ehn$LOtM+!icx4ly9z}SSYZV2WmNRHABEcjo05Y zg6pr8l9zPuMy_p%vSgL z*N#@H1%}gn_uoB|b|dTq(1z$z&BYdOPnZBluDFqxVGZo(TKLpB6)P1)KtdenmmzU4 zP9o(0up6@JfWotkj2=pW^iVf_8gJNsFtb2=J0$@e($)vVygtyZheA)>4Vt@q=LVG6 z8TN)Iq(xCvL@gD|n4A#bt@S9Kbl`jdVH z#PTQ6pUq)5HeMf4xm>{b*R`cbKxQNg~8b2TRaoISVwcERJD&19;g<% z#Au{dfgM9KEZ87QX77e)(DLUR#nebp?YUKN))QjIdnaQm3nV8$n3K{s4$Gvq4@jah zjYHH2m`^PV`(E`EA*swg_P&O!EpcQr-+UV?1huk;ll3wkS-9Z~bbG*;Y znNzLWk7o)$1HAFr1!AINOVl{lM?AoQ&#EdbhHrKNX(rX!3lw!4igWyy~7I`CwlCoVn@hH$UVSg8PM@$MF} zi5gq;;HMBIr6oc0q^rG6`QTJ&z@*#5Jad2F)j#jt)8UqFwY^LWKkg%WdUyYg%Q$33 z%F9Sf)El`u(p)(#Fc=uX3WfEEz6PG9U)CODZ-D|d@{3Oa_Lh|#D1QVY3i5M(pPM>K zeR`O~{}n2jl`v$Uz5y$oMv%lc@Gtl<5`Akj>uIdNbbeCSyQXf^>xJ?nu>Bv2bGL;* z%|bQHEIu~Jpag3k&KJ1O=PiV#f z<=_s$N2n-R7)KwGW}%!pv=;A=#LPOjbbypaVQ*34Zv`|XyE0;yt~nRvaA1eL#8=9L z)o3>X?}NJy*9;nuTbSS#pKlV*fkmtk)yoTk=`as$ z_w76adcm+BYgi>f)y8^Z6T-Q!S`8)KcQxJlNoZ-;tYy7%7zGt0t$-d@I-w9EnLSN#MQ990JBdOT5R0ogsJs+>`rST-KZsgwe-(Zt9o^ zCo$k@tXb0|a9zEYGRU2E^dl{B7FBN&Nbq{t3^~=uQ_0A#FhJ3{uOjHd7n`_wctZN6 zjgO$j=hO+aa90|!ZQoV{E!6YnLEzqHXF<%Kd@*kxLGR$SG!tljLN|BDnbyq=^PiJL z(e%L%^C?N(q?d=zQwtm00(Hm2d0_jq0OIG1o(h35(kYM62#{wA_G7rhms~_orbq2` zU>#il1-r@xY}gZzE@{)w6brE6=3cC$v6>`e;@(J4mDE8;tB5%aB;*UIje!ym@qmLD zFMSNkDkdc|tn(CGqY_xnM^j5ZwgBLOKQY^|tICHDrEg`b9SL_!z#P$1+c>BmECOaosH{AMz+1$?h_n&Ws3DYOy*?7{Z3D(q2u*>WPqai*s_8p zOE1Hl|CcP$yh^r{g#JW#`)D(-nq)$Tcq~;{W)gmD{@9YI$_h>PP1iX0@s{W$L^7eK z4!O+G7!vUCM%Dryuu^5l&i#0=iXhl1=~Tc33psG*;WZ7kedwk}L#)0@Sl5dGotBqu}GPiMN){u0V`p_xLcQDBz5WhgeOcI@_wJN0-2d0)xll&Z2=3E=_%~0HY7my zCeaw5SiF^xzPo8aR`RgT-*~khQPs{Vm_>~h$rtY}_RkcQ?cKP*E~x8-WZ9JU8ohJy zz+PSvTwg&#Lh6%=)0*8_gmg9Ezrb(NNmpIHyk6LztQ#cUonc1?ZT7q@FYjE1C+MMv zYu=IF!^Uzjp?jRKMmhSO=sw1DKccVs-!}lm5(d*MIY3WNd7^%#2_pBz;43N!4#4lU z+xhm7HI(2km-1rb(l(2@IckZdHvdI|2)SA|z?}FQXiznJZDISQ-@dM`nt*eUac*i% z-SyDsk(J2VebcGVrqy#m;KdonrwdAj zs-m$OEK}vl(e2aNF2ioqzBl_drP1u7r1Q+C02|tSTId6;#DA~YG!*19)O^^{gFu-g zozrT4fA;aw0e`K>h(1u0e)Tb`k&~g9aeMoPb_h@o!4$U4itAHg9XxcP<$B%iPFTf@ zf1dgv^%aB5jEjZ{Vr)b^3$n?2`KXv^9d(QKs~ILWdiKsh@k2-2Z4|wZnr;Z43|4o` z-HTlyDBsG~(Z^7CcGTRLt99-Cp~+oB0?$`8;IRxx{`vW3eQ`liQE`iI5vd6zQ*etN zCSGBsD!s6$g}==RheR{`ASf z&Od(;6sd|91EUch6q){h?$mmKG?Y^+=8BHx{-{=cRgl`P@47{Bf~7&CoJh3Y#P1nh z$#NGAUR2lqvBk6u6sS5yakKww9GyOw_L-VmSEY9RgNviY^%G4SA2`;=AoQ&7c}fqV zkH+pK2)5bXsI~fMTOM&AGg-68oIU%)r}qzoK-DH*!07k*!fMn~u%}_~W}uGK)o0n~ zcQ3rPtfb+)>*2fP5;^{n-*jc1DVyDksOl1ikjJL6A;&PwAks@ldtvHe?xmHOAf_%p zKX7qe>(xsP5^%Cq&f3rrn8%j~&BDsCV;!E-BbtQ8<<#aAfRL9wzu#YeUH}+gDBGL9 z673qlTc0q^B~^vYCn(I|f7UqN;qJljVtX2G2VpetG{O)e7Ro~=DYHt_0Ic^{j(7Li zR)05A8_;*jqr4}Eq`tI%t9pfo&?D2VYL?E=V*+mOZT&CO6ZshR z@b(laBb}JTB3L7xg61l0$%(>tA*u@IPEK~#*8S5z8UGYo$B~`Xm6TvHD(6X6Hm0f} zNgX0*>*5HzV8F9iKQA*&;4iF;V%*=3MCD@Ik>1Rn%=@crZUll`4;Mdsw2)a&sPFuV z;_;4CB2GpQ2y{kvi4S^a2rX>oV;KnXdqw%{ULJhZNVngomR-HE zFnT<(hKQ6nw6=~!k+UnbfwLp9B!#gbSw<X&buUwnPw%vp2;f^s+Q4A3)vL=QnL%{e0a7-sQEd?ndx;o`R>rk` zwNgyr7-j9QNba%m9UBkWzSD7sG<>|2aKYk09%}*#u=kh;cQZu8yMn9-Tu}|ZDIB!* ziu!U4;A*yq<^VN+C+|QIIlEc<|RqQ)M|%93PN6{r<=Qgsj%IQOM$I#s6=N}&h4rD89|O7fD!)g_=@`K z&^W(F17Gc+FW^@LI{fc@>Z8>3q^UKEbs-mTDQzLwXZ(0d0ov#@C+YbnizTuxy+^e( za{RC|=#5C1$6e0V<;9m3?Z#d^=diaO3JHk4 z@)n+17rB(-iIiM!{~a?esj8hMJgM^g_GaH=XoEz*x$)V%h|24w!=!gWrrRRmUbcJR zUBG?u+VnR5{fIyjT{&Y9vmiYK+NYOh*^$fjr2gi6&+rRY0~5ccF4eX_dp~_Gj+NnX zf^_cufl_DNZKJ!*k)I+#t`FLanY#mH=enQxa~$@21=O5O;`YXF2AKQA=R`Z+U@@Fj0oqOZ8@0Pv{96%PXu~(1pvcAy zfG7Ze!SqKUeNw<%XVHEQ*6kiCG5JTCz%vHY?k()Wn)Ysl?XArEC={#i783=*hCe|E zdauF~kMC{i#o8fs0?$>s=F5Q&BbL!08m=0%GdnO7@>cTX7_8??tkOG=yAq7HQ#h*hD`)jR=(0Kfu5H z!f7I4Sp_+Yz$d78(WmdoGwk%Eq{sgojX z%dQ|muO8tdc1LXoBdr?XaZWBb@Gg_rb|Es34auvev2k;$&h!HDo1xkk#1V4uxV2Fj z!RL0p`=#UgxYEk#ePtqB8VVWf-=I60xaPJtlGv$|v{Z?cLD<>dcG2^@?U+WGU19jb zHf(`LY1gN{FAZSvsw$vRYQo zFaFEib^17Js);~Niq8vci|&dbQ`%L&gzZP&k9+D*>)+*8gb$&AX}0*r?qFx>pd>

BD&Rd%zFCY{>3eVDK%1h}djrWc}I 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 "date_time", "data" => "2020-01-01T00:00:00") + discnt_rate = 0.05 + tech_discnt_rate = 0.85 + use_mlstne_year = false + candidate_unts = 1 + inv_cost = 2 + object_parameter_values = [ + ["model", "instance", "discount_rate", discnt_rate], + ["model", "instance", "discount_year", discnt_year], + ["model", "instance", "use_milestone_years", use_mlstne_year], + ["model", "instance", "use_economic_representation", true], + ["model", "instance", "roll_forward", Dict("type" =>"duration","data"=>"1D")], + ["unit", "unit_ab", "candidate_units", candidate_unts], + ["unit", "unit_ab", "unit_investment_cost", inv_cost], + ["unit", "unit_ab", "unit_discount_rate_technology_specific", tech_discnt_rate], + ["unit", "unit_ab", "unit_lead_time", Dict("type" => "duration", "data" => "1Y")], + ["unit", "unit_ab", "unit_investment_tech_lifetime", Dict("type" => "duration", "data" => "5Y")], + ["unit", "unit_ab", "unit_investment_econ_lifetime", Dict("type" => "duration", "data" => "5Y")], + ] + SpineInterface.import_data(url_in; object_parameter_values=object_parameter_values) + @test_throws ErrorException run_spineopt(url_in; optimize=false, log_level=1) + end + @testset "test Benders error exception" begin + _load_test_data(url_in, test_data) + discnt_year = Dict("type" => "date_time", "data" => "2020-01-01T00:00:00") + discnt_rate = 0.05 + tech_discnt_rate = 0.85 + use_mlstne_year = false + candidate_unts = 1 + inv_cost = 2 + object_parameter_values = [ + ["model", "instance", "discount_rate", discnt_rate], + ["model", "instance", "discount_year", discnt_year], + ["model", "instance", "use_milestone_years", use_mlstne_year], + ["model", "instance", "use_economic_representation", true], + ["model", "instance", "model_type", "spineopt_benders"], + ["unit", "unit_ab", "candidate_units", candidate_unts], + ["unit", "unit_ab", "unit_investment_cost", inv_cost], + ["unit", "unit_ab", "unit_discount_rate_technology_specific", tech_discnt_rate], + ["unit", "unit_ab", "unit_lead_time", Dict("type" => "duration", "data" => "1Y")], + ["unit", "unit_ab", "unit_investment_tech_lifetime", Dict("type" => "duration", "data" => "5Y")], + ["unit", "unit_ab", "unit_investment_econ_lifetime", Dict("type" => "duration", "data" => "5Y")], + ] + SpineInterface.import_data(url_in; object_parameter_values=object_parameter_values) + @test_throws ErrorException run_spineopt(url_in; optimize=false, log_level=1) + end end \ No newline at end of file