tensor.cpp 1.46 KB
Newer Older
Chao Liu's avatar
Chao Liu committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <boost/range/adaptor/transformed.hpp>
#include <cassert>

#include "tensor.hpp"

TensorDescriptor::TensorDescriptor(DataType_t t, std::initializer_list<std::size_t> lens)
    : mLens(lens), mDataType(t)
{
    this->CalculateStrides();
}

TensorDescriptor::TensorDescriptor(DataType_t t,
                                   std::vector<std::size_t> lens,
                                   std::vector<std::size_t> strides)
    : mLens(lens), mStrides(strides), mDataType(t)
{
}

void TensorDescriptor::CalculateStrides()
{
    mStrides.clear();
    mStrides.resize(mLens.size(), 0);
Chao Liu's avatar
Chao Liu committed
23
    if(mStrides.empty())
Chao Liu's avatar
Chao Liu committed
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
        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
42
    auto ls = mLens | boost::adaptors::transformed([](std::size_t v) { return v - 1; });
Chao Liu's avatar
Chao Liu committed
43
44
    return std::inner_product(ls.begin(), ls.end(), mStrides.begin(), std::size_t{0}) + 1;
}
Chao Liu's avatar
Chao Liu committed
45
46
47
48

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

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