This software package includes solvers for continuous optimization problems. The solvers are simulators of coherent continuous-variable machines (CCVM), which are novel coherent network computing architectures based on NTT Research’s coherent Ising machines (CIM). In CCVMs, the physical properties of optical pulses (e.g., mean-field quadrature amplitudes and phase) represent the continuous variables of a given optimization problem. Various features of CCVMs can be used along with programming techniques to implement the constraints imposed by such an optimization problem. Included are methods for solving box-constrained quadratic programming (BoxQP) problems using CCVM simulators by mapping the variables of the problems into the random variables of CCVMs.
Once you have cloned the repository, install the package using pip
.
pip install ccvm-simulators
Go into examples/
and run the demo scripts.
ccvm_boxqp_dl.py
: Solve a BoxQP problem using a CCVM simulator, w/o plottingccvm_boxqp_plot.py
: Solve a BoxQP problem using a CCVM simulator, w/ time-to-solution (TTS) plottingexamples/README.md
View the generated plot.
ccvm_boxqp_plot.py
script solves a single problem instance, and will create an image of the resulting TTS plot in a plots/
directory. The resulting output image, DL-CCVM_TTS_cpu_plot.png
, will look something like this:
ccvm_boxqp_plot.py
script is a toy example that plots the TTS for only a single problem instance.
ccvmplotlib
can also plot the success probability data, for example:
from ccvm_simulators.problem_classes.boxqp import ProblemInstance
from ccvm_simulators.solvers import DLSolver
solver = DLSolver(device="cpu", batch_size=100) # or "cuda"
solver.parameter_key = {
20: {"pump": 2.0, "dt": 0.005, "iterations": 15000, "noise_ratio": 10},
}
boxqp_instance = ProblemInstance(
instance_type="test",
file_path="./examples/benchmarking_instances/single_test_instance/test020-100-10.in",
device=solver.device,
)
The BoxQP problem matrix Q and vector V are normalized to obtain a uniform
performance across different problem sizes and densities. The ideal range depends on the
solver. For best results, Q should be passed to the solver's get_scaling_factor()
method to determine the best scaling value for the problem–solver combination.
boxqp_instance.scale_coefs(solver.get_scaling_factor(boxqp_instance.q_matrix))
solution = solver(
instance=boxqp_instance,
post_processor=None,
)
print(f"The best known solution to this problem is {solution.optimal_value}")
# The best known solution to this problem is 799.560976
print(f"The best objective value found by the solver was {solution.best_objective_value}")
# The best objective value found by the solver was 798.1630859375
print(f"The solving process took effectively {solution.solve_time} seconds to solve a single instance")
# The solving process took 0.008949262142181396 seconds
The package documentation can be found here.
Additional links:
We appreciate your pull requests and welcome opportunities to discuss new ideas. Check out our contribution guide and feel free to improve the ccvm_simulators
package. For major changes, please open an issue first to discuss any suggestions for changes you might have.
Thank you for considering making a contribution to our project! We appreciate your help and support.
This repository contains architectures and simulators presented in the paper "Non-convex Quadratic Programming Using Coherent Optical Networks" by Farhad Khosravi, Ugur Yildiz, Martin Perreault, Artur Scherer, and Pooya Ronagh.