[Python-modules-commits] [fpylll] 01/03: Import fpylll_0.2.4+ds.orig.tar.xz

Jerome Benoit calculus-guest at moszumanska.debian.org
Fri Jun 16 07:31:42 UTC 2017


This is an automated email from the git hooks/post-receive script.

calculus-guest pushed a commit to branch master
in repository fpylll.

commit 387266caf83d7888ffaf765c5d5d50dd350e6b99
Author: Jerome Benoit <calculus at rezozer.net>
Date:   Fri Jun 16 08:52:02 2017 +0400

    Import fpylll_0.2.4+ds.orig.tar.xz
---
 LICENSE                              | 340 ++++++++++++++
 PKG-INFO                             |  21 +-
 README.rst                           |  19 +-
 setup.py                             |   2 +-
 src/fpylll/__init__.py               |   2 +-
 src/fpylll/algorithms/bkz.py         |  72 ++-
 src/fpylll/algorithms/bkz2.py        |  51 ++-
 src/fpylll/algorithms/bkz_stats.py   | 839 ++++++++++++++++++++++++++++-------
 src/fpylll/algorithms/pbkz.py        | 180 ++++++++
 src/fpylll/algorithms/simple_bkz.py  |   6 +-
 src/fpylll/algorithms/simple_dbkz.py |   3 +-
 src/fpylll/fplll/bkz.pyx             |  79 ++--
 src/fpylll/fplll/bkz_param.pxd       |   8 +-
 src/fpylll/fplll/bkz_param.pyx       | 293 +++++++++---
 src/fpylll/fplll/decl.pxd            |   6 +-
 src/fpylll/fplll/enumeration.pyx     | 219 ++++++---
 src/fpylll/fplll/fplll.pxd           | 175 ++++++--
 src/fpylll/fplll/gso.pyx             | 119 +++++
 src/fpylll/fplll/integer_matrix.pyx  |  19 +-
 src/fpylll/fplll/lll.pyx             |  52 +--
 src/fpylll/fplll/pruner.pyx          | 274 ++++--------
 src/fpylll/fplll/svpcvp.pyx          |  30 +-
 src/fpylll/tools/benchmark.py        |   2 +-
 src/fpylll/util.pxd                  |   3 +-
 src/fpylll/util.pyx                  |  35 +-
 tests/test_bkz.py                    |   4 +-
 tests/test_cvp.py                    |  28 ++
 tests/test_gso.py                    |  24 +-
 tests/test_multisol_enum.py          |  73 +++
 tests/test_numpy.py                  |   2 +-
 tests/test_pruner.py                 |  96 ++--
 tests/test_util.py                   |  30 ++
 32 files changed, 2405 insertions(+), 701 deletions(-)

diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..8cdb845
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,340 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc., <http://fsf.org/>
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    {description}
+    Copyright (C) {year}  {fullname}
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  {signature of Ty Coon}, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
+
diff --git a/PKG-INFO b/PKG-INFO
index dfb10af..f1886c7 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: fpylll
-Version: 0.2.3dev
+Version: 0.2.4dev
 Summary: A Python interface for https://github.com/fplll/fplll
 Home-page: https://github.com/fplll/fpylll
 Author: Martin R. Albrecht
@@ -13,7 +13,9 @@ Description: fpylll
         
         .. image:: https://travis-ci.org/fplll/fpylll.svg?branch=master
             :target: https://travis-ci.org/fplll/fpylll
-        
+        .. image:: https://badge.fury.io/py/fpylll.svg
+            :target: https://badge.fury.io/py/fpylll
+                     
         .. code-block:: python
         
             >>> from fpylll import *
@@ -59,9 +61,16 @@ Description: fpylll
         - `IPython  <https://ipython.org>`__ for interacting with Python
         - `Numpy <http://www.numpy.org>`__ for numerical computations (e.g. with Gram-Schmidt values)
         
