% generate data for energy portfolio problem
% returns quantities N, Nval, n, b, cmax, cmin, A, Aval, d, dval
rand('state',0);

N=1000;  % number of samples used to optimize portfolio
Nval=10000; % number of samples used to validate portfolio

n_wind=4; % number of wind farms

% plant costs including subsidies, etc.
b_coal=140; % coal plant cost
b_wind=60; % wind farm cost
b_solar=55; % solar farm cost

b=[b_coal;b_wind*ones(n_wind,1);b_solar];

n=length(b); % we'll have n_wind wind farms + 1 coal plant + 1 solar farm

% energy production capacity limits for each type of plant
cmax_coal=35;
cmax_wind=10;
cmax_solar=20;
% stack into one vector cmax
cmax=[cmax_coal;cmax_wind*ones(n_wind,1);cmax_solar];
cmin=zeros(n,1); % cmin is zero for all plants

p=1100; % price to produce energy by the peakers

% generate random coal plant availability
poff = 0; % coal plant down some of the time
punif = 0.1; % prob mass uniformly distributed on [0,1]
% otherwise, coal plant fully functional
f = 1/punif; g = -poff/punif;
acoal=f*rand(1,N+Nval)+g;
acoal = max(acoal,0);  % clip a to be >= 0
acoal = min(acoal,1); % clip a to be <= 1

% generate random wind availability
poff = 0.3; % no wind some of the time
punif = 0.6; % prob mass uniformly distributed on [0,1]
% otherwise, wind on full
f = 1/punif; g = -poff/punif;
awind=f*rand(n_wind,N+Nval)+g;
awind = max(awind,0);  % clip a to be >= 0
awind = min(awind,1); % clip a to be <= 1

% generate correlated demand and solar availability
randvar=rand(1,N+Nval); %generate a rand var to be used in solar and demand
d=20+25*(randvar+rand(1,N+Nval)); % this is the demand vector

% generate random solar availability
poff = 0.5; % no solar some of the time
punif = 0.3; % prob mass uniformly distributed on [0,1]
% otherwise, solar on full
f = 1/punif; g = -poff/punif;
asolar=f*randvar+g;
asolar = max(asolar,0);  % clip a to be >= 0
asolar = min(asolar,1); % clip a to be <= 1

% stack availabilities into one matrix
A=[acoal;awind;asolar];

% separate training and validation sets
dval=d(:,N+1:N+Nval);
d(:,N+1:N+Nval)=[];

Aval=A(:,N+1:N+Nval);
A(:,N+1:N+Nval)=[];

% clear place holder variables
clear f g poff punif randvar cmax_coal cmax_wind cmax_solar ...
    b_coal b_wind b_solar n_wind asolar awind acoal
