Macaulay2 Engine
Loading...
Searching...
No Matches

◆ rawMGB()

const Matrix * rawMGB ( const Matrix * inputMatrix,
int reducer,
int spairGroupSize,
int nthreads,
M2_string logging )

Definition at line 778 of file groebner.cpp.

784{
785 try
786 {
787 const Ring *R = inputMatrix->get_ring();
788 const PolyRing *P = R->cast_to_PolyRing();
789 if (P == nullptr)
790 {
791 ERROR("expected a polynomial ring");
792 return nullptr;
793 }
794 if (nthreads < 0)
795 {
796 ERROR("mgb: expected a non-negative number of threads");
797 return nullptr;
798 }
799 if (P->characteristic() > std::numeric_limits<int>::max())
800 {
801 ERROR("characteristic is too large for mathic gb computation");
802 return nullptr;
803 }
804 if (P->characteristic() == 0)
805 {
806 ERROR(
807 "characteristic for mathic gb computation must be a prime "
808 "number");
809 return nullptr;
810 }
812 {
813 ERROR("coefficients for mathic gb computation must be a prime field");
814 return nullptr;
815 }
816 int charac = static_cast<int>(P->characteristic());
817 int nvars = P->n_vars();
818 MGBCallback callback;
819 mgb::GroebnerConfiguration configuration(
820 charac, nvars, inputMatrix->n_rows());
821
822 const auto reducerType = reducer == 0
823 ? mgb::GroebnerConfiguration::ClassicReducer
824 : mgb::GroebnerConfiguration::MatrixReducer;
825 configuration.setReducer(reducerType);
826 configuration.setMaxSPairGroupSize(spairGroupSize);
827 configuration.setMaxThreadCount(nthreads);
828 std::string log((char *)logging->array, logging->len);
829 configuration.setLogging(log.c_str());
830 configuration.setCallback(&callback);
831
832 // Now set the monomial ordering info
833 std::vector<int> mat;
834 bool base_is_revlex = true;
835 int component_direction = 1;
836 int component_is_before_row = -1;
838 mat,
839 base_is_revlex,
840 component_direction,
841 component_is_before_row))
842 {
843 ERROR(
844 "monomial ordering is not appropriate for Groebner basis "
845 "computation");
846 return nullptr;
847 }
848 if (!configuration.setMonomialOrder(
849 (base_is_revlex
850 ?
851 // mgb::GroebnerConfiguration::BaseOrder::ReverseLexicographicBaseOrder
852 mgb::GroebnerConfiguration::BaseOrder::
853 RevLexDescendingBaseOrder
854 : mgb::GroebnerConfiguration::BaseOrder::
855 LexDescendingBaseOrder),
856 mat))
857 {
858 throw exc::engine_error("expected global monomial ordering");
859 }
860
861 if (component_is_before_row >= 0)
862 configuration.setComponentBefore(component_is_before_row);
863 configuration.setComponentsAscending(component_direction == 1); // BUG: what if descending??
864
865#if 0
866 // Debug information
867 printf("Setting monomial order:");
868 for (size_t i=0; i<mat.size(); i++) printf("%d ", mat[i]);
869 printf("\n");
870 printf(" Base=%d\n", base_is_revlex);
871 printf(" ComponentBefore=%d\n", component_is_before_row);
872 std::cout << "componentBefore: " << configuration.componentBefore() << std::endl;
873#endif
874
875 mgb::GroebnerInputIdealStream input(configuration);
876
877 std::ostringstream computedStr;
878 mgb::IdealStreamLog<> computed(
879 computedStr, charac, nvars, inputMatrix->n_rows());
880 mgb::IdealStreamChecker<decltype(computed)> checkedOut(computed);
881
882 matrixToStream(inputMatrix, input);
883 MatrixStream matStream(inputMatrix->rows());
884 // mgb::computeGroebnerBasis(input, checked);
885 mgb::computeGroebnerBasis(input, matStream);
886 if (callback.wasInterrupted())
887 {
888 ERROR("computation was interrupted");
889 return nullptr;
890 }
891 const Matrix *result = matStream.value();
892 // printf("number of callbacks = %lu result = %lu\n",
893 // callback.callCount(), result);
894 // rawDisplayMatrixStream(result);
895 return result;
896 } catch (const std::runtime_error& e)
897 {
898 ERROR(e.what());
899 return nullptr;
900 }
901}
bool wasInterrupted() const
Definition groebner.cpp:748
mathicgb (mgb) callback that polls the engine's interrupt flag during a long-running GB computation.
Definition groebner.cpp:744
const Ring * get_ring() const
Definition matrix.hpp:134
int n_rows() const
Definition matrix.hpp:146
const FreeModule * rows() const
Definition matrix.hpp:144
Streaming consumer that builds an engine Matrix from the mathicgb-style stream callbacks (idealBegin ...
const MonomialOrdering * getMonomialOrdering() const
Definition monoid.hpp:173
Concrete PolyRingFlat subclass implementing ordinary commutative polynomial rings K[x_1,...
Definition poly.hpp:64
const Ring * getCoefficientRing() const
Definition polyring.hpp:200
virtual const Monoid * getMonoid() const
Definition polyring.hpp:282
int n_vars() const
Definition polyring.hpp:196
virtual const PolyRing * cast_to_PolyRing() const
Definition ring.hpp:245
long characteristic() const
Definition ring.hpp:159
virtual bool isFinitePrimeField() const
Definition ring.hpp:169
xxx xxx xxx
Definition ring.hpp:102
#define Matrix
Definition factory.cpp:14
bool monomialOrderingToMatrix(const struct MonomialOrdering &mo, std::vector< int > &mat, bool &base_is_revlex, int &component_direction, int &component_is_before_row)
const int ERROR
Definition m2-mem.cpp:55
VALGRIND_MAKE_MEM_DEFINED & result(result)
void matrixToStream(const Matrix *M, T &stream)
const mpreal log(const mpreal &x, mp_rnd_t r=mpreal::get_default_rnd())
Definition mpreal.h:2295

References Ring::cast_to_PolyRing(), Ring::characteristic(), ERROR, Matrix::get_ring(), PolynomialRing::getCoefficientRing(), PolynomialRing::getMonoid(), Monoid::getMonomialOrdering(), Ring::isFinitePrimeField(), Matrix, matrixToStream(), monomialOrderingToMatrix(), Matrix::n_rows(), PolynomialRing::n_vars(), result(), Matrix::rows(), MatrixStream::value(), and MGBCallback::wasInterrupted().