00001
00002
00003
00004
00005
00006
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
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;
00064 MonomialSet edgesUnitedVerticesFrom;
00065 ring_with_ordering_type from;
00066 ring_with_ordering_type to;
00067
00068
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