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/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