xref: /llvm-project/mlir/lib/ExecutionEngine/SparseTensor/MapRef.cpp (revision d3af65358d5935dbf4710ebaa8f822e859b64cf4)
1*d3af6535SAart Bik //===- MapRef.cpp - A dim2lvl/lvl2dim map reference wrapper ---------------===//
2*d3af6535SAart Bik //
3*d3af6535SAart Bik // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*d3af6535SAart Bik // See https://llvm.org/LICENSE.txt for license information.
5*d3af6535SAart Bik // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*d3af6535SAart Bik //
7*d3af6535SAart Bik //===----------------------------------------------------------------------===//
8*d3af6535SAart Bik 
9*d3af6535SAart Bik #include "mlir/ExecutionEngine/SparseTensor/MapRef.h"
10*d3af6535SAart Bik 
11*d3af6535SAart Bik mlir::sparse_tensor::MapRef::MapRef(uint64_t d, uint64_t l, const uint64_t *d2l,
12*d3af6535SAart Bik                                     const uint64_t *l2d)
13*d3af6535SAart Bik     : dimRank(d), lvlRank(l), dim2lvl(d2l), lvl2dim(l2d),
14*d3af6535SAart Bik       isPermutation(isPermutationMap()) {
15*d3af6535SAart Bik   if (isPermutation) {
16*d3af6535SAart Bik     for (uint64_t i = 0; i < dimRank; i++)
17*d3af6535SAart Bik       assert(lvl2dim[dim2lvl[i]] == i);
18*d3af6535SAart Bik   }
19*d3af6535SAart Bik }
20*d3af6535SAart Bik 
21*d3af6535SAart Bik bool mlir::sparse_tensor::MapRef::isPermutationMap() const {
22*d3af6535SAart Bik   if (dimRank != lvlRank)
23*d3af6535SAart Bik     return false;
24*d3af6535SAart Bik   std::vector<bool> seen(dimRank, false);
25*d3af6535SAart Bik   for (uint64_t i = 0; i < dimRank; i++) {
26*d3af6535SAart Bik     const uint64_t j = dim2lvl[i];
27*d3af6535SAart Bik     if (j >= dimRank || seen[j])
28*d3af6535SAart Bik       return false;
29*d3af6535SAart Bik     seen[j] = true;
30*d3af6535SAart Bik   }
31*d3af6535SAart Bik   return true;
32*d3af6535SAart Bik }
33