Exemple #1
0
    def test_parameter_prefix(self):
        """Test the Parameter prefix"""
        encoding_pauli = PauliFeatureMap(feature_dimension=2,
                                         reps=2,
                                         paulis=["ZY"],
                                         parameter_prefix="p")
        encoding_z = ZFeatureMap(feature_dimension=2,
                                 reps=2,
                                 parameter_prefix="q")
        encoding_zz = ZZFeatureMap(feature_dimension=2,
                                   reps=2,
                                   parameter_prefix="r")
        x = ParameterVector("x", 2)
        y = Parameter("y")

        self.assertEqual(
            str(encoding_pauli.parameters),
            "ParameterView([ParameterVectorElement(p[0]), ParameterVectorElement(p[1])])",
        )
        self.assertEqual(
            str(encoding_z.parameters),
            "ParameterView([ParameterVectorElement(q[0]), ParameterVectorElement(q[1])])",
        )
        self.assertEqual(
            str(encoding_zz.parameters),
            "ParameterView([ParameterVectorElement(r[0]), ParameterVectorElement(r[1])])",
        )

        encoding_pauli_param_x = encoding_pauli.assign_parameters(x)
        encoding_z_param_x = encoding_z.assign_parameters(x)
        encoding_zz_param_x = encoding_zz.assign_parameters(x)

        self.assertEqual(
            str(encoding_pauli_param_x.parameters),
            "ParameterView([ParameterVectorElement(x[0]), ParameterVectorElement(x[1])])",
        )
        self.assertEqual(
            str(encoding_z_param_x.parameters),
            "ParameterView([ParameterVectorElement(x[0]), ParameterVectorElement(x[1])])",
        )
        self.assertEqual(
            str(encoding_zz_param_x.parameters),
            "ParameterView([ParameterVectorElement(x[0]), ParameterVectorElement(x[1])])",
        )

        encoding_pauli_param_y = encoding_pauli.assign_parameters({1, y})
        encoding_z_param_y = encoding_z.assign_parameters({1, y})
        encoding_zz_param_y = encoding_zz.assign_parameters({1, y})

        self.assertEqual(str(encoding_pauli_param_y.parameters),
                         "ParameterView([Parameter(y)])")
        self.assertEqual(str(encoding_z_param_y.parameters),
                         "ParameterView([Parameter(y)])")
        self.assertEqual(str(encoding_zz_param_y.parameters),
                         "ParameterView([Parameter(y)])")
def run_exp(
    method='qrac',
    epochs=300,
    positive_factor=1 / 3,
    depth=4,
    seed=10598,
    reg=0.,
    model_directory=None,
    result_directory=None,
    real_device=False,
):
    assert method in [
        'qrac', 'qrac_zz', 'te', 'te_zz', 'zz_dis', 'zz_dis_cont'
    ], f"method {method} not exist"

    if model_directory is None:
        model_directory = f'models/Titanic_{method}_{epochs}_{positive_factor}_{depth}_{seed}_{reg}_model'
    if result_directory is None:
        result_directory = f'results/Titanic_{method}_{epochs}_{positive_factor}_{depth}_{seed}_{reg}_result'

    all_discrete = method in ['qrac', 'te', 'zz_dis']

    df_train, _, y_train, _ = load_titanic_pd('data/Titanic_train.csv',
                                              'data/Titanic_test.csv',
                                              as_category=all_discrete)

    # Get mvp column
    mvp_col = ['Sex', 'Age', 'Pclass', 'Fare']
    df_train = df_train[mvp_col]
    vqc_gen = None
    feature_map = None
    var_form = None
    X_train = None
    if method in ['zz_dis']:
        X_train = df_train.values
        feature_map = ZZFeatureMap(4)
        var_form = RYRZ(4, depth=depth)
        vqc_gen = VQC

    if method in ['zz_dis_cont']:
        df_train['Fare'] = np.log(df_train['Fare'] + 1)
        df_train['Age'] = df_train['Age'] / 60
        X_train = df_train.values
        feature_map = ZZFeatureMap(4)
        var_form = RYRZ(4, depth=depth)
        vqc_gen = VQC

    if method in ['qrac', 'te']:
        X_train = binary_encoder(df_train.values)
        print(X_train)
        num_qubit = len(X_train[0]) // 3
        if method == 'qrac':
            feature_map = CustomFeatureMap('ALL3in1', 1, num_qubit)
            var_form = RYRZ(num_qubit, depth=depth)
            vqc_gen = VQC
        if method == 'te':
            feature_map = QuantumCircuit(num_qubit)
            var_form = MyRYRZ(num_qubit, depth=depth)
            vqc_gen = MyVQC

    if method in ['qrac_zz']:
        df_train['Fare'] = np.log(df_train['Fare'] + 1)
        df_train['Age'] = df_train['Age'] / 60
        X_train_num = U3gate_input_encoder(df_train[['Sex', 'Pclass']].values)
        X_train_con = df_train[['Age', 'Fare']].values
        X_train = np.concatenate([X_train_con, X_train_num], axis=1)

        X = [Parameter(f'x[{i}]') for i in range(X_train_num.shape[1])]
        qr = QuantumRegister(1, 'cat')
        qc = QuantumCircuit(qr)

        for i in range(1):
            qc.u3(X[2 * i], X[2 * i + 1], 0, i)
        feature_map_cat = qc

        X1 = Parameter('x[2]')
        X2 = Parameter('x[3]')
        feature_map_con = ZZFeatureMap(2)
        feature_map_con = feature_map_con.assign_parameters([X1, X2])

        feature_map = feature_map_con.combine(feature_map_cat)
        var_form = RYRZ(3, depth=depth)
        vqc_gen = VQC

    if method in ['te_zz']:
        df_train['Fare'] = np.log(df_train['Fare'] + 1)
        df_train['Age'] = df_train['Age'] / 60
        X_train_num = binary_encoder(df_train[['Sex', 'Pclass']].values)
        X_train_con = df_train[['Age', 'Fare']].values
        print(X_train_num[:, None])
        print(X_train_con)

        X_train = np.array([[x, y] for x, y in zip(X_train_num, X_train_con)])

        X1 = Parameter('x[0]')
        X2 = Parameter('x[1]')
        feature_map_con = ZZFeatureMap(2)
        feature_map_con = feature_map_con.assign_parameters([X1, X2])

        qr = QuantumRegister(1, 'cat')
        feature_map_num = QuantumCircuit(qr)

        feature_map = feature_map_num.combine(feature_map_con)
        var_form = MyRYRZ_zz(1, 2, depth=depth)
        vqc_gen = MyVQC_zz

    assert feature_map is not None, "Feature map is none"
    assert var_form is not None, "Varform is none"

    if real_device:
        # Please fix these line...
        provider = IBMQ.get_provider()
        backend = provider.get_backend('ibmq_london')
    else:
        backend = QasmSimulator({"method": "statevector_gpu"})

    def optimizer_gen():
        return SPSA(epochs)

    result = kfold_vqc(feature_map,
                       var_form,
                       backend,
                       optimizer_gen,
                       seed,
                       X_train,
                       y_train,
                       model_directory=model_directory,
                       result_directory=result_directory,
                       k=4,
                       positivedata_duplicate_ratio=positive_factor,
                       vqc_gen=vqc_gen)

    return_result = {
        'train_acc': result['Training accuracies (mean)'][-1],
        'train_f1': result['Training F1 scores (mean)'][-1],
        'test_acc': result['Test accuracies (mean)'][-1],
        'test_f1': result['Test F1 scores (mean)'][-1]
    }

    return return_result
