@@ -236,3 +236,66 @@ module VectorModuleTests =
236236 let v = [| 1.0 ; 2.0 ; 3.0 |]
237237 let result = Vector.sub 3 v
238238 Assert.Empty( result)
239+
240+ // Tests for permuteBy function
241+ [<Fact>]
242+ let ``permuteBy : applies identity permutation`` () =
243+ let v = [| 1.0 ; 2.0 ; 3.0 ; 4.0 |]
244+ let P = Permutation.identity
245+ let result = Vector.permuteBy P v
246+ floatArrayClose [| 1.0 ; 2.0 ; 3.0 ; 4.0 |] result 1e-10
247+
248+ [<Fact>]
249+ let ``permuteBy : applies simple permutation`` () =
250+ // Permutation: [2, 0, 1] means result[0] = v[2], result[1] = v[0], result[2] = v[1]
251+ let v = [| 10.0 ; 20.0 ; 30.0 |]
252+ let P = Permutation.ofArray [| 2 ; 0 ; 1 |]
253+ let result = Vector.permuteBy P v
254+ floatArrayClose [| 30.0 ; 10.0 ; 20.0 |] result 1e-10
255+
256+ [<Fact>]
257+ let ``permuteBy : applies swap permutation`` () =
258+ let v = [| 1.0 ; 2.0 ; 3.0 ; 4.0 ; 5.0 |]
259+ let P = Permutation.swap 1 3 // Swap indices 1 and 3
260+ let result = Vector.permuteBy P v
261+ floatArrayClose [| 1.0 ; 4.0 ; 3.0 ; 2.0 ; 5.0 |] result 1e-10
262+
263+ [<Fact>]
264+ let ``permuteBy : applies reversal permutation`` () =
265+ let v = [| 1.0 ; 2.0 ; 3.0 ; 4.0 ; 5.0 |]
266+ let P = Permutation.reversal 5
267+ let result = Vector.permuteBy P v
268+ floatArrayClose [| 5.0 ; 4.0 ; 3.0 ; 2.0 ; 1.0 |] result 1e-10
269+
270+ [<Fact>]
271+ let ``permuteBy : applies rotation permutation`` () =
272+ let v = [| 1.0 ; 2.0 ; 3.0 ; 4.0 |]
273+ let P = Permutation.rotation 4 1 // Rotate right by 1
274+ let result = Vector.permuteBy P v
275+ floatArrayClose [| 2.0 ; 3.0 ; 4.0 ; 1.0 |] result 1e-10
276+
277+ [<Fact>]
278+ let ``permuteBy : works with single element`` () =
279+ let v = [| 42.0 |]
280+ let P = Permutation.identity
281+ let result = Vector.permuteBy P v
282+ floatArrayClose [| 42.0 |] result 1e-10
283+
284+ [<Fact>]
285+ let ``permuteBy : double permutation equals inverse`` () =
286+ // Applying a permutation twice with its inverse should return original
287+ let v = [| 1.0 ; 2.0 ; 3.0 ; 4.0 |]
288+ let pArray = [| 2 ; 0 ; 3 ; 1 |]
289+ let P = Permutation.ofArray pArray
290+ let Pinv = Permutation.inverse 4 P
291+ let permuted = Vector.permuteBy P v
292+ let restored = Vector.permuteBy Pinv permuted
293+ floatArrayClose v restored 1e-10
294+
295+ [<Fact>]
296+ let ``permuteBy : works with integers`` () =
297+ let v = [| 10 ; 20 ; 30 ; 40 |]
298+ let P = Permutation.ofArray [| 3 ; 2 ; 1 ; 0 |]
299+ let result = Vector.permuteBy P v
300+ let expected = [| 40 ; 30 ; 20 ; 10 |]
301+ Assert.Equal< int[]>( expected, result)
0 commit comments