LLZK
3.0.0
An open-source IR for Zero Knowledge (ZK) circuits
Toggle main menu visibility
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
19
namespace
llzk::alignmentHelpers
{
20
21
template
<
class
ValueT,
class
FnT>
22
concept
Matcher
=
requires
(FnT fn, ValueT val) {
23
{ fn(val, val) } -> std::convertible_to<bool>;
24
};
25
26
template
<
class
ValueT,
class
FnT>
27
requires
Matcher<ValueT, FnT>
28
llvm::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
llzk::alignmentHelpers::Matcher
Definition
AlignmentHelper.h:22
llzk::alignmentHelpers
Definition
AlignmentHelper.h:19
llzk::alignmentHelpers::getMatchingPairs
llvm::FailureOr< llvm::SetVector< std::pair< ValueT, ValueT > > > getMatchingPairs(llvm::ArrayRef< ValueT > as, llvm::ArrayRef< ValueT > bs, FnT doesMatch, bool allowPartial=true)
Definition
AlignmentHelper.h:28
include
llzk
Util
AlignmentHelper.h
Generated by
1.17.0
Copyright 2025 Veridise Inc. under the Apache License v2.0. Copyright 2026 Project LLZK under the Apache License v2.0.