/* fair_demand.pl */
fair_demand_daily( Level, FairStartDate, FairEndDate, TlStartDate, TlEndDate, Xs, Ys ) :-
fair_demand_key_points( Level, FairStartDate, FairEndDate, KeyPoints),
maplist( {TlStartDate} / [kp(Date,DI,_Reason), Offset-DI] >> date_interval(Date, TlStartDate, days(Offset))
, KeyPoints
, OffsetsAndDIs
),
TlStartOffset = 0,
date_interval(TlEndDate, TlStartDate, days(TlEndOffset)),
time_series_segments_to_points(TlStartOffset, TlEndOffset, OffsetsAndDIs, Xs, Ys).
fair_demand_key_points( Level, FairStartDate, FairEndDate, KeyPoints ) :-
findall( kp( Date, DI, Reason )
, fair_demand_key_point( Level, FairStartDate, FairEndDate, Date, DI, Reason )
, KeyPoints
).
fair_demand_key_point( [TPSym,ISSym,HASym], FairStartDate, FairEndDate, Date, DI, Reason ) :-
fair_demand_symbolic( [TPSym,ISSym,HASym], DR, DI, Reason ),
eval_daterel_fair( DR, FairStartDate, FairEndDate, Date ).
tp_symbol_range(high, 1.5, 2.0).
tp_symbol_range(medium, 1.1, 1.49).
tp_symbol_range(medium_low, 0.8, 1.09).
tp_symbol_range(low, 0.5, 0.79).
is_symbol_range(large, 1.5, 2.0).
is_symbol_range(medium_large, 1.2, 1.49).
is_symbol_range(medium, 0.9, 1.19).
is_symbol_range(small_medium, 0.7, 0.89).
is_symbol_range(small, 0.5, 0.69).
ha_symbol_range(very_high, 2.0, 2.0).
ha_symbol_range(high, 1.5, 1.99).
ha_symbol_range(medium_high, 1.2, 1.49).
ha_symbol_range(medium, 0.9, 1.19).
ha_symbol_range(low_medium, 0.7, 0.89).
ha_symbol_range(low, 0.5, 0.69).
fair_demand_symbolic( [tp-TPSym,is-ISSym,ha-HASym], DR, DI, Reason ) :- !,
tp_symbol_range( TPSym, TPLow, TPHigh ),
is_symbol_range( ISSym, ISLow, ISHigh ),
ha_symbol_range( HASym, HALow, HAHigh ),
TPNum is (TPLow + TPHigh) / 2.0,
ISNum is (ISLow + ISHigh) / 2.0,
HANum is (HALow + HAHigh) / 2.0,
fair_demand( [TPNum,ISNum,HANum], DR, DI, Reason ).
% Before the fair starts.
fair_demand( [_,_,_], 'start'-10, 0, "Just before early arrivals for setup and pre-fair meetings." ).
fair_demand( [TP,IS,HA], 'start'-7, DI, "Early arrivals for setup and pre-fair meetings." ) :-
DI is 5 + TP*0.5 + IS*0.3 + HA*0.01.
fair_demand( [TP,IS,HA], 'start'-3, DI, "Attendees arriving for pre-fair workshops or networking." ) :-
DI is 10 + TP*0.7 + IS*0.5 + HA*0.015.
fair_demand( [TP,IS,HA], 'start', DI, "Opening day of the fair, highest influx of attendees." ) :-
DI is 20 + TP + IS*0.7 + HA*0.02.
% During the fair.
fair_demand( [TP,IS,HA], 'mid', DI, "Mid-fair, continued high demand for flights." ) :-
DI is 15 + TP*0.9 + IS*0.6 + HA*0.018.
fair_demand( [TP,IS,HA], 'end'-2, DI, "As the fair concludes, last-minute attendees and ongoing activities." ) :-
DI is 10 + TP*0.8 + IS*0.4 + HA*0.015.
% After the fair ends.
fair_demand( [_,_,_], 'end'+2, 0, "Arrivals end as the fair wraps up." ).
eval_daterel_fair( 'start', FairStartDate, _FairEndDate, FairStartDate ).
eval_daterel_fair( 'mid', FairStartDate, FairEndDate, FairMidDate ) :-
date_interval( FairEndDate, FairStartDate, days(Diff) ),
HalfDiff is floor(Diff),
date_add( FairStartDate, days(HalfDiff), FairMidDate ).
eval_daterel_fair( 'end', _FairStartDate, FairEndDate, FairEndDate ).
eval_daterel_fair( DR+Offset, FairStartDate, FairEndDate, Date ) :-
eval_daterel_fair( DR, FairStartDate, FairEndDate, DRDate ),
date_add( DRDate, days(Offset), Date ).
eval_daterel_fair( DR-Offset, FairStartDate, FairEndDate, Date ) :-
eval_daterel_fair( DR, FairStartDate, FairEndDate, DRDate ),
date_add( DRDate, days(-Offset), Date ).