14#ifndef MLIR_ANALYSIS_PRESBURGER_GENERATINGFUNCTION_H
15#define MLIR_ANALYSIS_PRESBURGER_GENERATINGFUNCTION_H
56 std::vector<ParamPoint> nums,
57 std::vector<std::vector<Point>> dens)
58 : numParam(numParam), signs(std::move(signs)),
59 numerators(std::move(nums)), denominators(std::move(dens)) {
62 assert(term.getNumRows() == numParam + 1 &&
63 "dimensionality of numerator exponents does not match number of "
74 const std::vector<ParamPoint> &
getNumerators() const & {
return numerators; }
75 std::vector<ParamPoint>
getNumerators() && {
return std::move(numerators); }
82 return std::move(denominators);
90 "two generating functions with different numbers of parameters "
93 sumSigns.append(gf.signs);
95 std::vector<ParamPoint> sumNumerators = numerators;
96 llvm::append_range(sumNumerators, gf.numerators);
98 std::vector<std::vector<Point>> sumDenominators = denominators;
99 llvm::append_range(sumDenominators, gf.denominators);
101 std::move(sumNumerators),
102 std::move(sumDenominators));
105 llvm::raw_ostream &
print(llvm::raw_ostream &os)
const {
106 for (
unsigned i = 0, e = signs.size(); i < e; i++) {
118 unsigned r = numerators[i].getNumRows();
119 for (
unsigned j = 0;
j < r - 1;
j++) {
121 for (
unsigned k = 0, c = numerators[i].getNumColumns(); k < c - 1; k++)
122 os << numerators[i].at(
j, k) <<
",";
123 os << numerators[i].getRow(
j).back() <<
"],";
126 for (
unsigned k = 0, c = numerators[i].getNumColumns(); k < c - 1; k++)
127 os << numerators[i].at(r - 1, k) <<
",";
128 os << numerators[i].getRow(r - 1).back() <<
"]]/";
130 for (
const Point &den : denominators[i]) {
132 for (
unsigned j = 0, e = den.size();
j < e - 1;
j++)
134 os << den.back() <<
"])";
143 std::vector<ParamPoint> numerators;
144 std::vector<std::vector<Point>> denominators;
const std::vector< std::vector< Point > > & getDenominators() const &
unsigned getNumParams() const
const SmallVector< int > & getSigns() const &
SmallVector< int > getSigns() const &&
GeneratingFunction operator+(const GeneratingFunction &gf) const
const std::vector< ParamPoint > & getNumerators() const &
std::vector< ParamPoint > getNumerators() &&
llvm::raw_ostream & print(llvm::raw_ostream &os) const
std::vector< std::vector< Point > > getDenominators() &&
std::vector< std::vector< Point > > getDenominators() const &&
SmallVector< int > getSigns() &&
GeneratingFunction(unsigned numParam, SmallVector< int > signs, std::vector< ParamPoint > nums, std::vector< std::vector< Point > > dens)
std::vector< ParamPoint > getNumerators() const &&
SmallVector< Fraction > Point
Include the generated interface declarations.
Eliminates variable at the specified position using Fourier-Motzkin variable elimination.