Defining Tensors

Declaring Tensors

taco::Tensor objects, which correspond to mathematical tensors, form the core of the TACO C++ API. You can declare a new tensor by specifying its name, a vector containing the size of each dimension of the tensor, and the storage format that will be used to store the tensor:

// Declare a new tensor "A" of double-precision floats with dimensions 
// 512 x 64 x 2048, stored as a dense-sparse-sparse tensor
Tensor<double> A("A", {512,64,2048}, Format({Dense,Sparse,Sparse}));

The name of the tensor can be omitted, in which case TACO will assign an arbitrary name to the tensor:

// Declare another tensor with the same dimensions and storage format as before
Tensor<double> A({512,64,2048}, Format({Dense,Sparse,Sparse}));

Scalars, which are treated as order-0 tensors, can be declared and initialized with some arbitrary value as demonstrated below:

Tensor<double> alpha(42.0);  // Declare a scalar tensor initialized to 42.0

Defining Tensor Formats

Conceptually, you can think of a tensor as a tree with each level (excluding the root) corresponding to a dimension of the tensor. Each path from the root to a leaf node represents a tensor coordinate and its corresponding value. Which dimension each level of the tree corresponds to is determined by the order in which dimensions of the tensor are stored.

TACO uses a novel scheme that can describe different storage formats for any tensor by specifying the order in which tensor dimensions are stored and whether each dimension is sparse or dense. A sparse dimension stores only the subset of the dimension that contains non-zero values and is conceptually similar to the index arrays used in the compressed sparse row (CSR) matrix format, while a dense dimension stores both zeros and non-zeros. As demonstrated below, this scheme is flexibile enough to express many commonly-used matrix storage formats.

You can define a new tensor storage format by creating a taco::Format object. The constructor for taco::Format takes as arguments a vector specifying the type of each dimension and (optionally) a vector specifying the order in which dimensions are to be stored, following the above scheme:

Format   dm({Dense,Dense});           // (Row-major) dense matrix
Format  csr({Dense,Sparse});          // Compressed sparse row matrix
Format  csc({Dense,Sparse}, {1,0});   // Compressed sparse column matrix
Format dcsr({Sparse,Sparse}, {1,0});  // Doubly compressed sparse column matrix

Alternatively, you can define a tensor format that contains only sparse or dense dimensions as follows:

Format csf(Sparse);  // Compressed sparse fiber tensor

Initializing Tensors

You can initialize a taco::Tensor by calling the insert method to add a non-zero component to the tensor. The insert method takes two arguments, a vector specifying the coordinate of the non-zero component to be added and the value to be inserted at that coordinate:

A.insert({128,32,1024}, 42.0);  // A(128,32,1024) = 42.0

The insert method adds the inserted non-zeros to a temporary buffer. Before a tensor can actually be used in a computation though, you must invoke the pack method to compress the tensor into the storage format that was specified when the tensor was first declared:

A.pack();  // Construct dense-sparse-sparse tensor containing inserted non-zeros

Loading Tensors from File

Rather than manually invoking insert and pack to initialize a tensor, you can load tensors directly from file by calling taco::read as demonstrated below:

// Load a dense-sparse-sparse tensor from file A.tns
A = read("A.tns", Format({Dense, Sparse, Sparse}));

By default, taco::read returns a packed tensor. You can optionally pass a Boolean flag as an argument to indicate whether the returned tensor should be packed or not:

// Load an unpacked tensor from file A.tns
A = read("A.tns", Format({Dense, Sparse, Sparse}), false);

Currently, TACO supports loading from the following matrix and tensor file formats:

Writing Tensors to File

You can also write a (packed) tensor directly to file by calling taco::write, as demonstrated below:

write("A.tns", A);  // Write tensor A to file A.tns

taco::write supports the same set of matrix and tensor file formats as taco::read.