3 Created on Mon May 18 19:48:52 2020
11 from efo.rule
import RuleBase, RuleRlsSpecified
12 from efo.junction
import ReservoirJunction
29 self.
releaserelease = np.full(self.T.Tcont.nSteps, np.nan)
32 def calc_release(self, rlsProposed, rlsUnCtrl, stor, rlsPrev=None, qIn=None):
34 rlsProposed, rlsPrev=rlsPrev, rlsUnCtrl=rlsUnCtrl, stor=stor, qIn=qIn)
49 if cls
is RuleFcstBase:
51 if set(cls.__abstractmethods__) <= attrs:
57 def __init__(self, name, timeFcst, efoResrvr, storTh, riskTol, constants, *,
58 efoNetwork=None, ruleRlsSpecified=None, efoRlsSched=None):
79 for net
in self.
efoNetworkefoNetwork: net.set_init_cond()
81 t = self.T.get_fcst_time()
91 for i
in range(t.nSteps-1):
96 self.
rlsMaxrlsMax = np.full((t.nSteps, self.
nMembersnMembers, t.nSteps-1), np.nan)
98 self.
prExcThprExcTh = np.full(t.nSteps, np.nan)
101 riskySelect = np.arange(0, self.
nMembersnMembers, dtype=int)
102 riskyMbr = np.copy(riskySelect)
103 iRisky = np.full(self.
nMembersnMembers,
False)
104 iRiskyChk = np.full(self.
nMembersnMembers,
True)
105 volAbvThresh = np.zeros([t.nSteps, self.
nMembersnMembers])
106 vol2Rls = np.zeros([t.nSteps, self.
nMembersnMembers])
107 rlsFcst = np.full(t.nSteps, np.nan)
108 rlsFcst[0] = self.
efoResrvrefoResrvr[0].rlsCtrl[0]
109 rlsMax = np.full(t.nSteps, np.nan)
110 rlsToday = np.empty((t.nSteps-1, self.
nMembersnMembers))
111 rlsSched = np.zeros(t.nSteps)
112 for tsHoriz
in t.steps[1:]:
113 self.T.step = tsHoriz
115 self.
storFcststorFcst[:, :, tsHoriz-1] = self.
storFcststorFcst[:, :, tsHoriz-2]
117 for j
in range(self.
nMembersnMembers):
119 if issubclass(type(self.
ruleRlsSpecifiedruleRlsSpecified[riskySelect[j]]), RuleRlsSpecified):
120 self.
ruleRlsSpecifiedruleRlsSpecified[riskySelect[j]].set_release(tsHoriz, 0)
124 self.
storFcststorFcst[tsHoriz, riskySelect[j], tsHoriz-1] = self.
efoResrvrefoResrvr[j].stor[tsHoriz]
125 self.
rlsUnCtrlFcstrlsUnCtrlFcst[tsHoriz, riskySelect[j], tsHoriz-1] = \
126 self.
efoResrvrefoResrvr[j].rlsUnCtrl[tsHoriz]
129 storPlusUnCtrl = self.
storFcststorFcst[tsHoriz, :, tsHoriz-1]\
131 iRisky = (storPlusUnCtrl > self.
storThstorTh) & iRiskyChk
135 iRiskyChk = np.copy(iRisky)
137 riskyMbr = np.where(iRisky)[0]
138 nMbrs2Reduce = int(len(riskyMbr) - np.floor(self.
riskTolriskTol[tsHoriz]*self.
nMembersnMembers))
139 volAbvThresh[tsHoriz, riskyMbr] = \
140 self.
storFcststorFcst[tsHoriz, riskyMbr, tsHoriz-1]\
143 mbrSorted = np.argsort(volAbvThresh[tsHoriz, riskyMbr])
144 riskySelect = riskyMbr[mbrSorted[0:nMbrs2Reduce]]
145 self.
iRiskyMbrsiRiskyMbrs[tsHoriz, riskySelect] =
True
150 vol2Rls[tsHoriz, riskySelect] = 1.01*volAbvThresh[tsHoriz, riskySelect]
152 loop = asyncio.get_event_loop()
153 for j
in range(len(riskySelect)):
154 rlsFcst[1:tsHoriz+1] = np.sum(
155 vol2Rls[:, riskySelect[j]])*self.
constantsconstants.af2cfs/tsHoriz
156 self.
rlsNoConstraintrlsNoConstraint[1:tsHoriz+1, riskySelect[j], tsHoriz-1] = np.copy(rlsFcst[1:tsHoriz+1])
159 task.append(asyncio.create_task(
160 self.
_calc_release_sched_calc_release_sched(rlsFcst[1:tsHoriz+1], tsHoriz, riskySelect[j])))
161 taskResults = loop.run_until_complete(asyncio.gather(*task))
162 for curResult
in taskResults:
163 rlsFcst[1:tsHoriz+1] = curResult[0]
164 self.
rlsMaxrlsMax[1:tsHoriz+1, riskySelect[j], tsHoriz-1] = curResult[1]
166 if np.sum(rlsFcst[1:tsHoriz+1])*self.
constantsconstants.cfs2af < np.sum(vol2Rls[:, riskySelect[j]]):
167 iRiskyChk[riskySelect[j]] =
False
168 vol2Rls[tsHoriz, riskySelect[j]] = \
169 vol2Rls[tsHoriz, riskySelect[j]] - \
170 (np.sum(vol2Rls[:, riskySelect[j]]) - np.sum(rlsFcst[1:tsHoriz+1])*self.
constantsconstants.cfs2af)
171 self.
rlsFcstrlsFcst[1:tsHoriz+1, riskySelect[j], tsHoriz-1] = np.copy(rlsFcst[1:tsHoriz+1])
178 riskySelect = np.arange(0, self.
nMembersnMembers, dtype=int)
179 riskyMbr = np.copy(riskySelect)
180 iRiskyChk = np.full(self.
nMembersnMembers,
True)
182 rlsToday[:, :] = self.
rlsFcstrlsFcst[1, :, :].T
183 if np.any(rlsToday[:] > 0):
186 tsMax, mbrMax = np.where(rlsToday==np.max(rlsToday))
188 self.
releaserelease[self.T.Tcont.step] = self.
rlsFcstrlsFcst[1, mbrMax[0], tsMax[0]]
189 rlsSched = self.
rlsFcstrlsFcst[:, mbrMax[0], tsMax[0]]
192 self.
releaserelease[self.T.Tcont.step] = 0
198 rlsTot = np.nansum(rlsFcst)
202 rlsMax = self.
efoResrvrefoResrvr[ensMbr].rlsMax[1:tsHoriz+1]
203 rlsApplied = self.
efoResrvrefoResrvr[ensMbr].rlsCtrl[1:tsHoriz+1]
204 rlsMaxPrev = np.zeros(len(rlsMax))
205 rlsFcstInit = np.copy(rlsFcst)
209 for i
in range(1, tsHoriz+1):
210 if issubclass(type(self.
efoResrvrefoResrvr[ensMbr]), ReservoirJunction):
212 if issubclass(type(self.
ruleRlsSpecifiedruleRlsSpecified[ensMbr]), RuleRlsSpecified):
213 self.
ruleRlsSpecifiedruleRlsSpecified[ensMbr].set_release(i, np.copy(rlsFcst[i-1]))
216 self.
efoNetworkefoNetwork[ensMbr].process_fcst_junctions()
217 self.
storFcststorFcst[i, ensMbr, tsHoriz-1] = np.copy(self.
efoResrvrefoResrvr[ensMbr].stor[i])
220 if rlsTot - np.sum(rlsApplied) < pctConvg*rlsTot\
221 or np.all(np.absolute(rlsMaxPrev - rlsMax) < 0.01)
or curItr > maxItr:
225 rlsMaxPrev = np.copy(rlsMax)
227 return rlsFcst, np.copy(rlsMax)
230 rlsFcst = np.copy(rlsFcstInit)
231 rlsFcstCheck = np.zeros(len(rlsFcst))
232 iVal = ~np.isnan(rlsFcst) & ~np.isnan(rlsMax)
233 iMaxed = np.full(len(rlsFcst),
False)
236 while any(iMaxed[1:]==
False)
and any(rlsFcst[iVal] - rlsFcstCheck[iVal] != 0):
237 rlsFcstCheck = np.copy(rlsFcst)
238 iGrtrMax = rlsFcst > rlsMax
239 iMaxed = iMaxed | iGrtrMax
240 rlsDiffVol = np.sum(rlsFcst[iGrtrMax] - rlsMax[iGrtrMax])
241 rlsFcst[iGrtrMax] = rlsMax[iGrtrMax]
242 rlsAdd = rlsDiffVol/max(1,np.sum(~iMaxed & iVal))
243 rlsFcst[~iMaxed] += rlsAdd
253 self.
riskEforiskEfo = np.full((self.T.Tcont.nSteps, self.T.nSteps), 0.)
260 self.
releaserelease[self.T.Tcont.step] = rlsSched[1]
def calc_release_fcst(self, rlsProposed, rlsUnCtrl, stor, qIn)
def calc_release(self, rlsProposed, rlsUnCtrl, stor, rlsPrev=None, qIn=None)
def __subclasshook__(cls, C)
def __init__(self, name, timeFcst)
def _calc_release_sched(self, rlsFcst, tsHoriz, ensMbr)
def __init__(self, name, timeFcst, efoResrvr, storTh, riskTol, constants, *efoNetwork=None, ruleRlsSpecified=None, efoRlsSched=None)
def calc_release_fcst(self, rlsProposed, rlsUnCtrl, stor, qIn=None)
def _get_adjusted_release_eqldist(self, rlsFcstInit, rlsMax)
def calc_release_fcst(self, rlsProposed, rlsUnCtrl, stor, qIn=None)
def __init__(self, name, rulePfo, ruleEfoNoRls)
def __init__(self, name, timeFcst, fcstNetwork)
def calc_release_fcst(self, rlsProposed, rlsUnCtrl, stor)