
param True;
param False;

param Data1;		
param Data2;		
param Data3 in {-1, 0, 1};
param Data4 in {0, 1};

set sSet1;

set sSet2;
param Data5{sSet2} symbolic;
param Data6{sSet2} symbolic;
param Data7{sSet2} >= 0;		
param Data8 := min{c in sSet2} Data7[c];
param Data9{sSet2} >= Data1;
param Data10{sSet2} >= 0;
param Data11{sSet2};
param Data12{sSet2} >= 0;

set sSet3;
set sSet6{i in sSet3} within sSet1;
set sSet7{i in sSet3} within sSet1;
param Data13{sSet3};
param Data14{sSet3};

param Data15{i in sSet3, n in sSet6[i]} >= 0;
param Data16{i in sSet3, n in sSet7[i]} >= 0;
param Data17{i in sSet3} := 10 + sum{n in sSet6[i]} Data15[i,n];
set sSet5 dimen 4;

set sSet4;
set sSet1PCC{sSet4};
param Data18{sSet4} >= 0;
param Data19{sSet4} >= 0;

############################################################################
# Variables
############################################################################

var vVar1{sSet1} >= Data1 * Data1, <= Data2^2;
var vVar2;

var vVar3{i in sSet3, n1 in sSet6[i], n2 in sSet7[i]} >= 0, <= Data17[i];
var vVar4{i in sSet3, n1 in sSet6[i], n2 in sSet7[i] : Data14[i] > 1.0001} >= 0, <= Data17[i];
var vVar5{i in sSet3, n1 in sSet6[i], n2 in sSet7[i] : Data14[i] > 1.0001} binary;
var vVar6{i in sSet3, n1 in sSet6[i], n2 in sSet7[i]} binary;
var vVar7{i in sSet3 : Data14[i] > 1.0001} >= 0, <= Data2^2;
var vVar8{i in sSet3 : Data14[i] > 1.0001} >= 0, <= Data2^2;

var vVar9{sSet2} >= 0, <= Data2^2;
var vVar10{sSet2} >= 0, <= Data2^2;
var vVar11{sSet1} >= 0, <= Data2^2;
var vVar12{sSet1} >= 0, <= Data2^2;

var vVar13 >= 0;

############################################################################
# Constraints and objective
############################################################################

minimize C : Data4 * vVar13 + Data3 * vVar2;

subject to Ct1 :	 vVar2 = (1 - Data4) * sum{c in sSet2} (Data7[c] / (Data8 * Data12[c]))^2 * (vVar1[Data5[c]] + vVar1[Data6[c]]);
subject to Ct2 : vVar13 = Data4 * sum{c in sSet2} 100 * (vVar9[c] + vVar10[c]) + sum{n in sSet1} (vVar11[n] + vVar12[n]);

subject to Ct3{c in sSet2} : vVar1[Data5[c]] - vVar1[Data6[c]] = Data11[c] + Data4 * vVar9[c] - Data4 * vVar10[c];

subject to Ct4{c in sSet2} : vVar1[Data5[c]] <= Data9[c]^2;
subject to Ct5{c in sSet2} : vVar1[Data6[c]] <= Data9[c]^2;
subject to Ct6{c in sSet2} : vVar1[Data6[c]] >= Data10[c]^2;
subject to Ct7{c in sSet2} : vVar1[Data5[c]] >= Data10[c]^2;

subject to Ct8{p in sSet4, n in sSet1PCC[p]} : Data18[p]^2 <= vVar1[n]  + Data4 * vVar11[n] - Data4 * vVar12[n] <= Data19[p]^2;

subject to Ct9{n in sSet1} :  Data1^2 <= vVar1[n] <= Data2^2; 

subject to Ct10{i in sSet3, n1 in sSet6[i] : Data14[i] > 1.0001} :
sum{n2 in sSet7[i]} (vVar3[i,n1,n2] + vVar4[i,n1,n2]) = Data15[i,n1];
subject to Ct11{i in sSet3, n2 in sSet7[i] : Data14[i] > 1.0001} :
sum{n1 in sSet6[i]} (vVar3[i,n1,n2] + vVar4[i,n1,n2]) = Data16[i,n2];

subject to Ct12{i in sSet3, n1 in sSet6[i], n2 in sSet7[i] : Data14[i] > 1.0001} : vVar3[i,n1,n2] + vVar4[i,n1,n2] <= (1 - vVar6[i,n1,n2]) * Data17[i];

subject to Ct13{i in sSet3, n1 in sSet6[i], n2 in sSet7[i] : Data14[i] > 1.0001} : vVar3[i,n1,n2] <= vVar5[i,n1,n2] * Data17[i];
subject to Ct14{i in sSet3, n1 in sSet6[i], n2 in sSet7[i] : Data14[i] > 1.0001} : vVar4[i,n1,n2] <= (1 - vVar5[i,n1,n2]) * Data17[i];

subject to Ct15{i in sSet3, n1 in sSet6[i], n2 in sSet7[i] : Data14[i] > 1.0001} : vVar1[n2] <= vVar1[n1] + (1 - vVar5[i,n1,n2] + vVar6[i,n1,n2]) * Data2^2;
subject to Ct16{i in sSet3, n1 in sSet6[i], n2 in sSet7[i] : Data14[i] > 1.0001} : vVar7[i] <= vVar1[n1] + (vVar5[i,n1,n2] + vVar6[i,n1,n2]) * Data2^2;
subject to Ct17{i in sSet3, n1 in sSet6[i], n2 in sSet7[i] : Data14[i] > 1.0001} : vVar1[n2] <= vVar8[i] + (vVar5[i,n1,n2] + vVar6[i,n1,n2]) * Data2^2;

subject to Ct18{i in sSet3 : Data14[i] > 1.0001} : vVar8[i] <= Data14[i]^2 * vVar7[i];
subject to Ct19{i in sSet3 : Data14[i] > 1.0001} : vVar8[i] >= Data13[i]^2 * vVar7[i];

subject to Ct20{i in sSet3, n1 in sSet6[i] : Data14[i] <= 1.0001} : sum{n2 in sSet7[i]} vVar3[i,n1,n2] = Data15[i,n1];
subject to Ct21{i in sSet3, n2 in sSet7[i] : Data14[i] <= 1.0001} : sum{n1 in sSet6[i]} vVar3[i,n1,n2] = Data16[i,n2];

subject to Ct22{i in sSet3, n1 in sSet6[i], n2 in sSet7[i] : Data14[i] <= 1.0001} : vVar3[i,n1,n2] <= (1 - vVar6[i,n1,n2]) * Data17[i];
subject to Ct23{i in sSet3, n1 in sSet6[i], n2 in sSet7[i] : Data14[i] <= 1.0001} : vVar1[n2] <= vVar1[n1] + vVar6[i,n1,n2] * Data2^2;

subject to Ct24{(i,n1,n2,valeur) in sSet5} : vVar6[i,n1,n2] = valeur;

solve;

end;
