From a6955f4edb10a2ca54b1971bea853e3bbd72a5d2 Mon Sep 17 00:00:00 2001 From: john howard Date: Mon, 2 Jun 2014 15:09:41 -0700 Subject: [PATCH 01/11] added zmpl language declaration --- lib/linguist/languages.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 24e27408..da8180fa 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2406,3 +2406,8 @@ xBase: color: "#3a4040" extensions: - .prg + +Zimpl: + type: programming + extensions: + - .zmpl From 5b3152d99d809495bb0e8b919a3edf9042a98db1 Mon Sep 17 00:00:00 2001 From: john howard Date: Mon, 2 Jun 2014 15:16:00 -0700 Subject: [PATCH 02/11] Create sample.zmpl --- samples/zmpl/sample.zmpl | 355 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 355 insertions(+) create mode 100644 samples/zmpl/sample.zmpl diff --git a/samples/zmpl/sample.zmpl b/samples/zmpl/sample.zmpl new file mode 100644 index 00000000..50b65102 --- /dev/null +++ b/samples/zmpl/sample.zmpl @@ -0,0 +1,355 @@ +# Mini Manitoba Hydro LP Model +# Written for zimpl 3.0.0a +# Licensed under the MIT license +# Developed for fun using publicly available sources. +# This software comes with no guarantees and no claims that it is fit for any purpose. +# john howard, 1 Dec 2009 + +# Inflows: +# CR churchill river +# LT lower nelson tribs +# SL south indian lake +# RR red river +# WR winnipeg river +# +# Major Storages: +# LW lake winnipeg +# CL cedar lake +# +# Controlled Channels: +# MF missi falls +# NT notigi +# EC east channel +# WC west channel +# +# Generation Projects: +# GR grand rapids +# JP jenpeg +# KE kelsey +# LN lower nelson projects + +# variables and constraints are named the following way: +# Type Subtype 2LetterName Kind Modifier +# (v|k) [c] (..) (q|i|o|p|v|e|s|hk|ss|tw|mb|rc|os|ur) [ Start | End | Max | Min | Adj | Fact | Offset ] + +param kTS := 662; +set sTime := { 1 .. kTS }; + +# for 5 day averaging requires indices spaced 3 apart +set sTime5 := { in sTime with t < (kTS - 1) and t mod 3 == 0 }; + +param kCMSd2KCFSdFact := 35.315 / 1000; + +# column 8 is month +param vMONTH[ sTime ] := read "historical.csv" as "8n" skip 1; +set sMonth := { 1 .. 12 }; + +######################### +### Inital Conditions ### + +# South Indian Lake +param kSLeMin := 840.0; +param kSLeMax := 847.9; +param kSLssFactor := 283.7; +param kSLvMax := (kSLeMax - kSLeMin) * kSLssFactor; + +# Grand Rapids Pond (Cedar Lake) +param kGReMin := 830.0; +param kGReMax := 841.5; +param kGRssFactor := 330.9; +param kGRvMax := (kGReMax - kGReMin) * kGRssFactor; + +# Lake Winnipeg +param kLWeMin := 709.0; +param kLWeMax := 714.75; +param kLWssFactor := 3040.0; +param kLWvMax := (kLWeMax - kLWeMin) * kLWssFactor; + +# Kelsey Pond +param kKEeMin := 0.0; +param kKEeMax := 0.1; # as modelled +param kKEssFactor := 902.0; +param kKEvMax := (kKEeMax - kKEeMin) * kKEssFactor; + +# Storage at aggregate Lower Nelson Projects +param kLNeMin := 0.0; +param kLNeMax := 3.0; # as modelled +param kLNssFactor := 200.0; +param kLNvMax := (kLNeMax - kLNeMin) * kLNssFactor; +param kLNvStart := kLNvMax / 2; + +#################################################################### +### Churchill River through South Indian Lake and Notigi Control ### + +param kNToMin := 15; # control discharge limits (KCFS) +param kNToMax := 35; + +param kMFoMin := 0; # control discharge limits (KCFS) +param kMFoMax := 10; # as modelled +param kMFoFact := 0.001; # adjustments (calibrated for 92-94 peroid) + +var vMFo[ sTime ] >= 1 <= kMFoMax; # Missi Falls acts as spill +var vNTo[ sTime ] >= kNToMin <= kNToMax; +var vSLv[ sTime ] >= 0 <= kSLvMax; + +# 2nd column for Churchill River +param vCRq[ sTime ] := read "historical.csv" as "2n" skip 1; + +param kSLiAdj := 2.3; # adjustments (calibrated for 92-94 peroid) +param kSLvStart := kSLvMax / 2; + +# refill +subto kcSLvEnd: vSLv[ kTS ] >= kSLvStart; + +# change-in-storage + outflow == inflow +subto vcSLmb: + forall in sTime do + if ( t == 1 ) then vSLv[ 1 ] - kSLvStart + vMFo[ 1 ] + vNTo[ 1 ] + else vSLv[ t ] - vSLv[ t - 1 ] + vMFo[ t ] + vNTo[ t ] + end + == kCMSd2KCFSdFact * vCRq[ t ] + kSLiAdj; + +# Notigi within-week outflow shaping +param kNTosFact := 0; # as modelled +subto vcNTosA: forall in sTime5 do vNTo[ t - 2 ] >= vNTo[ t ] - kNTosFact; +subto vcNTosB: forall in sTime5 do vNTo[ t - 2 ] <= vNTo[ t ] + kNTosFact; +subto vcNTosC: forall in sTime5 do vNTo[ t - 1 ] >= vNTo[ t ] - kNTosFact; +subto vcNTosD: forall in sTime5 do vNTo[ t - 1 ] <= vNTo[ t ] + kNTosFact; +subto vcNTosE: forall in sTime5 do vNTo[ t + 1 ] >= vNTo[ t ] - kNTosFact; +subto vcNTosF: forall in sTime5 do vNTo[ t + 1 ] <= vNTo[ t ] + kNTosFact; +subto vcNTosG: forall in sTime5 do vNTo[ t + 2 ] >= vNTo[ t ] - kNTosFact; +subto vcNTosH: forall in sTime5 do vNTo[ t + 2 ] <= vNTo[ t ] + kNTosFact; + +########################################################### +### Sask River into Cedar Lake and through Grand Rapids ### + +param kGRoMin := 5; # plant/control discharge limits (KCFS) +param kGRoMax := 53; +param kGRsMin := 0; +param kGRsMax := 40; +param kGRpMax := 472; # generation limits (MW) + +var vGRv[ sTime ] >= 0 <= kGRvMax; +var vGRs[ sTime ] >= kGRsMin <= kGRsMax; +var vGRo[ sTime ] >= kGRoMin <= kGRoMax; +var vGRp[ sTime ] >= 0 <= kGRpMax; + +# 1st column for Sask River +param vSKRq[ sTime ] := read "historical.csv" as "1n" skip 1; + +param kGRhk := 9.2; # plant HK factors (MW/KCFS) +param kGRiAdj := -0.6; # adjustments (calibrated for 92-94 peroid) +param kGRvStart := kGRvMax / 2; + +# refill +subto kcGRvEnd: vGRv[ kTS ] >= kGRvStart; + +# change-in-storage + outflow == inflow +subto vcGRmb: + forall in sTime do + if ( t == 1 ) then vGRv[ 1 ] - kGRvStart + vGRo[ 1 ] + vGRs[ 1 ] + else vGRv[ t ] - vGRv[ t - 1 ] + vGRo[ t ] + vGRs[ t ] + end + == kCMSd2KCFSdFact * vSKRq[ t ] + kGRiAdj; + +# compute power from discharge +subto vcGRp: + forall in sTime do + vGRp[ t ] == kGRhk * vGRo[ t ]; + +# Grand Rapids within-week outflow shaping +param kGRosFact := 10; # as modelled +subto vcGRosA: forall in sTime5 do vGRo[ t - 2 ] >= vGRo[ t ] - kGRosFact; +subto vcGRosB: forall in sTime5 do vGRo[ t - 2 ] <= vGRo[ t ] + kGRosFact; +subto vcGRosC: forall in sTime5 do vGRo[ t - 1 ] >= vGRo[ t ] - kGRosFact; +subto vcGRosD: forall in sTime5 do vGRo[ t - 1 ] <= vGRo[ t ] + kGRosFact; +subto vcGRosE: forall in sTime5 do vGRo[ t + 1 ] >= vGRo[ t ] - kGRosFact; +subto vcGRosF: forall in sTime5 do vGRo[ t + 1 ] <= vGRo[ t ] + kGRosFact; +subto vcGRosG: forall in sTime5 do vGRo[ t + 2 ] >= vGRo[ t ] - kGRosFact; +subto vcGRosH: forall in sTime5 do vGRo[ t + 2 ] <= vGRo[ t ] + kGRosFact; + +############################################################################## +### Lake Winnipeg Storage as operated by JENPEG and effect of Each Channel ### + +param kJPoMin := 0; # plant/control discharge limits (KCFS) +param kJPoMax := 93; +param kJPsMin := 0; # plant/control discharge limits (KCFS) +param kJPsMax := 9e9; # as modelled +param kJPpMax := 97; # generation limits (MW) + +var vLWv[ sTime ] >= 0 <= kLWvMax; +var vECo[ sTime ] >= 0; # upper bound determined by rating curve +var vJPo[ sTime ] >= kJPoMin <= kJPoMax; +var vJPs[ sTime ] >= kJPsMin <= kJPsMax; +var vJPp[ sTime ] >= 0 <= kJPpMax; + +# 3rd column for Red River and 4th column for Winnipeg River +param vRRq[ sTime ] := read "historical.csv" as "3n" skip 1; +param vWRq[ sTime ] := read "historical.csv" as "4n" skip 1; + +param kLWiAdj := 11.7; # adjustments (calibrated for 92-94 peroid) +param kLWvStart := kLWvMax / 2; + +param kJPhk := 1; # plant HK factors (MW/KCFS) +param kJPoNovMaxFact := 0; # curves +param kJPoNovMaxOffset := 0; +param kJPtwFact := 0; # TODO +param kJPtwOffset := 0; + +# refill +subto kcLWvEnd: vLWv[ kTS ] >= kLWvStart; + +# change-in-storage + outflow == inflow +subto vcLWmb: + forall in sTime do + if ( t == 1 ) then vLWv[ 1 ] - kLWvStart + vJPo[ 1 ] + vJPs[ 1 ] + vECo[ 1 ] + else vLWv[ t ] - vLWv[ t - 1 ] + vJPo[ t ] + vJPs[ t ] + vECo[ t ] + end + == kCMSd2KCFSdFact * vRRq[ t ] + kCMSd2KCFSdFact * vWRq[ t ] + vGRo[ t ] + vGRs[ t ] + kLWiAdj; + +# compute power from discharge +subto vcJPp: + forall in sTime do + vJPp[ t ] == kJPhk * vJPo[ t ]; + +# West Channel Max Discharge +param vWCoMax[ sMonth ] := <1> 8.6440678, <2> 7.79661017, <3> 7.11864407, <4> 6.61016949, <11> 10.3389831, <12> 9.3220339 default 12.5423729; +subto vJPoA: + forall in sTime cross sMonth with m == vMONTH[ t ] do + vJPo[ t ] <= vLWv[ t ] * vWCoMax[ m ] / kLWssFactor; + +# East Channel Discharge +subto vcECo: + forall in sTime do + vECo[ t ] == vLWv[ t ] * 4.67463938 / kLWssFactor; # convert q/ft (from historical 92-94 period data) to q/v + +# Jenpeg within-week outflow shaping +param kJPosFact := 2; # as modelled +subto vcJPosA: forall in sTime5 do vJPo[ t - 2 ] >= vJPo[ t ] - kJPosFact; +subto vcJPosB: forall in sTime5 do vJPo[ t - 2 ] <= vJPo[ t ] + kJPosFact; +subto vcJPosC: forall in sTime5 do vJPo[ t - 1 ] >= vJPo[ t ] - kJPosFact; +subto vcJPosD: forall in sTime5 do vJPo[ t - 1 ] <= vJPo[ t ] + kJPosFact; +subto vcJPosE: forall in sTime5 do vJPo[ t + 1 ] >= vJPo[ t ] - kJPosFact; +subto vcJPosF: forall in sTime5 do vJPo[ t + 1 ] <= vJPo[ t ] + kJPosFact; +subto vcJPosG: forall in sTime5 do vJPo[ t + 2 ] >= vJPo[ t ] - kJPosFact; +subto vcJPosH: forall in sTime5 do vJPo[ t + 2 ] <= vJPo[ t ] + kJPosFact; + +# Jenpeg intra-week shaping +subto vcJPosI: forall in sTime5 without { kTS - 2 } do vJPo[ t + 3 ] >= vJPo[ t ] - kJPosFact * 2; +subto vcJPosJ: forall in sTime5 without { kTS - 2 } do vJPo[ t + 3 ] <= vJPo[ t ] + kJPosFact * 2; + +######################### +### Kelsey Operations ### + +param kKEoMin := 0; # plant/control discharge limits (KCFS) +param kKEoMax := 55.4; +param kKEsMin := 0; # as modelled +param kKEsMax := 9e9; # as modelled +param kKEpMax := 211; # generation limits (MW) + +var vKEv[ sTime ] >= 0 <= kKEvMax; +var vKEs[ sTime ] >= kKEsMin <= kKEsMax; +var vKEo[ sTime ] >= kKEoMin <= kKEoMax; +var vKEp[ sTime ] >= 0 <= kKEpMax; + +# 5th column for Gunisao River +param vGUNq[ sTime ] := read "historical.csv" as "5n" skip 1; + +param kKEhk := 3.8; # plant HK factors (MW/KCFS) +param kKEiFact := 1; # adjustments (calibrated for 92-94 peroid) +param kKEtwFact := 0; # curves +param kKEtwOffset := 0; +param kKEiAdj := 3; # adjustments (calibrated for 92-94 peroid) +param kKEvStart := kKEvMax / 2; + +# refill +subto kcKEvEnd: vKEv[ kTS ] >= kKEvStart; + +# change-in-storage + outflow == inflow +subto vcKEmb: + forall in sTime do + if ( t == 1 ) then vKEv[ 1 ] - kKEvStart + vKEo[ 1 ] + vKEs[ 1 ] + else vKEv[ t ] - vKEv[ t - 1 ] + vKEo[ t ] + vKEs[ t ] + end + == kKEiFact * kCMSd2KCFSdFact * vGUNq[ t ] + kKEiAdj + vECo[ t ] + vJPo[ t ] + vJPs[ t ]; + +# compute power from discharge +subto vcKEp: + forall in sTime do + vKEp[ t ] == kKEhk * vKEo[ t ]; + +######################################################################### +### Lower Nelson Operations with inflows from Upper Nelson and Notigi ### + +param kLNoMin := 0; # plant/control discharge limits (KCFS) +param kLNoMax := 165.7; +param kLNsMin := 0; # plant/control discharge limits (KCFS) +param kLNsMax := 150; # kpill limits (KCFS) +param kLNpMax := 3583; # generation limits (MW) + +var vLNv[ sTime ] >= 0 <= kLNvMax; +var vLNs[ sTime ] >= kLNsMin <= kLNsMax; +var vLNo[ sTime ] >= kLNoMin <= kLNoMax; +var vLNp[ sTime ] >= 0 <= kLNpMax; + +# 6th column for Lower Nelson Tribs +param vLTq[ sTime ] := read "historical.csv" as "6n" skip 1; + +param kLNhk := 21.7; # plant HK factors (MW/KCFS) +param kLNiAdj := 5; # adjustments (calibrated for 92-94 peroid) +param kLTiFact := 3; # adjustments (calibrated for 92-94 peroid) + +# refill +subto kcLNvEnd: vLNv[ kTS ] >= kLNvStart; + +# Routed discharges from Notigi to Lower Nelson +var vNTor[ sTime ] >= 0; +set sUIR := { 1, 2, 3, 4 }; +param kNTur[ sUIR ] := <1> 0.0, <2> 0.05, <3> 0.80, <4> 0.15; # as modelled +subto vcNTorA: + forall in sTime without { 1, 2, 3 } do + vNTor[ t ] == vNTo[ t - 0 ] * kNTur[ 1 ] + vNTo[ t - 1 ] * kNTur[ 2 ] + vNTo[ t - 2 ] * kNTur[ 3 ] + vNTo[ t - 3 ] * kNTur[ 4 ]; + +# change-in-storage + outflow == inflow +subto vcLNmb: + forall in sTime do + if ( t == 1 ) then vLNv[ 1 ] - kLNvStart + vLNo[ 1 ] + vLNs[ 1 ] + else vLNv[ t ] - vLNv[ t - 1 ] + vLNo[ t ] + vLNs[ t ] + end + == kLTiFact * kCMSd2KCFSdFact * vLTq[ t ] + kLNiAdj + vNTor[ t ] + vKEo[ t ] + vKEs[ t ]; + +# compute power from discharge +subto vcLNp: + forall in sTime do + vLNp[ t ] == kLNhk * vLNo[ t ]; + +# Lowern Nelson within-week outflow shaping +param kLNosFact := 10; # as modelled +subto vcLNosA: forall in sTime5 do vLNo[ t - 2 ] >= vLNo[ t ] - kLNosFact; +subto vcLNosB: forall in sTime5 do vLNo[ t - 2 ] <= vLNo[ t ] + kLNosFact; +subto vcLNosC: forall in sTime5 do vLNo[ t - 1 ] >= vLNo[ t ] - kLNosFact; +subto vcLNosD: forall in sTime5 do vLNo[ t - 1 ] <= vLNo[ t ] + kLNosFact; +subto vcLNosE: forall in sTime5 do vLNo[ t + 1 ] >= vLNo[ t ] - kLNosFact; +subto vcLNosF: forall in sTime5 do vLNo[ t + 1 ] <= vLNo[ t ] + kLNosFact; +subto vcLNosG: forall in sTime5 do vLNo[ t + 2 ] >= vLNo[ t ] - kLNosFact; +subto vcLNosH: forall in sTime5 do vLNo[ t + 2 ] <= vLNo[ t ] + kLNosFact; + +# Lowern Nelson inter-week outflow shaping +subto vcLNosI: forall in sTime5 without { kTS - 2 } do vLNo[ t + 3 ] >= vLNo[ t ] - kLNosFact * 2; +subto vcLNosJ: forall in sTime5 without { kTS - 2 } do vLNo[ t + 3 ] <= vLNo[ t ] + kLNosFact * 2; + +######################################################## + +# 7th column for Load +param vLOAD[ sTime ] := read "historical.csv" as "7n" skip 1; +var sLOAD >= 0; +subto vcLOAD: + forall in sTime do + vGRp[ t ] + vJPp[ t ] + vKEp[ t ] + vLNp[ t ] >= vLOAD[ t ]; + +minimize kSPILL: + sum in sTime do vMFo[ t ] + + sum in sTime do vGRs[ t ] + + sum in sTime do vJPs[ t ] + + sum in sTime do vKEs[ t ] + + sum in sTime do vLNs[ t ]; From 4e15369f9a65180f83f3d68176850faea5806c48 Mon Sep 17 00:00:00 2001 From: john howard Date: Mon, 2 Jun 2014 17:27:24 -0700 Subject: [PATCH 03/11] added missing lexer for zimpl --- lib/linguist/languages.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index da8180fa..6be4c3fd 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2409,5 +2409,6 @@ xBase: Zimpl: type: programming + lexer: Text only extensions: - .zmpl From 3d5a0da62ec47484c959ba1b47aeed97dde9bcf1 Mon Sep 17 00:00:00 2001 From: John Howard Date: Mon, 2 Jun 2014 18:08:54 -0700 Subject: [PATCH 04/11] rename sample directory --- samples/{zmpl => Zimpl}/sample.zmpl | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename samples/{zmpl => Zimpl}/sample.zmpl (100%) diff --git a/samples/zmpl/sample.zmpl b/samples/Zimpl/sample.zmpl similarity index 100% rename from samples/zmpl/sample.zmpl rename to samples/Zimpl/sample.zmpl From cfb9f6f0a4d7b9088c0f12f01c32076371cb3060 Mon Sep 17 00:00:00 2001 From: john howard Date: Mon, 2 Jun 2014 18:14:57 -0700 Subject: [PATCH 05/11] smaller code sample --- samples/Zimpl/sample.zmpl | 362 ++------------------------------------ 1 file changed, 14 insertions(+), 348 deletions(-) diff --git a/samples/Zimpl/sample.zmpl b/samples/Zimpl/sample.zmpl index 50b65102..ade112cd 100644 --- a/samples/Zimpl/sample.zmpl +++ b/samples/Zimpl/sample.zmpl @@ -1,355 +1,21 @@ -# Mini Manitoba Hydro LP Model -# Written for zimpl 3.0.0a -# Licensed under the MIT license -# Developed for fun using publicly available sources. -# This software comes with no guarantees and no claims that it is fit for any purpose. -# john howard, 1 Dec 2009 - -# Inflows: -# CR churchill river -# LT lower nelson tribs -# SL south indian lake -# RR red river -# WR winnipeg river +# $Id: queens3.zpl,v 1.3 2009/09/13 16:15:53 bzfkocht Exp $ # -# Major Storages: -# LW lake winnipeg -# CL cedar lake +# This is a formulation of the n queens problem using binary variables. +# variables. Since the number of queens is maximized, the size of the +# board can be set arbitrarily. # -# Controlled Channels: -# MF missi falls -# NT notigi -# EC east channel -# WC west channel -# -# Generation Projects: -# GR grand rapids -# JP jenpeg -# KE kelsey -# LN lower nelson projects +param columns := 8; -# variables and constraints are named the following way: -# Type Subtype 2LetterName Kind Modifier -# (v|k) [c] (..) (q|i|o|p|v|e|s|hk|ss|tw|mb|rc|os|ur) [ Start | End | Max | Min | Adj | Fact | Offset ] +set I := { 1 .. columns }; +set IxI := I * I; -param kTS := 662; -set sTime := { 1 .. kTS }; +set TABU[ in IxI] := { in IxI with + (m != i or n != j) and (m == i or n == j or abs(m - i) == abs(n - j)) }; -# for 5 day averaging requires indices spaced 3 apart -set sTime5 := { in sTime with t < (kTS - 1) and t mod 3 == 0 }; +var x[IxI] binary; -param kCMSd2KCFSdFact := 35.315 / 1000; +maximize queens: sum in IxI : x[i,j]; -# column 8 is month -param vMONTH[ sTime ] := read "historical.csv" as "8n" skip 1; -set sMonth := { 1 .. 12 }; - -######################### -### Inital Conditions ### - -# South Indian Lake -param kSLeMin := 840.0; -param kSLeMax := 847.9; -param kSLssFactor := 283.7; -param kSLvMax := (kSLeMax - kSLeMin) * kSLssFactor; - -# Grand Rapids Pond (Cedar Lake) -param kGReMin := 830.0; -param kGReMax := 841.5; -param kGRssFactor := 330.9; -param kGRvMax := (kGReMax - kGReMin) * kGRssFactor; - -# Lake Winnipeg -param kLWeMin := 709.0; -param kLWeMax := 714.75; -param kLWssFactor := 3040.0; -param kLWvMax := (kLWeMax - kLWeMin) * kLWssFactor; - -# Kelsey Pond -param kKEeMin := 0.0; -param kKEeMax := 0.1; # as modelled -param kKEssFactor := 902.0; -param kKEvMax := (kKEeMax - kKEeMin) * kKEssFactor; - -# Storage at aggregate Lower Nelson Projects -param kLNeMin := 0.0; -param kLNeMax := 3.0; # as modelled -param kLNssFactor := 200.0; -param kLNvMax := (kLNeMax - kLNeMin) * kLNssFactor; -param kLNvStart := kLNvMax / 2; - -#################################################################### -### Churchill River through South Indian Lake and Notigi Control ### - -param kNToMin := 15; # control discharge limits (KCFS) -param kNToMax := 35; - -param kMFoMin := 0; # control discharge limits (KCFS) -param kMFoMax := 10; # as modelled -param kMFoFact := 0.001; # adjustments (calibrated for 92-94 peroid) - -var vMFo[ sTime ] >= 1 <= kMFoMax; # Missi Falls acts as spill -var vNTo[ sTime ] >= kNToMin <= kNToMax; -var vSLv[ sTime ] >= 0 <= kSLvMax; - -# 2nd column for Churchill River -param vCRq[ sTime ] := read "historical.csv" as "2n" skip 1; - -param kSLiAdj := 2.3; # adjustments (calibrated for 92-94 peroid) -param kSLvStart := kSLvMax / 2; - -# refill -subto kcSLvEnd: vSLv[ kTS ] >= kSLvStart; - -# change-in-storage + outflow == inflow -subto vcSLmb: - forall in sTime do - if ( t == 1 ) then vSLv[ 1 ] - kSLvStart + vMFo[ 1 ] + vNTo[ 1 ] - else vSLv[ t ] - vSLv[ t - 1 ] + vMFo[ t ] + vNTo[ t ] - end - == kCMSd2KCFSdFact * vCRq[ t ] + kSLiAdj; - -# Notigi within-week outflow shaping -param kNTosFact := 0; # as modelled -subto vcNTosA: forall in sTime5 do vNTo[ t - 2 ] >= vNTo[ t ] - kNTosFact; -subto vcNTosB: forall in sTime5 do vNTo[ t - 2 ] <= vNTo[ t ] + kNTosFact; -subto vcNTosC: forall in sTime5 do vNTo[ t - 1 ] >= vNTo[ t ] - kNTosFact; -subto vcNTosD: forall in sTime5 do vNTo[ t - 1 ] <= vNTo[ t ] + kNTosFact; -subto vcNTosE: forall in sTime5 do vNTo[ t + 1 ] >= vNTo[ t ] - kNTosFact; -subto vcNTosF: forall in sTime5 do vNTo[ t + 1 ] <= vNTo[ t ] + kNTosFact; -subto vcNTosG: forall in sTime5 do vNTo[ t + 2 ] >= vNTo[ t ] - kNTosFact; -subto vcNTosH: forall in sTime5 do vNTo[ t + 2 ] <= vNTo[ t ] + kNTosFact; - -########################################################### -### Sask River into Cedar Lake and through Grand Rapids ### - -param kGRoMin := 5; # plant/control discharge limits (KCFS) -param kGRoMax := 53; -param kGRsMin := 0; -param kGRsMax := 40; -param kGRpMax := 472; # generation limits (MW) - -var vGRv[ sTime ] >= 0 <= kGRvMax; -var vGRs[ sTime ] >= kGRsMin <= kGRsMax; -var vGRo[ sTime ] >= kGRoMin <= kGRoMax; -var vGRp[ sTime ] >= 0 <= kGRpMax; - -# 1st column for Sask River -param vSKRq[ sTime ] := read "historical.csv" as "1n" skip 1; - -param kGRhk := 9.2; # plant HK factors (MW/KCFS) -param kGRiAdj := -0.6; # adjustments (calibrated for 92-94 peroid) -param kGRvStart := kGRvMax / 2; - -# refill -subto kcGRvEnd: vGRv[ kTS ] >= kGRvStart; - -# change-in-storage + outflow == inflow -subto vcGRmb: - forall in sTime do - if ( t == 1 ) then vGRv[ 1 ] - kGRvStart + vGRo[ 1 ] + vGRs[ 1 ] - else vGRv[ t ] - vGRv[ t - 1 ] + vGRo[ t ] + vGRs[ t ] - end - == kCMSd2KCFSdFact * vSKRq[ t ] + kGRiAdj; - -# compute power from discharge -subto vcGRp: - forall in sTime do - vGRp[ t ] == kGRhk * vGRo[ t ]; - -# Grand Rapids within-week outflow shaping -param kGRosFact := 10; # as modelled -subto vcGRosA: forall in sTime5 do vGRo[ t - 2 ] >= vGRo[ t ] - kGRosFact; -subto vcGRosB: forall in sTime5 do vGRo[ t - 2 ] <= vGRo[ t ] + kGRosFact; -subto vcGRosC: forall in sTime5 do vGRo[ t - 1 ] >= vGRo[ t ] - kGRosFact; -subto vcGRosD: forall in sTime5 do vGRo[ t - 1 ] <= vGRo[ t ] + kGRosFact; -subto vcGRosE: forall in sTime5 do vGRo[ t + 1 ] >= vGRo[ t ] - kGRosFact; -subto vcGRosF: forall in sTime5 do vGRo[ t + 1 ] <= vGRo[ t ] + kGRosFact; -subto vcGRosG: forall in sTime5 do vGRo[ t + 2 ] >= vGRo[ t ] - kGRosFact; -subto vcGRosH: forall in sTime5 do vGRo[ t + 2 ] <= vGRo[ t ] + kGRosFact; - -############################################################################## -### Lake Winnipeg Storage as operated by JENPEG and effect of Each Channel ### - -param kJPoMin := 0; # plant/control discharge limits (KCFS) -param kJPoMax := 93; -param kJPsMin := 0; # plant/control discharge limits (KCFS) -param kJPsMax := 9e9; # as modelled -param kJPpMax := 97; # generation limits (MW) - -var vLWv[ sTime ] >= 0 <= kLWvMax; -var vECo[ sTime ] >= 0; # upper bound determined by rating curve -var vJPo[ sTime ] >= kJPoMin <= kJPoMax; -var vJPs[ sTime ] >= kJPsMin <= kJPsMax; -var vJPp[ sTime ] >= 0 <= kJPpMax; - -# 3rd column for Red River and 4th column for Winnipeg River -param vRRq[ sTime ] := read "historical.csv" as "3n" skip 1; -param vWRq[ sTime ] := read "historical.csv" as "4n" skip 1; - -param kLWiAdj := 11.7; # adjustments (calibrated for 92-94 peroid) -param kLWvStart := kLWvMax / 2; - -param kJPhk := 1; # plant HK factors (MW/KCFS) -param kJPoNovMaxFact := 0; # curves -param kJPoNovMaxOffset := 0; -param kJPtwFact := 0; # TODO -param kJPtwOffset := 0; - -# refill -subto kcLWvEnd: vLWv[ kTS ] >= kLWvStart; - -# change-in-storage + outflow == inflow -subto vcLWmb: - forall in sTime do - if ( t == 1 ) then vLWv[ 1 ] - kLWvStart + vJPo[ 1 ] + vJPs[ 1 ] + vECo[ 1 ] - else vLWv[ t ] - vLWv[ t - 1 ] + vJPo[ t ] + vJPs[ t ] + vECo[ t ] - end - == kCMSd2KCFSdFact * vRRq[ t ] + kCMSd2KCFSdFact * vWRq[ t ] + vGRo[ t ] + vGRs[ t ] + kLWiAdj; - -# compute power from discharge -subto vcJPp: - forall in sTime do - vJPp[ t ] == kJPhk * vJPo[ t ]; - -# West Channel Max Discharge -param vWCoMax[ sMonth ] := <1> 8.6440678, <2> 7.79661017, <3> 7.11864407, <4> 6.61016949, <11> 10.3389831, <12> 9.3220339 default 12.5423729; -subto vJPoA: - forall in sTime cross sMonth with m == vMONTH[ t ] do - vJPo[ t ] <= vLWv[ t ] * vWCoMax[ m ] / kLWssFactor; - -# East Channel Discharge -subto vcECo: - forall in sTime do - vECo[ t ] == vLWv[ t ] * 4.67463938 / kLWssFactor; # convert q/ft (from historical 92-94 period data) to q/v - -# Jenpeg within-week outflow shaping -param kJPosFact := 2; # as modelled -subto vcJPosA: forall in sTime5 do vJPo[ t - 2 ] >= vJPo[ t ] - kJPosFact; -subto vcJPosB: forall in sTime5 do vJPo[ t - 2 ] <= vJPo[ t ] + kJPosFact; -subto vcJPosC: forall in sTime5 do vJPo[ t - 1 ] >= vJPo[ t ] - kJPosFact; -subto vcJPosD: forall in sTime5 do vJPo[ t - 1 ] <= vJPo[ t ] + kJPosFact; -subto vcJPosE: forall in sTime5 do vJPo[ t + 1 ] >= vJPo[ t ] - kJPosFact; -subto vcJPosF: forall in sTime5 do vJPo[ t + 1 ] <= vJPo[ t ] + kJPosFact; -subto vcJPosG: forall in sTime5 do vJPo[ t + 2 ] >= vJPo[ t ] - kJPosFact; -subto vcJPosH: forall in sTime5 do vJPo[ t + 2 ] <= vJPo[ t ] + kJPosFact; - -# Jenpeg intra-week shaping -subto vcJPosI: forall in sTime5 without { kTS - 2 } do vJPo[ t + 3 ] >= vJPo[ t ] - kJPosFact * 2; -subto vcJPosJ: forall in sTime5 without { kTS - 2 } do vJPo[ t + 3 ] <= vJPo[ t ] + kJPosFact * 2; - -######################### -### Kelsey Operations ### - -param kKEoMin := 0; # plant/control discharge limits (KCFS) -param kKEoMax := 55.4; -param kKEsMin := 0; # as modelled -param kKEsMax := 9e9; # as modelled -param kKEpMax := 211; # generation limits (MW) - -var vKEv[ sTime ] >= 0 <= kKEvMax; -var vKEs[ sTime ] >= kKEsMin <= kKEsMax; -var vKEo[ sTime ] >= kKEoMin <= kKEoMax; -var vKEp[ sTime ] >= 0 <= kKEpMax; - -# 5th column for Gunisao River -param vGUNq[ sTime ] := read "historical.csv" as "5n" skip 1; - -param kKEhk := 3.8; # plant HK factors (MW/KCFS) -param kKEiFact := 1; # adjustments (calibrated for 92-94 peroid) -param kKEtwFact := 0; # curves -param kKEtwOffset := 0; -param kKEiAdj := 3; # adjustments (calibrated for 92-94 peroid) -param kKEvStart := kKEvMax / 2; - -# refill -subto kcKEvEnd: vKEv[ kTS ] >= kKEvStart; - -# change-in-storage + outflow == inflow -subto vcKEmb: - forall in sTime do - if ( t == 1 ) then vKEv[ 1 ] - kKEvStart + vKEo[ 1 ] + vKEs[ 1 ] - else vKEv[ t ] - vKEv[ t - 1 ] + vKEo[ t ] + vKEs[ t ] - end - == kKEiFact * kCMSd2KCFSdFact * vGUNq[ t ] + kKEiAdj + vECo[ t ] + vJPo[ t ] + vJPs[ t ]; - -# compute power from discharge -subto vcKEp: - forall in sTime do - vKEp[ t ] == kKEhk * vKEo[ t ]; - -######################################################################### -### Lower Nelson Operations with inflows from Upper Nelson and Notigi ### - -param kLNoMin := 0; # plant/control discharge limits (KCFS) -param kLNoMax := 165.7; -param kLNsMin := 0; # plant/control discharge limits (KCFS) -param kLNsMax := 150; # kpill limits (KCFS) -param kLNpMax := 3583; # generation limits (MW) - -var vLNv[ sTime ] >= 0 <= kLNvMax; -var vLNs[ sTime ] >= kLNsMin <= kLNsMax; -var vLNo[ sTime ] >= kLNoMin <= kLNoMax; -var vLNp[ sTime ] >= 0 <= kLNpMax; - -# 6th column for Lower Nelson Tribs -param vLTq[ sTime ] := read "historical.csv" as "6n" skip 1; - -param kLNhk := 21.7; # plant HK factors (MW/KCFS) -param kLNiAdj := 5; # adjustments (calibrated for 92-94 peroid) -param kLTiFact := 3; # adjustments (calibrated for 92-94 peroid) - -# refill -subto kcLNvEnd: vLNv[ kTS ] >= kLNvStart; - -# Routed discharges from Notigi to Lower Nelson -var vNTor[ sTime ] >= 0; -set sUIR := { 1, 2, 3, 4 }; -param kNTur[ sUIR ] := <1> 0.0, <2> 0.05, <3> 0.80, <4> 0.15; # as modelled -subto vcNTorA: - forall in sTime without { 1, 2, 3 } do - vNTor[ t ] == vNTo[ t - 0 ] * kNTur[ 1 ] + vNTo[ t - 1 ] * kNTur[ 2 ] + vNTo[ t - 2 ] * kNTur[ 3 ] + vNTo[ t - 3 ] * kNTur[ 4 ]; - -# change-in-storage + outflow == inflow -subto vcLNmb: - forall in sTime do - if ( t == 1 ) then vLNv[ 1 ] - kLNvStart + vLNo[ 1 ] + vLNs[ 1 ] - else vLNv[ t ] - vLNv[ t - 1 ] + vLNo[ t ] + vLNs[ t ] - end - == kLTiFact * kCMSd2KCFSdFact * vLTq[ t ] + kLNiAdj + vNTor[ t ] + vKEo[ t ] + vKEs[ t ]; - -# compute power from discharge -subto vcLNp: - forall in sTime do - vLNp[ t ] == kLNhk * vLNo[ t ]; - -# Lowern Nelson within-week outflow shaping -param kLNosFact := 10; # as modelled -subto vcLNosA: forall in sTime5 do vLNo[ t - 2 ] >= vLNo[ t ] - kLNosFact; -subto vcLNosB: forall in sTime5 do vLNo[ t - 2 ] <= vLNo[ t ] + kLNosFact; -subto vcLNosC: forall in sTime5 do vLNo[ t - 1 ] >= vLNo[ t ] - kLNosFact; -subto vcLNosD: forall in sTime5 do vLNo[ t - 1 ] <= vLNo[ t ] + kLNosFact; -subto vcLNosE: forall in sTime5 do vLNo[ t + 1 ] >= vLNo[ t ] - kLNosFact; -subto vcLNosF: forall in sTime5 do vLNo[ t + 1 ] <= vLNo[ t ] + kLNosFact; -subto vcLNosG: forall in sTime5 do vLNo[ t + 2 ] >= vLNo[ t ] - kLNosFact; -subto vcLNosH: forall in sTime5 do vLNo[ t + 2 ] <= vLNo[ t ] + kLNosFact; - -# Lowern Nelson inter-week outflow shaping -subto vcLNosI: forall in sTime5 without { kTS - 2 } do vLNo[ t + 3 ] >= vLNo[ t ] - kLNosFact * 2; -subto vcLNosJ: forall in sTime5 without { kTS - 2 } do vLNo[ t + 3 ] <= vLNo[ t ] + kLNosFact * 2; - -######################################################## - -# 7th column for Load -param vLOAD[ sTime ] := read "historical.csv" as "7n" skip 1; -var sLOAD >= 0; -subto vcLOAD: - forall in sTime do - vGRp[ t ] + vJPp[ t ] + vKEp[ t ] + vLNp[ t ] >= vLOAD[ t ]; - -minimize kSPILL: - sum in sTime do vMFo[ t ] + - sum in sTime do vGRs[ t ] + - sum in sTime do vJPs[ t ] + - sum in sTime do vKEs[ t ] + - sum in sTime do vLNs[ t ]; +subto c1: forall in IxI do + card(TABU[i,j]) - card(TABU[i,j]) * x[i,j] >= sum in TABU[i,j] : x[m,n]; + From ed851849db8deefb6f45d0853e24833f5c4f6eb0 Mon Sep 17 00:00:00 2001 From: john howard Date: Mon, 2 Jun 2014 18:23:07 -0700 Subject: [PATCH 06/11] added extra extension for zimpl --- lib/linguist/languages.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 6be4c3fd..fe6101c7 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2412,3 +2412,4 @@ Zimpl: lexer: Text only extensions: - .zmpl + - .zpl From 1fd2f921fd36b059256826cd193f829744559f3e Mon Sep 17 00:00:00 2001 From: john howard Date: Mon, 2 Jun 2014 18:28:00 -0700 Subject: [PATCH 07/11] added yet another zimpl extension that is in use --- lib/linguist/languages.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index fe6101c7..a52419e6 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2413,3 +2413,4 @@ Zimpl: extensions: - .zmpl - .zpl + - .zimpl From c389c79be9b1ca9c2529672d5e724d66d192d995 Mon Sep 17 00:00:00 2001 From: john howard Date: Mon, 2 Jun 2014 18:30:45 -0700 Subject: [PATCH 08/11] fixed zimpl declaration position collation order problem --- lib/linguist/languages.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index a52419e6..4678f8b8 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2342,6 +2342,14 @@ Zephir: extensions: - .zep +Zimpl: + type: programming + lexer: Text only + extensions: + - .zmpl + - .zpl + - .zimpl + eC: type: programming search_term: ec @@ -2406,11 +2414,3 @@ xBase: color: "#3a4040" extensions: - .prg - -Zimpl: - type: programming - lexer: Text only - extensions: - - .zmpl - - .zpl - - .zimpl From 7989fbd613c139197d62fadf66bfadd2fa606f09 Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Mon, 2 Jun 2014 21:00:03 -0500 Subject: [PATCH 09/11] Samples --- lib/linguist/samples.json | 56 +++++++++++++++++++++++++++++++++++---- 1 file changed, 51 insertions(+), 5 deletions(-) diff --git a/lib/linguist/samples.json b/lib/linguist/samples.json index e7206004..04c7d729 100644 --- a/lib/linguist/samples.json +++ b/lib/linguist/samples.json @@ -657,6 +657,9 @@ ], "Zephir": [ ".zep" + ], + "Zimpl": [ + ".zmpl" ] }, "interpreters": { @@ -723,8 +726,8 @@ ".gemrc" ] }, - "tokens_total": 611474, - "languages_total": 755, + "tokens_total": 611597, + "languages_total": 756, "tokens": { "ABAP": { "*/**": 1, @@ -66314,6 +66317,47 @@ "convert": 1, "converter": 2, "getConverters": 1 + }, + "Zimpl": { + "#": 2, + "param": 1, + "columns": 2, + ";": 7, + "set": 3, + "I": 3, + "{": 2, + "..": 1, + "}": 2, + "IxI": 6, + "*": 2, + "TABU": 4, + "[": 8, + "": 3, + "in": 5, + "]": 8, + "": 2, + "with": 1, + "(": 6, + "m": 4, + "i": 8, + "or": 3, + "n": 4, + "j": 8, + ")": 6, + "and": 1, + "abs": 2, + "-": 3, + "var": 1, + "x": 4, + "binary": 1, + "maximize": 1, + "queens": 1, + "sum": 2, + "subto": 1, + "c1": 1, + "forall": 1, + "do": 1, + "card": 2 } }, "language_tokens": { @@ -66499,7 +66543,8 @@ "XSLT": 44, "Xtend": 399, "YAML": 77, - "Zephir": 1026 + "Zephir": 1026, + "Zimpl": 123 }, "languages": { "ABAP": 1, @@ -66684,7 +66729,8 @@ "XSLT": 1, "Xtend": 2, "YAML": 2, - "Zephir": 2 + "Zephir": 2, + "Zimpl": 1 }, - "md5": "a7d557f9fecf06444c92c22e6f32daa7" + "md5": "941348a2fd9b5529cfbcede9d664e2df" } \ No newline at end of file From 398439a937a82b050e524bab1235b49a7c37720e Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Mon, 2 Jun 2014 21:04:39 -0500 Subject: [PATCH 10/11] Pedantic --- lib/linguist/languages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 0f512636..0856f26a 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2353,8 +2353,8 @@ Zimpl: lexer: Text only extensions: - .zmpl - - .zpl - .zimpl + - .zpl eC: type: programming From 4a7ae50ec811383bc26fc28279cb764fc9488f15 Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Mon, 2 Jun 2014 21:07:11 -0500 Subject: [PATCH 11/11] Dammit --- lib/linguist/languages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 0856f26a..fc55a458 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2352,8 +2352,8 @@ Zimpl: type: programming lexer: Text only extensions: - - .zmpl - .zimpl + - .zmpl - .zpl eC: