tensor.cpp 1.33 KB
Newer Older
Chao Liu's avatar
Chao Liu committed
1
2
3
4
5
#include <boost/range/adaptor/transformed.hpp>
#include <cassert>

#include "tensor.hpp"

Chao Liu's avatar
Chao Liu committed
6
TensorDescriptor::TensorDescriptor(std::initializer_list<std::size_t> lens) : mLens(lens)
Chao Liu's avatar
Chao Liu committed
7
8
9
10
{
    this->CalculateStrides();
}

Chao Liu's avatar
Chao Liu committed
11
12
TensorDescriptor::TensorDescriptor(std::vector<std::size_t> lens, std::vector<std::size_t> strides)
    : mLens(lens), mStrides(strides)
Chao Liu's avatar
Chao Liu committed
13
14
15
16
17
18
19
{
}

void TensorDescriptor::CalculateStrides()
{
    mStrides.clear();
    mStrides.resize(mLens.size(), 0);
Chao Liu's avatar
Chao Liu committed
20
    if(mStrides.empty())
Chao Liu's avatar
Chao Liu committed
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
        return;

    mStrides.back() = 1;
    std::partial_sum(
        mLens.rbegin(), mLens.rend() - 1, mStrides.rbegin() + 1, std::multiplies<std::size_t>());
}

std::size_t TensorDescriptor::GetDimension() const { return mLens.size(); }

std::size_t TensorDescriptor::GetElementSize() const
{
    assert(mLens.size() == mStrides.size());
    return std::accumulate(
        mLens.begin(), mLens.end(), std::size_t{1}, std::multiplies<std::size_t>());
}

std::size_t TensorDescriptor::GetElementSpace() const
{
Chao Liu's avatar
Chao Liu committed
39
    auto ls = mLens | boost::adaptors::transformed([](std::size_t v) { return v - 1; });
Chao Liu's avatar
Chao Liu committed
40
41
    return std::inner_product(ls.begin(), ls.end(), mStrides.begin(), std::size_t{0}) + 1;
}
Chao Liu's avatar
Chao Liu committed
42
43
44
45

const std::vector<std::size_t>& TensorDescriptor::GetLengths() const { return mLens; }

const std::vector<std::size_t>& TensorDescriptor::GetStrides() const { return mStrides; }