Hi.

2020-01-24 1:42 UTC+01:00, Alex Herbert <alex.d.herb...@gmail.com>:
>
>
>> On 24 Jan 2020, at 00:07, Gilles Sadowski <gillese...@gmail.com> wrote:
>>
>> Hello.
>>
>> 2020-01-24 0:30 UTC+01:00, Alex Herbert <alex.d.herb...@gmail.com
>> <mailto:alex.d.herb...@gmail.com>>:
>>> In short:
>>>
>>> - Math.hypot is required in Complex to compute sqrt(x^2 + y^2) without
>>> over/underflow to 1 ULP precision.
>>> - Complex also requires the same computation without the sqrt or
>>> over/underflow protection
>>> - I found the reference for Math.hypot and reimplemented the function
>>> - My port is 4x faster than Math.hypot and the same accuracy (or better)
>>> - I will add this as a private internal method in Complex
>>> - The source for the port requires the original licence is maintained
>>>
>>> The question is where to put the notice of the original license? Copying
>>> from commons RNG it would be in the source method javadoc and also in
>>> all
>>> LICENSE.txt files through the multi-module project. This seems excessive.
>>> I
>>> thought perhaps to include it only in numbers parent and then the
>>> complex
>>> module where it applies.
>>
>> IIUC, this would agree with the recommendations here:
>>    http://www.apache.org/dev/licensing-howto.html
>> <http://www.apache.org/dev/licensing-howto.html>
>>
>
> That talks about LICENCE in the entire product distribution. So that would
> be the archive available from the downloads page. Then it states the LICENSE
> should be at the top level of the source tree. So parent has a LICENSE that
> covers all the additions for each sub-module.

That is how I understand it too.

>
> It is not clear to me about whether all modules require the same licence. It
> states
>
> "LICENSE and NOTICE must exactly represent the contents of the distribution
> they reside in.”
>
> So I would assume each module should have a LICENSE and NOTICE that reflects
> its distribution which is the module jar distributed to maven.

I'd think so.

>
> So my interpretation is to have a LICENSE and NOTICE in each module where
> LICENSE can reflect the specific additions for that module. The parent root
> directory would combine all the additions from each LICENSE in all the
> sub-modules.

There is this note:
    http://www.apache.org/legal/src-headers.html#header-existingcopyright

I'd assume that using a file from that code repository is something
that already occurred within Apache...

>
> This would mean the LICENSE addition for MersenneTwister can be dropped from
> all the commons modules except the commons-rng-core module.

What about module "core" being a required dependency for
module "simple"?

> Likewise I would
> add the short license for fdlibm to numbers in the parent dir and only in
> the complex module.

Sure (since no other module depends on module "complex").

>
> Please let me know if you interpret this differently.

Hopefully, someone reading here can provide some argument.
If not, better to post to the "legal" ML:
   http://www.apache.org/foundation/mailinglists.html#foundation-legal

>
>> [By the way, we should perhaps remove the ".txt" suffix.]
>
> Although the guidelines talk about LICENSE and NOTICE all the commons
> projects I checked have a .txt suffix. The commons-build plugin that
> generates the README.md file even adds links to LICENSE.txt.

If it's automated, it's just a matter of updating to the *preferred*
policy.

>
> Looking at other apache projects they show both forms, e.g.
>
> LICENSE
> beam, spark, tomcat
>
> LICENSE.txt
> cassandra, arrow, jackrabbit-oak
>
> So I don’t think changing the .txt suffix is required.

Not required, merely suggested (based on the reading mentioned
above).

> We are in the same
> boat as a lot of other projects and at least this is consistent across all
> of commons.

Those files are mandated by the ASF, not "Commons".

Best,
Gilles

>>
>> Regards,
>> Gilles
>>
>>>
>>>
>>> Background
>>>
>>> The complex class uses the Math.hypot(double, double) function to
>>> determine
>>> the absolute value of a complex number x + iy as sqrt(x^2 + y^2) without
>>> over/underflow to 1 ULP precision. This is used directly (in sqrt() and
>>> abs()) but also without the square root to compute x^2 + y^2 in the
>>> log()
>>> function. These functions also perform over/underflow protection and so
>>> ideally just require access to the same formula for high precision x^2 +
>>> y^2. This would enable consistency across the different methods that use
>>> the
>>> absolute of the complex number. Currently the hypot function is very slow
>>> in
>>> the Complex JMH benchmark so I looked into hypot.
>>>
>>> This function is known to be slow [1] pre-Java 9 which I was using for
>>> benchmarking. I found that in Java 9 the code was changed from calling a
>>> native function to an implementation in Java of the "Freely
>>> Distributable
>>> Maths Library" [2]. The JMH benchmark for complex shows an improvement
>>> between Java 8 and 9 of about 7-fold speed increase. However this does
>>> not
>>> allow access to the same computation without the square root. The source
>>> code for fdlibm has a permission license [3] so I have implemented a
>>> port
>>> that allows separation of the x^2 + y^2 computation from the sqrt and
>>> the
>>> overflow protection.
>>>
>>> In testing my ported version I found cases where it was more accurate
>>> than
>>> the Java reference, but none where it was less accurate. I attribute this
>>> to
>>> the different implementation of splitting a number into parts for high
>>> precision that is different in my port from the original. I used the
>>> split
>>> that is already present in Complex. I tested side-by-side an alternative
>>> that was closer to the method from fdlibm and it was a bit slower (in
>>> Java)
>>> and the same accuracy as the JDK reference. So I assume that the JDK
>>> reference has stuck exactly to the fdlibm code. I also found my port to
>>> be
>>> 4x faster than the Java reference. This may require more investigation
>>> but
>>> for now I would like to put my port into Complex as an internal method.
>>> Note
>>> the method is different from the commons FastMath.hypot implementation
>>> which
>>> does not compute the result to 1 ULP. I will add this to the JMH
>>> benchmark
>>> for reference so we have Math.hypot, FastMath.hypot and the hypot method
>>> within Complex.
>>>
>>> The licence for fdlibm is shown in [3]. This states that code can be
>>> copied/modified as long as the original notice is maintained. In commons
>>> RNG
>>> the licence for the port of the MersenneTwister is placed in the Java
>>> source
>>> file and in all LICENSE.txt files through the multi-module project. So
>>> should I do the same for numbers or just put the license into the
>>> complex
>>> module?
>>>
>>>
>>> [1]
>>> https://stackoverflow.com/questions/3764978/why-hypot-function-is-so-slow
>>> <https://stackoverflow.com/questions/3764978/why-hypot-function-is-so-slow
>>> <https://stackoverflow.com/questions/3764978/why-hypot-function-is-so-slow>>
>>>
>>> [2] https://bugs.java.com/bugdatabase/view_bug.do?bug_id=7130085
>>> <https://bugs.java.com/bugdatabase/view_bug.do?bug_id=7130085>
>>> <https://bugs.java.com/bugdatabase/view_bug.do?bug_id=7130085
>>> <https://bugs.java.com/bugdatabase/view_bug.do?bug_id=7130085>>
>>>
>>> [3] https://www.netlib.org/fdlibm/e_hypot.c
>>> <https://www.netlib.org/fdlibm/e_hypot.c>
>>> <https://www.netlib.org/fdlibm/e_hypot.c
>>> <https://www.netlib.org/fdlibm/e_hypot.c>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
>> <mailto:dev-unsubscr...@commons.apache.org>
>> For additional commands, e-mail: dev-h...@commons.apache.org
>> <mailto:dev-h...@commons.apache.org>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org

Reply via email to