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

◆ rawFourierMotzkin()

const Matrix * rawFourierMotzkin ( const Matrix * C)

Cone interface routines

Definition at line 23 of file cone.cpp.

24{
25 try
26 {
27 // TODO: generalize the input type, in particular to allow lineality space
28 const Ring *R = C->get_ring();
29 const size_t c = C->n_cols(); // rank of ambient lattice
30 const size_t r = C->n_rows(); // number of cone inequalities
31
32 auto ineqs = libnormaliz::Matrix<Integer>(r, c);
33 for (size_t i = 0; i < r; i++)
34 for (size_t j = 0; j < c; j++)
35 // libnormaliz uses A*x >= 0, Macaulay2 uses A*x <= 0
36 ineqs[i][j] = (-1) * static_cast<Integer>(C->elem(i, j).get_mpz());
37
38 auto cone = libnormaliz::Cone<Integer>(libnormaliz::Type::inequalities, ineqs);
39 auto rays = cone.getExtremeRays();
40 size_t n = rays.size(); // number of extremal rays
41
43 for (size_t i = 0; i < n; i++)
44 for (size_t j = 0; j < c; j++)
45 {
46 mpz_ptr z = newitem(__mpz_struct);
47 mpz_init_set(z, rays[i][j].get_mpz_t());
49 mat.set_entry(i, j, ring_elem(z));
50 }
51
52 return mat.to_matrix();
53 } catch (const exc::engine_error &e)
54 {
55 ERROR(e.what());
56 return nullptr;
57 }
58}
const Ring * get_ring() const
Definition matrix.hpp:134
ring_elem elem(int i, int j) const
Definition matrix.cpp:307
int n_cols() const
Definition matrix.hpp:147
int n_rows() const
Definition matrix.hpp:146
Mutable builder used to assemble an immutable Matrix one column (or one term) at a time.
virtual FreeModule * make_FreeModule() const
Definition ring.cpp:53
xxx xxx xxx
Definition ring.hpp:102
mpz_class Integer
Definition cone.cpp:17
void mpz_reallocate_limbs(mpz_ptr _z)
Definition gmp-util.h:46
const int ERROR
Definition m2-mem.cpp:55
#define newitem(T)
Definition newdelete.hpp:86

References Matrix::elem(), ERROR, Matrix::get_ring(), Ring::make_FreeModule(), Matrix, mpz_reallocate_limbs(), Matrix::n_cols(), Matrix::n_rows(), newitem, MatrixConstructor::set_entry(), and MatrixConstructor::to_matrix().