def _negate_column(self, matrix, dim, min_row, column_i, secondary_matrix=None, secondary_dim=(0, 0)): for k in range(min_row, dim[0]): matrix[k][column_i] *= -1 if secondary_matrix is not None: for k in range(secondary_dim[1]): secondary_matrix[column_i][k] *= -1 self._transform = mh.multiply_matrices(self._transform, [[self._negate_transform_value(i, j, column_i) for j in range(self._m1_base)] for i in range(self._m1_base)], (self._m1_base, self._m1_base), (self._m1_base, self._m1_base))
def _add_row(self, matrix, dim, min_column, row_i, row_j, coefficient, save_to_transform=False): '''Add row_i to the row_j with coefficient c If save_to_transform=True, then we should save transformation in transform matrix, because we make it fro M2 and change the basis of the M1 ''' for k in range(min_column, dim[1]): matrix[row_j][k] += coefficient * matrix[row_i][k] if save_to_transform: self._transform = mh.multiply_matrices(self._transform, [[self._add_transform_value(i, j, row_j, row_i, -1*coefficient) for j in range(self._m1_base)] for i in range(self._m1_base)], (self._m1_base, self._m1_base), (self._m1_base, self._m1_base))
def _negate_row(self, matrix, dim, min_column, row_i, secondary_matrix=None, secondary_dim=(0, 0), save_to_transform=False): for k in range(min_column, dim[1]): matrix[row_i][k] *= -1 if secondary_matrix is not None: for k in range(secondary_dim[0]): secondary_matrix[k][row_i] *= -1 if save_to_transform: self._transform = mh.multiply_matrices(self._transform, [[self._negate_transform_value(i, j, row_i) for j in range(self._m1_base)] for i in range(self._m1_base)], (self._m1_base, self._m1_base), (self._m1_base, self._m1_base))
def _add_column(self, matrix, dim, min_row, column_i, column_j, coefficient, secondary_matrix=None, secondary_dim=(0, 0)): '''Add column_i to the column_j with coefficient c For secondary matrix subtract from i-th row the j-th row with coefficient c ''' for k in range(min_row, dim[0]): matrix[k][column_j] += coefficient*matrix[k][column_i] if secondary_matrix is not None: for k in range(secondary_dim[1]): secondary_matrix[column_i][k] -= coefficient*secondary_matrix[column_j][k] self._transform = mh.multiply_matrices(self._transform, [[self._add_transform_value(i, j, column_i, column_j, coefficient) for j in range(self._m1_base)] for i in range(self._m1_base)], (self._m1_base, self._m1_base), (self._m1_base, self._m1_base))
def _switch_row(self, matrix, dim, min_column, row_i, row_j, second_matrix=None, second_dim=(0, 0), save_to_transform=False): '''If second matrix is not None, switch columns of it ''' for k in range(min_column, dim[1]): c = matrix[row_i][k] matrix[row_i][k] = matrix[row_j][k] matrix[row_j][k] = c if second_matrix is not None: for k in range(second_dim[0]): c = second_matrix[k][row_i] second_matrix[k][row_i] = second_matrix[k][row_j] second_matrix[k][row_j] = c if second_matrix is not None or save_to_transform: self._transform = mh.multiply_matrices(self._transform, [[self._switch_transfrom_value(i, j, row_i, row_j) for j in range(self._m1_base)] for i in range(self._m1_base)], (self._m1_base, self._m1_base), (self._m1_base, self._m1_base))
def _switch_columns(self, matrix, dim, min_row, column_i, column_j, second_matrix=None, second_dim=(0, 0)): '''If second_matrix is not None, then switch row of it ''' for k in range(min_row, dim[0]): c = matrix[k][column_i] matrix[k][column_i] = matrix[k][column_j] matrix[k][column_j] = c if second_matrix is not None: for k in range(second_dim[1]): c = second_matrix[column_i][k] second_matrix[column_i][k] = second_matrix[column_j][k] second_matrix[column_j][k] = c # if second_matrix is not None, then we switch columns of the M1 matrix self._transform = mh.multiply_matrices(self._transform, [[self._switch_transfrom_value(i, j, column_i, column_j) for j in range(self._m1_base)] for i in range(self._m1_base)], (self._m1_base, self._m1_base), (self._m1_base, self._m1_base))
def check_correct(self): '''Is matrices, presented in processor, are boundary maps, i.e. M1 * M2 = 0 Return pair (bool, int), where bool is True for correct matrix pair, int is key for incorrect result key = -1: correct result key = 0: wrong dimensions key = 1: M1 * M2 is not equal to zero matrix ''' # check dimensions m1_dim = mh.get_size(self._m1) m2_dim = mh.get_size(self._m2) if m1_dim[1] == m2_dim[0]: # make multiplication mult = mh.multiply_matrices(self._m1, self._m2, m1_dim, m2_dim) # is all elements are zero s = mh.get_size(mult) for i in range(s[0]): for j in range(s[1]): if mult[i][j] != 0: return (False, 1) return (True, -1) else: return (False, 0)