Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef SPARSELU_PRUNEL_H
00031 #define SPARSELU_PRUNEL_H
00032
00033 namespace Eigen {
00034 namespace internal {
00035
00052 template <typename Scalar, typename Index>
00053 void SparseLUImpl<Scalar,Index>::pruneL(const Index jcol, const IndexVector& perm_r, const Index pivrow, const Index nseg, const IndexVector& segrep, BlockIndexVector repfnz, IndexVector& xprune, GlobalLU_t& glu)
00054 {
00055
00056 Index jsupno = glu.supno(jcol);
00057 Index i,irep,irep1;
00058 bool movnum, do_prune = false;
00059 Index kmin = 0, kmax = 0, minloc, maxloc,krow;
00060 for (i = 0; i < nseg; i++)
00061 {
00062 irep = segrep(i);
00063 irep1 = irep + 1;
00064 do_prune = false;
00065
00066
00067 if (repfnz(irep) == emptyIdxLU) continue;
00068
00069
00070
00071
00072 if (glu.supno(irep) == glu.supno(irep1) ) continue;
00073
00074
00075 if (glu.supno(irep) != jsupno )
00076 {
00077 if ( xprune (irep) >= glu.xlsub(irep1) )
00078 {
00079 kmin = glu.xlsub(irep);
00080 kmax = glu.xlsub(irep1) - 1;
00081 for (krow = kmin; krow <= kmax; krow++)
00082 {
00083 if (glu.lsub(krow) == pivrow)
00084 {
00085 do_prune = true;
00086 break;
00087 }
00088 }
00089 }
00090
00091 if (do_prune)
00092 {
00093
00094
00095 movnum = false;
00096 if (irep == glu.xsup(glu.supno(irep)) )
00097 movnum = true;
00098
00099 while (kmin <= kmax)
00100 {
00101 if (perm_r(glu.lsub(kmax)) == emptyIdxLU)
00102 kmax--;
00103 else if ( perm_r(glu.lsub(kmin)) != emptyIdxLU)
00104 kmin++;
00105 else
00106 {
00107
00108
00109 std::swap(glu.lsub(kmin), glu.lsub(kmax));
00110
00111
00112
00113
00114
00115 if (movnum)
00116 {
00117 minloc = glu.xlusup(irep) + ( kmin - glu.xlsub(irep) );
00118 maxloc = glu.xlusup(irep) + ( kmax - glu.xlsub(irep) );
00119 std::swap(glu.lusup(minloc), glu.lusup(maxloc));
00120 }
00121 kmin++;
00122 kmax--;
00123 }
00124 }
00125
00126 xprune(irep) = kmin;
00127 }
00128 }
00129 }
00130 }
00131
00132 }
00133 }
00134
00135 #endif // SPARSELU_PRUNEL_H