From 859dd3ef82b8c790cac1b6c1d666089529f72600 Mon Sep 17 00:00:00 2001 From: Mirek Kratochvil Date: Sun, 1 Apr 2012 20:52:46 +0200 Subject: [PATCH] permutations --- lib/permutation.cpp | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/lib/permutation.cpp b/lib/permutation.cpp index 4b9e8b6..53dd303 100644 --- a/lib/permutation.cpp +++ b/lib/permutation.cpp @@ -5,21 +5,43 @@ using namespace ccr; void permutation::compute_inversion (permutation&r) { - + r.resize (size(), 0); + for (uint i = 0; i < size(); ++i) + r[item (i) ] = i; } void permutation::generate_random (uint size, prng&rng) { + resize (size, 0); + uint i; + for (i = 0; i < size; ++i) item (i) = i; + //knuth shuffle + for (i = size - 1; i > 0; --i) { + uint j = rng.random (i + 1); + if (i != j) { + uint t = item (i); + item (i) = item (j); + item (j) = t; + } + } } -void permutation::permute_cols (const matrix&a, matrix&r) +void permutation::permute (const bvector&a, bvector&r) { + r.resize (a.size() ); + for (uint i = 0; i < size(); ++i) r[item (i) ] = a[i]; +} +void permutation::permute (const matrix&a, matrix&r) +{ + r.resize (a.size() ); + for (uint i = 0; i < size(); ++i) r[item (i) ] = a[i]; } void permutation::permute_rows (const matrix&a, matrix&r) { - + r.resize (a.size() ); + for (uint i = 0; i < a.size(); ++i) permute (a[i], r[i]); }