@@ -2,6 +2,7 @@ namespace CSparse.Tests.Double.Factorization
22{
33 using CSparse . Double ;
44 using CSparse . Double . Factorization ;
5+ using CSparse . Storage ;
56 using NUnit . Framework ;
67 using System ;
78
@@ -109,5 +110,39 @@ public void TestRefactorize()
109110 var small = new SparseMatrix ( 3 , 3 , 0 ) ;
110111 Assert . Throws < ArgumentException > ( ( ) => lu . Refactorize ( small , 1.0 ) ) ;
111112 }
113+
114+ [ Test ]
115+ public void TestRefactorizeNoTrim ( )
116+ {
117+ // With AutoTrimStorage disabled, the L/U buffers are kept across
118+ // re-factorizations (no Resize(0) trim) — the result must stay correct.
119+ var trim = CompressedColumnStorage < double > . AutoTrimStorage ;
120+ try
121+ {
122+ CompressedColumnStorage < double > . AutoTrimStorage = false ;
123+
124+ var A = ResourceLoader . Get < double > ( "general-40x40.mat" ) ;
125+ var lu = SparseLU . Create ( A , ColumnOrdering . MinimumDegreeAtPlusA , 1.0 ) ;
126+
127+ var B = A . Clone ( ) ;
128+ var bv = B . Values ;
129+ for ( int i = 0 ; i < bv . Length ; i ++ ) bv [ i ] *= 2.0 ;
130+
131+ lu . Refactorize ( B , 1.0 ) ;
132+
133+ var x = Helper . CreateTestVector ( B . ColumnCount ) ;
134+ var b = Helper . Multiply ( B , x ) ;
135+ var r = Vector . Clone ( b ) ;
136+
137+ lu . Solve ( b , x ) ;
138+ B . Multiply ( - 1.0 , x , 1.0 , r ) ;
139+
140+ Assert . That ( Vector . Norm ( r . Length , r ) < EPS , Is . True ) ;
141+ }
142+ finally
143+ {
144+ CompressedColumnStorage < double > . AutoTrimStorage = trim ;
145+ }
146+ }
112147 }
113148}
0 commit comments