コード例 #1
0
    def setUp(self):
        self.matrix_proto = sor_pb2.SparseMatrix(matrix_name="a",
                                                 row_count=3,
                                                 column_count=3)
        for i in range(0, 3):
            value = self.matrix_proto.values.add()
            value.row_index = i
            value.column_index = i
            value.value = (i + 1) * 3.9

        self.negative_matrix_proto = sor_pb2.SparseMatrix(matrix_name="a-",
                                                          row_count=3,
                                                          column_count=3)
        for i in range(0, 3):
            value = self.negative_matrix_proto.values.add()
            value.row_index = i
            value.column_index = i
            value.value = -(i + 1) * 2.1

        self.vector_proto = sor_pb2.Vector(vector_name="b", length=3)
        self.vector_proto.values.extend([1.0, 3.6, 9.1])

        self.negative_vector_proto = sor_pb2.Vector(vector_name="b-", length=3)
        self.negative_vector_proto.values.extend([-1.0, -3.6, -9.1])

        self.input_file = 'testdata/io_test.in'
        self.output_file = 'testdata/io_test.out'
コード例 #2
0
 def testValidateSparseMatrixProto_Success(self):
     matrix_a_proto = sor_pb2.SparseMatrix(matrix_name='a',
                                           row_count=3,
                                           column_count=3)
     for i in range(0, 3):
         value = matrix_a_proto.values.add()
         value.row_index = i
         value.column_index = i
         value.value = (i + 1) * 2
コード例 #3
0
    def testValidateSparseMatrixProto_OutOfBounds(self):
        matrix_a_proto = sor_pb2.SparseMatrix(matrix_name='a',
                                              row_count=3,
                                              column_count=3)
        for i in range(0, 4):
            value = matrix_a_proto.values.add()
            value.row_index = i
            value.column_index = i
            value.value = (i + 1) * 2

        self.assertRaises(validation.ValidationError,
                          validation.ValidateSparseMatrixProto, matrix_a_proto)
コード例 #4
0
    def testSparseMatrix_FromDenseMatrix(self):
        matrix_a_proto = sor_pb2.SparseMatrix(matrix_name="a",
                                              row_count=3,
                                              column_count=3)
        expected = [[1, 0, 1], [0, 1, 0], [1, 0, 1]]
        matrix_a = sparse_matrix.SparseMatrix(dense_matrix=expected)

        self.assertEqual(expected, matrix_a.to_dense_matrix())
        self.assertEqual([0, 2, 3, 5], matrix_a.rowStart)
        self.assertEqual([0, 2, 1, 0, 2], matrix_a.cols)
        self.assertEqual([1, 1, 1, 1, 1], matrix_a.vals)

        expected = [[9, 7, 16], [0, 7.8, 0], [0, 0, 11.7]]
        matrix_a = sparse_matrix.SparseMatrix(dense_matrix=expected)

        self.assertEqual([0, 3, 4, 5], matrix_a.rowStart)
        self.assertEqual([0, 1, 2, 1, 2], matrix_a.cols)
        self.assertEqual([9, 7, 16, 7.8, 11.7], matrix_a.vals)
        self.assertEqual(expected, matrix_a.to_dense_matrix())
コード例 #5
0
    def testSparseMatrix_FromProto(self):
        matrix_a_proto = sor_pb2.SparseMatrix(matrix_name="a",
                                              row_count=3,
                                              column_count=3)
        for i in range(0, 3):
            # This creates and returns a pointer to a sor_pb2.SparseValue message.
            value = matrix_a_proto.values.add()
            value.row_index = i
            value.column_index = i
            # This is just a made up float value.
            value.value = (i + 1) * 3.9

        matrix_a = sparse_matrix.SparseMatrix(matrix_a_proto)

        expected = [[3.9, 0, 0], [0, 7.8, 0], [0, 0, 11.7]]

        self.assertEqual(expected, matrix_a.to_dense_matrix())
        self.assertEqual([0, 1, 2, 3], matrix_a.rowStart)
        self.assertEqual([0, 1, 2], matrix_a.cols)
        self.assertEqual([3.9, 7.8, 11.7], matrix_a.vals)
コード例 #6
0
def _process_string_matrix_proto(string_matrix_proto):
    string_segments = string_matrix_proto.split('values ')
    head_segment = string_segments[0]
    name = re.search(r'matrix_name: "([^"]+)"', head_segment).group(1)
    rows = re.search(r'row_count: (\d+)', head_segment).group(1)
    columns = re.search(r'column_count: (\d+)', head_segment).group(1)
    sparse_matrix_proto = sor_pb2.SparseMatrix(matrix_name=name,
                                               row_count=int(rows),
                                               column_count=int(columns))
    for segment in string_segments[1:]:
        sparse_value = sparse_matrix_proto.values.add()
        row_index = re.search(r'row_index: (\d+)', segment)
        column_index = re.search(r'column_index: (\d+)', segment)
        value = re.search(r'value: (-?[\d.]+)', segment).group(1)
        if row_index:
            sparse_value.row_index = int(row_index.group(1))
        if column_index:
            sparse_value.column_index = int(row_index.group(1))
        sparse_value.value = float(value)
    return sparse_matrix_proto
コード例 #7
0
    def testSparseSorSolver_MatrixProto(self):
        matrix_a_proto = sor_pb2.SparseMatrix(matrix_name="a",
                                              row_count=3,
                                              column_count=3)
        for i in range(0, 3):
            # This creates and returns a pointer to a sor_pb2.SparseValue message.
            value = matrix_a_proto.values.add()
            value.row_index = i
            value.column_index = i
            # This is just a made up float value.
            value.value = (i + 1) * 3.9

        matrix_a = sparse_matrix.SparseMatrix(matrix_a_proto)

        vector_b = vector.Vector(name="b", number_list=[2, 3, 4])

        sparse_sor_solver = sparse_sor.SparseSorSolver(matrix_a, vector_b, 10,
                                                       .0001, 1.0)

        self.assertEqual(sparse_sor_solver.stopping_reason,
                         sor_pb2.SorReturnValue.RESIDUAL_CONVERGENCE)
コード例 #8
0
  while(i < 2.1):
    sparse_sor_solver = sparse_sor.SparseSorSolver(
        matrix, vector, maxits, 2**-20, i)
    results.append(sparse_sor_solver.iteration)
    i += 0.1
  return(results)
 
index_list = [ x / 10 for x in range(1,21)]

# Experiment to see effect of very large matrix 
print("--------------------------------------------------------------------")
print("Experiment with large, randomly generated diagonally dominant matrix")
print("--------------------------------------------------------------------")

# Create tridiagonal matrix
matrix_a_proto = sor_pb2.SparseMatrix(
    matrix_name="a", row_count=5000, column_count=5000)
for i in range(0, 5000):
  value = matrix_a_proto.values.add()
  value.row_index = i
  value.column_index = i
  value.value = random.randint(10,15)
for i in range(1, 5000):
  value = matrix_a_proto.values.add()
  value.row_index = i
  value.column_index = i-1
  value.value = random.randint(2,4)
for i in range(0, 4999):
  value = matrix_a_proto.values.add()
  value.row_index = i
  value.column_index = i+1
  value.value = random.randint(-4,4)