# post-process: after solving, collect solution and statistics, save to file # small tolerance param zero := 1e-6; # mean and maximum distance errors param avgerr; param maxerr; # CPU time param cputime; # compute the mean distance error let avgerr := (1/card(E))*sum{(u,v) in E} abs(sqrt(abs(sum{k in K} (x[u,k]-x[v,k])^2)) - c[u,v]); # too small, set to zero if (abs(avgerr) < zero) then let avgerr := 0; # compute the maximum distance error let maxerr := max{(u,v) in E} abs(sqrt(abs(sum{k in K} (x[u,k]-x[v,k])^2)) - c[u,v]); # too small, set to zero if (abs(maxerr) < zero) then let maxerr := 0; # compute CPU time let cputime := _ampl_user_time + _total_solve_user_time; # print and save statistics to a .sol and to a .dat file # (the .dat file can be used as an input to another .mod file) printf "# MDE LDE CPU\n"; printf "%g %g %g\n", avgerr, maxerr, cputime; printf "# solution found by %s on %s, |V|=%d |E|=%d |K|=%d\n", solver, formulation, card(V), card(E), card(K) > dgp_solution.m; # output realization in gnuplot compatible format printf "" > dgp_solution.tab; for {v in V} { for {k in K} { printf "%g ", x[v,k] >> dgp_solution.tab; } printf "\n" >> dgp_solution.tab; } # output realization in matlab/octave compatible format printf "rlz = [" >> dgp_solution.m; for {k in K} { for {v in V} { printf " %g", x[v,k] >> dgp_solution.m; } printf "; " >> dgp_solution.m; } printf "];\n" >> dgp_solution.m; # output realization in AMPL (.dat) compatible format printf "param xstar :" > dgp_solution.dat; for {k in K} { printf " %d", k >> dgp_solution.dat; } printf " :=\n" >> dgp_solution.dat; for{v in V} { printf "%d", v >> dgp_solution.dat; for{k in K} { printf " %f", x[v,k] >> dgp_solution.dat; } printf "\n" >> dgp_solution.dat; } printf ";\n" >> dgp_solution.dat; printf "dgp: realization saved in dgp_solution.x (for x in {tab,m,dat})"