35 for (
size_t cc_id = 0; cc_id < circuit_cc.size(); cc_id++) {
36 for (
auto v : circuit_cc[cc_id].vars()) {
37 circuit_var_to_cc_[v] = cc_id;
45 for (
const auto& [_, range_list] : builder_.range_lists) {
46 for (
auto var_idx : range_list.variable_indices) {
47 range_list_vars_.insert(builder_.real_variable_index[var_idx]);
52 for (
const auto& [_, var_idx] : builder_.constant_variable_indices) {
53 constant_var_set_.insert(var_idx);
59 size_t next_virtual_id = circuit_cc.size();
60 std::unordered_map<uint32_t, size_t> virtual_cc_ids;
62 for (
const auto& [witness, _] : acir_witness_map_) {
63 if (witness >= builder_.real_variable_index.size()) {
64 circuit_witness_map_[witness] = NO_CIRCUIT_CC;
68 uint32_t real_idx = builder_.real_variable_index[witness];
71 if (
auto it = circuit_var_to_cc_.find(real_idx); it != circuit_var_to_cc_.end()) {
72 circuit_witness_map_[witness] = it->second;
77 if (constant_var_set_.contains(real_idx)) {
78 if (!virtual_cc_ids.contains(real_idx)) {
79 virtual_cc_ids[real_idx] = next_virtual_id++;
81 circuit_witness_map_[witness] = virtual_cc_ids[real_idx];
86 bool in_gate = gate_counts_.contains(real_idx) && gate_counts_.at(real_idx) > 0;
87 bool in_range_list = range_list_vars_.contains(real_idx);
88 if (in_gate || in_range_list) {
89 if (!virtual_cc_ids.contains(real_idx)) {
90 virtual_cc_ids[real_idx] = next_virtual_id++;
92 circuit_witness_map_[witness] = virtual_cc_ids[real_idx];
96 circuit_witness_map_[witness] = NO_CIRCUIT_CC;
106 for (
const auto& [witness, acir_comp] : acir_witness_map_) {
107 acir_comp_witnesses[acir_comp].push_back(witness);
110 for (
const auto& [acir_comp, witnesses] : acir_comp_witnesses) {
111 std::unordered_set<size_t> circuit_ccs_seen;
112 std::vector<uint32_t> unconstrained;
114 for (
auto w : witnesses) {
115 auto it = circuit_witness_map_.find(w);
116 if (it == circuit_witness_map_.end() || it->second == NO_CIRCUIT_CC) {
117 unconstrained.push_back(w);
119 circuit_ccs_seen.insert(it->second);
123 if (circuit_ccs_seen.size() > 1) {
124 std::string msg =
"ACIR component " +
std::to_string(acir_comp) +
" is split across " +
125 std::to_string(circuit_ccs_seen.size()) +
" circuit components. Witnesses: ";
126 for (
auto w : witnesses) {
128 auto cit = circuit_witness_map_.find(w);
129 if (cit != circuit_witness_map_.end() && cit->second != NO_CIRCUIT_CC) {
139 if (!unconstrained.empty()) {
140 std::string msg =
"ACIR component " +
std::to_string(acir_comp) +
" has " +
141 std::to_string(unconstrained.size()) +
" witness(es) missing from circuit: ";
142 for (
auto w : unconstrained) {
143 msg += format_witness_debug(w) +
" ";
154 if (w >= builder_.real_variable_index.size()) {
155 return "w" +
std::to_string(w) +
"(real=missing,const=false,cc=false,gates=false,rl=false)";
158 uint32_t real_idx = builder_.real_variable_index[w];
159 bool is_const = constant_var_set_.contains(real_idx);
160 bool in_cc = circuit_var_to_cc_.contains(real_idx);
161 bool has_gates = gate_counts_.contains(real_idx) && gate_counts_.at(real_idx) > 0;
162 bool in_rl = range_list_vars_.contains(real_idx);
163 auto b = [](
bool v) {
return v ?
"true" :
"false"; };
165 ",gates=" +
b(has_gates) +
",rl=" +
b(in_rl) +
")";