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

daisytuner / docc / 26384878802

22 May 2026 02:58PM UTC coverage: 60.853% (+0.02%) from 60.837%
26384878802

push

github

web-flow
Activate Einsum pipeline for Python/PyTorch frontend (#720)

- Added Einsum step to compilation (after which the SDFG is also dumped)
- Generate tasklets and cmath library nodes directly instead of tensor nodes if all tensor types are scalar
- Merged the whole "lifting" part of Einsum nodes into one pass: the EinsumDetectionPass that runs in linear time
- Renamed the EinsumExpand transformation to the EinsumPromotion transformation because the name was confusing with expanding Einsum/library nodes
- Fixed a bug where the lifting failed for multiple input edges of the same access node on a tasklet and added unit tests
- Moved Einsum node source files into tensor folder (but the Einsum node is not a tensor node yet)

85 of 115 new or added lines in 13 files covered. (73.91%)

3 existing lines in 2 files now uncovered.

35027 of 57560 relevant lines covered (60.85%)

11105.41 hits per line

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

23.94
/opt/src/transformations/replayer.cpp
1
#include <sdfg/transformations/einsum2dot.h>
2
#include <sdfg/transformations/einsum2gemm.h>
3
#include <sdfg/transformations/einsum_extend.h>
4
#include <sdfg/transformations/einsum_lift.h>
5
#include <sdfg/transformations/einsum_promotion.h>
6
#include <sdfg/transformations/in_local_storage.h>
7
#include <sdfg/transformations/loop_distribute.h>
8
#include <sdfg/transformations/loop_interchange.h>
9
#include <sdfg/transformations/loop_peeling.h>
10
#include <sdfg/transformations/loop_shift.h>
11
#include <sdfg/transformations/loop_skewing.h>
12
#include <sdfg/transformations/loop_split.h>
13
#include <sdfg/transformations/loop_tiling.h>
14
#include <sdfg/transformations/offloading/cuda_parallelize_nested_map.h>
15
#include <sdfg/transformations/offloading/cuda_transform.h>
16
#include <sdfg/transformations/offloading/gpu_condition_propagation.h>
17
#include <sdfg/transformations/offloading/gpu_loop_reordering.h>
18
#include <sdfg/transformations/offloading/gpu_tiling.h>
19
#include <sdfg/transformations/offloading/kernel_local_storage.h>
20
#include <sdfg/transformations/offloading/rocm_parallelize_nested_map.h>
21
#include <sdfg/transformations/offloading/rocm_transform.h>
22
#include <sdfg/transformations/omp_transform.h>
23
#include <sdfg/transformations/out_local_storage.h>
24
#include <sdfg/transformations/replayer.h>
25
#include <sdfg/transformations/tile_fusion.h>
26
#include <sdfg/transformations/vectorize_transform.h>
27

28
namespace sdfg {
29
namespace transformations {
30

31
void Replayer::replay(
32
    builder::StructuredSDFGBuilder& builder,
33
    analysis::AnalysisManager& analysis_manager,
34
    const nlohmann::json& transformation_data,
35
    bool skip_if_not_applicable,
36
    size_t loopnest_index
37
) {
5✔
38
    if (!transformation_data.is_array()) {
5✔
39
        throw std::runtime_error("Transformation data must be an array.");
×
40
    }
×
41

42
    for (const auto& desc : transformation_data) {
9✔
43
        auto transformation_name = desc["transformation_type"];
9✔
44

45
        if (transformation_name == "LoopTiling") {
9✔
46
            this->apply<transformations::LoopTiling>(builder, analysis_manager, desc, skip_if_not_applicable);
7✔
47
        } else if (transformation_name == "LoopDistribute") {
7✔
48
            this->apply<transformations::LoopDistribute>(builder, analysis_manager, desc, skip_if_not_applicable);
×
49
        } else if (transformation_name == "LoopInterchange") {
2✔
50
            this->apply<transformations::LoopInterchange>(builder, analysis_manager, desc, skip_if_not_applicable);
2✔
51
        } else if (transformation_name == "OutLocalStorage") {
2✔
52
            this->apply<transformations::OutLocalStorage>(builder, analysis_manager, desc, skip_if_not_applicable);
×
53
        } else if (transformation_name == "InLocalStorage") {
×
54
            this->apply<transformations::InLocalStorage>(builder, analysis_manager, desc, skip_if_not_applicable);
×
55
        } else if (transformation_name == "TileFusion") {
×
56
            this->apply<transformations::TileFusion>(builder, analysis_manager, desc, skip_if_not_applicable);
×
57
        } else if (transformation_name == "LoopSkewing") {
×
58
            this->apply<transformations::LoopSkewing>(builder, analysis_manager, desc, skip_if_not_applicable);
×
59
        } else if (transformation_name == "LoopShift") {
×
60
            this->apply<transformations::LoopShift>(builder, analysis_manager, desc, skip_if_not_applicable);
×
61
        } else if (transformation_name == "LoopSplit") {
×
62
            this->apply<transformations::LoopSplit>(builder, analysis_manager, desc, skip_if_not_applicable);
×
63
        } else if (transformation_name == "OMPTransform") {
×
64
            this->apply<transformations::OMPTransform>(builder, analysis_manager, desc, skip_if_not_applicable);
×
65
        } else if (transformation_name == "LoopPeeling") {
×
66
            this->apply<transformations::LoopPeeling>(builder, analysis_manager, desc, skip_if_not_applicable);
×
67
        } else if (transformation_name == "VectorizeTransform") {
×
68
            this->apply<transformations::VectorizeTransform>(builder, analysis_manager, desc, skip_if_not_applicable);
×
69
        } else if (transformation_name == "CUDATransform") {
×
70
            this->apply<cuda::CUDATransform>(builder, analysis_manager, desc, skip_if_not_applicable);
×
71
        } else if (transformation_name == "CUDAParallelizeNestedMap") {
×
72
            this->apply<
×
73
                transformations::CUDAParallelizeNestedMap>(builder, analysis_manager, desc, skip_if_not_applicable);
×
74
        } else if (transformation_name == "ROCMTransform") {
×
75
            this->apply<rocm::ROCMTransform>(builder, analysis_manager, desc, skip_if_not_applicable);
×
76
        } else if (transformation_name == "ROCMParallelizeNestedMap") {
×
77
            this->apply<
×
78
                transformations::ROCMParallelizeNestedMap>(builder, analysis_manager, desc, skip_if_not_applicable);
×
79
        } else if (transformation_name == "GPUConditionPropagation") {
×
80
            this->apply<
×
81
                transformations::GPUConditionPropagation>(builder, analysis_manager, desc, skip_if_not_applicable);
×
82
        } else if (transformation_name == "GPUTiling") {
×
83
            this->apply<transformations::GPUTiling>(builder, analysis_manager, desc, skip_if_not_applicable);
×
84
        } else if (transformation_name == "GPULoopReordering") {
×
85
            this->apply<transformations::GPULoopReordering>(builder, analysis_manager, desc, skip_if_not_applicable);
×
86
        } else if (transformation_name == "KernelLocalStorage") {
×
87
            this->apply<transformations::KernelLocalStorage>(builder, analysis_manager, desc, skip_if_not_applicable);
×
88
        } else if (transformation_name == "EinsumLift") {
×
89
            this->apply<transformations::EinsumLift>(builder, analysis_manager, desc, skip_if_not_applicable);
×
90
        } else if (transformation_name == "EinsumExtend") {
×
91
            this->apply<transformations::EinsumExtend>(builder, analysis_manager, desc, skip_if_not_applicable);
×
92
        } else if (transformation_name == "EinsumExpand") {
×
NEW
93
            this->apply<transformations::EinsumPromotion>(builder, analysis_manager, desc, skip_if_not_applicable);
×
94
        } else if (transformation_name == "Einsum2Dot") {
×
95
            this->apply<transformations::Einsum2Dot>(builder, analysis_manager, desc, skip_if_not_applicable);
×
96
        } else if (transformation_name == "Einsum2Gemm") {
×
97
            this->apply<transformations::Einsum2Gemm>(builder, analysis_manager, desc, skip_if_not_applicable);
×
98
        } else {
×
99
            throw transformations::InvalidTransformationDescriptionException(
×
100
                "Unknown transformation: " + transformation_name.get<std::string>()
×
101
            );
×
102
        }
×
103

104
#ifndef NDEBUG
9✔
105
        std::cout << "Applied transformation: " << transformation_name << std::endl;
9✔
106
        builder.subject().validate();
9✔
107
#endif
9✔
108

109
        analysis_manager.invalidate_all();
9✔
110
    }
9✔
111
}
5✔
112

113

114
} // namespace transformations
115
} // namespace sdfg
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