tools/entanglement.py
Perp
Return the orthogonal projector onto the complement of a basis span.
Given a list/array of vectors
py
def Perp(basis: 'pt.Tensor | list') -> pt.TensorImplementation
python
def Perp(basis: 'pt.Tensor | list') -> pt.Tensor:
if not isinstance(basis, pt.Tensor):
basis = pt.as_tensor(np.asarray(basis))
projector = sum(pt.stack([pt.outer(basis[i], basis[i].conj()) for i in range(len(basis))]))
return pt.eye(len(basis[0])) - projectorLoss
Quadratic form
Computes
NOTE
for np.ndarray, .H may not exist; callers typically pass an np.matrix.
py
def Loss(F: pt.Tensor, projector: pt.Tensor) -> pt.TensorImplementation
python
def Loss(F: pt.Tensor, projector: pt.Tensor) -> pt.Tensor:
prod = F.H.dot(projector).dot(F)
return prod.realrank
Multi-start minimization over a rank-parameterized family.
Runs scipy.optimize.minimize from several random initial points and returns the smallest objective value found.
py
def rank(f: object, D: int, r: int) -> floatImplementation
python
def rank(f: object, D: int, r: int, **kwargs: object) -> float:
kwargs_any = dict(kwargs)
if 'method' not in kwargs_any:
kwargs_any['method'] = 'Powell'
if 'tol' not in kwargs_any:
kwargs_any['tol'] = ROUNDOFF_TOL
tries = int(kwargs_any.get('tries', 1))
rmax = float(kwargs_any.get('r_max', 2 ** 7))
size = int((2 * D + 1) * (r - 1))
if 'tries' in kwargs_any:
del kwargs_any['tries']
minimas = pt.ones(tries)
for i in range(tries):
try:
minimas[i] = minimize(f, x0=np.random.uniform(-rmax, rmax, size), **kwargs_any).fun
except Exception:
pass
return float(pt.min(minimas).item())