[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