示例#1
0
    def test_admm_maximization(self):
        """Tests a simple maximization problem using ADMM optimizer"""
        try:
            mdl = Model('simple-max')
            c = mdl.continuous_var(lb=0, ub=10, name='c')
            x = mdl.binary_var(name='x')
            mdl.maximize(c + x * x)
            op = QuadraticProgram()
            op.from_docplex(mdl)

            admm_params = ADMMParameters()

            qubo_optimizer = MinimumEigenOptimizer(NumPyMinimumEigensolver())
            # qubo_optimizer = CplexOptimizer()
            continuous_optimizer = CplexOptimizer()

            solver = ADMMOptimizer(qubo_optimizer=qubo_optimizer,
                                   continuous_optimizer=continuous_optimizer,
                                   params=admm_params)
            solution = solver.solve(op)
            self.assertIsNotNone(solution)
            self.assertIsInstance(solution, ADMMOptimizationResult)

            self.assertIsNotNone(solution.x)
            np.testing.assert_almost_equal([10, 0], solution.x, 3)
            self.assertIsNotNone(solution.fval)
            np.testing.assert_almost_equal(10, solution.fval, 3)
            self.assertIsNotNone(solution.state)
            self.assertIsInstance(solution.state, ADMMState)
        except NameError as ex:
            self.skipTest(str(ex))
示例#2
0
    def test_equality_constraints_with_continuous_variables(self):
        """Simple example to test equality constraints with continuous variables."""
        mdl = Model("eq-constraints-cts-vars")

        # pylint:disable=invalid-name
        v = mdl.binary_var(name='v')
        w = mdl.continuous_var(name='w', lb=0.)
        t = mdl.continuous_var(name='t', lb=0.)

        mdl.minimize(v + w + t)
        mdl.add_constraint(2 * v + w >= 2, "cons1")
        mdl.add_constraint(w + t == 1, "cons2")

        op = QuadraticProgram()
        op.from_docplex(mdl)

        admm_params = ADMMParameters(
            rho_initial=1001,
            beta=1000,
            factor_c=900,
            maxiter=100,
            three_block=True,
        )

        solver = ADMMOptimizer(params=admm_params)
        solution = solver.solve(op)

        self.assertIsNotNone(solution)
        self.assertIsInstance(solution, ADMMOptimizationResult)
        self.assertIsNotNone(solution.x)
        np.testing.assert_almost_equal([0., 1., 0.], solution.x, 3)
        self.assertIsNotNone(solution.fval)
        np.testing.assert_almost_equal(1., solution.fval, 3)
        self.assertIsNotNone(solution.state)
        self.assertIsInstance(solution.state, ADMMState)
示例#3
0
    def test_quad_constraints(self):
        """Simple example to test quadratic constraints."""
        mdl = Model('quad-constraints')

        v = mdl.binary_var(name='v')
        w = mdl.continuous_var(name='w', lb=0.)

        mdl.minimize(v + w)
        mdl.add_constraint(v + w >= 1, "cons2")
        mdl.add_constraint(v**2 + w**2 <= 1, "cons2")

        op = QuadraticProgram()
        op.from_docplex(mdl)

        admm_params = ADMMParameters(
            rho_initial=1001,
            beta=1000,
            factor_c=900,
            maxiter=100,
            three_block=True,
        )

        solver = ADMMOptimizer(params=admm_params)
        solution = solver.solve(op)

        self.assertIsNotNone(solution)
        self.assertIsInstance(solution, ADMMOptimizationResult)
        self.assertIsNotNone(solution.x)
        np.testing.assert_almost_equal([0., 1.], solution.x, 3)
        self.assertIsNotNone(solution.fval)
        np.testing.assert_almost_equal(1., solution.fval, 3)
        self.assertIsNotNone(solution.state)
        self.assertIsInstance(solution.state, ADMMState)
