#!/usr/bin/env python3 """ Test the self-contained volume_threshold module. """ import numpy as np from ideal_poly_volume_toolkit.volume_threshold import ( volume_exceeds_threshold, get_volume, compute_volume ) def test_basic_tetrahedron(): """Test with basic tetrahedron: 0, 1, i, ∞""" print("=" * 70) print("Test 1: Basic tetrahedron (0, 1, i, ∞)") print("=" * 70) vertices = [0+0j, 1+0j, 1j, np.inf] volume = get_volume(vertices) print(f"Vertices: {vertices}") print(f"Volume: {volume:.8f}") # Test threshold comparisons thresholds = [0.5, 1.0, 1.5, 2.0] for threshold in thresholds: result = volume_exceeds_threshold(vertices, threshold) print(f" Volume > {threshold}? {result}") print() def test_seven_vertex_config(): """Test with 7-vertex configuration (4 random + 0, 1, i)""" print("=" * 70) print("Test 2: Seven-vertex polyhedron (0, 1, i, ∞ + 3 random)") print("=" * 70) # Use a known configuration from the examples np.random.seed(42) random_vertices = [ 0.5 + 0.5j, -0.3 + 0.7j, 0.8 - 0.2j ] vertices = [0+0j, 1+0j, 1j, np.inf] + random_vertices volume = get_volume(vertices) print(f"Fixed vertices: 0, 1, i, ∞") print(f"Random vertices: {random_vertices}") print(f"Total vertices: {len(vertices)}") print(f"Volume: {volume:.8f}") # Test threshold comparisons thresholds = [2.0, 3.0, 4.0, 5.0] for threshold in thresholds: result = volume_exceeds_threshold(vertices, threshold) print(f" Volume > {threshold}? {result}") print() def test_optimized_config(): """Test with a known optimized configuration""" print("=" * 70) print("Test 3: Optimized configuration from previous runs") print("=" * 70) # This is an example - replace with actual optimized values if available # Format: real parts, imaginary parts for the 4 free vertices # (0, 1, i are fixed, infinity is implicit) real_parts = [0.234, -0.456, 0.789, -0.123] imag_parts = [0.567, 0.890, -0.234, 0.456] free_vertices = [complex(r, i) for r, i in zip(real_parts, imag_parts)] vertices = [0+0j, 1+0j, 1j, np.inf] + free_vertices volume = get_volume(vertices) print(f"Free vertices (4):") for i, v in enumerate(free_vertices, 1): print(f" v{i}: {v:.4f}") print(f"Total vertices: {len(vertices)}") print(f"Volume: {volume:.8f}") # Test threshold comparisons thresholds = [3.0, 4.0, 5.0, 6.0] for threshold in thresholds: result = volume_exceeds_threshold(vertices, threshold) print(f" Volume > {threshold}? {result}") print() def test_method_comparison(): """Compare hull vs Delaunay methods""" print("=" * 70) print("Test 4: Method comparison (hull vs Delaunay)") print("=" * 70) vertices = [0+0j, 1+0j, 1j, np.inf, 0.5+0.5j] vol_hull = compute_volume(vertices, method="hull") vol_delaunay = compute_volume(vertices, method="delaunay") vol_auto = compute_volume(vertices, method="auto") print(f"Vertices: {vertices}") print(f"Volume (hull method): {vol_hull:.8f}") print(f"Volume (Delaunay method): {vol_delaunay:.8f}") print(f"Volume (auto method): {vol_auto:.8f}") print(f"Difference (hull-Delaunay): {abs(vol_hull - vol_delaunay):.2e}") print() def test_performance(): """Test performance with larger vertex sets""" print("=" * 70) print("Test 5: Performance test") print("=" * 70) import time for n_random in [5, 10, 15, 20]: np.random.seed(42) # Generate random vertices in unit disk random_vertices = [] for _ in range(n_random): r = np.random.uniform(0, 0.9) theta = np.random.uniform(0, 2*np.pi) random_vertices.append(r * np.exp(1j * theta)) vertices = [0+0j, 1+0j, 1j, np.inf] + random_vertices start = time.time() volume = get_volume(vertices) elapsed = time.time() - start print(f" {len(vertices)} vertices: volume = {volume:.6f}, time = {elapsed*1000:.2f} ms") print() def main(): """Run all tests""" print("\n" + "=" * 70) print("VOLUME THRESHOLD MODULE TEST SUITE") print("=" * 70) print() test_basic_tetrahedron() test_seven_vertex_config() test_optimized_config() test_method_comparison() test_performance() print("=" * 70) print("All tests completed!") print("=" * 70) if __name__ == "__main__": main()