Skip to main content

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

ModelsBackend
BinaryQuadraticModel, HitachiModelListhitachi.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}
# 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'

optimizer = StrangeworksOptimizer(
model=model,
options=options,
solver=solver
)

sw_job = optimizer.run()
print(f"Job slug: {sw_job.slug}")
print(f"Job status: {optimizer.status(sw_job.slug)}")
results = optimizer.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'

optimizer = StrangeworksOptimizer(
model=model,
options=options,
solver=solver
)

sw_job = optimizer.run()
print(f"Job slug: {sw_job.slug}")
print(f"Job status: {optimizer.status(sw_job.slug)}")
results = optimizer.results(sw_job.slug)
print(results.solution)

HitachiParameterModel

KeyDescriptionData TypeMinimum ValueMaximum ValueDefault Value
typeExecution machine typeinteger--3
num_executionsAnnealing execution countinteger1101
parametersExecution parameter control settingobject---
temperature_num_stepsTemperature change step numberinteger110010
temperature_step_lengthLength per temperature stepinteger11000100
temperature_initialInitial temperaturenumber0 or more3.402823e+3810.0
temperature_targetFinal temperaturenumber0 or more3.402823e+380.01
outputsControl of values included in responseobject---
energiesOutput energy valueboolean--true
spinsOutput spin value arrayboolean--true
execution_timeOutput execution time (nsec)boolean--false
num_outputsNumber of outputs of spin value and energy valueinteger0The maximum specified value is the number of times of num_executions of the request.0
averaged_spinsOutput average value per site of spinboolean--false
averaged_energyOutput the average value of energyboolean--false