示例#4
0
    def test_admm_ex5_warm_start(self):
        """Example 5 but with a warm start"""
        mdl = Model('ex5')

        # pylint:disable=invalid-name
        v = mdl.binary_var(name='v')
        w = mdl.binary_var(name='w')
        t = mdl.binary_var(name='t')

        mdl.minimize(v + w + t)
        mdl.add_constraint(2 * v + 2 * w + t <= 3, "cons1")
        mdl.add_constraint(v + w + t >= 1, "cons2")
        mdl.add_constraint(v + w == 1, "cons3")

        op = QuadraticProgram()
        op.from_docplex(mdl)

        admm_params = ADMMParameters(
            rho_initial=1001, beta=1000, factor_c=900,
            maxiter=100, three_block=False, warm_start=True
        )

        solver = ADMMOptimizer(params=admm_params)
        solution = solver.solve(op)

        self.assertIsNotNone(solution)
        self.assertIsInstance(solution, ADMMOptimizationResult)
        self.assertIsNotNone(solution.x)
        np.testing.assert_almost_equal([0., 1., 0.], solution.x, 3)
        self.assertIsNotNone(solution.fval)
        np.testing.assert_almost_equal(1., solution.fval, 3)
        self.assertIsNotNone(solution.state)
        self.assertIsInstance(solution.state, ADMMState)
    def test_recursive_min_eigen_optimizer(self):
        """Test the recursive minimum eigen optimizer."""
        try:
            filename = 'op_ip1.lp'
            # get minimum eigen solver
            min_eigen_solver = NumPyMinimumEigensolver()

            # construct minimum eigen optimizer
            min_eigen_optimizer = MinimumEigenOptimizer(min_eigen_solver)
            recursive_min_eigen_optimizer = RecursiveMinimumEigenOptimizer(
                min_eigen_optimizer, min_num_vars=4)

            # load optimization problem
            problem = QuadraticProgram()
            lp_file = self.get_resource_path(path.join('resources', filename))
            problem.read_from_lp_file(lp_file)

            # solve problem with cplex
            cplex = CplexOptimizer()
            cplex_result = cplex.solve(problem)

            # solve problem
            result = recursive_min_eigen_optimizer.solve(problem)

            # analyze results
            self.assertAlmostEqual(cplex_result.fval, result.fval)
        except MissingOptionalLibraryError as ex:
            self.skipTest(str(ex))
    def test_min_eigen_optimizer(self, config):
        """ Min Eigen Optimizer Test """
        try:
            # unpack configuration
            min_eigen_solver_name, backend, filename = config

            # get minimum eigen solver
            min_eigen_solver = self.min_eigen_solvers[min_eigen_solver_name]
            if backend:
                min_eigen_solver.quantum_instance = BasicAer.get_backend(
                    backend)

            # construct minimum eigen optimizer
            min_eigen_optimizer = MinimumEigenOptimizer(min_eigen_solver)

            # load optimization problem
            problem = QuadraticProgram()
            lp_file = self.get_resource_path(path.join('resources', filename))
            problem.read_from_lp_file(lp_file)

            # solve problem with cplex
            cplex = CplexOptimizer()
            cplex_result = cplex.solve(problem)

            # solve problem
            result = min_eigen_optimizer.solve(problem)

            # analyze results
            self.assertAlmostEqual(cplex_result.fval, result.fval)
        except RuntimeError as ex:
            msg = str(ex)
            if 'CPLEX' in msg:
                self.skipTest(msg)
            else:
                self.fail(msg)
示例#7
0
    def test_min_eigen_optimizer_history(self):
        """Tests different options for history."""
        try:
            filename = 'op_ip1.lp'
            # load optimization problem
            problem = QuadraticProgram()
            lp_file = self.get_resource_path(path.join('resources', filename))
            problem.read_from_lp_file(lp_file)

            # get minimum eigen solver
            min_eigen_solver = NumPyMinimumEigensolver()

            # construct minimum eigen optimizer
            min_eigen_optimizer = MinimumEigenOptimizer(min_eigen_solver)

            # no history
            recursive_min_eigen_optimizer = \
                RecursiveMinimumEigenOptimizer(min_eigen_optimizer,
                                               min_num_vars=4,
                                               history=IntermediateResult.NO_ITERATIONS)
            result = recursive_min_eigen_optimizer.solve(problem)
            self.assertIsNotNone(result.replacements)
            self.assertIsNotNone(result.history)
            self.assertIsNotNone(result.history[0])
            self.assertEqual(len(result.history[0]), 0)
            self.assertIsNone(result.history[1])

            # only last iteration in the history
            recursive_min_eigen_optimizer = \
                RecursiveMinimumEigenOptimizer(min_eigen_optimizer,
                                               min_num_vars=4,
                                               history=IntermediateResult.LAST_ITERATION)
            result = recursive_min_eigen_optimizer.solve(problem)
            self.assertIsNotNone(result.replacements)
            self.assertIsNotNone(result.history)
            self.assertIsNotNone(result.history[0])
            self.assertEqual(len(result.history[0]), 0)
            self.assertIsNotNone(result.history[1])

            # full history
            recursive_min_eigen_optimizer = \
                RecursiveMinimumEigenOptimizer(min_eigen_optimizer,
                                               min_num_vars=4,
                                               history=IntermediateResult.ALL_ITERATIONS)
            result = recursive_min_eigen_optimizer.solve(problem)
            self.assertIsNotNone(result.replacements)
            self.assertIsNotNone(result.history)
            self.assertIsNotNone(result.history[0])
            self.assertGreater(len(result.history[0]), 1)
            self.assertIsNotNone(result.history[1])

        except MissingOptionalLibraryError as ex:
            self.skipTest(str(ex))
