//===- File.h - Reading sparse tensors from files ---------------*- 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 // //===----------------------------------------------------------------------===// // // This file implements reading sparse tensor from files in one of the // following external formats: // // (1) Matrix Market Exchange (MME): *.mtx // https://math.nist.gov/MatrixMarket/formats.html // // (2) Formidable Repository of Open Sparse Tensors and Tools (FROSTT): *.tns // http://frostt.io/tensors/file-formats.html // //===----------------------------------------------------------------------===// #ifndef MLIR_EXECUTIONENGINE_SPARSETENSOR_FILE_H #define MLIR_EXECUTIONENGINE_SPARSETENSOR_FILE_H #include "mlir/ExecutionEngine/SparseTensor/MapRef.h" #include "mlir/ExecutionEngine/SparseTensor/Storage.h" #include <fstream> namespace mlir { namespace sparse_tensor { namespace detail { template <typename T> struct is_complex final : public std::false_type { … }; is_complex<std::complex<T>>; /// Returns an element-value of non-complex type. If `IsPattern` is true, /// then returns an arbitrary value. If `IsPattern` is false, then /// reads the value from the current line buffer beginning at `linePtr`. template <typename V, bool IsPattern> inline std::enable_if_t<!is_complex<V>::value, V> readValue(char **linePtr) { … } /// Returns an element-value of complex type. If `IsPattern` is true, /// then returns an arbitrary value. If `IsPattern` is false, then reads /// the value from the current line buffer beginning at `linePtr`. template <typename V, bool IsPattern> inline std::enable_if_t<is_complex<V>::value, V> readValue(char **linePtr) { … } /// Returns an element-value. If `isPattern` is true, then returns an /// arbitrary value. If `isPattern` is false, then reads the value from /// the current line buffer beginning at `linePtr`. template <typename V> inline V readValue(char **linePtr, bool isPattern) { … } } // namespace detail //===----------------------------------------------------------------------===// // // Reader class. // //===----------------------------------------------------------------------===// /// This class abstracts over the information stored in file headers, /// as well as providing the buffers and methods for parsing those headers. class SparseTensorReader final { … }; //===----------------------------------------------------------------------===// // // Reader class methods. // //===----------------------------------------------------------------------===// template <typename V> SparseTensorCOO<V> *SparseTensorReader::readCOO(const MapRef &map, const uint64_t *lvlSizes) { … } template <typename V, bool IsPattern> void SparseTensorReader::readCOOLoop(const MapRef &map, SparseTensorCOO<V> *coo) { … } template <typename C, typename V> bool SparseTensorReader::readToBuffers(uint64_t lvlRank, const uint64_t *dim2lvl, const uint64_t *lvl2dim, C *lvlCoordinates, V *values) { … } template <typename C, typename V, bool IsPattern> bool SparseTensorReader::readToBuffersLoop(const MapRef &map, C *lvlCoordinates, V *values) { … } } // namespace sparse_tensor } // namespace mlir #endif // MLIR_EXECUTIONENGINE_SPARSETENSOR_FILE_H