English
Languages
English
Japanese
German
Korean
Portuguese, Brazilian
French
Shortcuts

Source code for qiskit.optimization.applications.ising.common

# This code is part of Qiskit.
#
# (C) Copyright IBM 2018, 2020.
#
# This code is licensed under the Apache License, Version 2.0. You may
# obtain a copy of this license in the LICENSE.txt file in the root directory
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
#
# Any modifications or derivative works of this code must retain this
# copyright notice, and modified files need to carry a notice indicating
# that they have been altered from the originals.

""" common module """

from collections import OrderedDict

import numpy as np

from qiskit.aqua import aqua_globals
from qiskit.aqua.operators import StateFn


[docs]def random_graph(n, weight_range=10, edge_prob=0.3, negative_weight=True, savefile=None, seed=None): """Generate random Erdos-Renyi graph. Args: n (int): number of nodes. weight_range (int): weights will be smaller than this value, in absolute value. range: [1, weight_range). edge_prob (float): probability of edge appearing. negative_weight (bool): allow to have edge with negative weights savefile (str or None): name of file where to save graph. seed (int or None): random seed - if None, will not initialize. Returns: numpy.ndarray: adjacency matrix (with weights). """ assert weight_range >= 0 if seed: aqua_globals.random_seed = seed w = np.zeros((n, n)) m = 0 for i in range(n): for j in range(i + 1, n): if aqua_globals.random.random() <= edge_prob: w[i, j] = aqua_globals.random.integers(1, weight_range) if aqua_globals.random.random() >= 0.5 and negative_weight: w[i, j] *= -1 m += 1 w += w.T if savefile: with open(savefile, 'w') as outfile: outfile.write('{} {}\n'.format(n, m)) for i in range(n): for j in range(i + 1, n): if w[i, j] != 0: outfile.write('{} {} {}\n'.format(i + 1, j + 1, w[i, j])) return w
[docs]def random_number_list(n, weight_range=100, savefile=None, seed=None): """Generate a set of positive integers within the given range. Args: n (int): size of the set of numbers. weight_range (int): maximum absolute value of the numbers. savefile (str or None): write numbers to this file. seed (Union(int,None)): random seed - if None, will not initialize. Returns: numpy.ndarray: the list of integer numbers. """ if seed: aqua_globals.random_seed = seed number_list = aqua_globals.random.integers(low=1, high=(weight_range + 1), size=n) if savefile: with open(savefile, 'w') as outfile: for i in range(n): outfile.write('{}\n'.format(number_list[i])) return number_list
[docs]def read_numbers_from_file(filename): """Read numbers from a file Args: filename (str): name of the file. Returns: numpy.ndarray: list of numbers as a numpy.ndarray. """ numbers = [] with open(filename) as infile: for line in infile: assert int(round(float(line))) == float(line) numbers.append(int(round(float(line)))) return np.array(numbers)
[docs]def parse_gset_format(filename): """Read graph in Gset format from file. Args: filename (str): name of the file. Returns: numpy.ndarray: adjacency matrix as a 2D numpy array. """ n = -1 with open(filename) as infile: header = True m = -1 count = 0 for line in infile: v = map(lambda e: int(e), line.split()) # pylint: disable=unnecessary-lambda if header: n, m = v w = np.zeros((n, n)) header = False else: s__, t__, _ = v s__ -= 1 # adjust 1-index t__ -= 1 # ditto w[s__, t__] = t__ count += 1 assert m == count w += w.T return w
[docs]def get_gset_result(x): """Get graph solution in Gset format from binary string. Args: x (numpy.ndarray) : binary string as numpy array. Returns: Dict[int, int]: graph solution in Gset format. """ return {i + 1: 1 - x[i] for i in range(len(x))}
[docs]def sample_most_likely(state_vector): """Compute the most likely binary string from state vector. Args: state_vector (numpy.ndarray or dict): state vector or counts. Returns: numpy.ndarray: binary string as numpy.ndarray of ints. """ if isinstance(state_vector, (OrderedDict, dict)): # get the binary string with the largest count binary_string = sorted(state_vector.items(), key=lambda kv: kv[1])[-1][0] x = np.asarray([int(y) for y in reversed(list(binary_string))]) return x elif isinstance(state_vector, StateFn): binary_string = list(state_vector.sample().keys())[0] x = np.asarray([int(y) for y in reversed(list(binary_string))]) return x else: n = int(np.log2(state_vector.shape[0])) k = np.argmax(np.abs(state_vector)) x = np.zeros(n) for i in range(n): x[i] = k % 2 k >>= 1 return x

© Copyright 2020, Qiskit Development Team. Last updated on 2021/05/25.

Built with Sphinx using a theme provided by Read the Docs.