MLIR: include/mlir/Analysis/Presburger/IntegerRelation.h Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15 #ifndef MLIR_ANALYSIS_PRESBURGER_INTEGERRELATION_H

16 #define MLIR_ANALYSIS_PRESBURGER_INTEGERRELATION_H

17

22 #include "llvm/ADT/DynamicAPInt.h"

23 #include "llvm/ADT/SmallVector.h"

24 #include "llvm/Support/LogicalResult.h"

25 #include

26

27 namespace mlir {

28 namespace presburger {

29 using llvm::DynamicAPInt;

30 using llvm::failure;

31 using llvm::int64fromDynamicAPInt;

32 using llvm::LogicalResult;

34 using llvm::success;

35

36 class IntegerRelation;

37 class IntegerPolyhedron;

38 class PresburgerSet;

39 class PresburgerRelation;

40 struct SymbolicLexOpt;

41

42

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

65 public:

66

74 };

75

76

77

79 unsigned numReservedEqualities, unsigned numReservedCols,

82 numReservedEqualities, numReservedCols),

84 numReservedCols) {

86 }

87

88

91 0,

93

95

96

97

100 }

101

102

106 invalidEq.back() = 1;

108 return result;

109 }

110

111

113

115

116

117 std::unique_ptr clone() const;

118

119

121

122

123

125

126

127

128

129

130

132

133

134

135

137

139

140

141

143

144

149 }

150

151

152

154

155

156

157

158

159

161

162

163

165

166

167

168

170

171

172

173

174

175

177

178

179

180

182

183

184 inline DynamicAPInt atEq(unsigned i, unsigned j) const {

186 }

187

188

189 inline int64_t atEq64(unsigned i, unsigned j) const {

191 }

192 inline DynamicAPInt &atEq(unsigned i, unsigned j) { return equalities(i, j); }

193

194

195 inline DynamicAPInt atIneq(unsigned i, unsigned j) const {

197 }

198

199

200 inline int64_t atIneq64(unsigned i, unsigned j) const {

202 }

203 inline DynamicAPInt &atIneq(unsigned i, unsigned j) {

205 }

206

209 }

210

215

219 }

221

222

224

226

229 }

230

233 }

234

237 }

238

241 }

244 }

245

246

249 }

252 }

253

255

256

259 }

260

261

264 }

265

266

269 }

270

271

272

274 unsigned varLimit) const {

276 }

277

278

280

281

282

283

284

285

286

287

288

290 public:

292 unsigned numEqs)

293 : space(space), numIneqs(numIneqs), numEqs(numEqs) {}

296 unsigned getNumEqs() const { return numEqs; }

297

298 private:

300 unsigned numIneqs, numEqs;

301 };

302 CountsSnapshot getCounts() const;

303 void truncate(const CountsSnapshot &counts);

304

305

306

307

308

309

311

312

313

314

315

317

318

322 }

323

327 }

328

329

330

331

333

334

335

336

339 unsigned varLimit);

340

341

343

346

347

350

351

352

353

354

356

357

358

359

360

361

363

364

365 virtual void swapVar(unsigned posA, unsigned posB);

366

367

369

370

371

375 }

376

377

379

380

381

382

383 void

388 unsigned offset = 0, unsigned num = 0) const;

389

390

391

392

393

394

396

397

399

400

401

402

403

405

406

407

408

410

411

412

413

414

416

417

418

419

420

421

422

423 std::optional<SmallVector<DynamicAPInt, 8>> findIntegerSample() const;

424

425

426

427

428 std::optional computeVolume() const;

429

430

431

435 }

436

437

438 std::optional<SmallVector<DynamicAPInt, 8>>

440 std::optional<SmallVector<DynamicAPInt, 8>>

443 }

444

445

446

447

448

449

450

451

452

453

455

456

457 void addBound(BoundType type, unsigned pos, const DynamicAPInt &value);

459 addBound(type, pos, DynamicAPInt(value));

460 }

461

462

464 const DynamicAPInt &value);

467 }

468

469

470

471

