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))