示例#8
0
    def test_admm_ex4(self):
        """Example 4 as a unit test. Example 4 is reported in:
        Gambella, C., & Simonetto, A. (2020).
        Multi-block ADMM Heuristics for Mixed-Binary Optimization on Classical
        and Quantum Computers.
        arXiv preprint arXiv:2001.02069."""
        try:
            mdl = Model('ex4')

            v = mdl.binary_var(name='v')
            w = mdl.binary_var(name='w')
            # pylint:disable=invalid-name
            t = mdl.binary_var(name='t')

            # b = 1
            b = 2

            mdl.minimize(v + w + t)
            mdl.add_constraint(2 * v + 10 * w + t <= 3, "cons1")
            mdl.add_constraint(v + w + t >= b, "cons2")

            op = QuadraticProgram()
            op.from_docplex(mdl)

            # qubo_optimizer = MinimumEigenOptimizer(NumPyMinimumEigensolver())
            qubo_optimizer = CplexOptimizer()
            continuous_optimizer = CplexOptimizer()

            admm_params = ADMMParameters(rho_initial=1001,
                                         beta=1000,
                                         factor_c=900,
                                         max_iter=100,
                                         three_block=False)

            solver = ADMMOptimizer(
                params=admm_params,
                qubo_optimizer=qubo_optimizer,
                continuous_optimizer=continuous_optimizer,
            )
            solution = solver.solve(op)
            self.assertIsNotNone(solution)
            self.assertIsInstance(solution, ADMMOptimizationResult)
            self.assertIsNotNone(solution.x)
            np.testing.assert_almost_equal([1., 0., 1.], solution.x, 3)
            self.assertIsNotNone(solution.fval)
            np.testing.assert_almost_equal(2., solution.fval, 3)
            self.assertIsNotNone(solution.state)
            self.assertIsInstance(solution.state, ADMMState)

        except NameError as ex:
            self.skipTest(str(ex))
示例#9
0
    def test_admm_ex4_no_bin_var_in_objective(self):
        """Modified Example 4 as a unit test. See the description of the previous test.
        This test differs from the previous in the objective: one binary variable
        is omitted in objective to test a problem when a binary variable defined but is used only
        in constraints.
        """
        try:
            mdl = Model('ex4')

            v = mdl.binary_var(name='v')
            w = mdl.binary_var(name='w')
            # pylint:disable=invalid-name
            t = mdl.binary_var(name='t')

            # b = 1
            b = 2

            mdl.minimize(v + t)
            mdl.add_constraint(2 * v + 10 * w + t <= 3, "cons1")
            mdl.add_constraint(v + w + t >= b, "cons2")

            op = QuadraticProgram()
            op.from_docplex(mdl)

            # qubo_optimizer = MinimumEigenOptimizer(NumPyMinimumEigensolver())
            qubo_optimizer = CplexOptimizer()
            continuous_optimizer = CplexOptimizer()

            admm_params = ADMMParameters(rho_initial=1001,
                                         beta=1000,
                                         factor_c=900,
                                         max_iter=100,
                                         three_block=False)

            solver = ADMMOptimizer(
                params=admm_params,
                qubo_optimizer=qubo_optimizer,
                continuous_optimizer=continuous_optimizer,
            )
            solution = solver.solve(op)
            self.assertIsNotNone(solution)
            self.assertIsInstance(solution, ADMMOptimizationResult)
            self.assertIsNotNone(solution.x)
            np.testing.assert_almost_equal([1., 0., 1.], solution.x, 3)
            self.assertIsNotNone(solution.fval)
            np.testing.assert_almost_equal(2., solution.fval, 3)
            self.assertIsNotNone(solution.state)
            self.assertIsInstance(solution.state, ADMMState)

        except NameError as ex:
            self.skipTest(str(ex))
    def test_optnvo_6_key(self):
        """Test with 6 linear coefficients, negative quadratics, no constant."""
        # Circuit parameters.
        try:
            num_value = 4

            # Input.
            problem = QuadraticProgram()

            # Input.
            problem = QuadraticProgram()
            for name in ['x0', 'x1', 'x2', 'x3', 'x4', 'x5']:
                problem.binary_var(name)
            linear = [-1, -2, -1, 0, 1, 2]
            quadratic = {('x0', 'x3'): -1, ('x1', 'x5'): -2}
            problem.minimize(linear=linear, quadratic=quadratic)

            # Convert to dictionary format with operator/oracle.
            converter = QuadraticProgramToNegativeValueOracle(num_value)
            a_operator, _, func_dict = converter.encode(problem)

            self._validate_function(func_dict, problem)
            self._validate_operator(func_dict, len(linear), num_value,
                                    a_operator)
        except NameError as ex:
            self.skipTest(str(ex))