472

473

475 const DynamicAPInt &divisor);

478 }

479

480

481

482

483

484

485 void projectOut(unsigned pos, unsigned num);

487

488

489

490

491

493

494

495

497

498

499

500

501

502

503

504

505

506

507

508

509

510

511

512

513

514

516

517

518

519

520

521

522

523

524

525

526

527

528

529

530

531

532

535 DynamicAPInt *boundFloorDivisor = nullptr,

537 unsigned *minUbPos = nullptr) const;

538

539

542 int64_t *boundFloorDivisor = nullptr,

544 unsigned *minUbPos = nullptr) const {

546 DynamicAPInt boundFloorDivisorDynamicAPInt;

548 pos, &lbDynamicAPInt, &boundFloorDivisorDynamicAPInt, &ubDynamicAPInt,

549 minLbPos, minUbPos);

550 if (lb)

552 if (ub)

554 if (boundFloorDivisor)

555 *boundFloorDivisor = static_cast<int64_t>(boundFloorDivisorDynamicAPInt);

556 return llvm::transformOptional(result, int64fromDynamicAPInt);

557 }

558

559

560

562 unsigned pos) const;

563

564

566 unsigned pos) const {

568 int64fromDynamicAPInt);

569 }

570

571

572

574

575

576

578

579

580

581

582

583

584

586

587

588

590

591

592

593

594

595

597

599

600

601

603

604

605

606

607

608

610 VarKind dstKind, unsigned pos);

615 }

618 }

619

620

621

622

624

625

626

627

628

629

630

631

632

633

634

635

636

637

638

639

640

641

642

643

644

645

646

648

649

651

652

653

654

655

658 }

659

660

662

663

665

666

667

668

669

671

672

673

674

675

677

678

679

680

681

683

684

685

686

687

688

689

691

692

693

694

695

696

697

698

699

700

701

703

704

705

706

707

709

710

711

712

714

715

716

717

718

720

721

722

723

724

725

726

727

728

729

730

731

732

733

734

735

736

737

738

739

740

741

742

744

745

747

748

749

750

752 bool isEq) const;

753

754

755

757

758

760

761

762

763

764

765

766

768

769 void print(raw_ostream &os) const;

770 void dump() const;

771

772 protected:

773

774

775

776

778

779

780

781 template

783

784

785 template

787 return computeConstantLowerOrUpperBound(pos).map(

788 int64fromDynamicAPInt);

789 }

790

791

792

793

796 }

797

798

799

800

801

802

803

805

806

807

808

810

811

812

814

815

816

817

818

819

820

821

823 bool *isResultIntegerExact = nullptr);

824

825

826

827

828

829

830

832

833

835

836

837

838 bool isColZero(unsigned pos) const;

839

840

841

843

844

845

846

848

849

850

851 virtual void printSpace(raw_ostream &os) const;

852

853

854

855

856 void removeVarRange(unsigned varStart, unsigned varLimit);

857

858

859

861

862

863

865

866

867

868

869

870

871

872

873

874

875

877

879

880

882

883

885 };

886

887

888

889

890

891

892

893

894

895

896

897

898

899

900

901

902

903

905 public:

906

907

909 unsigned numReservedEqualities, unsigned numReservedCols,

911 : IntegerRelation(numReservedInequalities, numReservedEqualities,

912 numReservedCols, space) {

914 "Number of domain vars should be zero in Set kind space.");

915 }

916

917

918

921 0,

923

924

925

931 }

932

933

934

935

942 }

943

944

945

949 "Number of domain vars should be zero in Set kind space.");

950 }

951

952

953

956 "Number of domain vars should be zero in Set kind space.");

957 }

958

959

960

963 }

964

965

967

971 }

972

973

974 std::unique_ptr clone() const;

975

976

977

978

979

981

982

983

985

986

987

989 };

990

991 }

992 }

993

994 #endif

union mlir::linalg::@1203::ArityGroupAndKind::Kind kind

Class storing division representation of local variables of a constraint system.

