% % ECLiPSe CODE: for buffer scheduling in Uplink of WCDMA % % AUTHOR: Deze Zhao % % DESCRIPTION: A magic square of size NxM, square means the transmission % matrix, N is the Channels, the same as buffers too. % M means the minimized transmission times. % :- lib(ic). %:- lib(fd). %:- lib(ria). pepsi5 :- N is 5, cputime(T0), solve(N), !, T is cputime - T0, % for telling how long time CPU used writeln([T, 'eeseconds']). %%% starting to solve the problem solve(N) :- % N means user's number and M the transmission steps % setting for different SIR_Target groops %%% init_target_sir(Target_sir), Target_sir is 3.16, ( for(I, 1, 20), param(N,Target_sir) do getGains(N, DisGain, LisGain), sort(DisGain, DGain), sort(LisGain, LLGain), %reverse(DDGain, DGain), reverse(LLGain, LGain), writeln(DGain), writeln(LGain), getConv(LGain, DisConv), reverse(DisConv, DDisConv), writeln(DDisConv), %%% dealing with the users' buffers getBuff(N, Gbuff), writeln(Gbuff), reverse(Gbuff, SS), CC is DisConv[1], ( (CC =< 2232.0, M1 is ceiling(SS[1]/960), M is fix(M1), writeln(['Steps from', M])); (CC >= 2233.0, CC =< 2655.0, M1 is ceiling(SS[1]/480), M is fix(M1), writeln(['Steps from', M])); (CC >= 2656.0, CC =< 3157.0, M1 is ceiling(SS[1]/240), M is fix(M1), writeln(['Steps from', M])); (CC >= 3158.0, CC =< 3755.0, M1 is ceiling(SS[1]/120), M is fix(M1), writeln(['Steps from', M])); (CC >= 3756.0, CC =< 4465.0, M1 is ceiling(SS[1]/60), M is fix(M1), writeln(['Steps from', M])); (CC >= 4466.0, CC =< 5310.0, M1 is ceiling(SS[1]/30), M is fix(M1), writeln(['Steps from', M])); (CC >= 5311.0, CC =< 6302.0, M1 is ceiling(SS[1]/15), M is fix(M1), writeln(['Steps from', M])) ), ( for(I,1,N), foreach (DD,DDisConv), param(N,DDisConv) do (DD =< 2232.0, writeln([0, 15, 30, 60, 120, 240, 480, 960])); (DD >= 2233.0, DD =< 2655.0, writeln([0, 15, 30, 60, 120, 240, 480]) ); (DD >= 2656.0, DD =< 3157.0, writeln([0, 15, 30, 60, 120, 240])); (DD >= 3158.0, DD =< 3755.0, writeln([0, 15, 30, 60, 120])); (DD >= 3756.0, DD =< 4465.0, writeln([0, 15, 30, 60])); (DD >= 4466.0, DD =< 5310.0, writeln([0, 15, 30])); (DD >= 5311.0, DD =< 6302.0, writeln([0, 15]) ) ), %%% calling the solution finding part cputime(T1), magic1(Gbuff, LGain, DDisConv, Target_sir, N, M), !, TT is cputime - T1, writeln([TT, 'iiseconds']), nl %read(XX) ), write('haha...'), !. %%% for getting the distances and corresponding gain matrix % generating the floating point number between 0~1 % using the Box-Muller method to generate log-normal value getGains(N, DGain, LGain):- getGains(N, [], [], DGain, LGain). getGains(N, TTT1, TTT2, DGain, LGain):- frandom(F1), Dis is fix(6300*F1), frandom(F2), frandom(F3), KXi is ((-2*ln(F3))^0.5)*cos(2*pi*F2), GG is (10^(KXi/10))/(Dis^4), addm(Dis, GG, N, NN, TTT1, TTT2, Acc1, Acc2), NN >= 0, getGains(NN, Acc1, Acc2, DGain, LGain). getGains(0, DGain, LGain, DGain, LGain). addm(Dis, GG, N, NN, TTT1, TTT2, [Dis|TTT1], [GG|TTT2]):- GG =< 1/(30^4), GG >= 1/(6300^4) , NN is N-1. addm(Dis, GG, N, N, TTT1, TTT2, TTT1, TTT2):- GG < 1/(6300^4). addm(Dis, GG, N, N, TTT1, TTT2, TTT1, TTT2):- GG > 1/(30^4). %%% for converting the distance deviation getConv(LGain, DisConv):- getConv(LGain, [], DisConv). getConv([X|Taii], Acc, DisConv):- Conv is (1/X)^(1/4), DCV is round(Conv), getConv(Taii, [DCV|Acc], DisConv). getConv([], DisConv, DisConv). %%% for producing the buffer sizes with uniform distribution getBuff(N, Gbuff):- getBuff(N, [], Gbuff). getBuff(N, Acc, Gbuff):- frandom(F4), NB is 15*fix(99*F4)+15, NN is N-1, NN >= 0, getBuff(NN, [NB|Acc], Gbuff). getBuff(0, Gbuff, Gbuff). %%% magic1(Buffers,Gains,DDisConv, Target_sir,N,M):- (magic2(Buffers,Gains, DDisConv, Target_sir,N,M), !, write('i_am_here')) ; (MM is M+1, magic1(Buffers,Gains, DDisConv,Target_sir,N,MM)). magic2(Buffers,Gains,DDisConv,Target_sir,N,M) :- % making the transmission matrix, N users ans M steps dim(Square, [N,M]), %writeln(Gains), writeln(DDisConv), write(['M..', M]), %%% grouping the rates range ( for(I,1,N), foreach (DD,DDisConv), param(N,M,Square,DDisConv) do (DD =< 2232.0, Square[I,1..M]::[0, 15, 30, 60, 120, 240, 480, 960]); (DD >= 2233.0, DD =< 2655.0, Square[I,1..M]::[0, 15, 30, 60, 120, 240, 480]); (DD >= 2656.0, DD =< 3157.0, Square[I,1..M]::[0, 15, 30, 60, 120, 240]); (DD >= 3158.0, DD =< 3755.0, Square[I,1..M]::[0, 15, 30, 60, 120]); (DD >= 3756.0, DD =< 4465.0, Square[I,1..M]::[0, 15, 30, 60]); (DD >= 4466.0, DD =< 5310.0, Square[I,1..M]::[0, 15, 30]); (DD >= 5311.0, DD =< 6302.0, Square[I,1..M]::[0, 15]) ), %%% Rows is Square[1..N,1..M], flatten(Rows, Vars), % decide the constrains for buffer volume ( for(I,1,N), foreach (BB1, Buffers), param(N,M, Square, Buffers) do %sum row I as the buffer constraint for the user BB1 *= sum(Square[I,1..M]) ), ( for(I,1,N), foreach (BB2, Buffers), param(N,M,Square, Buffers) do ( for(J,2,M), param(I,N,M,Square, BB2) do BB2 *>= Square[I,J] + sum(Square[I,1..J-1]) ) ), ( for(I,1,M), param(N,M,Square,Target_sir) do ( for(J,1,N), foreach(U,Temp), param(I,N,M,Square,Target_sir) do Square[J,I]*Target_sir*U+3840.0*U *= Square[J,I]*Target_sir %U = Square[J,I]*Target_sir[J]/(Square[J,I]*Target_sir[J]+3840.0) ), 1.0 *>= sum(Temp) ), ( for(I,1,M), param(N,M,Square,Gains,Target_sir) do ( for(K,1,N), foreach(GG, Gains), param(I,N,M,Gains,Square,Target_sir) do %%%R3 *= Square[K,I]*Target_sir/(3840.0+Square[K,I]*Target_sir), %%%3.0 *>= 3.84*R3/((1-sum(Temp))*GG*25118864315095.8) Square[K,I]*Target_sir*25118864315095.8*GG*3.0 - Square[K,I]*Target_sir* ((Square[1,I]*Target_sir/(Square[1,I]*Target_sir+3840.0)) + (Square[2,I]*Target_sir/(Square[2,I]*Target_sir+3840.0)) + (Square[3,I]*Target_sir/(Square[3,I]*Target_sir+3840.0)) + (Square[4,I]*Target_sir/(Square[4,I]*Target_sir+3840.0)) + (Square[5,I]*Target_sir/(Square[5,I]*Target_sir+3840.0))) *25118864315095.8*GG*3.0 + 3840.0*25118864315095.8*GG*3.0 - 3840.0* ((Square[1,I]*Target_sir/(Square[1,I]*Target_sir+3840.0)) + (Square[2,I]*Target_sir/(Square[2,I]*Target_sir+3840.0)) + (Square[3,I]*Target_sir/(Square[3,I]*Target_sir+3840.0)) + (Square[4,I]*Target_sir/(Square[4,I]*Target_sir+3840.0)) + (Square[5,I]*Target_sir/(Square[5,I]*Target_sir+3840.0))) *25118864315095.8*GG*3.0 *>= 3.84*Square[K,I]*Target_sir ) ), %locate(Vars, 0.1), !, mylabeling(Vars), !, % print result the program finished here print_square(Square), %%% result checking write(['new steps is', M]), ( for(I,1,M), param(N,M,Square,Gains,Target_sir) do ( for(K,1,N), foreach(GG, Gains), param(I,N,M,Gains,Square,Target_sir) do Sum1 is (Square[1,I]*Target_sir/(Square[1,I]*Target_sir+3840.0)) + (Square[2,I]*Target_sir/(Square[2,I]*Target_sir+3840.0)) + (Square[3,I]*Target_sir/(Square[3,I]*Target_sir+3840.0)) + (Square[4,I]*Target_sir/(Square[4,I]*Target_sir+3840.0)) + (Square[5,I]*Target_sir/(Square[5,I]*Target_sir+3840.0)), R3 is Square[K,I]*Target_sir/(3840.0+Square[K,I]*Target_sir), Check is 3.0 - (3.84*R3/((1-Sum1)*GG*(10^13.4))), %write(['Power', Check]), Check >= 0.0 ) ), write('checking is OK'), nl. mylabeling([]). mylabeling([X|Rest]) :- indomain(X), mylabeling(Rest). print_square(Square) :- dim(Square, [N,M]), nl, ( for(I,1,N), param(N,M,Square) do ( for(J,1,M), param(M,I,Square) do Field is Square[I,J], printf("%6d", Field) ), nl ), nl. %%% the end