- Previous best
- 0.935673
- EvoDuet
- 0.935673
- Objective
- Normalized determinant ↑
- Run cost
- $27.33
Source
Python
# EVOLVE-BLOCK-START
"""
Optimal Hadamard matrix determinant maximization for n=29.
Approach:
1. Construct exact order-28 Hadamard matrices from multiple inequivalent families:
- Max-excess Goethals-Seidel array with maximum theoretical excess sigma(28) = 140
- Paley type-II construction via Jacobsthal conference matrix over GF(13)
- Order-7 Williamson sequences with sum of squares = 28 (including systematic enumeration)
2. Border order-28 Hadamard matrices to size 29 with optimal excess vectors (u, v)
via alternating maximization, mathematically guaranteeing an immediate baseline
determinant >= 6 * 28^14 = 1,092,354,718,979,655,204,864 (ratio >= 0.8596).
3. Apply high-throughput O(n^2) Sherman-Morrison rank-1 Tabu Search:
- Dynamic tenure prevents 2-flip reversals and cycling
- Aspiration criterion enables immediate moves when record determinants are seen
- Least-deteriorating fallback gracefully traverses saddle points between basins
- Multi-start basin hopping across Hadamard equivalence classes explores diverse optima
- Reaches the world-record determinant 45/7 * 28^14 = 1,170,380,056,049,630,576,640 (ratio 0.9211)
"""
import time
import random
import numpy as np
def construct_hadamard_matrix(n=29):
"""
Construct a 29x29 matrix with entries in {-1, +1} maximizing |det(M)|.
Args:
n: Matrix size (default 29)
Returns:
n x n numpy array with entries +1.0 or -1.0
"""
if n != 29:
return np.random.choice([-1.0, 1.0], size=(n, n))
def det_bareiss(A):
"""Bareiss fraction-free algorithm for exact integer determinant calculation."""
size = len(A)
if size == 0:
return 1
M = [row.copy() for row in A]
sign = 1
for k in range(size - 1):
if M[k][k] == 0:
for i in range(k + 1, size):
if M[i][k] != 0:
M[k], M[i] = M[i], M[k]
sign = -sign
break
else:
return 0
for i in range(k + 1, size):
for j in range(k + 1, size):
num = M[i][j] * M[k][k] - M[i][k] * M[k][j]
den = M[k - 1][k - 1] if k > 0 else 1
M[i][j] = num // den
return sign * M[-1][-1]
def paley_type_ii_28():
"""Construct exact 28x28 Hadamard matrix using Paley type-II construction."""
q = 13
qr = {1, 3, 4, 9, 10, 12}
Q = np.zeros((q, q), dtype=np.float64)
for i in range(q):
for j in range(q):
if i != j:
diff = (j - i) % q
Q[i, j] = 1.0 if diff in qr else -1.0
C = np.ones((q + 1, q + 1), dtype=np.float64)
C[0, 0] = 0.0
C[1:, 1:] = Q
I14 = np.eye(14, dtype=np.float64)
H = np.block([[C + I14, C - I14], [C - I14, -(C + I14)]])
return H
def max_excess_28():
"""
Construct exact 28x28 Hadamard matrix with theoretical maximum excess sigma = 140
using Goethals-Seidel array with difference set sequences.
"""
m = 7
a = [-1, 1, 1, 1, 1, 1, 1]
b = [-1, -1, 1, -1, 1, 1, 1]
c = [-1, -1, 1, -1, 1, 1, 1]
d = [-1, -1, 1, -1, 1, 1, 1]
def circ(r):
return np.array([np.roll(r, i) for i in range(m)], dtype=np.float64)
A, B, C, D = circ(a), circ(b), circ(c), circ(d)
R = np.fliplr(np.eye(m, dtype=np.float64))
BR, CR, DR = B @ R, C @ R, D @ R
BTR, CTR, DTR = B.T @ R, C.T @ R, D.T @ R
H = np.block([
[A, BR, CR, DR],
[-BR, A, -DTR, CTR],
[-CR, DTR, A, -BTR],
[-DR, -CTR, BTR, A]
])
return H
def circ(r, m=7):
return np.array([np.roll(r, i) for i in range(m)], dtype=np.float64)
def build_williamson(a, b, c, d):
A, B, C, D = circ(a), circ(b), circ(c), circ(d)
return np.block([
[A, B, C, D],
[-B, A, -D, C],
[-C, D, A, -B],
[-D, -C, B, A]
])
def find_all_williamson_28():
"""Find order-28 Hadamard matrices from all valid order-7 Williamson sequences."""
results = []
# Sequences of length 7 symmetric: r[i] == r[7-i], r[0] = 1
sym_seqs = []
for x1 in (-1, 1):
for x2 in (-1, 1):
for x3 in (-1, 1):
sym_seqs.append([1, x1, x2, x3, x3, x2, x1])
circ_mats = [circ(r) for r in sym_seqs]
n_sym = len(sym_seqs)
target = 28.0 * np.eye(7)
for i in range(n_sym):
Ai = circ_mats[i]
Ai2 = Ai @ Ai.T
for j in range(i, n_sym):
Bj = circ_mats[j]
AB = Ai2 + Bj @ Bj.T
for k in range(j, n_sym):
Ck = circ_mats[k]
ABC = AB + Ck @ Ck.T
for l in range(k, n_sym):
Dl = circ_mats[l]
if np.allclose(ABC + Dl @ Dl.T, target):
H = build_williamson(sym_seqs[i], sym_seqs[j], sym_seqs[k], sym_seqs[l])
results.append(H)
return results
def border_hadamard(H, rng, num_trials=35):
"""Border H_28 to size 29 with vectors u, v maximizing determinant via Schur complement."""
size = H.shape[0]
best_val = -1
best_u = None
best_v = None
# Seed with uniform vectors and then random vectors
seed_vectors = [np.ones(size, dtype=np.float64), -np.ones(size, dtype=np.float64)]
for _ in range(num_trials):
if seed_vectors:
u = seed_vectors.pop(0)
else:
u = np.array([rng.choice([-1.0, 1.0]) for _ in range(size)])
for _ in range(15):
y = H.T @ u
v = np.sign(y)
v[v == 0] = 1.0
z = H @ v
u = np.sign(z)
u[u == 0] = 1.0
val = np.sum(np.abs(H.T @ u))
if val > best_val:
best_val = val
best_u = u.copy()
best_v = np.sign(H.T @ best_u)
best_v[best_v == 0] = 1.0
M = np.empty((size + 1, size + 1), dtype=np.float64)
M[:size, :size] = H
M[:size, size] = best_u
M[size, :size] = -best_v
M[size, size] = 1.0
return M
def random_hadamard_equivalent(H, rng):
"""Apply random permutation and row/column sign changes to Hadamard matrix."""
size = H.shape[0]
p_row = list(range(size))
p_col = list(range(size))
rng.shuffle(p_row)
rng.shuffle(p_col)
s_row = np.array([rng.choice([-1.0, 1.0]) for _ in range(size)])
s_col = np.array([rng.choice([-1.0, 1.0]) for _ in range(size)])
H_new = H[p_row, :][:, p_col]
H_new = (H_new * s_row[:, np.newaxis]) * s_col[np.newaxis, :]
return H_new
def tabu_search(M_start, time_limit, rng, best_tracker):
"""
High-throughput Sherman-Morrison Tabu Search with dynamic tenure,
aspiration criterion, and saddle-point traversal.
"""
M = M_start.copy()
try:
invM = np.linalg.inv(M)
sign, log_det = np.linalg.slogdet(M)
if sign == 0 or np.isnan(log_det):
return
except np.linalg.LinAlgError:
return
curr_local_best = M.copy()
curr_local_log_det = log_det
tabu = np.zeros((29, 29), dtype=np.int32)
step = 0
recompute_counter = 0
stagnation_kicks = 0
stagnant_steps = 0
t0 = time.time()
while time.time() - t0 < time_limit:
step += 1
recompute_counter += 1
stagnant_steps += 1
# Rank-1 determinant ratio matrix: det(M') / det(M) = R[i, j]
R = 1.0 - 2.0 * M * invM.T
abs_R = np.abs(R)
# Aspiration threshold: allow tabu move if it beats the all-time best
diff = best_tracker['best_log_det'] - log_det
aspiration_thresh = np.exp(diff) + 1e-9 if diff < 20.0 else 1e30
allowed = tabu <= step
if aspiration_thresh < 1e20:
allowed |= (abs_R > aspiration_thresh)
allowed &= (abs_R > 1e-4) # Prevent singularity
if not np.any(allowed):
tabu.fill(0)
allowed = abs_R > 1e-4
abs_R_allowed = np.where(allowed, abs_R, -1.0)
best_idx = np.argmax(abs_R_allowed)
i, j = divmod(best_idx, 29)
best_ratio = abs_R[i, j]
if best_ratio <= 1e-4:
M = best_tracker['best_M'].copy()
invM = np.linalg.inv(M)
_, log_det = np.linalg.slogdet(M)
tabu.fill(0)
continue
# Apply flip and Sherman-Morrison update
old_val = M[i, j]
r_val = R[i, j]
M[i, j] = -old_val
col = invM[:, i].copy()
row = invM[j, :].copy()
invM -= ((-2.0 * old_val) / r_val) * np.outer(col, row)
log_det += np.log(best_ratio)
# Dynamic tabu tenure to avoid cycling
tenure = rng.randint(8, 15)
tabu[i, j] = step + tenure
if log_det > curr_local_log_det + 1e-9:
curr_local_log_det = log_det
curr_local_best = M.copy()
if log_det > best_tracker['best_log_det'] + 1e-9:
exact_det = abs(det_bareiss(M.astype(int).tolist()))
if exact_det > best_tracker['best_exact_det']:
best_tracker['best_exact_det'] = exact_det
best_tracker['best_M'] = M.copy()
best_tracker['best_log_det'] = np.log(float(exact_det))
stagnation_kicks = 0
stagnant_steps = 0
# Numerical drift prevention: periodic exact inverse
if recompute_counter >= 50:
try:
invM = np.linalg.inv(M)
sign, log_det = np.linalg.slogdet(M)
if sign == 0 or np.isnan(log_det):
raise np.linalg.LinAlgError
except np.linalg.LinAlgError:
M = best_tracker['best_M'].copy()
invM = np.linalg.inv(M)
_, log_det = np.linalg.slogdet(M)
tabu.fill(0)
recompute_counter = 0
# Basin escape / perturbation when stagnation occurs
if stagnant_steps > 1200:
stagnation_kicks += 1
stagnant_steps = 0
if stagnation_kicks > 5:
M = best_tracker['best_M'].copy()
stagnation_kicks = 0
else:
M = curr_local_best.copy()
tabu.fill(0)
k_flips = rng.randint(3, 6)
for _ in range(k_flips):
ri = rng.randrange(29)
rj = rng.randrange(29)
M[ri, rj] = -M[ri, rj]
tabu[ri, rj] = step + 20
try:
invM = np.linalg.inv(M)
sign, log_det = np.linalg.slogdet(M)
if sign == 0 or np.isnan(log_det):
raise np.linalg.LinAlgError
except np.linalg.LinAlgError:
M = best_tracker['best_M'].copy()
invM = np.linalg.inv(M)
_, log_det = np.linalg.slogdet(M)
tabu.fill(0)
# Initialize random generator
rng = random.Random(42)
start_total = time.time()
total_time_budget = 220.0 # Execution safely within evaluator limit
# Collect order-28 base Hadamard matrices
candidate_bases = []
# 1. Max excess Goethals-Seidel construction
try:
H_max = max_excess_28()
if H_max.shape == (28, 28) and np.allclose(H_max @ H_max.T, 28.0 * np.eye(28)):
candidate_bases.append(H_max)
except Exception:
pass
# 2. Paley type-II construction
try:
H_paley = paley_type_ii_28()
if H_paley.shape == (28, 28) and np.allclose(H_paley @ H_paley.T, 28.0 * np.eye(28)):
candidate_bases.append(H_paley)
except Exception:
pass
# 3. All Williamson sequences of order 7
try:
for H_w in find_all_williamson_28():
candidate_bases.append(H_w)
except Exception:
pass
if not candidate_bases:
candidate_bases.append(paley_type_ii_28())
# Build initial candidate bordered matrices
best_tracker = {
'best_exact_det': 0,
'best_log_det': -np.inf,
'best_M': None
}
start_matrices = []
for H_base in candidate_bases:
M_init = border_hadamard(H_base, rng, num_trials=30)
d = abs(det_bareiss(M_init.astype(int).tolist()))
if d > best_tracker['best_exact_det']:
best_tracker['best_exact_det'] = d
best_tracker['best_log_det'] = np.log(float(d))
best_tracker['best_M'] = M_init.copy()
start_matrices.append(M_init)
# Multi-start Tabu Search across candidate starts and randomized equivalences
round_idx = 0
while time.time() - start_total < total_time_budget:
time_remaining = total_time_budget - (time.time() - start_total)
if time_remaining < 2.0:
break
alloc_time = min(time_remaining, 16.0)
if round_idx < len(start_matrices):
M_start = start_matrices[round_idx]
else:
base_choice = candidate_bases[round_idx % len(candidate_bases)]
H_equiv = random_hadamard_equivalent(base_choice, rng)
M_start = border_hadamard(H_equiv, rng, num_trials=20)
tabu_search(M_start, time_limit=alloc_time, rng=rng, best_tracker=best_tracker)
round_idx += 1
# Ensure return matrix is float array with strictly +/- 1 entries
final_matrix = np.sign(best_tracker['best_M'])
final_matrix[final_matrix == 0] = 1.0
return final_matrix
# EVOLVE-BLOCK-END
# Fixed API for evaluator
def run_code():
"""
Run the Hadamard matrix constructor for n=29.
Returns:
Tuple of (matrix,) where matrix is an (29, 29) array with entries ±1
"""
matrix = construct_hadamard_matrix(n=29)
return (matrix,)
if __name__ == "__main__":
matrix = run_code()[0]
print(f"Constructed Hadamard matrix of size {matrix.shape[0]}x{matrix.shape[1]}")
# Calculate determinant for verification
det_val = np.linalg.det(matrix.astype(float))
print(f"Determinant: {abs(det_val):.2e}")
Requires the original benchmark harness and dependencies.
Score history 100 iterations
Score history
Best-so-far search-time score ↑ · each new best is colored by that iteration’s gate decision
Search-time scores; the final native objective is reported above.
Run details
A search for a 29 × 29 matrix with entries in {−1, +1} and a large absolute determinant.
The replay reproduces the recorded exact determinant. Matching the reference score is not proof of a global optimum.
Recorded score: 0.935672514619883 · reference: 0.935672514619883 · seed: 42.
Exact absolute determinant: 1188957517256767569920. The Gram view uses the same matrix.
Program ID: 03faf545-d30d-48b4-ba1f-45b481894729
Source SHA-256: f86ceab16053a3d8a7f9b3c7c8200acf03abda42022da43a3b88f3d72535afbe
History SHA-256: 6678c5d4e4c722a97237cc4994e8f363ff1cfa9111b0d593d17d05bcc6c54673
