schedule_backups(DStarts,WStarts,Total):-
findall(Server,backup(Server,_,_,_,_),Types),
findall(PossibleStart,backup(db,_,PossilbleStart,_,_),Posiible_DB_Starts),
findall(PossibleStart,backup(web,_,PossilbleStart,_,_),Possible_WEB_Starts),
findall(Duration,backup(db,_,_,Duration,_),DB_Durations),
findall(Duration,backup(web,_,_,Duration,_),WEB_Durations),
findall(Bandwidth,backup(_,_,_,_,Bandwidth),Bandwidths),
constraint_Starts_Ends(DBStarts,DbEnds,Possilble_DB_Starts,DB_Durations,-1),
constraint_Starts_Ends(WEBStarts,WebEnds,Possilble_WEB_Starts,WEB_Durations,-1),
append(DBStarts,WEBStarts,Starts),
append(DbEnds,WebEnds,Ends),
append(DB_Durations,WEB_Durations,Durations),
cumulative(Starts, Durations,Bandwidths, 25),
ic_global:maxlist(Ends,Total),
bb_min(labeling(Starts),Total,bb_options{strategy:restart}),
link(Types,Starts,WStarts,DStarts).
constraint_Starts_Ends([],[],[],[],_).
constraint_Starts_Ends([S|RestS],[E|RestE],[P|RestP],[Dur|RestDur],Prev):-
S #:: 0..inf,
S #>= P,
S #>= Prev,
E #:: 0..inf,
E #= Dur + S,
constraint_Starts_Ends(RestS,RestE,RestP,RestDur,E).
link([],[],[],[]).
link([T|TRest],[St|StRest],[WStarts|WRest],Db):-
T == web,
WStarts = St,
link(TRest,StRest,WRest,Db).
link([T|TRest],[St|StRest],Wb,[D|DRest]):-
T == db,
D = St,
link(TRest,StRest,Wb,DRest).