Example #1
0
    def propagationConstraint(self, network: Network, input_data,
                              output_data, anneal_inputs=False,
                              lagrange = 1):
        # training data
        # TODO: pass training data by argument and process function in loop
        values = Array(input_data)
        expected = Array(output_data)

        # forward propagation
        for layer_num, layer in enumerate(network.layers[:-1]):

            # if you want to ensure input layer will not be annealed
            if layer_num == 0 and not anneal_inputs:
                values = values.dot(network.weights[layer_num])
                continue

            qubit_values = []
            nodes = {self.get_label(layer_num, i) for i in range(layer)}

            # TODO: delete zeros from matrices to speed up computation
            for node in nodes:
                # making sure the variable is in final equation
                if node not in self.H_vars:
                    x_var = Binary(node)
                    self.H_vars.add(x_var)
                else:
                    x_var = H_vars[node]

                qubit_values.append(x_var)
            print(self.H_vars)

            values *= Array(qubit_values)
            values = values.dot(network.weights[layer_num])

        # values is output array at this point
        self.H += sum((values - expected)*(values - expected))
    def test_array_dot(self):

        # inner product of 1-D arrays
        array_a = Array([Binary('a'), Binary('b')])
        array_b = Array([Binary('c'), Binary('d')])
        expected = ((Binary('a') * Binary('c')) + (Binary('b') * Binary('d')))
        self.assertTrue(expected == array_a.dot(array_b))

        # dot product of 1-D array and N-D array
        array_a = Array([[Binary('a'), Binary('b')],
                         [Binary('c'), Binary('d')]])
        array_b = Array([Binary('e'), Binary('f')])
        expected = Array([
            ((Binary('a') * Binary('e')) + (Binary('b') * Binary('f'))),
            ((Binary('c') * Binary('e')) + (Binary('d') * Binary('f')))
        ])
        self.assertTrue(expected == array_a.dot(array_b))

        # both are 2-D arrays
        array_a = Array([[Binary('a'), Binary('b')],
                         [Binary('c'), Binary('d')]])
        array_b = Array([[Binary('e'), Binary('f')],
                         [Binary('g'), Binary('h')]])
        expected = Array(
            [[((Binary('a') * Binary('e')) + (Binary('b') * Binary('g'))),
              ((Binary('a') * Binary('f')) + (Binary('b') * Binary('h')))],
             [((Binary('c') * Binary('e')) + (Binary('d') * Binary('g'))),
              ((Binary('c') * Binary('f')) + (Binary('d') * Binary('h')))]])
        self.assertTrue(expected == array_a.dot(array_b))

        # array_a is a  N-D array and array_b is an M-D array (where N, M>=2)
        array_a = Array.create('a', shape=(3, 2, 4), vartype='BINARY')
        array_b = Array.create('b', shape=(5, 4, 3), vartype='BINARY')
        i, j, k, m = (1, 1, 3, 2)
        self.assertTrue(
            array_a.dot(array_b)[i, j, k, m] == sum(array_a[i, j, :] *
                                                    array_b[k, :, m]))

        # array_a is 1-D array and array_b is a list
        array_a = Array([Binary('a'), Binary('b')])
        array_b = [3, 4]
        self.assertTrue((Binary('a') * 3 +
                         (Binary('b') * 4)) == array_a.dot(array_b))

        # test validation
        self.assertRaises(TypeError, lambda: array_a.dot(1))