示例#11
0
    def test_cobyla_optimizer_with_variable_bounds(self):
        """ Cobyla Optimizer Test With Variable Bounds. """

        # initialize optimizer
        cobyla = CobylaOptimizer()

        # initialize problem
        problem = QuadraticProgram()

        # set variables and bounds
        problem.continuous_var(lowerbound=-1, upperbound=1)
        problem.continuous_var(lowerbound=-2, upperbound=2)

        # set objective and minimize
        problem.minimize(linear=[1, 1])

        # solve problem with cobyla
        result = cobyla.solve(problem)

        # analyze results
        self.assertAlmostEqual(result.x[0], -1.0, places=6)
        self.assertAlmostEqual(result.x[1], -2.0, places=6)

        # set objective and minimize
        problem.maximize(linear=[1, 1])

        # solve problem with cobyla
        result = cobyla.solve(problem)

        # analyze results
        self.assertAlmostEqual(result.x[0], 1.0, places=6)
        self.assertAlmostEqual(result.x[1], 2.0, places=6)
示例#12
0
    def test_admm_ex6(self):
        """Example 6 as a unit test. Example 6 is reported in:
        Gambella, C., & Simonetto, A. (2020).
        Multi-block ADMM Heuristics for Mixed-Binary Optimization on Classical
        and Quantum Computers.
        arXiv preprint arXiv:2001.02069."""
        try:
            mdl = Model('ex6')

            # pylint:disable=invalid-name
            v = mdl.binary_var(name='v')
            w = mdl.binary_var(name='w')
            t = mdl.binary_var(name='t')
            u = mdl.continuous_var(name='u')

            mdl.minimize(v + w + t + 5 * (u - 2)**2)
            mdl.add_constraint(v + 2 * w + t + u <= 3, "cons1")
            mdl.add_constraint(v + w + t >= 1, "cons2")
            mdl.add_constraint(v + w == 1, "cons3")

            op = QuadraticProgram()
            op.from_docplex(mdl)

            qubo_optimizer = CplexOptimizer()
            continuous_optimizer = CplexOptimizer()

            admm_params = ADMMParameters(rho_initial=1001,
                                         beta=1000,
                                         factor_c=900,
                                         max_iter=100,
                                         three_block=True,
                                         tol=1.e-6)

            solver = ADMMOptimizer(params=admm_params,
                                   qubo_optimizer=qubo_optimizer,
                                   continuous_optimizer=continuous_optimizer)
            solution = solver.solve(op)

            self.assertIsNotNone(solution)
            self.assertIsInstance(solution, ADMMOptimizationResult)
            self.assertIsNotNone(solution.x)
            np.testing.assert_almost_equal([1., 0., 0., 2.], solution.x, 3)
            self.assertIsNotNone(solution.fval)
            np.testing.assert_almost_equal(1., solution.fval, 3)
            self.assertIsNotNone(solution.state)
            self.assertIsInstance(solution.state, ADMMState)
        except NameError as ex:
            self.skipTest(str(ex))
示例#13
0
    def calculate(self, G, cost_matrix, starting_node=0):

        # Create nodes array for the TSP solver in Qiskit
        coords = []
        for node in G.nodes:
            coords.append(G.nodes[node]['pos'])

        tsp_instance = tsp.TspData(name="TSP",
                                   dim=len(G.nodes),
                                   coord=coords,
                                   w=cost_matrix)

        qubitOp, offset = tsp.get_operator(tsp_instance)

        backend = Aer.get_backend('qasm_simulator')
        quantum_instance = QuantumInstance(backend)

        optimizer = COBYLA(maxiter=300, rhobeg=3, tol=1.5)

        # Define Minimum Eigen Solvers
        minimum_eigen_solver = QAOA(quantum_instance=quantum_instance,
                                    optimizer=optimizer,
                                    operator=qubitOp)
        #minimum_eigen_solver = VQE(quantum_instance=quantum_instance, optimizer=optimizer, operator=qubitOp)
        exact_mes = NumPyMinimumEigensolver()

        # Create the optimizers so we can plug our Quadratic Program
        minimum_eigen_optimizer = MinimumEigenOptimizer(minimum_eigen_solver)
        #vqe = MinimumEigenOptimizer(vqe_mes)
        exact = MinimumEigenOptimizer(exact_mes)
        rqaoa = RecursiveMinimumEigenOptimizer(
            min_eigen_optimizer=minimum_eigen_optimizer,
            min_num_vars=1,
            min_num_vars_optimizer=exact)

        # Create QUBO based on qubitOp from the TSP
        qp = QuadraticProgram()
        qp.from_ising(qubitOp, offset, linear=True)

        result = rqaoa.solve(qp)

        if (tsp.tsp_feasible(result.x)):
            z = tsp.get_tsp_solution(result.x)
            print('solution:', z)
            return z
        else:
            print('no solution:', result.x)
            return []
    def test_cplex_optimizer(self, config):
        """ Cplex Optimizer Test """
        # unpack configuration
        filename, x, fval = config

        # load optimization problem
        problem = QuadraticProgram()
        problem.read_from_lp_file(self.resource_path + filename)

        # solve problem with cplex
        result = self.cplex_optimizer.solve(problem)

        # analyze results
        self.assertAlmostEqual(result.fval, fval)
        for i in range(problem.get_num_vars()):
            self.assertAlmostEqual(result.x[i], x[i])