An Identifier stores a pointer to an object, such as a Value or an Operation.

An IntegerPolyhedron represents the set of points from a PresburgerSpace that satisfy a list of affin...

IntegerPolyhedron(IntegerRelation &&rel)

Construct a set from an IntegerRelation, but instead of creating a copy, use move constructor.

IntegerPolyhedron(const IntegerRelation &rel)

Construct a set from an IntegerRelation.

static bool classof(const IntegerRelation *cst)

IntegerPolyhedron(const PresburgerSpace &space, const FracMatrix &inequalities)

Constructs a relation with the specified number of dimensions and symbols and adds the given inequali...

IntegerPolyhedron intersect(const IntegerPolyhedron &other) const

Return the intersection of the two relations.

IntegerPolyhedron(const PresburgerSpace &space, const IntMatrix &inequalities)

Constructs a relation with the specified number of dimensions and symbols and adds the given inequali...

Kind getKind() const override

Return the kind of this IntegerRelation.

unsigned insertVar(VarKind kind, unsigned pos, unsigned num=1) override

Insert num variables of the specified kind at position pos.

PresburgerSet subtract(const PresburgerSet &other) const

Return the set difference of this set and the given set, i.e., return this \ set.

IntegerPolyhedron(const PresburgerSpace &space)

Constructs a relation with the specified number of dimensions and symbols.

IntegerPolyhedron(unsigned numReservedInequalities, unsigned numReservedEqualities, unsigned numReservedCols, const PresburgerSpace &space)

Constructs a set reserving memory for the specified number of constraints and variables.

std::unique_ptr< IntegerPolyhedron > clone() const

static IntegerPolyhedron getUniverse(const PresburgerSpace &space)

Return a system with no constraints, i.e., one which is satisfied by all points.

An IntegerRelation represents the set of points from a PresburgerSpace that satisfy a list of affine ...

Kind

All derived classes of IntegerRelation.

@ FlatLinearValueConstraints

@ FlatAffineValueConstraints

std::optional< DynamicAPInt > getConstantBoundOnDimSize(unsigned pos, SmallVectorImpl< DynamicAPInt > *lb=nullptr, DynamicAPInt *boundFloorDivisor=nullptr, SmallVectorImpl< DynamicAPInt > *ub=nullptr, unsigned *minLbPos=nullptr, unsigned *minUbPos=nullptr) const

Returns the smallest known constant bound for the extent of the specified variable (pos^th),...

void setId(VarKind kind, unsigned i, Identifier id)

Set the identifier for the ith variable of the specified kind of the IntegerRelation's PresburgerSpac...

void addInequality(ArrayRef< int64_t > inEq)

virtual void swapVar(unsigned posA, unsigned posB)

Swap the posA^th variable with the posB^th variable.

void setAndEliminate(unsigned pos, ArrayRef< int64_t > values)

void removeIndependentConstraints(unsigned pos, unsigned num)

Removes constraints that are independent of (i.e., do not have a coefficient) variables in the range ...

void compose(const IntegerRelation &rel)

Let the relation this be R1, and the relation rel be R2.

int64_t atEq64(unsigned i, unsigned j) const

The same, but casts to int64_t.

void applyRange(const IntegerRelation &rel)

Given a relation rel, apply the relation to the range of this relation.

unsigned getVarKindEnd(VarKind kind) const

Return the index at Which the specified kind of vars ends.

ArrayRef< Identifier > getIds(VarKind kind)

Get the identifiers for the variables of specified varKind.

PresburgerSpace getSpaceWithoutLocals() const

Returns a copy of the space without locals.

void removeTrivialRedundancy()

Removes duplicate constraints, trivially true constraints, and constraints that can be detected as re...

static IntegerRelation getEmpty(const PresburgerSpace &space)

Return an empty system containing an invalid equation 0 = 1.

void addBound(BoundType type, unsigned pos, int64_t value)

unsigned getNumReservedEqualities() const

std::optional< unsigned > findConstraintWithNonZeroAt(unsigned colIdx, bool isEq) const

