Updated August 4 2021

The entire routine is called by the 
function GaussNewton(Gamma,gamma,Klist,Zlist,opt) in folder Solver.
See the script 
               Example.m
that currently solves Instance 1 using: load('instance_ebBB84.mat') 
There are SIX instances in this script to choose from.

GaussNewton.m  solves the problem:
(QKD)     min    f(rho) = D( G(rho)||Z(G(rho)) )  (quantum relative entropy)
          s.t.   Gamma(rho) = gamma               (affine constraint)
                 rho >= 0                         (rho positive semidefinite)
using a projected Gauss-Newton method applied to the SDP.


Input:   Gamma : a cell array; each cell is a constraint data matrix
         gamma : RHS vector for Gamma(rho) = gamma
         Klist : cell array for kraus operator in G(rho) = sum_{j=1}^\ell K_j rho K_j^*
         Zlist : cell array for  Z(rho) = sum_{j=1}^N Z_j rho Z_j
         opt   : options for the solver
	         opt.rhoA : reduced density operator (a matrix)
                 opt.iterbnd : max number of iterations (an integer)
                 opt.verbose : output log levels for command window (an integer), defualt: 1
                                 (0,1,2) = (no output, minimal output, all output)
	         opt.tolerGN : tolerance for Gauss-Newton solver, default: 1e-9 
                 opt.tol_licols : tolerance for sorting out lin.indep contraints, default: 1e-9
	         opt.tolerFR : tolerance for the facial reduction algorithm, default: 1e-12
Output:  ubd : best upper bound
         lbd : best lower bound
         Out : various outputs containing primal variable rho, dual variables y and Z, optimal value, etc.


The six instances given are:
1. instance_ebBB84.mat  (there is no reduced density operator rhoA for this instance)
2. instance_pmBB84.mat
3. instance_mdiBB84.mat
4. instance_TFQKD.mat   (there is no reduced density operator rhoA for this instance)
5. instance_DMCV.mat
6. instance_dprBB84.mat