示例#15
0
    def test_qubo_gas_int_simple_maximize(self):
        """Test for simple case, but with maximization."""

        # Input.
        model = Model()
        x_0 = model.binary_var(name='x0')
        x_1 = model.binary_var(name='x1')
        model.maximize(-x_0+2*x_1)
        op = QuadraticProgram()
        op.from_docplex(model)

        # Get the optimum key and value.
        n_iter = 8
        gmf = GroverOptimizer(4, num_iterations=n_iter, quantum_instance=self.sv_simulator)
        results = gmf.solve(op)
        self.validate_results(op, results)
    def test_qubo_gas_int_zero(self):
        """Test for when the answer is zero."""

        # Input.
        model = Model()
        x_0 = model.binary_var(name='x0')
        x_1 = model.binary_var(name='x1')
        model.minimize(0*x_0+0*x_1)
        op = QuadraticProgram()
        op.from_docplex(model)

        # Will not find a negative, should return 0.
        gmf = GroverOptimizer(1, num_iterations=1, quantum_instance=self.q_instance)
        results = gmf.solve(op)
        self.assertEqual(results.x, [0, 0])
        self.assertEqual(results.fval, 0.0)
示例#17
0
    def test_quad_constraints(self):
        """Simple example to test quadratic constraints."""

        try:
            mdl = Model('quad-constraints')

            v = mdl.binary_var(name='v')
            w = mdl.continuous_var(name='w', lb=0.)

            mdl.minimize(v + w)
            mdl.add_constraint(v + w >= 1, "cons2")
            mdl.add_constraint(v**2 + w**2 <= 1, "cons2")

            op = QuadraticProgram()
            op.from_docplex(mdl)

            # qubo_optimizer = MinimumEigenOptimizer(NumPyMinimumEigensolver())
            qubo_optimizer = CplexOptimizer()

            continuous_optimizer = CplexOptimizer()

            admm_params = ADMMParameters(
                rho_initial=1001,
                beta=1000,
                factor_c=900,
                max_iter=100,
                three_block=True,
            )

            solver = ADMMOptimizer(
                params=admm_params,
                qubo_optimizer=qubo_optimizer,
                continuous_optimizer=continuous_optimizer,
            )
            solution = solver.solve(op)

            self.assertIsNotNone(solution)
            self.assertIsInstance(solution, ADMMOptimizationResult)
            self.assertIsNotNone(solution.x)
            np.testing.assert_almost_equal([0., 1.], solution.x, 3)
            self.assertIsNotNone(solution.fval)
            np.testing.assert_almost_equal(1., solution.fval, 3)
            self.assertIsNotNone(solution.state)
            self.assertIsInstance(solution.state, ADMMState)

        except NameError as ex:
            self.skipTest(str(ex))
    def test_qubo_gas_int_paper_example(self):
        """Test the example from https://arxiv.org/abs/1912.04088."""

        # Input.
        model = Model()
        x_0 = model.binary_var(name='x0')
        x_1 = model.binary_var(name='x1')
        x_2 = model.binary_var(name='x2')
        model.minimize(-x_0+2*x_1-3*x_2-2*x_0*x_2-1*x_1*x_2)
        op = QuadraticProgram()
        op.from_docplex(model)

        # Get the optimum key and value.
        n_iter = 10
        gmf = GroverOptimizer(6, num_iterations=n_iter, quantum_instance=self.q_instance)
        results = gmf.solve(op)
        self.validate_results(op, results)