Finds a constraint with a non-zero coefficient at colIdx in equality (isEq=true) or inequality (isEq=...

void removeInequalityRange(unsigned start, unsigned end)

void convertVarKind(VarKind srcKind, unsigned varStart, unsigned varLimit, VarKind dstKind)

std::optional< int64_t > getConstantBoundOnDimSize64(unsigned pos, SmallVectorImpl< int64_t > *lb=nullptr, int64_t *boundFloorDivisor=nullptr, SmallVectorImpl< int64_t > *ub=nullptr, unsigned *minLbPos=nullptr, unsigned *minUbPos=nullptr) const

The same, but casts to int64_t.

void normalizeConstraintsByGCD()

Normalized each constraints by the GCD of its coefficients.

static bool classof(const IntegerRelation *cst)

void truncate(const CountsSnapshot &counts)

virtual void eliminateRedundantLocalVar(unsigned posA, unsigned posB)

Eliminate the posB^th local variable, replacing every instance of it with the posA^th local variable.

CountsSnapshot getCounts() const

std::optional< DynamicAPInt > computeConstantLowerOrUpperBound(unsigned pos)

Returns the constant lower bound if isLower is true, and the upper bound if isLower is false.

SmallVector< int64_t, 8 > getEquality64(unsigned idx) const

The same, but casts to int64_t.

void removeEqualityRange(unsigned start, unsigned end)

Remove the (in)equalities at positions [start, end).

LogicalResult constantFoldVar(unsigned pos)

Tries to fold the specified variable to a constant using a trivial equality detection; if successful,...

unsigned getNumSymbolVars() const

void removeEquality(unsigned pos)

std::optional< int64_t > getConstantBound64(BoundType type, unsigned pos) const

The same, but casts to int64_t.

bool isObviouslyEqual(const IntegerRelation &other) const

Perform a quick equality check on this and other.

IntegerPolyhedron getRangeSet() const

Return a set corresponding to all points in the range of the relation.

std::optional< SmallVector< DynamicAPInt, 8 > > containsPointNoLocal(ArrayRef< DynamicAPInt > point) const

Given the values of non-local vars, return a satisfying assignment to the local if one exists,...

ArrayRef< DynamicAPInt > getInequality(unsigned idx) const

unsigned getNumVarKind(VarKind kind) const

Get the number of vars of the specified kind.

bool isEmptyByGCDTest() const

Runs the GCD test on all equality constraints.

void simplify()

Simplify the constraint system by removing canonicalizing constraints and removing redundant constrai...

void convertVarKind(VarKind srcKind, unsigned varStart, unsigned varLimit, VarKind dstKind, unsigned pos)

Converts variables of kind srcKind in the range [varStart, varLimit) to variables of kind dstKind.

void removeDuplicateDivs()

void addBound(BoundType type, unsigned pos, const DynamicAPInt &value)

Adds a constant bound for the specified variable.

unsigned appendVar(VarKind kind, unsigned num=1)

Append num variables of the specified kind after the last variable of that kind.

void intersectRange(const IntegerPolyhedron &poly)

Intersect the given poly with the range in-place.

void addLocalFloorDiv(ArrayRef< DynamicAPInt > dividend, const DynamicAPInt &divisor)

Adds a new local variable as the floordiv of an affine function of other variables,...

void print(raw_ostream &os) const

bool isIntegerEmpty() const

Returns true if the set of constraints is found to have no solution, false if a solution exists.

DynamicAPInt & atEq(unsigned i, unsigned j)

VarKind getVarKindAt(unsigned pos) const

Return the VarKind of the var at the specified position.

void addEquality(ArrayRef< int64_t > eq)

DynamicAPInt atIneq(unsigned i, unsigned j) const

Returns the value at the specified inequality row and column.

void projectOut(unsigned pos)

virtual unsigned insertVar(VarKind kind, unsigned pos, unsigned num=1)

Insert num variables of the specified kind at position pos.

bool containsPoint(ArrayRef< DynamicAPInt > point) const

Returns true if the given point satisfies the constraints, or false otherwise.

std::optional< SmallVector< DynamicAPInt, 8 > > findIntegerSample() const

Find an integer sample point satisfying the constraints using a branch and bound algorithm with gener...

bool hasInvalidConstraint() const

Checks all rows of equality/inequality constraints for trivial contradictions (for example: 1 == 0,...

LogicalResult unionBoundingBox(const IntegerRelation &other)

Updates the constraints to be the smallest bounding (enclosing) box that contains the points of this ...

IntegerRelation(unsigned numReservedInequalities, unsigned numReservedEqualities, unsigned numReservedCols, const PresburgerSpace &space)

Constructs a relation reserving memory for the specified number of constraints and variables.

bool containsPoint(ArrayRef< int64_t > point) const

bool isHyperRectangular(unsigned pos, unsigned num) const

Returns true if the set can be trivially detected as being hyper-rectangular on the specified contigu...

void convertToLocal(VarKind kind, unsigned varStart, unsigned varLimit)

IntMatrix getBoundedDirections() const

Returns a matrix where each row is a vector along which the polytope is bounded.

unsigned getNumDomainVars() const

LogicalResult gaussianEliminateVar(unsigned position)

Eliminates a single variable at position from equality and inequality constraints.

void clearConstraints()

Removes all equalities and inequalities.

DynamicAPInt atEq(unsigned i, unsigned j) const

Returns the value at the specified equality row and column.

IntegerRelation intersect(IntegerRelation other) const

Return the intersection of the two relations.

std::optional< DynamicAPInt > computeVolume() const

Compute an overapproximation of the number of integer points in the relation.

MaybeOptimum< SmallVector< DynamicAPInt, 8 > > findIntegerLexMin() const

Same as above, but returns lexicographically minimal integer point.

void removeTrivialEqualities()

SymbolicLexOpt findSymbolicIntegerLexMin() const

Compute the symbolic integer lexmin of the relation.

void setSpace(const PresburgerSpace &oSpace)

Set the space to oSpace, which should have the same number of ids as the current space.

int findEqualityToConstant(unsigned pos, bool symbolic=false) const

Finds an equality that equates the specified variable to a constant.

static IntegerRelation getUniverse(const PresburgerSpace &space)

Return a system with no constraints, i.e., one which is satisfied by all points.

unsigned getNumVars() const

void inverse()

Invert the relation i.e., swap its domain and range.

void append(const IntegerRelation &other)

Appends constraints from other into this.

void applyDomain(const IntegerRelation &rel)

Given a relation rel, apply the relation to the domain of this relation.

void intersectDomain(const IntegerPolyhedron &poly)

Intersect the given poly with the domain in-place.

PresburgerRelation subtract(const PresburgerRelation &set) const

Return the set difference of this set and the given set, i.e., return this \ set.

bool isEqual(const IntegerRelation &other) const

Return whether this and other are equal.

virtual void printSpace(raw_ostream &os) const

Prints the number of constraints, dimensions, symbols and locals in the IntegerRelation.

void addEquality(ArrayRef< DynamicAPInt > eq)

Adds an equality from the coefficients specified in eq.

void setDimSymbolSeparation(unsigned newSymbolCount)

Changes the partition between dimensions and symbols.

unsigned getNumRangeVars() const

unsigned getNumLocalVars() const

unsigned getNumReservedInequalities() const

void removeRedundantConstraints()

Removes redundant constraints using Simplex.

PresburgerRelation computeReprWithOnlyDivLocals() const

Compute an equivalent representation of the same set, such that all local vars in all disjuncts have ...

void removeRedundantInequalities()

A more expensive check than removeTrivialRedundancy to detect redundant inequalities.

bool isObviouslyEmpty() const

Performs GCD checks and invalid constraint checks.

IntMatrix equalities

Coefficients of affine equalities (in == 0 form).

SymbolicLexOpt findSymbolicIntegerLexMax() const

Same as findSymbolicIntegerLexMin but produces lexmax instead of lexmin.

unsigned getNumDimAndSymbolVars() const

bool gaussianEliminate()

Perform a Gaussian elimination operation to reduce all equations to standard form.

void addLocalFloorDiv(ArrayRef< int64_t > dividend, int64_t divisor)

void truncateVarKind(VarKind kind, unsigned num)

Truncate the vars of the specified kind to the specified number by dropping some vars at the end.

virtual Kind getKind() const

Return the kind of this IntegerRelation.

void constantFoldVarRange(unsigned pos, unsigned num)

This method calls constantFoldVar for the specified range of variables, num variables starting at pos...

bool isEmpty() const

Checks for emptiness by performing variable elimination on all variables, running the GCD test on eac...

unsigned getNumCols() const

Returns the number of columns in the constraint system.

IntegerRelation(const PresburgerSpace &space)

Constructs a relation with the specified number of dimensions and symbols.

void getLowerAndUpperBoundIndices(unsigned pos, SmallVectorImpl< unsigned > *lbIndices, SmallVectorImpl< unsigned > *ubIndices, SmallVectorImpl< unsigned > *eqIndices=nullptr, unsigned offset=0, unsigned num=0) const

Gather positions of all lower and upper bounds of the variable at pos, and optionally any equalities ...

void gcdTightenInequalities()

Tightens inequalities given that we are dealing with integer spaces.

std::optional< int64_t > computeConstantLowerOrUpperBound64(unsigned pos)

The same, but casts to int64_t.

void removeVar(VarKind kind, unsigned pos)

Removes variables of the specified kind with the specified pos (or within the specified range) from t...

void setSpaceExceptLocals(const PresburgerSpace &oSpace)

Set the space to oSpace, which should not have any local ids.

unsigned gaussianEliminateVars(unsigned posStart, unsigned posLimit)

Eliminates variables from equality and inequality constraints in column range [posStart,...

void removeInequality(unsigned pos)

void mergeAndCompose(const IntegerRelation &other)

Given a relation other: (A -> B), this operation merges the symbol and local variables and then takes...

IntegerPolyhedron getDomainSet() const

Return a set corresponding to all points in the domain of the relation.

void addBound(BoundType type, ArrayRef< int64_t > expr, int64_t value)

DivisionRepr getLocalReprs(std::vector< MaybeLocalRepr > *repr=nullptr) const

Returns a DivisonRepr representing the division representation of local variables in the constraint s...

bool hasOnlyDivLocals() const

Check whether all local ids have a division representation.

constexpr static unsigned kExplosionFactor

A parameter that controls detection of an unrealistic number of constraints.

IntMatrix getInequalities() const

std::optional< DynamicAPInt > getConstantBound(BoundType type, unsigned pos) const

Returns the constant bound for the pos^th variable if there is one; std::nullopt otherwise.

virtual void clearAndCopyFrom(const IntegerRelation &other)

Replaces the contents of this IntegerRelation with other.

void projectOut(unsigned pos, unsigned num)

Projects out (aka eliminates) num variables starting at position pos.

void addInequality(ArrayRef< DynamicAPInt > inEq)

Adds an inequality (>= 0) from the coefficients specified in inEq.

unsigned getVarKindOverlap(VarKind kind, unsigned varStart, unsigned varLimit) const

Get the number of elements of the specified kind in the range [varStart, varLimit).

void mergeAndAlignSymbols(IntegerRelation &other)

Merge and align symbol variables of this and other with respect to identifiers.

std::optional< SmallVector< DynamicAPInt, 8 > > containsPointNoLocal(ArrayRef< int64_t > point) const

void removeRedundantLocalVars()

Removes local variables using equalities.

unsigned mergeLocalVars(IntegerRelation &other)

Adds additional local vars to the sets such that they both have the union of the local vars in each s...

unsigned getNumConstraints() const

virtual ~IntegerRelation()=default

MaybeOptimum< SmallVector< Fraction, 8 > > findRationalLexMin() const

Get the lexicographically minimum rational point satisfying the constraints.

IntMatrix inequalities

Coefficients of affine inequalities (in >= 0 form).

virtual bool hasConsistentState() const

Returns false if the fields corresponding to various variable counts, or equality/inequality buffer s...

ArrayRef< DynamicAPInt > getEquality(unsigned idx) const

unsigned getNumInequalities() const

SmallVector< int64_t, 8 > getInequality64(unsigned idx) const

bool isSubsetOf(const IntegerRelation &other) const

Return whether this is a subset of the given IntegerRelation.

std::unique_ptr< IntegerRelation > clone() const

const PresburgerSpace & getSpace() const

Returns a reference to the underlying space.

DynamicAPInt & atIneq(unsigned i, unsigned j)

void setAndEliminate(unsigned pos, ArrayRef< DynamicAPInt > values)

Sets the values.size() variables starting at pos to the specified values and removes them.

unsigned getNumEqualities() const

bool isColZero(unsigned pos) const

Returns true if the pos^th column is all zero for both inequalities and equalities.

unsigned getVarKindOffset(VarKind kind) const

Return the index at which the specified kind of vars starts.

unsigned getNumDimVars() const

int64_t atIneq64(unsigned i, unsigned j) const

The same, but casts to int64_t.

virtual void removeVarRange(VarKind kind, unsigned varStart, unsigned varLimit)

virtual void fourierMotzkinEliminate(unsigned pos, bool darkShadow=false, bool *isResultIntegerExact=nullptr)

Eliminates the variable at the specified position using Fourier-Motzkin variable elimination,...

bool removeDuplicateConstraints()

Checks for identical inequalities and eliminates redundant inequalities.

unsigned getNumRows() const

MutableArrayRef< T > getRow(unsigned row)

Get a [Mutable]ArrayRef corresponding to the specified row.

unsigned getNumReservedRows() const

Return the maximum number of rows/columns that can be added without incurring a reallocation.

A PresburgerRelation represents a union of IntegerRelations that live in the same PresburgerSpace wit...

PresburgerSpace is the space of all possible values of a tuple of integer valued variables/variables.

unsigned getNumRangeVars() const

unsigned getNumSymbolVars() const

unsigned getNumVarKind(VarKind kind) const

Get the number of vars of the specified kind.

void resetIds()

Reset the stored identifiers in the space.

unsigned getNumDimAndSymbolVars() const

unsigned getVarKindOffset(VarKind kind) const

Return the index at which the specified kind of var starts.

unsigned getVarKindEnd(VarKind kind) const

Return the index at Which the specified kind of var ends.

unsigned getNumVars() const

unsigned getNumLocalVars() const

VarKind getVarKindAt(unsigned pos) const

Return the VarKind of the var at the specified position.

unsigned getNumDomainVars() const

unsigned getVarKindOverlap(VarKind kind, unsigned varStart, unsigned varLimit) const

Get the number of elements of the specified kind in the range [varStart, varLimit).

void setVarSymbolSeparation(unsigned newSymbolCount)

Changes the partition between dimensions and symbols.

unsigned getNumDimVars() const

static PresburgerSpace getRelationSpace(unsigned numDomain=0, unsigned numRange=0, unsigned numSymbols=0, unsigned numLocals=0)

BoundType

The type of bound: equal, lower bound or upper bound.

SmallVector< DynamicAPInt, 8 > getDynamicAPIntVec(ArrayRef< int64_t > range)

Check if the pos^th variable can be expressed as a floordiv of an affine function of other variables ...

SmallVector< int64_t, 8 > getInt64Vec(ArrayRef< DynamicAPInt > range)

Return the given array as an array of int64_t.

Include the generated interface declarations.

The struct CountsSnapshot stores the count of each VarKind, and also of each constraint type.

const PresburgerSpace & getSpace() const

unsigned getNumIneqs() const

unsigned getNumEqs() const

CountsSnapshot(const PresburgerSpace &space, unsigned numIneqs, unsigned numEqs)

Represents the result of a symbolic lexicographic optimization computation.

Eliminates variable at the specified position using Fourier-Motzkin variable elimination.