TRIQS/nda 1.3.0
Multi-dimensional array library for C++
Loading...
Searching...
No Matches
permutation.hpp
Go to the documentation of this file.
1// Copyright (c) 2019--present, The Simons Foundation
2// This file is part of TRIQS/nda and is licensed under the Apache License, Version 2.0.
3// SPDX-License-Identifier: Apache-2.0
4// See LICENSE in the root of this distribution for details.
5
11
12#pragma once
13
14#include "../macros.hpp"
15#include "../stdutil/array.hpp"
17
18#include <algorithm>
19#include <array>
20#include <concepts>
21#include <cstddef>
22#include <cstdint>
23
24namespace nda {
25
30
42 template <size_t N>
43 constexpr std::array<int, N> decode(uint64_t binary_representation) {
45 for (int i = 0; i < N; ++i) result[i] = (binary_representation >> (4 * i)) & 0b1111ull;
46 return result;
47 }
48
59 template <size_t N>
60 constexpr uint64_t encode(std::array<int, N> const &a) {
61 uint64_t result = 0;
62 for (int i = 0; i < N; ++i) {
63 EXPECTS(0 <= a[i] and a[i] <= 15);
64 result += (static_cast<uint64_t>(a[i]) << (4 * i));
65 }
66 return result;
67 }
68
70
71} // namespace nda
72
73namespace nda::permutations {
74
79
91 template <std::integral Int, size_t N>
92 constexpr bool is_valid(std::array<Int, N> const &p) {
93 auto idx_counts = stdutil::make_initialized_array<N>(0);
94 for (auto idx : p) {
95 if (idx < 0 or idx > N - 1 or idx_counts[idx] > 0) return false;
96 idx_counts[idx] = 1;
97 }
98 return true;
99 }
100
113 template <std::integral Int, size_t N>
114 constexpr std::array<Int, N> compose(std::array<Int, N> const &p1, std::array<Int, N> const &p2) {
115 EXPECTS(is_valid(p1));
116 EXPECTS(is_valid(p2));
117 auto result = stdutil::make_initialized_array<N>(0);
118 for (int u = 0; u < N; ++u) result[u] = p1[p2[u]];
119 return result;
120 }
121
133 template <std::integral Int, size_t N>
134 constexpr std::array<Int, N> inverse(std::array<Int, N> const &p) {
135 EXPECTS(is_valid(p));
136 auto result = stdutil::make_initialized_array<N>(0);
137 for (int u = 0; u < N; ++u) result[p[u]] = u;
138 return result;
139 }
140
153 template <typename T, std::integral Int, size_t N>
154 constexpr std::array<T, N> apply_inverse(std::array<Int, N> const &p, std::array<T, N> const &a) {
155 EXPECTS(is_valid(p));
157 for (int u = 0; u < N; ++u) result[p[u]] = a[u];
158 return result;
159 }
160
174 template <typename T, std::integral Int, size_t N>
175 constexpr std::array<T, N> apply(std::array<Int, N> const &p, std::array<T, N> const &a) {
176 EXPECTS(is_valid(p));
178 for (int u = 0; u < N; ++u) result[u] = a[p[u]];
179 return result;
180 }
181
188 template <size_t N>
189 constexpr std::array<int, N> identity() {
190 auto result = stdutil::make_initialized_array<N>(0);
191 for (int i = 0; i < N; ++i) result[i] = i;
192 return result;
193 }
194
201 template <size_t N>
202 constexpr std::array<int, N> reverse_identity() {
203 auto result = stdutil::make_initialized_array<N>(0);
204 for (int i = 0; i < N; ++i) result[i] = N - 1 - i;
205 return result;
206 }
207
218 template <size_t N>
219 constexpr std::array<int, N> transposition(int i, int j) {
220 auto r = identity<N>();
221 r[i] = j;
222 r[j] = i;
223 return r;
224 }
225
237 template <size_t N>
238 constexpr std::array<int, N> cycle(int p, int pos = N) {
239 auto result = stdutil::make_initialized_array<N>(0);
240 pos = std::clamp(pos, 0, static_cast<int>(N));
241 for (int i = 0; i < N; ++i) result[i] = (i < pos ? (pos + i - p) % pos : i);
242 return result;
243 }
244
246
247} // namespace nda::permutations
Provides utility functions for std::array.
constexpr std::array< int, N > transposition(int i, int j)
Get the permutation representing a single given transposition.
constexpr std::array< Int, N > inverse(std::array< Int, N > const &p)
Inverse of a permutation.
constexpr std::array< int, N > decode(uint64_t binary_representation)
Decode a uint64_t into a std::array<int, N>.
constexpr bool is_valid(std::array< Int, N > const &p)
Check if a given array is a valid permutation.
constexpr std::array< T, N > apply_inverse(std::array< Int, N > const &p, std::array< T, N > const &a)
Apply the inverse of a permutation to a std::array.
constexpr std::array< int, N > identity()
Get the identity permutation.
constexpr uint64_t encode(std::array< int, N > const &a)
Encode a std::array<int, N> in a uint64_t.
constexpr std::array< int, N > reverse_identity()
Get the reverse identity permutation.
constexpr std::array< int, N > cycle(int p, int pos=N)
Perform a forward (partial) cyclic permutation of the identity p times.
constexpr std::array< Int, N > compose(std::array< Int, N > const &p1, std::array< Int, N > const &p2)
Composition of two permutations.
constexpr std::array< T, N > apply(std::array< Int, N > const &p, std::array< T, N > const &a)
Apply a permutation to a std::array.
constexpr std::array< T, R > make_initialized_array(T v)
Create a new std::array object initialized with a specific value.
Definition array.hpp:155
Macros used in the nda library.
Provides missing concepts for older compiler versions.