示例#19
0
    def test_admm_ex6_max(self):
        """Example 6 as maximization"""
        try:
            mdl = Model('ex6-max')

            # pylint:disable=invalid-name
            v = mdl.binary_var(name='v')
            w = mdl.binary_var(name='w')
            t = mdl.binary_var(name='t')
            u = mdl.continuous_var(name='u')

            # mdl.minimize(v + w + t + 5 * (u - 2) ** 2)
            mdl.maximize(-v - w - t - 5 * (u - 2)**2)
            mdl.add_constraint(v + 2 * w + t + u <= 3, "cons1")
            mdl.add_constraint(v + w + t >= 1, "cons2")
            mdl.add_constraint(v + w == 1, "cons3")

            op = QuadraticProgram()
            op.from_docplex(mdl)

            qubo_optimizer = CplexOptimizer()
            continuous_optimizer = CplexOptimizer()

            admm_params = ADMMParameters(rho_initial=1001,
                                         beta=1000,
                                         factor_c=900,
                                         max_iter=100,
                                         three_block=True,
                                         tol=1.e-6)

            solver = ADMMOptimizer(params=admm_params,
                                   qubo_optimizer=qubo_optimizer,
                                   continuous_optimizer=continuous_optimizer)
            solution = solver.solve(op)

            self.assertIsNotNone(solution)
            self.assertIsInstance(solution, ADMMOptimizationResult)
            self.assertIsNotNone(solution.x)
            np.testing.assert_almost_equal([1., 0., 0., 2.], solution.x, 3)
            self.assertIsNotNone(solution.fval)
            np.testing.assert_almost_equal(-1., solution.fval, 3)
            self.assertIsNotNone(solution.state)
            self.assertIsInstance(solution.state, ADMMState)
        except NameError as ex:
            self.skipTest(str(ex))
    def test_init(self):
        """ test init. """

        quadratic_program = QuadraticProgram()
        for _ in range(5):
            quadratic_program.continuous_var()

        # pylint: disable=no-member
        self.assertEqual(quadratic_program.objective.constant, 0.0)
        self.assertEqual(len(quadratic_program.objective.linear.to_dict()), 0)
        self.assertEqual(len(quadratic_program.objective.quadratic.to_dict()),
                         0)
        self.assertEqual(quadratic_program.objective.sense,
                         QuadraticObjective.Sense.MINIMIZE)

        constant = 1.0
        linear_coeffs = np.array(range(5))
        lst = [[0 for _ in range(5)] for _ in range(5)]
        for i, v in enumerate(lst):
            for j, _ in enumerate(v):
                lst[min(i, j)][max(i, j)] += i * j
        quadratic_coeffs = np.array(lst)

        quadratic_program.minimize(constant, linear_coeffs, quadratic_coeffs)

        self.assertEqual(quadratic_program.objective.constant, constant)
        self.assertTrue(
            (quadratic_program.objective.linear.to_array() == linear_coeffs
             ).all())
        self.assertTrue((quadratic_program.objective.quadratic.to_array() ==
                         quadratic_coeffs).all())
        self.assertEqual(quadratic_program.objective.sense,
                         QuadraticObjective.Sense.MINIMIZE)

        quadratic_program.maximize(constant, linear_coeffs, quadratic_coeffs)

        self.assertEqual(quadratic_program.objective.constant, constant)
        self.assertTrue(
            (quadratic_program.objective.linear.to_array() == linear_coeffs
             ).all())
        self.assertTrue((quadratic_program.objective.quadratic.to_array() ==
                         quadratic_coeffs).all())
        self.assertEqual(quadratic_program.objective.sense,
                         QuadraticObjective.Sense.MAXIMIZE)

        self.assertEqual(quadratic_program.objective.evaluate(linear_coeffs),
                         931.0)

        grad_values = [0., 61., 122., 183., 244.]
        np.testing.assert_almost_equal(
            quadratic_program.objective.evaluate_gradient(linear_coeffs),
            grad_values)
示例#21
0
    def test_qubo_gas_int_simple(self):
        """Test for simple case, with 2 linear coeffs and no quadratic coeffs or constants."""

        # Input.
        model = Model()
        x_0 = model.binary_var(name='x0')
        x_1 = model.binary_var(name='x1')
        model.minimize(-x_0+2*x_1)
        op = QuadraticProgram()
        op.from_docplex(model)

        # Get the optimum key and value.
        n_iter = 8
        gmf = GroverOptimizer(4, num_iterations=n_iter, quantum_instance=self.sv_simulator)
        results = gmf.solve(op)
        self.validate_results(op, results)

        self.assertIsNotNone(results.operation_counts)
        self.assertEqual(results.n_input_qubits, 2)
        self.assertEqual(results.n_output_qubits, 4)
