diff --git a/aidge_export_cpp/unit_tests/test_export.py b/aidge_export_cpp/unit_tests/test_export.py index 27280fe24271530ba436fa8cb6e3ab4db53425e6..c5fa99cae35537cfdf4e187b3e42abe23a59bdd0 100644 --- a/aidge_export_cpp/unit_tests/test_export.py +++ b/aidge_export_cpp/unit_tests/test_export.py @@ -31,6 +31,63 @@ def initFiller(model): aidge_core.constant_filler(value, 0.01) else: pass +import math + +def normalize_random_tensor(randList): + for index in np.ndindex(randList.shape): + randList[index] = (math.floor(randList[index] * 21) - 10) / 10 + + return aidge_core.Tensor(randList.astype(np.float32)) + +def unit_test_export(graph_view, op_name, in_dims): + graph_view.compile("cpu", aidge_core.dtype.float32, dims=in_dims) + scheduler = aidge_core.SequentialScheduler(graph_view) + + # in_tensor = [aidge_core.Tensor(np.random.random(in_dim).astype(np.float32)) for in_dim in in_dims] + in_tensor = [normalize_random_tensor(np.random.rand(*in_dim)) for in_dim in in_dims] + + scheduler.forward(data=in_tensor) + + export_folder = op_name + "_temp_test" + # Export the model in C++ standalone + aidge_core.export_utils.scheduler_export( + scheduler, + export_folder, + aidge_export_cpp.ExportLibCpp, + memory_manager=aidge_core.mem_info.generate_optimized_memory_info, + memory_manager_args={"stats_folder": f"{export_folder}/stats", "wrapping": False } + ) + aidge_core.export_utils.generate_main_compare_cpp(export_folder, graph_view) + print("COMPILATION") + + try: + for std_line in run_command(["make"], cwd=export_folder): + print(std_line, end="") + except subprocess.CalledProcessError as e: + print(f"An error occurred: {e}\nFailed to generate export.") + raise SystemExit(1) + print("RUN EXPORT") + pattern = r"Number of equal outputs: (\d+) / (\d+)" + comparison_matched = False + result = False + try: + for std_line in run_command(["./bin/run_export"], cwd=export_folder): + print(std_line, end="") + matches = re.findall(pattern, std_line) + if matches: + if comparison_matched: + raise RuntimeError("Two comparison matched found!") + else: + expected, infered = map(int, matches[0]) + result = (expected == infered) + comparison_matched = True + except subprocess.CalledProcessError as e: + print(f"An error occurred: {e}\nFailed to run export for comparison.") + raise SystemExit(1) + if not comparison_matched: + raise RuntimeError("No comparison matched found!") + + return result class test_operator_export(unittest.TestCase): @@ -130,6 +187,84 @@ class test_operator_export(unittest.TestCase): initFiller(model) self.unit_test_export(model, "FC_img", [[1, 3, 2, 2]]) + def test_export_relu(self): + print("ReLU") + model = aidge_core.sequential([ + aidge_core.ReLU(name="relu0") + ]) + + self.assertTrue(unit_test_export(model, "ReLU", [[1, 10]])) + + def test_export_add(self): + print("Add") + model = aidge_core.sequential([ + aidge_core.Producer([1, 10]), + aidge_core.Add() + ]) + + self.assertTrue(unit_test_export(model, "Add", [[1, 10]])) + + def test_export_sub(self): + print("Sub") + model = aidge_core.sequential([ + aidge_core.Producer([1, 10]), + aidge_core.Sub() + ]) + + self.assertTrue(unit_test_export(model, "Sub", [[1, 10]])) + + def test_export_mul(self): + print("Mul") + model = aidge_core.sequential([ + aidge_core.Producer([1, 10]), + aidge_core.Mul() + ]) + + self.assertTrue(unit_test_export(model, "Mul", [[1, 10]])) + + def test_export_conv2D(self): + print("Conv2D") + model = aidge_core.sequential([ + aidge_core.Conv2D(in_channels=3, out_channels=3, kernel_dims=(3, 3)) + ]) + + self.assertTrue(unit_test_export(model, "Conv2D", [[1, 3, 12, 12]])) + + # def test_export_max_pooling(self): + # print("MaxPooling2D") + # model = aidge_core.sequential([ + # aidge_core.MaxPooling2D(kernel_dims=(3, 3)) + # ]) + + # self.assertTrue(unit_test_export(model, "MaxPooling2D", [[1, 2, 12, 12]])) + + # def test_export_avg_pooling(self): + # print("AvgPooling2D") + # model = aidge_core.sequential([ + # aidge_core.AvgPooling2D(kernel_dims=(3, 3), name="avg_pool0") + # ]) + + # self.assertTrue(unit_test_export(model, "AvgPooling2D", [[1, 2, 12, 12]])) + + # def test_export_pad2D(self): + # print("Pad2D") + # model = aidge_core.sequential([ + # aidge_core.Softmax(axis=1, name="sf0") + # ]) + + # self.assertTrue(unit_test_export(model, "Softmax", [[1, 10]])) + + # def test_export_batchnorm2D(self): + # print("BatchNormalization2D") + # model = aidge_core.sequential([ + # aidge_core.BatchNorm2D(nb_features=10, epsilon=2e-5) + # ]) + + # self.assertTrue(unit_test_export(model, "BatchNorm2D", [[1, 10]])) + + def test_export_cpp(self): + print("Export test to do") + def test_export_Conv(self): model = aidge_core.sequential([ aidge_core.Conv2D(1, 1, [3, 3], name="InputNode")