1 //=====================================================
2 // File   :  action_lu_decomp.hh
3 // Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>
4 //=====================================================
5 //
6 // This program is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU General Public License
8 // as published by the Free Software Foundation; either version 2
9 // of the License, or (at your option) any later version.
10 //
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 // GNU General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software
17 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18 //
19 #ifndef ACTION_LU_DECOMP
20 #define ACTION_LU_DECOMP
21 #include "utilities.h"
22 #include "STL_interface.hh"
23 #include <string>
24 #include "init/init_function.hh"
25 #include "init/init_vector.hh"
26 #include "init/init_matrix.hh"
27 
28 using namespace std;
29 
30 template<class Interface>
31 class Action_lu_decomp {
32 
33 public :
34 
35   // Ctor
36 
Action_lu_decomp(int size)37   Action_lu_decomp( int size ):_size(size)
38   {
39     MESSAGE("Action_lu_decomp Ctor");
40 
41     // STL vector initialization
42     init_matrix<pseudo_random>(X_stl,_size);
43 
44     init_matrix<null_function>(C_stl,_size);
45     init_matrix<null_function>(resu_stl,_size);
46 
47     // generic matrix and vector initialization
48     Interface::matrix_from_stl(X_ref,X_stl);
49     Interface::matrix_from_stl(X,X_stl);
50     Interface::matrix_from_stl(C,C_stl);
51 
52     _cost = 2.0*size*size*size/3.0 + size*size;
53   }
54 
55   // invalidate copy ctor
56 
Action_lu_decomp(const Action_lu_decomp &)57   Action_lu_decomp( const  Action_lu_decomp & )
58   {
59     INFOS("illegal call to Action_lu_decomp Copy Ctor");
60     exit(1);
61   }
62 
63   // Dtor
64 
~Action_lu_decomp(void)65   ~Action_lu_decomp( void ){
66 
67     MESSAGE("Action_lu_decomp Dtor");
68 
69     // deallocation
70     Interface::free_matrix(X_ref,_size);
71     Interface::free_matrix(X,_size);
72     Interface::free_matrix(C,_size);
73   }
74 
75   // action name
76 
name(void)77   static inline std::string name( void )
78   {
79     return "complete_lu_decomp_"+Interface::name();
80   }
81 
nb_op_base(void)82   double nb_op_base( void ){
83     return _cost;
84   }
85 
initialize(void)86   inline void initialize( void ){
87     Interface::copy_matrix(X_ref,X,_size);
88   }
89 
calculate(void)90   inline void calculate( void ) {
91       Interface::lu_decomp(X,C,_size);
92   }
93 
check_result(void)94   void check_result( void ){
95     // calculation check
96     Interface::matrix_to_stl(C,resu_stl);
97 
98 //     STL_interface<typename Interface::real_type>::lu_decomp(X_stl,C_stl,_size);
99 //
100 //     typename Interface::real_type error=
101 //       STL_interface<typename Interface::real_type>::norm_diff(C_stl,resu_stl);
102 //
103 //     if (error>1.e-6){
104 //       INFOS("WRONG CALCULATION...residual=" << error);
105 //       exit(0);
106 //     }
107 
108   }
109 
110 private :
111 
112   typename Interface::stl_matrix X_stl;
113   typename Interface::stl_matrix C_stl;
114   typename Interface::stl_matrix resu_stl;
115 
116   typename Interface::gene_matrix X_ref;
117   typename Interface::gene_matrix X;
118   typename Interface::gene_matrix C;
119 
120   int _size;
121   double _cost;
122 };
123 
124 #endif
125