//===- PWMAFunction.h - MLIR PWMAFunction Class------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // Support for piece-wise multi-affine functions. These are functions that are // defined on a domain that is a union of IntegerPolyhedrons, and on each domain // the value of the function is a tuple of integers, with each value in the // tuple being an affine expression in the vars of the IntegerPolyhedron. // //===----------------------------------------------------------------------===// #ifndef MLIR_ANALYSIS_PRESBURGER_PWMAFUNCTION_H #define MLIR_ANALYSIS_PRESBURGER_PWMAFUNCTION_H #include "mlir/Analysis/Presburger/IntegerRelation.h" #include "mlir/Analysis/Presburger/PresburgerRelation.h" #include <optional> namespace mlir { namespace presburger { /// Enum representing a binary comparison operator: equal, not equal, less than, /// less than or equal, greater than, greater than or equal. enum class OrderingKind { … }; /// This class represents a multi-affine function with the domain as Z^d, where /// `d` is the number of domain variables of the function. For example: /// /// (x, y) -> (x + 2, 2*x - 3y + 5, 2*x + y). /// /// The output expressions are represented as a matrix with one row for every /// output, one column for each var including division variables, and an extra /// column at the end for the constant term. /// /// Checking equality of two such functions is supported, as well as finding the /// value of the function at a specified point. class MultiAffineFunction { … }; /// This class represents a piece-wise MultiAffineFunction. This can be thought /// of as a list of MultiAffineFunction with disjoint domains, with each having /// their own affine expressions for their output tuples. For example, we could /// have a function with two input variables (x, y), defined as /// /// f(x, y) = (2*x + y, y - 4) if x >= 0, y >= 0 /// = (-2*x + y, y + 4) if x < 0, y < 0 /// = (4, 1) if x < 0, y >= 0 /// /// Note that the domains all have to be *disjoint*. Otherwise, the behaviour of /// this class is undefined. The domains need not cover all possible points; /// this represents a partial function and so could be undefined at some points. /// /// As in PresburgerSets, the input vars are partitioned into dimension vars and /// symbolic vars. /// /// Support is provided to compare equality of two such functions as well as /// finding the value of the function at a point. class PWMAFunction { … }; } // namespace presburger } // namespace mlir #endif // MLIR_ANALYSIS_PRESBURGER_PWMAFUNCTION_H