Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

invariant.h

00001 /***************************************************************************
00002                                                          invariant.h
00003                              -----------
00004 
00005     begin                : Tue May 16 2000
00006     copyright            : (C) 2000 by Michael Peeters
00007     email                : Michael.Peeters@vub.ac.be
00008 ***************************************************************************/
00009 
00010 /***************************************************************************
00011  *                                                                         *
00012  *   This program is free software; you can redistribute it and/or modify  *
00013  *   it under the terms of the GNU General Public License as published by  *
00014  *   the Free Software Foundation; either version 2 of the License, or     *
00015  *   (at your option) any later version.                                   *
00016  *                                                                         *
00017  ***************************************************************************/
00018 
00019 #ifndef INVARIANT_H
00020 #define INVARIANT_H
00021 
00022 #include "lusolve.h"
00023 #include "invariant.h"
00024 
00025 namespace MODEL{
00029   template <integer dims, class NT = NumericTraits<number,dims> >
00030   class Invariant
00031   {
00032   public:
00033         
00034         typedef typename NT::number     numT;
00035         typedef typename NT::vect       vect;
00036         typedef typename NT::matrix matrix;
00037         typedef typename NT::vf         vf;
00038 
00039         Invariant(const matrix& ma) : m(ma) {}
00040         
00047         numT    calculate(integer i,integer done=0);    
00048         
00050         NO_COPY(Invariant);
00051 
00052   private:
00053         matrix                          m;
00054   };
00055 
00056   template <integer dims, class NT>
00057   Invariant<dims,NT>::numT      
00058   Invariant<dims,NT>::calculate(integer i,integer done=0)
00059   {
00060         numT    result(0.);
00061         
00062         //cout << "M:" << m << endl;
00063         
00064     // Previously: typedef NumVector<dims-1,NumericTraits< NumVector<dims-1, NumericTraits<numT, dims-1> >,dims-1 > >   smallermatrix;
00065         typedef NumVector<dims-1,numT,NT>       smallervector;
00066         typedef NumVector<dims-1,smallervector,NT>      smallermatrix;
00067         typedef Invariant<dims-1, NumericTraits< numT,dims-1> >         smallerinv;
00068         
00069         if (i==(dims-1)) {LUSolve<dims,NT> l(m,true); return l.det();}
00070         else
00071           {
00072         for(integer remove=done;remove<dims;remove++) // pick a row to be removed
00073                   {
00074                         smallermatrix   mr(0.);
00075                 integer s(0);                                   
00076                 for(integer j=0;j<dims;j++) // loop over rows
00077                           {
00078                         if (j!=remove)
00079                                   {
00080                                 integer t(0);
00081                                 for (integer k=0;k<dims;k++) // loop over colums
00082                                           {
00083                                 if (k!=remove)
00084                                                   {     
00085                                         mr[s][t] = m[j][k]; // make smaller matrix
00086                                         t++;
00087                                                   }
00088                                           }
00089                                 s++;
00090                                   }
00091                           }
00092                 //cout << "mr:" << mr << endl;
00093             smallerinv  inmo(mr);                       // Take a copy
00094             result += inmo.calculate(i,remove);  // Calculate smaller one
00095                   }
00096           }
00097         return result;  
00098   }     
00099 
00101   template < class NT >
00102   class Invariant<1,NT>
00103   {
00104   public:
00105         
00106         typedef typename NT::number     numT;
00107         typedef typename NT::vect       vect;
00108         typedef typename NT::matrix matrix;
00109         typedef typename NT::vf         vf;
00110 
00111         Invariant(const matrix& ma) : m(ma) {}
00112         
00114         numT    calculate(integer i,integer done=0);    
00115         
00116   private:
00118         NO_COPY(Invariant);
00119                 
00120   private:
00121         matrix                          m;
00122   };
00123 
00124   template <class NT>
00125   Invariant<1,NT>::numT 
00126   Invariant<1,NT>::calculate(integer i,integer done=0)
00127   {
00128         return m[0][0];
00129   }
00130 
00131 } // end namespace
00132 
00133 #endif
00134 
00135 /*********************************************************************
00136 CVS INFO: $Id: invariant.h,v 1.1 2001/05/22 10:54:55 mpeeters Exp $
00137 **********************************************************************
00138 
00139 $Log: invariant.h,v $
00140 Revision 1.1  2001/05/22 10:54:55  mpeeters
00141 Moved sources and headers for libModel to model/ subdirectory, in an attempt to rationalize the source tree. This should make things "netter".
00142 
00143 Revision 1.6  2000/09/22 08:51:45  mpeeters
00144 Added NumericTraits NT template parameter to all declarations and
00145 definitions. Not really needed, but cleaner this way.
00146 
00147 Revision 1.5  2000/09/15 10:26:31  mpeeters
00148 Cleaned out header and added CVS tails to files, removed superfuous
00149 @author comments, inserted dates
00150 
00151 Revision 1.4  2000/09/15 08:28:30  mpeeters
00152 Still getting to know cvs. Testfile: invariant.h
00153         (which is why my version number is going nuts)
00154 
00155 Revision 1.3  2000/09/14 13:54:51  mpeeters
00156 Added code template file
00157 
00158 Revision 1.2  2000/09/14 13:37:19  mpeeters
00159 First step towards cleaner sources: CVS tags test
00160 
00161 *********************************************************************/
00162 

To get the sources or tarballs, please go to SourceForge or you can use the CVS repository.

More Info? Michael Peeters. Also, check our research website: www.alna.vub.ac.be

Last update: June 2002.


Looking for Open Source? Check out SourceForge Logo !