reset; param ver symbolic = "ac30"; param T integer, >=1; param N integer, >=2; param layers{1..T} default 0; param pump{t in 1..T, 1..layers[t]}; set BOTTLENECKS{t in 1..T,1..layers[t]} dimen 2; set PATH{t in 1..T,1..layers[t]} dimen 2; set INITLINKS{1..T} dimen 2; param load{t in 1..T, l in 1..layers[t], (i,j) in PATH[t,l]} >=0; data dump/path.txt; commands aron-config.txt; param bottlnum{t in 1..T, l in 1..layers[t]} = card(BOTTLENECKS[t,l]); param incrabs{t in 1..T, l in 1..layers[t]} = (if l>=2 then incrabs[t,l-1] else 1)*pump[t,l]; param eps=1e-8; set TC = # {0} union # setof{i in 5..3 by -1} round(10^-i,10) union setof{i in 0.033..0.08 by 0.003} round(i,10) within interval [0,1); set P = TC union setof{t in 1..T, l in 1..layers[t]: incrabs[t,l]>1} 1/incrabs[t,l] union setof{t in 1..T, l in 1..layers[t],(i,j) in PATH[t,l] diff BOTTLENECKS[t,l]: incrabs[t,l]>1} load[t,l,i,j]/incrabs[t,l]; #===FEC=== param minN{p in P} = max(M,if p=0 then 0 else floor(log10(DER/M)/log10(p))); param maxN_probe{p in P, pr in 1..4} = minN[p]*2^pr; param Binomial_probe{p in P, pr in 1..4} = if M>=2 then prod{i in 1..M-1} ( (maxN_probe[p,pr]-M+1+i)/i * p^((maxN_probe[p,pr]-M+1)/(M-1))*(1-p) ) else p^maxN_probe[p,pr]; param maxN{p in P} = maxN_probe[p, min{pr in 1..4: Binomial_probe[p,pr]<=DER/M} pr]; set NN{p in P} = {minN[p]..maxN[p]}; param Binomial1{p in P, Ntr in NN[p]}= if M>=2 then prod{i in 1..M-1}((Ntr-M+1+i)/i*p^((Ntr-M+1)/(M-1))*(1-p)) else p^Ntr; param pbyq{p in P} = p/(1-p); param Binomial{p in P, Ntr in NN[p], n in Ntr-M+1..Ntr} = if n=Ntr-M+1 then Binomial1[p,Ntr] else Binomial[p,Ntr,n-1]*(Ntr-n+1)/n*pbyq[p]; param Failure{p in P, Ntr in NN[p]} = sum{i in Ntr-M+1..Ntr}Binomial[p,Ntr,i]; param goodN{p in P} = min{Ntr in NN[p]: Failure[p,Ntr]<=DER} Ntr; param FEC{p in P} = if goodN[p]-1 in NN[p] and Failure[p,goodN[p]-1]>DER then goodN[p]-1 + (log(Failure[p,goodN[p]-1]) - log(DER)) / (log(Failure[p,goodN[p]-1]) - log(Failure[p,goodN[p]])) else goodN[p]; #=== #param FEC{p in P} = M + if p=0 then 0 else log(DER/M)/log(p); param ARN{tc in TC, p in P} = if p<=tc then 0 else (FEC[p]-FEC[tc])/FEC[tc]; param benchmark_start; param benchmark_stop; param benchmark_info symbolic; param logrec symbolic = sprintf("%s, %s, %s, done in %f seconds", ver,sub(ctime(),"^ *[^ ]* *",""),benchmark_info,benchmark_stop-benchmark_start); param logfile symbolic = "aron.log"; param aron_b{tc in TC, t in 1..T, l in 1..layers[t]} = (if l >=2 then aron_b[tc,t,l-1]) + if incrabs[t,l]>1 then bottlnum[t,l] * ARN[tc,1/incrabs[t,l]]; param aron_p{tc in TC, t in 1..T, l in 1..layers[t]} = sum{(i,j) in PATH[t,l] diff BOTTLENECKS[t,l]: incrabs[t,l]>1} ARN[tc,load[t,l,i,j]/incrabs[t,l]]; param aron{tc in TC, t in 1..T, l in 1..layers[t]} = aron_b[tc,t,l] + aron_p[tc,t,l]; param shift{t in 1..T} = if pump[t,1]<=1 then 1 else 0; param chunk = (T + chunks-1) div chunks; set FRAMES{i in 1..chunks} = {t in (i-1)*chunk+1..min(i*chunk,T): 1+shift[t] in 1..layers[t]}; param frames{i in 1..chunks} = card(FRAMES[i]); set CHUNKS = {i in 1..chunks: frames[i]>=1}; param maxlayers{i in CHUNKS} = max{t in FRAMES[i]} (layers[t] - shift[t]); param links{t in 1..T} = card(PATH[t,layers[t]]) + sum{l in 1..layers[t]-1} card(BOTTLENECKS[t,l]); #average ARON per frame param afaron{tc in TC, i in CHUNKS, l in 1..maxlayers[i]} = 1/frames[i] * sum{t in FRAMES[i]} aron[tc,t,min(l+shift[t],layers[t])]; param layerlinks1{t in 1..T, l in 1..layers[t]} = if pump[t,l] > 1 then card(PATH[t,l]) + sum{ll in 1..l-1: pump[t,ll]>1} card(BOTTLENECKS[t,ll]); param layerlinks{t in 1..T, l in 1..layers[t]} = layerlinks1[t,min(l+shift[t],layers[t])]; param alaron{tc in TC, i in CHUNKS, l in 1..maxlayers[i]} = (1/sum{t in FRAMES[i]} layerlinks[t,if l <= layers[t] then l else layers[t]]) * sum{t in FRAMES[i]} aron[tc,t,min(l+shift[t],layers[t])]; param dir symbolic; param file symbolic = dir & "/aron.csv"; let dir := sprintf("%s-aron",ver); shell ("rmdir /s /q " & dir); shell ("mkdir " & dir); shell ("del /q " & dir & "\*"); shell ("copy " & ver & "*.txt " & dir); shell ("copy config.txt " & dir); shell ("copy aron-config.txt " & dir); let benchmark_info := "ARON"; let benchmark_start := _ampl_time; print "Benchmarking ",benchmark_info," ..."; for{tc in TC} { printf ",t=%s", round(tc,if tc>0 then max( round(-log(tc)/log(10))+1 ,3)) > (file); } printf "\n" > (file); for{i in CHUNKS} { for{l in 1..min(10,maxlayers[i])} { printf "layer%d",l > (file); for{tc in TC} { printf ",%f", afaron[tc,i,l] > (file); } printf "\n" > (file); } printf "\n" > (file); } close (file); let benchmark_stop := _ampl_time; reset data logrec; print logrec; print logrec >> (logfile); close (logfile);