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