BS and MS in Mathematics and Computing Sciences (July'12-June'17) at Indian Institute of Technology Kharagpur
Google Summer of Code 2016 and 2017 student under the Julia Language
GitHub: Ayush-iitkgp
Website: https://ayush-iitkgp.github.io
We have the following power balance equations which are non-linear in unknown $x_{i}$ and $x_{j}$.
Depends upon the business needs such as:
using Convex # Read the input data
using FactCheck
using MAT #Pkg.add("MAT")
TOL = 1e-2;
input = matopen("Data.mat")
varnames = names(input)
Data = read(input, "inj","Y");
n=size(Data[2],1); # Create some intermediate variables
Y=Data[2];
inj=Data[1];
W = ComplexVariable(n,n); # W is the matrix of pairwise products of the voltages
objective = real(sum(diag(W))); # The objective is to minimize cost of generation
c1 = Constraint[]; # The constraints are power balance equations
for i=2:n
push!(c1,sum(W[i,:].*(Y[i,:]'))==inj[i]);
end
c2 = W in :SDP;
c3 = real(W[1,1])==1.06^2;
push!(c1, c2);
push!(c1, c3);
p = maximize(objective,c1); # Create the problem
solve!(p); # Solve the problem
p.optval #15.125857662600703
evaluate(objective) #15.1258578588357
---------------------------------------------------------------------------- SCS v1.2.6 - Splitting Conic Solver (c) Brendan O'Donoghue, Stanford University, 2012-2016 ---------------------------------------------------------------------------- Lin-sys: sparse-direct, nnz in A = 1344 eps = 1.00e-04, alpha = 1.80, max_iters = 20000, normalize = 1, scale = 5.00 Variables n = 393, constraints m = 812 Cones: primal zero / dual free vars: 406 sd vars: 406, sd blks: 1 Setup time: 7.29e-02s ---------------------------------------------------------------------------- Iter | pri res | dua res | rel gap | pri obj | dua obj | kap/tau | time (s) ---------------------------------------------------------------------------- 0| inf inf -nan -inf inf inf 1.20e-01 100| 3.92e-02 8.28e-02 6.88e-05 -1.43e+01 -1.43e+01 1.23e-16 2.08e-01 200| 7.31e-03 1.97e-02 1.66e-05 -1.48e+01 -1.48e+01 0.00e+00 2.75e-01 300| 2.71e-03 5.88e-03 5.13e-06 -1.50e+01 -1.50e+01 1.27e-16 3.21e-01 400| 8.98e-04 1.92e-03 1.68e-06 -1.51e+01 -1.51e+01 1.27e-16 3.67e-01 500| 2.88e-04 6.27e-04 5.46e-07 -1.51e+01 -1.51e+01 1.27e-16 4.14e-01 600| 9.25e-05 2.02e-04 1.75e-07 -1.51e+01 -1.51e+01 1.27e-16 4.60e-01 680| 3.73e-05 8.15e-05 7.03e-08 -1.51e+01 -1.51e+01 1.27e-16 4.96e-01 ---------------------------------------------------------------------------- Status: Solved Timing: Solve time: 4.96e-01s Lin-sys: nnz in L factor: 2906, avg solve time: 1.97e-05s Cones: avg projection time: 6.98e-04s ---------------------------------------------------------------------------- Error metrics: dist(s, K) = 2.1500e-09, dist(y, K*) = 2.0328e-09, s'y/|s||y| = 3.5844e-13 |Ax + s - b|_2 / (1 + |b|_2) = 3.7310e-05 |A'y + c|_2 / (1 + |c|_2) = 8.1457e-05 |c'x + b'y| / (1 + |c'x| + |b'y|) = 7.0266e-08 ---------------------------------------------------------------------------- c'x = -15.1259, -b'y = -15.1259 ============================================================================
output = matopen("Res.mat"); # Verify the results
names(output);
outputData = read(output, "Wres");
Wres = outputData;
real_diff = real(W.value) - real(Wres);
imag_diff = imag(W.value) - imag(Wres);
@fact real_diff => roughly(zeros(n,n), TOL);
@fact imag_diff => roughly(zeros(n,n), TOL)
WARNING: The `=>` syntax is deprecated, use `-->` instead
Success :: (line:441) :: fact was true
Expression: imag_diff --> roughly(zeros(n,n),TOL)
Expected: [0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0]
Occurred: [7.21891e-9 1.09908e-5 2.03142e-5 2.4322e-5 2.20655e-5 4.88765e-5 4.56099e-5 4.65576e-5 5.22527e-5 5.33708e-5 5.16477e-5 5.00836e-5 5.00343e-5 5.11381e-5; -1.09704e-5 -2.9351e-8 8.63911e-6 1.36025e-5 1.14299e-5 3.7428e-5 3.48544e-5 3.57447e-5 4.15345e-5 4.28357e-5 4.07829e-5 3.88891e-5 3.89983e-5 4.04856e-5; -2.03103e-5 -8.60839e-6 -7.09979e-8 6.05066e-6 3.72136e-6 2.97453e-5 2.77659e-5 2.8529e-5 3.47725e-5 3.63289e-5 3.3859e-5 3.15844e-5 3.18855e-5 3.38928e-5; -2.43209e-5 -1.35708e-5 -6.00392e-6 -3.13606e-7 -1.88926e-6 2.24612e-5 2.07537e-5 2.16031e-5 2.73258e-5 2.88318e-5 2.64326e-5 2.41747e-5 2.44664e-5 2.63617e-5; -2.20443e-5 -1.14021e-5 -3.72034e-6 2.07534e-6 -1.84344e-7 2.45569e-5 2.2733e-5 2.35753e-5 2.92654e-5 3.07001e-5 2.83942e-5 2.62314e-5 2.64812e-5 2.82721e-5; -4.88785e-5 -3.74309e-5 -2.97522e-5 -2.24708e-5 -2.44784e-5 -3.87313e-7 -9.82969e-7 -3.40895e-7 6.05173e-6 7.85915e-6 4.97049e-6 2.29021e-6 2.84209e-6 5.35518e-6; -4.56128e-5 -3.48578e-5 -2.77738e-5 -2.0657e-5 -2.2739e-5 9.68386e-7 -4.80534e-7 8.06184e-7 6.77224e-6 8.3796e-6 5.60517e-6 3.03697e-6 3.50253e-6 5.87174e-6; -4.65526e-5 -3.57413e-5 -2.85295e-5 -2.16068e-5 -2.35738e-5 3.33978e-7 -6.39029e-7 -1.27845e-7 6.01353e-6 7.704e-6 4.94367e-6 2.40328e-6 2.85565e-6 5.2099e-6; -5.22657e-5 -4.1548e-5 -3.47903e-5 -2.72942e-5 -2.92814e-5 -6.07701e-6 -6.44929e-6 -6.03233e-6 -7.73445e-7 1.95546e-6 -1.16352e-6 -3.87795e-6 -3.33431e-6 -7.19737e-7; -5.33756e-5 -4.28413e-5 -3.63384e-5 -2.88447e-5 -3.07081e-5 -7.87585e-6 -8.39717e-6 -7.71444e-6 -1.56187e-6 -4.75029e-7 -2.84532e-6 -5.68387e-6 -5.12984e-6 -2.56324e-6; -5.16454e-5 -4.07821e-5 -3.38616e-5 -2.64385e-5 -2.83949e-5 -4.84957e-6 -5.61542e-6 -4.94684e-6 1.14314e-6 3.00238e-6 -2.2845e-7 -2.71874e-6 -2.17579e-6 3.97771e-7; -5.00789e-5 -3.88847e-5 -3.15841e-5 -2.41781e-5 -2.62298e-5 -2.20113e-6 -3.04454e-6 -2.40263e-6 3.86015e-6 5.6745e-6 2.71626e-6 -1.22655e-7 5.7586e-7 3.1552e-6; -5.00336e-5 -3.89984e-5 -3.18895e-5 -2.44736e-5 -2.64833e-5 -2.66205e-6 -3.51414e-6 -2.85949e-6 3.31239e-6 5.11613e-6 2.16904e-6 -5.15582e-7 -2.69548e-7 2.61995e-6; -5.11346e-5 -4.04833e-5 -3.38943e-5 -2.6366e-5 -2.82716e-5 -5.36328e-6 -5.88052e-6 -5.21155e-6 8.19018e-7 2.5525e-6 -4.01939e-7 -3.15624e-6 -2.53924e-6 -1.62076e-7]
This example is inspired from a lecture of John Watrous in the course on Theory of Quantum Information.
Fidelity is a measure of the closeness of two quantum states.
The ability to distinguish between the quantum states is equivalent to the ability to distinguish between the classical probability distributions.
If fidelity between two states is 1, they are the same quantum state.
where the trace norm $||.||_{tr}$ is the sum of the singular values, and the maximization goes over the set of all unitary matrices U.
Fidelity can be expressed as the optimal value of the following complex-valued SDP:
$$ \textbf{maximize} \frac{1}{2} trace(Z+Z^*)$$$$\text{subject to } \left[\begin{array}{cc}P&Z\\{Z}^{*}&Q\end{array}\right] \succeq 0$$$$\text{where } Z \in \mathbf {C}^{n \times n}$$n = 20 # Create the data
P = randn(n,n) + im*randn(n,n);
P = P*P';
Q = randn(n,n) + im*randn(n,n);
Q = Q*Q';
Z = ComplexVariable(n,n); # Declare convex variable
objective = 0.5*real(trace(Z+Z')); # Specify the objective
constraint = [P Z;Z' Q] ⪰ 0;
problem = maximize(objective,constraint);
solve!(problem) # Solve the problem
---------------------------------------------------------------------------- SCS v1.2.6 - Splitting Conic Solver (c) Brendan O'Donoghue, Stanford University, 2012-2016 ---------------------------------------------------------------------------- Lin-sys: sparse-direct, nnz in A = 1621 eps = 1.00e-04, alpha = 1.80, max_iters = 20000, normalize = 1, scale = 5.00 Variables n = 801, constraints m = 6401 Cones: primal zero / dual free vars: 3161 sd vars: 3240, sd blks: 1 Setup time: 9.62e-04s ---------------------------------------------------------------------------- Iter | pri res | dua res | rel gap | pri obj | dua obj | kap/tau | time (s) ---------------------------------------------------------------------------- 0| inf inf -nan -inf -inf inf 3.30e-02 100| 9.40e-04 2.11e-01 1.71e-02 -6.10e+02 -5.90e+02 0.00e+00 1.89e-01 200| 2.15e-04 4.93e-02 3.08e-03 -6.18e+02 -6.14e+02 0.00e+00 3.62e-01 300| 7.74e-05 1.72e-02 7.98e-04 -6.18e+02 -6.17e+02 0.00e+00 5.49e-01 400| 3.23e-05 7.04e-03 2.58e-04 -6.18e+02 -6.18e+02 0.00e+00 7.24e-01 500| 1.40e-05 3.12e-03 9.69e-05 -6.18e+02 -6.18e+02 0.00e+00 8.96e-01 600| 6.35e-06 1.44e-03 3.98e-05 -6.18e+02 -6.18e+02 0.00e+00 1.07e+00 700| 2.97e-06 6.86e-04 1.72e-05 -6.18e+02 -6.18e+02 0.00e+00 1.24e+00 800| 1.43e-06 3.31e-04 7.72e-06 -6.18e+02 -6.18e+02 0.00e+00 1.41e+00 900| 6.95e-07 1.62e-04 3.54e-06 -6.18e+02 -6.18e+02 0.00e+00 1.58e+00 980| 3.94e-07 9.16e-05 1.92e-06 -6.18e+02 -6.18e+02 0.00e+00 1.72e+00 ---------------------------------------------------------------------------- Status: Solved Timing: Solve time: 1.72e+00s Lin-sys: nnz in L factor: 8823, avg solve time: 5.46e-05s Cones: avg projection time: 1.63e-03s ---------------------------------------------------------------------------- Error metrics: dist(s, K) = 3.8219e-09, dist(y, K*) = 1.0983e-09, s'y/|s||y| = -7.2118e-12 |Ax + s - b|_2 / (1 + |b|_2) = 3.9389e-07 |A'y + c|_2 / (1 + |c|_2) = 9.1596e-05 |c'x + b'y| / (1 + |c'x| + |b'y|) = 1.9185e-06 ---------------------------------------------------------------------------- c'x = -618.1931, -b'y = -618.1908 ============================================================================
# Verify that computer fidelity is equal to actual fidelity
computed_fidelity = evaluate(objective)
P1,P2 = eig(P);
sqP = P2 * diagm([p1^0.5 for p1 in P1]) * P2'
Q1,Q2 = eig(Q)
sqQ = Q2 * diagm([q1^0.5 for q1 in Q1]) * Q2'
actual_fidelity = sum(svd(sqP * sqQ)[2])
diff = computed_fidelity - actual_fidelity
@fact diff => roughly(0, TOL)
Success :: (line:441) :: fact was true
Expression: diff --> roughly(0,TOL)
Expected: 0
Occurred: -2.0267065679036023e-5