|
from .scenario_reducer import Scenario_reducer |
|
import numpy as np |
|
|
|
class Fast_forward_W2(Scenario_reducer): |
|
''' |
|
This class implements a scenario reducer that follows |
|
a Fast Forward (FF) technique with a 2-norm metric. |
|
|
|
Please notice that FF is preferred for n<N/4, where n is the |
|
new reduced cardinality and N is the original one. |
|
|
|
We assume a discrete uniform initial distribution on the scenarios. |
|
''' |
|
def __init__(self, initialSet): |
|
|
|
self.initialSet = initialSet |
|
self.N = initialSet.shape[1] |
|
self.initProbs = (1/self.N)*np.ones(self.N) |
|
|
|
def reduce(self, n_scenarios: int = 1): |
|
|
|
|
|
|
|
""" |
|
reduces the initial set of scenarios |
|
""" |
|
indxR = [] |
|
probs_initial = self.initProbs.copy() |
|
|
|
dist_mtrx = np.zeros((self.N,self.N)) |
|
for i in range(self.N): |
|
for j in range(self.N): |
|
dist_mtrx[i,j] = np.linalg.norm( self.initialSet[:,i] - self.initialSet[:,j] ) |
|
|
|
J_set = np.arange(self.N) |
|
|
|
zeta = np.zeros(self.N) |
|
for u in J_set: |
|
tmpProb = probs_initial[u] |
|
probs_initial[u] = 0 |
|
zeta[u] = probs_initial @ dist_mtrx[:,u] |
|
probs_initial[u] = tmpProb |
|
|
|
indxR.append(np.nanargmin(zeta)) |
|
|
|
|
|
for it in range(n_scenarios-1): |
|
zeta = np.zeros(self.N) |
|
probs_initial[indxR] = 0 |
|
|
|
J_set = np.setdiff1d(J_set,indxR[-1]) |
|
for u in J_set: |
|
tmpProb = probs_initial[u] |
|
probs_initial[u] = 0 |
|
zeta[u] = probs_initial @ dist_mtrx[:,u] |
|
probs_initial[u] = tmpProb |
|
|
|
zeta[indxR] = np.nan |
|
indxR.append(np.nanargmin(zeta)) |
|
J_set = np.setdiff1d(J_set,indxR[-1]) |
|
|
|
|
|
probs_initial = self.initProbs.copy() |
|
probs_reduced = probs_initial[indxR] |
|
|
|
|
|
dist_mtrx[np.arange(self.N),np.arange(self.N)] = np.nan |
|
indx_closest = lambda x: np.nanargmin(dist_mtrx[x,indxR]) |
|
for toDelete in J_set: |
|
probs_reduced[indx_closest(toDelete)] += probs_initial[toDelete] |
|
|
|
if round(np.sum(probs_reduced),2) != 1: |
|
raise ValueError('new Probs must sum to one') |
|
|
|
return self.initialSet[:,indxR], probs_reduced |
|
|