stdlib icon indicating copy to clipboard operation
stdlib copied to clipboard

Pretty printing of matrices (and multidimensional arrays)

Open certik opened this issue 5 years ago • 7 comments

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.

certik avatar Dec 22 '19 19:12 certik

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

jvdp1 avatar Dec 22 '19 21:12 jvdp1

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

ivan-pi avatar Dec 24 '19 19:12 ivan-pi

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?)?

jvdp1 avatar Dec 24 '19 22:12 jvdp1

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.

ivan-pi avatar Dec 25 '19 11:12 ivan-pi

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.

certik avatar Dec 25 '19 14:12 certik

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.

ivan-pi avatar Dec 25 '19 15:12 ivan-pi

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.

jvdp1 avatar Dec 25 '19 19:12 jvdp1