LLZK 0.1.0
An open-source IR for Zero Knowledge (ZK) circuits
Loading...
Searching...
No Matches
AlignmentHelper.h
Go to the documentation of this file.
1//===-- AlignmentHelper.h --------------------------------------*- C++ -*-===//
2//
3// Part of the LLZK Project, under the Apache License v2.0.
4// See LICENSE.txt for license information.
5// Copyright 2026 Project LLZK
6// SPDX-License-Identifier: Apache-2.0
7//
8//===----------------------------------------------------------------------===//
9
10#pragma once
11
12#include <llvm/ADT/SetVector.h>
13#include <llvm/ADT/SmallVectorExtras.h>
14#include <llvm/Support/Debug.h>
15#include <llvm/Support/LogicalResult.h>
16
17#include <concepts>
18
20
21template <class ValueT, class FnT>
22concept Matcher = requires(FnT fn, ValueT val) {
23 { fn(val, val) } -> std::convertible_to<bool>;
24};
25
26template <class ValueT, class FnT>
28llvm::FailureOr<llvm::SetVector<std::pair<ValueT, ValueT>>> getMatchingPairs(
29 llvm::ArrayRef<ValueT> as, llvm::ArrayRef<ValueT> bs, FnT doesMatch, bool allowPartial = true
30) {
31
32 llvm::SetVector<ValueT> setA {as.begin(), as.end()}, setB {bs.begin(), bs.end()};
33 llvm::DenseMap<size_t, llvm::SmallVector<size_t>> possibleMatchesA, possibleMatchesB;
34
35 for (size_t i = 0, ea = as.size(), eb = bs.size(); i < ea; i++) {
36 for (size_t j = 0; j < eb; j++) {
37 if (doesMatch(as[i], bs[j])) {
38 possibleMatchesA[i].push_back(j);
39 possibleMatchesB[j].push_back(i);
40 }
41 }
42 }
43
44 llvm::SetVector<std::pair<ValueT, ValueT>> matches;
45 for (auto [a, b] : possibleMatchesA) {
46 if (b.size() == 1 && possibleMatchesB[b[0]].size() == 1) {
47 setA.remove(as[a]);
48 setB.remove(bs[b[0]]);
49 matches.insert({as[a], bs[b[0]]});
50 }
51 }
52
53 if ((!setA.empty() || !setB.empty()) && !allowPartial) {
54 return llvm::failure();
55 }
56 return matches;
57}
58} // namespace llzk::alignmentHelpers
llvm::FailureOr< llvm::SetVector< std::pair< ValueT, ValueT > > > getMatchingPairs(llvm::ArrayRef< ValueT > as, llvm::ArrayRef< ValueT > bs, FnT doesMatch, bool allowPartial=true)