feat: add numeric and symbolic scripts
This commit is contained in:
parent
6ea7900b55
commit
e80b7c3582
38 changed files with 3314 additions and 0 deletions
84
scripts/optimize_cluster_witness.py
Normal file
84
scripts/optimize_cluster_witness.py
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
"""optimize_cluster_witness.py --
|
||||
(1) optimize the individual cluster map ||M_AB||_* over different biseparable cut types,
|
||||
showing that its universal ceiling (5.0) is reached not just by the "home" cut AB|CD
|
||||
but also by a state biseparable across the UNRELATED cut AC|BD (Bell_AC x Bell_BD);
|
||||
(2) optimize min(||M_AB||_*, ||M_AC||_*, ||M_AD||_*) over 1|3-biseparable pure states,
|
||||
finding a naive ceiling of 7/3 -- later shown (via mixture_search.py) to be beatable
|
||||
by proper MIXTURES, since min() is not convex.
|
||||
"""
|
||||
import numpy as np
|
||||
from scipy.optimize import minimize
|
||||
from core import state_1_3, state_2_2
|
||||
from core2 import full_tensor
|
||||
from cluster import cluster_map, nuc
|
||||
|
||||
|
||||
def triple(psi):
|
||||
C = full_tensor(psi)
|
||||
return nuc(cluster_map(C, 0, 1)), nuc(cluster_map(C, 0, 2)), nuc(cluster_map(C, 0, 3))
|
||||
|
||||
|
||||
# --- witness ||M_AB||_* over various biseparable cut types ---
|
||||
def obj_A_BCD(params):
|
||||
psi = state_1_3(params, 0)
|
||||
C = full_tensor(psi)
|
||||
return -nuc(cluster_map(C, 0, 1))
|
||||
|
||||
|
||||
def obj_C_ABD(params):
|
||||
psi = state_1_3(params, 2)
|
||||
C = full_tensor(psi)
|
||||
return -nuc(cluster_map(C, 0, 1))
|
||||
|
||||
|
||||
def obj_AC_BD(params):
|
||||
psi = state_2_2(params, (0, 2), (1, 3))
|
||||
C = full_tensor(psi)
|
||||
return -nuc(cluster_map(C, 0, 1))
|
||||
|
||||
|
||||
def obj_AB_CD(params):
|
||||
psi = state_2_2(params, (0, 1), (2, 3))
|
||||
C = full_tensor(psi)
|
||||
return -nuc(cluster_map(C, 0, 1))
|
||||
|
||||
|
||||
# --- min(M_AB,M_AC,M_AD) over 1|3-biseparable pure states ---
|
||||
def neg_min_A_BCD(params):
|
||||
psi = state_1_3(params, 0)
|
||||
return -min(triple(psi))
|
||||
|
||||
|
||||
def neg_min_B_ACD(params):
|
||||
psi = state_1_3(params, 1)
|
||||
return -min(triple(psi))
|
||||
|
||||
|
||||
def run(obj, nparams, args, n_restarts, seed0, label, maxiter=2500):
|
||||
best = -np.inf
|
||||
bx = None
|
||||
for i in range(n_restarts):
|
||||
rng = np.random.default_rng(seed0 + i)
|
||||
x0 = rng.normal(size=nparams)
|
||||
res = minimize(obj, x0, args=args, method='Powell',
|
||||
options={'maxiter': maxiter, 'xtol': 1e-9, 'ftol': 1e-11})
|
||||
v = -res.fun
|
||||
if v > best:
|
||||
best = v
|
||||
bx = res.x
|
||||
print(f'{label}: best value = {best:.8f} ({n_restarts} restarts)')
|
||||
return best, bx
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
print("=== ||M_AB||_* over various biseparable cut types (universal ceiling = 5) ===")
|
||||
run(obj_A_BCD, 18, (), 8, 10, "biseparable A|BCD")
|
||||
run(obj_C_ABD, 18, (), 8, 20, "biseparable C|ABD")
|
||||
run(obj_AC_BD, 16, (), 8, 30, "biseparable AC|BD <-- reaches 5 (Bell_AC x Bell_BD)")
|
||||
run(obj_AB_CD, 16, (), 6, 40, "biseparable AB|CD (home cut, sanity <= 1)")
|
||||
|
||||
print()
|
||||
print("=== min(M_AB,M_AC,M_AD) over 1|3-biseparable states (naive ceiling = 7/3) ===")
|
||||
run(neg_min_A_BCD, 18, (), 10, 300, "max over biseparable A|BCD")
|
||||
run(neg_min_B_ACD, 18, (), 10, 400, "max over biseparable B|ACD")
|
||||
print("For comparison: GHZ4 / connected graph states also give min = 7/3 =", 7 / 3)
|
||||
Loading…
Add table
Add a link
Reference in a new issue