• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

daisytuner / docc / 23754803277

30 Mar 2026 04:09PM UTC coverage: 64.412% (-0.07%) from 64.485%
23754803277

Pull #620

github

web-flow
Merge b9bfa74c7 into ea3a27846
Pull Request #620: Draft of BatchNorm tensor operation with expand.

176 of 336 new or added lines in 7 files covered. (52.38%)

28791 of 44698 relevant lines covered (64.41%)

385.27 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

13.56
/sdfg/src/data_flow/library_nodes/math/tensor/tensor_layout.cpp
1
#include "sdfg/data_flow/library_nodes/math/tensor/tensor_layout.h"
2

3
#include "sdfg/serializer/json_serializer.h"
4

5
namespace sdfg::math::tensor {
6

7
TensorLayout::TensorLayout(
8
    const symbolic::MultiExpression& shape, const symbolic::MultiExpression& strides, const symbolic::Expression offset
9
)
10
    : shape_(shape), strides_(strides), offset_(offset) {
1✔
11
    if (strides.empty()) {
1✔
12
        strides_ = linear_strides();
1✔
13
    }
1✔
14
}
1✔
15

NEW
16
void TensorLayout::serialize_to_json(nlohmann::json& j) const {
×
NEW
17
    nlohmann::json shape_arr = nlohmann::json::array();
×
NEW
18
    sdfg::serializer::JSONSerializer serializer;
×
19

NEW
20
    for (auto& dim : shape_) {
×
NEW
21
        shape_arr.push_back(serializer.expression(dim));
×
NEW
22
    }
×
NEW
23
    j["shape"] = shape_arr;
×
24

NEW
25
    nlohmann::json stride_arr = nlohmann::json::array();
×
NEW
26
    for (auto& stride : strides_) {
×
NEW
27
        stride_arr.push_back(serializer.expression(stride));
×
NEW
28
    }
×
NEW
29
    j["strides"] = stride_arr;
×
30

NEW
31
    j["offset"] = serializer.expression(offset_);
×
NEW
32
}
×
33

NEW
34
std::string TensorLayout::toStr() const {
×
NEW
35
    std::stringstream ss;
×
NEW
36
    ss << "TLayout(" << this << ")";
×
NEW
37
    return ss.str();
×
NEW
38
}
×
39

40
symbolic::MultiExpression TensorLayout::linear_strides(const symbolic::MultiExpression& shape) {
1✔
41
    symbolic::MultiExpression lin_strides;
1✔
42
    std::size_t dims = shape.size();
1✔
43
    lin_strides.resize(dims);
1✔
44
    lin_strides[dims - 1] = symbolic::integer(1);
1✔
45
    for (int i = static_cast<int>(dims) - 2; i >= 0; --i) {
4✔
46
        lin_strides[i] = symbolic::mul(lin_strides.at(i + 1), shape.at(i + 1));
3✔
47
    }
3✔
48

49
    return std::move(lin_strides);
1✔
50
}
1✔
NEW
51
void TensorLayout::collect_symbols(symbolic::SymbolSet& syms) const {
×
NEW
52
    for (const auto& dim : shape_) {
×
NEW
53
        for (auto& atom : symbolic::atoms(dim)) {
×
NEW
54
            syms.insert(atom);
×
NEW
55
        }
×
NEW
56
    }
×
NEW
57
    for (const auto& dim : strides_) {
×
NEW
58
        for (auto& atom : symbolic::atoms(dim)) {
×
NEW
59
            syms.insert(atom);
×
NEW
60
        }
×
NEW
61
    }
×
NEW
62
    for (auto& atom : symbolic::atoms(offset_)) {
×
NEW
63
        syms.insert(atom);
×
NEW
64
    }
×
NEW
65
}
×
66

NEW
67
void TensorLayout::replace_symbols(const symbolic::Expression& old, const symbolic::Expression& new_expr) {
×
NEW
68
    for (auto& dim : shape_) {
×
NEW
69
        dim = symbolic::subs(dim, old, new_expr);
×
NEW
70
    }
×
NEW
71
    for (auto& stride : strides_) {
×
NEW
72
        stride = symbolic::subs(stride, old, new_expr);
×
NEW
73
    }
×
NEW
74
    offset_ = symbolic::subs(offset_, old, new_expr);
×
NEW
75
}
×
76

77
symbolic::MultiExpression TensorLayout::linear_strides() const { return std::move(linear_strides(shape_)); }
1✔
78

NEW
79
TensorLayout TensorLayout::deserialize_from_json(const nlohmann::json& j) {
×
NEW
80
    symbolic::MultiExpression shape;
×
NEW
81
    for (const auto& dim : j["shape"]) {
×
NEW
82
        shape.push_back(symbolic::parse(dim.get<std::string>()));
×
NEW
83
    }
×
84

NEW
85
    symbolic::MultiExpression strides;
×
NEW
86
    for (const auto& stride : j["strides"]) {
×
NEW
87
        strides.push_back(symbolic::parse(stride.get<std::string>()));
×
NEW
88
    }
×
89

NEW
90
    symbolic::Expression offset = symbolic::parse(j["offset"].get<std::string>());
×
91

NEW
92
    return std::move(TensorLayout(shape, strides, offset));
×
NEW
93
}
×
94

NEW
95
std::ostream& operator<<(std::ostream& stream, const TensorLayout& layout) {
×
NEW
96
    stream << "{shape[";
×
NEW
97
    for (size_t i = 0; i < layout.shape().size(); ++i) {
×
NEW
98
        if (i > 0) stream << ", ";
×
NEW
99
        stream << layout.shape().at(i)->__str__();
×
NEW
100
    }
×
NEW
101
    stream << "], strides=[";
×
NEW
102
    for (size_t i = 0; i < layout.strides().size(); ++i) {
×
NEW
103
        if (i > 0) stream << ", ";
×
NEW
104
        stream << layout.strides().at(i)->__str__();
×
NEW
105
    }
×
NEW
106
    stream << "]";
×
NEW
107
    if (SymEngine::neq(*layout.offset(), *symbolic::integer(0))) {
×
NEW
108
        stream << ", off=" << layout.offset()->__str__();
×
NEW
109
    }
×
NEW
110
    stream << "}";
×
111

NEW
112
    return stream;
×
NEW
113
}
×
114

NEW
115
bool TensorLayout::has_linear_accesses_no_padding(symbolic::MultiExpression shape, symbolic::MultiExpression strides) {
×
NEW
116
    auto basic_strides = types::Tensor::strides_from_shape(shape);
×
NEW
117
    if (basic_strides.size() != strides.size()) {
×
NEW
118
        return false;
×
NEW
119
    }
×
NEW
120
    for (size_t i = 0; i < strides.size(); i++) {
×
NEW
121
        if (!symbolic::eq(basic_strides.at(i), strides.at(i))) {
×
NEW
122
            return false;
×
NEW
123
        }
×
NEW
124
    }
×
NEW
125
    return true;
×
NEW
126
}
×
127

NEW
128
bool TensorLayout::has_linear_accesses_no_padding() const { return has_linear_accesses_no_padding(shape_, strides_); }
×
129

NEW
130
bool TensorLayout::has_transposed_strides_no_padding() const {
×
NEW
131
    if (shape_.size() < 2) {
×
NEW
132
        return false;
×
NEW
133
    }
×
NEW
134
    symbolic::MultiExpression new_shape;
×
NEW
135
    new_shape.reserve(shape_.size());
×
NEW
136
    for (size_t i = 0; i < shape_.size() - 2; i++) {
×
NEW
137
        new_shape.push_back(shape_.at(i));
×
NEW
138
    }
×
NEW
139
    new_shape.push_back(shape_.at(shape_.size() - 1));
×
NEW
140
    new_shape.push_back(shape_.at(shape_.size() - 2));
×
NEW
141
    symbolic::MultiExpression transposed_strides(strides_);
×
NEW
142
    transposed_strides[strides_.size() - 2] = strides_.at(strides_.size() - 1);
×
NEW
143
    transposed_strides[strides_.size() - 1] = strides_.at(strides_.size() - 2);
×
NEW
144
    return TensorLayout::has_linear_accesses_no_padding(new_shape, transposed_strides);
×
NEW
145
}
×
146

147
} // namespace sdfg::math::tensor
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc