SchattenNorms.jl
Simple implementation of Schatten norms. This package includes the complete bounded versions of the induced norms for linear transformations of matrices (i.e., superoperators), implemented as described in
Semidefinite programs for completely bounded norms, John Watrous, Theory of Computing, Volume 5 (2009), pp. 217–238. (preprint)
Simpler semidefinite programs for completely bounded norms, John Watrous, Chicago Journal of Theoretical Computer Science Volume 8 (2013), p. 119. (preprint)
This package only supports the completely bounded norms for p=1 and p=∞ (which are dual). It is not clear if there is an efficient way to compute the completely bounded norms for other p.
Norms implemented
Taking σᵢ(M) to be the ith singular value of a matrix M, we have
Function name  Mathematical meaning 

snorm(M, r) 
‖X‖ᵣ = ∑ᵢ (σᵢ(M))ʳ 
cbnorm(M, r) 
supᵢ {‖M⊗1ᵢ(X)‖ᵣ : ‖X‖ᵣ=1} 
Some useful aliases and relatd calls are
Alias function  Equivalent call  Common name 

trnorm(M) 
snorm(M,1) 
trace norm 
nucnorm(M) 
snorm(M,1) 
nuclear norm 
fnorm(M) 
snorm(M,2), snorm(M) 
Frobenius norm (default for snorm ) 
specnorm(M) 
snorm(M,Inf) 
spectral norm. 
cbnorm(M) 
cbnorm(M,Inf) 
completely bounded norm usually refers to p=∞, so this is the default 
dnorm(M) 
cbnorm(M,1) 
diamond norm 
For the special case where M
is the difference between CPTP maps, or
the difference between superoperators corresponding to unitary maps,
use ddist
described below.
Utility functions
Function name  Common name  Mathematical meaning 

worstfidelity(u, v) 
Worst case output state (Jozsa) fidelity  min {❘⟨ψ ❘ v⁺ u ❘ψ⟩❘² : ❘⟨ψ❘ψ⟩❘² = 1} 
ddistu(U,V) 
Diamond norm distance between unitary maps  dnorm(liou(U)liou(V)) 
ddist(E,F) 
Diamond norm distance between CPTP maps  dnorm(EF) 
Despite the mathematical equivalences between ddist
/ddistu
and dnorm
,
ddist
/ddistu
are much faster and more accurate.
Usage
julia> snorm([1 0; 0 1])
1.4142135623730951
julia> snorm([1 0; 0 1],1.0)
2.0
julia> snorm([1 0; 0 1],Inf)
1.0
julia> U,_,_ = svd(randn(2,2)); V,_,_ = svd(randn(2,2)); # unitary invariance
julia> isapprox(snorm([1 0; 0 1]),snorm(U*[1 0; 0 1]*V))
true
julia> isapprox(snorm([1 0; 0 1],1.0),snorm(U*[1 0; 0 1]*V,1.0))
true
julia> isapprox(snorm([1 0; 0 1],Inf),snorm(U*[1 0; 0 1]*V,Inf))
true
julia> R = randn(3,3); snorm(R,1) >= snorm(R,2) >= snorm(R,Inf)
true
julia> p = sort(abs(randn(3))+1.0); snorm(R,p[1]) >= snorm(R,p[2]) >= snorm(R,p[3])
true
julia> snorm(R,1.0) == snorm(R,1) == trnorm(R) == nucnorm(R)
true
Dependencies
SCS.jl and Convex.jl, for the completely bounded norms.
TODO

The implementation of the completely bounded 1 and ∞ norms is somewhat tailored to transformations between isomorphic spaces. It should be easy to make it more general.

The distance between two quantum channels (i.e., trace preserving, completely positive linear maps of operators) is "easier" to compute than the completely bounded 1 norm (the diamond norm). Adding a function just for that would be nice.

The diamond norm distance between two unitary maps is also much easier to compute  see, e.g., Lecture 20 for John Watrous's 2011 Quantum Information course  so a customized function would be nice.
License
Apache Lincense 2.0 (summary)
Copyright
Raytheon BBN Technologies 2015
Authors
Marcus P da Silva (@marcusps)