I need to iterate over all multi-set permutations of parts of an array, and get the value of a function which depends on the order of elements in the array. What’s the most efficient way to do this?
Only a subset of the array is permuted, however the results of the function depend on the value of every element in the array.
I’ve come up with:
using Combinatorics, Statistics my_array = rand('a':'d', 40) # Example function, my function is about as trivial in terms of runtime my_func(x, y) = mean(cumsum(x .== y)) function get_all_results(arr) # Only permute part of the array, e.g. here all a's and c's in the array ps = multiset_permutations(arr[in(['a', 'c']).(arr)], sum(in(['a', 'c']).(arr))) result = zeros(length(ps)) for (i, p) ∈ enumerate(ps) # Replace the a's and c's with the permuted a's and c's # This is the bit that feels suboptimal? arr[in(['a', 'c']).(arr)] = p result[i] = my_func(arr, 'c') end return result end
But I wonder whether there’s a better way to “shuffle around” the elements in the existing array?
Furthermore, it seems to me that the way I’m doing it currently is not threadsafe/parallelizable, as different threads would try to shuffle the elements in
my_array, so if there’s a way around this as well that’d be great!