Tests.h

Go to the documentation of this file.
00001 #ifndef TEST_H
00002 #define TEST_H
00003 
00004 
00010 // todo: Kommandozeilen-Parser
00011 // Parameter 1 : Eingabedatei 
00012 // Ausgabe als extra Funktion
00013 
00014 
00015 using namespace std;
00016 
00025 void test_template_functions()
00026 {
00027         assert (pow2<1>::value == 2);
00028         assert (pow2<2>::value == 4);
00029         assert (pow2<3>::value == 8);
00030         assert (pow2<4>::value == 16);
00031         assert (pow2<5>::value == 32);
00032         assert (pow2<6>::value == 64);
00033         assert (pow2<7>::value == 128);
00034         assert (pow2<8>::value == 256);
00035         assert (pow2<9>::value == 512);
00036         assert (pow2<10>::value == 1024);
00037 
00038 
00039         assert (nextpow2num<7>::value   == 8);
00040         assert (nextpow2num<8>::value   == 16);
00041         assert (nextpow2num<23>::value  == 32);
00042         assert (nextpow2num<32>::value  == 64);
00043         assert (nextpow2num<33>::value  == 64);
00044         assert (nextpow2num<197>::value == 256);
00045 
00046         assert (needbits<7>::value  == 3);
00047         assert (needbits<8>::value  == 4);
00048         assert (needbits<23>::value == 5);
00049         assert (needbits<32>::value == 6);
00050         assert (needbits<33>::value == 6);
00051         assert (needbits<197>::value== 8);
00052 
00053 }
00054 
00055 
00059 template <typename TRing>
00060 void manual_test()
00061 {
00062         int charakteristic = 29;
00063         int epsPrecision   =  1;
00064         TRing ring = new TRing( charakteristic, epsPrecision);
00065         typename TRing::ElementType element(28,27);
00066         std::cerr << "add " << element <<"," << element ;
00067         typename TRing::ElementType result;
00068         result = ring->add(element,element);
00069         std::cerr << " results in " << result << std::endl;
00070         std::cerr << "multiply " << element <<"," << element ;
00071         result = ring->multiply(element,element);
00072         std::cerr << " results in " << result << std::endl;
00073 
00074         return;
00075 }
00076 
00077 
00082 template <int CHAR>
00083 void testEpsRing(int epsPrecision)
00084 {
00085 }
00086 
00087 
00088 
00094 template <typename TRing>
00095 void testRing(unsigned int characteristic, unsigned short epsPrecision=1)
00096 {
00097         cerr << "characteristic" << characteristic<< endl;
00098         TRing* ring= new TRing(characteristic, epsPrecision);
00099 
00100         for (unsigned int i=0; i<characteristic; i++)
00101         {
00102                 assert(ring->addInv(i).getX()==(-i+characteristic) % characteristic);
00103                 for (unsigned int j=0; j<characteristic; j++)
00104                 {
00105                         assert(ring->add(i,j).getX()     == ((i+j)  % characteristic));
00106                         assert(ring->multiply(i,j).getX()== ((i*j)  % characteristic));
00107 
00108                         if (ring->multiply(i,j) ==  TRing::ElementType::One)
00109                         {
00110                                         assert(ring->multInv(i).getX()==j);
00111                         }
00112                 }
00113         }
00114         if (epsPrecision==1)
00115         {
00116                 for (unsigned int i=0;i<characteristic;i++)
00117                 {
00118                         for (unsigned int j=0;j<characteristic;j++)
00119                         {
00120                                 for (unsigned int k=0;k<characteristic;k++)
00121                                 {
00122                                         for (unsigned int l=0;l<characteristic;l++)
00123                                         {
00124                                                 typename TRing::ElementType  a(i,j);
00125                                                 typename TRing::ElementType  b(k,l);
00126                                                 assert(ring->addInv(a).getX()  ==(-i+characteristic)% characteristic);
00127                                                 assert(ring->addInv(a).getEps()==(-j+characteristic)% characteristic);
00128         
00129                                                 assert(ring->add(a,b).getX()  ==((i+k)%characteristic));
00130                                                 assert(ring->add(a,b).getEps()==((l+j)%characteristic));
00131         
00132                                                 assert(ring->multiply(a,b).getX()  == ((i*k)    % characteristic));
00133                                                 assert(ring->multiply(a,b).getEps()== ((i*l+j*k)% characteristic));
00134                                         }
00135                                 }
00136                         }
00137                 }
00138         }
00139         
00140         delete ring;
00141         std::cerr << "--Partly tested: fast_Ring  operations with charakteristic=" 
00142              << characteristic << "and epsPrecision= " << epsPrecision << std::endl;
00143 }
00144 
00145 
00146 
00151 template <template<class a, class b> class  TRing, typename TScalar, class TScaparPair , int characteristic, int epsPrecision>
00152 void tt_autotest()
00153 {
00154         typedef  kdefs_zahl_x<7,0>  kdefs_dummy;
00155 
00156         typedef  fast_Ring< number_eps0< characteristic, TScalar> ,kdefs_dummy >        TR1;
00157 
00158         typedef  fast_Ring< fieldScalar< TScalar> , kdefs_dummy >       TdR0;
00159 
00160         if (characteristic<50)
00161         {
00162                 typedef  TRing< number_eps1< characteristic, TScalar, TScaparPair> ,kdefs_dummy >       TR0;
00163                 typedef  fast_Ring< basicNumber< TScalar > , kdefs_dummy >      TdR1;
00164                 testRing<TR0>(characteristic,0);
00165                 testRing<TdR1>(characteristic,0);
00166         }
00167         testRing<TR1>(characteristic,0);
00168         testRing<TdR0>(characteristic,0);
00169         
00170 }
00171 
00172 template <typename TScalar, class TScaparPair>
00173 void tautotest()
00174 {
00175         test_template_functions();
00176         typedef  kdefs_zahl_x<7,0>  kdefs_dummy;
00177 
00178         tt_autotest<fast_Ring,TScalar,TScaparPair,7,0>();
00179         tt_autotest<fast_Ring,TScalar,TScaparPair,11,0>();
00180         tt_autotest<fast_Ring,TScalar,TScaparPair,13,0>();
00181         tt_autotest<fast_Ring,TScalar,TScaparPair,17,0>();
00182         tt_autotest<fast_Ring,TScalar,TScaparPair,19,0>();
00183         tt_autotest<fast_Ring,TScalar,TScaparPair,29,0>();
00184         // hmm,sobald man tt_autotest hinschreibt, wird initialisiert...wieso???
00185         //tt_autotest<fast_Ring,TScalar,TScaparPair,197,0>();
00186 
00187         return;
00188 }
00189 
00191 void autotest()
00192 {
00193         tautotest<unsigned char,short>();
00194         tautotest<short,short>();
00195 }
00196 
00197 
00206 
00207 void testRandom(int characteristic)
00208 {
00209         std::cerr << "-- Random Generator Test" << std::endl;
00210         std::cerr << "--------------------" << std::endl;
00211         std::cerr << "-- seed from Systime" << std::endl;
00212         std::cerr << "-- characteristic: " << characteristic  << std::endl;
00213         int array[characteristic];
00214         int value;
00215         
00216         for  (int i=0;i<characteristic;i++) // durchlaufe die komplette Liste
00217         {
00218                 array[i]=0;
00219         }
00220         long seed = -30;
00221 
00222         time_t tt;
00223         time(&tt);
00224         seed = (tt);
00225 
00226         long trials=10000000;
00227         for  (long i=0;i<trials;i++) // durchlaufe die komplette Liste
00228         {
00229                 value =random(&seed,characteristic-1);
00230                 assert(value>=0 && value<characteristic);
00231                 array[value]++;
00232         }
00233         long average =(long)trials/(characteristic*1.0);
00234         double maxError=0;
00235         /*for  (int i=0;i<characteristic;i++) // durchlaufe die komplette Liste
00236         {
00237                 std::cerr << " [" << i << "]= " << array[i] << std::endl;
00238         }*/
00239         for  (int i=0;i<characteristic;i++) // durchlaufe die komplette Liste
00240         {
00241 
00242                 //std::cerr << "abs(average-array[i])/average *1.0"<<(double) abs(average-array[i])/(average *1.0) << std::endl;
00243                 if (maxError<(double)abs(average-array[i])/(average *1.0))
00244                         maxError=abs(average-array[i])/(average*1.0);
00245                 //cerr << "average"<< average  << endl;
00246                 //cerr <<"average-array[i]" <<average-array[i]  << endl;
00247                 assert(abs(average-array[i]) < average*0.006 );  // fünf Promille Abweichung...
00248         }
00249         
00250         std::cerr << "--Random Generator test finished" << std::endl;
00251         std::cerr << "--maxError: " << maxError<< std::endl;
00252  
00253 }
00254 
00255 
00256 
00257 #endif
00258 
Generated on Tue Nov 23 13:10:52 2010 for centerfocus by  doxygen 1.6.3