示例#22
0
def hamiltonian_calculator(cellular_potts_matrix, area_coeff,
                           area_of_cell_dict, perimeter_coeff,
                           perimeter_of_cell_dict):
    mdl = Model()
    A_0 = mdl.integer_var(lb=min(area_of_cell_dict) - 1,
                          ub=max(area_of_cell_dict) + 1,
                          name="A")
    P_0 = mdl.integer_var(lb=min(perimeter_of_cell_dict) - 1,
                          ub=max(perimeter_of_cell_dict) + 1,
                          name="P")
    objective_1 = area_coeff * mdl.sum(
        [value - A_0 for key, value in area_of_cell_dict.items()])**2
    objective_2 = perimeter_coeff * mdl.sum(
        [value - P_0 for key, value in perimeter_of_cell_dict.items()])**2
    objective_3 = mdl.sum(get_interaction(cellular_potts_matrix))
    objective = objective_1 + objective_2 + objective_3
    mdl.minimize(objective)
    qp = QuadraticProgram()
    qp.from_docplex(mdl)
    # print(qp.export_as_lp_string())
    return qp
    def test_init_default(self):
        """ test init with default values."""

        quadratic_program = QuadraticProgram()
        name = 'variable'

        variable = Variable(quadratic_program, name)

        self.assertEqual(variable.name, name)
        self.assertEqual(variable.lowerbound, 0)
        self.assertEqual(variable.upperbound, INFINITY)
        self.assertEqual(variable.vartype, Variable.Type.CONTINUOUS)
示例#24
0
    def test_slsqp_optimizer(self):
        """ Generic SLSQP Optimizer Test. """

        problem = QuadraticProgram()
        problem.continuous_var(upperbound=4)
        problem.continuous_var(upperbound=4)
        problem.linear_constraint(linear=[1, 1], sense='=', rhs=2)
        problem.minimize(linear=[2, 2], quadratic=[[2, 0.25], [0.25, 0.5]])

        # solve problem with SLSQP
        slsqp = SlsqpOptimizer(trials=3)
        result = slsqp.solve(problem)

        self.assertAlmostEqual(result.fval, 5.8750)
    def test_converter_list(self):
        """Test converter list"""
        op = QuadraticProgram()
        op.integer_var(0, 3, "x")
        op.binary_var('y')

        op.maximize(linear={'x': 1, 'y': 2})
        op.linear_constraint(linear={
            'y': 1,
            'x': 1
        },
                             sense='LE',
                             rhs=3,
                             name='xy_leq')

        # construct minimum eigen optimizer
        min_eigen_solver = NumPyMinimumEigensolver()
        min_eigen_optimizer = MinimumEigenOptimizer(min_eigen_solver)
        # a single converter
        qp2qubo = QuadraticProgramToQubo()
        recursive_min_eigen_optimizer = RecursiveMinimumEigenOptimizer(
            min_eigen_optimizer, min_num_vars=2, converters=qp2qubo)
        result = recursive_min_eigen_optimizer.solve(op)
        self.assertEqual(result.fval, 4)
        # a list of converters
        ineq2eq = InequalityToEquality()
        int2bin = IntegerToBinary()
        penalize = LinearEqualityToPenalty()
        converters = [ineq2eq, int2bin, penalize]
        recursive_min_eigen_optimizer = RecursiveMinimumEigenOptimizer(
            min_eigen_optimizer, min_num_vars=2, converters=converters)
        result = recursive_min_eigen_optimizer.solve(op)
        self.assertEqual(result.fval, 4)
        # invalid converters
        with self.assertRaises(TypeError):
            invalid = [qp2qubo, "invalid converter"]
            RecursiveMinimumEigenOptimizer(min_eigen_optimizer,
                                           min_num_vars=2,
                                           converters=invalid)
示例#26
0
    def test_integer_variables(self):
        """Tests ADMM with integer variables."""
        mdl = Model('integer-variables')

        v = mdl.integer_var(lb=5, ub=20, name='v')
        w = mdl.continuous_var(name='w', lb=0.)

        mdl.minimize(v + w)
        op = QuadraticProgram()
        op.from_docplex(mdl)

        solver = ADMMOptimizer()
        solution = solver.solve(op)

        self.assertIsNotNone(solution)
        self.assertIsInstance(solution, ADMMOptimizationResult)
        self.assertIsNotNone(solution.x)
        np.testing.assert_almost_equal([5., 0.], solution.x, 3)
        self.assertIsNotNone(solution.fval)
        np.testing.assert_almost_equal(5., solution.fval, 3)
        self.assertIsNotNone(solution.state)
        self.assertIsInstance(solution.state, ADMMState)
示例#27
0
    def test_min_eigen_optimizer_with_filter(self, config):
        """ Min Eigen Optimizer Test """
        try:
            # unpack configuration
            filename, lowerbound, fval, status = config

            # get minimum eigen solver
            min_eigen_solver = NumPyMinimumEigensolver()

            # set filter
            # pylint: disable=unused-argument
            def filter_criterion(x, v, aux):
                return v > lowerbound

            min_eigen_solver.filter_criterion = filter_criterion

            # construct minimum eigen optimizer
            min_eigen_optimizer = MinimumEigenOptimizer(min_eigen_solver)

            # load optimization problem
            problem = QuadraticProgram()
            lp_file = self.get_resource_path(path.join('resources', filename))
            problem.read_from_lp_file(lp_file)

            # solve problem
            result = min_eigen_optimizer.solve(problem)
            self.assertIsNotNone(result)

            # analyze results
            self.assertAlmostEqual(fval, result.fval)
            self.assertEqual(status, result.status)

            # check that eigensolver result is present
            self.assertIsNotNone(result.min_eigen_solver_result)
        except MissingOptionalLibraryError as ex:
            self.skipTest(str(ex))
        except RuntimeError as ex:
            self.fail(str(ex))
    def test_converter_list(self):
        """Test converters list"""
        # Input.
        model = Model()
        x_0 = model.binary_var(name='x0')
        x_1 = model.binary_var(name='x1')
        model.maximize(-x_0 + 2 * x_1)
        op = QuadraticProgram()
        op.from_docplex(model)

        # Get the optimum key and value.
        n_iter = 8
        # a single converter.
        qp2qubo = QuadraticProgramToQubo()
        gmf = GroverOptimizer(4,
                              num_iterations=n_iter,
                              quantum_instance=self.q_instance,
                              converters=qp2qubo)
        results = gmf.solve(op)
        self.validate_results(op, results)
        # a list of converters
        ineq2eq = InequalityToEquality()
        int2bin = IntegerToBinary()
        penalize = LinearEqualityToPenalty()
        converters = [ineq2eq, int2bin, penalize]
        gmf = GroverOptimizer(4,
                              num_iterations=n_iter,
                              quantum_instance=self.q_instance,
                              converters=converters)
        results = gmf.solve(op)
        self.validate_results(op, results)
        # invalid converters
        with self.assertRaises(TypeError):
            invalid = [qp2qubo, "invalid converter"]
            GroverOptimizer(4,
                            num_iterations=n_iter,
                            quantum_instance=self.q_instance,
                            converters=invalid)
示例#29
0
    def test_admm_ex5(self):
        """Example 5 as a unit test. Example 5 is reported in:
        Gambella, C., & Simonetto, A. (2020).
        Multi-block ADMM Heuristics for Mixed-Binary Optimization on Classical
        and Quantum Computers.
        arXiv preprint arXiv:2001.02069."""
        mdl = Model('ex5')

        # pylint:disable=invalid-name
        v = mdl.binary_var(name='v')
        w = mdl.binary_var(name='w')
        t = mdl.binary_var(name='t')

        mdl.minimize(v + w + t)
        mdl.add_constraint(2 * v + 2 * w + t <= 3, "cons1")
        mdl.add_constraint(v + w + t >= 1, "cons2")
        mdl.add_constraint(v + w == 1, "cons3")

        op = QuadraticProgram()
        op.from_docplex(mdl)

        admm_params = ADMMParameters(rho_initial=1001,
                                     beta=1000,
                                     factor_c=900,
                                     maxiter=100,
                                     three_block=False)

        solver = ADMMOptimizer(params=admm_params)
        solution = solver.solve(op)

        self.assertIsNotNone(solution)
        self.assertIsInstance(solution, ADMMOptimizationResult)
        self.assertIsNotNone(solution.x)
        np.testing.assert_almost_equal([1., 0., 1.], solution.x, 3)
        self.assertIsNotNone(solution.fval)
        np.testing.assert_almost_equal(2., solution.fval, 3)
        self.assertIsNotNone(solution.state)
        self.assertIsInstance(solution.state, ADMMState)
示例#30
0
    def test_admm_maximization(self):
        """Tests a simple maximization problem using ADMM optimizer"""
        mdl = Model('simple-max')
        c = mdl.continuous_var(lb=0, ub=10, name='c')
        x = mdl.binary_var(name='x')
        mdl.maximize(c + x * x)
        op = QuadraticProgram()
        op.from_docplex(mdl)

        admm_params = ADMMParameters()

        solver = ADMMOptimizer(params=admm_params,
                               continuous_optimizer=CobylaOptimizer())
        solution = solver.solve(op)
        self.assertIsNotNone(solution)
        self.assertIsInstance(solution, ADMMOptimizationResult)

        self.assertIsNotNone(solution.x)
        np.testing.assert_almost_equal([10, 0], solution.x, 3)
        self.assertIsNotNone(solution.fval)
        np.testing.assert_almost_equal(10, solution.fval, 3)
        self.assertIsNotNone(solution.state)
        self.assertIsInstance(solution.state, ADMMState)