Quadratic Programming Solvers¶
The Motzkin-Straus MIS solver provides a comprehensive suite of quadratic programming (QP) solvers to handle the non-convex optimization problem that lies at the heart of the theorem. Each solver offers different performance characteristics, precision guarantees, and computational complexity profiles.
Problem Formulation¶
All solvers tackle the same fundamental optimization problem derived from the Motzkin-Straus theorem:
Key Challenges¶
- Non-convexity: The objective function \(\frac{1}{2} x^T A x\) is generally non-convex for graph adjacency matrices
- Local optima: Standard optimization algorithms may converge to suboptimal solutions
- Constraint handling: Maintaining feasibility on the probability simplex throughout optimization
- Numerical precision: Floating-point errors can impact the final discrete result
Available Solvers¶
1. JAX Projected Gradient Descent (PGD)¶
Step size for gradient descent
Maximum optimization iterations
Number of random initializations
Convergence tolerance for early stopping
2. JAX Mirror Descent¶
Step size for exponentiated gradient (typically smaller than PGD)
Maximum optimization iterations
Number of Dirichlet initializations
3. Dirac-3 Quantum Annealing¶
Number of solution samples to request Range: 1-100
Quantum relaxation schedule controlling dissipation Range: {1,2,3,4}
Constraint for solution variables sum Range: 1-10000
Average photons per time-bin (quantum coherence control) Range: 6.67×10⁻⁵ to 6.67×10⁻³
Quantum noise level for escaping local minima Range: 1-100
4. Gurobi Commercial Solver¶
Whether to suppress Gurobi's detailed output logs
5. JAX Frank-Wolfe¶
Hybrid Approaches¶
DiracNetworkXHybridOracle¶
Combines exact NetworkX algorithms with Dirac-3 quantum annealing:
from motzkinstraus.oracles.dirac_hybrid import DiracNetworkXHybridOracle
hybrid_oracle = DiracNetworkXHybridOracle(
networkx_size_threshold=20, # Use exact solver for small graphs
num_samples=30,
relax_schedule=2
)
Strategy: - Small graphs (≤ threshold): Use exact NetworkX algorithms - Large graphs (> threshold): Use Dirac-3 quantum annealing
DiracPGDHybridOracle¶
Combines JAX PGD with Dirac-3 for adaptive optimization:
from motzkinstraus.oracles.dirac_pgd_hybrid import DiracPGDHybridOracle
hybrid_oracle = DiracPGDHybridOracle(
use_pgd_first=True, # Try PGD before Dirac
pgd_time_limit=10.0, # PGD timeout in seconds
dirac_num_samples=25
)
Strategy: - Phase 1: Fast JAX PGD for initial solution - Phase 2: Dirac-3 quantum refinement if needed
Performance Comparison¶
Computational Complexity¶
Solver | Time Complexity | Space Complexity | Convergence |
---|---|---|---|
JAX PGD | O(iter × n²) | O(n²) | First-order |
JAX Mirror | O(iter × n²) | O(n²) | First-order |
Dirac-3 | O(quantum) | O(n) | Quantum annealing |
Gurobi | O(n³) typical | O(n²) | Global optimum |
Frank-Wolfe | O(iter × n²) | O(n) | Projection-free |
Solution Quality vs Speed Trade-offs¶
Graph Type Recommendations¶
Graph Type | Recommended Solver | Rationale |
---|---|---|
Small (< 20 nodes) | Gurobi | Exact solutions feasible |
Dense graphs | JAX Mirror Descent | Better simplex handling |
Sparse graphs | JAX PGD | Efficient gradient computation |
Large scale (> 100 nodes) | Dirac-3 | Quantum advantage |
Production systems | Hybrid approaches | Adaptive performance |
Advanced Configuration¶
Multi-restart Strategies¶
For non-convex optimization, multiple random initializations are crucial:
# High-quality configuration
oracle = ProjectedGradientDescentOracle(
num_restarts=20, # More restarts = better solution quality
dirichlet_alpha=0.5, # Concentrated initialization
tolerance=1e-8 # Tight convergence
)
Quantum Parameter Tuning¶
Fine-tune quantum effects for specific problem types:
# For highly connected graphs (many local minima)
quantum_oracle = DiracOracle(
mean_photon_number=0.001, # Lower = more quantum coherence
quantum_fluctuation_coefficient=80 # Higher = more exploration
)
# For sparse graphs (fewer local minima)
quantum_oracle = DiracOracle(
mean_photon_number=0.005, # Higher = faster convergence
quantum_fluctuation_coefficient=20 # Lower = more exploitation
)
Convergence Monitoring¶
All JAX-based solvers provide detailed convergence information:
oracle = ProjectedGradientDescentOracle(verbose=True)
result = oracle.solve_quadratic_program(adjacency_matrix)
# Access convergence history
print(f"Converged in {oracle.last_iterations} iterations")
print(f"Final energy: {oracle.last_energy}")
print(f"Convergence history: {oracle.convergence_history}")
Error Handling and Robustness¶
Numerical Stability¶
All solvers implement robust numerical handling:
- Gradient clipping: Prevents explosive gradients
- Epsilon regularization: Handles degenerate cases
- Overflow protection: Guards against numerical overflow
- Convergence validation: Verifies solution quality
Fallback Mechanisms¶
from motzkinstraus.oracles import get_best_available_oracle
# Automatic solver selection based on availability
oracle = get_best_available_oracle(
prefer_quantum=True, # Try Dirac-3 first
require_exact=False # Allow approximate solvers
)
Future Developments¶
Planned Enhancements¶
- Quantum-classical hybrid algorithms: Advanced integration patterns
- Adaptive parameter selection: ML-guided hyperparameter tuning
- Distributed computing: Multi-GPU and cluster support
- Problem-specific solvers: Specialized algorithms for graph families
Research Directions¶
- Quantum advantage characterization: When does quantum computing help?
- Approximation guarantees: Theoretical bounds for approximate solvers
- Scalability analysis: Performance on massive graphs (10K+ nodes)
Next Steps: Explore specific solver documentation or learn about hybrid approaches for combining multiple methods.