centerfocus_defines.h

Go to the documentation of this file.
00001 
00002 #ifndef CENTERFOCUS_DEFINES_H
00003 #define CENTERFOCUS_DEFINES_H
00004 
00005 #ifndef __PRETTY_FUNCTION__
00006 #define __PRETTY_FUNCTION__ __FUNCTION__ 
00007 #endif //!__PRETTY_FUNCTION__
00008 
00009 
00010 #include <assert.h>
00011 #include <sstream>
00012 #include <vector>
00013 #include <iostream>
00014 
00015 #ifdef __SSE2__
00016         #include <xmmintrin.h>
00017         #include <emmintrin.h>
00018 #endif
00019 
00020 //checkpointing
00021 #ifdef MTCP
00022         #include "mtcp.h"
00023 #endif
00024 
00025 // NOTE: nicht uint verwenden - nicht rückwärtskompatibel
00026 
00027 /*
00028 auf manchen amds ist 3dnow und sse2 parallel 
00029 
00030 MMX             mmintrin.h
00031 SSE             xmmintrin.h
00032 SSE2            emmintrin.h
00033 SSE3            pmmintrin.h
00034 
00035 //#include <tmmintrin.h>
00036 //To access 32-bit data
00037 */
00038 
00039 
00040 
00041 #define _mm_extract_epi32(x, imm) \
00042     _mm_cvtsi128_si32(_mm_srli_si128((x), 4 * (imm)))
00043 
00044 #include <stdint.h>
00045 
00046 
00047 #include "CompileFunctions.h"
00048 #include "Statistik.h"
00049 
00062 static uint64_t hamiltonianPointCount_g=0;
00063 
00064 
00065 
00066 #include "typedefs.h"
00067 
00068 #define  RankStatistic BaseRankStatistic
00069 
00070 
00071 #define  DStatistic Statistic<>
00072 
00073 template < class TRing ,class TPolynomXY, class TTMatrixXY, class TTMatrixXY_0, class TPolynomXYPair = TTMatrixXY, class TTMatrixXYPair = TTMatrixXY >
00074 class FrommerDefs
00075 {
00076         public:
00077                 typedef  TRing          RingType;
00078                 typedef  TPolynomXY     PolynomXYType;
00079                 typedef  TTMatrixXY     TMatrixXYType;
00080                 typedef  TTMatrixXY_0   TMatrixXY_0Type;
00081                 typedef  TTMatrixXYPair TMatrixXYPairType;
00082 
00083                 typedef  TPolynomXYPair PolynomXYPairType;
00084 
00085 };
00086 
00087 template < class TInfEpsFrommer,class  TFrommer1, class TFrommer2 >
00088 class ExperimentDefs
00089 {
00090         public:
00091                 typedef  TInfEpsFrommer         InfEpsFrommerType;
00092                 typedef  TFrommer1              Frommer1Type;
00093                 typedef  TFrommer2              Frommer2Type;
00094 
00095 };
00096 
00098 
00099 #include "PerformanceStatistics.h"
00100 #include "polynomdefs.h"
00101 
00102 
00103 
00104 
00105 // #define Parameter.
00106 // Todo: Aktualisieren
00107 // Wofür ? -  Um einerseite spezialisierte(Optimierung) und andererseits allgemeiner verwendbare Programmversionen zu erzeugen !
00108 // Ausserdem haelt man so die Template-Verschachtelungstiefe in Grenzen und die Compiler-Fehlermeldungen sind so noch lesbar
00109 //--------------------------------
00110 // OPTIMIZED_FIELD ist NICHT definiert  -> generische Version was die Charakteristik des Koerpers angeht.
00111 //                                         für EPSDimension steht 0 oder 1 zur Auswahl.
00112 //
00113 // OPTIMIZED_FIELD ist definiert        -> optimierte Version; die Koerpercharakteristik muss beim compilieren 
00114 //                                         angegeben werden.( FIELDCHAR=...)
00115 //
00116 //                                         EPSDIMENSION muss beim compilieren angegeben werden.
00117 //                                         zur Auswahl steht nur 0 oder 1. (default:1)
00118 //                                      
00119 //                                         Maximaler Polynomgrad muss (noch) beim Kompilieren angegeben werden
00120 //                                         MAXMNOMDEG (default: 3)
00121 //
00122 //      OPTIMIZED_FIELD UND INFINITEEPS ist definiert -> EPSDimension(EPSPrecision) ist beiebig (bis xxx)
00123 //                                        die Koerpercharakteristik ist dagegen fest ( FIELDCHAR)
00124 //                                        und der maximale Polynomgrad ist ebenfalls (noch) fest (MAXMNOMDEG ,default: 3)
00125 //                                      
00126 //
00127 //    -> Parameter  wird für die generische Version nicht definiert
00128 // 
00129 
00130 
00131 // Templates: In den folgenden Folien wird u.a. die Behandlung von Spezialisierung an Beispielen gezeigt.
00132 // Anwendung: man kann z.B. eine  Funktion für den fall spezialisieren, dass Epsilon gleich zwei ist.
00133 // Link: http://www4.in.tum.de/lehre/seminare/ps/WS0607/programmiersprachen/ausarb/templates_folien.pdf
00134 #include <iomanip> 
00135 
00136 #include "LiftStatistic.h"
00137         nCenterFocus::ExtendedFailedLiftStatistic       g_extLiftStatistic;
00138 
00139 
00140 #include "MtcpCheckpointManager.h"
00141 
00142         MtcpCheckpointManager MtcpManager_g;
00143 
00144 #ifndef OPTIMIZED_FIELD
00145 
00146         //OPTIMIZED_FIELD nicht definiert  -> verwende allgemein gehaltene Definitionen.
00147         #undef INFINITEEPS
00148 
00149 
00150 
00151         #include "basicNumber.h"
00152         #include "polynom.h"    
00153         #include "fast_Ring.h"
00154         #include "eps/epsNumber.h"
00155 
00156 
00157         //#define       defined_Scalar_Type             char
00158         //#define       defined_Scalar_Type             short
00159         typedef          short          defined_Scalar_Type;
00160         //#define       defined_Scalar_Type             uint16_t
00161         
00162         // damit man auch WIRKLICH uint16_t als Skalar verwenden kann, darf nirgentwo getX() auftauchen, ausser bei epsNumber!
00163 
00164         #define         defined_RingElement_Type        basicNumber < defined_Scalar_Type >
00165         #define         defined_FieldElement_Type     fieldScalar< defined_Scalar_Type >
00166         //#define       defined_RingElement_Type        basicNumber< fieldScalar< defined_Scalar_Type> >
00167 
00168         #define         defined_PolynomXY_Type          polynomXY < defined_RingElement_Type,dynamicPolynomdefsNoShift >
00169         #define         defined_PolynomXY_Type0         polynomXY < defined_FieldElement_Type,dynamicPolynomdefsNoShift >
00170         
00171         #define         defined_PolynomX_Type           polynomx < defined_RingElement_Type >
00172 
00173         #define         i_matrixxy                              polynomXY < defined_RingElement_Type, dynamicQuadraticMatrixDefsNoShift >
00174         #define         i_matrixxy0                             polynomXY < defined_FieldElement_Type, dynamicQuadraticMatrixDefsNoShift >
00175         #define         i_matrixxy00                    polynomXY< short, dynamicQuadraticMatrixDefsNoShift >
00176 
00177         
00178         // der Eintrag in kdefs sollte keine Rolle spielen.
00179         #define         defined_Ring_Type       fast_Ring < defined_RingElement_Type, kdefs_zahl_x < 23 ,1 > >
00180 
00181         
00182         #define         defined_Field_Type      fast_Ring< defined_FieldElement_Type, kdefs_zahl_x < 23 ,1 > >
00183 
00184         
00185         #define defined_EpsRingElement_Type epsNumber< fieldScalar< defined_Scalar_Type > >
00186 
00187         //#define defined_EpsRingElement_Type epsNumber< basicNumber< defined_Scalar_Type > >
00188 
00189 
00190         #define         defined_EpsPolynomXY_Type       polynomXY < defined_EpsRingElement_Type, dynamicPolynomdefsNoShift >
00191 
00192         #define         eps_matrixxy                    polynomXY < defined_EpsRingElement_Type, dynamicQuadraticMatrixDefsNoShift >
00193 
00194         
00195         #include "eps/eps_ring.h"
00196 
00197         #define defined_EpsRing_Type epsRing< fieldScalar < defined_Scalar_Type > , defined_Field_Type >
00198 
00199 
00200         #include "polynomialRing.h"
00201         #include "frommer.h"
00202         
00203         #include "FFLASMatrix.h"
00204 
00205         #define D_Frommer       Frommer <  FrommerDefs< defined_Ring_Type, defined_PolynomXY_Type, i_matrixxy , i_matrixxy00>, 1 >
00206 
00207         #define D_Frommer0      Frommer <  FrommerDefs< defined_Field_Type, defined_PolynomXY_Type0, i_matrixxy0, i_matrixxy00 >, 1 >
00208 
00209 
00210         #define D_Frommer2      Frommer< FrommerDefs< defined_Ring_Type, defined_PolynomXY_Type, i_matrixxy, i_matrixxy00 >, 2 >
00211 
00212         //#define D_Frommer0  D_Frommer2 nur zum Vergleichstest. Frommer2 ist langsamer als Frommer0. 
00213 
00214         #define D_Eps_Frommer   Frommer< FrommerDefs< defined_EpsRing_Type, defined_EpsPolynomXY_Type, eps_matrixxy , i_matrixxy00 >, -1 >
00215 
00216         #define D_CenterfocusParams     CenterfocusParams< defined_EpsPolynomXY_Type, defined_EpsRing_Type      >
00217 #include "TMatrix.h"
00218         #include "Matrix3D.h"
00219 
00220 
00221 #else
00222         //spezialisierte und weniger flexible Definitionen, 
00223         //Diese  Optimierung bringt etwa den Faktor 2 fuer EpsPrecision 0 
00224         //  und den Faktor 3 fuer EpsPrecision 1 ( jetzt vermutlich auch nur Faktor 2)
00225         // char-short-kombination ist schneller als short-int kombination auf gauss
00226         // short-short-kombination ist geringfügig schneller als char-int kombination auf gauss
00227         // int-int -kombination ist langsam auf gauss
00230                 #include <typeinfo>
00231                 #include <stdlib.h>
00232                 #include "fastNumber.h"
00233                 #include "basicNumber.h"                
00234                 #include "frommer.h"
00235                 #include "fast_frommer.h"
00236                 #include "eps/epsNumber.h"
00237                 #include "eps/eps_ring.h"
00238                 #include "polynom.h"
00239                 #include "fast_polynom.h"
00240                 #include  "fast_polynom_pair.h"
00241                 #include "fast_Ring.h"
00242                 #include "TMatrix.h"
00243                 #include "Matrix3D.h"
00244                 #include "polynomialRing.h"
00245                 #include "FFLASMatrix.h"
00246                 
00247 
00248                 
00249 
00250                 #define         defined_Scalar_Type     char
00251                 #define         defined_Scalar_Type     short
00252                 //#define       defined_Scalar_Type     int
00253 
00254 
00255                 #define         defined_ScalarPair_Type short
00256         //      #define         defined_ScalarPair_Type int
00257 
00258 
00259                 #define         eps0defined_Num_Type            number_eps0<FIELDCHAR, defined_Scalar_Type> 
00260         
00261                 #define         defined_RingElement_Type        number_eps1< FIELDCHAR ,defined_Scalar_Type,defined_ScalarPair_Type >
00262                 #define         defined_FieldElement_Type       eps0defined_Num_Type
00263 
00264                 #define         defined_Ring_Type               fast_Ring< defined_RingElement_Type, kdefs_zahl_x<FIELDCHAR,1> >
00265                 #define         defined_Field_Type              fast_Ring< eps0defined_Num_Type,     kdefs_zahl_x<FIELDCHAR,1> >
00266 
00267                 #define         defined_EpsField_Type           fast_Ring<  fieldScalar< defined_Scalar_Type >, kdefs_zahl_x<FIELDCHAR, 1> >
00268                 
00269 
00270                 // TODO: das koennte nicht so gut sein mit polynomdefsNew<MAXMONOMDEG >
00271                 //      braucht man nicht  polynomdefsNew<MAXMONOMDEG+1>?
00272                 #define defined_PolynomXY_Type fast_polynomXY< polynomdefsNew<MAXMONOMDEG >, defined_RingElement_Type>
00273                 #define defined_PolynomXY_Type0 fast_polynomXY< polynomdefsNew<MAXMONOMDEG >, defined_FieldElement_Type>
00274                 //#define defined_PolynomXY_Type fast_polynomXY< polynomdefsNoShift<MAXMONOMDEG >, defined_RingElement_Type>
00275 
00276                 //#define defined_PolynomXY_Type polynomXY<  defined_RingElement_Type, dynamicPolynomdefsNoShift> 
00277 
00278                 //#define       polynomXY       template <typename TNum> fast_polynomXY<polynomdefsNew<MAXMONOMDEG>, TNum>
00279 
00280                 #define i_polynompair fast_polynomXY_pair<polynompairdefs<MAXMONOMDEG>,defined_RingElement_Type>
00281                 #define i_polynompair0 fast_polynomXY_pair<polynompairdefs<MAXMONOMDEG>,defined_FieldElement_Type>
00282                 //#define       polynompair     template <typename TNum>fast_polynomXY_pair<polynompairdefs<MAXMONOMDEG>, TNum>
00283 
00284                 
00285                 
00286 
00287                 #define i_matrixxy fast_polynomXY<polynomdefsNew<FIELDCHAR >,defined_RingElement_Type>
00288                 #define i_matrixxy0 fast_polynomXY<polynomdefsNew<FIELDCHAR >, defined_FieldElement_Type>
00289                 #define i_matrixxy00 fast_polynomXY<polynomdefsNew<FIELDCHAR >, short >
00290                 //#define i_matrixxy  polynomXY<  defined_RingElement_Type, dynamicQuadraticMatrixDefsNoShift >
00291                 //#define i_matrixxy  polynomXY<  defined_RingElement_Type, dynamicPolynomdefsNoShift >  
00292 
00293                 //#define       matrixxy        template <typename TNum>fast_polynomXY<polynomdefsNew<FIELDCHAR >, TNum>
00294 
00295                 #define i_matrixpair fast_polynomXY_pair<polynompairdefs<FIELDCHAR>,defined_RingElement_Type>
00296                 #define i_matrixpair0 fast_polynomXY_pair<polynompairdefs<FIELDCHAR>,defined_FieldElement_Type>
00297                 //#define       matrixpair      template <typename TNum> fast_polynomXY_pair<polynompairdefs<FIELDCHAR>, TNum>
00298 
00299                         
00300         
00301                 
00302                 #define defined_EpsRingElement_Type epsNumber< fieldScalar< defined_Scalar_Type > >
00303                 
00304         
00305                 //#define defined_EpsRingElement_Type epsNumber< basicNumber< defined_Scalar_Type > >
00306         
00307         
00308                 #define         defined_EpsPolynomXY_Type        fast_polynomXY< polynomdefsNew<MAXMONOMDEG >, defined_EpsRingElement_Type>
00309                 #define         eps_matrixxy                    fast_polynomXY<polynomdefsNew<FIELDCHAR >,defined_EpsRingElement_Type>
00310         
00311         
00312         
00313         
00314                 #define defined_EpsRing_Type epsRing< fieldScalar< defined_Scalar_Type > , defined_EpsField_Type >
00315 
00316                 
00317                 // Achtung : fehlende Template-Parameter werden mit einem default-Wert aufgefuellt. Das  ist aber nicht die beste Lösung ! - wofuer?
00318                 
00319                 // so ist es sicherer in Bezug auf moegliche Aenderungen des Polynomdesigns,  aber auch langsamer.
00320                 /*#include "frommer.h"
00321 
00322                 #define         i_Frommer       Frommer< defined_Ring_Type, defined_PolynomXY_Type, 1 >
00323                 #define         i_Frommer2      Frommer< defined_Ring_Type, defined_PolynomXY_Type, 2 >
00324                 */
00325         
00326 
00327                 #define D_Frommer0      fast_Frommer< FrommerDefs<defined_Field_Type, defined_PolynomXY_Type0, i_matrixxy0 ,i_matrixxy00, i_polynompair0, i_matrixpair0>, 1 >
00328 
00329                 #define D_Frommer       fast_Frommer< FrommerDefs<defined_Ring_Type, defined_PolynomXY_Type, i_matrixxy , i_matrixxy00, i_polynompair, i_matrixpair>, 1 >
00330                 
00331                 #define D_Frommer2      fast_Frommer< FrommerDefs<defined_Ring_Type, defined_PolynomXY_Type, i_matrixxy ,i_matrixxy00, i_polynompair , i_matrixpair>, 2 >
00332         
00333                 #define D_Eps_Frommer        Frommer< FrommerDefs< defined_EpsRing_Type, defined_EpsPolynomXY_Type, eps_matrixxy, i_matrixxy00 >, -1 >
00334                                 
00335                 #define D_CenterfocusParams     CenterfocusParams< defined_EpsPolynomXY_Type, defined_EpsRing_Type      >
00336 
00337 
00338 
00341         
00343                 //#define defined_Field_Type finite_field<defined_Scalar_Type,kdefs_zahl_x<FIELDCHAR,0 > > 
00344 
00345         //----------------------------------------------------------------------------
00346 
00347                 /*
00348 
00349                 
00350                 #include "polynom.h"    
00351         
00352         
00353                 #define         defined_PolynomXY_Type          polynomXY< defined_RingElement_Type >
00354                 
00355                 #define         defined_PolynomX_Type           polynomx< defined_RingElement_Type >
00356         
00357                 #define         i_matrixxy                      defined_PolynomXY_Type
00358 
00359 
00360                 #include "frommer.h"
00361 
00362                         #define i_Frommer       Frommer<  defined_Ring_Type, defined_PolynomXY_Type, 1 >
00363 
00364                         #define i_Frommer2      Frommer< defined_Ring_Type, defined_PolynomXY_Type, 2 >
00365                 
00366                 */
00367 
00368         //#endif
00369 
00370 #endif
00371         
00372 
00373 // Idee um polynomdefs zu verallgemeinern: 
00374 // vielleicht die getPairIndex Funktion in polynomdefs mit einem Parameter, inline definieren???
00375 // damit diese Funktion auch variabel sein kann, wenn man keine Zweierpotenzen fuer die Arraygroessen
00376 // verwenden will...
00377 
00378 //#define               TMatrix< defined_Ring_Type >
00379 #include "TMatrix.h"
00380 
00381 
00382 #endif
Generated on Tue Nov 23 13:10:51 2010 for centerfocus by  doxygen 1.6.3