Skip to content

Commit

Permalink
Merge pull request #27 from Jij-Inc/hotfix/qrao_linear_case
Browse files Browse the repository at this point in the history
Hotfix/qrao linear case
  • Loading branch information
yuyamashiro authored Oct 5, 2023
2 parents 7de183c + 15d340c commit 933f161
Show file tree
Hide file tree
Showing 5 changed files with 129 additions and 10 deletions.
4 changes: 2 additions & 2 deletions jijmodeling_transpiler_quantum/core/qrac/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@
Ex: QRAC utilizes are used Quantum Random Access Optimization (QRAO).
"""

from .graph_coloring import greedy_graph_coloring
from .graph_coloring import greedy_graph_coloring, check_linear_term

__all__ = ["greedy_graph_coloring"]
__all__ = ["greedy_graph_coloring", "check_linear_term"]
36 changes: 36 additions & 0 deletions jijmodeling_transpiler_quantum/core/qrac/graph_coloring.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,3 +71,39 @@ def greedy_graph_coloring(
max_color += 1

return coloring, color_group


def check_linear_term(
color_group: dict[int, list[int]],
linear_term_index: list[int],
max_color_group_size: int,
) -> dict[int, list[int]]:
"""Search for items within the index of linear term that have not been assigned to the color_group, and add them.
Args:
color_group (dict[int, list[int]]): color_group
linear_term_index (list[int]): list of index of linear term
max_color_group_size (int): the maximum number of encoding qubits. if you want to use for the qrac31, set 3.
Returns:
dict[int, list[int]]: color_group which added items within the index of linear term that have not been assigned to the color_group.
"""
idx_in_color_group = []
for v in color_group.values():
idx_in_color_group.extend(v)

max_idx = max(color_group.keys())
value_counter = 1
for idx in linear_term_index:
if idx not in idx_in_color_group:
if value_counter == 1:
color_group[max_idx + 1] = []

color_group[max_idx + 1].append(idx)
value_counter += 1

if value_counter > max_color_group_size:
max_idx += 1
value_counter = 1

return color_group
2 changes: 2 additions & 0 deletions jijmodeling_transpiler_quantum/qiskit/qrao/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from .qrao31 import color_group_to_qrac_encode, qrac31_encode_ising
from .qrao21 import qrac21_encode_ising
from .to_qrac import (
transpile_to_qrac31_hamiltonian,
transpile_to_qrac21_hamiltonian,
Expand All @@ -9,6 +10,7 @@
__all__ = [
"color_group_to_qrac_encode",
"qrac31_encode_ising",
"qrac21_encode_ising",
"transpile_to_qrac31_hamiltonian",
"transpile_to_qrac21_hamiltonian",
"transpile_to_qrac32_hamiltonian",
Expand Down
38 changes: 30 additions & 8 deletions jijmodeling_transpiler_quantum/qiskit/qrao/to_qrac.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@ def decode_from_binary_values(
self, binary_list: typ.Iterable[list[int]]
) -> jm.SampleSet:
binary_results = [
{i: value for i, value in enumerate(binary)} for binary in binary_list
{i: value for i, value in enumerate(binary)}
for binary in binary_list
]
binary_encoder = self.pubo_builder.binary_encoder
decoded: jm.SampleSet = (
Expand Down Expand Up @@ -81,10 +82,16 @@ def get_hamiltonian(
multipliers=multipliers, detail_parameters=detail_parameters
)
ising = jmt_qc.qubo_to_ising(qubo)
max_color_group_size = 3
_, color_group = jmt_qc.greedy_graph_coloring(
ising.quad.keys(), max_color_group_size=3
ising.quad.keys(), max_color_group_size=max_color_group_size
)
color_group = jmt_qc.qrac.check_linear_term(
color_group, ising.linear.keys(), max_color_group_size
)
qrac_hamiltonian, offset, encoding = qrac31_encode_ising(
ising, color_group
)
qrac_hamiltonian, offset, encoding = qrac31_encode_ising(ising, color_group)
return (
qrac_hamiltonian,
offset + constant,
Expand Down Expand Up @@ -133,10 +140,17 @@ def get_hamiltonian(
multipliers=multipliers, detail_parameters=detail_parameters
)
ising = jmt_qc.qubo_to_ising(qubo)
max_color_group_size = 2

_, color_group = jmt_qc.greedy_graph_coloring(
ising.quad.keys(), max_color_group_size=2
ising.quad.keys(), max_color_group_size=max_color_group_size
)
color_group = jmt_qc.qrac.check_linear_term(
color_group, ising.linear.keys(), max_color_group_size
)
qrac_hamiltonian, offset, encoding = qrac21_encode_ising(
ising, color_group
)
qrac_hamiltonian, offset, encoding = qrac21_encode_ising(ising, color_group)
return (
qrac_hamiltonian,
offset + constant,
Expand Down Expand Up @@ -185,10 +199,16 @@ def get_hamiltonian(
multipliers=multipliers, detail_parameters=detail_parameters
)
ising = jmt_qc.qubo_to_ising(qubo)
max_color_group_size = 3
_, color_group = jmt_qc.greedy_graph_coloring(
ising.quad.keys(), max_color_group_size=3
ising.quad.keys(), max_color_group_size=max_color_group_size
)
color_group = jmt_qc.qrac.check_linear_term(
color_group, ising.linear.keys(), max_color_group_size
)
qrac_hamiltonian, offset, encoding = qrac32_encode_ising(
ising, color_group
)
qrac_hamiltonian, offset, encoding = qrac32_encode_ising(ising, color_group)
return (
qrac_hamiltonian,
offset + constant,
Expand Down Expand Up @@ -237,7 +257,9 @@ def get_hamiltonian(
multipliers=multipliers, detail_parameters=detail_parameters
)
ising = jmt_qc.qubo_to_ising(qubo)
qrac_hamiltonian, offset, encoding = qrac_space_efficient_encode_ising(ising)
qrac_hamiltonian, offset, encoding = qrac_space_efficient_encode_ising(
ising
)
return (
qrac_hamiltonian,
offset + constant,
Expand Down
59 changes: 59 additions & 0 deletions tests/test_qrac.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import jijmodeling_transpiler_quantum.qiskit as jtq
from jijmodeling_transpiler_quantum.core.ising_qubo import IsingModel
from jijmodeling_transpiler_quantum.core.qrac import (
greedy_graph_coloring,
check_linear_term,
)
from jijmodeling_transpiler_quantum.qiskit.qrao import (
qrac31_encode_ising,
qrac21_encode_ising,
)


def test_check_linear_term():
ising = IsingModel({(0, 1): 2.0, (0, 2): 1.0}, {2: 5.0, 3: 2.0}, 6.0)
max_color_group_size = 3
_, color_group = greedy_graph_coloring(
ising.quad.keys(), max_color_group_size=max_color_group_size
)
color_group = check_linear_term(
color_group, ising.linear.keys(), max_color_group_size
)

qrac_hamiltonian, offset, encoding = qrac31_encode_ising(
ising, color_group
)

ising = IsingModel(
{(0, 1): 2.0, (0, 2): 1.0},
{2: 5.0, 3: 2.0, 4: 1.0, 5: 1.0, 6: 1.0},
6.0,
)
max_color_group_size = 3
_, color_group = greedy_graph_coloring(
ising.quad.keys(), max_color_group_size=max_color_group_size
)
color_group = check_linear_term(
color_group, ising.linear.keys(), max_color_group_size
)

qrac_hamiltonian, offset, encoding = qrac31_encode_ising(
ising, color_group
)

ising = IsingModel(
{(0, 1): 2.0, (0, 2): 1.0},
{2: 5.0, 3: 2.0, 4: 1.0, 5: 1.0, 6: 1.0},
6.0,
)
max_color_group_size = 2
_, color_group = greedy_graph_coloring(
ising.quad.keys(), max_color_group_size=max_color_group_size
)
color_group = check_linear_term(
color_group, ising.linear.keys(), max_color_group_size
)

qrac_hamiltonian, offset, encoding = qrac21_encode_ising(
ising, color_group
)

0 comments on commit 933f161

Please sign in to comment.