Esempio n. 1
0
    def solve_multi_data(self, verbose=False, target=None, num_repeats=200):
        if self.qubo is None:
            self.pre_process()
        if verbose:
            print("Solving multiple solutions of MAX-SMTI with Qbsolv")
        if self.qubo_size == 0 or self.qubo_size == 1:
            return [Solution(self.matching, self.pre_evaluated_solution)]

        if self.mode == "np":  # more memory intensive
            response = QBSolv().sample(BinaryQuadraticModel.from_numpy_matrix(self.qubo), num_repeats=num_repeats,
                                       target=target, algorithm=SOLUTION_DIVERSITY)
        elif self.mode == "bqm":
            response = QBSolv().sample(self.qubo, num_repeats=num_repeats, target=target)
        else:
            raise Exception(f"mode: {self.mode} cannot be solved yet")

        if verbose:
            print(response)
            for index, sample in enumerate(list(response.samples())):
                match, valid = self.encode(sample)
                print(index, ":", Solution(self.matching, match).is_stable(), match, valid)

        samples = pd.DataFrame()
        for sample, energy, occ in response.record:
            match, valid = self.encode_qa(sample.tolist())
            stable, size = Solution(self.matching, match).is_stable()
            samples = samples.append({"match": match, "sample": sample.tolist(),
                                      "energy": energy, "occ": occ,
                                      "valid": valid, "stable": stable, "size": size}, ignore_index=True)
        return samples
Esempio n. 2
0
    def solve_multi(self, verbose=False, num_repeats=200):
        if self.qubo is None:
            self.pre_process()

        if verbose:
            print("Solving multiple solutions of MAX-SMTI with Qbsolv")
        if self.qubo_size == 0 or self.qubo_size == 1:
            return [Solution(self.matching, self.pre_evaluated_solution)]

        if self.mode == "np":  # more memory intensive
            response = QBSolv().sample(BinaryQuadraticModel.from_numpy_matrix(self.qubo), num_repeats=num_repeats)
        elif self.mode == "bqm":
            response = QBSolv().sample(self.qubo, num_repeats=num_repeats)
        else:
            raise Exception(f"mode: {self.mode} cannot be solved yet")

        if verbose:
            print(response)
            for index, sample in enumerate(list(response.samples())):
                match, valid = self.encode(sample)
                print(index, ":", Solution(self.matching, match).is_stable(), match, valid)
        opt_en = self.get_optimal_energy(self.matching.size)
        solutions = []
        for sample, energy, occ in response.record:
            if energy == opt_en:
                match, valid = self.encode_qa(sample.tolist())
                if verbose and not valid:
                    print("Invalid encoding and valid energy!")
                solutions.append(Solution(self.matching, match))
        return solutions
Esempio n. 3
0
    def solve(self, verbose=False, num_repeats=50, target=None, debug=False):
        if self.qubo is None:
            self.pre_process()
        if verbose:
            print("Solving MAX-SMTI with Qbsolv")
        if self.qubo_size == 0 or self.qubo_size == 1:
            if debug:
                return None
            return Solution(self.matching, self.pre_evaluated_solution)

        if self.mode == "np":  # more memory intensive
            response = QBSolv().sample(BinaryQuadraticModel.from_numpy_matrix(self.qubo), num_repeats=num_repeats,
                                       target=target)
        elif self.mode == "bqm":
            response = QBSolv().sample(self.qubo, num_repeats=num_repeats, target=target)
        else:
            raise Exception(f"mode: {self.mode} cannot be solved yet")
        if debug:
            return response
        if verbose:
            print(response)
            for index, sample in enumerate(list(response.samples())):
                match, valid = self.encode(sample)
                print(index, ":", Solution(self.matching, match).is_stable(), match, valid)
        energies = list(response.data_vectors['energy'])
        min_en = min(energies)
        ret_match, valid = self.encode(list(response.samples())[energies.index(min_en)])
        return Solution(self.matching, ret_match, energy=min_en)
Esempio n. 4
0
 def solve_multi(self, verbose=True, num_repeats=100, target=None):
     if self.qubo is None:
         self.create_qubo()
     if self.mode == "np":  # more memory intensive
         response = QBSolv().sample(BinaryQuadraticModel.from_numpy_matrix(self.qubo), target=target)
     elif self.mode == "bqm":
         response = QBSolv().sample(self.qubo, num_repeats=num_repeats, target=target)
     else:
         raise Exception(f"mode: {self.mode} cannot be solved yet")
     if verbose:
         print(response)
     n = self.matching.size
     stable_energy = -3 / 2 * self.p1 * (n - 1) * n
     energies = list(response.data_vectors['energy'])
     samples = enumerate(list(response.samples()))
     allowed_samples = [sample for idx, sample in samples if energies[idx] == stable_energy]
     return [Solution(self.matching, self.encode(sample)) for sample in allowed_samples]
Esempio n. 5
0
    def solve(self, verbose=False, num_repeats=100, target=None):
        if self.qubo is None:
            self.create_qubo()

        if self.mode == "np":  # more memory intensive
            response = QBSolv().sample(BinaryQuadraticModel.from_numpy_matrix(self.qubo), target=target)
        elif self.mode == "bqm":
            response = QBSolv().sample(self.qubo, num_repeats=num_repeats, target=target)
        else:
            raise Exception(f"mode: {self.mode} cannot be solved yet")
        if verbose:
            print(response)
        energies = list(response.data_vectors['energy'])
        min_en = min(energies)
        ret_match = self.encode(list(response.samples())[energies.index(min_en)])

        return Solution(self.matching, ret_match)