00001 #ifndef STRUDEL_TEST_H
00002 #define STRUDEL_TEST_H
00003
00004
00005 #include "fast_Ring.h"
00006
00007
00008
00009
00011
00012
00013
00014
00015 using namespace std;
00016
00017 namespace nCenterFocus
00018 {
00019
00020 int centerfocus(int argc, const char* argv[]);
00021
00022
00023
00024
00025
00026 template<class TPolynomdefs>
00027 void templatedPolynomDefsSingleTest(TPolynomdefs &defs)
00028 {
00029 int indexArray[defs.getSize() ];
00030
00031 int index;
00032 for (int currIndex=0; currIndex < defs.getSize() ; currIndex++)
00033 {
00034 indexArray[currIndex]=0;
00035 }
00036
00037 for (int currDegree=0; currDegree <= defs.maxdegree_m; currDegree++)
00038 {
00039 for (int yexp=0; yexp <= currDegree; yexp++)
00040 {
00041 index = defs.getPairIndex(currDegree-yexp,yexp);
00042 assert( index< defs.getSize() );
00043 assert( indexArray[ index ] == 0 );
00044 indexArray[ index ] = 1 ;
00045 }
00046 }
00047 }
00048
00049 template<template<int> class TPolynomdefs>
00050 void testStaticPolynomDefs()
00051 {
00052
00053 cerr << "testPolynomDefs " << endl;
00054
00055 TPolynomdefs<0> defs0;
00056 TPolynomdefs<1> defs1;
00057 TPolynomdefs<2> defs2;
00058 TPolynomdefs<3> defs3;
00059 TPolynomdefs<4> defs4;
00060
00061 templatedPolynomDefsSingleTest(defs0);
00062 templatedPolynomDefsSingleTest(defs1);
00063 templatedPolynomDefsSingleTest(defs2);
00064 templatedPolynomDefsSingleTest(defs3);
00065 templatedPolynomDefsSingleTest(defs4);
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078 }
00079 template< class TPolynomdefs>
00080 void testDynamicPolynomDefs()
00081 {
00082 cerr << "testDynamicPolynomDefs " << endl;
00083
00084 TPolynomdefs defs0(0);
00085 TPolynomdefs defs1(1);
00086 TPolynomdefs defs2(2);
00087 TPolynomdefs defs3(3);
00088 TPolynomdefs defs4(4);
00089
00090 templatedPolynomDefsSingleTest(defs0);
00091 templatedPolynomDefsSingleTest(defs1);
00092 templatedPolynomDefsSingleTest(defs2);
00093 templatedPolynomDefsSingleTest(defs3);
00094 templatedPolynomDefsSingleTest(defs4);
00095 }
00096
00097 void testAllStaticPolynomDefs()
00098 {
00099 testStaticPolynomDefs< polynomdefs >();
00100 testStaticPolynomDefs< polynomdefsNoShift >();
00101 testStaticPolynomDefs< polynomdefsNew >();
00102 testStaticPolynomDefs< polynompairdefs >();
00103 }
00104
00105 void testAllDynamicPolynomDefs()
00106 {
00107 testDynamicPolynomDefs< dynamicPolynomdefsNoShift >();
00108 testDynamicPolynomDefs< dynamicPolynomdefsNoShiftNoMemoryHoles >();
00109
00110 }
00111
00112
00113 void testAllPolynomDefs()
00114 {
00115 testAllStaticPolynomDefs();
00116 testAllDynamicPolynomDefs();
00117 }
00118
00119
00120
00121 bool testTrim()
00122 {
00123 return ( trim( string( " D D ") ).compare( string("D D") )==0
00124 && trim( string( "nothing to trim") ).compare(string("nothing to trim"))==0
00125 && ltrim( string( " D D ") ).compare( string("D D ") )==0
00126 && rtrim( string( " D D ") ).compare( string(" D D") )==0
00127 );
00128 }
00129
00130 bool testExample()
00131 {
00132
00133 int _argc = 4;
00134
00135 const char** _argv= new const char*[_argc+1];
00136
00137
00138
00139
00140 _argv[0]="centerfocus";
00141 _argv[1]="+";
00142 _argv[2]="output";
00143
00144
00145 std::stringstream pstream;
00146
00147 #ifdef OPTIMIZED_FIELD
00148 pstream << FIELDCHAR;
00149 #else
00150 pstream << 29;
00151 #endif
00152
00153 _argv[3] = (string("-- TestExample \n\
00154 p = ")+pstream.str()+string("; \n\
00155 minNullen = 9; -- search for examples where first 'minNullen' focal values vanishes\n \
00156 minJRank = 9; -- search for examples where jacobian matrix has a rank greater or equal to 'minRank'\n \
00157 minJSubMatrixRank = 9; -- search for examples where jacobian matrix has a rank greater or equal to 'minRank'\n \
00158 jacobi = true; -- perform jacobi matrix rank check (true/false)\n \
00159 jacobiUnterMatrix = false; --\n\
00160 anzZufall = 1; -- number of random experiments to perform\n\
00161 grad = 3; -- maximal polynomial degree of p,q\n\
00162 epsilon = true; -- compute with epsilon\n\
00163 epsPrecision = 1; -- epsilon precision size (currenly only 0 and 1 supported)\n\
00164 randomSeed = -30; -- starting random seed, see 'zeitAlsZufall'\n\
00165 rechneBisMaxStrudel = false; -- 'false': abort focal values computation of a example if a value does not vanish; 'true': compute all 'maxStrudel' focal values\n\
00166 benutzeFormel1 = true; -- compute q(3,0) in a kind that first focal value vanish\n\
00167 benutzeFormel2 = true; -- compute p(3,0) in a kind that second focal value vanish\n\
00168 hamilton = true; -- true: don't filter Hamilton components\n\
00169 zeitAlsZufall = false; -- false: use inital seed for random function given in 'zufallInit'; true: use timer as initial seed\n\
00170 \n\
00171 \n\
00172 L = { { {\n\
00173 {27, 9, 22}, \n\
00174 {3, 8, 5}, \n\
00175 {11, 20, 4, 3}, \n\
00176 {3, 25, 20, 18} \n\
00177 }\n\
00178 }\n\
00179 } \n ")).c_str();
00180
00182 centerfocus(_argc,_argv);
00183
00184 return false;
00185 }
00186
00189
00190 bool testParameterParser01()
00191 {
00192
00193 int _argc = 4;
00194
00195 const char** _argv= new const char*[_argc+1];
00196
00197
00198
00199
00200 _argv[0]="centerfocus";
00201 _argv[1]="+";
00202 _argv[2]="output";
00203
00204
00205 std::stringstream pstream;
00206
00207 #ifdef OPTIMIZED_FIELD
00208 pstream << FIELDCHAR;
00209 #else
00210 pstream << 29;
00211 #endif
00212 string arg3(string("-- TestExample \n\
00213 p = ") +pstream.str()+string("; \n\
00214 minNullen = 9; -- search for examples where first 'minNullen' focal values vanishes\n \
00215 minJRank = 9; -- search for examples where jacobian matrix has a rank greater or equal to 'minRank'\n \
00216 minJSubMatrixRank = 9; -- search for examples where jacobian matrix has a rank greater or equal to 'minRank'\n \
00217 jacobi = true; -- perform jacobi matrix rank check (true/false)\n \
00218 jacobiUnterMatrix = false; --\n\
00219 anzZufall = 1; -- number of random experiments to perform\n\
00220 grad = 3; -- maximal polynomial degree of p,q\n\
00221 epsilon = true; -- compute with epsilon\n\
00222 epsPrecision = 5; -- epsilon precision size (currenly only 0 and 1 supported)\n\
00223 randomSeed = -30; -- starting random seed, see 'zeitAlsZufall'\n\
00224 rechneBisMaxStrudel = false; -- 'false': abort focal values computation of a example if a value does not vanish; 'true': compute all 'maxStrudel' focal values\n\
00225 benutzeFormel1 = true; -- compute q(3,0) in a kind that first focal value vanish\n\
00226 benutzeFormel2 = false; -- compute p(3,0) in a kind that second focal value vanish\n\
00227 hamilton = true; -- true: don't filter Hamilton components\n\
00228 zeitAlsZufall = false; -- false: use inital seed for random function given in 'zufallInit'; true: use timer as initial seed\n\
00229 ergebnisDatenAnhaengen = true;-- \n\
00230 \n\
00231 \n\
00232 L = { { {\n\
00233 {27, 9, 22}, \n\
00234 {3, 8, 5}, \n\
00235 {11, 20, 4, 3}, \n\
00236 {3, 25, 20, A} \n\
00237 }\n\
00238 }\n\
00239 } ;\n ")) ;
00240
00241 char * a = new char [arg3.size()];
00242
00243 strcpy(a, arg3.c_str() );
00244
00245 _argv[3] = a;
00246
00248 D_CenterfocusParams* params= new D_CenterfocusParams(_argc, _argv);
00249 assert( params->inputFromStd()==false);
00250 #ifdef OPTIMIZED_FIELD
00251
00252 assert( params->getFieldCharacteristic()==FIELDCHAR );
00253 #else
00254 assert( params->getFieldCharacteristic()==29 );
00255 #endif
00256
00257
00258 assert( params->getEpsPrecision()==5 );
00259
00260 assert( params->getRequestedTrialsNum()==1 );
00261
00262 assert( params->getPolynomialDegree()==3 );
00263
00264
00265
00266 assert( params->getMaxFocalValuesToCompute()== (params->getFieldCharacteristic() - 1 )/2 -1 );
00267
00268 assert( params->getRequiredFullJacobianMinRank()==9 );
00269
00270 assert( params->requiredVanishedFocalValuesNum()==9 );
00271
00272 assert( params->getRandomSeedRef()==-30 );
00273
00274 assert(*(params->getRandomSeedPtr() )==-30 );
00275
00276 assert( params->bInitRandomFromTime()==false );
00277
00278 assert( params->useFormula1()==true );
00279
00280 assert( params->useFormula2()==false );
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292 assert( params->readNextPolynoms()==true );
00293
00294 assert( params->polynomsHaveRandomCoeff()==false );
00295
00296 assert( params->polynomsHaveCheckAllCoeff()==true );
00297
00298 D_CenterfocusParams::PolynomXY_Type minusPolynomp = params->getMinusPPolynomRef();
00299
00300 D_CenterfocusParams::PolynomXY_Type::CoefficientType coeff (params->getRing()->getField()->Convert(27) );
00301
00302 assert((int) coeff.getX()==(params->getRing()->getField()->Convert(27)) );
00303
00304 const D_CenterfocusParams::RingType * ring = params->getRing();
00305
00306 assert(minusPolynomp.getCoeff( 2,0 ) == ring->addInv(coeff) );
00307
00308 coeff.setX(22);
00309
00310 assert( minusPolynomp.getCoeff( 0,2 ) == ring->addInv(coeff) );
00311
00312 coeff.setX(11);
00313 assert( minusPolynomp.getCoeff( 3,0 ) == ring->addInv(coeff) );
00314
00315
00316 cerr << " -- Test " << __FUNCTION__ << " passed !" << endl;
00317 return true;
00318 }
00319
00320
00321 template<class FrommerType>
00322 void frommer_TestNo1(FrommerType & frommer)
00323 {
00324 const typename FrommerType::RingType & ring = frommer.getRingRef();
00325
00326 string minusP_String(" { {-1, 0}, {4, 0, 1} }");
00327 string q_String(" { {0,1}, {1, 0, -2} }");
00328
00329
00330
00331 typename FrommerType::TPolynomXY
00332 minus_polynom_P = createFromString<typename FrommerType::TPolynomXY>( minusP_String, ring);
00333
00334 typename FrommerType::TPolynomXY
00335 polynom_Q = createFromString<typename FrommerType::TPolynomXY>( q_String, ring);
00336
00337 std::cerr << "minusP_String" << minusP_String << endl;
00338 std::cerr << "minus_polynom_P" << minus_polynom_P << endl;
00339
00340 std::cerr << "q_String" << q_String << endl;
00341 std::cerr << "polynom_Q" << polynom_Q << endl;
00342
00343 frommer.setPolynoms( &minus_polynom_P , & polynom_Q );
00344 frommer.doit(false);
00345
00346 typename FrommerType::TPolynomXY::CoefficientType firstFocalValue = frommer.getFocalValue(1);
00347
00348
00349 assert(firstFocalValue== ring.Convert(4) );
00350 }
00351
00352
00353 template<class FrommerType>
00354 void frommer_TestNo2(FrommerType & frommer)
00355 {
00356 const typename FrommerType::RingType & ring = frommer.getRingRef();
00357
00358
00359 string minusP_String(" { {-1, 0}, {-1, -2, 1} }");
00360 string q_String(" { {0, 1}, { 0, -2, 1} }");
00361 typename FrommerType::TPolynomXY
00362 minus_polynom_P = createFromString<typename FrommerType::TPolynomXY>(minusP_String, ring);
00363
00364 typename FrommerType::TPolynomXY
00365 polynom_Q = createFromString<typename FrommerType::TPolynomXY>(q_String, ring);
00366
00367 frommer.setPolynoms( &minus_polynom_P , & polynom_Q );
00368
00369 frommer.doit(false);
00370
00371
00372 typename FrommerType::TPolynomXY::CoefficientType referenceResult = ring.addInv ( ring.multiply(ring.Convert(14),
00373 ring.multInv(ring.Convert(15).getX() ) )
00374 );
00375
00376 typename FrommerType::TPolynomXY::CoefficientType secondFocalValue = frommer.getFocalValue(2);
00377
00378 assert(secondFocalValue == referenceResult);
00379 }
00380
00381 template<class FrommerType>
00382 void frommer_TestNo3(FrommerType & frommer)
00383 {
00384 const typename FrommerType::RingType & ring = frommer.getRingRef();
00385
00386
00387 string minusP_String(" { {-1, 0}, {-4, 0, -1}, {-2, 0, 0, 2} }");
00388 string q_String(" { {0, 1}, {1, 0, -2}, {2, 0, 0, -2} }");
00389 typename FrommerType::TPolynomXY
00390 minus_polynom_P = createFromString<typename FrommerType::TPolynomXY>(minusP_String, ring);
00391
00392 typename FrommerType::TPolynomXY
00393 polynom_Q = createFromString<typename FrommerType::TPolynomXY>(q_String, ring);
00394
00395 frommer.setPolynoms( &minus_polynom_P , & polynom_Q );
00396 frommer.doit(false);
00397
00398 for (int currFocalValue=1; currFocalValue<=frommer.getMaxFocalValuesToCompute(); currFocalValue++)
00399 {
00400 typename FrommerType::TPolynomXY::CoefficientType focalValue = frommer.getFocalValue(currFocalValue);
00401 assert(focalValue== ring.Convert(0) );
00402 }
00403 }
00404
00405
00406 template<class FrommerType>
00407 void frommer_TestNo4_a(FrommerType & frommer)
00408 {
00409 const typename FrommerType::RingType & ring = frommer.getRingRef();
00410
00411
00412 string minusP_String(" { {-1, 0}, {0, 0, 0}, {-2, 0, 0, -1} }");
00413 string q_String(" { {0, 1}, {0, 0, 0}, {0, 1, 0, 1} }");
00414 typename FrommerType::TPolynomXY
00415 minus_polynom_P = createFromString<typename FrommerType::TPolynomXY>(minusP_String, ring);
00416
00417 typename FrommerType::TPolynomXY
00418 polynom_Q = createFromString<typename FrommerType::TPolynomXY>(q_String, ring);
00419
00420 frommer.setPolynoms( &minus_polynom_P , & polynom_Q );
00421 frommer.doit(false);
00422
00423
00424 typename FrommerType::TPolynomXY::CoefficientType focalValue = frommer.getFocalValue(1);
00425 assert(focalValue==ring.addInv( ring.Convert(1).getX() ) );
00426
00427 }
00428
00429
00430 template<class FrommerType>
00431 void frommer_TestNo4_b(FrommerType & frommer)
00432 {
00433 const typename FrommerType::RingType & ring = frommer.getRingRef();
00434
00435
00436 string minusP_String(" { {-1, 0}, {0, 0, 0}, {0, -4, 0, -1} }");
00437 string q_String(" { {0, 1}, {0, 0, 0}, {2, 0, 1, 0} }");
00438 typename FrommerType::TPolynomXY
00439 minus_polynom_P = createFromString<typename FrommerType::TPolynomXY>(minusP_String, ring);
00440
00441 typename FrommerType::TPolynomXY
00442 polynom_Q = createFromString<typename FrommerType::TPolynomXY>(q_String, ring);
00443
00444 frommer.setPolynoms( &minus_polynom_P , & polynom_Q );
00445 frommer.doit(false);
00446
00447
00448 typename FrommerType::TPolynomXY::CoefficientType referenceResult = ring.multiply( ring.Convert(44),
00449 ring.multInv(ring.Convert(35).getX() )
00450 );
00451 cerr << "ring.Convert(44) " << ring.Convert(44) << endl;
00452 cerr << "ring.multInv(ring.Convert(35) ) " << ring.multInv(ring.Convert(35).getX() ) << endl;
00453 cerr << "referenceResult " << referenceResult << endl;
00454 typename FrommerType::TPolynomXY::CoefficientType focalValue = frommer.getFocalValue(1);
00455 for (int currFocalValue=1; currFocalValue<=frommer.getComputedFocalValuesNum(); currFocalValue++)
00456 {
00457 focalValue = frommer.getFocalValue(currFocalValue);
00458 cerr << "focalValue " << focalValue << endl;
00459 }
00460 focalValue = frommer.getFocalValue(3);
00461 cerr << "focalValue " << focalValue << endl;
00462 assert( focalValue == referenceResult );
00463 }
00464
00465
00466
00467 template<class FrommerType>
00468 void frommer_TestNo5(FrommerType & frommer)
00469 {
00470 const typename FrommerType::RingType & ring = frommer.getRingRef();
00471
00472
00473 string minusP_String(" { {-1, 0}, {0, 0, 0}, {0, -4, 0, -1}, {0, 0, -2, 0, 0, 0} }");
00474 string q_String(" { {0, 1}, {0, 0, 0}, {2, 0, 1, 0} , {0, 2, 0, 0, 0 ,0} }");
00475 typename FrommerType::TPolynomXY
00476 minus_polynom_P = createFromString<typename FrommerType::TPolynomXY>(minusP_String, ring);
00477
00478 typename FrommerType::TPolynomXY
00479 polynom_Q = createFromString<typename FrommerType::TPolynomXY>(q_String, ring);
00480
00481 frommer.setPolynoms( &minus_polynom_P , & polynom_Q );
00482 frommer.doit(false);
00483
00484
00485 for (int currFocalValue=1; currFocalValue<=frommer.getMaxFocalValuesToCompute(); currFocalValue++)
00486 {
00487 typename FrommerType::TPolynomXY::CoefficientType focalValue = frommer.getFocalValue(currFocalValue);
00488 assert(focalValue==ring.Convert(0));
00489 }
00490 }
00491
00492 template<class FrommerType>
00493 void frommer_TestNo6(FrommerType & frommer)
00494 {
00495 const typename FrommerType::RingType & ring = frommer.getRingRef();
00496
00497
00498 string minusP_String(" { {-1, 0}, { -1,0,0,0,0,0,0,0}, { 0,-2,0,0,0,0,0,0,0,0}, { 0,0,0,0,0,0,0,0,0,0,0,1} }");
00499 string q_String(" { {0, 1}, { 0,-2,0,0,0,0,0,0,0,0,0,1} }");
00500 typename FrommerType::TPolynomXY
00501 minus_polynom_P = createFromString<typename FrommerType::TPolynomXY>(minusP_String, ring);
00502
00503 typename FrommerType::TPolynomXY
00504 polynom_Q = createFromString<typename FrommerType::TPolynomXY>(q_String, ring);
00505
00506 frommer.setPolynoms( &minus_polynom_P , & polynom_Q );
00507 frommer.doit(false);
00508
00509
00510 typename FrommerType::TPolynomXY::CoefficientType referenceResult = ring.addInv ( ring.multiply(ring.Convert(2),
00511 ring.multInv(ring.Convert(9).getX() ) )
00512 );
00513 cerr << "referenceResult " << referenceResult << endl;
00514 typename FrommerType::TPolynomXY::CoefficientType focalValue = frommer.getFocalValue(1);
00515 for (int currFocalValue=1; currFocalValue<=frommer.getComputedFocalValuesNum(); currFocalValue++)
00516 {
00517 focalValue = frommer.getFocalValue(currFocalValue);
00518 cerr << "focalValue " << focalValue << endl;
00519 }
00520 focalValue = frommer.getFocalValue(4);
00521
00522 assert(focalValue == referenceResult);
00523 }
00524
00525
00526 template <class FrommerType>
00527 void frommerTest(int characteristic, int epsPrecision)
00528 {
00529 int maxFocalValuesToCompute = (characteristic-3)/2;
00530 typename FrommerType::RingType ring(characteristic, epsPrecision);
00531
00532 FrommerType frommer(maxFocalValuesToCompute, &ring);
00533
00534
00535
00536 frommer_TestNo1 (frommer);
00537 cerr << "frommer_TestNo1 test passed! " << endl;
00538
00539
00540 frommer_TestNo2 (frommer);
00541 cerr << "frommer_TestNo2 test passed! " << endl;
00542
00543 frommer_TestNo3 (frommer);
00544 cerr << "frommer_TestNo3 test passed! " << endl;
00545
00546 frommer_TestNo4_a (frommer);
00547 cerr << "frommer_TestNo4_a test passed! " << endl;
00548
00549 frommer_TestNo4_b (frommer);
00550 cerr << "frommer_TestNo4_b test passed! " << endl;
00551
00552 #ifndef OPTIMIZED_FIELD
00553 frommer_TestNo5 (frommer);
00554 cerr << "frommer_TestNo5 test passed! " << endl;
00555 frommer_TestNo6 (frommer);
00556 cerr << "frommer_TestNo6 test passed! " << endl;
00557
00558 #endif
00559
00560
00561 cerr << "Frommer tests passed! " << endl;
00562 }
00563
00564 template <class FrommerType>
00565 void frommerTestInternal(int epsPrecision)
00566 {
00567
00568 #ifdef FIELDCHAR
00569 frommerTest<FrommerType>(FIELDCHAR,epsPrecision);
00570 #else
00571 std::cerr << "FIELDCHAR not defined" << std::endl;
00572 frommerTest<FrommerType>(11,epsPrecision);
00573 frommerTest<FrommerType>(23,epsPrecision);
00574 frommerTest<FrommerType>(29,epsPrecision);
00575 #endif
00576 }
00577
00578
00579 void frommerTest ()
00580 {
00581 int epsPrecision=0;
00582 frommerTestInternal<D_Frommer>(epsPrecision=1);
00583 frommerTestInternal<D_Frommer0>(epsPrecision=0);
00584 frommerTestInternal<D_Frommer2>(epsPrecision=1);
00585 frommerTestInternal<D_Eps_Frommer>(epsPrecision=0);
00586
00587 }
00588
00589
00590
00591
00592
00593
00594
00595
00596
00597
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608
00609
00610
00611
00612
00613
00614
00615
00616
00617
00618
00619
00620
00621
00622
00623
00624
00625
00626
00627
00628
00629
00630
00631
00632
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644
00645
00646
00647
00648
00649
00650
00651
00652
00653
00654
00655
00656
00657
00658
00659
00660
00661
00662
00663
00664
00665
00666
00667
00668
00669
00670
00671
00672
00673
00674
00675
00676
00677
00678
00679
00680
00681
00682
00683
00684
00685
00686
00687
00688
00689
00690
00691
00692
00693 };
00694
00695 #endif
00696