File size: 3,162 Bytes
4da8a9d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c83b207
4da8a9d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import numpy as np
from tqdm import tqdm
from quantum_perceptron.utils import (
    calculate_succ_probability
)
from quantum_perceptron.perceptron import Perceptron


def generate_training_samples(data: np.ndarray,
                              num_positive_samples: int,
                              num_negative_samples: int) -> np.ndarray:
    """
    From the entire dataset, generate training samples.
    """
    pos_inds = np.where(data[:, 1] == 1)[0]
    neg_inds = np.where(data[:, 1] == 0)[0]

    if len(pos_inds) < num_positive_samples:
        num_positive_samples = len(pos_inds)
    if len(neg_inds) < num_negative_samples:
        num_negative_samples = len(neg_inds)

    sampled_neg_inds = np.random.choice(neg_inds,
                                        num_negative_samples,
                                        replace=False)
    sampled_pos_inds = np.random.choice(pos_inds,
                                        num_positive_samples,
                                        replace=False)

    new_data = np.vstack((data[sampled_pos_inds], data[sampled_neg_inds]))
    np.random.shuffle(new_data)
    return new_data


def generate_dataset(num_qubits: int = 4,
                     fixed_weight: int = 626,
                     dir_path: str = './data/',
                     threshold: float = 0.5,
                     num_runs: int = 8192,
                     create_training_samples: bool = True,
                     num_pos_train_samples: int = 50,
                     num_neg_train_samples: int = 3000):
    """
    Generate training dataset with fixed weight value.

    Args:
        num_qubits: `int` representing number of qubits.
        fixed_weight: `int` representing the fixed weight value.
        dir_path: `str` representing the directory path.
    """
    num_samples = np.power(2, np.power(2, num_qubits))
    data = np.empty([num_samples, 2], dtype=np.int64)
    p = Perceptron(num_qubits, fixed_weight, 0)

    for i in tqdm(range(num_samples)):
        p.input = i
        p.build_circuit()
        prob = calculate_succ_probability(p.measure_circuit(num_runs))
        if prob > threshold:
            label = 1
        else:
            label = 0
        data[i][0] = i
        data[i][1] = label

    print("Number of positive samples: {}".format(
        np.sum(data[:, 1] == 1)
    ))
    print("Number of negative samples: {}".format(
        np.sum(data[:, 1] == 0)
    ))

    filename = 'sample_space_qubits_{}_fweight_{}.txt'.format(
        num_qubits, fixed_weight
    )
    np.savetxt(dir_path + filename, data, fmt='%i,%i', delimiter=',')
    print('Saved data to {}'.format(dir_path + filename))

    if create_training_samples:
        train_data = generate_training_samples(
            data, num_pos_train_samples, num_neg_train_samples
        )
        train_filename = 'train_space_qubits_{}_fweight_{}.txt'.format(
            num_qubits, fixed_weight
        )
        np.savetxt(dir_path + train_filename,
                   train_data,
                   fmt='%i,%i',
                   delimiter=',')
        print('Saved training data to {}'.format(dir_path + train_filename))