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
9
10namespace bb::avm2::tracegen {
11namespace {
12
13// We need a zero value to return (a reference to) when a value is not found.
14static const FF zero = FF::zero();
15constexpr auto clk_column = Column::precomputed_clk;
16
17} // namespace
18
22
23const FF& TraceContainer::get(Column col, uint32_t row) const
24{
25 auto& column_data = (*trace)[static_cast<size_t>(col)];
26 std::shared_lock lock(column_data.mutex);
27 const auto it = column_data.rows.find(row);
28 return it == column_data.rows.end() ? zero : it->second;
29}
30
32{
33 if (is_shift(col)) {
34 return get(unshift_column(col).value(), row + 1);
35 }
36 return get(static_cast<Column>(col), row);
37}
38
39void TraceContainer::set(Column col, uint32_t row, const FF& value)
40{
41 auto& column_data = (*trace)[static_cast<size_t>(col)];
42 std::unique_lock lock(column_data.mutex);
43 if (!value.is_zero()) {
44 column_data.rows.insert_or_assign(row, value);
45 column_data.max_row_number = std::max(column_data.max_row_number, static_cast<int64_t>(row));
46 } else {
47 auto num_erased = column_data.rows.erase(row);
48 if (column_data.max_row_number == row && num_erased > 0) {
49 // This shouldn't happen often. We delay recalculation of the max row number
50 // until someone actually needs it.
51 column_data.row_number_dirty = true;
52 }
53 }
54}
55
56void TraceContainer::set(uint32_t row, std::span<const std::pair<Column, FF>> values)
57{
58 for (const auto& [col, value] : values) {
59 set(col, row, value);
60 }
61}
62
64{
65 auto& column_data = (*trace)[static_cast<size_t>(col)];
66 std::unique_lock lock(column_data.mutex);
67 column_data.rows.reserve(size);
68}
69
71{
72 auto& column_data = (*trace)[static_cast<size_t>(col)];
73 std::unique_lock lock(column_data.mutex);
74 if (column_data.row_number_dirty) {
75 // Trigger recalculation of max row number.
76 auto keys = std::views::keys(column_data.rows);
77 const auto it = std::ranges::max_element(keys);
78 // We use -1 to indicate that the column is empty.
79 column_data.max_row_number = it == keys.end() ? -1 : static_cast<int64_t>(*it);
80 column_data.row_number_dirty = false;
81 }
82 return static_cast<uint32_t>(column_data.max_row_number + 1);
83}
84
86{
88 for (size_t col = 0; col < num_columns(); ++col) {
89 if (static_cast<Column>(col) != clk_column) {
91 }
92 }
93 return max_rows;
94}
95
100
101void TraceContainer::visit_column(Column col, const std::function<void(uint32_t, const FF&)>& visitor) const
102{
103 auto& column_data = (*trace)[static_cast<size_t>(col)];
104 std::shared_lock lock(column_data.mutex);
105 for (const auto& [row, value] : column_data.rows) {
106 visitor(row, value);
107 }
108}
109
111{
112 for (const auto& col : cols) {
114 }
115}
116
118{
120 auto& column_data = (*trace)[static_cast<size_t>(col)];
121 std::unique_lock lock(column_data.mutex);
122 for (auto& [row, value] : column_data.rows) {
123 ff_vector.push_back(value);
124 }
125 FF::batch_invert<RefVector<FF>>(ff_vector);
126}
127
129{
130 auto& column_data = (*trace)[static_cast<size_t>(col)];
131 std::unique_lock lock(column_data.mutex);
132 column_data.rows.clear();
133 column_data.max_row_number = 0;
134 column_data.row_number_dirty = false;
135}
136
137} // 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
static constexpr field zero()