# cs_decoding.run ## compressed-sensing based decoding ## application in LP book by Matousek and Gaertner option randseed 0; param eps default 1e-6; ## original message to be sent include "jll/dat/hello.dat"; ##percentage of compression (you can change this value) param percent default 10; ## encoding matrix Q and encoded vector z param n integer, > 0, default round(k-(percent/100)*k); printf "\n"; printf "percentage of compression : %d", percent; printf "\n"; set N := 1..n; param Q{N,K} default Uniform(-1,1); param z{j in N} default sum{i in K} Q[j,i]*w[i]; # formulate and solve the ell_1 norm minimization LP var x{K}; var s{K}; minimize norm1: sum{j in K} s[j]; subject to n1lin1{j in K}: x[j] >= -s[j]; subject to n1lin2{j in K}: x[j] <= s[j]; subject to enc{i in N}: sum{j in K} Q[i,j]*x[j] = z[i]; problem norm1LP: x,s,norm1,n1lin1,n1lin2,enc; option solver cplex; option cplex_options "baropt bardisplay=1"; #option cplex_options "display=1"; solve norm1LP; param wrec{K}; ## (reason this works so well: rounding operator - poorer on floats) let {i in K} wrec[i] := round(x[i]); # cap to [0,1] let {i in K} wrec[i] := if wrec[i] < 0 then 0 else if wrec[i] > 1 then 1 else wrec[i]; # display results printf "[CS] w_org = "; for {i in K} { printf "%d", w[i]; } printf "\n"; printf "[CS] w_rec = "; for {i in K} { printf "%d", wrec[i]; } printf "\n"; include "jll/bin2str.run";