Skip to content
This repository has been archived by the owner on Dec 7, 2021. It is now read-only.

Commit

Permalink
Fix a bug of the integer to binary converter (#1256)
Browse files Browse the repository at this point in the history
* fix a bug of the integer to binary converter

* fix the return signature of QuadraticExpression.to_dict

Co-authored-by: Manoel Marques <Manoel.Marques@ibm.com>
  • Loading branch information
t-imamichi and manoelmarques authored Sep 18, 2020
1 parent 2139c2c commit 939baf4
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 4 deletions.
7 changes: 4 additions & 3 deletions qiskit/optimization/converters/integer_to_binary.py
Original file line number Diff line number Diff line change
Expand Up @@ -185,18 +185,19 @@ def _substitute_int_var(self):

# set linear constraints
for constraint in self._src.linear_constraints:
linear, constant = self._convert_linear_coefficients_dict(constraint.linear.to_dict())
linear, constant = self._convert_linear_coefficients_dict(
constraint.linear.to_dict(use_name=True))
self._dst.linear_constraint(
linear, constraint.sense, constraint.rhs - constant, constraint.name
)

# set quadratic constraints
for constraint in self._src.quadratic_constraints:
linear, linear_constant = self._convert_linear_coefficients_dict(
constraint.linear.to_dict()
constraint.linear.to_dict(use_name=True)
)
quadratic, q_linear, q_constant = self._convert_quadratic_coefficients_dict(
constraint.quadratic.to_dict()
constraint.quadratic.to_dict(use_name=True)
)

constant = linear_constant + q_constant
Expand Down
2 changes: 1 addition & 1 deletion qiskit/optimization/problems/quadratic_expression.py
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ def to_dict(self, symmetric: bool = False, use_name: bool = False) \
self.quadratic_program.variables[j].name): v
for (i, j), v in coeffs.items()}
else:
return dict(coeffs.items())
return {(int(i), int(j)): v for (i, j), v in coeffs.items()}

def evaluate(self, x: Union[ndarray, List, Dict[Union[int, str], float]]) -> float:
"""Evaluate the quadratic expression for given variables: x * Q * x.
Expand Down
27 changes: 27 additions & 0 deletions test/optimization/test_converters.py
Original file line number Diff line number Diff line change
Expand Up @@ -679,6 +679,33 @@ def test_ising_to_quadraticprogram_quadratic_deprecated(self):
quadratic.objective.quadratic.coefficients.toarray(), quadratic_matrix
)

def test_integer_to_binary2(self):
"""Test integer to binary variables 2"""
mod = QuadraticProgram()
mod.integer_var(name='x', lowerbound=0, upperbound=1)
mod.integer_var(name='y', lowerbound=0, upperbound=1)
mod.minimize(1, {'x': 1}, {('x', 'y'): 2})
mod.linear_constraint({'x': 1}, '==', 1)
mod.quadratic_constraint({'x': 1}, {('x', 'y'): 2}, '==', 1)
mod2 = IntegerToBinary().convert(mod)
self.assertListEqual([e.name+'@0' for e in mod.variables], [e.name for e in mod2.variables])
self.assertDictEqual(mod.objective.linear.to_dict(),
mod2.objective.linear.to_dict())
self.assertDictEqual(mod.objective.quadratic.to_dict(),
mod2.objective.quadratic.to_dict())
self.assertEqual(mod.get_num_linear_constraints(),
mod2.get_num_linear_constraints())
for cst, cst2 in zip(mod.linear_constraints, mod2.linear_constraints):
self.assertDictEqual(cst.linear.to_dict(),
cst2.linear.to_dict())
self.assertEqual(mod.get_num_quadratic_constraints(),
mod2.get_num_quadratic_constraints())
for cst, cst2 in zip(mod.quadratic_constraints, mod2.quadratic_constraints):
self.assertDictEqual(cst.linear.to_dict(),
cst2.linear.to_dict())
self.assertDictEqual(cst.quadratic.to_dict(),
cst2.quadratic.to_dict())


if __name__ == '__main__':
unittest.main()

0 comments on commit 939baf4

Please sign in to comment.