+        Online
+        ------
+        
+        **fpylll** ships with Sage 7.4. Thus, it is available via `SageMathCell <http://sagecell.sagemath.org/?z=eJxtjk1rwzAMhu-F_gfRUzpCKGODXXxwWTfGWlrWDPZBMWrjFK-2lcketPv1U0657CJePUiP1DIFaLuL9x5c6IgzXI1HGhQ8xWyPlleY2Z0rxthQKO5mJUy-kS-TEoLqu5O6kbp3OUmYjkcdu5hBf852VSQOhaCUGcXlbBKtJ2zMQMxXoljMnz-q-8WDfl3WZlu_6Hrx-C6LPWbb_ByykyFdQg82yBiKvafDyST3a9W13B-EaojyIp6NJ-qSui2h9XhMqles9JtZrteb7fT_h_8AredZkw==&lang=sage>`__ and `SageMathCloud <https://cloud.sagemath.com>`__ (select a Jupyter noteboo [...]
+        
         Getting Started
         ---------------
         
+        **Note:** fpylll is also available via `PyPI <https://pypi.python.org/pypi/fpylll/>`__ and `Conda-Forge <https://conda-forge.github.io>`__ for `Conda <https://conda.io/docs/>`__. In what follows, we explain manual installation.
+        
         We recommend `virtualenv <https://virtualenv.readthedocs.org/>`__ for isolating Python build environments and `virtualenvwrapper <https://virtualenvwrapper.readthedocs.org/>`__ to manage virtual environments.
         
         1. Create a new virtualenv and activate it:
@@ -73,7 +82,7 @@ Description: fpylll
         
            We indicate active virtualenvs by the prefix ``(fpylll)``.
         
-        2. Install the required libraries – `GMP <https://gmplib.org>`__ or `MPIR <http://mpir.org>`__ and `MPFR <http://www.mpfr.org>`__  – if not available already. You may also want to install `QD <http://crd-legacy.lbl.gov/~dhbailey/mpdist/>`__.
+        2. Install the required libraries - `GMP <https://gmplib.org>`__ or `MPIR <http://mpir.org>`__ and `MPFR <http://www.mpfr.org>`__  - if not available already. You may also want to install `QD <http://crd-legacy.lbl.gov/~dhbailey/mpdist/>`__.
         
         3. Install fplll:
         
@@ -167,7 +176,7 @@ Description: fpylll
         Multicore Support
         -----------------
         
-        **fpylll** supports parallelisation on multiple cores. For all C++ support to drop the `GIL <https://wiki.python.org/moin/GlobalInterpreterLock>`_ is enabled, allowing the use of threads to parallelise. Note, however, that because fplll’s enumeration is not thread safe, we using `locks <https://docs.python.org/2/library/threading.html#lock-objects>`_ to enforce only one thread calls it at any one point. Also, **fpylll** does not actually drop the GIL in all calls to C++ functions [...]
+        **fpylll** supports parallelisation on multiple cores. For all C++ support to drop the `GIL <https://wiki.python.org/moin/GlobalInterpreterLock>`_ is enabled, allowing the use of threads to parallelise. Fplll is thread safe as long as each thread works on a separate object such as ``IntegerMatrix`` or ``MatGSO``. Also, **fpylll** does not actually drop the GIL in all calls to C++ functions yet. In many scenarios using `multiprocessing <https://docs.python.org/2/library/multiproce [...]
         
         The example below calls ``LLL.reduction`` on 128 matrices of dimension 30 on four worker processes.
         
@@ -190,7 +199,7 @@ Description: fpylll
                 return r
                 
             A = [IntegerMatrix.random(d, "uniform", bits=30) for _ in range(tasks)]    
-            A = run_it(Pool(workers), LLL.reduction)
+            A = run_it(Pool(workers), LLL.reduction, A)
         
         To test threading simply replace the line ``from multiprocessing import Pool`` with ``from multiprocessing.pool import ThreadPool as Pool``. For calling ``BKZ.reduction`` this way, which expects a second parameter with options, using `functools.partial <https://docs.python.org/2/library/functools.html#functools.partial>`_ is a good choice. 
             
@@ -219,7 +228,7 @@ Description: fpylll
         - Leo Ducas
         - Omer Katz
         
-        We copied a decent bit of code over from Sage, mostly from it’s fpLLL interface.
+        We copied a decent bit of code over from Sage, mostly from it's fpLLL interface.
         
         **fpylll** is licensed under the GPLv2+.  
         
diff --git a/README.rst b/README.rst
index c94f60e..8851643 100644
--- a/README.rst
+++ b/README.rst
@@ -5,7 +5,9 @@ A Python (2 and 3) wrapper for `fplll <https://github.com/fplll/fplll>`__.
 
 .. image:: https://travis-ci.org/fplll/fpylll.svg?branch=master
     :target: https://travis-ci.org/fplll/fpylll
-
+.. image:: https://badge.fury.io/py/fpylll.svg
+    :target: https://badge.fury.io/py/fpylll
+             
 .. code-block:: python
 
     >>> from fpylll import *
@@ -51,9 +53,16 @@ We also suggest
 - `IPython  <https://ipython.org>`__ for interacting with Python
 - `Numpy <http://www.numpy.org>`__ for numerical computations (e.g. with Gram-Schmidt values)
 
+Online
+------
+
+**fpylll** ships with Sage 7.4. Thus, it is available via `SageMathCell <http://sagecell.sagemath.org/?z=eJxtjk1rwzAMhu-F_gfRUzpCKGODXXxwWTfGWlrWDPZBMWrjFK-2lcketPv1U0657CJePUiP1DIFaLuL9x5c6IgzXI1HGhQ8xWyPlleY2Z0rxthQKO5mJUy-kS-TEoLqu5O6kbp3OUmYjkcdu5hBf852VSQOhaCUGcXlbBKtJ2zMQMxXoljMnz-q-8WDfl3WZlu_6Hrx-C6LPWbb_ByykyFdQg82yBiKvafDyST3a9W13B-EaojyIp6NJ-qSui2h9XhMqles9JtZrteb7fT_h_8AredZkw==&lang=sage>`__ and `SageMathCloud <https://cloud.sagemath.com>`__ (select a Jupyter notebook with a [...]
+
 Getting Started
 ---------------
 
+**Note:** fpylll is also available via `PyPI <https://pypi.python.org/pypi/fpylll/>`__ and `Conda-Forge <https://conda-forge.github.io>`__ for `Conda <https://conda.io/docs/>`__. In what follows, we explain manual installation.
+
 We recommend `virtualenv <https://virtualenv.readthedocs.org/>`__ for isolating Python build environments and `virtualenvwrapper <https://virtualenvwrapper.readthedocs.org/>`__ to manage virtual environments.
 
 1. Create a new virtualenv and activate it:
@@ -65,7 +74,7 @@ We recommend `virtualenv <https://virtualenv.readthedocs.org/>`__ for isolating
 
    We indicate active virtualenvs by the prefix ``(fpylll)``.
 
-2. Install the required libraries – `GMP <https://gmplib.org>`__ or `MPIR <http://mpir.org>`__ and `MPFR <http://www.mpfr.org>`__  – if not available already. You may also want to install `QD <http://crd-legacy.lbl.gov/~dhbailey/mpdist/>`__.
+2. Install the required libraries - `GMP <https://gmplib.org>`__ or `MPIR <http://mpir.org>`__ and `MPFR <http://www.mpfr.org>`__  - if not available already. You may also want to install `QD <http://crd-legacy.lbl.gov/~dhbailey/mpdist/>`__.
 
 3. Install fplll:
 
@@ -159,7 +168,7 @@ in the ``deactivate`` function in the ``activate`` script.
 Multicore Support
 -----------------
 
-**fpylll** supports parallelisation on multiple cores. For all C++ support to drop the `GIL <https://wiki.python.org/moin/GlobalInterpreterLock>`_ is enabled, allowing the use of threads to parallelise. Note, however, that because fplll’s enumeration is not thread safe, we using `locks <https://docs.python.org/2/library/threading.html#lock-objects>`_ to enforce only one thread calls it at any one point. Also, **fpylll** does not actually drop the GIL in all calls to C++ functions yet. In [...]
+**fpylll** supports parallelisation on multiple cores. For all C++ support to drop the `GIL <https://wiki.python.org/moin/GlobalInterpreterLock>`_ is enabled, allowing the use of threads to parallelise. Fplll is thread safe as long as each thread works on a separate object such as ``IntegerMatrix`` or ``MatGSO``. Also, **fpylll** does not actually drop the GIL in all calls to C++ functions yet. In many scenarios using `multiprocessing <https://docs.python.org/2/library/multiprocessing.ht [...]
 
 The example below calls ``LLL.reduction`` on 128 matrices of dimension 30 on four worker processes.
 
@@ -182,7 +191,7 @@ The example below calls ``LLL.reduction`` on 128 matrices of dimension 30 on fou
         return r
         
     A = [IntegerMatrix.random(d, "uniform", bits=30) for _ in range(tasks)]    
-    A = run_it(Pool(workers), LLL.reduction)
+    A = run_it(Pool(workers), LLL.reduction, A)
 
 To test threading simply replace the line ``from multiprocessing import Pool`` with ``from multiprocessing.pool import ThreadPool as Pool``. For calling ``BKZ.reduction`` this way, which expects a second parameter with options, using `functools.partial <https://docs.python.org/2/library/functools.html#functools.partial>`_ is a good choice. 
     
@@ -211,6 +220,6 @@ The following people have contributed to **fpylll**
 - Leo Ducas
 - Omer Katz
 
-We copied a decent bit of code over from Sage, mostly from it’s fpLLL interface.
+We copied a decent bit of code over from Sage, mostly from it's fpLLL interface.
 
 **fpylll** is licensed under the GPLv2+.  
diff --git a/setup.py b/setup.py
index bea6dd3..0861e3e 100755
--- a/setup.py
+++ b/setup.py
@@ -119,7 +119,7 @@ setup(
     author=u"Martin R. Albrecht",
     author_email="fplll-devel at googlegroups.com",
     url="https://github.com/fplll/fpylll",
-    version='0.2.3dev',
+    version='0.2.4dev',
     ext_package='fpylll',
     ext_modules=Cython.Build.cythonize(extensions,
                                        include_path=["src"] + sys.path,
diff --git a/src/fpylll/__init__.py b/src/fpylll/__init__.py
index 8f83fe3..52ccd10 100644
--- a/src/fpylll/__init__.py
+++ b/src/fpylll/__init__.py
@@ -3,7 +3,7 @@ from __future__ import absolute_import
 from .fplll.integer_matrix import IntegerMatrix
 from .fplll.gso import GSO
 from .fplll.lll import LLL
-from .fplll.enumeration import Enumeration, EnumerationError
+from .fplll.enumeration import Enumeration, EnumerationError, EvaluatorStrategy
 from .fplll.bkz import BKZ
 from .fplll.bkz_param import load_strategies_json
 from .fplll.svpcvp import SVP
diff --git a/src/fpylll/algorithms/bkz.py b/src/fpylll/algorithms/bkz.py
index 4e6d288..9d5573f 100644
--- a/src/fpylll/algorithms/bkz.py
+++ b/src/fpylll/algorithms/bkz.py
@@ -14,8 +14,8 @@ from fpylll import IntegerMatrix, GSO, LLL
 from fpylll import BKZ
 from fpylll import Enumeration
 from fpylll import EnumerationError
-from fpylll.util import gaussian_heuristic
-from .bkz_stats import BKZStats
+from fpylll.util import adjust_radius_to_gh_bound
+from .bkz_stats import BKZTreeTracer, dummy_tracer
 
 
 class BKZReduction:
@@ -62,8 +62,6 @@ class BKZReduction:
         else:
             self.lll_obj = L
 
-        self.lll_obj()
-
     def __call__(self, params, min_row=0, max_row=-1):
         """Run the BKZ algorithm with parameters `param`.
 
@@ -72,19 +70,20 @@ class BKZReduction:
         :param max_row: stop processing in this row (exclusive)
 
         """
-        stats = BKZStats(self, verbose=params.flags & BKZ.VERBOSE)
+        tracer = BKZTreeTracer(self, verbosity=params.flags & BKZ.VERBOSE, start_clocks=True)
 
         if params.flags & BKZ.AUTO_ABORT:
             auto_abort = BKZ.AutoAbort(self.M, self.A.nrows)
 
         cputime_start = time.clock()
 
-        self.M.discover_all_rows()
+        with tracer.context("lll"):
+            self.lll_obj()
 
         i = 0
         while True:
-            with stats.context("tour"):
-                clean = self.tour(params, min_row, max_row, stats)
+            with tracer.context("tour", i):
+                clean = self.tour(params, min_row, max_row, tracer)
             i += 1
             if clean or params.block_size >= self.A.nrows:
                 break
@@ -95,11 +94,11 @@ class BKZReduction:
             if (params.flags & BKZ.MAX_TIME) and time.clock() - cputime_start >= params.max_time:
                 break
 
-        stats.finalize()
-        self.stats = stats
+        tracer.exit()
+        self.trace = tracer.trace
         return clean
 
-    def tour(self, params, min_row=0, max_row=-1, stats=None):
+    def tour(self, params, min_row=0, max_row=-1, tracer=dummy_tracer):
         """One BKZ loop over all indices.
 
         :param params: BKZ parameters
@@ -115,19 +114,17 @@ class BKZReduction:
 
         for kappa in range(min_row, max_row-2):
             block_size = min(params.block_size, max_row - kappa)
-            clean &= self.svp_reduction(kappa, block_size, params, stats)
-            if stats:
-                stats.log_clean_kappa(kappa, clean)
+            clean &= self.svp_reduction(kappa, block_size, params, tracer)
 
         return clean
 
-    def svp_preprocessing(self, kappa, block_size, params, stats):
+    def svp_preprocessing(self, kappa, block_size, params, tracer):
         """Perform preprocessing for calling the SVP oracle
 
         :param kappa: current index
         :param params: BKZ parameters
         :param block_size: block size
-        :param stats: object for maintaining statistics
+        :param tracer: object for maintaining statistics
 
         :returns: ``True`` if no change was made and ``False`` otherwise
 
@@ -139,20 +136,20 @@ class BKZReduction:
         clean = True
 
         lll_start = kappa if params.flags & BKZ.BOUNDED_LLL else 0
-        with stats.context("lll"):
+        with tracer.context("lll"):
             self.lll_obj(lll_start, lll_start, kappa + block_size)
             if self.lll_obj.nswaps > 0:
                 clean = False
 
         return clean
 
-    def svp_call(self, kappa, block_size, params, stats=None):
+    def svp_call(self, kappa, block_size, params, tracer=None):
         """Call SVP oracle
 
         :param kappa: current index
         :param params: BKZ parameters
         :param block_size: block size
-        :param stats: object for maintaining statistics
+        :param tracer: object for maintaining statistics
 
         :returns: Coordinates of SVP solution or ``None`` if none was found.
 
@@ -165,30 +162,31 @@ class BKZReduction:
 
         if params.flags & BKZ.GH_BND:
             root_det = self.M.get_root_det(kappa, kappa+block_size)
-            max_dist, expo = gaussian_heuristic(max_dist, expo, block_size, root_det, params.gh_factor)
+            max_dist, expo = adjust_radius_to_gh_bound(max_dist, expo, block_size, root_det, params.gh_factor)
 
         try:
-            E = Enumeration(self.M)
-            solution, max_dist = E.enumerate(kappa, kappa + block_size, max_dist, expo)
-            stats.current_tour["enum nodes"] += E.get_nodes()
+            enum_obj = Enumeration(self.M)
+            with tracer.context("enumeration", enum_obj=enum_obj, probability=1.0):
+                solution, max_dist = enum_obj.enumerate(kappa, kappa + block_size, max_dist, expo)[0]
+
         except EnumerationError as msg:
             if params.flags & BKZ.GH_BND:
                 return None
             else:
                 raise EnumerationError(msg)
 
-        if max_dist >= delta_max_dist:
+        if max_dist >= delta_max_dist * (1<<expo):
             return None
         else:
             return solution
 
-    def svp_postprocessing(self, kappa, block_size, solution, stats):
+    def svp_postprocessing(self, kappa, block_size, solution, tracer):
         """Insert SVP solution into basis and LLL reduce.
 
         :param solution: coordinates of an SVP solution
         :param kappa: current index
         :param block_size: block size
-        :param stats: object for maintaining statistics
+        :param tracer: object for maintaining statistics
 
         :returns: ``True`` if no change was made and ``False`` otherwise
         """
@@ -204,7 +202,7 @@ class BKZReduction:
                     break
 
             self.M.move_row(kappa + first_nonzero_vector, kappa)
-            with stats.context("lll"):
+            with tracer.context("lll"):
                 self.lll_obj.size_reduction(kappa, kappa + first_nonzero_vector + 1)
 
         else:
@@ -216,37 +214,33 @@ class BKZReduction:
                     self.M.row_addmul(d, kappa + i, solution[i])
 
             self.M.move_row(d, kappa)
-            with stats.context("lll"):
+            with tracer.context("lll"):
                 self.lll_obj(kappa, kappa, kappa + block_size + 1)
             self.M.move_row(kappa + block_size, d)
             self.M.remove_last_row()
 
         return False
 
-    def svp_reduction(self, kappa, block_size, params, stats=None):
+    def svp_reduction(self, kappa, block_size, params, tracer=dummy_tracer):
         """Find shortest vector in projected lattice of dimension ``block_size`` and insert into
         current basis.
 
         :param kappa: current index
         :param params: BKZ parameters
         :param block_size: block size
-        :param stats: object for maintaining statistics
+        :param tracer: object for maintaining statistics
 
         :returns: ``True`` if no change was made and ``False`` otherwise
         """
-        if stats is None:
-            stats = BKZStats(self)
-
         clean = True
-        with stats.context("preproc"):
-            clean_pre = self.svp_preprocessing(kappa, block_size, params, stats)
+        with tracer.context("preprocessing"):
+            clean_pre = self.svp_preprocessing(kappa, block_size, params, tracer)
         clean &= clean_pre
 
-        with stats.context("svp"):
-            solution = self.svp_call(kappa, block_size, params, stats)
+        solution = self.svp_call(kappa, block_size, params, tracer)
 
-        with stats.context("postproc"):
-            clean_post = self.svp_postprocessing(kappa, block_size, solution, stats)
+        with tracer.context("postprocessing"):
+            clean_post = self.svp_postprocessing(kappa, block_size, solution, tracer)
         clean &= clean_post
 
         return clean
diff --git a/src/fpylll/algorithms/bkz2.py b/src/fpylll/algorithms/bkz2.py
index a2ab3f1..cae6e8a 100644
--- a/src/fpylll/algorithms/bkz2.py
+++ b/src/fpylll/algorithms/bkz2.py
@@ -3,8 +3,8 @@
 from random import randint
 from fpylll import BKZ, Enumeration, EnumerationError
 from fpylll.algorithms.bkz import BKZReduction as BKZBase
-from fpylll.algorithms.bkz_stats import DummyStats
-from fpylll.util import gaussian_heuristic
+from fpylll.algorithms.bkz_stats import dummy_tracer
+from fpylll.util import adjust_radius_to_gh_bound
 
 
 class BKZReduction(BKZBase):
@@ -16,17 +16,16 @@ class BKZReduction(BKZBase):
 
         """
         BKZBase.__init__(self, A)
-        self.M.discover_all_rows()  # TODO: this belongs in __call__ (?)
 
-    def get_pruning(self, kappa, block_size, param, stats=None):
+    def get_pruning(self, kappa, block_size, param, tracer=dummy_tracer):
         strategy = param.strategies[block_size]
 
         radius, re = self.M.get_r_exp(kappa, kappa)
         root_det = self.M.get_root_det(kappa, kappa + block_size)
-        gh_radius, ge = gaussian_heuristic(radius, re, block_size, root_det, 1.0)
+        gh_radius, ge = adjust_radius_to_gh_bound(radius, re, block_size, root_det, 1.0)
         return strategy.get_pruning(radius  * 2**re, gh_radius * 2**ge)
 
-    def randomize_block(self, min_row, max_row, stats, density=0):
+    def randomize_block(self, min_row, max_row, tracer=dummy_tracer, density=0):
         """Randomize basis between from ``min_row`` and ``max_row`` (exclusive)
 
             1. permute rows
@@ -37,7 +36,7 @@ class BKZReduction(BKZBase):
 
         :param min_row: start in this row
         :param max_row: stop at this row (exclusive)
-        :param stats: object for maintaining statistics
+        :param tracer: object for maintaining statistics
         :param density: number of non-zero coefficients in lower triangular transformation matrix
         """
         if max_row - min_row < 2:
@@ -62,28 +61,26 @@ class BKZReduction(BKZBase):
 
         return
 
-    def svp_preprocessing(self, kappa, block_size, param, stats):
+    def svp_preprocessing(self, kappa, block_size, param, tracer=dummy_tracer):
         clean = True
 
-        clean &= BKZBase.svp_preprocessing(self, kappa, block_size, param, stats)
+        clean &= BKZBase.svp_preprocessing(self, kappa, block_size, param, tracer)
 
         for preproc in param.strategies[block_size].preprocessing_block_sizes:
             prepar = param.__class__(block_size=preproc, strategies=param.strategies, flags=BKZ.GH_BND)
-            clean &= self.tour(prepar, kappa, kappa + block_size)
+            clean &= self.tour(prepar, kappa, kappa + block_size, tracer=tracer)
 
         return clean
 
-    def svp_reduction(self, kappa, block_size, param, stats):
+    def svp_reduction(self, kappa, block_size, param, tracer=dummy_tracer):
         """
 
         :param kappa:
         :param block_size:
         :param params:
-        :param stats:
+        :param tracer:
 
         """
-        if stats is None:
-            stats = DummyStats(self)
 
         self.lll_obj.size_reduction(0, kappa+1)
         old_first, old_first_expo = self.M.get_r_exp(kappa, kappa)
@@ -91,33 +88,39 @@ class BKZReduction(BKZBase):
         remaining_probability, rerandomize = 1.0, False
 
         while remaining_probability > 1. - param.min_success_probability:
-            with stats.context("preproc"):
+            with tracer.context("preprocessing"):
                 if rerandomize:
-                    self.randomize_block(kappa+1, kappa+block_size,
-                                         density=param.rerandomization_density, stats=stats)
-                self.svp_preprocessing(kappa, block_size, param, stats)
+                    with tracer.context("randomization"):
+                        self.randomize_block(kappa+1, kappa+block_size,
+                                             density=param.rerandomization_density, tracer=tracer)
+                with tracer.context("reduction"):
+                    self.svp_preprocessing(kappa, block_size, param, tracer=tracer)
 
             radius, expo = self.M.get_r_exp(kappa, kappa)
             radius *= self.lll_obj.delta
 
             if param.flags & BKZ.GH_BND and block_size > 30:
                 root_det = self.M.get_root_det(kappa, kappa + block_size)
-                radius, expo = gaussian_heuristic(radius, expo, block_size, root_det, param.gh_factor)
+                radius, expo = adjust_radius_to_gh_bound(radius, expo, block_size, root_det, param.gh_factor)
 
-            pruning = self.get_pruning(kappa, block_size, param, stats)
+            pruning = self.get_pruning(kappa, block_size, param, tracer)
 
             try:
                 enum_obj = Enumeration(self.M)
-                with stats.context("svp", E=enum_obj):
+                with tracer.context("enumeration",
+                                    enum_obj=enum_obj,
+                                    probability=pruning.expectation,
+                                    full=block_size==param.block_size):
                     solution, max_dist = enum_obj.enumerate(kappa, kappa + block_size, radius, expo,
-                                                            pruning.coefficients)
-                self.svp_postprocessing(kappa, block_size, solution, stats)
+                                                            pruning=pruning.coefficients)[0]
+                with tracer.context("postprocessing"):
+                    self.svp_postprocessing(kappa, block_size, solution, tracer=tracer)
                 rerandomize = False
 
             except EnumerationError:
                 rerandomize = True
 
-            remaining_probability *= (1 - pruning.probability)
+            remaining_probability *= (1 - pruning.expectation)
 
         self.lll_obj.size_reduction(0, kappa+1)
         new_first, new_first_expo = self.M.get_r_exp(kappa, kappa)
diff --git a/src/fpylll/algorithms/bkz_stats.py b/src/fpylll/algorithms/bkz_stats.py
index fa181d4..faa3a6f 100644
--- a/src/fpylll/algorithms/bkz_stats.py
+++ b/src/fpylll/algorithms/bkz_stats.py
@@ -1,191 +1,730 @@
 # -*- coding: utf-8 -*-
+"""
+Collecting traces from BKZ-like computations
+
+.. moduleauthor:: Martin R. Albrecht <fplll-devel at googlegroups.com>
+
+"""
 from __future__ import print_function
 from __future__ import unicode_literals
+from __future__ import absolute_import
 
 import time
+import copy
 from collections import OrderedDict
 from math import log
 
 
-class DummyStatsContext:
+def pretty_dict(d, keyword_width=None, round_bound=9999):
+    """Return 'pretty' string representation of the dictionary ``d``.
+
+    :param d: a dictionary
+    :param keyword_width: width allocated for keywords
+    :param round_bound: values beyond this bound are shown as `2^x`
+
+    >>> pretty_dict({'d': 2, 'f': 0.1, 'large': 4097})
+    u'{"large":   2^12.0,  "d":        2,  "f": 0.100000}'
+
     """
-    Dummy statistics context, doing nothing.
+    s = []
+    for k in d:
+
+        v = d[k]
+
+        if keyword_width:
+            fmt = u"\"%%%ds\"" % keyword_width
+            k = fmt % k
+        else:
+            k = "\"%s\""%k
+
+        if isinstance(v, int):
+            if abs(v) > round_bound:
+                s.append(u"%s: %8s" %(k,  u"%s2^%.1f"%("" if v > 0 else "-", log(abs(v), 2))))
+            else:
+                s.append(u"%s: %8d"%(k, v))
+            continue
+        elif not isinstance(v, float):
+            try:
+                v = float(v)
+            except TypeError:
+                s.append(u"%s: %s"%(k, v))
+                continue
+
+        if 0 <= v < 10.0:
+            s.append(u"%s: %8.6f"%(k, v))
+        elif -10 < v < 0:
+            s.append(u"%s: %8.5f"%(k, v))
+        elif abs(v) < round_bound:
+            s.append(u"%s: %8.3f"%(k, v))
+        else:
+            s.append(u"%s: %8s" %(k,  u"%s2^%.1f"%("" if v > 0 else "-", log(abs(v), 2))))
+
+    return u"{" + u",  ".join(s) + u"}"
+
+
+class Statistic(object):
     """
-    def __init__(self, stats, what):
-        pass
+    A ``statistic`` collects observed facts about some random variable (e.g. running time).
+
+    In particular,
+
+    - minimum,
+    - maximum,
+    - mean and
+    - variance
+
+    are stored.
+
+    >>> v = Statistic(1.0); v
+    1.0
+
+    >>> v += 2.0; v
+    3.0
+
+    >>> v = Statistic(-5.4, repr="avg"); v
+    -5.4
+
+    >>> v += 0.2
+    >>> v += 5.2; v
+    0.0
+
+    >>> v.min, v.max
+    (-5.4, 5.2)
+
+    """
+
+    def __init__(self, value, repr="sum", count=True):
+        """
+        Create a new instance.
+
+        :param value: some initial value
+        :param repr: how to represent this statistic: "min", "max", "avg", "sum" and "variance" are
+            valid choices
... 3531 lines suppressed ...

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/python-modules/packages/fpylll.git



More information about the Python-modules-commits mailing list