Hitachi
Hitachi has developed the CMOS annealing machine, a non-Neumann architecture computer utilizing the structure of SRAM, a storage device, to perform optimization processing with the Ising model.
Solvers
Models | Backend |
---|---|
BinaryQuadraticModel, HitachiModelList | hitachi.cmos_annealer |
You can specify the type of machine type to run the process from the following options (see the Hitachi API Reference for more details) and HitachiParameterModel for details on how to set the type
:
3 : GPU 32bit(int)
4 : GPU 32bit(float)
5 : ASIC 4bit
Binary Quadratic Model
import strangeworks as sw
from strangeworks_optimization import StrangeworksOptimizer
from strangeworks_optimization_models.parameter_models import HitachiParameterModel
from dimod import BinaryQuadraticModel
sw.authenticate('your-api-key')
linear = {1: -2, 2: -2, 3: -3, 4: -3, 5: -2}
quadratic = {(1, 2): 2, (1, 3): 2, (2, 4): 2, (3, 4): 2, (3, 5): 2, (4, 5): 2}
model = BinaryQuadraticModel(linear, quadratic, "BINARY")
options = HitachiParameterModel(solver_type=5)
solver = 'hitachi.cmos_annealer'
so = StrangeworksOptimizer(
model=model,
options=options,
solver=solver
)
sw_job = so.run()
print(f"Job slug: {sw_job.slug}")
print(f"Job status: {so.status(sw_job.slug)}")
results = so.results(sw_job.slug)
print(results.solution)
Ising Model
The model parameter is an array of integer values [x0, y0, x1, y1, p]
with 5 elements representing the vertices or interactions of the Ising model. The order in which they are specified does not affect the calculation results.
x
and y
represent the coordinates (x-axis
, y-axis
) on the Ising model, respectively, and p
represents the coefficient.
Set the Ising model in the form x0 == x1, y0 == y1
to represent the vertex = first order term (magnetic field), and set x0, y0
and x1, y1
to be adjacent to each other to represent the interaction of two vertices.
Adjacent means up-down, left-right, and diagonal. An error occurs if the coordinate specification of two non-adjacent vertices is included.
import strangeworks as sw
from strangeworks_optimization import StrangeworksOptimizer
from strangeworks_optimization_models.problem_models import HitachiModelList
from strangeworks_optimization_models.parameter_models import HitachiParameterModel
sw.authenticate('your-api-key')
model = HitachiModelList(
[
[0, 0, 0, 1, 117],
[0, 0, 1, 0, 104],
[0, 0, 1, 1, 65],
[0, 1, 1, 0, 72],
[0, 1, 1, 1, 45],
[1, 0, 1, 1, 40],
]
)
options = HitachiParameterModel(solver_type=5)
solver = 'hitachi.cmos_annealer'
so = StrangeworksOptimizer(
model=model,
options=options,
solver=solver
)
sw_job = so.run()
print(f"Job slug: {sw_job.slug}")
print(f"Job status: {so.status(sw_job.slug)}")
results = so.results(sw_job.slug)
print(results.solution)
HitachiParameterModel
Key | Description | Data Type | Minimum Value | Maximum Value | Default Value |
---|---|---|---|---|---|
type | Execution machine type | integer | - | - | 3 |
num_executions | Annealing execution count | integer | 1 | 10 | 1 |
parameters | Execution parameter control setting | object | - | - | - |
temperature_num_steps | Temperature change step number | integer | 1 | 100 | 10 |
temperature_step_length | Length per temperature step | integer | 1 | 1000 | 100 |
temperature_initial | Initial temperature | number | 0 or more | 3.402823e+38 | 10.0 |
temperature_target | Final temperature | number | 0 or more | 3.402823e+38 | 0.01 |
outputs | Control of values included in response | object | - | - | - |
energies | Output energy value | boolean | - | - | true |
spins | Output spin value array | boolean | - | - | true |
execution_time | Output execution time (nsec) | boolean | - | - | false |
num_outputs | Number of outputs of spin value and energy value | integer | 0 | The maximum specified value is the number of times of num_executions of the request. | 0 |
averaged_spins | Output average value per site of spin | boolean | - | - | false |
averaged_energy | Output the average value of energy | boolean | - | - | false |