Macaulay2 Engine
Loading...
Searching...
No Matches
cone.cpp
Go to the documentation of this file.
1// Written in 2021 by Mahrud Sayrafi
2
3#include "interface/cone.h"
4
5#include <M2/math-include.h>
6
7#include "debug.hpp"
9#include "interface/matrix.h"
10#include "matrix-con.hpp"
11#include "matrix.hpp"
12#include "relem.hpp"
13
14#include <libnormaliz/cone.h>
15#include <vector>
16
17typedef mpz_class Integer;
18
22
23const Matrix /* or null */ *rawFourierMotzkin(const Matrix *C)
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}
59
60const Matrix /* or null */ *rawHilbertBasis(const Matrix *C)
61{
62 try
63 {
64 // TODO: Check that C is over ZZ
65 // TODO: for cones over QQ, lift to ZZ first
66 // TODO: Normaliz also supports algebraic cones defined over
67 // algebraic number fields embedded in RR
68 const Ring *R = C->get_ring();
69 const size_t c = C->n_cols(); // rank of ambient lattice
70 const size_t r = C->n_rows(); // number of cone rays
71
72 auto rays = libnormaliz::Matrix<Integer>(r, c);
73 for (size_t i = 0; i < r; i++)
74 for (size_t j = 0; j < c; j++)
75 rays[i][j] = static_cast<Integer>(C->elem(i, j).get_mpz());
76
77 auto cone = libnormaliz::Cone<Integer>(libnormaliz::Type::cone, rays);
78 // cone.compute(libnormaliz::ConeProperty::HilbertBasis,
79 // libnormaliz::ConeProperty::DefaultMode);
80 auto HB = cone.getHilbertBasis();
81 size_t n = HB.size(); // number of basis elements
82
84 for (size_t i = 0; i < n; i++)
85 for (size_t j = 0; j < c; j++)
86 {
87 mpz_ptr z = newitem(__mpz_struct);
88 mpz_init_set(z, HB[i][j].get_mpz_t());
90 mat.set_entry(i, j, ring_elem(z));
91 }
92
93 return mat.to_matrix();
94 } catch (const exc::engine_error &e)
95 {
96 ERROR(e.what());
97 return nullptr;
98 }
99}
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
Matrix * to_matrix()
void set_entry(int r, int c, ring_elem a)
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
const Matrix * rawHilbertBasis(const Matrix *C)
Definition cone.cpp:60
const Matrix * rawFourierMotzkin(const Matrix *C)
Definition cone.cpp:23
mpz_class Integer
Definition cone.cpp:17
Engine-boundary C API for rational polyhedral cone operations.
Debugger-callable d* helpers that pretty-print engine values to stderr.
#define Matrix
Definition factory.cpp:14
void mpz_reallocate_limbs(mpz_ptr _z)
Definition gmp-util.h:46
Inline helpers that move GMP / MPFR / MPFI limbs from malloc-managed storage into the bdwgc heap.
const int ERROR
Definition m2-mem.cpp:55
MatrixConstructor — the mutable builder that produces an immutable Matrix.
Engine-boundary C API for constructing, transforming, and inspecting immutable Matrix objects.
Matrix — the engine's immutable homomorphism F -> G between free modules.
#define newitem(T)
Definition newdelete.hpp:86
RingElement — tagged (Ring*, ring_elem) pair, the engine's universal element type.
mpz_srcptr get_mpz() const
Definition ringelem.hpp:127