Exemple #3
0
    def setUp(self):
        super().setUp()
        self.seed = 1376
        aqua_globals.random_seed = self.seed
        self.training_data = {
            'A': np.asarray([[2.95309709, 2.51327412],
                             [3.14159265, 4.08407045]]),
            'B': np.asarray([[4.08407045, 2.26194671],
                             [4.46106157, 2.38761042]])
        }
        self.testing_data = {
            'A': np.asarray([[3.83274304, 2.45044227]]),
            'B': np.asarray([[3.89557489, 0.31415927]])
        }

        self.ref_opt_params = np.array([
            10.03814083, -12.22048954, -7.58026833, -2.42392954, 12.91555293,
            13.44064652, -2.89951454, -10.20639406, 0.81414546, -1.00551752,
            -4.7988307, 14.00831419, 8.26008064, -7.07543736, 11.43368677,
            -5.74857438
        ])
        self.ref_train_loss = 0.69366523
        self.ref_prediction_a_probs = [[0.79882812, 0.20117188]]
        self.ref_prediction_a_label = [0]

        # ignore warnings from creating VariationalForm and FeatureMap objects
        warnings.filterwarnings('ignore', category=DeprecationWarning)
        var_form_ryrz = RYRZ(2, depth=3)
        feature_map = SecondOrderExpansion(2, depth=2)
        warnings.filterwarnings('always', category=DeprecationWarning)

        library_ryrz = TwoLocal(2, ['ry', 'rz'],
                                'cz',
                                reps=3,
                                insert_barriers=True)
        theta = ParameterVector('theta', var_form_ryrz.num_parameters)
        circuit_ryrz = var_form_ryrz.construct_circuit(theta)
        resorted = []
        for i in range(4):
            layer = library_ryrz.ordered_parameters[4 * i:4 * (i + 1)]
            resorted += layer[::2]
            resorted += layer[1::2]
        library_ryrz.assign_parameters(dict(zip(resorted, theta)),
                                       inplace=True)
        self._sorted_wavefunction_params = list(theta)

        self.ryrz_wavefunction = {
            'wrapped': var_form_ryrz,
            'circuit': circuit_ryrz,
            'library': library_ryrz
        }

        library_circuit = ZZFeatureMap(2, reps=2)
        x = ParameterVector('x', 2)
        circuit = feature_map.construct_circuit(x)
        self._sorted_data_params = list(x)
        library_circuit.assign_parameters(x, inplace=True)

        self.data_preparation = {
            'wrapped': feature_map,
            'circuit': circuit,
            'library': library_circuit
        }