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

daisytuner / sdfglib / 15003172388

13 May 2025 05:40PM UTC coverage: 57.685% (-4.0%) from 61.65%
15003172388

push

github

web-flow
Merge pull request #10 from daisytuner/variadic-functions

Support for Packed Structs and Function Types

33 of 110 new or added lines in 10 files covered. (30.0%)

457 existing lines in 6 files now uncovered.

7161 of 12414 relevant lines covered (57.68%)

526.43 hits per line

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

19.37
/src/codegen/language_extensions/cpp_language_extension.cpp
1
#include "sdfg/codegen/language_extensions/cpp_language_extension.h"
2

3
#include "sdfg/codegen/utils.h"
4
#include "sdfg/data_flow/tasklet.h"
5

6
namespace sdfg {
7
namespace codegen {
8

9
constexpr const char* code_to_string(data_flow::TaskletCode c) {
×
10
    switch (c) {
×
11
        case data_flow::TaskletCode::assign:
×
12
            return "=";
×
13
        case data_flow::TaskletCode::neg:
×
14
            return "-";
×
15
        case data_flow::TaskletCode::add:
×
16
            return "+";
×
17
        case data_flow::TaskletCode::sub:
×
18
            return "-";
×
19
        case data_flow::TaskletCode::mul:
×
20
            return "*";
×
21
        case data_flow::TaskletCode::div:
×
22
            return "/";
×
23
        case data_flow::TaskletCode::fma:
×
24
            return "__daisy_fma";
×
25
        case data_flow::TaskletCode::mod:
×
26
            return "%";
×
27
        case data_flow::TaskletCode::max:
×
28
            return "__daisy_max";
×
29
        case data_flow::TaskletCode::min:
×
30
            return "__daisy_min";
×
31
        case data_flow::TaskletCode::minnum:
×
32
            return "minnum";
×
33
        case data_flow::TaskletCode::maxnum:
×
34
            return "maxnum";
×
35
        case data_flow::TaskletCode::minimum:
×
36
            return "minimum";
×
37
        case data_flow::TaskletCode::maximum:
×
38
            return "maximum";
×
39
        case data_flow::TaskletCode::trunc:
×
40
            return "trunc";
×
41
        case data_flow::TaskletCode::logical_and:
×
42
            return "&&";
×
43
        case data_flow::TaskletCode::logical_or:
×
44
            return "||";
×
45
        case data_flow::TaskletCode::bitwise_and:
×
46
            return "&";
×
47
        case data_flow::TaskletCode::bitwise_or:
×
48
            return "|";
×
49
        case data_flow::TaskletCode::bitwise_xor:
×
50
            return "^";
×
51
        case data_flow::TaskletCode::bitwise_not:
×
52
            return "~";
×
53
        case data_flow::TaskletCode::shift_left:
×
54
            return "<<";
×
55
        case data_flow::TaskletCode::shift_right:
×
56
            return ">>";
×
57
        case data_flow::TaskletCode::olt:
×
58
            return "<";
×
59
        case data_flow::TaskletCode::ole:
×
60
            return "<=";
×
61
        case data_flow::TaskletCode::oeq:
×
62
            return "==";
×
63
        case data_flow::TaskletCode::one:
×
64
            return "!=";
×
65
        case data_flow::TaskletCode::oge:
×
66
            return ">=";
×
67
        case data_flow::TaskletCode::ogt:
×
68
            return ">";
×
69
        case data_flow::TaskletCode::ord:
×
70
            return "==";
×
71
        case data_flow::TaskletCode::ult:
×
72
            return "<";
×
73
        case data_flow::TaskletCode::ule:
×
74
            return "<=";
×
75
        case data_flow::TaskletCode::ueq:
×
76
            return "==";
×
77
        case data_flow::TaskletCode::une:
×
78
            return "!=";
×
79
        case data_flow::TaskletCode::uge:
×
80
            return ">=";
×
81
        case data_flow::TaskletCode::ugt:
×
82
            return ">";
×
83
        case data_flow::TaskletCode::uno:
×
84
            return "!=";
×
85
        case data_flow::TaskletCode::abs:
×
86
            return "abs";
×
87
        case data_flow::TaskletCode::acos:
×
88
            return "acos";
×
89
        case data_flow::TaskletCode::acosf:
×
90
            return "acosf";
×
91
        case data_flow::TaskletCode::acosl:
×
92
            return "acosl";
×
93
        case data_flow::TaskletCode::acosh:
×
94
            return "acosh";
×
95
        case data_flow::TaskletCode::acoshf:
×
96
            return "acoshf";
×
97
        case data_flow::TaskletCode::acoshl:
×
98
            return "acoshl";
×
99
        case data_flow::TaskletCode::asin:
×
100
            return "asin";
×
101
        case data_flow::TaskletCode::asinf:
×
102
            return "asinf";
×
103
        case data_flow::TaskletCode::asinl:
×
104
            return "asinl";
×
105
        case data_flow::TaskletCode::asinh:
×
106
            return "asinh";
×
107
        case data_flow::TaskletCode::asinhf:
×
108
            return "asinhf";
×
109
        case data_flow::TaskletCode::asinhl:
×
110
            return "asinhl";
×
111
        case data_flow::TaskletCode::atan:
×
112
            return "atan";
×
113
        case data_flow::TaskletCode::atanf:
×
114
            return "atanf";
×
115
        case data_flow::TaskletCode::atanl:
×
116
            return "atanl";
×
117
        case data_flow::TaskletCode::atan2:
×
118
            return "atan2";
×
119
        case data_flow::TaskletCode::atan2f:
×
120
            return "atan2f";
×
121
        case data_flow::TaskletCode::atan2l:
×
122
            return "atan2l";
×
123
        case data_flow::TaskletCode::atanh:
×
124
            return "atanh";
×
125
        case data_flow::TaskletCode::atanhf:
×
126
            return "atanhf";
×
127
        case data_flow::TaskletCode::atanhl:
×
128
            return "atanhl";
×
129
        case data_flow::TaskletCode::cabs:
×
130
            return "cabs";
×
131
        case data_flow::TaskletCode::cabsf:
×
132
            return "cabsf";
×
133
        case data_flow::TaskletCode::cabsl:
×
134
            return "cabsl";
×
135
        case data_flow::TaskletCode::ceil:
×
136
            return "ceil";
×
137
        case data_flow::TaskletCode::ceilf:
×
138
            return "ceilf";
×
139
        case data_flow::TaskletCode::ceill:
×
140
            return "ceill";
×
141
        case data_flow::TaskletCode::copysign:
×
142
            return "copysign";
×
143
        case data_flow::TaskletCode::copysignf:
×
144
            return "copysignf";
×
145
        case data_flow::TaskletCode::copysignl:
×
146
            return "copysignl";
×
147
        case data_flow::TaskletCode::cos:
×
148
            return "cos";
×
149
        case data_flow::TaskletCode::cosf:
×
150
            return "cosf";
×
151
        case data_flow::TaskletCode::cosl:
×
152
            return "cosl";
×
153
        case data_flow::TaskletCode::cosh:
×
154
            return "cosh";
×
155
        case data_flow::TaskletCode::coshf:
×
156
            return "coshf";
×
157
        case data_flow::TaskletCode::coshl:
×
158
            return "coshl";
×
159
        case data_flow::TaskletCode::cbrt:
×
160
            return "cbrt";
×
161
        case data_flow::TaskletCode::cbrtf:
×
162
            return "cbrtf";
×
163
        case data_flow::TaskletCode::cbrtl:
×
164
            return "cbrtl";
×
165
        case data_flow::TaskletCode::exp10:
×
166
            return "exp10";
×
167
        case data_flow::TaskletCode::exp10f:
×
168
            return "exp10f";
×
169
        case data_flow::TaskletCode::exp10l:
×
170
            return "exp10l";
×
171
        case data_flow::TaskletCode::exp2:
×
172
            return "exp2";
×
173
        case data_flow::TaskletCode::exp2f:
×
174
            return "exp2f";
×
175
        case data_flow::TaskletCode::exp2l:
×
176
            return "exp2l";
×
177
        case data_flow::TaskletCode::exp:
×
178
            return "exp";
×
179
        case data_flow::TaskletCode::expf:
×
180
            return "expf";
×
181
        case data_flow::TaskletCode::expl:
×
182
            return "expl";
×
183
        case data_flow::TaskletCode::expm1:
×
184
            return "expm1";
×
185
        case data_flow::TaskletCode::expm1f:
×
186
            return "expm1f";
×
187
        case data_flow::TaskletCode::expm1l:
×
188
            return "expm1l";
×
189
        case data_flow::TaskletCode::fabs:
×
190
            return "fabs";
×
191
        case data_flow::TaskletCode::fabsf:
×
192
            return "fabsf";
×
193
        case data_flow::TaskletCode::fabsl:
×
194
            return "fabsl";
×
195
        case data_flow::TaskletCode::floor:
×
196
            return "floor";
×
197
        case data_flow::TaskletCode::floorf:
×
198
            return "floorf";
×
199
        case data_flow::TaskletCode::floorl:
×
200
            return "floorl";
×
201
        case data_flow::TaskletCode::fls:
×
202
            return "fls";
×
203
        case data_flow::TaskletCode::flsl:
×
204
            return "flsl";
×
205
        case data_flow::TaskletCode::fmax:
×
206
            return "fmax";
×
207
        case data_flow::TaskletCode::fmaxf:
×
208
            return "fmaxf";
×
209
        case data_flow::TaskletCode::fmaxl:
×
210
            return "fmaxl";
×
211
        case data_flow::TaskletCode::fmin:
×
212
            return "fmin";
×
213
        case data_flow::TaskletCode::fminf:
×
214
            return "fminf";
×
215
        case data_flow::TaskletCode::fminl:
×
216
            return "fminl";
×
217
        case data_flow::TaskletCode::fmod:
×
218
            return "fmod";
×
219
        case data_flow::TaskletCode::fmodf:
×
220
            return "fmodf";
×
221
        case data_flow::TaskletCode::fmodl:
×
222
            return "fmodl";
×
223
        case data_flow::TaskletCode::frexp:
×
224
            return "frexp";
×
225
        case data_flow::TaskletCode::frexpf:
×
226
            return "frexpf";
×
227
        case data_flow::TaskletCode::frexpl:
×
228
            return "frexpl";
×
229
        case data_flow::TaskletCode::labs:
×
230
            return "labs";
×
231
        case data_flow::TaskletCode::ldexp:
×
232
            return "ldexp";
×
233
        case data_flow::TaskletCode::ldexpf:
×
234
            return "ldexpf";
×
235
        case data_flow::TaskletCode::ldexpl:
×
236
            return "ldexpl";
×
237
        case data_flow::TaskletCode::log10:
×
238
            return "log10";
×
239
        case data_flow::TaskletCode::log10f:
×
240
            return "log10f";
×
241
        case data_flow::TaskletCode::log10l:
×
242
            return "log10l";
×
243
        case data_flow::TaskletCode::log2:
×
244
            return "log2";
×
245
        case data_flow::TaskletCode::log2f:
×
246
            return "log2f";
×
247
        case data_flow::TaskletCode::log2l:
×
248
            return "log2l";
×
249
        case data_flow::TaskletCode::log:
×
250
            return "log";
×
251
        case data_flow::TaskletCode::logf:
×
252
            return "logf";
×
253
        case data_flow::TaskletCode::logl:
×
254
            return "logl";
×
255
        case data_flow::TaskletCode::logb:
×
256
            return "logb";
×
257
        case data_flow::TaskletCode::logbf:
×
258
            return "logbf";
×
259
        case data_flow::TaskletCode::logbl:
×
260
            return "logbl";
×
261
        case data_flow::TaskletCode::log1p:
×
262
            return "log1p";
×
263
        case data_flow::TaskletCode::log1pf:
×
264
            return "log1pf";
×
265
        case data_flow::TaskletCode::log1pl:
×
266
            return "log1pl";
×
267
        case data_flow::TaskletCode::modf:
×
268
            return "modf";
×
269
        case data_flow::TaskletCode::modff:
×
270
            return "modff";
×
271
        case data_flow::TaskletCode::modfl:
×
272
            return "modfl";
×
273
        case data_flow::TaskletCode::nearbyint:
×
274
            return "nearbyint";
×
275
        case data_flow::TaskletCode::nearbyintf:
×
276
            return "nearbyintf";
×
277
        case data_flow::TaskletCode::nearbyintl:
×
278
            return "nearbyintl";
×
279
        case data_flow::TaskletCode::pow:
×
280
            return "pow";
×
281
        case data_flow::TaskletCode::powf:
×
282
            return "powf";
×
283
        case data_flow::TaskletCode::powl:
×
284
            return "powl";
×
285
        case data_flow::TaskletCode::rint:
×
286
            return "rint";
×
287
        case data_flow::TaskletCode::rintf:
×
288
            return "rintf";
×
289
        case data_flow::TaskletCode::rintl:
×
290
            return "rintl";
×
291
        case data_flow::TaskletCode::round:
×
292
            return "round";
×
293
        case data_flow::TaskletCode::roundf:
×
294
            return "roundf";
×
295
        case data_flow::TaskletCode::roundl:
×
296
            return "roundl";
×
297
        case data_flow::TaskletCode::roundeven:
×
298
            return "roundeven";
×
299
        case data_flow::TaskletCode::roundevenf:
×
300
            return "roundevenf";
×
301
        case data_flow::TaskletCode::roundevenl:
×
302
            return "roundevenl";
×
303
        case data_flow::TaskletCode::sin:
×
304
            return "sin";
×
305
        case data_flow::TaskletCode::sinf:
×
306
            return "sinf";
×
307
        case data_flow::TaskletCode::sinl:
×
308
            return "sinl";
×
309
        case data_flow::TaskletCode::sinh:
×
310
            return "sinh";
×
311
        case data_flow::TaskletCode::sinhf:
×
312
            return "sinhf";
×
313
        case data_flow::TaskletCode::sinhl:
×
314
            return "sinhl";
×
315
        case data_flow::TaskletCode::sqrt:
×
316
            return "sqrt";
×
317
        case data_flow::TaskletCode::sqrtf:
×
318
            return "sqrtf";
×
319
        case data_flow::TaskletCode::sqrtl:
×
320
            return "sqrtl";
×
321
        case data_flow::TaskletCode::tan:
×
322
            return "tan";
×
323
        case data_flow::TaskletCode::tanf:
×
324
            return "tanf";
×
325
        case data_flow::TaskletCode::tanl:
×
326
            return "tanl";
×
327
        case data_flow::TaskletCode::tanh:
×
328
            return "tanh";
×
329
        case data_flow::TaskletCode::tanhf:
×
330
            return "tanhf";
×
331
        case data_flow::TaskletCode::tanhl:
×
332
            return "tanhl";
×
333
    };
334
    assert(false);
×
335
};
336

337
std::string CPPLanguageExtension::primitive_type(const types::PrimitiveType prim_type) {
26✔
338
    switch (prim_type) {
26✔
339
        case types::PrimitiveType::Void:
1✔
340
            return "void";
1✔
341
        case types::PrimitiveType::Bool:
1✔
342
            return "bool";
1✔
343
        case types::PrimitiveType::Int8:
1✔
344
            return "signed char";
1✔
345
        case types::PrimitiveType::Int16:
1✔
346
            return "short";
1✔
347
        case types::PrimitiveType::Int32:
8✔
348
            return "int";
8✔
349
        case types::PrimitiveType::Int64:
1✔
350
            return "long long";
1✔
351
        case types::PrimitiveType::UInt8:
4✔
352
            return "char";
4✔
353
        case types::PrimitiveType::UInt16:
1✔
354
            return "unsigned short";
1✔
355
        case types::PrimitiveType::UInt32:
1✔
356
            return "unsigned int";
1✔
357
        case types::PrimitiveType::UInt64:
1✔
358
            return "unsigned long long";
1✔
359
        case types::PrimitiveType::Float:
5✔
360
            return "float";
5✔
361
        case types::PrimitiveType::Double:
1✔
362
            return "double";
1✔
363
    }
364

365
    throw std::runtime_error("Unknown primitive type");
×
366
};
367

368
std::string CPPLanguageExtension::declaration(const std::string& name, const types::IType& type,
26✔
369
                                              bool use_initializer) {
370
    std::stringstream val;
26✔
371

372
    if (auto scalar_type = dynamic_cast<const types::Scalar*>(&type)) {
26✔
373
        val << primitive_type(scalar_type->primitive_type());
14✔
374
        val << " ";
14✔
375
        val << name;
14✔
376
    } else if (auto array_type = dynamic_cast<const types::Array*>(&type)) {
12✔
377
        auto& element_type = array_type->element_type();
3✔
378
        val << declaration(name + "[" + this->expression(array_type->num_elements()) + "]",
6✔
379
                           element_type);
3✔
380
    } else if (auto pointer_type = dynamic_cast<const types::Pointer*>(&type)) {
9✔
381
        auto& pointee_type = pointer_type->pointee_type();
5✔
382
        val << declaration("(*" + name + ")", pointee_type);
5✔
383
    } else if (auto ref_type = dynamic_cast<const Reference*>(&type)) {
4✔
384
        val << declaration("&" + name, ref_type->reference_type());
×
385
    } else if (auto structure_type = dynamic_cast<const types::Structure*>(&type)) {
4✔
386
        val << structure_type->name();
4✔
387
        val << " ";
4✔
388
        val << name;
4✔
NEW
389
    } else if (auto function_type = dynamic_cast<const types::Function*>(&type)) {
×
NEW
390
        val << declaration("", function_type->return_type());
×
NEW
391
        val << " ";
×
NEW
392
        val << name;
×
NEW
393
        val << "(";
×
NEW
394
        for (size_t i = 0; i < function_type->num_params(); ++i) {
×
NEW
395
            val << declaration("", function_type->param_type(symbolic::integer(i)));
×
NEW
396
            if (i < function_type->num_params() - 1) {
×
NEW
397
                val << ", ";
×
398
            }
399
        }
NEW
400
        if (function_type->is_var_arg()) {
×
NEW
401
            if (function_type->num_params() > 0) {
×
NEW
402
                val << ", ";
×
403
            }
NEW
404
            val << "...";
×
405
        }
NEW
406
        val << ")";
×
407
    } else {
408
        throw std::runtime_error("Unknown declaration type");
×
409
    }
410

411
    if (use_initializer && !type.initializer().empty()) {
26✔
412
        val << " = " << type.initializer();
×
413
    }
414

415
    return val.str();
52✔
416
};
26✔
417

418
std::string CPPLanguageExtension::allocation(const std::string& name, const types::IType& type) {
4✔
419
    std::stringstream val;
4✔
420

421
    if (auto scalar_type = dynamic_cast<const types::Scalar*>(&type)) {
4✔
422
        val << declaration(name, *scalar_type);
1✔
423
    } else if (auto array_type = dynamic_cast<const types::Array*>(&type)) {
3✔
424
        val << declaration(name + "[" + this->expression(array_type->num_elements()) + "]",
2✔
425
                           array_type->element_type());
1✔
426
    } else if (auto pointer_type = dynamic_cast<const types::Pointer*>(&type)) {
2✔
427
        val << declaration(name, type);
1✔
428
        val << " = ";
1✔
429
        val << "(" << declaration("", *pointer_type) << ")";
1✔
430
        val << " new ";
1✔
431
        val << declaration("", pointer_type->pointee_type());
1✔
432
    } else if (auto structure_type = dynamic_cast<const types::Structure*>(&type)) {
1✔
433
        val << declaration(name, *structure_type);
1✔
434
    } else {
435
        throw std::runtime_error("Unknown allocation type");
×
436
    }
437

438
    return val.str();
8✔
439
};
4✔
440

441
std::string CPPLanguageExtension::deallocation(const std::string& name, const types::IType& type) {
4✔
442
    std::stringstream val;
4✔
443

444
    if (auto scalar_type = dynamic_cast<const types::Scalar*>(&type)) {
4✔
445
        // Do nothing
446
    } else if (auto array_type = dynamic_cast<const types::Array*>(&type)) {
3✔
447
        // Do nothing
448
    } else if (auto pointer_type = dynamic_cast<const types::Pointer*>(&type)) {
2✔
449
        if (auto array_type = dynamic_cast<const types::Array*>(&pointer_type->pointee_type())) {
1✔
450
            val << "delete[] ";
×
451
        } else {
452
            val << "delete ";
1✔
453
        }
454
        val << name;
1✔
455
    } else if (auto structure_type = dynamic_cast<const types::Structure*>(&type)) {
1✔
456
        // Do nothing
457
    } else {
458
        throw std::runtime_error("Unknown deallocation type");
×
459
    }
460

461
    return val.str();
8✔
462
};
4✔
463

464
std::string CPPLanguageExtension::type_cast(const std::string& name, const types::IType& type) {
1✔
465
    std::stringstream val;
1✔
466

467
    val << "reinterpret_cast";
1✔
468
    val << "<";
1✔
469
    val << declaration("", type);
1✔
470
    val << ">";
1✔
471
    val << "(" << name << ")";
1✔
472

473
    return val.str();
2✔
474
};
1✔
475

476
std::string CPPLanguageExtension::subset(const Function& function, const types::IType& type,
3✔
477
                                         const data_flow::Subset& sub) {
478
    if (sub.empty()) {
3✔
479
        return "";
1✔
480
    }
481

482
    if (auto scalar_type = dynamic_cast<const types::Scalar*>(&type)) {
2✔
483
        return "";
×
484
    } else if (auto array_type = dynamic_cast<const types::Array*>(&type)) {
2✔
485
        std::string subset_str = "[" + this->expression(sub.at(0)) + "]";
2✔
486

487
        if (sub.size() > 1) {
1✔
488
            data_flow::Subset element_subset(sub.begin() + 1, sub.end());
×
489
            auto& element_type = array_type->element_type();
×
490
            return subset_str + subset(function, element_type, element_subset);
×
491
        } else {
×
492
            return subset_str;
1✔
493
        }
494
    } else if (auto pointer_type = dynamic_cast<const types::Pointer*>(&type)) {
2✔
495
        std::string subset_str = "[" + this->expression(sub.at(0)) + "]";
×
496

497
        data_flow::Subset element_subset(sub.begin() + 1, sub.end());
×
498
        auto& pointee_type = pointer_type->pointee_type();
×
499
        return subset_str + subset(function, pointee_type, element_subset);
×
500
    } else if (auto structure_type = dynamic_cast<const types::Structure*>(&type)) {
1✔
501
        auto& definition = function.structure(structure_type->name());
1✔
502

503
        std::string subset_str = ".member_" + this->expression(sub.at(0));
1✔
504
        if (sub.size() > 1) {
1✔
505
            auto member = SymEngine::rcp_dynamic_cast<const SymEngine::Integer>(sub.at(0));
×
506
            auto& member_type = definition.member_type(member);
×
507
            data_flow::Subset element_subset(sub.begin() + 1, sub.end());
×
508
            return subset_str + subset(function, member_type, element_subset);
×
509
        } else {
×
510
            return subset_str;
1✔
511
        }
512
    } else {
1✔
513
        assert(false);
×
514
    }
515
};
516

517
std::string CPPLanguageExtension::expression(const symbolic::Expression& expr) {
31,558✔
518
    CPPSymbolicPrinter printer;
31,558✔
519
    return printer.apply(expr);
63,116✔
520
};
31,558✔
521

522
std::string CPPLanguageExtension::tasklet(const data_flow::Tasklet& tasklet) {
×
523
    std::string op = code_to_string(tasklet.code());
×
524
    std::vector<std::string> arguments;
×
525
    for (size_t i = 0; i < tasklet.inputs().size(); ++i) {
×
526
        std::string arg = tasklet.input(i).first;
×
527
        if (!tasklet.needs_connector(i)) {
×
528
            if (arg != "NAN" && arg != "INFINITY") {
×
529
                if (tasklet.input(i).second.primitive_type() == types::PrimitiveType::Float) {
×
530
                    arg += "f";
×
531
                }
532
            }
533
        }
534
        arguments.push_back(arg);
×
535
    }
×
536

537
    if (tasklet.code() == data_flow::TaskletCode::assign) {
×
538
        return arguments.at(0);
×
539
    } else if (data_flow::is_infix(tasklet.code())) {
×
540
        switch (data_flow::arity(tasklet.code())) {
×
541
            case 1:
×
542
                return op + arguments.at(0);
×
543
            case 2:
×
544
                return arguments.at(0) + " " + op + " " + arguments.at(1);
×
545
            default:
×
546
                throw std::runtime_error("Unsupported arity");
×
547
        }
548
    } else {
549
        return op + "(" + helpers::join(arguments, ", ") + ")";
×
550
    }
551
};
×
552

553
std::string CPPLanguageExtension::library_node(const data_flow::LibraryNode& libnode) {
×
554
    data_flow::LibraryNodeType lib_node_type = libnode.call();
×
555
    switch (lib_node_type) {
556
        default:
557
            throw std::runtime_error("Unsupported library node type");
×
558
    }
559
}
560

561
void CPPSymbolicPrinter::bvisit(const SymEngine::Infty& x) {
×
562
    if (x.is_negative_infinity())
×
563
        str_ = "-INFINITY";
×
564
    else if (x.is_positive_infinity())
×
565
        str_ = "INFINITY";
×
566
};
×
567

568
void CPPSymbolicPrinter::bvisit(const SymEngine::BooleanAtom& x) {
9✔
569
    str_ = x.get_val() ? "true" : "false";
9✔
570
};
9✔
571

572
void CPPSymbolicPrinter::bvisit(const SymEngine::Symbol& x) {
12,051✔
573
    if (symbolic::is_nullptr(symbolic::symbol(x.get_name()))) {
12,051✔
574
        str_ = "nullptr";
×
575
        return;
×
576
    } else if (symbolic::is_memory_address(symbolic::symbol(x.get_name()))) {
12,051✔
577
        str_ = x.get_name();
×
578
        return;
×
579
    }
580
    str_ = x.get_name();
12,051✔
581
};
582

583
void CPPSymbolicPrinter::bvisit(const SymEngine::And& x) {
×
584
    std::ostringstream s;
×
585
    auto container = x.get_container();
×
586
    s << apply(*container.begin());
×
587
    for (auto it = ++(container.begin()); it != container.end(); ++it) {
×
588
        s << " && " << apply(*it);
×
589
    }
590
    str_ = parenthesize(s.str());
×
591
};
×
592

593
void CPPSymbolicPrinter::bvisit(const SymEngine::Or& x) {
×
594
    std::ostringstream s;
×
595
    auto container = x.get_container();
×
596
    s << apply(*container.begin());
×
597
    for (auto it = ++(container.begin()); it != container.end(); ++it) {
×
598
        s << " || " << apply(*it);
×
599
    }
600
    str_ = parenthesize(s.str());
×
601
};
×
602

603
void CPPSymbolicPrinter::bvisit(const SymEngine::Not& x) {
×
604
    str_ = "!" + apply(x.get_arg());
×
605
    str_ = parenthesize(str_);
×
606
};
×
607

608
void CPPSymbolicPrinter::bvisit(const SymEngine::Equality& x) {
×
609
    str_ = apply(x.get_args()[0]) + " == " + apply(x.get_args()[1]);
×
610
    str_ = parenthesize(str_);
×
611
};
×
612

613
void CPPSymbolicPrinter::bvisit(const SymEngine::Unequality& x) {
×
614
    str_ = apply(x.get_args()[0]) + " != " + apply(x.get_args()[1]);
×
615
    str_ = parenthesize(str_);
×
616
};
×
617

618
void CPPSymbolicPrinter::bvisit(const SymEngine::Min& x) {
×
619
    std::ostringstream s;
×
620
    auto container = x.get_args();
×
621
    assert(container.size() == 2);
×
622
    s << "__daisy_min(";
×
623
    s << apply(*container.begin());
×
624
    for (auto it = ++(container.begin()); it != container.end(); ++it) {
×
625
        s << ", " << apply(*it);
×
626
    }
627
    s << ")";
×
628
    str_ = s.str();
×
629
};
×
630

631
void CPPSymbolicPrinter::bvisit(const SymEngine::Max& x) {
×
632
    std::ostringstream s;
×
633
    auto container = x.get_args();
×
634
    assert(container.size() == 2);
×
635
    s << "__daisy_max(";
×
636
    s << apply(*container.begin());
×
637
    for (auto it = ++(container.begin()); it != container.end(); ++it) {
×
638
        s << ", " << apply(*it);
×
639
    }
640
    s << ")";
×
641
    str_ = s.str();
×
642
};
×
643

NEW
644
void CPPSymbolicPrinter::_print_pow(std::ostringstream &o, const SymEngine::RCP<const SymEngine::Basic> &a,
×
645
                                  const SymEngine::RCP<const SymEngine::Basic> &b) {
NEW
646
    if (SymEngine::eq(*a, *SymEngine::E)) {
×
NEW
647
        o << "exp(" << apply(b) << ")";
×
NEW
648
    } else if (SymEngine::eq(*b, *SymEngine::rational(1, 2))) {
×
NEW
649
        o << "sqrt(" << apply(a) << ")";
×
NEW
650
    } else if (SymEngine::eq(*b, *SymEngine::rational(1, 3))) {
×
NEW
651
        o << "cbrt(" << apply(a) << ")";
×
NEW
652
    } else if (SymEngine::eq(*b, *SymEngine::integer(2))) {
×
NEW
653
        o << apply(a) + " * " + apply(a);
×
654
    } else {
NEW
655
        o << "pow(" << apply(a) << ", " << apply(b) << ")";
×
656
    }
657
};
×
658

659
}  // namespace codegen
660
}  // 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