fortran-lang / stdlib

Fortran Standard Library
https://stdlib.fortran-lang.org
MIT License
1.06k stars 164 forks source link

Pretty printing of matrices (and multidimensional arrays) #40

Open certik opened 4 years ago

certik commented 4 years ago

Currently the standard Fortran's print *, A prints a 2D array A as a 1D list of numbers. Rather, I would like stdlib to have a function print_array (we can discuss a better name) that would print the array as NumPy:

>>> numpy.arange(10000).reshape(250,40)
array([[   0,    1,    2, ...,   37,   38,   39],
       [  40,   41,   42, ...,   77,   78,   79],
       [  80,   81,   82, ...,  117,  118,  119],
       ..., 
       [9880, 9881, 9882, ..., 9917, 9918, 9919],
       [9920, 9921, 9922, ..., 9957, 9958, 9959],
       [9960, 9961, 9962, ..., 9997, 9998, 9999]])

or Julia:

julia> B = [1 2; 3 4; 5 6; 7 8; 9 10]
5×2 Array{Int64,2}:
 1   2
 3   4
 5   6
 7   8
 9  10

Julia can also use nice unicode characters for ... and vertical ... if the array is too large.

Then we should use this function at https://github.com/fortran-lang/stdlib/blob/ae5591f5b6d9f1df644c6246faf099056276bf0a/src/tests/loadtxt/test_loadtxt.f90#L21 and other places.

Then compilers can perhaps optionally use such print_array as default in the Fortran's language print statement.

jvdp1 commented 4 years ago

My preference is for a format like Julia 's one. It would be also a similar format as savetxt.

ivan-pi commented 4 years ago

One prior art - Algorithm 892: DISPMODULE, a Fortran 95 module for pretty-printing matrices https://dl.acm.org/citation.cfm?id=1486531

The code can be downloaded from netlib: http://netlib.org/toms/892.zip

jvdp1 commented 4 years ago

One prior art - Algorithm 892: DISPMODULE, a Fortran 95 module for pretty-printing matrices https://dl.acm.org/citation.cfm?id=1486531

The code can be downloaded from netlib: http://netlib.org/toms/892.zip

Thank you for mentioning this librabry. It seems to be quite complete and flexible. Could we use it (with some modernisations) in stdlib (license?)?

ivan-pi commented 4 years ago

Code published in TOMS is under the ACM Software License Agreement which allows usage for non-commercial purposes. I think that it is not compatible with what we want to achieve here.

I know Scipy contains the TOMS 748 algorithm. I checked and it looks like they wrote their own implementation.

certik commented 4 years ago

Yes, unfortunately we can't use their code. But we can at least learn from their thought process when designing their API.

On Wed, Dec 25, 2019, at 4:18 AM, Ivan wrote:

Code published in TOMS is under the ACM Software License Agreement https://www.acm.org/publications/policies/software-copyright-notice which allows usage for non-commercial purposes. I think that it is not compatible with what we want to achieve here.

I know Scipy contains the TOMS 748 https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.toms748.html algorithm. I checked and it looks like they wrote their own implementation.

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/fortran-lang/stdlib/issues/40?email_source=notifications&email_token=AAAFAWHHON7IYCGO345O3XTQ2M6RLA5CNFSM4J6NHD4KYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEHUIVQQ#issuecomment-568888002, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAAFAWDSHGHXBI7DIL2DO4TQ2M6RLANCNFSM4J6NHD4A.

ivan-pi commented 4 years ago

I had a look at the DISPMODULE API and it is indeed very nice and flexible supporting different formats (e.g. with a title, numbered rows and columns, precision, separators) and even printing several matrices adjacent to one another.

Taking a peak inside I can say that it would be beneficial to first start work on our own string module to handle conversion of reals/integers/logicals to character strings and some tools to parse format strings.

jvdp1 commented 4 years ago

Taking a peak inside I can say that it would be beneficial to first start work on our own string module to handle conversion of reals/integers/logicals to character strings and some tools to parse format strings.

I agree with that. I would also add that I think it would be goood to first take a discussion on the issue #35 , because it will be the same problem for this issue #40 (i.e., printing matrices of different kinds). Also, since we not use DISPMODULE, we could base this API on those of savetxt. Afterall, savetxt write a matrix to a file instead to the standard output.