Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: P2D #497

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open

fix: P2D #497

wants to merge 1 commit into from

Conversation

axiles
Copy link

@axiles axiles commented Apr 28, 2024

The previous implementation could give an incorrect result when the first node was not a root node.

Example:

P2D 0 2 2

correctly returns:

0 1 0 0 2 1

However

P2D 1 1

returns

1 0 0 1

Therefore, it says that no permutation is necessary to have the depth-first traversal.

The reason is that, in the matrix (-1+d)↑⍤0 1⊢⌽z, a zero can either mean the index of a node or an element used to fill the empty positions.

In the last example, (-1+d)↑⍤0 1⊢⌽z is:

1 0  <- path of the node is 1 0
1 0  <- path of the node is 1

Grade Up says that rows of this matrix are already sorted.

A quick fix is just to add one to the matrix z. Therefore, we have instead (-1+d)↑⍤0 1⊢⌽1+z) which is in our example:

2 1
2 0

And we have the expected result:

>> P2D 1 1

1 0     1 0

Notes:

  • There are no issue when the first node is a root node.
  • There is no issue when ⎕IO is equal to 1. Actually, the value we need to add to z is 1 - ⎕IO, if we wanted a solution that works for any value of ⎕IO.

Edit: Cosmetic

The previous implementation could give an incorrect result when the
first node was not a root node.

Example:

P2D 0 2 2

correctly returns:

0 1 0    0 2 1

However

P2D 1 1

returns

1 0    0 1

Therefore, it says that no permutation is necessary to have the
depth-first traversal.

The reason is that, in the matrix `(-1+d)↑⍤0 1⊢⌽z`, a zero can either
mean the index of a node or an element used to fill the empty positions.

In the last example, `(-1+d)↑⍤0 1⊢⌽z` is:

1 0  <- path of the node is 1 0
1 0  <- path of the node is 1

Grade Up says that rows of this matrix are already sorted.

A quick fix is just to add one to the matrix z. Therefore,
we have instead `(-1+d)↑⍤0 1⊢⌽1+z)` which is in our example:

2 1
2 0

And we have the expected result:

>> P2D 1 1

1 0     1 0

Notes:
- There are no issue when the first node is a root node.
- There is no issue when `⎕IO` is equal to 1. Actually, the value we
  need to add to z is `1 - ⎕IO`, if we wanted a solution that works
  for any value of `⎕IO`.
@arcfide
Copy link
Collaborator

arcfide commented May 3, 2024

Thanks for this! I'll have to think about whether I like this fix or would like to keep it the way it is or even try a different approach. At the very least, it's very good to have a note about this limitation in the current code. I'm keeping this open for a bit while I get some other stuff done, but I plan to come back to this and make sure it gets a proper seeing to.

@axiles
Copy link
Author

axiles commented May 7, 2024

Another possibility (even though probably less efficient since it involves nested arrays) is to split to matrix into lines:

P2D{z  d,z  _{pd+p[z,]}  d((-1+d)¨z)}

If we go that route, we can have something even shorter (but less efficient) using instead of using d:

P2D{z  d,z  _{pd+p[z,]}  d(¨z)}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
2 participants