PolyBoRi
|
00001 // 00002 // fglm.h 00003 // PolyBoRi 00004 // 00005 // Created by Michael Brickenstein on 2008-11-13. 00006 // Copyright 2008 The PolyBoRi Team 00007 // 00008 00009 #ifndef fglm_header 00010 #define fglm_header 00011 00012 #include <BooleEnv.h> 00013 #include "groebner_alg.h" 00014 extern "C" { 00015 #include <m4ri/m4ri.h> 00016 } 00017 BEGIN_NAMESPACE_PBORIGB 00018 00019 00020 typedef std::vector<Polynomial> poly_vec; 00021 class FGLMStrategy{ 00022 public: 00023 typedef BooleEnv::ring_type ring_with_ordering_type; 00024 FGLMStrategy(){} 00025 FGLMStrategy(const ring_with_ordering_type& from_ring, const ring_with_ordering_type& to_ring, const PolynomialVector& gb); 00026 00027 PolynomialVector main(); 00028 void analyzeGB(const ReductionStrategy& gb); 00029 void setupMultiplicationTables(); 00030 void setupStandardMonomialsFromTables(); 00031 void writeRowToVariableDivisors(mzd_t* row, Monomial lm); 00032 void testMultiplicationTables(); 00033 void transposeMultiplicationTables(); 00034 void writeTailToRow(MonomialSet tail, mzd_t* row); 00035 Polynomial rowToPoly(mzd_t* row); 00036 //allocates a window, free it with mzd_free_window 00037 void findVectorInMultTables(mzd_t* dst, Monomial m); 00038 mzd_t* multiplicationTableForVariable(const Variable& v){ 00039 return multiplicationTables[ring2Index[v.index()]]; 00040 } 00041 ~FGLMStrategy(){ 00042 int i; 00043 for(i=0;i<multiplicationTables.size();i++){ 00044 mzd_free(multiplicationTables[i]); 00045 } 00046 } 00047 typedef std::vector<idx_type> IndexVector; 00048 private: 00049 bool prot; 00050 Monomial vars; 00051 size_t varietySize; 00052 typedef std::vector<Monomial> MonomialVector; 00053 typedef std::vector<mzd_t*> MatrixVector; 00054 typedef std::vector<Variable> VariableVector; 00055 00056 00057 MonomialSet standardMonomialsFrom; 00058 MonomialVector standardMonomialsFromVector; 00059 MonomialSet leadingTermsFrom; 00060 MonomialSet varsSet; 00061 VariableVector varsVector; 00062 00063 ReductionStrategy gbFrom; //reduced gb 00064 MonomialSet edgesUnitedVerticesFrom; 00065 ring_with_ordering_type from; 00066 ring_with_ordering_type to; 00067 00068 //indices in multiplicationTables correspond to reverse standard BooleSet iteration of standardMonomialsFrom 00069 00070 IndexVector ring2Index; 00071 IndexVector index2Ring; 00072 IndexVector rowStartingWithIndex; 00073 idx_type nVariables; 00074 bool transposed; 00075 std::vector<IndexVector> tableXRowYIsMonomialFromWithIndex; 00076 lm2Index_map_type standardMonomialsFrom2Index; 00077 lm2Index_map_type monomial2MultiplicationMatrix; 00078 lm2Index_map_type monomial2MultiplicationMatrixRowIndex; 00079 MatrixVector multiplicationTables; 00080 00081 bool canAddThisElementLaterToGB(Polynomial p); 00082 PolynomialVector addTheseLater; 00083 IndexVector rowIsStandardMonomialToWithIndex; 00084 Exponent::idx_map_type standardExponentsFrom2Index; 00085 Polynomial reducedNormalFormInFromRing(Polynomial f); 00086 IndexVector rowVectorIsLinearCombinationOfRows(mzd_t* mat, mzd_t* v); 00087 }; 00088 END_NAMESPACE_PBORIGB 00089 #endif 00090