ashutosh1919's picture
Added code to generate data and train model
4da8a9d
raw
history blame
4.1 kB
import numpy as np
from typing import Dict, List, Optional
def assert_negative(data: int):
"""
General method to prevent negative values of integers.
"""
if data < 0:
raise ValueError("Currently we do not support negative data values.")
def get_bin_int(data: int, num_qubits: Optional[int] = None) -> str:
"""
Get binary representation of integer.
"""
assert_negative(data)
if num_qubits:
return bin(data)[2:].zfill(np.power(2, num_qubits))
return bin(data)[2:]
def assert_bits(data: int, num_bits: int):
"""
General method to prevent invalid number of bits.
"""
if len(get_bin_int(data)) > np.power(2, num_bits):
raise ValueError("data has more bits than num_bits")
def get_vector_from_int(data: int, num_qubits: int) -> np.ndarray:
"""
This method returns the vector where each element is (-1)^b_i where b_i is
the bit value at index i.
Args:
data: `int` representing data value
(correspponding to input or weight vector)
num_qubits: `int` representing number of qubits.
Returns: Vector in form of `np.ndarray`.
"""
assert_negative(data)
assert_bits(data, num_qubits)
bin_data = get_bin_int(data, num_qubits)
data_vector = np.empty(np.power(2, num_qubits))
for i, bit in enumerate(bin_data):
data_vector[i] = np.power(-1, int(bit))
return data_vector
def get_int_from_vector(data_vector: np.ndarray, num_qubits: int) -> int:
"""
Get the integer data value from the vector.
Args:
data_vector: `np.ndarray` representing the vector.
num_qubits: `int` representing number of qubits.
Returns: `int` representing the data value.
"""
if len(data_vector) != np.power(2, num_qubits):
raise ValueError("The vector length is not equal to 2^num_qubits")
data_bin_vec = []
for i, val in enumerate(data_vector):
if val == -1:
data_bin_vec.append('1')
elif val == 1:
data_bin_vec.append('0')
data_bin = ''.join(data_bin_vec)
return int(data_bin, 2)
def get_possible_state_strings(num_bits: int) -> np.ndarray:
"""
Get all the state bit strings corresponding to given number of bits.
For example for 2 bits, we get ['00', '01', '10', '11'].
Note that we are only allowing bits < 10 as of now.
Args:
num_bits: `int` representing number of bits
Returns: `np.ndarray` containing all states of `num_bits` bits.
"""
assert_negative(num_bits)
if num_bits == 0:
raise ValueError("Number of bits cannot be 0")
if num_bits >= 10:
raise ValueError("We are not currently supporting bits >= 10")
total_states = np.power(2, num_bits)
states = np.empty(total_states, dtype="<U10")
state_template = "{:0" + str(num_bits) + "b}"
for i in range(total_states):
states[i] = state_template.format(i)
return states
def get_ones_counts_to_states(states: np.ndarray) -> Dict[int, List[int]]:
"""
Get the mapping from number of 1's to the states which has that many number
of 1 bits.
Args:
states: `np.ndarray` containing the bit strings of the states.
Returns: `dict` containing the mappings from count of 1's to the list
of states.
"""
if len(states) == 0:
raise ValueError("The states array is empty")
ones_count: Dict[int, List[int]] = dict()
for i in range(len(states)):
ct = states[i].count('1')
if ct not in ones_count:
ones_count[ct] = []
ones_count[ct].append(i)
return ones_count
def calculate_succ_probability(counts: Dict[str, int]) -> float:
"""
Calculate the success probability from the counts of the states.
Args:
counts: `dict` containing the counts of the states.
Returns: `float` representing the success probability.
"""
if len(counts) == 0:
raise ValueError("The counts dict is empty")
total_count = sum(counts.values())
succ_count = counts.get('1', 0)
return succ_count / total_count