TRIQS/nda 2.0.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
10
11#pragma once
12
13#include "../macros.hpp"
14#include "../stdutil/array.hpp"
16
17#include <algorithm>
18#include <array>
19#include <concepts>
20#include <cstddef>
21#include <cstdint>
22
23namespace nda {
24
29
41 template <size_t N>
42 constexpr std::array<int, N> decode(uint64_t binary_representation) {
44 for (int i = 0; i < N; ++i) result[i] = (binary_representation >> (8 * i)) & 0xFFull;
45 return result;
46 }
47
58 template <size_t N>
59 constexpr uint64_t encode(std::array<int, N> const &a) {
60 uint64_t result = 0;
61 for (int i = 0; i < N; ++i) {
62 EXPECTS(0 <= a[i] and a[i] <= 255);
63 result += (static_cast<uint64_t>(a[i]) << (8 * i));
64 }
65 return result;
66 }
67
69
70} // namespace nda
71
72namespace nda::permutations {
73
78
90 template <std::integral Int, size_t N>
91 constexpr bool is_valid(std::array<Int, N> const &p) {
92 auto idx_counts = stdutil::make_initialized_array<N>(0);
93 for (auto idx : p) {
94 if (idx < 0 or idx > N - 1 or idx_counts[idx] > 0) return false;
95 idx_counts[idx] = 1;
96 }
97 return true;
98 }
99
112 template <std::integral Int, size_t N>
113 constexpr std::array<Int, N> compose(std::array<Int, N> const &p1, std::array<Int, N> const &p2) {
114 EXPECTS(is_valid(p1));
115 EXPECTS(is_valid(p2));
116 auto result = stdutil::make_initialized_array<N>(0);
117 for (int u = 0; u < N; ++u) result[u] = p1[p2[u]];
118 return result;
119 }
120
132 template <std::integral Int, size_t N>
133 constexpr std::array<Int, N> inverse(std::array<Int, N> const &p) {
134 EXPECTS(is_valid(p));
135 auto result = stdutil::make_initialized_array<N>(0);
136 for (int u = 0; u < N; ++u) result[p[u]] = u;
137 return result;
138 }
139
152 template <typename T, std::integral Int, size_t N>
153 constexpr std::array<T, N> apply_inverse(std::array<Int, N> const &p, std::array<T, N> const &a) {
154 EXPECTS(is_valid(p));
156 for (int u = 0; u < N; ++u) result[p[u]] = a[u];
157 return result;
158 }
159
173 template <typename T, std::integral Int, size_t N>
174 constexpr std::array<T, N> apply(std::array<Int, N> const &p, std::array<T, N> const &a) {
175 EXPECTS(is_valid(p));
177 for (int u = 0; u < N; ++u) result[u] = a[p[u]];
178 return result;
179 }
180
187 template <size_t N>
188 constexpr std::array<int, N> identity() {
189 auto result = stdutil::make_initialized_array<N>(0);
190 for (int i = 0; i < N; ++i) result[i] = i;
191 return result;
192 }
193
200 template <size_t N>
201 constexpr std::array<int, N> reverse_identity() {
202 auto result = stdutil::make_initialized_array<N>(0);
203 for (int i = 0; i < N; ++i) result[i] = N - 1 - i;
204 return result;
205 }
206
217 template <size_t N>
218 constexpr std::array<int, N> transposition(int i, int j) {
219 auto r = identity<N>();
220 r[i] = j;
221 r[j] = i;
222 return r;
223 }
224
236 template <size_t N>
237 constexpr std::array<int, N> cycle(int p, int pos = N) {
238 auto result = stdutil::make_initialized_array<N>(0);
239 pos = std::clamp(pos, 0, static_cast<int>(N));
240 for (int i = 0; i < N; ++i) result[i] = (i < pos ? (pos + i - p) % pos : i);
241 return result;
242 }
243
245
246} // 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.