From: Ethan A M. <me...@uw...> - 2025-07-10 20:53:08
|
I have just pushed changes to the configure script and to amos_airy,c so that ZEXINT is used if found during configuration in preference to CEXINT. I tested configure+build against libraries with or without ZEXINT. commit dda9e5051d Since both routines were available for testing, I also sampled the real/imaginary plane for the difference in output between parallel calls to CEXINT and ZEXINT for orders 2,3,4, and 5. The maximum difference found was on the order of 3 x 10^{-15} Pure noise level for double precision would be about 2 x 10^{-16} Pure noise level for single precision would be about 1 x 10^{-7}. cheers, Ethan On Wednesday, 9 July 2025 23:55:03 PDT Ethan A Merritt wrote: > On Wednesday, 9 July 2025 22:12:34 PDT Erik Luijten wrote: > > I think we are mostly in agreement; I would be happy with "configure" being > > able to detect ZEXINT and then use the call that I implemented in > > amos_airy.c (as attached to my earlier email). > > Right. I'll work on a modification to the configure script. > > > Just for completeness: My concerns with the current situation are that (1) > > it is not documented (unless I overlooked it) that CEXINT must be compiled > > in a way that upgrades all floats to double (plus accompanying changes to > > i1mach/d1mach); > > [shrug] I think it's outside the scope of gnuplot documentation to instruct > people on how to build a math library. I do bundle build instructions and a > Makefile together with the libamos source files if anyone asks me for a copy. > I put this all together quite a while ago, but at the time I found I needed to > tell the compiler to make REAL*8 and DOUBLE*8 the default for all the > Amos routines, not just CEXINT. Makefile attached. > > > (2) *generally* there is no guarantee that such an > > "upgrade" would yield the desired precision. I acknowledge that for CEXINT > > it may work fine, so this is primarily an aesthetic objection. > > I have just done a line-by-line comparison of the ZEXINT and CEXINT code. > Except for the D vs E declaration of Fortran constant values which I noted > before, the only differences are the packing/unpacking of real and imaginary > components into a single COMPLEX variable vs two parallel DOUBLE variables. > So yes, they two versions of the algorithm have the same precision when > compiled with the same compiler flags. > > Note: The 1990 Amos paper documents the accuracy of the algorithm as > "18 digits" but notes that this may not be achieved on the hardware of > "some machines". And indeed this is higher precision than guaranteed > by IEEE 754 and 64-bits. I suspect anyone who cares about the difference > between 16-bit and 18-bit accuracy for expint() is not relying on gnuplot > to provide it :-) > > Digression: When I modified gnuplot to use 64-bit integers I also looked > into using gcc extensions so that the floating point calculations could use > 80-bits rather than 64-bits on architectures that support it. That turned > out to be a morass; I dropped the idea pretty fast. > > > Please let me know once you are ready to let me test the new version of > > configure. > > Sure. I'll probably break out and add ZEXINT itself to my library collection > first so I will be able to make sure the whole thing works here. > > cheers > Ethan > > > Best, > > > > Erik > > > > > > On Wed, Jul 9, 2025 at 9:30 PM Ethan A Merritt <me...@uw...> wrote: > > > > > On Wednesday, 9 July 2025 06:25:07 PDT Erik Luijten wrote: > > > > > > > > - That being said, I think it is not ideal that this configuration option > > > > then uses a version of cexint that must be modified by the user. Instead, > > > > the version of amos_airy.c that I sent yesterday uses an unmodified > > > ZEXINT > > > > as distributed in Netlib, minimizing confusion (and effort) for anyone > > > who > > > > wishes to incorporate it when they compile gnuplot. You clearly > > > understand > > > > the potential issues of upgrading a single-precision function to double > > > > precision, but not everyone does and it also would require the user to > > > > address a matter that was resolved by the original author from the > > > outset. > > > > > > I am not following your thought there. What matter is that? > > > > > > The biggest change/cleanup/upgrade/whatever is that the original code > > > was written in an era when hardware floating support varied widely. > > > The r1mach/d1mach per-installation customization had to deal with > > > all sorts of setups, whereas now hardware support for IEEE 754 floating > > > point is nearly universal. > > > > > > As described in the 1990 paper, the separate double-precision routine was > > > needed because at that time Fortran did not support double precision > > > complex > > > as an intrinsic type. Since then (Fortran90? Fortran95?μ) this limitation > > > went away, and so long as the algorithm itself provides sufficient > > > precision > > > the use of single vs double precision can be made a compile-time option. > > > > > > I do not recall having to change anything in the code to CEXINT itself. > > > I only replaced the separate machine-dependent routines in favor of > > > letting the compiler pick up the relevant constants from the system > > > environment it was compiled on, and the compiler flags used to build it. > > > > > > > - By the way, you mention that you found an older version of CEXINT, but > > > > the text you quote ("REVISION DATE 870515", etc.) is identical in the > > > ACM > > > > version https://urldefense.com/v3/__https://www.netlib.org/toms-2014-06-10/683__;!!K-Hz7m0Vt54!iwiffB-qjYH_1hni74sIr0ktLbCn0P2jQlKbCMP8UgcD3GZ7yPj0ouUn2UsTg7d08Hwtnmzu50gBQtiWqElv$ ; there are just > > > other > > > > subroutines preceding it in the same file. In fact, I do not think that > > > the > > > > copyright situation favors CEXINT; the two functions were created at the > > > > same time under the same circumstances (ZEXINT also carries the 1987 > > > date). > > > > > > Sure. Both routines were written at the same time. When the source code > > > was placed in the TOMS archive someone added the comment lines at the top > > > citing the 1990 paper. My only point was that copies of the source code > > > existed > > > that predated the TOMS publication thus avoided any implied claim of > > > license > > > requirements imposed by the journal. > > > > > > > - Regarding concrete compilation: I compile ZEXINT and the other > > > functions > > > > it uses into a separate library (unlike you, I use i1mach and d1mach, but > > > > rely on those being provided in libopenspecfun). I found that if I > > > specify > > > > this library in LIBAMOS_LDFLAGS, configure will detect it. Practically > > > > speaking, I make this a static library so that users of the macOS binary > > > do > > > > not need to worry about it (I distribute gnuplot as a single static > > > > executable). > > > > > > > > Depending on your view, the only question is then whether we switch from > > > > CEXINT to ZEXINT (which would also require a small change in > > > "configure"). > > > > > > I wouldn't "switch". I would have configure search for both and use > > > whichever > > > it found first. I don't care much which one it finds first, unless as you > > > say there > > > is the possibility of conflicting symbols in another library. If I > > > understand your > > > plan correctly, that would not be a problem for either of us. > > > > > > The autoconf scripts are not my strong point (to say the least), but I'll > > > see > > > what I can come up with. > > > > > > > Apologies for reviving this old topic! > > > > > > No problem - a trip down memory lane. > > > > > > By the way, the Julia language project uses a reimplemention in c99 for > > > the Amos library functions including expint(). I did not pursue using it > > > because unlike openspecfun it would not be available to users as a standard > > > linux distribution package. > > > But if you're already building static libraries yourself, and not under > > > linux, > > > that might be of interest to you as an alternative. > > > > > > cheers, > > > Ethan > > > > > > > > > > > Erik > > > > > > > > On Tue, Jul 8, 2025 at 11:52 PM Ethan A Merritt <me...@uw...> wrote: > > > > > > > > > On Tuesday, 8 July 2025 18:55:03 PDT Erik Luijten wrote: > > > > > > Hi, > > > > > > > > > > > > I found the code on > > > https://urldefense.com/v3/__https://dl.acm.org/doi/abs/10.1145/78928.78934__;!!K-Hz7m0Vt54!jVJeG1oeF8DBF4-meLyPbDTC2nBP2lu0ChoIkfgKeOZGsqFA4LqPWSqtJ5ZK0ZYv1jwibOIAGDbUEM2Nmkq6$ > > > ; the > > > > > > supplementary material contains all the subroutines concatenated > > > into one > > > > > > file. > > > > > > It is also available on > > > https://urldefense.com/v3/__https://www.netlib.org/toms-2014-06-10/__;!!K-Hz7m0Vt54!jVJeG1oeF8DBF4-meLyPbDTC2nBP2lu0ChoIkfgKeOZGsqFA4LqPWSqtJ5ZK0ZYv1jwibOIAGDbUENvigquW$ > > > > > (scroll to > > > > > > algorithm 683). > > > > > > The fact that it is on netlib tells me it is likely free to use. > > > > > > > > > > At the top of that page is a notice: > > > > > > > > > > Use of ACM Algorithms is subject to the ACM Software Copyright and > > > > > License Agreement > > > > > > > > > > > However, the ACM TOMS license agreement is here: > > > > > > > > > https://urldefense.com/v3/__https://www.acm.org/publications/policies/software-copyright-notice__;!!K-Hz7m0Vt54!jVJeG1oeF8DBF4-meLyPbDTC2nBP2lu0ChoIkfgKeOZGsqFA4LqPWSqtJ5ZK0ZYv1jwibOIAGDbUEHrkADU9$ > > > . > > > > > > I am not sure if this conflicts with Gnuplot's license? > > > > > > > > > > The issue is not that it conflicts with gnuplot's license. > > > > > The issue is that Debian, for example, was concerned that inclusion > > > > > with gnuplot would make the whole package non-free. > > > > > > > > > > Thanks for the link to the ACM site. They have very much changed > > > > > their policy since I first looked into this. And it seems that for > > > > > software > > > > > published since 2013 the ACM does not claim any rights. That's good. > > > > > Unfortunately it doesn't help. For older software (the Amos routines > > > > > are from the 1980s) they state that the terms of the > > > > > earlier ACM license still apply, which restricts commercial use. > > > > > If that were true it would make the whole set of Amos routines > > > > > [as obtained from them] non-free, but see below. > > > > > > > > > > > Whether a more permissive license applies to cexint_.f than to > > > > > > zexint_.f is also unclear to me. > > > > > > > > > > It is my belief that ACM was simplly wrong in ever claiming the right > > > > > to license or restrict any of these routines. The were produced at > > > > > Sandia National Laboratories under US government contract, and as > > > > > I understand it (I am not a lawyer and all that) that makes them > > > > > "Works Created by the United States Government" and as such not > > > > > subject to copyright. > > > > > > > > > > But that's only me. I don't have any sway over what Debian or anyone > > > > > else considers to be "non-free". Based on past conversations my > > > > > understanding is that Debian considers the TOMS license to poison > > > > > any project that includes it as non-free. Those conversations were > > > > > many years ago, so I suppose the issue could be revisited. > > > > > > > > > > > An awkward point, to the best of my understanding, is that an > > > unmodified > > > > > > version of cexint will not work with the Gnuplot source code, as it > > > > > expects > > > > > > single-precision arguments. Yet, changing cexint is not > > > > > > completely straightforward: Comparing cexint and zexint (and the > > > > > > accompanying routines cexent and zexent), I noticed the more subtle > > > point > > > > > > that cexint uses r1mach.f and zexint uses d1mach.f; moreover, they > > > use > > > > > > different constants from i1mach to establish precision (elements > > > 12,13 > > > > > vs. > > > > > > 15,16). Also, in zexint all constants are replaced by their > > > > > > double-precision counterparts. > > > > > > > > > > This gets complicated. > > > > > > > > > > I have downloaded and had a quick look at the code available through > > > the > > > > > netlib site. It is apparently newer than the code I have here. It > > > cites > > > > > the 1990 > > > > > TOMS paper at the top and as you say it concatenates many smaller > > > routines, > > > > > whereas the code I have claims to be from 1987 and starts > > > > > C***BEGIN PROLOGUE CEXINT > > > > > C***DATE WRITTEN 870515 (YYMMDD) > > > > > C***REVISION DATE 870515 (YYMMDD) > > > > > C***CATEGORY NO. B5E > > > > > C***KEYWORDS EXPONENTIAL INTEGRALS, SINE INTEGRAL, COSINE INTEGRAL > > > > > C***AUTHOR AMOS, DONALD E., SANDIA NATIONAL LABORATORIES > > > > > C***PURPOSE TO COMPUTE EXPONENTIAL INTEGRALS OF A COMPLEX ARGUMENT > > > > > > > > > > There are some code differences elsewhere, but I did not look in detail > > > > > and don't have anything useful to say about them right now. > > > > > > > > > > Beyond that, to the extent that there are precision-sensitive > > > constants in > > > > > the > > > > > code the numerical values seem identical, but they are declared, for > > > > > example > > > > > -5.77215664901532861E-01 vs -5.77215664901532861D-01 > > > > > As I recall in 1987 that difference was necessary to distinguish > > > single- > > > > > and > > > > > double- precision constants, but I don't think current Fortran pays any > > > > > attention to it when using the constant in a double-precision context. > > > > > I compile with > > > > > gfortran -fdefault-real-8 -fdefault-double-8 > > > > > I.e. everything should be double precision by default. > > > > > So although you describe cexint() as a single-precision routine, > > > > > that isn't true when I build it here. Of course it's always possible > > > > > I missed something in the code that loses precision, but given that > > > > > it iterates until convergence I think that would not even matter. > > > > > > > > > > > For all these reasons, I would argue that if copyright restrictions > > > are > > > > > the > > > > > > same for cexint and zexint, it would be better to use the latter - a > > > user > > > > > > could then directly download this subroutine and use it without > > > > > > modifications. > > > > > > > > > > You may have a point about an end-user who builds from source. > > > > > But you've been building and making available binaries for MacOS, > > > right? > > > > > I think that moves any legal question to "distribution" rather than > > > "use". > > > > > You may well agree with me that the code you want to include is not > > > subject > > > > > to the TOMS license even though TOMS seems to say it is. But you > > > should > > > > > at least be aware that the question has been raised in the past. > > > > > > > > > > > Lastly, a tricky point that is easily overlooked is that i1mach, > > > r1mach, > > > > > > d1mach need to be configured for x86. Moreover, since openspecfun is > > > > > built > > > > > > as a library, it already contains i1mach and d1mach, opening the > > > door for > > > > > > conflicting functions if one gathers cexint/zexint into a separate > > > > > > library... > > > > > > > > > > As to r1mach.f and d1mach.f, I am not using either of them here. > > > > > I replaced these with a C-language data block (attached) that I use > > > > > to build libamos from the Sandia sources for all the Amos routines. > > > > > I link against that rather than against libopenspecfun. > > > > > > > > > > I sent my collection of libamos source to Tatsuro Matsuoka in case > > > > > he wanted to use them for building Windows packages. > > > > > I even considered adding source for all the libamos routines as a > > > > > separate subdirectory in the gnuplot distribution package. > > > > > But then I found that many/most linux distros already provide > > > > > libopenspecfun so I decided against complicating the gnuplot packaging > > > > > by having it supply a whole separate library for the sake of a single > > > > > routine. > > > > > > > > > > > I am attaching my modified version of amos_airy.c, in case you are > > > swayed > > > > > > by my argument... > > > > > > > > > > Are you thinking that the user would build zexint.o as a separate > > > object > > > > > module and then add it to the Makefile somehow? > > > > > > > > > > I would prefer to make it a configuration option. Not sure how best > > > > > to capture a single extra source file whose provenance and dependencies > > > > > we don't control. I think it would be easier to require that it has > > > > > already > > > > > been wrapped into a shared library. > > > > > Or hey, another alternative is to provide a template for making it > > > > > a plugin. The distribution package currently has a demo plugin for > > > > > uigamma. Providing a plugin for a Fortran routine might be of > > > > > interest even apart from filling a gap in special function coverage. > > > > > > > > > > Ethan > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > On Tue, Jul 8, 2025 at 7:26 PM Ethan A Merritt <me...@uw...> > > > wrote: > > > > > > > > > > > > > On Tuesday, 8 July 2025 14:21:01 PDT Erik Luijten wrote: > > > > > > > > Hi Ethan, > > > > > > > > > > > > > > > > In amos_airy.c, you write: > > > > > > > > > > > > > > > > * The cexint_() routine is also from the AMOS collection, but > > > is not > > > > > > > part > > > > > > > > * of the Bessel function subset and not included in > > > libopenspecfun. > > > > > > > > * I could not find source for a version of the source that > > > splits > > > > > the > > > > > > > > * real and imaginary parts of the arguments as with the zxxxx.f > > > > > Bessel > > > > > > > > * routines; this one accepts and returns a CMPLX argument rather > > > > > than > > > > > > > > separate > > > > > > > > * real and imaginary parts. > > > > > > > > * D. E. Amos, ALGORITHM 683 A Portable FORTRAN > > > > > Subroutine > > > > > > > > * for Exponential Integrals of a Complex Argument > > > > > > > > * ACM Trans. Math. Software 16:178-182 (1990) > > > > > > > > > > > > > > > > This confuses me for two reasons: > > > > > > > > - You invoke CEXINT as a double precision function, even though > > > this > > > > > > > > Fortran function is single precision. > > > > > > > > > > > > > > > - The algorithm 683 you quote DOES provide a separate double > > > > > precision > > > > > > > > function, ZEXINT. Moreover, that function does exactly what you > > > were > > > > > > > > looking for, namely taking and returning separate real and > > > imaginary > > > > > > > parts. > > > > > > > > > > > > > > There is some history behind this due to IMHO over-zealous, or at > > > least > > > > > > > overly pessimistic, concern about license contamination with > > > non-free > > > > > code. > > > > > > > I cited a publication in ACM/TMS that describes the implementation. > > > > > > > However, people have assserted that code obtained through the ACM > > > > > > > journal is non-free because the journal claims copyright. > > > > > > > I believe this to be factually incorrect; the published article > > > may be > > > > > > > subject > > > > > > > to copyright but not the code it describes. In any case, rather > > > than > > > > > pursue > > > > > > > the argument I instead used copies of the code obtained from US > > > > > national > > > > > > > lab repositories. I found source there for cexint.f but not for > > > > > zexint.f, > > > > > > > so that is what I use myself to build libamos and what I invoked > > > from > > > > > the > > > > > > > gnuplot code. > > > > > > > > > > > > > > Even so that was apparently not sufficient by itself to convince > > > > > hard-core > > > > > > > "free licenses only" gatekeepers. > > > > > > > There is an explicit statement of the [non]copyright status of the > > > code > > > > > > > in the cited 1985 Sandia National Laboratory report, but that > > > report > > > > > > > predated development of the expint routines (1990?) and I did not > > > find > > > > > a > > > > > > > separate Sandia report that mentions them specifically. > > > > > > > That is probably why neither routine is included in libopenspec, > > > > > > > and why inclusion in gnuplot is a configuration option. > > > > > > > > > > > > > > > I changed f_amos_cexint to use ZEXINT (just for my own > > > edification) > > > > > and > > > > > > > it > > > > > > > > works properly. However, before submitting it, I wonder what am I > > > > > > > missing? > > > > > > > > > > > > > > Where did you obtain a copy of the source? > > > > > > > Can you document the relevant claim or non-claim of copyright or > > > > > > > licensing? > > > > > > > > > > > > > > And, out of curiosity, is there anything in the zexint.f code that > > > > > would > > > > > > > differentiate it from a single-precision version other than > > > declaration > > > > > > > of the variables as Fortran DOUBLE PRECISION? > > > > > > > > > > > > > > Ethan > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Thank you, > > > > > > > > > > > > > > > > Erik > > > > > > > > > > > > > > > > > |