LADEL main
Sparse LDL factorization package with rank 1 and rowadd/rowdel updates
ladel_permutation.c
Go to the documentation of this file.
1#include "ladel_types.h"
2#include "ladel_constants.h"
3#include "ladel_global.h"
4#include <stdlib.h>
5
7{
8 ladel_int index;
9 for (index = 0; index < size; index++) y[index] = x[p[index]];
10}
11
13{
14 ladel_int index;
15 for (index = 0; index < size; index++) y[pinv[index]] = x[index];
16}
17
19{
20 ladel_int index;
21 for (index = 0; index < size; index++) pinv[p[index]] = index;
22}
23
24static int ladel_int_compare(const ladel_int *a, const ladel_int *b)
25{
26 if (*a > *b) return 1;
27 else return -1;
28}
29
31{
32 ladel_int row, index, index_temp, xnz = x->p[col+1] - x->p[col];
34
35 /* In a relatively dense case, don't sort but just do a dense permutation.
36 The dense permutation takes O(nrow) computations.
37 The sparse permutation takes O(xnz*log(xnz)) computations, because of the sort. */
38 if (xnz > x->nrow / 5)
39 {
40 LADEL_FOR(index, x, col)
41 {
42 row = p[x->i[index]];
43 temp[row] = x->x[index];
44 }
45 index = x->p[col];
46 for (index_temp = 0; index_temp < x->nrow; index_temp++)
47 {
48 if (temp[index_temp] != 0.0)
49 {
50 x->i[index] = index_temp;
51 x->x[index] = temp[index_temp];
52 temp[index_temp] = 0.0; /*reset to keep the workspace consistent*/
53 index++;
54 }
55 }
56 }
57 else
58 {
59 LADEL_FOR(index, x, col)
60 {
61 row = p[x->i[index]];
62 x->i[index] = row;
63 temp[row] = x->x[index];
64 }
65 qsort(x->i + x->p[col], xnz, sizeof(ladel_int), (int (*) (const void *, const void *)) ladel_int_compare);
66 LADEL_FOR(index, x, col)
67 {
68 row = x->i[index];
69 x->x[index] = temp[row];
70 temp[row] = 0.0;
71 }
72 }
73}
74
76{
77 if (!M || !Mpp) return;
78 if (!p)
79 {
80 ladel_sparse_copy(M, Mpp);
81 } else
82 {
83 ladel_int col, pcol, prow, index, pindex, prev_col_count, ncol = M->ncol;
84 ladel_int *col_counts = work->array_int_ncol1, *pinv = work->array_int_ncol2;
85 for (index = 0; index < ncol; index++) col_counts[index] = 0;
86 for (col = 0; col < ncol; col++) pinv[p[col]] = col;
87 for (col = 0; col < ncol; col++)
88 {
89 pcol = pinv[col];
90 LADEL_FOR(index, M, col)
91 {
92 prow = pinv[M->i[index]];
93 col_counts[LADEL_MAX(pcol, prow)]++;
94 }
95 }
96 Mpp->p[0] = 0;
97 for (col = 1; col < ncol; col++)
98 {
99 prev_col_count = col_counts[col-1];
100 col_counts[col-1] = Mpp->p[col-1];
101 Mpp->p[col] = prev_col_count;
102 col_counts[col] += prev_col_count;
103 }
104 Mpp->p[ncol] = col_counts[ncol-1];
105 col_counts[ncol-1] = Mpp->p[ncol-1];
106
107 for (col = 0; col < ncol; col++)
108 {
109 pcol = pinv[col];
110 LADEL_FOR(index, M, col)
111 {
112 prow = pinv[M->i[index]];
113 if (pcol < prow)
114 {
115 pindex = col_counts[prow]++;
116 Mpp->i[pindex] = pcol;
117 } else
118 {
119 pindex = col_counts[pcol]++;
120 Mpp->i[pindex] = prow;
121 }
122 if (M->values) Mpp->x[pindex] = M->x[index];
123 }
124 }
125 }
126}
#define LADEL_FOR(index, M, col)
Loop through a column of a sparse matrix.
#define LADEL_MAX(a, b)
Return the maximum of two numbers.
Constants and macros used in LADEL.
void ladel_sparse_copy(ladel_sparse_matrix *M, ladel_sparse_matrix *M_copy)
Copies a matrix (preallocated)
Definition: ladel_copy.c:12
Memory allocation routines.
void ladel_permute_vector(ladel_double *x, ladel_int *p, ladel_int size, ladel_double *y)
Compute y, where .
void ladel_inverse_permute_vector(ladel_double *x, ladel_int *pinv, ladel_int size, ladel_double *y)
Compute y, where .
void ladel_permute_symmetric_matrix(ladel_sparse_matrix *M, ladel_int *p, ladel_sparse_matrix *Mpp, ladel_work *work)
Compute .
void ladel_invert_permutation_vector(ladel_int *p, ladel_int *pinv, ladel_int size)
Invert a permutation vector, such that .
void ladel_permute_sparse_vector(ladel_sparse_matrix *x, ladel_int col, ladel_int *p, ladel_work *work)
Permute x(:,col) in place, such that on output .
Structures and types used in LADEL routines.
int64_t ladel_int
Type for integer numbers (default: int64_t)
Definition: ladel_types.h:24
double ladel_double
Type for floating point numbers (default: double)
Definition: ladel_types.h:20
Sparse matrix in compressed column storage.
Definition: ladel_types.h:35
ladel_int ncol
number of columns
Definition: ladel_types.h:38
ladel_double * x
numerical values (size nzmax)
Definition: ladel_types.h:42
ladel_int * p
column pointers (size ncol+1)
Definition: ladel_types.h:40
ladel_int values
has numerical values
Definition: ladel_types.h:45
ladel_int nrow
number of rows
Definition: ladel_types.h:37
ladel_int * i
row pointers (size nzmax)
Definition: ladel_types.h:41
Workspace required for various routines in LADEL.
Definition: ladel_types.h:109
ladel_int * array_int_ncol2
An array of ncol integers.
Definition: ladel_types.h:117
ladel_int * array_int_ncol1
An array of ncol integers.
Definition: ladel_types.h:116
ladel_double * array_double_all_zeros_ncol1
An array of ncol doubles, on input and output this should be all zeros.
Definition: ladel_types.h:122