Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef CSPARSE_HELPER_H
00018 #define CSPARSE_HELPER_H
00019
00020 #include <algorithm>
00021 #include <vector>
00022 extern "C" {
00023 #include "hogman_minimal/csparse/cs.h"
00024 };
00025
00026 namespace AISNavigation {
00027
00028 struct SparseMatrixEntry{
00029 SparseMatrixEntry(int r=-1, int c=-1, double x=0.) :
00030 _r(r), _c(c), _x(x)
00031 {
00032 }
00033 inline void set(int r, int c, double x)
00034 {
00035 _r = r;
00036 _c = c;
00037 _x = x;
00038 }
00039 bool operator < (const SparseMatrixEntry& se) const {
00040 return _r<se._r || (_r==se._r && _c<se._c);
00041 }
00042 int _r,_c;
00043 double _x;
00044 };
00045
00046 struct SparseMatrixEntryPtrCmp
00047 {
00048 bool operator()(const SparseMatrixEntry* e1, const SparseMatrixEntry* e2) const
00049 {
00050 return e1->_r < e2->_r || (e1->_r == e2->_r && e1->_c < e2->_c);
00051 }
00052 };
00053
00054 inline cs_sparse* SparseMatrixEntryVector2CSparse(SparseMatrixEntry* entries, int r, int c, int nz)
00055 {
00056 std::sort(entries, entries+nz);
00057 struct cs_sparse* _csA = cs_spalloc(r,c, nz, 1, 1);
00058 if (! _csA)
00059 return 0;
00060 int *cIdx=_csA->p;
00061 int *rIdx=_csA->i;
00062 _csA->nz=0;
00063 double* values=_csA->x;
00064 for(int i=0; i<nz; i++){
00065 if (entries->_r==-1 || entries->_c==-1){
00066 entries++;
00067 continue;
00068 }
00069 *values=entries->_x;
00070 *rIdx=entries->_r;
00071 *cIdx=entries->_c;
00072 values++;
00073 rIdx++;
00074 cIdx++;
00075 _csA->nz++;
00076 entries++;
00077 }
00078 return _csA;
00079 }
00080
00085 inline cs_sparse* SparseMatrixEntryPtrVector2CSparse(SparseMatrixEntry** entries, int r, int c, int nz)
00086 {
00087 struct cs_sparse* _csA = cs_spalloc(r,c, nz, 1, 1);
00088 if (! _csA)
00089 return 0;
00090 int *cIdx=_csA->p;
00091 int *rIdx=_csA->i;
00092 double* values=_csA->x;
00093 _csA->nz = 0;
00094 for(int i = 0; i < nz; ++i) {
00095 SparseMatrixEntry* entry = *entries;
00096 if (entry->_r==-1 || entry->_c==-1){
00097 entries++;
00098 continue;
00099 }
00100 *values = entry->_x;
00101 *rIdx = entry->_r;
00102 *cIdx = entry->_c;
00103 ++values;
00104 ++rIdx;
00105 ++cIdx;
00106 ++_csA->nz;
00107 ++entries;
00108 }
00109 return _csA;
00110 }
00111
00112
00113 csn* cs_chol_workspace (const cs *A, const css *S, int* cin, double* xin);
00114 int cs_cholsolsymb(const cs *A, double *b, const css* S, double* workspace, int* work);
00115 int cs_cholsolinvblocksymb(const cs *A, double **block, int r1, int c1, int r2,int c2, double* y, const css* S, double* x, double* b, double* temp, int* work);
00116
00117 }
00118
00119 #endif