PolyBoRi
fglm.h
Go to the documentation of this file.
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