-
Notifications
You must be signed in to change notification settings - Fork 163
Description
Hi,
I am implementing an efficent factor chain solver.
In the solution I multiply and invert lower triangular matrices.
I want to generate efficent CPP code using symforce, but am unable to do that because the code generation treats 0s in the matrices as symbolic variables.
Of course I could create a full matrix instead of a lower triangular, and then edit the generated code, but I was wondering if you have a built in solution for my issue.
I provide exampel code which produces the following error:
c = codegen.Codegen(
File "/home/alon/.local/lib/python3.10/site-packages/symforce/codegen/codegen.py", line 208, in init
assert len(input_symbols) == len(
AssertionError: Symbols in inputs must be unique. Duplicate symbols = [0, 0, 0, 0, 0, 0]
import symforce
symforce.set_epsilon_to_symbol()
from symforce import codegen
from symforce.values import Values
import symforce.symbolic as sf
import os
current_dir = os.path.dirname(__file__)
parent_dir = os.path.abspath(os.path.join(current_dir, os.pardir))
generated_dir = os.path.join(parent_dir, "generated")
AtAi = sf.Matrix(4, 4)
for i in range(4):
for j in range(4):
AtAi[i, j] = sf.Symbol(f'AtAi_{i}_{j}')
Lim1 = sf.Matrix(4, 4)
for i in range(4):
for j in range(4):
if j <= i:
Lim1[i, j] = sf.Symbol(f'Lim1_{i}_{j}')
else:
Lim1[i, j] = 0
Li = AtAi.transpose() * Lim1.transpose().inv()
inputs = Values()
inputs["AtAi"] = AtAi
inputs["Lim1"] = Lim1
ouptuts = Values()
ouptuts["Li"] = Li
c = codegen.Codegen(
inputs=inputs,
outputs=ouptuts,
config = codegen.CppConfig(use_eigen_types=True),
name = "compute_Li"
)
c.generate_function(
namespace = "generated",
output_dir = generated_dir,
skip_directory_nesting=True,
)
Thanks,
Alon.