Advertisement
Guest User

Untitled

a guest
May 30th, 2019
264
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Julia 3.59 KB | None | 0 0
  1. using DelimitedFiles;
  2.  
  3. lcat(x...) = cat(x...; dims=1)
  4.  
  5. function tofloat(x)
  6.   if x isa AbstractString
  7.     x = replace(x, ","=>".");
  8.     return parse(Float64, x)
  9.   end
  10.   return x
  11. end
  12. # noms_nuls = [ "BLANCS", "NULS", "ABSTENTION" ]
  13. noms_nuls = [];
  14. noms_x = lcat([ "MACRON", "LE PEN", "FILLON", "MÉLENCHON", "HAMON",
  15.  "DUPONT-AIGNAN", "LASSALLE", "POUTOU", "ASSELINEAU", "ARTHAUD", "CHEMINADE" ],
  16.  noms_nuls)
  17. tmp_y = readdlm("euro1.csv", ';', quotes=true)
  18. noms_y = lcat([ tmp_eur[2,13+7j] for j=1:34 ], noms_nuls)
  19. function read_results(f,c,noms=false)
  20.   E0 = readdlm(f,c,quotes=true);
  21.   m = div(size(E0,2)-18,7)
  22.   E1 = fill(0.,size(E0,1)-1,m+2+length(noms_nuls));
  23.   for i=1:size(E1,1)
  24.     l = i+1
  25.     k = E0[l,1]
  26.     if k isa AbstractString
  27.       if k[1] == '2'; k = 20; end # Corse
  28.       if k[1] == 'Z'; k = 97; end # DOM-COM
  29.     end
  30.     E1[i,1] = 1000*k+E0[l,3];
  31.     E1[i,2] = E0[l,16];
  32.     if length(noms_nuls) >= 1 E1[i,m+3] = E0[l,10]; end
  33.     if length(noms_nuls) >= 2 E1[i,m+4] = E0[l,13]; end
  34.     if length(noms_nuls) >= 3 E1[i,m+5] = E0[l,6]; end
  35.     for j=1:m
  36.       y = tofloat(E0[l,16+7j]) #  18+7j = %, 16+7j = exprimés
  37.       if noms != false
  38.         for k = 1:size(noms, 1)
  39.           if E0[l,14+7*j] == noms[k]
  40. #             print("$i, $j => $k $(noms[k])\n")
  41.             E1[i,k+2] = y
  42.           end
  43.         end
  44.       else
  45.         E1[i,j+2] = y
  46.       end
  47.     end
  48.   end
  49.   return E1
  50. end
  51. function read_x() read_results("prez.csv",',', noms_x) end
  52. function read_y() read_results("euro.csv",';') end
  53.  
  54.  
  55. function merge_mat(A,B)
  56.   M = Pair{Int,Int}[]
  57.   sA = size(A,1)
  58.   sB = size(B,1)
  59.   j = 1
  60.   for i = 1:sA
  61.     a = A[i,1]
  62. #     print("testing A[$i] = $a\n")
  63.     while B[j,1] < a && j < sB; j+=1; end
  64. #     print("  B[$j,1]=$(B[j,1])\n")
  65.     if(B[j,1] == a); M = lcat(M,[i=>j]); end
  66.   end
  67.   A1 = fill(0., size(M,1), size(A,2)-2)
  68.   B1 = fill(0., size(M,1), size(B,2)-2)
  69.   W = fill(0, size(M,1))
  70.   for i = 1:size(M,1)
  71. #     print("M[$i] = $(M[i])\n")
  72.     w = A[M[i].first,2]; w = (w == 0) ? 1 : w; # prevents div-by-0
  73.     W[i] = w; # A[M[i].first, 2]
  74.     for j = 1:size(A1,2)
  75.       A1[i,j] = A[M[i].first,j+2]
  76.     end
  77.     for j = 1:size(B1,2)
  78.       B1[i,j] = B[M[i].second,j+2]
  79.     end
  80.   end
  81.   A1,B1,W
  82. end
  83.  
  84. A0 = read_x()
  85. B0 = read_y()
  86. X,Y,weight = merge_mat(A0,B0)
  87. N = size(X,1)
  88. sX = size(X,2)
  89. sY = size(Y,2)
  90. result_y = [Int(sum([ B0[i,j+2] for i=1:size(B0,1) ])) for j=1:sY]
  91. result_x = [Int(sum([X[i,j] for i=1:N])) for j=1:sX]
  92.  
  93. perm_y = lcat(sortperm(result_y[1:sY-length(noms_nuls)],rev=true),
  94.   sY-length(noms_nuls)+1:sY)
  95. Y = [Y[i,perm_y[j]] for i=1:N,j=1:sY]
  96. noms_y = [noms_y[perm_y[j]] for j=1:sY]
  97.  
  98. using JuMP
  99. using Ipopt
  100. model = Model(with_optimizer(Ipopt.Optimizer))
  101.  
  102. @variable(model, a[1:sY,1:sX] >= 0)
  103. # @constraint(model, stoch[i=1:sX], sum(a[j,i] for j=1:sY) == 1)
  104. L = [-2*sum([ X[i,k]*Y[i,j]/weight[i] for i=1:N ]) for j=1:sY, k=1:sX ];
  105. Q = [  sum([ X[i,k]*X[i,l]/weight[i] for i=1:N]) for k=1:sX, l=1:sX ];
  106. # @constraint(model, consist[j=1:sY],
  107. #   sum(a[j,i]*result_x[i] for i=1:sX) == result_y[j]);
  108.  
  109. @objective(model, Min, sum(L[j,k]*a[j,k] for j=1:sY, k=1:sX)
  110.   + sum(Q[k,l]*a[j,k]*a[j,l] for j=1:sY, k=1:sX, l=1:sX));
  111.  
  112. optimize!(model)
  113. Sol = value.(a)
  114. writedlm("solved.csv",
  115.   hcat(lcat("",noms_x), permutedims(hcat(noms_y, Sol), (2,1))))
  116.  
  117. open("transfer.txt", "w") do f
  118. for j=1:sX, i=1:sY
  119.   c=Int(round(Sol[i,j]*result_x[j]/2.3e5))
  120.   x=noms_x[j]
  121.   y=noms_y[i]
  122.   if c > 0
  123.   write(f, "$x\t[$c]\t$y\n")
  124.   end
  125. end end
  126.  
  127. # using LinearAlgebra
  128. # tX = transpose(X)  # * Diagonal(W)
  129. # K = tX*X
  130. # sK = Symmetric(K)
  131. # L = tX*Y
  132. # Z = sK\L
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement