Download

Source code for eqc_models.utilities.general

  • # (C) Quantum Computing Inc., 2024.
  • import numpy as np
  • from eqc_models.utilities.polynomial import convert_hamiltonian_to_polynomial
  • [docs]
  • def create_json_problem(
  • A: np.array,
  • B: np.array,
  • C: np.array,
  • D: np.array,
  • num_vars: int,
  • sum_constraint: float = None,
  • num_levels: int = None,
  • ):
  • """Converts a hamiltonian of up to fourth order to a polynomial.
  • D_{ijkl} x_i x_j x_k x_l + C_{ijk} x_i x_j x_k + B_{ij} x_i x_j
  • + A_i x_i
  • Input:
  • A: First order hamiltonian.
  • B: Second order hamiltonian.
  • C: Third order hamiltonian.
  • D: Fourth order hamiltonian.
  • num_vars: Number of variables.
  • Output:
  • Problem in json format.
  • """
  • if D is not None:
  • assert len(D.shape) == 4, "Incorrect shape!"
  • assert D.shape[0] == num_vars, "Inconsistent dimensions!"
  • assert D.shape[1] == num_vars, "Inconsistent dimensions!"
  • assert D.shape[2] == num_vars, "Inconsistent dimensions!"
  • assert D.shape[3] == num_vars, "Inconsistent dimensions!"
  • degree = 4
  • elif C is not None:
  • assert len(C.shape) == 3, "Incorrect shape!"
  • assert C.shape[0] == num_vars, "Inconsistent dimensions!"
  • assert C.shape[1] == num_vars, "Inconsistent dimensions!"
  • assert C.shape[2] == num_vars, "Inconsistent dimensions!"
  • degree = 3
  • elif B is not None:
  • assert len(B.shape) == 2, "Incorrect shape!"
  • assert B.shape[0] == num_vars, "Inconsistent dimensions!"
  • assert B.shape[1] == num_vars, "Inconsistent dimensions!"
  • degree = 2
  • elif A is not None:
  • assert len(A.shape) in [1, 2], "Incorrect shape!"
  • if len(A.shape) == 2:
  • if A.shape[1] == 1:
  • A = A.reshape((A.shape[0]))
  • else:
  • assert False, "Incorrect shape!"
  • assert A.shape[0] == num_vars, "Inconsistent dimensions!"
  • degree = 1
  • else:
  • assert False, "No hamiltonian provided!"
  • poly_indices, poly_coefs = convert_hamiltonian_to_polynomial(
  • A, B, C, D, num_vars,
  • )
  • json_object = {
  • "degree": degree,
  • "num_variables": num_vars,
  • "poly_indices": poly_indices,
  • "poly_coefficients": poly_coefs,
  • }
  • if num_levels is not None:
  • json_object["levels"] = [num_levels] * num_vars
  • if sum_constraint is not None:
  • json_object["sum_constraint"] = sum_constraint
  • return json_object