fix(optimizer): compiler output forwarding

In the optimizer, nodes without consumers are identified as outputs.
Since we can now return multiple values, this is inherently buggy,
since a value can then be both returned, and consumed to create another
input.

This commit fixes this by allowing the compiler to tag nodes as being
outputs.
This commit is contained in:
Alexandre Péré
2024-01-22 10:16:51 +01:00
committed by Alexandre Péré
parent 166a3217ad
commit a02bf3bae9
16 changed files with 146 additions and 81 deletions

View File

@@ -976,6 +976,7 @@ struct OperationDag final : public ::rust::Opaque {
::concrete_optimizer::dag::OperatorIndex add_unsafe_cast_op(::concrete_optimizer::dag::OperatorIndex input, ::std::uint8_t rounded_precision) noexcept;
::concrete_optimizer::dag::DagSolution optimize(::concrete_optimizer::Options options) const noexcept;
::rust::String dump() const noexcept;
void tag_operator_as_output(::concrete_optimizer::dag::OperatorIndex op) noexcept;
::concrete_optimizer::dag::CircuitSolution optimize_multi(::concrete_optimizer::Options options) const noexcept;
~OperationDag() = delete;
@@ -1312,6 +1313,8 @@ extern "C" {
} // namespace weights
extern "C" {
void concrete_optimizer$cxxbridge1$OperationDag$tag_operator_as_output(::concrete_optimizer::OperationDag &self, ::concrete_optimizer::dag::OperatorIndex op) noexcept;
void concrete_optimizer$cxxbridge1$OperationDag$optimize_multi(::concrete_optimizer::OperationDag const &self, ::concrete_optimizer::Options options, ::concrete_optimizer::dag::CircuitSolution *return$) noexcept;
::std::uint64_t concrete_optimizer$cxxbridge1$NO_KEY_ID() noexcept;
@@ -1419,6 +1422,10 @@ namespace weights {
}
} // namespace weights
void OperationDag::tag_operator_as_output(::concrete_optimizer::dag::OperatorIndex op) noexcept {
concrete_optimizer$cxxbridge1$OperationDag$tag_operator_as_output(*this, op);
}
::concrete_optimizer::dag::CircuitSolution OperationDag::optimize_multi(::concrete_optimizer::Options options) const noexcept {
::rust::MaybeUninit<::concrete_optimizer::dag::CircuitSolution> return$;
concrete_optimizer$cxxbridge1$OperationDag$optimize_multi(*this, options, &return$.value);

View File

@@ -957,6 +957,7 @@ struct OperationDag final : public ::rust::Opaque {
::concrete_optimizer::dag::OperatorIndex add_unsafe_cast_op(::concrete_optimizer::dag::OperatorIndex input, ::std::uint8_t rounded_precision) noexcept;
::concrete_optimizer::dag::DagSolution optimize(::concrete_optimizer::Options options) const noexcept;
::rust::String dump() const noexcept;
void tag_operator_as_output(::concrete_optimizer::dag::OperatorIndex op) noexcept;
::concrete_optimizer::dag::CircuitSolution optimize_multi(::concrete_optimizer::Options options) const noexcept;
~OperationDag() = delete;