diff --git a/examples/self-inner-product.stur b/examples/self-inner-product.stur new file mode 100644 index 0000000..50fc439 --- /dev/null +++ b/examples/self-inner-product.stur @@ -0,0 +1,3 @@ +symbols: N +A() := B(i) * B(i) +B:D(i) := (0 <= i) * (i < N) \ No newline at end of file diff --git a/src/test/resources/correct_test_outputs/self-inner-product_wo_body.cpp b/src/test/resources/correct_test_outputs/self-inner-product_wo_body.cpp new file mode 100644 index 0000000..9c12bda --- /dev/null +++ b/src/test/resources/correct_test_outputs/self-inner-product_wo_body.cpp @@ -0,0 +1,32 @@ + +#include +#include +#include +#include + +using namespace std; +using namespace std::chrono; + +extern "C" +void fn(double & A, double * B, int N) { + + +long time_computation = 0, start_computation, end_computation; +start_computation = duration_cast(system_clock::now().time_since_epoch()).count(); +{ +for (int i = 0; i < N; ++i) { + +A += (B[i] * B[i]); +} +} +end_computation = duration_cast(system_clock::now().time_since_epoch()).count(); +time_computation = end_computation - start_computation; +cout << time_computation << endl; +long time_reconstruction = 0, start_reconstruction, end_reconstruction; +start_reconstruction = duration_cast(system_clock::now().time_since_epoch()).count(); + +end_reconstruction = duration_cast(system_clock::now().time_since_epoch()).count(); +time_reconstruction = end_reconstruction - start_reconstruction; +cout << time_reconstruction << endl; + +} diff --git a/src/test/scala/uk/ac/ed/dal/structtensor/codegen/CodegenTest.scala b/src/test/scala/uk/ac/ed/dal/structtensor/codegen/CodegenTest.scala index 05fa1cd..267d627 100644 --- a/src/test/scala/uk/ac/ed/dal/structtensor/codegen/CodegenTest.scala +++ b/src/test/scala/uk/ac/ed/dal/structtensor/codegen/CodegenTest.scala @@ -2196,4 +2196,26 @@ class CodegenTest extends AnyFlatSpec with Matchers { val lines2 = file2.getLines().toList lines2 should be(lines1) } + + it should "generate correct code for self inner product without the body" in { + Utils.cnt = 0 + Main.main( + Array( + "-i", + "examples/self-inner-product.stur", + "-o", + "src/test/resources/test_outputs/self-inner-product_wo_body_test.cpp" + ) + ) + + val file1 = scala.io.Source.fromFile( + "src/test/resources/correct_test_outputs/self-inner-product_wo_body.cpp" + ) + val file2 = scala.io.Source.fromFile( + "src/test/resources/test_outputs/self-inner-product_wo_body_test.cpp" + ) + val lines1 = file1.getLines().toList + val lines2 = file2.getLines().toList + lines2 should be(lines1) + } }