Re: How to sort a multidimensional ndslice?

2020-08-19 Thread 9il via Digitalmars-d-learn

On Tuesday, 18 August 2020 at 13:07:56 UTC, Arredondo wrote:

On Tuesday, 18 August 2020 at 04:07:56 UTC, 9il wrote:

To reorder the columns data according to precomputed index:
auto index = a.byDim!1.map!sum.slice;


Hello Ilya, thanks for the answer!

Unfortunately I can't use it because I don't have (and can't 
define) a sorting index for my columns. I only have a predicate 
`larger(c1, c2)` that compares two columns to decide which one 
is "larger".


Cheers!
Armando.


This should work. But reallocates the data.

/+dub.sdl:
dependency "mir-algorithm" version="~>3.9.24"
+/
import std.stdio;

import mir.array.allocation;
import mir.ndslice;
import mir.ndslice.sorting;

void main() {
auto a = [[1, -1, 3, 2],
  [0, -2, 3, 1]].fuse;

writeln(a);
auto b = a.byDim!1.array;
b.sort!larger;
auto c = b.fuse!1;
writeln(c);
}

auto larger(C)(C u, C v) {
import mir.math.sum : sum;
return sum(u) > sum(v);
}



Re: How to sort a multidimensional ndslice?

2020-08-18 Thread James Blachly via Digitalmars-d-learn

On Tuesday, 18 August 2020 at 13:07:56 UTC, Arredondo wrote:

On Tuesday, 18 August 2020 at 04:07:56 UTC, 9il wrote:

To reorder the columns data according to precomputed index:
auto index = a.byDim!1.map!sum.slice;


Hello Ilya, thanks for the answer!

Unfortunately I can't use it because I don't have (and can't 
define) a sorting index for my columns. I only have a predicate 
`larger(c1, c2)` that compares two columns to decide which one 
is "larger".


Cheers!
Armando.


Armando, I believe you can just pass your predicate to the sort! 
template


http://docs.algorithm.dlang.io/latest/mir_ndslice_sorting.html



Re: How to sort a multidimensional ndslice?

2020-08-18 Thread Arredondo via Digitalmars-d-learn

On Tuesday, 18 August 2020 at 04:07:56 UTC, 9il wrote:

To reorder the columns data according to precomputed index:
auto index = a.byDim!1.map!sum.slice;


Hello Ilya, thanks for the answer!

Unfortunately I can't use it because I don't have (and can't 
define) a sorting index for my columns. I only have a predicate 
`larger(c1, c2)` that compares two columns to decide which one is 
"larger".


Cheers!
Armando.



Re: How to sort a multidimensional ndslice?

2020-08-17 Thread 9il via Digitalmars-d-learn

The following code just sorts each row:

--
/+dub.sdl:
dependency "mir-algorithm" version="~>3.9.24"
+/
import mir.ndslice;
import mir.ndslice.sorting;
import mir.algorithm.iteration: each;

void main() {
// fuse, not sliced if you use an array of arrays for argument
auto a = [[1, -1, 3, 2],
  [0, -2, 3, 1]].fuse;

// make an index
a.byDim!0.each!(sort!larger);

import std.stdio;
writeln(a);
  // [[3, 2, 1, -1], [3, 1, 0, -2]]
}

auto larger(C)(C u, C v) {
return u > v;
}
--



To reorder the columns data according to precomputed index:

--
/+dub.sdl:
dependency "mir-algorithm" version="~>3.9.24"
+/
import mir.ndslice;
import mir.series;
import mir.ndslice.sorting;
import mir.algorithm.iteration: each;
import mir.math.sum;

void main() {
// fuse, not sliced if you use an array of arrays for argument
auto a = [[1, -1, 3, 2],
  [0, -2, 3, 1]].fuse;

// make an index
auto index = a.byDim!1.map!sum.slice;

auto s = index.series(a.transposed);
auto indexBuffer = uninitSlice!int(s.length);
auto dataBuffer = uninitSlice!int(s.length);
sort!larger(s, indexBuffer, dataBuffer);

import std.stdio;
writeln(a);
   /// [[3, 2, 1, -1], [3, 1, 0, -2]]
}

auto larger(C)(C u, C v) {
return u > v;
}

-