numpysane (0.41)

  * Updated build to mrbuild 1.10

 -- Dima Kogan <dkogan@debian.org>  Sun, 26 May 2024 17:04:32 -0700

numpysane (0.40)

  * numpysane_pywrap: no more nested functions. So the generated code
    builds with clang

 -- Dima Kogan <dkogan@debian.org>  Sat, 23 Dec 2023 15:49:25 -0800

numpysane (0.39)

  * numpysane_pywrap: extra broadcasted slices in the output are allowed

 -- Dima Kogan <dkogan@debian.org>  Wed, 28 Jun 2023 00:03:56 -0700

numpysane (0.38)

  * Reworked the python install (pip stuff only)

 -- Dima Kogan <dkogan@debian.org>  Tue, 20 Jun 2023 12:40:49 -0700

numpysane (0.37)

  * C broadcasting logic fix: implicit dimensions of length-1 are added
    properly. Prior to this patch the dimension deficient arrays fail
    CHECK_CONTIGUOUS()

 -- Dima Kogan <dkogan@debian.org>  Tue, 25 Apr 2023 00:52:31 -0700

numpysane (0.36)

  * Uninteresting housekeeping

 -- Dima Kogan <dkogan@debian.org>  Sat, 14 Jan 2023 17:52:28 -0800

numpysane (0.35)

  * added broadcast_extra_dims()

 -- Dima Kogan <dkogan@debian.org>  Wed, 14 Jul 2021 02:41:25 -0700

numpysane (0.34)

  *   glue(np.array(()), x) and glue(x, np.array(())) both work

 -- Dima Kogan <dkogan@debian.org>  Thu, 27 May 2021 17:03:33 -0700

numpysane (0.33)

  * matmult() supports in-place output via the "out" keyword argument

 -- Dima Kogan <dkogan@debian.org>  Thu, 15 Apr 2021 18:15:46 -0700

numpysane (0.32)

  * glue(): minor bug fix

    Prior to this fix this would happen:

      print(  nps.glue(np.array(()),np.arange(5,),
                       axis=-2). shape )

      ---> (5,)

    This is unintuitive because I glued something along dimension -2, but
    the result doesn't even have such a dimension. This patch calls
    atleast_dims() right before glue() returns, so that we get a shape
    (1,5) instead in this case

 -- Dima Kogan <dkogan@debian.org>  Thu, 25 Mar 2021 18:52:19 -0700

numpysane (0.31)

  * broadcast_define(): better out_kwarg logic. If the output is written
    in-place, the inner function doesn't need to return anything. And the
    broadcast_define()-wrapped function automatically returns the right
    thing

 -- Dima Kogan <dkogan@debian.org>  Wed, 03 Feb 2021 12:51:54 -0800

numpysane (0.30)

  * numpysane_pywrap can find its C templates even if installed via pip
  * numpysane.mag() can take a dtype keyword argument
  * mag(), inner(), norm2() now use the given dtype for all their
    computations, so selecting an appropriate dtype can prevent overflows

 -- Dima Kogan <dkogan@debian.org>  Mon, 01 Feb 2021 15:31:03 -0800

numpysane (0.29)

  * numpysane_pywrap: module docstrings can span multiple lines

 -- Dima Kogan <dkogan@debian.org>  Tue, 17 Nov 2020 12:09:00 -0800

numpysane (0.28)

  * more precise logic for size-0 concatenation
    I can once again accumulate arrays from np.array(())

 -- Dima Kogan <dkogan@debian.org>  Wed, 23 Sep 2020 13:06:08 -0700

numpysane (0.27)

  * numpysane_pywrap item__...() macro works with non-trivial arguments

 -- Dima Kogan <dkogan@debian.org>  Mon, 21 Sep 2020 14:09:17 -0700

numpysane (0.26)

  * glue() and cat() handles size-0 arrays better
  * numpysane_pywrap: size-0 arrays are always deemed contiguous

 -- Dima Kogan <dkogan@debian.org>  Sat, 19 Sep 2020 20:13:05 -0700

numpysane (0.25)

  * nps.dummy() supports multiple axes given at once. So I can do
    something like   nps.dummy(x, -2, -2)
  * numpysane_pywrap: generated code can use ctype__NAME and item__NAME to
    simplify handling of non-contiguous data

 -- Dima Kogan <dkogan@debian.org>  Sat, 05 Sep 2020 13:52:19 -0700

numpysane (0.24)

  * C broadcasting: I can pass strings in the extra, non-broadcastable
    arguments
  * C broadcasting: added support for precomputed cookies to do as much of
    the work as possible outside of the slice loop

 -- Dima Kogan <dkogan@debian.org>  Fri, 19 Jun 2020 10:55:47 -0700

numpysane (0.23)

  * Bug fix: C broadcasting doesn't write to uninitialized memory when
    given a size-0 matrix

 -- Dima Kogan <dkogan@debian.org>  Fri, 12 Jun 2020 19:16:25 -0700

numpysane (0.22)

  * broadcast_define() and the generated function checks its arguments for
    validity more thoroughly
  * outer() doesn't require identically-dimensioned input
  * mass rewrite of the documentation
  * Added C-level broadcasting
  * License change: any version of the LGPL instead of LGPL-3+

 -- Dima Kogan <dkogan@debian.org>  Sat, 14 Mar 2020 23:40:29 -0700

numpysane (0.20)

  * nps.matmult(..., out=out) produces in-place results when one of the
    arguments is 1D

 -- Dima Kogan <dkogan@debian.org>  Sat, 30 Nov 2019 18:20:49 -0800

numpysane (0.19)
    
  * Added mag() convenience function. mag(x) = sqrt(norm2(x))
  * Initial support for C-level broadcasting

 -- Dima Kogan <dima@secretsauce.net>  Thu, 28 Nov 2019 18:50:02 -0800
