Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
trace_container.cpp
Go to the documentation of this file.
2
3#include <algorithm>
4#include <mutex>
5
10
11namespace bb::avm2::tracegen {
12namespace {
13
14// We need a zero value to return (a reference to) when a value is not found.
15static const FF zero = FF::zero();
16constexpr auto clk_column = Column::precomputed_clk;
17
18} // namespace
19
23
24const FF& TraceContainer::get(Column col, uint32_t row) const
25{
26 auto& column_data = (*trace)[static_cast<size_t>(col)];
27 std::shared_lock lock(column_data.mutex);
28 const auto it = column_data.rows.find(row);
29 return it == column_data.rows.end() ? zero : it->second;
30}
31
33{
34 if (is_shift(col)) {
35 return get(unshift_column(col).value(), row + 1);
36 }
37 return get(static_cast<Column>(col), row);
38}
39
40void TraceContainer::set(Column col, uint32_t row, const FF& value)
41{
42 auto& column_data = (*trace)[static_cast<size_t>(col)];
43 std::unique_lock lock(column_data.mutex);
44 if (!value.is_zero()) {
45 column_data.rows.insert_or_assign(row, value);
46 column_data.max_row_number = std::max(column_data.max_row_number, static_cast<int64_t>(row));
47 } else {
48 auto num_erased = column_data.rows.erase(row);
49 if (column_data.max_row_number == row && num_erased > 0) {
50 // This shouldn't happen often. We delay recalculation of the max row number
51 // until someone actually needs it.
52 column_data.row_number_dirty = true;
53 }
54 }
55}
56
57void TraceContainer::set(uint32_t row, std::span<const std::pair<Column, FF>> values)
58{
59 for (const auto& [col, value] : values) {
60 set(col, row, value);
61 }
62}
63
65{
66 auto& column_data = (*trace)[static_cast<size_t>(col)];
67 std::unique_lock lock(column_data.mutex);
68 column_data.rows.reserve(size);
69}
70
72{
73 auto& column_data = (*trace)[static_cast<size_t>(col)];
74 std::unique_lock lock(column_data.mutex);
75 if (column_data.row_number_dirty) {
76 // Trigger recalculation of max row number.
77 auto keys = std::views::keys(column_data.rows);
78 const auto it = std::ranges::max_element(keys);
79 // We use -1 to indicate that the column is empty.
80 column_data.max_row_number = it == keys.end() ? -1 : static_cast<int64_t>(*it);
81 column_data.row_number_dirty = false;
82 }
83 return static_cast<uint32_t>(column_data.max_row_number + 1);
84}
85
87{
89 for (size_t col = 0; col < num_columns(); ++col) {
90 if (static_cast<Column>(col) != clk_column) {
92 }
93 }
94 return max_rows;
95}
96
101
102void TraceContainer::visit_column(Column col, const std::function<void(uint32_t, const FF&)>& visitor) const
103{
104 auto& column_data = (*trace)[static_cast<size_t>(col)];
105 std::shared_lock lock(column_data.mutex);
106 for (const auto& [row, value] : column_data.rows) {
107 visitor(row, value);
108 }
109}
110
112{
113 for (const auto& col : cols) {
115 }
116}
117
119{
121 auto& column_data = (*trace)[static_cast<size_t>(col)];
122 std::unique_lock lock(column_data.mutex);
123 for (auto& [row, value] : column_data.rows) {
124 ff_vector.push_back(value);
125 }
126 FF::batch_invert<RefVector<FF>>(ff_vector);
127}
128
130{
131 auto& column_data = (*trace)[static_cast<size_t>(col)];
132 std::unique_lock lock(column_data.mutex);
133 column_data.rows.clear();
134 column_data.max_row_number = 0;
135 column_data.row_number_dirty = false;
136}
137
138} // namespace bb::avm2::tracegen
A template class for a reference vector. Behaves as if std::vector<T&> was possible.
static constexpr size_t num_columns()
const FF & get(Column col, uint32_t row) const
void reserve_column(Column col, size_t size)
const FF & get_column_or_shift(ColumnAndShifts col, uint32_t row) const
void invert_columns(std::span< const Column > cols)
void visit_column(Column col, const std::function< void(uint32_t, const FF &)> &visitor) const
uint32_t get_column_rows(Column col) const
void set(Column col, uint32_t row, const FF &value)
TestTraceContainer trace
bool is_shift(ColumnAndShifts c)
std::optional< Column > unshift_column(ColumnAndShifts c)
constexpr auto NUM_COLUMNS_WITHOUT_SHIFTS
Definition columns.hpp:40
ColumnAndShifts
Definition columns.hpp:34
AvmFlavorSettings::FF FF
Definition field.hpp:10
STL namespace.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
BB_INLINE constexpr bool is_zero() const noexcept