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

Consider redacting printing of Axis types #172

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

Conversation

nrontsis
Copy link
Contributor

@nrontsis nrontsis commented Oct 24, 2022

This PR reduces the very long stacktraces that can sometimes occur with ComponentArrays, by having by introducing a redacted form of Base.show for Axis types.

Example:

using ComponentArrays
h() = nothing
h(ComponentArray(zeros(3, 2), Axis((:first, :second, :third, :fourth)), FlatAxis()))

now gives

ERROR: MethodError: no method matching h(::ComponentMatrix{Float64, Matrix{Float64}, Tuple{Axis{...}, FlatAxis}})
Closest candidates are:
  h() at REPL[2]:1
Stacktrace:
 [1] top-level scope
   @ REPL[3]:1

instead of

ERROR: MethodError: no method matching h(::ComponentMatrix{Float64, Matrix{Float64}, Tuple{Axis{(first = 1, second = 2, third = 3, fourth = 4)}, FlatAxis}})
Closest candidates are:
  h() at REPL[2]:1
Stacktrace:
 [1] top-level scope
   @ REPL[3]:1

Relevant discourse threads: [1], [2]

This PR reduces the very long stacktraces that can sometimes occur with ComponentArrays, by having by default a reducted form of `Base.show` for Axis types.

Example:
```
ERROR: MethodError: no method matching h(::ComponentMatrix{Float64, Matrix{Float64}, Tuple{Axis{...}, FlatAxis}})
Closest candidates are:
  h() at REPL[14]:1
Stacktrace:
 [1] top-level scope
   @ REPL[15]:1
```
now gives
```
ERROR: MethodError: no method matching h(::ComponentMatrix{Float64, Matrix{Float64}, Tuple{Axis{...}, FlatAxis}})
Closest candidates are:
  h() at REPL[2]:1
Stacktrace:
 [1] top-level scope
   @ REPL[3]:1
```
instead of
```
ERROR: MethodError: no method matching h(::ComponentMatrix{Float64, Matrix{Float64}, Tuple{Axis{(first = 1, second = 2, third = 3, fourth = 4)}, FlatAxis}})
Closest candidates are:
  h() at REPL[2]:1
Stacktrace:
 [1] top-level scope
   @ REPL[3]:1
```
Base.show(io::IO, ci::ComponentIndex) = print(io, "ComponentIndex($(ci.idx), $(ci.ax))")




# Show ComponentArrays
_print_type_short(io, ca; color=:normal) = _print_type_short(io, typeof(ca); color=color)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Assuming that the approach of this PR looks good, I guess we can remove all _print_type_shorts and the Base.print_type_stacktrace that I understand is not working on recent version of julia?

@codecov-commenter
Copy link

codecov-commenter commented Oct 27, 2022

Codecov Report

Merging #172 (a94945b) into master (cbb24ef) will decrease coverage by 0.89%.
The diff coverage is 14.28%.

@@            Coverage Diff             @@
##           master     #172      +/-   ##
==========================================
- Coverage   73.49%   72.59%   -0.90%     
==========================================
  Files          20       20              
  Lines         679      686       +7     
==========================================
- Hits          499      498       -1     
- Misses        180      188       +8     
Impacted Files Coverage Δ
src/show.jl 1.69% <14.28%> (-2.16%) ⬇️

📣 We’re building smart automated test selection to slash your CI/CD build times. Learn more

return print(io, "PartitionedAxis{$PartSz, {...}, $Ax}")
end
Base.show(io::IO, ::Type{ShapedAxis{Shape,IdxMap}}) where {Shape,IdxMap} = print(io, "ShapedAxis($Shape, {...})")
Base.show(io::IO, ::Type{ViewAxis{Inds,IdxMap,Ax}}) where {Inds,IdxMap,Ax} = print(io, "ViewAxis{$Inds, {...}, $Ax)")
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is how ComponentArrays used to do type printing, but we had to get rid of it because it tends to break a lot of things

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Base.print_type_stacktrace was supposed to be the solution to this, but if it’s not working anymore, I’m not sure what to do. We don’t want to potentially cause a segfault for someone.

Copy link
Contributor Author

@nrontsis nrontsis Oct 27, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, I should have thought that I am reinventing the wheel here 😄

I took a look at the current Julia's show code that is used for stacktraces but I found it too complicated, and it made me think that overriding something "private" there might be dangerous (for example, I generated too many StackOverflows while playing around with overriding things there 😵‍💫)

How about:

  • We open a new discourse thread to discuss this again with the community, since no good solution seems to exist as of now
  • Keep overriding the show as per this PR, but only when a preference is set. Update the Readme accordingly.

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

Successfully merging this pull request may close these issues.

3 participants