The exporter does not seem to broadcast values for Add node
What commit version of aidge do you use
-
aidge_core: 0.6.2 -
aidge_export_cpp: 0.3.1
Problem description
I have a test that performs the addition of two tensors A of dimensions [1] and B of dimension [2]. The CPU backend supports the operations, apparently broadcasting the value of A. The CPP export generates the code, but seems to do no broadcasting.
As per the CPU backend, broadcasting should occur.
Those are the logs provided by a comparison generated using aidge_core.export_utils.generate_main_compare_cpp(...)
Add_output_0:
---------------------------------------------------------------------------------
| Idx | Expected | Predicted | ERROR ? |
|-------------------------------------------------------------------------------|
| 0 | 0.000000 | 0.000000 | |
| 1 | 1.000000 | 0.000000 | X |
---------------------------------
| | TOTAL |
|-------------------------------|
| CORRECT | 1 |
| ERROR | 1 |
---------------------------------
Reproducible example code
import pathlib
import shutil
import subprocess
import aidge_backend_cpu # noqa: F401
import aidge_core as ai
import aidge_export_cpp
import numpy as np
if __name__ == "__main__":
add_layer = ai.Add("Add")
model = ai.sequential([add_layer])
# Set backend and datatype
model.set_backend("cpu")
model.set_datatype(ai.dtype.float32)
### GENERATING SCHEDULING
scheduler = ai.SequentialScheduler(model)
### REFERENCE INFERENCE
lhs = ai.Tensor(np.arange(1, dtype=np.float32))
lhs.set_backend("cpu")
# lhs.set_backend(ai.dtype.float32)
rhs = ai.Tensor(np.arange(2, dtype=np.float32))
rhs.set_backend("cpu")
# rhs.set_backend(ai.dtype.float32)
scheduler.forward(
data=[
lhs, rhs,
],
)
### LOG OUTPUTS AND SCHEDULING
model.log_outputs("aidge_cpp_results")
tmp = pathlib.Path().absolute() / "export_acetone"
# run_exporter_comparison(scheduler, (lhs, rhs,), str(tmp), exporter=aidge_export_cpp.ExportLibCpp)
exporter = aidge_export_cpp.ExportLibCpp
tensors = [lhs, rhs]
ai.export_utils.scheduler_export(
scheduler,
tmp,
exporter,
memory_manager=ai.mem_info.compute_default_mem_info,
)
for ii, tensor in enumerate(tensors):
ai.export_utils.generate_input_file(
export_folder=tmp,
array_name=f"InputNode_input_{ii}",
tensor=tensor,
)
ai.export_utils.generate_main_compare_cpp(
export_folder=tmp,
graph_view=scheduler.graph_view(),
)
# Compile and run comparison
make_path = shutil.which("make")
assert make_path is not None
subprocess.run([make_path], cwd=tmp, check=True)
r = subprocess.run(
[pathlib.Path(tmp) / "bin" / "run_export"],
cwd=tmp,
check=False,
capture_output=True,
text=True,
)
print(r.stdout)
assert r.returncode == 0, f"Comparison failed between reference and exporter '{exporter}'"
Edited by Benjamin Lesage