cfRandomExperiment.h
Go to the documentation of this file.00001
00002
00003
00004 namespace nCenterFocus
00005 {
00006
00007 template <int variant>
00008 class CenterFocusExperiment;
00009
00013
00014 template <int variant, class TPolynomXY, class TFrommer1, class TFrommer2>
00015 class CFRandomExperiment
00016 {
00017
00018 private:
00019 #ifdef FORMULA23_TIMER
00020 uint64_t formula23_compute_bcd_a1_not_zero_count;
00021 uint64_t formula23_compute_bcd_a2_not_zero_count;
00022 uint64_t formula23_analyze_all_time_count;
00023
00024 double formula23_step_time_m;
00025 double formula23_compute_a_time_m;
00026 double formula23_compute_a_getFocalValues_time_m;
00027 double compute_bcd_a1_not_zero_time_m;
00028 double compute_bcd_a1_not_zero_getFocalValues_time_m;
00029 double compute_bcd_a2_not_zero_getFocalValues_time_m;
00030 double compute_bcd_a2_not_zero_time_m;
00031 double computeSolutions_time_m;
00032 double analyze_all_time_m;
00033 double random_trials_time_m;
00034
00035 Timer tim1_m;
00036 Timer tim2_m;
00037 Timer tim3_m;
00038
00039 MtcpManager_g.connectTimer(tim1_m);
00040 MtcpManager_g.connectTimer(tim2_m);
00041 MtcpManager_g.connectTimer(tim3_m);
00042 #endif
00043
00044 typename TFrommer1::RingType::ScalarType drittel_m;
00045 typename TFrommer1::RingType::ScalarType zwei_m;
00046
00047
00048
00049 D_CenterfocusParams const * cfparams_m;
00050 CenterFocusExperiment<variant> & cfExperiment_m;
00051
00052 TFrommer1 & frommer1_m;
00053 TFrommer2 & frommer2_m;
00054
00055 TPolynomXY & randomMinusP_polynom_m;
00056 TPolynomXY & randomQ_polynom_m;
00057
00058 typename TFrommer1::RingType const & f1_ring_ref_m;
00059 typename TFrommer2::RingType const & f2_ring_ref_m;
00060
00061 typename TFrommer1::RingType::FieldType const & frommer1_field_ref ;
00062 const PolynomialRing<TPolynomXY,typename TFrommer1::RingType> polynomialRing_m;
00063
00064
00065 DStatistic* st_m;
00066 RankStatistic & fullRankStatistic_m;
00067 RankStatistic & subRankStatistic_m;
00068 LiftAndQuadricsStatistic & fullQuadricsStatistic_m;
00069 LiftAndQuadricsStatistic & subQuadricsStatistic_m;
00070 FailedLiftStatistic &liftStatistic_m;
00071
00072
00073 typename TFrommer1::RingType::ScalarType * psolutions_m;
00074 pair <TPolynomXY,TPolynomXY> * pPointSolutions_m;
00075
00076
00079 const pair <TPolynomXY,TPolynomXY> v1_m;
00080 const pair <TPolynomXY,TPolynomXY> v2_m;
00083 const list<CoeffListEntry> coeffRandomVariablesOrder_m;
00084
00085 list<CoeffListEntry> initRandomVariablesOrder();
00086
00087
00088
00091 bool bUseFormula1_m;
00092
00093 bool bUseFormula2_m;
00094
00095 bool bUseFormula23_m;
00096
00098 long64 randomCounter_m ;
00099
00100 public:
00101
00102 CFRandomExperiment( CenterFocusExperiment<variant> & cfExperiment,
00103 D_CenterfocusParams const * cfparams,
00104
00105 TFrommer1 & frommer1,
00106 TFrommer2 & frommer2,
00107 RankStatistic & fullRankStatistic,
00108 RankStatistic & subRankStatistic,
00109 LiftAndQuadricsStatistic & fullQuadricsStatistic,
00110 LiftAndQuadricsStatistic & subQuadricsStatistic,
00111 FailedLiftStatistic & liftStatistic,
00112 TPolynomXY & randomMinusP_polynom,
00113 TPolynomXY & randomQ_polynom
00114 );
00115
00116
00117
00118 virtual ~CFRandomExperiment();
00119
00120 void performRandomExperiment( );
00121
00122
00123 void printTimings(std::ostream & os) const;
00124
00125
00126 DStatistic & getStatisticRef();
00127
00128 long64 getCurrentRandomCounter() const { return randomCounter_m; }
00129 private:
00132
00133
00134 inline bool setNextAllCoefficient(
00135 TPolynomXY & allMinusP_polynom ,
00136 TPolynomXY & allQ_polynom );
00137
00142 bool randomExperimentWellDefined();
00143
00144 inline void correctStatistic();
00145
00146 void performSingleRandomTrial(const TPolynomXY & randomMinusP_polynom,const TPolynomXY &randomQ_polynom );
00147 void performSingleALLExperiment(TPolynomXY randomMinusP_polynom, TPolynomXY randomQ_polynom );
00148
00150
00151 inline void initRandomCoefficients(
00152 TPolynomXY & mp,
00153 TPolynomXY & q);
00154
00155
00156 inline void initRandomExperiment( );
00157
00158
00159
00160
00161
00162
00164
00165 void compute_q_coeff_x_3_y_0( const TPolynomXY & mp,
00166 TPolynomXY & q );
00167
00168
00171
00172 void compute_p_coeff_x_3_y_0( TPolynomXY & minusP_polynom,
00173 const TPolynomXY & Q_polynom );
00174
00175
00181
00182 pair <TPolynomXY,TPolynomXY> performFormula23Step_construct_v1( ) ;
00183
00185 pair <TPolynomXY,TPolynomXY> performFormula23Step_construct_v2( );
00186
00187
00188
00189
00190 typename TFrommer1::RingType::ScalarType
00191 performFormula23Step_getSecondFocalValue (const pair< TPolynomXY , TPolynomXY > &) const;
00192
00193
00194 typename TFrommer1::RingType::ScalarType
00195 performFormula23Step_getThirdFocalValue ( const pair< TPolynomXY , TPolynomXY > &) const;
00196
00198 void performFormula23Step_solveQ(unsigned int & solutions,typename TFrommer1::RingType::ScalarType * b );
00199
00202
00206 void performFormula23Step( TPolynomXY & minusP_polynom,
00207 TPolynomXY & Q_polynom);
00208
00210 inline pair<TPolynomXY,TPolynomXY> performFormula23Step_computePoint( typename TFrommer1::RingType::ScalarType v1coeff,
00211 typename TFrommer1::RingType::ScalarType v2coeff,
00212 const pair<const TPolynomXY ,const TPolynomXY > & PQpolynoms ) const ;
00213
00214 inline void performFormula23Step_computePointNew(typename TFrommer1::RingType::ScalarType v1coeff,
00215 typename TFrommer1::RingType::ScalarType v2coeff,
00216 const pair<const TPolynomXY ,const TPolynomXY > & PQPolynomPair,
00217 pair<TPolynomXY,TPolynomXY> & ret
00218 ) const;
00219
00220
00221
00224 };
00225
00226 #include "cfRandomExperiment.hpp"
00227
00228
00229 }