#!/usr/bin/env python3 """ Quick optimization of 7-vertex ideal polyhedron. """ import numpy as np import torch from ideal_poly_volume_toolkit.geometry import ( delaunay_triangulation_indices, triangle_volume_from_points_torch, ) from scipy.optimize import differential_evolution def compute_volume(params): """Compute volume from spherical parameters.""" # Fixed vertices Z = [complex(0, 0), complex(1, 0)] # Add 4 parameterized vertices for i in range(4): theta = params[2*i] phi = params[2*i + 1] z = np.tan(theta/2) * np.exp(1j * phi) Z.append(z) Z_np = np.array(Z, dtype=np.complex128) try: idx = delaunay_triangulation_indices(Z_np) Z_torch = torch.tensor(Z_np, dtype=torch.complex128) total = 0 for (i, j, k) in idx: vol = triangle_volume_from_points_torch(Z_torch[i], Z_torch[j], Z_torch[k], series_terms=96) total += vol.item() return -total # Negative for minimization except: return 1000.0 # Penalty # Run quick optimization print("Quick 7-vertex optimization (5 trials)...") best_volume = 0 best_config = None for trial in range(5): print(f"\nTrial {trial+1}/5...") bounds = [(0.1, np.pi-0.1), (0, 2*np.pi)] * 4 result = differential_evolution( compute_volume, bounds, maxiter=100, # Reduced iterations popsize=15, # Smaller population seed=trial * 42 ) volume = -result.fun print(f" Volume: {volume:.6f}") if volume > best_volume: best_volume = volume best_config = result.x # Analyze best configuration print(f"\nBest volume: {best_volume:.6f}") # Reconstruct for analysis Z = [complex(0, 0), complex(1, 0)] for i in range(4): theta = best_config[2*i] phi = best_config[2*i + 1] z = np.tan(theta/2) * np.exp(1j * phi) Z.append(z) Z_np = np.array(Z, dtype=np.complex128) idx = delaunay_triangulation_indices(Z_np) # Count faces and vertices vertices_used = set() for (i, j, k) in idx: vertices_used.update([i, j, k]) print(f"\nCombinatorial structure:") print(f" Vertices used: {len(vertices_used)}") print(f" Triangular faces: {len(idx)}") # Check vertex degrees degrees = [0] * 7 for (i, j, k) in idx: degrees[i] += 1 degrees[j] += 1 degrees[k] += 1 print(f" Face counts per vertex: {degrees}") # Classification if len(vertices_used) == 6 and len(idx) == 8: print(" → Looks like an octahedron") elif len(vertices_used) == 7 and len(idx) == 10: print(" → Looks like a pentagonal bipyramid") elif len(vertices_used) == 7: print(f" → 7-vertex polyhedron with {len(idx)} faces") print(f"\nRegular octahedron volume: ≈ 5.333") print(f"Ratio: {best_volume/5.333:.3f}")