/* skiing_season_demand.pl */
skiing_season_demand_daily( BaseYear, TlStartDate, TlEndDate, Xs, Ys ) :-
skiing_season_demand_key_points( BaseYear, KeyPoints ),
% A list of kp(Date,DI,Reason) keypoints.
maplist( { TlStartDate } / [ kp(Date,DI,_Reason), Offset-DI ] >> date_interval( Date, TlStartDate, days(Offset) )
, KeyPoints
, OffsetsAndDIs
),
% A list of Date-DI keypoints.
TlStartOffset = 0,
date_interval( TlEndDate, TlStartDate, days(TlEndOffset) ),
time_series_segments_to_points( TlStartOffset, TlEndOffset, OffsetsAndDIs, Xs, Ys ).
% A list of date offsets Xs, and a list of demand increments Ys.
skiing_season_demand_key_points( BaseYear, KeyPoints ) :-
findall( kp(Date,DI,Reason)
, skiing_season_demand_key_point( BaseYear, Date, DI, Reason )
, KeyPoints
).
skiing_season_demand_key_point( BaseYear, Date, DI, Reason ) :-
skiing_season_demand( DR, DI, Reason ),
skiing_season_demand_eval_daterel( DR, BaseYear, Date ).
skiing_season_demand( 'start', 0, "Just before early season skiing, before holiday peaks." ).
skiing_season_demand( 'start', 10, "Early season skiing, before holiday peaks." ).
skiing_season_demand( 'start'+32, 30, "Sustained skiing interest post-holidays, including school vacation peaks." ).
skiing_season_demand( 'start'+75, 15, "Late season and spring skiing interest." ).
skiing_season_demand( 'start'+125, 15, "Late season and spring skiing interest." ).
skiing_season_demand( 'start'+145, 0, "Late season and spring skiing interest finishes." ).
skiing_season_demand_eval_daterel( 'start', Y, Date ) :-
Date = date(Y,12,1).
skiing_season_demand_eval_daterel( DR+Offset, Y, Date ) :-
skiing_season_demand_eval_daterel( DR, Y, BaseDate ),
date_add( BaseDate, days(Offset), Date ).
skiing_season_demand_eval_daterel( DR-Offset, Y, Date ) :-
skiing_season_demand_eval_daterel( DR, Y, BaseDate ),
date_add( BaseDate, days(-Offset), Date ).